
MK25-RAMBo13a_lang_base:     file format elf32-avr


Disassembly of section .text:

00000000 <__vectors>:
       0:	0c 94 f4 50 	jmp	0xa1e8	; 0xa1e8 <__dtors_end>
       4:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
       8:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
       c:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      10:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      14:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      18:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      1c:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      20:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      24:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      28:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      2c:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      30:	0c 94 e6 86 	jmp	0x10dcc	; 0x10dcc <__vector_12>
      34:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      38:	0d 94 77 13 	jmp	0x226ee	; 0x226ee <__vector_14>
      3c:	0d 94 bb 10 	jmp	0x22176	; 0x22176 <__vector_15>
      40:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      44:	0d 94 68 1b 	jmp	0x236d0	; 0x236d0 <__vector_17>
      48:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      4c:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      50:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      54:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      58:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      5c:	0c 94 e3 76 	jmp	0xedc6	; 0xedc6 <__vector_23>
      60:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      64:	0c 94 62 63 	jmp	0xc6c4	; 0xc6c4 <__vector_25>
      68:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      6c:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      70:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      74:	0c 94 51 bc 	jmp	0x178a2	; 0x178a2 <__vector_29>
      78:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      7c:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      80:	0d 94 c5 15 	jmp	0x22b8a	; 0x22b8a <__vector_32>
      84:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      88:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      8c:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      90:	0c 94 1e 63 	jmp	0xc63c	; 0xc63c <__vector_36>
      94:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      98:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      9c:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      a0:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      a4:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      a8:	0d 94 9f 0d 	jmp	0x21b3e	; 0x21b3e <__vector_42>
      ac:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      b0:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      b4:	0d 94 81 0d 	jmp	0x21b02	; 0x21b02 <__vector_45>
      b8:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      bc:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      c0:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      c4:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      c8:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      cc:	0d 94 41 0d 	jmp	0x21a82	; 0x21a82 <__vector_51>
      d0:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      d4:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      d8:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      dc:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>
      e0:	0c 94 25 51 	jmp	0xa24a	; 0xa24a <__bad_interrupt>

000000e4 <__loc_sec_start>:
	...

00000100 <_SEC_LANG>:
     100:	5f 53 45 43 5f 4c 41 4e 47 00 00 00 00 00 00 00     _SEC_LANG.......
	...

00003600 <__loc_pri_start>:
    3600:	ff ff       	.word	0xffff	; ????
    3602:	53 6f       	ori	r21, 0xF3	; 243
    3604:	6d 65       	ori	r22, 0x5D	; 93
    3606:	20 70       	andi	r18, 0x00	; 0
    3608:	72 6f       	ori	r23, 0xF2	; 242
    360a:	62 6c       	ori	r22, 0xC2	; 194
    360c:	65 6d       	ori	r22, 0xD5	; 213
    360e:	20 65       	ori	r18, 0x50	; 80
    3610:	6e 63       	ori	r22, 0x3E	; 62
    3612:	6f 75       	andi	r22, 0x5F	; 95
    3614:	6e 74       	andi	r22, 0x4E	; 78
    3616:	65 72       	andi	r22, 0x25	; 37
    3618:	65 64       	ori	r22, 0x45	; 69
    361a:	2c 20       	and	r2, r12
    361c:	5a 2d       	mov	r21, r10
    361e:	6c 65       	ori	r22, 0x5C	; 92
    3620:	76 65       	ori	r23, 0x56	; 86
    3622:	6c 69       	ori	r22, 0x9C	; 156
    3624:	6e 67       	ori	r22, 0x7E	; 126
    3626:	20 65       	ori	r18, 0x50	; 80
    3628:	6e 66       	ori	r22, 0x6E	; 110
    362a:	6f 72       	andi	r22, 0x2F	; 47
    362c:	63 65       	ori	r22, 0x53	; 83
    362e:	64 20       	and	r6, r4
    3630:	2e 2e       	mov	r2, r30
    3632:	2e 00       	.word	0x002e	; ????

00003634 <MSG_MBL_FAILED>:
    3634:	ff ff 4d 65 73 68 20 62 65 64 20 6c 65 76 65 6c     ..Mesh bed level
    3644:	69 6e 67 20 66 61 69 6c 65 64 2e 20 50 72 69 6e     ing failed. Prin
    3654:	74 20 63 61 6e 63 65 6c 65 64 2e 00                 t canceled..

00003660 <MSG_BED_HEATING_SAFETY_DISABLED>:
    3660:	ff ff 48 65 61 74 69 6e 67 20 64 69 73 61 62 6c     ..Heating disabl
    3670:	65 64 20 62 79 20 73 61 66 65 74 79 20 74 69 6d     ed by safety tim
    3680:	65 72 2e 00                                         er..

00003684 <MSG_GCODE_DIFF_CONTINUE>:
    3684:	ff ff 47 2d 63 6f 64 65 20 73 6c 69 63 65 64 20     ..G-code sliced 
    3694:	66 6f 72 20 61 20 64 69 66 66 65 72 65 6e 74 20     for a different 
    36a4:	6c 65 76 65 6c 2e 00                                level..

000036ab <MSG_GCODE_DIFF_CANCELLED>:
    36ab:	ff ff 47 2d 63 6f 64 65 20 73 6c 69 63 65 64 20     ..G-code sliced 
    36bb:	66 6f 72 20 61 20 64 69 66 66 65 72 65 6e 74 20     for a different 
    36cb:	6c 65 76 65 6c 2e 20 50 6c 65 61 73 65 20 72 65     level. Please re
    36db:	2d 73 6c 69 63 65 20 74 68 65 20 6d 6f 64 65 6c     -slice the model
    36eb:	20 61 67 61 69 6e 2e 00                              again..

000036f3 <MSG_GCODE_NEWER_FIRMWARE_CONTINUE>:
    36f3:	ff ff 47 2d 63 6f 64 65 20 73 6c 69 63 65 64 20     ..G-code sliced 
    3703:	66 6f 72 20 61 20 6e 65 77 65 72 20 66 69 72 6d     for a newer firm
    3713:	77 61 72 65 2e 00                                   ware..

00003719 <MSG_GCODE_NEWER_FIRMWARE_CANCELLED>:
    3719:	ff ff 47 2d 63 6f 64 65 20 73 6c 69 63 65 64 20     ..G-code sliced 
    3729:	66 6f 72 20 61 20 6e 65 77 65 72 20 66 69 72 6d     for a newer firm
    3739:	77 61 72 65 2e 20 50 6c 65 61 73 65 20 75 70 64     ware. Please upd
    3749:	61 74 65 20 74 68 65 20 66 69 72 6d 77 61 72 65     ate the firmware
    3759:	2e 00                                               ..

0000375b <MSG_GCODE_DIFF_PRINTER_CONTINUE>:
    375b:	ff ff 47 2d 63 6f 64 65 20 73 6c 69 63 65 64 20     ..G-code sliced 
    376b:	66 6f 72 20 61 20 64 69 66 66 65 72 65 6e 74 20     for a different 
    377b:	70 72 69 6e 74 65 72 20 74 79 70 65 2e 00           printer type..

00003789 <MSG_GCODE_DIFF_PRINTER_CANCELLED>:
    3789:	ff ff 47 2d 63 6f 64 65 20 73 6c 69 63 65 64 20     ..G-code sliced 
    3799:	66 6f 72 20 61 20 64 69 66 66 65 72 65 6e 74 20     for a different 
    37a9:	70 72 69 6e 74 65 72 20 74 79 70 65 2e 20 50 6c     printer type. Pl
    37b9:	65 61 73 65 20 72 65 2d 73 6c 69 63 65 20 74 68     ease re-slice th
    37c9:	65 20 6d 6f 64 65 6c 20 61 67 61 69 6e 2e 00        e model again..

000037d8 <MSG_PRESS_TO_PREHEAT>:
    37d8:	ff ff 50 72 65 73 73 20 74 68 65 20 6b 6e 6f 62     ..Press the knob
    37e8:	20 74 6f 20 70 72 65 68 65 61 74 20 6e 6f 7a 7a      to preheat nozz
    37f8:	6c 65 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e     le and continue.
	...

00003809 <MSG_PRESS_TO_UNLOAD>:
    3809:	ff ff 50 6c 65 61 73 65 20 70 72 65 73 73 20 74     ..Please press t
    3819:	68 65 20 6b 6e 6f 62 20 74 6f 20 75 6e 6c 6f 61     he knob to unloa
    3829:	64 20 66 69 6c 61 6d 65 6e 74 00                    d filament.

00003834 <MSG_PRESS>:
    3834:	ff ff 61 6e 64 20 70 72 65 73 73 20 74 68 65 20     ..and press the 
    3844:	6b 6e 6f 62 00                                      knob.

00003849 <MSG_INSERT_FILAMENT>:
    3849:	ff ff 49 6e 73 65 72 74 20 66 69 6c 61 6d 65 6e     ..Insert filamen
    3859:	74 00                                               t.

0000385b <MSG_NOT_COLOR>:
    385b:	ff ff 43 6f 6c 6f 72 20 6e 6f 74 20 63 6f 72 72     ..Color not corr
    386b:	65 63 74 00                                         ect.

0000386f <MSG_NOT_LOADED>:
    386f:	ff ff 46 69 6c 61 6d 65 6e 74 20 6e 6f 74 20 6c     ..Filament not l
    387f:	6f 61 64 65 64 00                                   oaded.

00003885 <MSG_CORRECTLY>:
    3885:	ff ff 43 68 61 6e 67 65 64 20 63 6f 72 72 65 63     ..Changed correc
    3895:	74 6c 79 00                                         tly.

00003899 <MSG_LOADING_COLOR>:
    3899:	ff ff 4c 6f 61 64 69 6e 67 20 63 6f 6c 6f 72 00     ..Loading color.

000038a9 <MSG_CHANGE_SUCCESS>:
    38a9:	ff ff 43 68 61 6e 67 65 20 73 75 63 63 65 73 73     ..Change success
    38b9:	21 00                                               !.

000038bb <MSG_CHECK_IDLER>:
    38bb:	ff ff 50 6c 65 61 73 65 20 6f 70 65 6e 20 69 64     ..Please open id
    38cb:	6c 65 72 20 61 6e 64 20 72 65 6d 6f 76 65 20 66     ler and remove f
    38db:	69 6c 61 6d 65 6e 74 20 6d 61 6e 75 61 6c 6c 79     ilament manually
    38eb:	2e 00                                               ..

000038ed <MSG_UNLOAD_SUCCESSFUL>:
    38ed:	ff ff 57 61 73 20 66 69 6c 61 6d 65 6e 74 20 75     ..Was filament u
    38fd:	6e 6c 6f 61 64 20 73 75 63 63 65 73 73 66 75 6c     nload successful
    390d:	3f 00                                               ?.

0000390f <MSG_NEW_FIRMWARE_PLEASE_UPGRADE>:
    390f:	ff ff 50 6c 65 61 73 65 20 75 70 67 72 61 64 65     ..Please upgrade
    391f:	2e 00                                               ..

00003921 <MSG_NEW_FIRMWARE_AVAILABLE>:
    3921:	ff ff 4e 65 77 20 66 69 72 6d 77 61 72 65 20 76     ..New firmware v
    3931:	65 72 73 69 6f 6e 20 61 76 61 69 6c 61 62 6c 65     ersion available
    3941:	3a 00                                               :.

00003943 <MSG_WAITING_TEMP_PINDA>:
    3943:	ff ff 57 61 69 74 69 6e 67 20 66 6f 72 20 50 49     ..Waiting for PI
    3953:	4e 44 41 20 70 72 6f 62 65 20 63 6f 6f 6c 69 6e     NDA probe coolin
    3963:	67 00                                               g.

00003965 <MSG_PLEASE_WAIT>:
    3965:	ff ff 50 6c 65 61 73 65 20 77 61 69 74 00           ..Please wait.

00003973 <MSG_NO_MOVE>:
    3973:	ff ff 4e 6f 20 6d 6f 76 65 2e 00                    ..No move..

0000397e <MSG_USERWAIT>:
    397e:	ff ff 57 61 69 74 20 66 6f 72 20 75 73 65 72 2e     ..Wait for user.
    398e:	2e 2e 00                                            ...

00003991 <MSG_TEMP_CAL_WARNING>:
    3991:	ff ff 53 74 61 62 6c 65 20 61 6d 62 69 65 6e 74     ..Stable ambient
    39a1:	20 74 65 6d 70 65 72 61 74 75 72 65 20 32 31 2d      temperature 21-
    39b1:	32 36 43 20 69 73 20 6e 65 65 64 65 64 20 61 20     26C is needed a 
    39c1:	72 69 67 69 64 20 73 74 61 6e 64 20 69 73 20 72     rigid stand is r
    39d1:	65 71 75 69 72 65 64 2e 00                          equired..

000039da <MSG_RUN_XYZ>:
    39da:	ff ff 50 6c 65 61 73 65 20 72 75 6e 20 58 59 5a     ..Please run XYZ
    39ea:	20 63 61 6c 69 62 72 61 74 69 6f 6e 20 66 69 72      calibration fir
    39fa:	73 74 2e 00                                         st..

000039fe <MSG_BED_LEVELING_FAILED_POINT_LOW>:
    39fe:	ff ff 42 65 64 20 6c 65 76 65 6c 69 6e 67 20 66     ..Bed leveling f
    3a0e:	61 69 6c 65 64 2e 20 53 65 6e 73 6f 72 20 64 69     ailed. Sensor di
    3a1e:	64 6e 27 74 20 74 72 69 67 67 65 72 2e 20 44 65     dn't trigger. De
    3a2e:	62 72 69 73 20 6f 6e 20 6e 6f 7a 7a 6c 65 3f 20     bris on nozzle? 
    3a3e:	57 61 69 74 69 6e 67 20 66 6f 72 20 72 65 73 65     Waiting for rese
    3a4e:	74 2e 00                                            t..

00003a51 <MSG_PREHEAT_NOZZLE>:
    3a51:	ff ff 50 72 65 68 65 61 74 20 74 68 65 20 6e 6f     ..Preheat the no
    3a61:	7a 7a 6c 65 21 00                                   zzle!.

00003a67 <MSG_ERROR>:
    3a67:	ff ff 45 52 52 4f 52 3a 00                          ..ERROR:.

00003a70 <MSG_Y_DIST_FROM_MIN>:
    3a70:	ff ff 59 20 64 69 73 74 61 6e 63 65 20 66 72 6f     ..Y distance fro
    3a80:	6d 20 6d 69 6e 00                                   m min.

00003a86 <MSG_LEFT>:
    3a86:	ff ff 4c 65 66 74 00                                ..Left.

00003a8d <MSG_RIGHT>:
    3a8d:	ff ff 52 69 67 68 74 00                             ..Right.

00003a95 <MSG_MEASURED_SKEW>:
    3a95:	ff ff 4d 65 61 73 75 72 65 64 20 73 6b 65 77 00     ..Measured skew.

00003aa5 <MSG_SLIGHT_SKEW>:
    3aa5:	ff ff 53 6c 69 67 68 74 20 73 6b 65 77 00           ..Slight skew.

00003ab3 <MSG_SEVERE_SKEW>:
    3ab3:	ff ff 53 65 76 65 72 65 20 73 6b 65 77 00           ..Severe skew.

00003ac1 <MSG_MEASURED_OFFSET>:
    3ac1:	ff ff 5b 30 3b 30 5d 20 70 6f 69 6e 74 20 6f 66     ..[0;0] point of
    3ad1:	66 73 65 74 00                                      fset.

00003ad6 <MSG_BABYSTEPPING_Z>:
    3ad6:	ff ff 41 64 6a 75 73 74 69 6e 67 20 5a 00           ..Adjusting Z.

00003ae4 <MSG_BED_CORRECTION_REAR>:
    3ae4:	ff ff 52 65 61 72 20 73 69 64 65 20 5b e4 6d 5d     ..Rear side [.m]
	...

00003af5 <MSG_BED_CORRECTION_FRONT>:
    3af5:	ff ff 46 72 6f 6e 74 20 73 69 64 65 5b e4 6d 5d     ..Front side[.m]
	...

00003b06 <MSG_BED_CORRECTION_RIGHT>:
    3b06:	ff ff 52 69 67 68 74 20 73 69 64 65 5b e4 6d 5d     ..Right side[.m]
	...

00003b17 <MSG_BED_CORRECTION_LEFT>:
    3b17:	ff ff 4c 65 66 74 20 73 69 64 65 20 5b e4 6d 5d     ..Left side [.m]
	...

00003b28 <MSG_SET_TEMPERATURE>:
    3b28:	ff ff 53 65 74 20 74 65 6d 70 65 72 61 74 75 72     ..Set temperatur
    3b38:	65 3a 00                                            e:.

00003b3b <MSG_CONFIRM_CARRIAGE_AT_THE_TOP>:
    3b3b:	ff ff 41 72 65 20 6c 65 66 74 20 61 6e 64 20 72     ..Are left and r
    3b4b:	69 67 68 74 20 5a 2d 63 61 72 72 69 61 67 65 73     ight Z-carriages
    3b5b:	20 61 6c 6c 20 75 70 3f 00                           all up?.

00003b64 <MSG_MOVE_CARRIAGE_TO_THE_TOP>:
    3b64:	ff ff 43 61 6c 69 62 72 61 74 69 6e 67 20 58 59     ..Calibrating XY
    3b74:	5a 2e 20 52 6f 74 61 74 65 20 74 68 65 20 6b 6e     Z. Rotate the kn
    3b84:	6f 62 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 5a     ob to move the Z
    3b94:	20 63 61 72 72 69 61 67 65 20 75 70 20 74 6f 20      carriage up to 
    3ba4:	74 68 65 20 65 6e 64 20 73 74 6f 70 70 65 72 73     the end stoppers
    3bb4:	2e 20 43 6c 69 63 6b 20 77 68 65 6e 20 64 6f 6e     . Click when don
    3bc4:	65 2e 00                                            e..

00003bc7 <MSG_MOVE_CARRIAGE_TO_THE_TOP_Z>:
    3bc7:	ff ff 43 61 6c 69 62 72 61 74 69 6e 67 20 5a 2e     ..Calibrating Z.
    3bd7:	20 52 6f 74 61 74 65 20 74 68 65 20 6b 6e 6f 62      Rotate the knob
    3be7:	20 74 6f 20 6d 6f 76 65 20 74 68 65 20 5a 20 63      to move the Z c
    3bf7:	61 72 72 69 61 67 65 20 75 70 20 74 6f 20 74 68     arriage up to th
    3c07:	65 20 65 6e 64 20 73 74 6f 70 70 65 72 73 2e 20     e end stoppers. 
    3c17:	43 6c 69 63 6b 20 77 68 65 6e 20 64 6f 6e 65 2e     Click when done.
	...

00003c28 <MSG_PINDA_CAL_FAILED>:
    3c28:	ff ff 50 49 4e 44 41 20 63 61 6c 69 62 72 61 74     ..PINDA calibrat
    3c38:	69 6f 6e 20 66 61 69 6c 65 64 00                    ion failed.

00003c43 <MSG_PINDA_CALIBRATION_DONE>:
    3c43:	ff ff 50 49 4e 44 41 20 63 61 6c 69 62 72 61 74     ..PINDA calibrat
    3c53:	69 6f 6e 20 69 73 20 66 69 6e 69 73 68 65 64 20     ion is finished 
    3c63:	61 6e 64 20 61 63 74 69 76 65 2e 20 49 74 20 63     and active. It c
    3c73:	61 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 69     an be disabled i
    3c83:	6e 20 6d 65 6e 75 20 53 65 74 74 69 6e 67 73 2d     n menu Settings-
    3c93:	3e 50 49 4e 44 41 20 63 61 6c 2e 00                 >PINDA cal..

00003c9f <MSG_EXTRUDER>:
    3c9f:	ff ff 45 78 74 72 75 64 65 72 00                    ..Extruder.

00003caa <MSG_MOVE_Z>:
    3caa:	ff ff 4d 6f 76 65 20 5a 00                          ..Move Z.

00003cb3 <MSG_MOVE_Y>:
    3cb3:	ff ff 4d 6f 76 65 20 59 00                          ..Move Y.

00003cbc <MSG_MOVE_X>:
    3cbc:	ff ff 4d 6f 76 65 20 58 00                          ..Move X.

00003cc5 <MSG_SHEET_OFFSET>:
    3cc5:	ff ff 53 68 65 65 74 20 25 2e 37 73 0a 5a 20 6f     ..Sheet %.7s.Z o
    3cd5:	66 66 73 65 74 3a 20 25 2b 31 2e 33 66 6d 6d 0a     ffset: %+1.3fmm.
    3ce5:	25 63 43 6f 6e 74 69 6e 75 65 0a 25 63 52 65 73     %cContinue.%cRes
    3cf5:	65 74 00                                            et.

00003cf8 <MSG_PLEASE_LOAD_PLA>:
    3cf8:	ff ff 50 6c 65 61 73 65 20 6c 6f 61 64 20 66 69     ..Please load fi
    3d08:	6c 61 6d 65 6e 74 20 66 69 72 73 74 2e 00           lament first..

00003d16 <MSG_SELECT_FILAMENT>:
    3d16:	ff ff 53 65 6c 65 63 74 20 66 69 6c 61 6d 65 6e     ..Select filamen
    3d26:	74 3a 00                                            t:.

00003d29 <MSG_CANCEL>:
    3d29:	ff ff 43 61 6e 63 65 6c 00                          ..Cancel.

00003d32 <MSG_WIZARD_RERUN>:
    3d32:	ff ff 52 75 6e 6e 69 6e 67 20 57 69 7a 61 72 64     ..Running Wizard
    3d42:	20 77 69 6c 6c 20 64 65 6c 65 74 65 20 63 75 72      will delete cur
    3d52:	72 65 6e 74 20 63 61 6c 69 62 72 61 74 69 6f 6e     rent calibration
    3d62:	20 72 65 73 75 6c 74 73 20 61 6e 64 20 73 74 61      results and sta
    3d72:	72 74 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69     rt from the begi
    3d82:	6e 6e 69 6e 67 2e 00                                nning..

00003d89 <MSG_WIZARD_HEATING>:
    3d89:	ff ff 50 72 65 68 65 61 74 69 6e 67 20 6e 6f 7a     ..Preheating noz
    3d99:	7a 6c 65 2e 20 50 6c 65 61 73 65 20 77 61 69 74     zle. Please wait
    3da9:	2e 00                                               ..

00003dab <MSG_WIZARD_LOAD_FILAMENT>:
    3dab:	ff ff 50 6c 65 61 73 65 20 69 6e 73 65 72 74 20     ..Please insert 
    3dbb:	66 69 6c 61 6d 65 6e 74 20 69 6e 74 6f 20 74 68     filament into th
    3dcb:	65 20 65 78 74 72 75 64 65 72 2c 20 74 68 65 6e     e extruder, then
    3ddb:	20 70 72 65 73 73 20 74 68 65 20 6b 6e 6f 62 20      press the knob 
    3deb:	74 6f 20 6c 6f 61 64 20 69 74 2e 00                 to load it..

00003df7 <MSG_MMU_INSERT_FILAMENT_FIRST_TUBE>:
    3df7:	ff ff 50 6c 65 61 73 65 20 69 6e 73 65 72 74 20     ..Please insert 
    3e07:	66 69 6c 61 6d 65 6e 74 20 69 6e 74 6f 20 74 68     filament into th
    3e17:	65 20 66 69 72 73 74 20 74 75 62 65 20 6f 66 20     e first tube of 
    3e27:	74 68 65 20 4d 4d 55 2c 20 74 68 65 6e 20 70 72     the MMU, then pr
    3e37:	65 73 73 20 74 68 65 20 6b 6e 6f 62 20 74 6f 20     ess the knob to 
    3e47:	6c 6f 61 64 20 69 74 2e 00                          load it..

00003e50 <MSG_WIZARD_V2_CAL_2>:
    3e50:	ff ff 54 68 65 20 70 72 69 6e 74 65 72 20 77 69     ..The printer wi
    3e60:	6c 6c 20 73 74 61 72 74 20 70 72 69 6e 74 69 6e     ll start printin
    3e70:	67 20 61 20 7a 69 67 2d 7a 61 67 20 6c 69 6e 65     g a zig-zag line
    3e80:	2e 20 52 6f 74 61 74 65 20 74 68 65 20 6b 6e 6f     . Rotate the kno
    3e90:	62 20 75 6e 74 69 6c 20 79 6f 75 20 72 65 61 63     b until you reac
    3ea0:	68 20 74 68 65 20 6f 70 74 69 6d 61 6c 20 68 65     h the optimal he
    3eb0:	69 67 68 74 2e 20 43 68 65 63 6b 20 74 68 65 20     ight. Check the 
    3ec0:	70 69 63 74 75 72 65 73 20 69 6e 20 74 68 65 20     pictures in the 
    3ed0:	68 61 6e 64 62 6f 6f 6b 20 28 43 61 6c 69 62 72     handbook (Calibr
    3ee0:	61 74 69 6f 6e 20 63 68 61 70 74 65 72 29 2e 00     ation chapter)..

00003ef0 <MSG_SELECT_TEMP_MATCHES_MATERIAL>:
    3ef0:	ff ff 53 65 6c 65 63 74 20 74 65 6d 70 65 72 61     ..Select tempera
    3f00:	74 75 72 65 20 77 68 69 63 68 20 6d 61 74 63 68     ture which match
    3f10:	65 73 20 79 6f 75 72 20 6d 61 74 65 72 69 61 6c     es your material
    3f20:	2e 00                                               ..

00003f22 <MSG_SELECT_FIL_1ST_LAYERCAL>:
    3f22:	ff ff 53 65 6c 65 63 74 20 61 20 66 69 6c 61 6d     ..Select a filam
    3f32:	65 6e 74 20 66 6f 72 20 74 68 65 20 46 69 72 73     ent for the Firs
    3f42:	74 20 4c 61 79 65 72 20 43 61 6c 69 62 72 61 74     t Layer Calibrat
    3f52:	69 6f 6e 20 61 6e 64 20 73 65 6c 65 63 74 20 69     ion and select i
    3f62:	74 20 69 6e 20 74 68 65 20 6f 6e 2d 73 63 72 65     t in the on-scre
    3f72:	65 6e 20 6d 65 6e 75 2e 00                          en menu..

00003f7b <MSG_WIZARD_V2_CAL>:
    3f7b:	ff ff 4e 6f 77 20 49 20 77 69 6c 6c 20 63 61 6c     ..Now I will cal
    3f8b:	69 62 72 61 74 65 20 64 69 73 74 61 6e 63 65 20     ibrate distance 
    3f9b:	62 65 74 77 65 65 6e 20 74 69 70 20 6f 66 20 74     between tip of t
    3fab:	68 65 20 6e 6f 7a 7a 6c 65 20 61 6e 64 20 68 65     he nozzle and he
    3fbb:	61 74 62 65 64 20 73 75 72 66 61 63 65 2e 00        atbed surface..

00003fca <MSG_Z_CALIBRATION_PROMPT>:
    3fca:	ff ff 5a 20 63 61 6c 69 62 72 61 74 69 6f 6e 20     ..Z calibration 
    3fda:	72 65 63 6f 6d 6d 65 6e 64 65 64 2e 20 52 75 6e     recommended. Run
    3fea:	20 69 74 20 6e 6f 77 3f 00                           it now?.

00003ff3 <MSG_REMOVE_STEEL_SHEET>:
    3ff3:	ff ff 50 6c 65 61 73 65 20 72 65 6d 6f 76 65 20     ..Please remove 
    4003:	73 74 65 65 6c 20 73 68 65 65 74 20 66 72 6f 6d     steel sheet from
    4013:	20 68 65 61 74 62 65 64 2e 00                        heatbed..

0000401d <MSG_STEEL_SHEET_CHECK>:
    401d:	ff ff 49 73 20 73 74 65 65 6c 20 73 68 65 65 74     ..Is steel sheet
    402d:	20 6f 6e 20 68 65 61 74 62 65 64 3f 00               on heatbed?.

0000403a <MSG_WIZARD_CALIBRATION_FAILED>:
    403a:	ff ff 50 6c 65 61 73 65 20 63 68 65 63 6b 20 6f     ..Please check o
    404a:	75 72 20 68 61 6e 64 62 6f 6f 6b 20 61 6e 64 20     ur handbook and 
    405a:	66 69 78 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e     fix the problem.
    406a:	20 54 68 65 6e 20 72 65 73 75 6d 65 20 74 68 65      Then resume the
    407a:	20 57 69 7a 61 72 64 20 62 79 20 72 65 62 6f 6f      Wizard by reboo
    408a:	74 69 6e 67 20 74 68 65 20 70 72 69 6e 74 65 72     ting the printer
    409a:	2e 00                                               ..

0000409c <MSG_WIZARD_DONE>:
    409c:	ff ff 41 6c 6c 20 69 73 20 64 6f 6e 65 2e 20 48     ..All is done. H
    40ac:	61 70 70 79 20 70 72 69 6e 74 69 6e 67 21 00        appy printing!.

000040bb <MSG_WIZARD_QUIT>:
    40bb:	ff ff 59 6f 75 20 63 61 6e 20 61 6c 77 61 79 73     ..You can always
    40cb:	20 72 65 73 75 6d 65 20 74 68 65 20 57 69 7a 61      resume the Wiza
    40db:	72 64 20 66 72 6f 6d 20 43 61 6c 69 62 72 61 74     rd from Calibrat
    40eb:	69 6f 6e 20 2d 3e 20 57 69 7a 61 72 64 2e 00        ion -> Wizard..

000040fa <MSG_ADDITIONAL_SHEETS>:
    40fa:	ff ff 49 66 20 79 6f 75 20 68 61 76 65 20 61 64     ..If you have ad
    410a:	64 69 74 69 6f 6e 61 6c 20 73 74 65 65 6c 20 73     ditional steel s
    411a:	68 65 65 74 73 2c 20 63 61 6c 69 62 72 61 74 65     heets, calibrate
    412a:	20 74 68 65 69 72 20 70 72 65 73 65 74 73 20 69      their presets i
    413a:	6e 20 53 65 74 74 69 6e 67 73 20 2d 20 48 57 20     n Settings - HW 
    414a:	53 65 74 75 70 20 2d 20 53 74 65 65 6c 20 73 68     Setup - Steel sh
    415a:	65 65 74 73 2e 00                                   eets..

00004160 <MSG_WIZARD_CLEAN_HEATBED>:
    4160:	ff ff 50 6c 65 61 73 65 20 63 6c 65 61 6e 20 68     ..Please clean h
    4170:	65 61 74 62 65 64 20 61 6e 64 20 74 68 65 6e 20     eatbed and then 
    4180:	70 72 65 73 73 20 74 68 65 20 6b 6e 6f 62 2e 00     press the knob..

00004190 <MSG_WIZARD_REPEAT_V2_CAL>:
    4190:	ff ff 44 6f 20 79 6f 75 20 77 61 6e 74 20 74 6f     ..Do you want to
    41a0:	20 72 65 70 65 61 74 20 6c 61 73 74 20 73 74 65      repeat last ste
    41b0:	70 20 74 6f 20 72 65 61 64 6a 75 73 74 20 64 69     p to readjust di
    41c0:	73 74 61 6e 63 65 20 62 65 74 77 65 65 6e 20 6e     stance between n
    41d0:	6f 7a 7a 6c 65 20 61 6e 64 20 68 65 61 74 62 65     ozzle and heatbe
    41e0:	64 3f 00                                            d?.

000041e3 <MSG_SEL_PREHEAT_TEMP>:
    41e3:	ff ff 53 65 6c 65 63 74 20 6e 6f 7a 7a 6c 65 20     ..Select nozzle 
    41f3:	70 72 65 68 65 61 74 20 74 65 6d 70 65 72 61 74     preheat temperat
    4203:	75 72 65 20 77 68 69 63 68 20 6d 61 74 63 68 65     ure which matche
    4213:	73 20 79 6f 75 72 20 6d 61 74 65 72 69 61 6c 2e     s your material.
	...

00004224 <MSG_FILAMENT_LOADED>:
    4224:	ff ff 49 73 20 66 69 6c 61 6d 65 6e 74 20 6c 6f     ..Is filament lo
    4234:	61 64 65 64 3f 00                                   aded?.

0000423a <MSG_WIZARD_WILL_PREHEAT>:
    423a:	ff ff 4e 6f 77 20 49 20 77 69 6c 6c 20 70 72 65     ..Now I will pre
    424a:	68 65 61 74 20 6e 6f 7a 7a 6c 65 20 66 6f 72 20     heat nozzle for 
    425a:	50 4c 41 2e 00                                      PLA..

0000425f <MSG_WIZARD_Z_CAL>:
    425f:	ff ff 49 20 77 69 6c 6c 20 72 75 6e 20 7a 20 63     ..I will run z c
    426f:	61 6c 69 62 72 61 74 69 6f 6e 20 6e 6f 77 2e 00     alibration now..

0000427f <MSG_REMOVE_TEST_PRINT>:
    427f:	ff ff 4e 6f 77 20 72 65 6d 6f 76 65 20 74 68 65     ..Now remove the
    428f:	20 74 65 73 74 20 70 72 69 6e 74 20 66 72 6f 6d      test print from
    429f:	20 73 74 65 65 6c 20 73 68 65 65 74 2e 00            steel sheet..

000042ad <MSG_REMOVE_SHIPPING_HELPERS>:
    42ad:	ff ff 50 6c 65 61 73 65 20 72 65 6d 6f 76 65 20     ..Please remove 
    42bd:	73 68 69 70 70 69 6e 67 20 68 65 6c 70 65 72 73     shipping helpers
    42cd:	20 66 69 72 73 74 2e 00                              first..

000042d5 <MSG_WIZARD_XYZ_CAL>:
    42d5:	ff ff 49 20 77 69 6c 6c 20 72 75 6e 20 78 79 7a     ..I will run xyz
    42e5:	20 63 61 6c 69 62 72 61 74 69 6f 6e 20 6e 6f 77      calibration now
    42f5:	2e 20 49 74 20 77 69 6c 6c 20 74 61 6b 65 20 75     . It will take u
    4305:	70 20 74 6f 20 32 34 20 6d 69 6e 73 2e 00           p to 24 mins..

00004313 <MSG_WIZARD_SELFTEST>:
    4313:	ff ff 46 69 72 73 74 2c 20 49 20 77 69 6c 6c 20     ..First, I will 
    4323:	72 75 6e 20 74 68 65 20 73 65 6c 66 74 65 73 74     run the selftest
    4333:	20 74 6f 20 63 68 65 63 6b 20 6d 6f 73 74 20 63      to check most c
    4343:	6f 6d 6d 6f 6e 20 61 73 73 65 6d 62 6c 79 20 70     ommon assembly p
    4353:	72 6f 62 6c 65 6d 73 2e 00                          roblems..

0000435c <MSG_WIZARD_WELCOME>:
    435c:	ff ff 48 69 2c 20 49 20 61 6d 20 79 6f 75 72 20     ..Hi, I am your 
    436c:	4f 72 69 67 69 6e 61 6c 20 50 72 75 73 61 20 69     Original Prusa i
    437c:	33 20 70 72 69 6e 74 65 72 2e 20 57 6f 75 6c 64     3 printer. Would
    438c:	20 79 6f 75 20 6c 69 6b 65 20 6d 65 20 74 6f 20      you like me to 
    439c:	67 75 69 64 65 20 79 6f 75 20 74 68 72 6f 75 67     guide you throug
    43ac:	68 20 74 68 65 20 73 65 74 75 70 20 70 72 6f 63     h the setup proc
    43bc:	65 73 73 3f 00                                      ess?.

000043c1 <MSG_WIZARD_WELCOME_SHIPPING>:
    43c1:	ff ff 48 69 2c 20 49 20 61 6d 20 79 6f 75 72 20     ..Hi, I am your 
    43d1:	4f 72 69 67 69 6e 61 6c 20 50 72 75 73 61 20 69     Original Prusa i
    43e1:	33 20 70 72 69 6e 74 65 72 2e 20 49 20 77 69 6c     3 printer. I wil
    43f1:	6c 20 67 75 69 64 65 20 79 6f 75 20 74 68 72 6f     l guide you thro
    4401:	75 67 68 20 61 20 73 68 6f 72 74 20 73 65 74 75     ugh a short setu
    4411:	70 20 70 72 6f 63 65 73 73 2c 20 69 6e 20 77 68     p process, in wh
    4421:	69 63 68 20 74 68 65 20 5a 2d 61 78 69 73 20 77     ich the Z-axis w
    4431:	69 6c 6c 20 62 65 20 63 61 6c 69 62 72 61 74 65     ill be calibrate
    4441:	64 2e 20 54 68 65 6e 2c 20 79 6f 75 20 77 69 6c     d. Then, you wil
    4451:	6c 20 62 65 20 72 65 61 64 79 20 74 6f 20 70 72     l be ready to pr
    4461:	69 6e 74 2e 00                                      int..

00004466 <MSG_PAUSE>:
    4466:	ff ff 50 61 75 73 65 00                             ..Pause.

0000446e <MSG_FS_ACTION>:
    446e:	ff ff 46 53 20 41 63 74 69 6f 6e 00                 ..FS Action.

0000447a <MSG_CONTINUE_SHORT>:
    447a:	ff ff 43 6f 6e 74 2e 00                             ..Cont..

00004482 <MSG_FSENSOR_JAM_DETECTION>:
    4482:	ff ff 46 2e 20 6a 61 6d 20 64 65 74 65 63 74 00     ..F. jam detect.

00004492 <MSG_FSENSOR_AUTOLOAD>:
    4492:	ff ff 46 2e 20 61 75 74 6f 6c 6f 61 64 00           ..F. autoload.

000044a0 <MSG_FSENSOR_RUNOUT>:
    44a0:	ff ff 46 2e 20 72 75 6e 6f 75 74 00                 ..F. runout.

000044ac <MSG_CUTTER>:
    44ac:	ff ff 43 75 74 74 65 72 00                          ..Cutter.

000044b5 <MSG_FAN_SPEED>:
    44b5:	ff ff 46 61 6e 20 73 70 65 65 64 00                 ..Fan speed.

000044c1 <MSG_BED>:
    44c1:	ff ff 42 65 64 00                                   ..Bed.

000044c7 <MSG_FANS_CHECK>:
    44c7:	ff ff 46 61 6e 73 20 63 68 65 63 6b 00              ..Fans check.

000044d4 <MSG_MODEL>:
    44d4:	ff ff 4d 6f 64 65 6c 00                             ..Model.

000044dc <MSG_NOZZLE>:
    44dc:	ff ff 4e 6f 7a 7a 6c 65 00                          ..Nozzle.

000044e5 <MSG_UNLOAD_FILAMENT_REPEAT>:
    44e5:	ff ff 50 6c 65 61 73 65 20 75 6e 6c 6f 61 64 20     ..Please unload 
    44f5:	74 68 65 20 66 69 6c 61 6d 65 6e 74 20 66 69 72     the filament fir
    4505:	73 74 2c 20 74 68 65 6e 20 72 65 70 65 61 74 20     st, then repeat 
    4515:	74 68 69 73 20 61 63 74 69 6f 6e 2e 00              this action..

00004522 <MSG_CHECKS>:
    4522:	ff ff 43 68 65 63 6b 73 00                          ..Checks.

0000452b <MSG_NOZZLE_DIAMETER>:
    452b:	ff ff 4e 6f 7a 7a 6c 65 20 64 2e 00                 ..Nozzle d..

00004537 <MSG_SORT_ALPHA>:
    4537:	ff ff 41 6c 70 68 61 62 65 74 00                    ..Alphabet.

00004542 <MSG_SORT>:
    4542:	ff ff 53 6f 72 74 00                                ..Sort.

00004549 <MSG_SORT_TIME>:
    4549:	ff ff 54 69 6d 65 00                                ..Time.

00004550 <MSG_NORMAL>:
    4550:	ff ff 4e 6f 72 6d 61 6c 00                          ..Normal.

00004559 <MSG_SD_CARD>:
    4559:	ff ff 53 44 20 63 61 72 64 00                       ..SD card.

00004563 <MSG_SELECT_LANGUAGE>:
    4563:	ff ff 53 65 6c 65 63 74 20 6c 61 6e 67 75 61 67     ..Select languag
    4573:	65 00                                               e.

00004575 <MSG_NOZZLE_CNG_MENU>:
    4575:	ff ff 4e 6f 7a 7a 6c 65 20 63 68 61 6e 67 65 00     ..Nozzle change.

00004585 <MSG_HW_SETUP>:
    4585:	ff ff 48 57 20 53 65 74 75 70 00                    ..HW Setup.

00004590 <MSG_LOADING_TEST>:
    4590:	ff ff 4c 6f 61 64 69 6e 67 20 54 65 73 74 00        ..Loading Test.

0000459f <MSG_DISABLE_STEPPERS>:
    459f:	ff ff 44 69 73 61 62 6c 65 20 73 74 65 70 70 65     ..Disable steppe
    45af:	72 73 00                                            rs.

000045b2 <MSG_MOVE_AXIS>:
    45b2:	ff ff 4d 6f 76 65 20 61 78 69 73 00                 ..Move axis.

000045be <MSG_TEMPERATURE>:
    45be:	ff ff 54 65 6d 70 65 72 61 74 75 72 65 00           ..Temperature.

000045cc <MSG_PINDA_CALIBRATION>:
    45cc:	ff ff 50 49 4e 44 41 20 63 61 6c 2e 00              ..PINDA cal..

000045d9 <MSG_CALIBRATE_BED_RESET>:
    45d9:	ff ff 52 65 73 65 74 20 58 59 5a 20 63 61 6c 69     ..Reset XYZ cali
    45e9:	62 72 2e 00                                         br..

000045ed <MSG_SHOW_END_STOPS>:
    45ed:	ff ff 53 68 6f 77 20 65 6e 64 20 73 74 6f 70 73     ..Show end stops
	...

000045fe <MSG_PID_EXTRUDER>:
    45fe:	ff ff 50 49 44 20 63 61 6c 69 62 72 61 74 69 6f     ..PID calibratio
    460e:	6e 00                                               n.

00004610 <MSG_BED_CORRECTION_MENU>:
    4610:	ff ff 42 65 64 20 6c 65 76 65 6c 20 63 6f 72 72     ..Bed level corr
    4620:	65 63 74 00                                         ect.

00004624 <MSG_MESH_BED_LEVELING>:
    4624:	ff ff 4d 65 73 68 20 42 65 64 20 4c 65 76 65 6c     ..Mesh Bed Level
    4634:	69 6e 67 00                                         ing.

00004638 <MSG_HOMEYZ>:
    4638:	ff ff 43 61 6c 69 62 72 61 74 65 20 5a 00           ..Calibrate Z.

00004646 <MSG_CALIBRATE_BED>:
    4646:	ff ff 43 61 6c 69 62 72 61 74 65 20 58 59 5a 00     ..Calibrate XYZ.

00004656 <MSG_SELFTEST>:
    4656:	ff ff 53 65 6c 66 74 65 73 74 00                    ..Selftest.

00004661 <MSG_WIZARD>:
    4661:	ff ff 57 69 7a 61 72 64 00                          ..Wizard.

0000466a <MSG_TESTING_FILAMENT>:
    466a:	ff ff 54 65 73 74 69 6e 67 20 66 69 6c 61 6d 65     ..Testing filame
    467a:	6e 74 00                                            nt.

0000467d <MSG_LOAD_ALL>:
    467d:	ff ff 4c 6f 61 64 20 41 6c 6c 00                    ..Load All.

00004688 <MSG_PULL_OUT_FILAMENT>:
    4688:	ff ff 50 6c 65 61 73 65 20 70 75 6c 6c 20 6f 75     ..Please pull ou
    4698:	74 20 66 69 6c 61 6d 65 6e 74 20 69 6d 6d 65 64     t filament immed
    46a8:	69 61 74 65 6c 79 00                                iately.

000046af <MSG_RESET>:
    46af:	ff ff 52 65 73 65 74 00                             ..Reset.

000046b7 <MSG_RENAME>:
    46b7:	ff ff 52 65 6e 61 6d 65 00                          ..Rename.

000046c0 <MSG_V2_CALIBRATION>:
    46c0:	ff ff 46 69 72 73 74 20 6c 61 79 65 72 20 63 61     ..First layer ca
    46d0:	6c 2e 00                                            l..

000046d3 <MSG_SELECT>:
    46d3:	ff ff 53 65 6c 65 63 74 00                          ..Select.

000046dc <MSG_STEEL_SHEETS>:
    46dc:	ff ff 53 74 65 65 6c 20 73 68 65 65 74 73 00        ..Steel sheets.

000046eb <MSG_SUPPORT>:
    46eb:	ff ff 53 75 70 70 6f 72 74 00                       ..Support.

000046f5 <MSG_MMU_FAIL_STATS>:
    46f5:	ff ff 46 61 69 6c 20 73 74 61 74 73 20 4d 4d 55     ..Fail stats MMU
	...

00004706 <MSG_FAIL_STATS>:
    4706:	ff ff 46 61 69 6c 20 73 74 61 74 73 00              ..Fail stats.

00004713 <MSG_STATISTICS>:
    4713:	ff ff 53 74 61 74 69 73 74 69 63 73 00              ..Statistics.

00004720 <MSG_CALIBRATION>:
    4720:	ff ff 43 61 6c 69 62 72 61 74 69 6f 6e 00           ..Calibration.

0000472e <MSG_AUTOLOAD_FILAMENT>:
    472e:	ff ff 41 75 74 6f 4c 6f 61 64 20 66 69 6c 61 6d     ..AutoLoad filam
    473e:	65 6e 74 00                                         ent.

00004742 <MSG_LOAD_FILAMENT>:
    4742:	ff ff 4c 6f 61 64 20 66 69 6c 61 6d 65 6e 74 00     ..Load filament.

00004752 <MSG_UNLOAD_FILAMENT>:
    4752:	ff ff 55 6e 6c 6f 61 64 20 66 69 6c 61 6d 65 6e     ..Unload filamen
    4762:	74 00                                               t.

00004764 <MSG_LOAD_TO_NOZZLE>:
    4764:	ff ff 4c 6f 61 64 20 74 6f 20 6e 6f 7a 7a 6c 65     ..Load to nozzle
	...

00004775 <MSG_PRELOAD_TO_MMU>:
    4775:	ff ff 50 72 65 6c 6f 61 64 20 74 6f 20 4d 4d 55     ..Preload to MMU
	...

00004786 <MSG_NO_CARD>:
    4786:	ff ff 4e 6f 20 53 44 20 63 61 72 64 00              ..No SD card.

00004793 <MSG_CARD_MENU>:
    4793:	ff ff 50 72 69 6e 74 20 66 72 6f 6d 20 53 44 00     ..Print from SD.

000047a3 <MSG_RESUME_PRINT>:
    47a3:	ff ff 52 65 73 75 6d 65 20 70 72 69 6e 74 00        ..Resume print.

000047b2 <MSG_PAUSE_PRINT>:
    47b2:	ff ff 50 61 75 73 65 20 70 72 69 6e 74 00           ..Pause print.

000047c0 <MSG_SET_READY>:
    47c0:	ff ff 53 65 74 20 52 65 61 64 79 00                 ..Set Ready.

000047cc <MSG_SET_NOT_READY>:
    47cc:	ff ff 53 65 74 20 6e 6f 74 20 52 65 61 64 79 00     ..Set not Ready.

000047dc <MSG_PREHEAT>:
    47dc:	ff ff 50 72 65 68 65 61 74 00                       ..Preheat.

000047e6 <MSG_TUNE>:
    47e6:	ff ff 54 75 6e 65 00                                ..Tune.

000047ed <MSG_BABYSTEP_Z>:
    47ed:	ff ff 4c 69 76 65 20 61 64 6a 75 73 74 20 5a 00     ..Live adjust Z.

000047fd <MSG_REPRINT>:
    47fd:	ff ff 52 65 70 72 69 6e 74 00                       ..Reprint.

00004807 <MSG_INFO_SCREEN>:
    4807:	ff ff 49 6e 66 6f 20 73 63 72 65 65 6e 00           ..Info screen.

00004815 <MSG_SOUND_BLIND>:
    4815:	ff ff 41 73 73 69 73 74 00                          ..Assist.

0000481e <MSG_SOUND_ONCE>:
    481e:	ff ff 4f 6e 63 65 00                                ..Once.

00004825 <MSG_SOUND>:
    4825:	ff ff 53 6f 75 6e 64 00                             ..Sound.

0000482d <MSG_SOUND_LOUD>:
    482d:	ff ff 4c 6f 75 64 00                                ..Loud.

00004834 <MSG_FSENSOR>:
    4834:	ff ff 46 69 6c 2e 20 73 65 6e 73 6f 72 00           ..Fil. sensor.

00004842 <MSG_FILAMENTCHANGE>:
    4842:	ff ff 43 68 61 6e 67 65 20 66 69 6c 61 6d 65 6e     ..Change filamen
    4852:	74 00                                               t.

00004854 <MSG_FLOW>:
    4854:	ff ff 46 6c 6f 77 00                                ..Flow.

0000485b <MSG_SPEED>:
    485b:	ff ff 53 70 65 65 64 00                             ..Speed.

00004863 <MSG_MAGNETS_COMP>:
    4863:	ff ff 4d 61 67 6e 65 74 73 20 63 6f 6d 70 2e 00     ..Magnets comp..

00004873 <MSG_NA>:
    4873:	ff ff 4e 2f 41 00                                   ..N/A.

00004879 <MSG_Z_PROBE_NR>:
    4879:	ff ff 5a 2d 70 72 6f 62 65 20 6e 72 2e 00           ..Z-probe nr..

00004887 <MSG_MESH>:
    4887:	ff ff 4d 65 73 68 00                                ..Mesh.

0000488e <MSG_SETTINGS>:
    488e:	ff ff 53 65 74 74 69 6e 67 73 00                    ..Settings.

00004899 <MSG_YES>:
    4899:	ff ff 59 65 73 00                                   ..Yes.

0000489f <MSG_NO>:
    489f:	ff ff 4e 6f 00                                      ..No.

000048a4 <MSG_STOP_PRINT>:
    48a4:	ff ff 53 74 6f 70 20 70 72 69 6e 74 00              ..Stop print.

000048b1 <MSG_CHECKING_FILE>:
    48b1:	ff ff 43 68 65 63 6b 69 6e 67 20 66 69 6c 65 00     ..Checking file.

000048c1 <MSG_FILE_INCOMPLETE>:
    48c1:	ff ff 46 69 6c 65 20 69 6e 63 6f 6d 70 6c 65 74     ..File incomplet
    48d1:	65 2e 00                                            e..

000048d4 <MSG_REFRESH>:
    48d4:	ff ff 84 52 65 66 72 65 73 68 00                    ...Refresh.

000048df <MSG_MAIN>:
    48df:	ff ff 4d 61 69 6e 00                                ..Main.

000048e6 <MSG_WAITING_TEMP>:
    48e6:	ff ff 57 61 69 74 69 6e 67 20 66 6f 72 20 6e 6f     ..Waiting for no
    48f6:	7a 7a 6c 65 20 61 6e 64 20 62 65 64 20 63 6f 6f     zzle and bed coo
    4906:	6c 69 6e 67 00                                      ling.

0000490b <MSG_SELFTEST_OK>:
    490b:	ff ff 53 65 6c 66 74 65 73 74 20 4f 4b 00           ..Selftest OK.

00004919 <MSG_SELFTEST_START>:
    4919:	ff ff 53 65 6c 66 74 65 73 74 20 73 74 61 72 74     ..Selftest start
	...

0000492a <MSG_SELFTEST_SWAPPED>:
    492a:	ff ff 53 77 61 70 70 65 64 00                       ..Swapped.

00004934 <MSG_SELFTEST_FANS>:
    4934:	ff ff 46 72 6f 6e 74 2f 6c 65 66 74 20 66 61 6e     ..Front/left fan
    4944:	73 00                                               s.

00004946 <MSG_SELFTEST_AXIS>:
    4946:	ff ff 41 78 69 73 00                                ..Axis.

0000494d <MSG_SELFTEST_AXIS_LENGTH>:
    494d:	ff ff 41 78 69 73 20 6c 65 6e 67 74 68 00           ..Axis length.

0000495b <MSG_LOOSE_PULLEY>:
    495b:	ff ff 4c 6f 6f 73 65 20 70 75 6c 6c 65 79 00        ..Loose pulley.

0000496a <MSG_SELFTEST_ENDSTOP_NOTHIT>:
    496a:	ff ff 45 6e 64 73 74 6f 70 20 6e 6f 74 20 68 69     ..Endstop not hi
    497a:	74 00                                               t.

0000497c <MSG_SELFTEST_ENDSTOP>:
    497c:	ff ff 45 6e 64 73 74 6f 70 00                       ..Endstop.

00004986 <MSG_SELFTEST_MOTOR>:
    4986:	ff ff 4d 6f 74 6f 72 00                             ..Motor.

0000498e <MSG_SELFTEST_ENDSTOPS>:
    498e:	ff ff 45 6e 64 73 74 6f 70 73 00                    ..Endstops.

00004999 <MSG_SELFTEST_WIRINGERROR>:
    4999:	ff ff 57 69 72 69 6e 67 20 65 72 72 6f 72 00        ..Wiring error.

000049a8 <MSG_SELFTEST_BEDHEATER>:
    49a8:	ff ff 42 65 64 2f 48 65 61 74 65 72 00              ..Bed/Heater.

000049b5 <MSG_SELFTEST_NOTCONNECTED>:
    49b5:	ff ff 4e 6f 74 20 63 6f 6e 6e 65 63 74 65 64 00     ..Not connected.

000049c5 <MSG_SELFTEST_HEATERTHERMISTOR>:
    49c5:	ff ff 48 65 61 74 65 72 2f 54 68 65 72 6d 69 73     ..Heater/Thermis
    49d5:	74 6f 72 00                                         tor.

000049d9 <MSG_SELFTEST_PLEASECHECK>:
    49d9:	ff ff 50 6c 65 61 73 65 20 63 68 65 63 6b 3a 00     ..Please check:.

000049e9 <MSG_SELFTEST_ERROR>:
    49e9:	ff ff 53 65 6c 66 74 65 73 74 20 65 72 72 6f 72     ..Selftest error
    49f9:	21 00                                               !.

000049fb <MSG_SELFTEST_FILAMENT_SENSOR>:
    49fb:	ff ff 46 69 6c 61 6d 65 6e 74 20 73 65 6e 73 6f     ..Filament senso
    4a0b:	72 00                                               r.

00004a0d <MSG_PRINT_FAN_SPEED>:
    4a0d:	ff ff 50 72 69 6e 74 20 66 61 6e 3a 00              ..Print fan:.

00004a1a <MSG_HOTEND_FAN_SPEED>:
    4a1a:	ff ff 48 6f 74 65 6e 64 20 66 61 6e 3a 00           ..Hotend fan:.

00004a28 <MSG_CALIBRATING_HOME>:
    4a28:	ff ff 43 61 6c 69 62 72 61 74 69 6e 67 20 68 6f     ..Calibrating ho
    4a38:	6d 65 00                                            me.

00004a3b <MSG_SELFTEST_FAILED>:
    4a3b:	ff ff 53 65 6c 66 74 65 73 74 20 66 61 69 6c 65     ..Selftest faile
    4a4b:	64 00                                               d.

00004a4d <MSG_SELFTEST_CHECK_ALLCORRECT>:
    4a4d:	ff ff 41 6c 6c 20 63 6f 72 72 65 63 74 00           ..All correct.

00004a5b <MSG_SELFTEST_CHECK_FSENSOR>:
    4a5b:	ff ff 43 68 65 63 6b 69 6e 67 20 73 65 6e 73 6f     ..Checking senso
    4a6b:	72 73 00                                            rs.

00004a6e <MSG_SELFTEST_CHECK_HOTEND>:
    4a6e:	ff ff 43 68 65 63 6b 69 6e 67 20 68 6f 74 65 6e     ..Checking hoten
    4a7e:	64 00                                               d.

00004a80 <MSG_SELFTEST_CHECK_BED>:
    4a80:	ff ff 43 68 65 63 6b 69 6e 67 20 62 65 64 00        ..Checking bed.

00004a8f <MSG_SELFTEST_CHECK_Z>:
    4a8f:	ff ff 43 68 65 63 6b 69 6e 67 20 5a 20 61 78 69     ..Checking Z axi
    4a9f:	73 00                                               s.

00004aa1 <MSG_CHECKING_Y>:
    4aa1:	ff ff 43 68 65 63 6b 69 6e 67 20 59 20 61 78 69     ..Checking Y axi
    4ab1:	73 00                                               s.

00004ab3 <MSG_CHECKING_X>:
    4ab3:	ff ff 43 68 65 63 6b 69 6e 67 20 58 20 61 78 69     ..Checking X axi
    4ac3:	73 00                                               s.

00004ac5 <MSG_SELFTEST_CHECK_ENDSTOPS>:
    4ac5:	ff ff 43 68 65 63 6b 69 6e 67 20 65 6e 64 73 74     ..Checking endst
    4ad5:	6f 70 73 00                                         ops.

00004ad9 <MSG_SD_REMOVED>:
    4ad9:	ff ff 43 61 72 64 20 72 65 6d 6f 76 65 64 00        ..Card removed.

00004ae8 <MSG_BACK>:
    4ae8:	ff ff 42 61 63 6b 00                                ..Back.

00004aef <MSG_AUTO_POWER>:
    4aef:	ff ff 41 75 74 6f 20 70 6f 77 65 72 00              ..Auto power.

00004afc <MSG_SILENT>:
    4afc:	ff ff 53 69 6c 65 6e 74 00                          ..Silent.

00004b05 <MSG_MODE>:
    4b05:	ff ff 4d 6f 64 65 00                                ..Mode.

00004b0c <MSG_HIGH_POWER>:
    4b0c:	ff ff 48 69 67 68 20 70 6f 77 65 72 00              ..High power.

00004b19 <MSG_STRICT>:
    4b19:	ff ff 53 74 72 69 63 74 00                          ..Strict.

00004b22 <MSG_WARN>:
    4b22:	ff ff 57 61 72 6e 00                                ..Warn.

00004b29 <MSG_NONE>:
    4b29:	ff ff 4e 6f 6e 65 00                                ..None.

00004b30 <MSG_NOZZLE_CNG_CHANGED>:
    4b30:	ff ff 48 6f 74 65 6e 64 20 61 74 20 32 38 30 43     ..Hotend at 280C
    4b40:	21 20 4e 6f 7a 7a 6c 65 20 63 68 61 6e 67 65 64     ! Nozzle changed
    4b50:	20 61 6e 64 20 74 69 67 68 74 65 6e 65 64 20 74      and tightened t
    4b60:	6f 20 73 70 65 63 73 3f 00                          o specs?.

00004b69 <MSG_NOZZLE_CNG_READ_HELP>:
    4b69:	ff ff 46 6f 72 20 61 20 4e 6f 7a 7a 6c 65 20 63     ..For a Nozzle c
    4b79:	68 61 6e 67 65 20 70 6c 65 61 73 65 20 72 65 61     hange please rea
    4b89:	64 0a 70 72 75 73 61 2e 69 6f 2f 6e 6f 7a 7a 6c     d.prusa.io/nozzl
    4b99:	65 2d 6d 6b 33 73 00                                e-mk3s.

00004ba0 <MSG_PID_FINISHED>:
    4ba0:	ff ff 50 49 44 20 63 61 6c 2e 20 66 69 6e 69 73     ..PID cal. finis
    4bb0:	68 65 64 00                                         hed.

00004bb4 <MSG_PID_RUNNING>:
    4bb4:	ff ff 50 49 44 20 63 61 6c 2e 00                    ..PID cal..

00004bbf <MSG_PRINT_PAUSED>:
    4bbf:	ff ff 50 72 69 6e 74 20 70 61 75 73 65 64 00        ..Print paused.

00004bce <MSG_PRINT_ABORTED>:
    4bce:	ff ff 50 72 69 6e 74 20 61 62 6f 72 74 65 64 00     ..Print aborted.

00004bde <MSG_COPY_SEL_LANG>:
    4bde:	ff ff 43 6f 70 79 20 73 65 6c 65 63 74 65 64 20     ..Copy selected 
    4bee:	6c 61 6e 67 75 61 67 65 3f 00                       language?.

00004bf8 <MSG_NOZZLE_DIFFERS_CONTINUE>:
    4bf8:	ff ff 4e 6f 7a 7a 6c 65 20 64 69 61 6d 65 74 65     ..Nozzle diamete
    4c08:	72 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74     r differs from t
    4c18:	68 65 20 47 2d 63 6f 64 65 2e 00                    he G-code..

00004c23 <MSG_NOZZLE_DIFFERS_CANCELLED>:
    4c23:	ff ff 4e 6f 7a 7a 6c 65 20 64 69 61 6d 65 74 65     ..Nozzle diamete
    4c33:	72 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74     r differs from t
    4c43:	68 65 20 47 2d 63 6f 64 65 2e 20 50 6c 65 61 73     he G-code. Pleas
    4c53:	65 20 63 68 65 63 6b 20 74 68 65 20 76 61 6c 75     e check the valu
    4c63:	65 20 69 6e 20 73 65 74 74 69 6e 67 73 2e 00        e in settings..

00004c72 <MSG_MISSING_FILAMENT>:
    4c72:	ff ff 54 68 65 72 65 20 69 73 20 6e 6f 20 66 69     ..There is no fi
    4c82:	6c 61 6d 65 6e 74 20 6c 6f 61 64 65 64 2e 00        lament loaded..

00004c91 <MSG_FOLLOW_Z_CALIBRATION_FLOW>:
    4c91:	ff ff 54 68 65 72 65 20 69 73 20 73 74 69 6c 6c     ..There is still
    4ca1:	20 61 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20      a need to make 
    4cb1:	5a 20 63 61 6c 69 62 72 61 74 69 6f 6e 2e 20 50     Z calibration. P
    4cc1:	6c 65 61 73 65 20 66 6f 6c 6c 6f 77 20 74 68 65     lease follow the
    4cd1:	20 6d 61 6e 75 61 6c 2c 20 63 68 61 70 74 65 72      manual, chapter
    4ce1:	20 46 69 72 73 74 20 73 74 65 70 73 2c 20 73 65      First steps, se
    4cf1:	63 74 69 6f 6e 20 43 61 6c 69 62 72 61 74 69 6f     ction Calibratio
    4d01:	6e 20 66 6c 6f 77 2e 00                             n flow..

00004d09 <MSG_FOLLOW_CALIBRATION_FLOW>:
    4d09:	ff ff 50 72 69 6e 74 65 72 20 68 61 73 20 6e 6f     ..Printer has no
    4d19:	74 20 62 65 65 6e 20 63 61 6c 69 62 72 61 74 65     t been calibrate
    4d29:	64 20 79 65 74 2e 20 50 6c 65 61 73 65 20 66 6f     d yet. Please fo
    4d39:	6c 6c 6f 77 20 74 68 65 20 6d 61 6e 75 61 6c 2c     llow the manual,
    4d49:	20 63 68 61 70 74 65 72 20 46 69 72 73 74 20 73      chapter First s
    4d59:	74 65 70 73 2c 20 73 65 63 74 69 6f 6e 20 43 61     teps, section Ca
    4d69:	6c 69 62 72 61 74 69 6f 6e 20 66 6c 6f 77 2e 00     libration flow..

00004d79 <MSG_FORCE_SELFTEST>:
    4d79:	ff ff 53 65 6c 66 74 65 73 74 20 77 69 6c 6c 20     ..Selftest will 
    4d89:	62 65 20 72 75 6e 20 74 6f 20 63 61 6c 69 62 72     be run to calibr
    4d99:	61 74 65 20 61 63 63 75 72 61 74 65 20 73 65 6e     ate accurate sen
    4da9:	73 6f 72 6c 65 73 73 20 72 65 68 6f 6d 69 6e 67     sorless rehoming
    4db9:	2e 00                                               ..

00004dbb <MSG_DEFAULT_SETTINGS_LOADED>:
    4dbb:	ff ff 4f 6c 64 20 73 65 74 74 69 6e 67 73 20 66     ..Old settings f
    4dcb:	6f 75 6e 64 2e 20 44 65 66 61 75 6c 74 20 50 49     ound. Default PI
    4ddb:	44 2c 20 45 73 74 65 70 73 20 65 74 63 2e 20 77     D, Esteps etc. w
    4deb:	69 6c 6c 20 62 65 20 73 65 74 2e 00                 ill be set..

00004df7 <MSG_CHANGED_BOTH>:
    4df7:	ff ff 57 61 72 6e 69 6e 67 3a 20 62 6f 74 68 20     ..Warning: both 
    4e07:	70 72 69 6e 74 65 72 20 74 79 70 65 20 61 6e 64     printer type and
    4e17:	20 6d 6f 74 68 65 72 62 6f 61 72 64 20 74 79 70      motherboard typ
    4e27:	65 20 63 68 61 6e 67 65 64 2e 00                    e changed..

00004e32 <MSG_CHANGED_PRINTER>:
    4e32:	ff ff 57 61 72 6e 69 6e 67 3a 20 70 72 69 6e 74     ..Warning: print
    4e42:	65 72 20 74 79 70 65 20 63 68 61 6e 67 65 64 2e     er type changed.
	...

00004e53 <MSG_CHANGED_MOTHERBOARD>:
    4e53:	ff ff 57 61 72 6e 69 6e 67 3a 20 6d 6f 74 68 65     ..Warning: mothe
    4e63:	72 62 6f 61 72 64 20 74 79 70 65 20 63 68 61 6e     rboard type chan
    4e73:	67 65 64 2e 00                                      ged..

00004e78 <MSG_SHEET>:
    4e78:	ff ff 53 68 65 65 74 00                             ..Sheet.

00004e80 <MMU2::MSG_DESC_UNKNOWN_ERROR>:
    4e80:	ff ff 55 6e 65 78 70 65 63 74 65 64 20 65 72 72     ..Unexpected err
    4e90:	6f 72 20 6f 63 63 75 72 72 65 64 2e 00              or occurred..

00004e9d <MMU2::MSG_DESC_FILAMENT_CHANGE>:
    4e9d:	ff ff 4d 36 30 30 20 46 69 6c 61 6d 65 6e 74 20     ..M600 Filament 
    4ead:	43 68 61 6e 67 65 2e 20 4c 6f 61 64 20 61 20 6e     Change. Load a n
    4ebd:	65 77 20 66 69 6c 61 6d 65 6e 74 20 6f 72 20 65     ew filament or e
    4ecd:	6a 65 63 74 20 74 68 65 20 6f 6c 64 20 6f 6e 65     ject the old one
    4edd:	2e 00                                               ..

00004edf <MMU2::MSG_DESC_FILAMENT_EJECTED>:
    4edf:	ff ff 52 65 6d 6f 76 65 20 74 68 65 20 65 6a 65     ..Remove the eje
    4eef:	63 74 65 64 20 66 69 6c 61 6d 65 6e 74 20 66 72     cted filament fr
    4eff:	6f 6d 20 74 68 65 20 66 72 6f 6e 74 20 6f 66 20     om the front of 
    4f0f:	74 68 65 20 4d 4d 55 2e 00                          the MMU..

00004f18 <MMU2::MSG_DESC_UNLOAD_MANUALLY>:
    4f18:	ff ff 46 69 6c 61 6d 65 6e 74 20 64 65 74 65 63     ..Filament detec
    4f28:	74 65 64 20 75 6e 65 78 70 65 63 74 65 64 6c 79     ted unexpectedly
    4f38:	2e 20 45 6e 73 75 72 65 20 6e 6f 20 66 69 6c 61     . Ensure no fila
    4f48:	6d 65 6e 74 20 69 73 20 6c 6f 61 64 65 64 2e 20     ment is loaded. 
    4f58:	43 68 65 63 6b 20 74 68 65 20 73 65 6e 73 6f 72     Check the sensor
    4f68:	73 20 61 6e 64 20 77 69 72 69 6e 67 2e 00           s and wiring..

00004f76 <MMU2::MSG_DESC_FW_RUNTIME_ERROR>:
    4f76:	ff ff 49 6e 74 65 72 6e 61 6c 20 72 75 6e 74 69     ..Internal runti
    4f86:	6d 65 20 65 72 72 6f 72 2e 20 54 72 79 20 72 65     me error. Try re
    4f96:	73 65 74 74 69 6e 67 20 74 68 65 20 4d 4d 55 20     setting the MMU 
    4fa6:	6f 72 20 75 70 64 61 74 69 6e 67 20 74 68 65 20     or updating the 
    4fb6:	66 69 72 6d 77 61 72 65 2e 00                       firmware..

00004fc0 <MMU2::MSG_DESC_FW_UPDATE_NEEDED>:
    4fc0:	ff ff 4d 4d 55 20 46 57 20 76 65 72 73 69 6f 6e     ..MMU FW version
    4fd0:	20 69 73 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65      is incompatible
    4fe0:	20 77 69 74 68 20 70 72 69 6e 74 65 72 20 46 57      with printer FW
    4ff0:	2e 55 70 64 61 74 65 20 74 6f 20 76 65 72 73 69     .Update to versi
    5000:	6f 6e 20 33 2e 30 2e 33 2e 00                       on 3.0.3..

0000500a <MMU2::MSG_DESC_QUEUE_FULL>:
    500a:	ff ff 4d 4d 55 20 46 69 72 6d 77 61 72 65 20 69     ..MMU Firmware i
    501a:	6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 2c 20 70     nternal error, p
    502a:	6c 65 61 73 65 20 72 65 73 65 74 20 74 68 65 20     lease reset the 
    503a:	4d 4d 55 2e 00                                      MMU..

0000503f <MMU2::MSG_DESC_INVALID_TOOL>:
    503f:	ff ff 52 65 71 75 65 73 74 65 64 20 66 69 6c 61     ..Requested fila
    504f:	6d 65 6e 74 20 74 6f 6f 6c 20 69 73 20 6e 6f 74     ment tool is not
    505f:	20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68      available on th
    506f:	69 73 20 68 61 72 64 77 61 72 65 2e 20 43 68 65     is hardware. Che
    507f:	63 6b 20 74 68 65 20 47 2d 63 6f 64 65 20 66 6f     ck the G-code fo
    508f:	72 20 74 6f 6f 6c 20 69 6e 64 65 78 20 6f 75 74     r tool index out
    509f:	20 6f 66 20 72 61 6e 67 65 20 28 54 30 2d 54 34      of range (T0-T4
    50af:	29 2e 00                                            )..

000050b2 <MMU2::MSG_DESC_FILAMENT_ALREADY_LOADED>:
    50b2:	ff ff 43 61 6e 6e 6f 74 20 70 65 72 66 6f 72 6d     ..Cannot perform
    50c2:	20 74 68 65 20 61 63 74 69 6f 6e 2c 20 66 69 6c      the action, fil
    50d2:	61 6d 65 6e 74 20 69 73 20 61 6c 72 65 61 64 79     ament is already
    50e2:	20 6c 6f 61 64 65 64 2e 20 55 6e 6c 6f 61 64 20      loaded. Unload 
    50f2:	69 74 20 66 69 72 73 74 2e 00                       it first..

000050fc <MMU2::MSG_DESC_COMMUNICATION_ERROR>:
    50fc:	ff ff 4d 4d 55 20 6e 6f 74 20 72 65 73 70 6f 6e     ..MMU not respon
    510c:	64 69 6e 67 20 63 6f 72 72 65 63 74 6c 79 2e 20     ding correctly. 
    511c:	43 68 65 63 6b 20 74 68 65 20 77 69 72 69 6e 67     Check the wiring
    512c:	20 61 6e 64 20 63 6f 6e 6e 65 63 74 6f 72 73 2e      and connectors.
	...

0000513d <MMU2::MSG_DESC_MMU_NOT_RESPONDING>:
    513d:	ff ff 4d 4d 55 20 6e 6f 74 20 72 65 73 70 6f 6e     ..MMU not respon
    514d:	64 69 6e 67 2e 20 43 68 65 63 6b 20 74 68 65 20     ding. Check the 
    515d:	77 69 72 69 6e 67 20 61 6e 64 20 63 6f 6e 6e 65     wiring and conne
    516d:	63 74 6f 72 73 2e 00                                ctors..

00005174 <MMU2::MSG_DESC_TMC>:
    5174:	ff ff 4d 6f 72 65 20 64 65 74 61 69 6c 73 20 6f     ..More details o
    5184:	6e 6c 69 6e 65 2e 00                                nline..

0000518b <MMU2::MSG_DESC_IDLER_CANNOT_HOME>:
    518b:	ff ff 54 68 65 20 49 64 6c 65 72 20 63 61 6e 6e     ..The Idler cann
    519b:	6f 74 20 68 6f 6d 65 20 70 72 6f 70 65 72 6c 79     ot home properly
    51ab:	2e 20 43 68 65 63 6b 20 66 6f 72 20 61 6e 79 74     . Check for anyt
    51bb:	68 69 6e 67 20 62 6c 6f 63 6b 69 6e 67 20 69 74     hing blocking it
    51cb:	73 20 6d 6f 76 65 6d 65 6e 74 2e 00                 s movement..

000051d7 <MMU2::MSG_DESC_CANNOT_MOVE>:
    51d7:	ff ff 43 61 6e 27 74 20 6d 6f 76 65 20 53 65 6c     ..Can't move Sel
    51e7:	65 63 74 6f 72 20 6f 72 20 49 64 6c 65 72 2e 00     ector or Idler..

000051f7 <MMU2::MSG_DESC_SELECTOR_CANNOT_HOME>:
    51f7:	ff ff 54 68 65 20 53 65 6c 65 63 74 6f 72 20 63     ..The Selector c
    5207:	61 6e 6e 6f 74 20 68 6f 6d 65 20 70 72 6f 70 65     annot home prope
    5217:	72 6c 79 2e 20 43 68 65 63 6b 20 66 6f 72 20 61     rly. Check for a
    5227:	6e 79 74 68 69 6e 67 20 62 6c 6f 63 6b 69 6e 67     nything blocking
    5237:	20 69 74 73 20 6d 6f 76 65 6d 65 6e 74 2e 00         its movement..

00005246 <MMU2::MSG_DESC_LOAD_TO_EXTRUDER_FAILED>:
    5246:	ff ff 4c 6f 61 64 69 6e 67 20 74 6f 20 65 78 74     ..Loading to ext
    5256:	72 75 64 65 72 20 66 61 69 6c 65 64 2e 20 49 6e     ruder failed. In
    5266:	73 70 65 63 74 20 74 68 65 20 66 69 6c 61 6d 65     spect the filame
    5276:	6e 74 20 74 69 70 20 73 68 61 70 65 2e 20 52 65     nt tip shape. Re
    5286:	66 69 6e 65 20 74 68 65 20 73 65 6e 73 6f 72 20     fine the sensor 
    5296:	63 61 6c 69 62 72 61 74 69 6f 6e 2c 20 69 66 20     calibration, if 
    52a6:	6e 65 65 64 65 64 2e 00                             needed..

000052ae <MMU2::MSG_DESC_INSPECT_FINDA>:
    52ae:	ff ff 53 65 6c 65 63 74 6f 72 20 63 61 6e 27 74     ..Selector can't
    52be:	20 6d 6f 76 65 20 64 75 65 20 74 6f 20 46 49 4e      move due to FIN
    52ce:	44 41 20 64 65 74 65 63 74 69 6e 67 20 61 20 66     DA detecting a f
    52de:	69 6c 61 6d 65 6e 74 2e 20 4d 61 6b 65 20 73 75     ilament. Make su
    52ee:	72 65 20 6e 6f 20 66 69 6c 61 6d 65 6e 74 20 69     re no filament i
    52fe:	73 20 69 6e 20 53 65 6c 65 63 74 6f 72 20 61 6e     s in Selector an
    530e:	64 20 46 49 4e 44 41 20 77 6f 72 6b 73 20 70 72     d FINDA works pr
    531e:	6f 70 65 72 6c 79 2e 00                             operly..

00005326 <MMU2::MSG_DESC_FSENSOR_TOO_EARLY>:
    5326:	ff ff 46 69 6c 61 6d 65 6e 74 20 73 65 6e 73 6f     ..Filament senso
    5336:	72 20 74 72 69 67 67 65 72 65 64 20 74 6f 6f 20     r triggered too 
    5346:	65 61 72 6c 79 20 77 68 69 6c 65 20 6c 6f 61 64     early while load
    5356:	69 6e 67 20 74 6f 20 65 78 74 72 75 64 65 72 2e     ing to extruder.
    5366:	20 43 68 65 63 6b 20 74 68 65 72 65 20 69 73 6e      Check there isn
    5376:	27 74 20 61 6e 79 74 68 69 6e 67 20 73 74 75 63     't anything stuc
    5386:	6b 20 69 6e 20 50 54 46 45 20 74 75 62 65 2e 20     k in PTFE tube. 
    5396:	43 68 65 63 6b 20 74 68 61 74 20 73 65 6e 73 6f     Check that senso
    53a6:	72 20 72 65 61 64 73 20 70 72 6f 70 65 72 6c 79     r reads properly
    53b6:	2e 00                                               ..

000053b8 <MMU2::MSG_DESC_PULLEY_CANNOT_MOVE>:
    53b8:	ff ff 50 75 6c 6c 65 79 20 6d 6f 74 6f 72 20 73     ..Pulley motor s
    53c8:	74 61 6c 6c 65 64 2e 20 45 6e 73 75 72 65 20 74     talled. Ensure t
    53d8:	68 65 20 70 75 6c 6c 65 79 20 63 61 6e 20 6d 6f     he pulley can mo
    53e8:	76 65 20 61 6e 64 20 63 68 65 63 6b 20 74 68 65     ve and check the
    53f8:	20 77 69 72 69 6e 67 2e 00                           wiring..

00005401 <MMU2::MSG_DESC_FSENSOR_FILAMENT_STUCK>:
    5401:	ff ff 46 69 6c 61 6d 65 6e 74 20 73 65 6e 73 6f     ..Filament senso
    5411:	72 20 64 69 64 6e 27 74 20 73 77 69 74 63 68 20     r didn't switch 
    5421:	6f 66 66 20 77 68 69 6c 65 20 75 6e 6c 6f 61 64     off while unload
    5431:	69 6e 67 20 66 69 6c 61 6d 65 6e 74 2e 20 45 6e     ing filament. En
    5441:	73 75 72 65 20 66 69 6c 61 6d 65 6e 74 20 63 61     sure filament ca
    5451:	6e 20 6d 6f 76 65 20 61 6e 64 20 74 68 65 20 73     n move and the s
    5461:	65 6e 73 6f 72 20 77 6f 72 6b 73 2e 00              ensor works..

0000546e <MMU2::MSG_DESC_FSENSOR_DIDNT_TRIGGER>:
    546e:	ff ff 46 69 6c 61 6d 65 6e 74 20 73 65 6e 73 6f     ..Filament senso
    547e:	72 20 64 69 64 6e 27 74 20 74 72 69 67 67 65 72     r didn't trigger
    548e:	20 77 68 69 6c 65 20 6c 6f 61 64 69 6e 67 20 74      while loading t
    549e:	68 65 20 66 69 6c 61 6d 65 6e 74 2e 20 45 6e 73     he filament. Ens
    54ae:	75 72 65 20 74 68 65 20 73 65 6e 73 6f 72 20 69     ure the sensor i
    54be:	73 20 63 61 6c 69 62 72 61 74 65 64 20 61 6e 64     s calibrated and
    54ce:	20 74 68 65 20 66 69 6c 61 6d 65 6e 74 20 72 65      the filament re
    54de:	61 63 68 65 64 20 69 74 2e 00                       ached it..

000054e8 <MMU2::MSG_DESC_FINDA_FILAMENT_STUCK>:
    54e8:	ff ff 46 49 4e 44 41 20 64 69 64 6e 27 74 20 73     ..FINDA didn't s
    54f8:	77 69 74 63 68 20 6f 66 66 20 77 68 69 6c 65 20     witch off while 
    5508:	75 6e 6c 6f 61 64 69 6e 67 20 66 69 6c 61 6d 65     unloading filame
    5518:	6e 74 2e 20 54 72 79 20 75 6e 6c 6f 61 64 69 6e     nt. Try unloadin
    5528:	67 20 6d 61 6e 75 61 6c 6c 79 2e 20 45 6e 73 75     g manually. Ensu
    5538:	72 65 20 66 69 6c 61 6d 65 6e 74 20 63 61 6e 20     re filament can 
    5548:	6d 6f 76 65 20 61 6e 64 20 46 49 4e 44 41 20 77     move and FINDA w
    5558:	6f 72 6b 73 2e 00                                   orks..

0000555e <MMU2::MSG_DESC_FINDA_DIDNT_TRIGGER>:
    555e:	ff ff 46 49 4e 44 41 20 64 69 64 6e 27 74 20 74     ..FINDA didn't t
    556e:	72 69 67 67 65 72 20 77 68 69 6c 65 20 6c 6f 61     rigger while loa
    557e:	64 69 6e 67 20 74 68 65 20 66 69 6c 61 6d 65 6e     ding the filamen
    558e:	74 2e 20 45 6e 73 75 72 65 20 74 68 65 20 66 69     t. Ensure the fi
    559e:	6c 61 6d 65 6e 74 20 63 61 6e 20 6d 6f 76 65 20     lament can move 
    55ae:	61 6e 64 20 46 49 4e 44 41 20 77 6f 72 6b 73 2e     and FINDA works.
	...

000055bf <MMU2::MSG_BTN_DISABLE_MMU>:
    55bf:	ff ff 44 69 73 61 62 6c 65 00                       ..Disable.

000055c9 <MMU2::MSG_BTN_STOP>:
    55c9:	ff ff 53 74 6f 70 00                                ..Stop.

000055d0 <MMU2::MSG_BTN_LOAD>:
    55d0:	ff ff 4c 6f 61 64 00                                ..Load.

000055d7 <MMU2::MSG_BTN_UNLOAD>:
    55d7:	ff ff 55 6e 6c 6f 61 64 00                          ..Unload.

000055e0 <MMU2::MSG_BTN_RESET_MMU>:
    55e0:	ff ff 52 65 73 65 74 4d 4d 55 00                    ..ResetMMU.

000055eb <MMU2::MSG_BTN_RETRY>:
    55eb:	ff ff 52 65 74 72 79 00                             ..Retry.

000055f3 <MSG_MMU_SENSITIVITY>:
    55f3:	ff ff 53 65 6e 73 69 74 69 76 69 74 79 00           ..Sensitivity.

00005601 <MSG_DONE>:
    5601:	ff ff 44 6f 6e 65 00                                ..Done.

00005608 <MSG_RESUMING_PRINT>:
    5608:	ff ff 52 65 73 75 6d 69 6e 67 20 70 72 69 6e 74     ..Resuming print
	...

00005619 <MSG_PINDA_PREHEAT>:
    5619:	ff ff 50 49 4e 44 41 20 48 65 61 74 69 6e 67 00     ..PINDA Heating.

00005629 <MSG_HOMEYZ_DONE>:
    5629:	ff ff 43 61 6c 69 62 72 61 74 69 6f 6e 20 64 6f     ..Calibration do
    5639:	6e 65 00                                            ne.

0000563c <MSG_CALIBRATE_Z_AUTO>:
    563c:	ff ff 43 61 6c 69 62 72 61 74 69 6e 67 20 5a 00     ..Calibrating Z.

0000564c <MSG_BED_DONE>:
    564c:	ff ff 42 65 64 20 64 6f 6e 65 00                    ..Bed done.

00005657 <MSG_BED_HEATING>:
    5657:	ff ff 42 65 64 20 48 65 61 74 69 6e 67 00           ..Bed Heating.

00005665 <MSG_HEATING_COMPLETE>:
    5665:	ff ff 48 65 61 74 69 6e 67 20 64 6f 6e 65 2e 00     ..Heating done..

00005675 <MSG_HEATING>:
    5675:	ff ff 48 65 61 74 69 6e 67 00                       ..Heating.

0000567f <MSG_TOTAL>:
    567f:	ff ff 54 6f 74 61 6c 00                             ..Total.

00005687 <MSG_LAST_PRINT>:
    5687:	ff ff 4c 61 73 74 20 70 72 69 6e 74 00              ..Last print.

00005694 <MSG_MMU_FAILS>:
    5694:	ff ff 4d 4d 55 20 66 61 69 6c 73 00                 ..MMU fails.

000056a0 <MSG_MMU_LOAD_FAILS>:
    56a0:	ff ff 4d 4d 55 20 6c 6f 61 64 20 66 61 69 6c 73     ..MMU load fails
	...

000056b1 <MSG_MMU_POWER_FAILS>:
    56b1:	ff ff 4d 4d 55 20 70 6f 77 65 72 20 66 61 69 6c     ..MMU power fail
    56c1:	73 00                                               s.

000056c3 <MSG_MATERIAL_CHANGES>:
    56c3:	ff ff 4d 61 74 65 72 69 61 6c 20 63 68 61 6e 67     ..Material chang
    56d3:	65 73 00                                            es.

000056d6 <MSG_LAST_PRINT_FAILURES>:
    56d6:	ff ff 4c 61 73 74 20 70 72 69 6e 74 20 66 61 69     ..Last print fai
    56e6:	6c 75 72 65 73 00                                   lures.

000056ec <MSG_TOTAL_FAILURES>:
    56ec:	ff ff 54 6f 74 61 6c 20 66 61 69 6c 75 72 65 73     ..Total failures
	...

000056fd <MSG_FIL_RUNOUTS>:
    56fd:	ff ff 46 69 6c 2e 20 72 75 6e 6f 75 74 73 00        ..Fil. runouts.

0000570c <MSG_MENU_TEMPERATURES>:
    570c:	ff ff 54 65 6d 70 65 72 61 74 75 72 65 73 00        ..Temperatures.

0000571b <MSG_INFO_SENSORS>:
    571b:	ff ff 53 65 6e 73 6f 72 20 69 6e 66 6f 00           ..Sensor info.

00005729 <MSG_INFO_EXTRUDER>:
    5729:	ff ff 45 78 74 72 75 64 65 72 20 69 6e 66 6f 00     ..Extruder info.

00005739 <MSG_XYZ_DETAILS>:
    5739:	ff ff 58 59 5a 20 63 61 6c 2e 20 64 65 74 61 69     ..XYZ cal. detai
    5749:	6c 73 00                                            ls.

0000574c <MSG_PRINTER_IP>:
    574c:	ff ff 50 72 69 6e 74 65 72 20 49 50 20 41 64 64     ..Printer IP Add
    575c:	72 3a 00                                            r:.

0000575f <MSG_UNKNOWN>:
    575f:	ff ff 75 6e 6b 6e 6f 77 6e 00                       ..unknown.

00005769 <MSG_MMU_CONNECTED>:
    5769:	ff ff 4d 4d 55 20 63 6f 6e 6e 65 63 74 65 64 00     ..MMU connected.

00005779 <MSG_DATE>:
    5779:	ff ff 44 61 74 65 3a 00                             ..Date:.

00005781 <MSG_TO_UNLOAD_FIL>:
    5781:	ff ff 74 6f 20 75 6e 6c 6f 61 64 20 66 69 6c 61     ..to unload fila
    5791:	6d 65 6e 74 00                                      ment.

00005796 <MSG_TO_LOAD_FIL>:
    5796:	ff ff 74 6f 20 6c 6f 61 64 20 66 69 6c 61 6d 65     ..to load filame
    57a6:	6e 74 00                                            nt.

000057a9 <MSG_PRESS_KNOB>:
    57a9:	ff ff 50 72 65 73 73 20 74 68 65 20 6b 6e 6f 62     ..Press the knob
	...

000057ba <MSG_PREHEATING_TO_CUT>:
    57ba:	ff ff 50 72 65 68 65 61 74 69 6e 67 20 74 6f 20     ..Preheating to 
    57ca:	63 75 74 00                                         cut.

000057ce <MSG_PREHEATING_TO_EJECT>:
    57ce:	ff ff 50 72 65 68 65 61 74 69 6e 67 20 74 6f 20     ..Preheating to 
    57de:	65 6a 65 63 74 00                                   eject.

000057e4 <MSG_PREHEATING_TO_UNLOAD>:
    57e4:	ff ff 50 72 65 68 65 61 74 69 6e 67 20 74 6f 20     ..Preheating to 
    57f4:	75 6e 6c 6f 61 64 00                                unload.

000057fb <MSG_PREHEATING_TO_LOAD>:
    57fb:	ff ff 50 72 65 68 65 61 74 69 6e 67 20 74 6f 20     ..Preheating to 
    580b:	6c 6f 61 64 00                                      load.

00005810 <MSG_COOLDOWN>:
    5810:	ff ff 43 6f 6f 6c 64 6f 77 6e 00                    ..Cooldown.

0000581b <MSG_FILAMENT_CLEAN>:
    581b:	ff ff 46 69 6c 61 6d 65 6e 74 20 65 78 74 72 75     ..Filament extru
    582b:	64 69 6e 67 20 26 20 77 69 74 68 20 63 6f 72 72     ding & with corr
    583b:	65 63 74 20 63 6f 6c 6f 72 3f 00                    ect color?.

00005846 <MSG_EJECT>:
    5846:	ff ff 45 6a 65 63 74 00                             ..Eject.

0000584e <MSG_AUTOLOADING_ENABLED>:
    584e:	ff ff 41 75 74 6f 6c 6f 61 64 69 6e 67 20 66 69     ..Autoloading fi
    585e:	6c 61 6d 65 6e 74 20 69 73 20 61 63 74 69 76 65     lament is active
    586e:	2c 20 6a 75 73 74 20 70 72 65 73 73 20 74 68 65     , just press the
    587e:	20 6b 6e 6f 62 20 61 6e 64 20 69 6e 73 65 72 74      knob and insert
    588e:	20 66 69 6c 61 6d 65 6e 74 2e 2e 2e 00               filament....

0000589b <MSG_TOTAL_FILAMENT>:
    589b:	ff ff 54 6f 74 61 6c 20 66 69 6c 61 6d 65 6e 74     ..Total filament
	...

000058ac <MSG_TOTAL_PRINT_TIME>:
    58ac:	ff ff 54 6f 74 61 6c 20 70 72 69 6e 74 20 74 69     ..Total print ti
    58bc:	6d 65 00                                            me.

000058bf <MSG_FILAMENT_USED>:
    58bf:	ff ff 46 69 6c 61 6d 65 6e 74 20 75 73 65 64 00     ..Filament used.

000058cf <MSG_PRINT_TIME>:
    58cf:	ff ff 50 72 69 6e 74 20 74 69 6d 65 00              ..Print time.

000058dc <MMU2::MSG_PROGRESS_FEED_FSENSOR>:
    58dc:	ff ff 46 65 65 64 69 6e 67 20 74 6f 20 46 53 65     ..Feeding to FSe
    58ec:	6e 73 6f 72 00                                      nsor.

000058f1 <MMU2::MSG_PROGRESS_MOVING_SELECTOR>:
    58f1:	ff ff 4d 6f 76 69 6e 67 20 73 65 6c 65 63 74 6f     ..Moving selecto
    5901:	72 00                                               r.

00005903 <MMU2::MSG_PROGRESS_HOMING>:
    5903:	ff ff 48 6f 6d 69 6e 67 00                          ..Homing.

0000590c <MMU2::MSG_PROGRESS_RETRACT_FINDA>:
    590c:	ff ff 52 65 74 72 61 63 74 20 66 72 6f 6d 20 46     ..Retract from F
    591c:	49 4e 44 41 00                                      INDA.

00005921 <MMU2::MSG_PROGRESS_EJECT_FILAMENT>:
    5921:	ff ff 45 6a 65 63 74 69 6e 67 20 66 69 6c 61 6d     ..Ejecting filam
    5931:	65 6e 74 00                                         ent.

00005935 <MMU2::MSG_PROGRESS_PARK_SELECTOR>:
    5935:	ff ff 50 61 72 6b 69 6e 67 20 73 65 6c 65 63 74     ..Parking select
    5945:	6f 72 00                                            or.

00005948 <MMU2::MSG_PROGRESS_RETURN_SELECTOR>:
    5948:	ff ff 52 65 74 75 72 6e 69 6e 67 20 73 65 6c 65     ..Returning sele
    5958:	63 74 6f 72 00                                      ctor.

0000595d <MMU2::MSG_PROGRESS_PERFORM_CUT>:
    595d:	ff ff 50 65 72 66 6f 72 6d 69 6e 67 20 63 75 74     ..Performing cut
	...

0000596e <MMU2::MSG_PROGRESS_PUSH_FILAMENT>:
    596e:	ff ff 50 75 73 68 69 6e 67 20 66 69 6c 61 6d 65     ..Pushing filame
    597e:	6e 74 00                                            nt.

00005981 <MMU2::MSG_PROGRESS_PREPARE_BLADE>:
    5981:	ff ff 50 72 65 70 61 72 69 6e 67 20 62 6c 61 64     ..Preparing blad
    5991:	65 00                                               e.

00005993 <MMU2::MSG_PROGRESS_SELECT_SLOT>:
    5993:	ff ff 53 65 6c 65 63 74 69 6e 67 20 66 69 6c 2e     ..Selecting fil.
    59a3:	20 73 6c 6f 74 00                                    slot.

000059a9 <MSG_UNLOADING_FILAMENT>:
    59a9:	ff ff 55 6e 6c 6f 61 64 69 6e 67 20 66 69 6c 61     ..Unloading fila
    59b9:	6d 65 6e 74 00                                      ment.

000059be <MMU2::MSG_PROGRESS_ERR_TMC>:
    59be:	ff ff 45 52 52 20 54 4d 43 20 66 61 69 6c 65 64     ..ERR TMC failed
	...

000059cf <MMU2::MSG_PROGRESS_ERR_HELP_FIL>:
    59cf:	ff ff 45 52 52 20 48 65 6c 70 20 66 69 6c 61 6d     ..ERR Help filam
    59df:	65 6e 74 00                                         ent.

000059e3 <MMU2::MSG_PROGRESS_ERR_INTERNAL>:
    59e3:	ff ff 45 52 52 20 49 6e 74 65 72 6e 61 6c 00        ..ERR Internal.

000059f2 <MMU2::MSG_PROGRESS_WAIT_USER>:
    59f2:	ff ff 45 52 52 20 57 61 69 74 20 66 6f 72 20 55     ..ERR Wait for U
    5a02:	73 65 72 00                                         ser.

00005a06 <MSG_FINISHING_MOVEMENTS>:
    5a06:	ff ff 46 69 6e 69 73 68 69 6e 67 20 6d 6f 76 65     ..Finishing move
    5a16:	6d 65 6e 74 73 00                                   ments.

00005a1c <MMU2::MSG_PROGRESS_AVOID_GRIND>:
    5a1c:	ff ff 41 76 6f 69 64 69 6e 67 20 67 72 69 6e 64     ..Avoiding grind
	...

00005a2d <MMU2::MSG_PROGRESS_FEED_NOZZLE>:
    5a2d:	ff ff 46 65 65 64 69 6e 67 20 74 6f 20 6e 6f 7a     ..Feeding to noz
    5a3d:	7a 6c 65 00                                         zle.

00005a41 <MMU2::MSG_PROGRESS_FEED_EXTRUDER>:
    5a41:	ff ff 46 65 65 64 69 6e 67 20 74 6f 20 65 78 74     ..Feeding to ext
    5a51:	72 75 64 65 72 00                                   ruder.

00005a57 <MMU2::MSG_PROGRESS_FEED_FINDA>:
    5a57:	ff ff 46 65 65 64 69 6e 67 20 74 6f 20 46 49 4e     ..Feeding to FIN
    5a67:	44 41 00                                            DA.

00005a6a <MMU2::MSG_PROGRESS_UNLOAD_PULLEY>:
    5a6a:	ff ff 55 6e 6c 6f 61 64 69 6e 67 20 74 6f 20 70     ..Unloading to p
    5a7a:	75 6c 6c 65 79 00                                   ulley.

00005a80 <MMU2::MSG_PROGRESS_UNLOAD_FINDA>:
    5a80:	ff ff 55 6e 6c 6f 61 64 69 6e 67 20 74 6f 20 46     ..Unloading to F
    5a90:	49 4e 44 41 00                                      INDA.

00005a95 <MMU2::MSG_PROGRESS_DISENGAGE_IDLER>:
    5a95:	ff ff 44 69 73 65 6e 67 61 67 69 6e 67 20 69 64     ..Disengaging id
    5aa5:	6c 65 72 00                                         ler.

00005aa9 <MMU2::MSG_PROGRESS_ENGAGE_IDLER>:
    5aa9:	ff ff 45 6e 67 61 67 69 6e 67 20 69 64 6c 65 72     ..Engaging idler
	...

00005aba <MMU2::MSG_PROGRESS_OK>:
    5aba:	ff ff 4f 4b 00                                      ..OK.

00005abf <_ZN4MMU2L23MSG_TITLE_UNKNOWN_ERRORE.lto_priv.483>:
    5abf:	ff ff 55 4e 4b 4e 4f 57 4e 20 45 52 52 4f 52 00     ..UNKNOWN ERROR.

00005acf <_ZN4MMU2L25MSG_TITLE_FILAMENT_CHANGEE.lto_priv.482>:
    5acf:	ff ff 46 49 4c 41 4d 45 4e 54 20 43 48 41 4e 47     ..FILAMENT CHANG
    5adf:	45 00                                               E.

00005ae1 <_ZN4MMU2L26MSG_TITLE_FILAMENT_EJECTEDE.lto_priv.481>:
    5ae1:	ff ff 46 49 4c 41 4d 45 4e 54 20 45 4a 45 43 54     ..FILAMENT EJECT
    5af1:	45 44 00                                            ED.

00005af4 <_ZN4MMU2L25MSG_TITLE_UNLOAD_MANUALLYE.lto_priv.480>:
    5af4:	ff ff 55 4e 4c 4f 41 44 20 4d 41 4e 55 41 4c 4c     ..UNLOAD MANUALL
    5b04:	59 00                                               Y.

00005b06 <_ZN4MMU2L26MSG_TITLE_FW_RUNTIME_ERRORE.lto_priv.479>:
    5b06:	ff ff 46 57 20 52 55 4e 54 49 4d 45 20 45 52 52     ..FW RUNTIME ERR
    5b16:	4f 52 00                                            OR.

00005b19 <_ZN4MMU2L26MSG_TITLE_FW_UPDATE_NEEDEDE.lto_priv.478>:
    5b19:	ff ff 4d 4d 55 20 46 57 20 55 50 44 41 54 45 20     ..MMU FW UPDATE 
    5b29:	4e 45 45 44 45 44 00                                NEEDED.

00005b30 <_ZN4MMU2L20MSG_TITLE_QUEUE_FULLE.lto_priv.477>:
    5b30:	ff ff 51 55 45 55 45 20 46 55 4c 4c 00              ..QUEUE FULL.

00005b3d <_ZN4MMU2L22MSG_TITLE_INVALID_TOOLE.lto_priv.476>:
    5b3d:	ff ff 49 4e 56 41 4c 49 44 20 54 4f 4f 4c 00        ..INVALID TOOL.

00005b4c <_ZN4MMU2L33MSG_TITLE_FILAMENT_ALREADY_LOADEDE.lto_priv.475>:
    5b4c:	ff ff 46 49 4c 2e 20 41 4c 52 45 41 44 59 20 4c     ..FIL. ALREADY L
    5b5c:	4f 41 44 45 44 00                                   OADED.

00005b62 <_ZN4MMU2L29MSG_TITLE_COMMUNICATION_ERRORE.lto_priv.474>:
    5b62:	ff ff 43 4f 4d 4d 55 4e 49 43 41 54 49 4f 4e 20     ..COMMUNICATION 
    5b72:	45 52 52 4f 52 00                                   ERROR.

00005b78 <_ZN4MMU2L28MSG_TITLE_MMU_NOT_RESPONDINGE.lto_priv.473>:
    5b78:	ff ff 4d 4d 55 20 4e 4f 54 20 52 45 53 50 4f 4e     ..MMU NOT RESPON
    5b88:	44 49 4e 47 00                                      DING.

00005b8d <_ZN4MMU2L23MSG_TITLE_MMU_MCU_ERRORE.lto_priv.472>:
    5b8d:	ff ff 4d 4d 55 20 4d 43 55 20 45 52 52 4f 52 00     ..MMU MCU ERROR.

00005b9d <_ZN4MMU2L25MSG_TITLE_SELFTEST_FAILEDE.lto_priv.471>:
    5b9d:	ff ff 4d 4d 55 20 53 45 4c 46 54 45 53 54 20 46     ..MMU SELFTEST F
    5bad:	41 49 4c 45 44 00                                   AILED.

00005bb3 <_ZN4MMU2L28MSG_TITLE_TMC_DRIVER_SHORTEDE.lto_priv.470>:
    5bb3:	ff ff 54 4d 43 20 44 52 49 56 45 52 20 53 48 4f     ..TMC DRIVER SHO
    5bc3:	52 54 45 44 00                                      RTED.

00005bc8 <_ZN4MMU2L32MSG_TITLE_TMC_UNDERVOLTAGE_ERRORE.lto_priv.469>:
    5bc8:	ff ff 54 4d 43 20 55 4e 44 45 52 56 4f 4c 54 41     ..TMC UNDERVOLTA
    5bd8:	47 45 20 45 52 52 00                                GE ERR.

00005bdf <_ZN4MMU2L26MSG_TITLE_TMC_DRIVER_RESETE.lto_priv.468>:
    5bdf:	ff ff 54 4d 43 20 44 52 49 56 45 52 20 52 45 53     ..TMC DRIVER RES
    5bef:	45 54 00                                            ET.

00005bf2 <_ZN4MMU2L26MSG_TITLE_TMC_DRIVER_ERRORE.lto_priv.467>:
    5bf2:	ff ff 54 4d 43 20 44 52 49 56 45 52 20 45 52 52     ..TMC DRIVER ERR
    5c02:	4f 52 00                                            OR.

00005c05 <_ZN4MMU2L28MSG_TITLE_TMC_OVERHEAT_ERRORE.lto_priv.466>:
    5c05:	ff ff 54 4d 43 20 4f 56 45 52 48 45 41 54 20 45     ..TMC OVERHEAT E
    5c15:	52 52 4f 52 00                                      RROR.

00005c1a <_ZN4MMU2L33MSG_TITLE_TMC_WARNING_TMC_TOO_HOTE.lto_priv.465>:
    5c1a:	ff ff 57 41 52 4e 49 4e 47 20 54 4d 43 20 54 4f     ..WARNING TMC TO
    5c2a:	4f 20 48 4f 54 00                                   O HOT.

00005c30 <_ZN4MMU2L27MSG_TITLE_IDLER_CANNOT_MOVEE.lto_priv.464>:
    5c30:	ff ff 49 44 4c 45 52 20 43 41 4e 4e 4f 54 20 4d     ..IDLER CANNOT M
    5c40:	4f 56 45 00                                         OVE.

00005c44 <_ZN4MMU2L27MSG_TITLE_IDLER_CANNOT_HOMEE.lto_priv.463>:
    5c44:	ff ff 49 44 4c 45 52 20 43 41 4e 4e 4f 54 20 48     ..IDLER CANNOT H
    5c54:	4f 4d 45 00                                         OME.

00005c58 <_ZN4MMU2L30MSG_TITLE_SELECTOR_CANNOT_MOVEE.lto_priv.462>:
    5c58:	ff ff 53 45 4c 45 43 54 4f 52 20 43 41 4e 4e 4f     ..SELECTOR CANNO
    5c68:	54 20 4d 4f 56 45 00                                T MOVE.

00005c6f <_ZN4MMU2L30MSG_TITLE_SELECTOR_CANNOT_HOMEE.lto_priv.461>:
    5c6f:	ff ff 53 45 4c 45 43 54 4f 52 20 43 41 4e 4e 4f     ..SELECTOR CANNO
    5c7f:	54 20 48 4f 4d 45 00                                T HOME.

00005c86 <_ZN4MMU2L33MSG_TITLE_LOAD_TO_EXTRUDER_FAILEDE.lto_priv.460>:
    5c86:	ff ff 4c 4f 41 44 20 54 4f 20 45 58 54 52 2e 20     ..LOAD TO EXTR. 
    5c96:	46 41 49 4c 45 44 00                                FAILED.

00005c9d <_ZN4MMU2L23MSG_TITLE_INSPECT_FINDAE.lto_priv.459>:
    5c9d:	ff ff 49 4e 53 50 45 43 54 20 46 49 4e 44 41 00     ..INSPECT FINDA.

00005cad <_ZN4MMU2L27MSG_TITLE_FSENSOR_TOO_EARLYE.lto_priv.458>:
    5cad:	ff ff 46 53 45 4e 53 4f 52 20 54 4f 4f 20 45 41     ..FSENSOR TOO EA
    5cbd:	52 4c 59 00                                         RLY.

00005cc1 <_ZN4MMU2L28MSG_TITLE_PULLEY_CANNOT_MOVEE.lto_priv.457>:
    5cc1:	ff ff 50 55 4c 4c 45 59 20 43 41 4e 4e 4f 54 20     ..PULLEY CANNOT 
    5cd1:	4d 4f 56 45 00                                      MOVE.

00005cd6 <_ZN4MMU2L32MSG_TITLE_FSENSOR_FILAMENT_STUCKE.lto_priv.456>:
    5cd6:	ff ff 46 53 45 4e 53 4f 52 20 46 49 4c 2e 20 53     ..FSENSOR FIL. S
    5ce6:	54 55 43 4b 00                                      TUCK.

00005ceb <_ZN4MMU2L31MSG_TITLE_FSENSOR_DIDNT_TRIGGERE.lto_priv.455>:
    5ceb:	ff ff 46 53 45 4e 53 4f 52 20 44 49 44 4e 54 20     ..FSENSOR DIDNT 
    5cfb:	54 52 49 47 47 2e 00                                TRIGG..

00005d02 <_ZN4MMU2L30MSG_TITLE_FINDA_FILAMENT_STUCKE.lto_priv.454>:
    5d02:	ff ff 46 49 4e 44 41 20 46 49 4c 41 4d 2e 20 53     ..FINDA FILAM. S
    5d12:	54 55 43 4b 00                                      TUCK.

00005d17 <_ZN4MMU2L29MSG_TITLE_FINDA_DIDNT_TRIGGERE.lto_priv.453>:
    5d17:	ff ff 46 49 4e 44 41 20 44 49 44 4e 54 20 54 52     ..FINDA DIDNT TR
    5d27:	49 47 47 45 52 00                                   IGGER.

00005d2d <MSG_SELFTEST_FAN_NO>:
    5d2d:	ff ff 4e 6f 74 20 73 70 69 6e 6e 69 6e 67 00        ..Not spinning.

00005d3c <MSG_SELFTEST_FAN_YES>:
    5d3c:	ff ff 53 70 69 6e 6e 69 6e 67 00                    ..Spinning.

00005d47 <MSG_SELFTEST_HOTEND_FAN>:
    5d47:	ff ff 4c 65 66 74 20 68 6f 74 65 6e 64 20 66 61     ..Left hotend fa
    5d57:	6e 3f 00                                            n?.

00005d5a <MSG_SELFTEST_PART_FAN>:
    5d5a:	ff ff 46 72 6f 6e 74 20 70 72 69 6e 74 20 66 61     ..Front print fa
    5d6a:	6e 3f 00                                            n?.

00005d6d <MSG_SELFTEST_FAN>:
    5d6d:	ff ff 46 61 6e 20 74 65 73 74 00                    ..Fan test.

00005d78 <MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME>:
    5d78:	ff ff 58 59 5a 20 63 61 6c 69 62 72 61 74 69 6f     ..XYZ calibratio
    5d88:	6e 20 61 6c 6c 20 72 69 67 68 74 2e 20 53 6b 65     n all right. Ske
    5d98:	77 20 77 69 6c 6c 20 62 65 20 63 6f 72 72 65 63     w will be correc
    5da8:	74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c     ted automaticall
    5db8:	79 2e 00                                            y..

00005dbb <MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD>:
    5dbb:	ff ff 58 59 5a 20 63 61 6c 69 62 72 61 74 69 6f     ..XYZ calibratio
    5dcb:	6e 20 61 6c 6c 20 72 69 67 68 74 2e 20 58 2f 59     n all right. X/Y
    5ddb:	20 61 78 65 73 20 61 72 65 20 73 6c 69 67 68 74      axes are slight
    5deb:	6c 79 20 73 6b 65 77 65 64 2e 20 47 6f 6f 64 20     ly skewed. Good 
    5dfb:	6a 6f 62 21 00                                      job!.

00005e00 <MSG_BED_SKEW_OFFSET_DETECTION_PERFECT>:
    5e00:	ff ff 58 59 5a 20 63 61 6c 69 62 72 61 74 69 6f     ..XYZ calibratio
    5e10:	6e 20 6f 6b 2e 20 58 2f 59 20 61 78 65 73 20 61     n ok. X/Y axes a
    5e20:	72 65 20 70 65 72 70 65 6e 64 69 63 75 6c 61 72     re perpendicular
    5e30:	2e 20 43 6f 6e 67 72 61 74 75 6c 61 74 69 6f 6e     . Congratulation
    5e40:	73 21 00                                            s!.

00005e43 <MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR>:
    5e43:	ff ff 58 59 5a 20 63 61 6c 69 62 72 61 74 69 6f     ..XYZ calibratio
    5e53:	6e 20 63 6f 6d 70 72 6f 6d 69 73 65 64 2e 20 52     n compromised. R
    5e63:	69 67 68 74 20 66 72 6f 6e 74 20 63 61 6c 69 62     ight front calib
    5e73:	72 61 74 69 6f 6e 20 70 6f 69 6e 74 20 6e 6f 74     ration point not
    5e83:	20 72 65 61 63 68 61 62 6c 65 2e 00                  reachable..

00005e8f <MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR>:
    5e8f:	ff ff 58 59 5a 20 63 61 6c 69 62 72 61 74 69 6f     ..XYZ calibratio
    5e9f:	6e 20 63 6f 6d 70 72 6f 6d 69 73 65 64 2e 20 46     n compromised. F
    5eaf:	72 6f 6e 74 20 63 61 6c 69 62 72 61 74 69 6f 6e     ront calibration
    5ebf:	20 70 6f 69 6e 74 73 20 6e 6f 74 20 72 65 61 63      points not reac
    5ecf:	68 61 62 6c 65 2e 00                                hable..

00005ed6 <MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR>:
    5ed6:	ff ff 58 59 5a 20 63 61 6c 69 62 72 61 74 69 6f     ..XYZ calibratio
    5ee6:	6e 20 66 61 69 6c 65 64 2e 20 52 69 67 68 74 20     n failed. Right 
    5ef6:	66 72 6f 6e 74 20 63 61 6c 69 62 72 61 74 69 6f     front calibratio
    5f06:	6e 20 70 6f 69 6e 74 20 6e 6f 74 20 72 65 61 63     n point not reac
    5f16:	68 61 62 6c 65 2e 00                                hable..

00005f1d <MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR>:
    5f1d:	ff ff 58 59 5a 20 63 61 6c 69 62 72 61 74 69 6f     ..XYZ calibratio
    5f2d:	6e 20 66 61 69 6c 65 64 2e 20 46 72 6f 6e 74 20     n failed. Front 
    5f3d:	63 61 6c 69 62 72 61 74 69 6f 6e 20 70 6f 69 6e     calibration poin
    5f4d:	74 73 20 6e 6f 74 20 72 65 61 63 68 61 62 6c 65     ts not reachable
    5f5d:	2e 00                                               ..

00005f5f <MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED>:
    5f5f:	ff ff 58 59 5a 20 63 61 6c 69 62 72 61 74 69 6f     ..XYZ calibratio
    5f6f:	6e 20 66 61 69 6c 65 64 2e 20 50 6c 65 61 73 65     n failed. Please
    5f7f:	20 63 6f 6e 73 75 6c 74 20 74 68 65 20 6d 61 6e      consult the man
    5f8f:	75 61 6c 2e 00                                      ual..

00005f94 <MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND>:
    5f94:	ff ff 58 59 5a 20 63 61 6c 69 62 72 61 74 69 6f     ..XYZ calibratio
    5fa4:	6e 20 66 61 69 6c 65 64 2e 20 42 65 64 20 63 61     n failed. Bed ca
    5fb4:	6c 69 62 72 61 74 69 6f 6e 20 70 6f 69 6e 74 20     libration point 
    5fc4:	77 61 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 00        was not found..

00005fd3 <MSG_PLACE_STEEL_SHEET>:
    5fd3:	ff ff 50 6c 65 61 73 65 20 70 6c 61 63 65 20 73     ..Please place s
    5fe3:	74 65 65 6c 20 73 68 65 65 74 20 6f 6e 20 68 65     teel sheet on he
    5ff3:	61 74 62 65 64 2e 00                                atbed..

00005ffa <MSG_BABYSTEP_Z_NOT_SET>:
    5ffa:	ff ff 44 69 73 74 61 6e 63 65 20 62 65 74 77 65     ..Distance betwe
    600a:	65 6e 20 74 69 70 20 6f 66 20 74 68 65 20 6e 6f     en tip of the no
    601a:	7a 7a 6c 65 20 61 6e 64 20 74 68 65 20 62 65 64     zzle and the bed
    602a:	20 73 75 72 66 61 63 65 20 68 61 73 20 6e 6f 74      surface has not
    603a:	20 62 65 65 6e 20 73 65 74 20 79 65 74 2e 20 50      been set yet. P
    604a:	6c 65 61 73 65 20 66 6f 6c 6c 6f 77 20 74 68 65     lease follow the
    605a:	20 6d 61 6e 75 61 6c 2c 20 63 68 61 70 74 65 72      manual, chapter
    606a:	20 46 69 72 73 74 20 73 74 65 70 73 2c 20 73 65      First steps, se
    607a:	63 74 69 6f 6e 20 46 69 72 73 74 20 6c 61 79 65     ction First laye
    608a:	72 20 63 61 6c 69 62 72 61 74 69 6f 6e 2e 00        r calibration..

00006099 <MSG_PAPER>:
    6099:	ff ff 50 6c 61 63 65 20 61 20 73 68 65 65 74 20     ..Place a sheet 
    60a9:	6f 66 20 70 61 70 65 72 20 75 6e 64 65 72 20 74     of paper under t
    60b9:	68 65 20 6e 6f 7a 7a 6c 65 20 64 75 72 69 6e 67     he nozzle during
    60c9:	20 74 68 65 20 63 61 6c 69 62 72 61 74 69 6f 6e      the calibration
    60d9:	20 6f 66 20 66 69 72 73 74 20 34 20 70 6f 69 6e      of first 4 poin
    60e9:	74 73 2e 20 49 66 20 74 68 65 20 6e 6f 7a 7a 6c     ts. If the nozzl
    60f9:	65 20 63 61 74 63 68 65 73 20 74 68 65 20 70 61     e catches the pa
    6109:	70 65 72 2c 20 70 6f 77 65 72 20 6f 66 66 20 74     per, power off t
    6119:	68 65 20 70 72 69 6e 74 65 72 20 69 6d 6d 65 64     he printer immed
    6129:	69 61 74 65 6c 79 2e 00                             iately..

00006131 <MSG_FIND_BED_OFFSET_AND_SKEW_LINE1>:
    6131:	ff ff 53 65 61 72 63 68 69 6e 67 20 62 65 64 20     ..Searching bed 
    6141:	63 61 6c 69 62 72 61 74 69 6f 6e 20 70 6f 69 6e     calibration poin
    6151:	74 00                                               t.

00006153 <MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1>:
    6153:	ff ff 4d 65 61 73 75 72 69 6e 67 20 72 65 66 65     ..Measuring refe
    6163:	72 65 6e 63 65 20 68 65 69 67 68 74 20 6f 66 20     rence height of 
    6173:	63 61 6c 69 62 72 61 74 69 6f 6e 20 70 6f 69 6e     calibration poin
    6183:	74 00                                               t.

00006185 <MSG_CONFIRM_NOZZLE_CLEAN>:
    6185:	ff ff 50 6c 65 61 73 65 20 63 6c 65 61 6e 20 74     ..Please clean t
    6195:	68 65 20 6e 6f 7a 7a 6c 65 20 66 6f 72 20 63 61     he nozzle for ca
    61a5:	6c 69 62 72 61 74 69 6f 6e 2e 20 43 6c 69 63 6b     libration. Click
    61b5:	20 77 68 65 6e 20 64 6f 6e 65 2e 00                  when done..

000061c1 <MSG_AUTO_HOME>:
    61c1:	ff ff 41 75 74 6f 20 68 6f 6d 65 00                 ..Auto home.

000061cd <MSG_CUT_FILAMENT>:
    61cd:	ff ff 43 75 74 20 66 69 6c 61 6d 65 6e 74 00        ..Cut filament.

000061dc <MSG_EJECT_FROM_MMU>:
    61dc:	ff ff 45 6a 65 63 74 20 66 72 6f 6d 20 4d 4d 55     ..Eject from MMU
	...

000061ed <MSG_LOADING_FILAMENT>:
    61ed:	ff ff 4c 6f 61 64 69 6e 67 20 66 69 6c 61 6d 65     ..Loading filame
    61fd:	6e 74 00                                            nt.

00006200 <MSG_MMU_RESTORE_TEMP>:
    6200:	ff ff 4d 4d 55 20 52 65 74 72 79 3a 20 52 65 73     ..MMU Retry: Res
    6210:	74 6f 72 69 6e 67 20 74 65 6d 70 65 72 61 74 75     toring temperatu
    6220:	72 65 2e 2e 2e 00                                   re....

00006226 <MSG_SORTING_FILES>:
    6226:	ff ff 53 6f 72 74 69 6e 67 20 66 69 6c 65 73 00     ..Sorting files.

00006236 <MSG_FILE_CNT>:
    6236:	ff ff 53 6f 6d 65 20 66 69 6c 65 73 20 77 69 6c     ..Some files wil
    6246:	6c 20 6e 6f 74 20 62 65 20 73 6f 72 74 65 64 2e     l not be sorted.
    6256:	20 4d 61 78 2e 20 4e 6f 2e 20 6f 66 20 66 69 6c      Max. No. of fil
    6266:	65 73 20 69 6e 20 31 20 66 6f 6c 64 65 72 20 66     es in 1 folder f
    6276:	6f 72 20 73 6f 72 74 69 6e 67 20 69 73 20 31 30     or sorting is 10
    6286:	30 2e 00                                            0..

00006289 <MSG_STOPPED>:
    6289:	ff ff 53 54 4f 50 50 45 44 2e 00                    ..STOPPED..

00006294 <MSG_OFF>:
    6294:	ff ff 4f 66 66 00                                   ..Off.

0000629a <MSG_ON>:
    629a:	ff ff 4f 6e 00                                      ..On.

0000629f <__loc_pri_end>:
    629f:	65 6e       	ori	r22, 0xE5	; 229
    62a1:	71 75       	andi	r23, 0x51	; 81
    62a3:	65 69       	ori	r22, 0x95	; 149
    62a5:	6e 67       	ori	r22, 0x7E	; 126
    62a7:	20 22       	and	r2, r16
	...

000062aa <get_command()::__c>:
    62aa:	44 6f 6e 65 20 70 72 69 6e 74 69 6e 67 20 66 69     Done printing fi
    62ba:	6c 65 00                                            le.

000062bd <get_command()::__c>:
    62bd:	4e 6f 20 4c 69 6e 65 20 4e 75 6d 62 65 72 20 77     No Line Number w
    62cd:	69 74 68 20 63 68 65 63 6b 73 75 6d 2c 20 4c 61     ith checksum, La
    62dd:	73 74 20 4c 69 6e 65 3a 20 00                       st Line: .

000062e7 <get_command()::__c>:
    62e7:	4e 6f 20 43 68 65 63 6b 73 75 6d 20 77 69 74 68     No Checksum with
    62f7:	20 6c 69 6e 65 20 6e 75 6d 62 65 72 2c 20 4c 61      line number, La
    6307:	73 74 20 4c 69 6e 65 3a 20 00                       st Line: .

00006311 <get_command()::__c>:
    6311:	63 68 65 63 6b 73 75 6d 20 6d 69 73 6d 61 74 63     checksum mismatc
    6321:	68 2c 20 4c 61 73 74 20 4c 69 6e 65 3a 20 00        h, Last Line: .

00006330 <get_command()::__c>:
    6330:	4c 69 6e 65 20 4e 75 6d 62 65 72 20 69 73 20 6e     Line Number is n
    6340:	6f 74 20 4c 61 73 74 20 4c 69 6e 65 20 4e 75 6d     ot Last Line Num
    6350:	62 65 72 2b 31 2c 20 4c 61 73 74 20 4c 69 6e 65     ber+1, Last Line
    6360:	3a 20 00                                            : .

00006363 <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)::__c>:
    6363:	25 75 20 62 79 74 65 73 20 77 72 69 74 74 65 6e     %u bytes written
    6373:	20 74 6f 20 25 53 20 61 74 20 61 64 64 72 65 73      to %S at addres
    6383:	73 20 30 78 25 30 38 78 0a 00                       s 0x%08x..

0000638d <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)::__c>:
    638d:	44 25 64 20 2d 20 52 65 61 64 2f 57 72 69 74 65     D%d - Read/Write
    639d:	20 25 53 0a 00                                       %S..

000063a2 <__c.2310>:
    63a2:	3f 3f 00                                            ??.

000063a5 <__c.2308>:
    63a5:	52 6f 6d 61 6e 61 00                                Romana.

000063ac <__c.2305>:
    63ac:	48 72 76 61 74 73 6b 69 00                          Hrvatski.

000063b5 <__c.2302>:
    63b5:	4d 61 67 79 61 72 00                                Magyar.

000063bc <__c.2299>:
    63bc:	53 6c 6f 76 65 6e 63 69 6e 61 00                    Slovencina.

000063c7 <__c.2296>:
    63c7:	4e 6f 72 73 6b 00                                   Norsk.

000063cd <__c.2293>:
    63cd:	53 76 65 6e 73 6b 61 00                             Svenska.

000063d5 <__c.2290>:
    63d5:	4e 65 64 65 72 6c 61 6e 64 73 00                    Nederlands.

000063e0 <__c.2287>:
    63e0:	50 6f 6c 73 6b 69 00                                Polski.

000063e7 <__c.2284>:
    63e7:	49 74 61 6c 69 61 6e 6f 00                          Italiano.

000063f0 <__c.2281>:
    63f0:	46 72 61 6e 63 61 69 73 00                          Francais.

000063f9 <__c.2278>:
    63f9:	45 73 70 61 6e 6f 6c 00                             Espanol.

00006401 <__c.2275>:
    6401:	44 65 75 74 73 63 68 00                             Deutsch.

00006409 <__c.2272>:
    6409:	43 65 73 74 69 6e 61 00                             Cestina.

00006411 <__c.2269>:
    6411:	45 6e 67 6c 69 73 68 00                             English.

00006419 <gcode_M114()::__c>:
    6419:	20 43 6f 75 6e 74 20 58 3a 20 00                     Count X: .

00006424 <gcode_M123()::__c>:
    6424:	45 30 3a 25 64 20 52 50 4d 20 50 52 4e 31 3a 25     E0:%d RPM PRN1:%
    6434:	64 20 52 50 4d 20 45 30 40 3a 25 75 20 50 52 4e     d RPM E0@:%u PRN
    6444:	31 40 3a 25 75 0a 00                                1@:%u..

0000644b <FlushSerialRequestResend()::__c>:
    644b:	52 65 73 65 6e 64 00                                Resend.

00006452 <FlushSerialRequestResend()::__c>:
    6452:	25 53 3a 20 25 6c 64 0a 25 53 0a 00                 %S: %ld.%S..

0000645e <MSG_HOST_ACTION_NOTIFICATION>:
    645e:	2f 2f 61 63 74 69 6f 6e 3a 6e 6f 74 69 66 69 63     //action:notific
    646e:	61 74 69 6f 6e 20 25 53 0a 00                       ation %S..

00006478 <MSG_FILAMENT_RUNOUT_DETECTED>:
    6478:	46 69 6c 61 6d 65 6e 74 20 72 75 6e 6f 75 74 20     Filament runout 
    6488:	64 65 74 65 63 74 65 64 21 00                       detected!.

00006492 <dcode_23()::__c>:
    6492:	64 69 73 61 62 6c 65 64 00                          disabled.

0000649b <dcode_23()::__c>:
    649b:	65 6e 61 62 6c 65 64 00                             enabled.

000064a3 <dcode_3()::__c>:
    64a3:	45 45 50 52 4f 4d 00                                EEPROM.

000064aa <dcode_2()::__c>:
    64aa:	53 52 41 4d 00                                      SRAM.

000064af <dcode__1()::__c>:
    64af:	44 2d 31 20 2d 20 45 6e 64 6c 65 73 73 20 6c 6f     D-1 - Endless lo
    64bf:	6f 70 0a 00                                         op..

000064c3 <TCodes(char*, unsigned char)::__c>:
    64c3:	41 63 74 69 76 65 20 45 78 74 72 75 64 65 72 3a     Active Extruder:
    64d3:	20 30 00                                             0.

000064d6 <TCodes(char*, unsigned char)::__c>:
    64d6:	49 6e 76 61 6c 69 64 20 65 78 74 72 75 64 65 72     Invalid extruder
	...

000064e7 <MSG_M220>:
    64e7:	4d 32 32 30 20 53 25 64 00                          M220 S%d.

000064f0 <CardReader::getStatus(bool)::__c>:
    64f0:	53 44 20 70 72 69 6e 74 69 6e 67 20 62 79 74 65     SD printing byte
    6500:	20 00                                                .

00006502 <farm_prusa_code_seen()::__c>:
    6502:	25 75 00                                            %u.

00006505 <MSG_UNKNOWN_COMMAND>:
    6505:	55 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 3a     Unknown command:
    6515:	20 22 00                                             ".

00006518 <_ZZ16process_commandsvE3__c__55_>:
    6518:	4d 32 30 30 20 49 6e 76 61 6c 69 64 20 65 78 74     M200 Invalid ext
    6528:	72 75 64 65 72 20 00                                ruder .

0000652f <MSG_Z_MAX>:
    652f:	7a 5f 6d 61 78 3a 20 00                             z_max: .

00006537 <MSG_Z_MIN>:
    6537:	7a 5f 6d 69 6e 3a 20 00                             z_min: .

0000653f <_ZZ16process_commandsvE3__c__54_>:
    653f:	79 5f 6d 69 6e 3a 20 00                             y_min: .

00006547 <MSG_ENDSTOP_HIT>:
    6547:	54 52 49 47 47 45 52 45 44 00                       TRIGGERED.

00006551 <MSG_ENDSTOP_OPEN>:
    6551:	6f 70 65 6e 00                                      open.

00006556 <_ZZ16process_commandsvE3__c__53_>:
    6556:	78 5f 6d 69 6e 3a 20 00                             x_min: .

0000655e <_ZZ16process_commandsvE3__c__52_>:
    655e:	52 65 70 6f 72 74 69 6e 67 20 65 6e 64 73 74 6f     Reporting endsto
    656e:	70 20 73 74 61 74 75 73 00                          p status.

00006577 <MSG_M112_KILL>:
    6577:	4d 31 31 32 20 63 61 6c 6c 65 64 2e 20 45 6d 65     M112 called. Eme
    6587:	72 67 65 6e 63 79 20 53 74 6f 70 2e 00              rgency Stop..

00006594 <MSG_HOST_ACTION_UVLO_RECOVERY_READY>:
    6594:	2f 2f 61 63 74 69 6f 6e 3a 75 76 6c 6f 5f 72 65     //action:uvlo_re
    65a4:	63 6f 76 65 72 79 5f 72 65 61 64 79 00              covery_ready.

000065b1 <_ZZ16process_commandsvE3__c__38_>:
    65b1:	25 53 3a 25 6c 75 20 63 6d 0a 25 53 3a 25 6c 75     %S:%lu cm.%S:%lu
    65c1:	20 6d 69 6e 0a 00                                    min..

000065c7 <_ZZ16process_commandsvE3__c__37_>:
    65c7:	53 49 4c 45 4e 54 00                                SILENT.

000065ce <_ZZ16process_commandsvE3__c__36_>:
    65ce:	4e 4f 52 4d 41 4c 00                                NORMAL.

000065d5 <_ZZ16process_commandsvE3__c__35_>:
    65d5:	25 53 20 4d 4f 44 45 3a 20 50 65 72 63 65 6e 74     %S MODE: Percent
    65e5:	20 64 6f 6e 65 3a 20 25 68 68 64 3b 20 70 72 69      done: %hhd; pri
    65f5:	6e 74 20 74 69 6d 65 20 72 65 6d 61 69 6e 69 6e     nt time remainin
    6605:	67 20 69 6e 20 6d 69 6e 73 3a 20 25 64 3b 20 43     g in mins: %d; C
    6615:	68 61 6e 67 65 20 69 6e 20 6d 69 6e 73 3a 20 25     hange in mins: %
    6625:	64 0a 00                                            d..

00006628 <_ZZ16process_commandsvE3__c__34_>:
    6628:	50 72 69 6e 74 65 72 53 74 61 74 65 3a 20 25 64     PrinterState: %d
    6638:	0a 00                                               ..

0000663a <_ZZ16process_commandsvE3__c__30_>:
    663a:	45 6e 64 20 66 69 6c 65 20 6c 69 73 74 00           End file list.

00006648 <_ZZ16process_commandsvE3__c__29_>:
    6648:	42 65 67 69 6e 20 66 69 6c 65 20 6c 69 73 74 00     Begin file list.

00006658 <MSG_UNKNOWN_CODE>:
    6658:	55 6e 6b 6e 6f 77 6e 20 25 63 20 63 6f 64 65 3a     Unknown %c code:
    6668:	20 25 73 0a 00                                       %s..

0000666d <_ZZ16process_commandsvE3__c__27_>:
    666d:	0a 50 49 4e 44 41 20 74 65 6d 70 65 72 61 74 75     .PINDA temperatu
    667d:	72 65 3a 20 25 2e 31 66 20 5a 20 73 68 69 66 74     re: %.1f Z shift
    668d:	20 28 6d 6d 29 3a 20 25 2e 33 66 00                  (mm): %.3f.

00006699 <_ZZ16process_commandsvE3__c__26_>:
    6699:	0a 53 74 65 70 3a 20 25 64 2f 36 0a 00              .Step: %d/6..

000066a6 <_ZZ16process_commandsvE3__c__25_>:
    66a6:	0a 53 74 65 70 3a 20 25 64 2f 36 20 28 73 6b 69     .Step: %d/6 (ski
    66b6:	70 70 65 64 29 0a 50 49 4e 44 41 20 74 65 6d 70     pped).PINDA temp
    66c6:	65 72 61 74 75 72 65 3a 20 25 64 20 5a 20 73 68     erature: %d Z sh
    66d6:	69 66 74 20 28 6d 6d 29 3a 30 0a 00                 ift (mm):0..

000066e2 <_ZZ16process_commandsvE3__c__24_>:
    66e2:	0a 5a 45 52 4f 3a 20 25 2e 33 66 0a 00              .ZERO: %.3f..

000066ef <_ZZ16process_commandsvE3__c__23_>:
    66ef:	73 74 61 72 74 20 74 65 6d 70 65 72 61 74 75 72     start temperatur
    66ff:	65 3a 20 25 2e 31 66 0a 00                          e: %.1f..

00006708 <_ZZ16process_commandsvE3__c__20_>:
    6708:	25 64 20 20 25 2e 32 66 00                          %d  %.2f.

00006711 <_ZZ16process_commandsvE3__c__19_>:
    6711:	25 53 20 58 3a 20 25 2e 35 66 20 59 3a 20 25 2e     %S X: %.5f Y: %.
    6721:	35 66 20 5a 3a 20 25 2e 35 66 0a 00                 5f Z: %.5f..

0000672d <_ZZ16process_commandsvE3__c__18_>:
    672d:	53 6c 65 65 70 2e 2e 2e 00                          Sleep....

00006736 <process_commands()::__c>:
    6736:	45 30 3a 25 64 20 52 50 4d 0a 50 52 4e 30 3a 25     E0:%d RPM.PRN0:%
    6746:	64 20 52 50 4d 0a 00                                d RPM..

0000674d <sample_mesh_and_store_reference()::__c>:
    674d:	31 2f 39 00                                         1/9.

00006751 <MSG_G90>:
    6751:	47 39 30 00                                         G90.

00006755 <MSG_M107>:
    6755:	4d 31 30 37 00                                      M107.

0000675a <lcd_menu_xyz_y_min()::__c>:
    675a:	25 36 2e 32 66 6d 6d 00                             %6.2fmm.

00006762 <lcd_menu_xyz_y_min()::__c>:
    6762:	25 53 0a 25 53 0a 25 53 3a 0a 25 53 3a 00           %S.%S.%S:.%S:.

00006770 <lcd_menu_xyz_skew()::__c>:
    6770:	25 33 2e 32 66 81 00                                %3.2f..

00006777 <lcd_menu_xyz_skew()::__c>:
    6777:	25 2d 31 34 2e 31 34 53 3a 0a 25 53 0a 25 2d 31     %-14.14S:.%S.%-1
    6787:	34 2e 31 34 53 3a 25 33 2e 32 66 81 0a 25 2d 31     4.14S:%3.2f..%-1
    6797:	34 2e 31 34 53 3a 25 33 2e 32 66 81 00              4.14S:%3.2f..

000067a4 <lcd_print_state(unsigned char)::__c>:
    67a4:	20 20 30 00                                           0.

000067a8 <lcd_print_state(unsigned char)::__c>:
    67a8:	20 20 31 00                                           1.

000067ac <lcd_show_sensors_state()::__c>:
    67ac:	42 3a 20 25 33 64 20 20 20 20 20 58 64 3a 25 36     B: %3d     Xd:%6
    67bc:	64 0a 53 3a 20 25 33 64 20 20 20 20 20 59 64 3a     d.S: %3d     Yd:
    67cc:	25 36 64 00                                         %6d.

000067d0 <lcd_show_sensors_state()::__c>:
    67d0:	46 49 4e 44 41 00                                   FINDA.

000067d6 <MSG_PINDA>:
    67d6:	50 49 4e 44 41 00                                   PINDA.

000067dc <lcd_wizard(WizState)::__c>:
    67dc:	57 69 7a 61 72 64 20 65 6e 64 20 73 74 61 74 65     Wizard end state
    67ec:	3a 20 25 64 0a 00                                   : %d..

000067f2 <MSG_SPOOL_JOIN>:
    67f2:	53 70 6f 6f 6c 4a 6f 69 6e 00                       SpoolJoin.

000067fc <MSG_FIRMWARE>:
    67fc:	46 69 72 6d 77 61 72 65 00                          Firmware.

00006805 <lcd_hw_setup_menu()::__c>:
    6805:	53 75 70 65 72 50 49 4e 44 41 00                    SuperPINDA.

00006810 <lcd_settings_menu()::__c>:
    6810:	48 42 65 64 20 6f 6e 20 6c 6f 61 64 00              HBed on load.

0000681d <MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY>:
    681d:	46 6c 61 73 68 41 69 72 00                          FlashAir.

00006826 <MSG_FANCHECK_HOTEND>:
    6826:	45 72 72 3a 48 4f 54 45 4e 44 20 46 41 4e 20 45     Err:HOTEND FAN E
    6836:	52 52 4f 52 00                                      RROR.

0000683b <MSG_HOST_ACTION_RESUMED>:
    683b:	2f 2f 61 63 74 69 6f 6e 3a 72 65 73 75 6d 65 64     //action:resumed
	...

0000684c <MSG_HOST_ACTION_ASK_RESUME>:
    684c:	2f 2f 61 63 74 69 6f 6e 3a 72 65 73 75 6d 65 00     //action:resume.

0000685c <MSG_HOST_ACTION_READY>:
    685c:	2f 2f 61 63 74 69 6f 6e 3a 72 65 61 64 79 00        //action:ready.

0000686b <MSG_HOST_ACTION_NOT_READY>:
    686b:	2f 2f 61 63 74 69 6f 6e 3a 6e 6f 74 5f 72 65 61     //action:not_rea
    687b:	64 79 00                                            dy.

0000687e <MSG_HOST_ACTION_CANCEL>:
    687e:	2f 2f 61 63 74 69 6f 6e 3a 63 61 6e 63 65 6c 00     //action:cancel.

0000688e <MSG_M84>:
    688e:	4d 38 34 00                                         M84.

00006892 <MSG_OK_CAPS>:
    6892:	4f 4b 00                                            OK.

00006895 <MSG_LCD_STATUS_CHANGED>:
    6895:	4c 43 44 20 73 74 61 74 75 73 20 63 68 61 6e 67     LCD status chang
    68a5:	65 64 00                                            ed.

000068a8 <_ZZN10CardReader7releaseEvE3__c.lto_priv.495>:
    68a8:	53 44 20 63 61 72 64 20 72 65 6c 65 61 73 65 64     SD card released
	...

000068b9 <MSG_HOST_ACTION_START>:
    68b9:	2f 2f 61 63 74 69 6f 6e 3a 73 74 61 72 74 00        //action:start.

000068c8 <MSG_G91>:
    68c8:	47 39 31 00                                         G91.

000068cc <MSG_M702>:
    68cc:	4d 37 30 32 00                                      M702.

000068d1 <G28W>:
    68d1:	47 32 38 20 57 00                                   G28 W.

000068d7 <MSG_M500>:
    68d7:	4d 35 30 30 00                                      M500.

000068dc <fw_crash_init()::__c>:
    68dc:	42 61 64 20 69 6e 74 65 72 72 75 70 74 00           Bad interrupt.

000068ea <fw_crash_init()::__c>:
    68ea:	57 61 74 63 68 64 6f 67 20 74 69 6d 65 6f 75 74     Watchdog timeout
	...

000068fb <fw_crash_init()::__c>:
    68fb:	53 74 61 74 69 63 20 6d 65 6d 6f 72 79 20 68 61     Static memory ha
    690b:	73 0a 62 65 65 6e 20 6f 76 65 72 77 72 69 74 74     s.been overwritt
    691b:	65 6e 00                                            en.

0000691e <fw_crash_init()::__c>:
    691e:	46 49 52 4d 57 41 52 45 20 43 52 41 53 48 21 0a     FIRMWARE CRASH!.
    692e:	43 72 61 73 68 20 72 65 61 73 6f 6e 3a 0a 00        Crash reason:..

0000693d <setup::__c>:
    693d:	20 20 50 6c 61 6e 6e 65 72 42 75 66 66 65 72 42       PlannerBufferB
    694d:	79 74 65 73 3a 20 00                                ytes: .

00006954 <setup::__c>:
    6954:	20 46 72 65 65 20 4d 65 6d 6f 72 79 3a 20 00         Free Memory: .

00006963 <setup::__c>:
    6963:	20 7c 20 41 75 74 68 6f 72 3a 20 00                  | Author: .

0000696f <setup::__c>:
    696f:	20 4c 61 73 74 20 55 70 64 61 74 65 64 3a 20 00      Last Updated: .

0000697f <MSG_SOFTWARE_RESET>:
    697f:	20 53 6f 66 74 77 61 72 65 20 52 65 73 65 74 00      Software Reset.

0000698f <MSG_WATCHDOG_RESET>:
    698f:	20 57 61 74 63 68 64 6f 67 20 52 65 73 65 74 00      Watchdog Reset.

0000699f <MSG_BROWNOUT_RESET>:
    699f:	20 42 72 6f 77 6e 20 6f 75 74 20 52 65 73 65 74      Brown out Reset
	...

000069b0 <MSG_EXTERNAL_RESET>:
    69b0:	20 45 78 74 65 72 6e 61 6c 20 52 65 73 65 74 00      External Reset.

000069c0 <MSG_POWERUP>:
    69c0:	50 6f 77 65 72 55 70 00                             PowerUp.

000069c8 <MSG_SD_ERR_WRITE_TO_FILE>:
    69c8:	65 72 72 6f 72 20 77 72 69 74 69 6e 67 20 74 6f     error writing to
    69d8:	20 66 69 6c 65 00                                    file.

000069de <MSG_FILE_SAVED>:
    69de:	44 6f 6e 65 20 73 61 76 69 6e 67 20 66 69 6c 65     Done saving file
    69ee:	2e 00                                               ..

000069f0 <MSG_OK>:
    69f0:	6f 6b 00                                            ok.

000069f3 <MSG_FILAMENT>:
    69f3:	46 69 6c 61 6d 65 6e 74 00                          Filament.

000069fc <MMU2::MSG_BTN_MORE>:
    69fc:	88 00                                               ..

000069fe <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)::__c>:
    69fe:	20 74 6f 6f 20 6c 6f 6e 67 20 65 78 74 72 75 73      too long extrus
    6a0e:	69 6f 6e 20 70 72 65 76 65 6e 74 65 64 00           ion prevented.

00006a1c <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)::__c>:
    6a1c:	20 63 6f 6c 64 20 65 78 74 72 75 73 69 6f 6e 20      cold extrusion 
    6a2c:	70 72 65 76 65 6e 74 65 64 00                       prevented.

00006a36 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)::__c>:
    6a36:	4d 6f 76 65 20 61 62 6f 72 74 65 64 00              Move aborted.

00006a43 <MSG_FANCHECK_PRINT>:
    6a43:	45 72 72 3a 50 52 49 4e 54 20 46 41 4e 20 45 52     Err:PRINT FAN ER
    6a53:	52 4f 52 00                                         ROR.

00006a57 <lcdui_print_temp(char, int, int)::__c>:
    6a57:	25 63 25 33 64 2f 25 64 81 00                       %c%3d/%d..

00006a61 <lcdui_print_Z_coord()::__c>:
    6a61:	5a 25 36 2e 32 66 25 63 00                          Z%6.2f%c.

00006a6a <lcdui_print_Z_coord()::__c>:
    6a6a:	5a 20 20 20 2d 2d 2d 20 00                          Z   --- .

00006a73 <lcdui_print_feedrate()::__c>:
    6a73:	86 25 33 64 25 25 00                                .%3d%%.

00006a7a <lcdui_print_percent_done()::__c>:
    6a7a:	2d 2d 2d 25 25 00                                   ---%%.

00006a80 <lcdui_print_percent_done()::__c>:
    6a80:	25 33 64 25 25 00                                   %3d%%.

00006a86 <lcdui_print_percent_done()::__c>:
    6a86:	20 53 44 00                                          SD.

00006a8a <lcdui_print_percent_done()::__c>:
    6a8a:	20 20 20 00                                            .

00006a8e <lcdui_print_percent_done()::__c>:
    6a8e:	20 48 4f 00                                          HO.

00006a92 <lcdui_print_farm()::__c>:
    6a92:	20 46 52 4d 20 00                                    FRM .

00006a98 <lcdui_print_time()::__c>:
    6a98:	87 2d 2d 3a 2d 2d 20 20 00                          .--:--  .

00006aa1 <lcdui_print_time()::__c>:
    6aa1:	87 25 33 75 68 20 25 63 25 63 00                    .%3uh %c%c.

00006aac <lcdui_print_time()::__c>:
    6aac:	87 25 30 32 75 3a 25 30 32 75 25 63 25 63 00        .%02u:%02u%c%c.

00006abb <MSG_HOST_ACTION_PAUSED>:
    6abb:	2f 2f 61 63 74 69 6f 6e 3a 70 61 75 73 65 64 00     //action:paused.

00006acb <MSG_HOST_ACTION_ASK_PAUSE>:
    6acb:	2f 2f 61 63 74 69 6f 6e 3a 70 61 75 73 65 00        //action:pause.

00006ada <_ZZL16lcd_support_menuvE3__c__16_>:
    6ada:	44 75 6d 70 20 74 6f 20 73 65 72 69 61 6c 00        Dump to serial.

00006ae9 <lcd_support_menu()::__c>:
    6ae9:	68 65 6c 70 2e 70 72 75 73 61 33 64 2e 63 6f 6d     help.prusa3d.com
	...

00006afa <lcd_support_menu()::__c>:
    6afa:	66 6f 72 75 6d 2e 70 72 75 73 61 33 64 2e 63 6f     forum.prusa3d.co
    6b0a:	6d 00                                               m.

00006b0c <lcd_support_menu()::__c>:
    6b0c:	70 72 75 73 61 33 64 2e 63 6f 6d 00                 prusa3d.com.

00006b18 <MSG_M701>:
    6b18:	4d 37 30 31 00                                      M701.

00006b1d <lcd_menu_statistics()::__c>:
    6b1d:	25 53 3a 0a 25 31 38 2e 32 66 6d 20 0a 25 53 3a     %S:.%18.2fm .%S:
    6b2d:	0a 25 31 30 6c 64 64 20 25 30 32 64 68 20 25 30     .%10ldd %02dh %0
    6b3d:	32 64 6d 00                                         2dm.

00006b41 <lcd_menu_statistics()::__c>:
    6b41:	25 53 3a 0a 25 31 38 2e 32 66 6d 20 0a 25 53 3a     %S:.%18.2fm .%S:
    6b51:	0a 25 31 30 6c 64 68 20 25 30 32 64 6d 20 25 30     .%10ldh %02dm %0
    6b61:	32 64 73 00                                         2ds.

00006b65 <calculate_machine_skew_and_offset_LS(float const*, unsigned char, float const*, float*, float*, float*, signed char)::__c>:
    6b65:	4d 65 61 73 75 72 65 64 20 73 6b 65 77 73 3a 20     Measured skews: 
    6b75:	25 66 20 25 66 0a 00                                %f %f..

00006b7c <find_bed_offset_and_skew(signed char, unsigned char&)::__c>:
    6b7c:	46 69 74 74 69 6e 67 20 66 61 69 6c 65 64 20 3d     Fitting failed =
    6b8c:	3e 20 63 61 6c 69 62 72 61 74 69 6f 6e 20 66 61     > calibration fa
    6b9c:	69 6c 65 64 2e 0a 00                                iled...

00006ba3 <find_bed_offset_and_skew(signed char, unsigned char&)::__c>:
    6ba3:	43 61 6c 69 62 72 61 74 69 6f 6e 20 73 75 63 63     Calibration succ
    6bb3:	65 73 73 2e 0a 00                                   ess...

00006bb9 <find_bed_offset_and_skew(signed char, unsigned char&)::__c>:
    6bb9:	41 6c 6c 20 34 20 63 61 6c 69 62 72 61 74 69 6f     All 4 calibratio
    6bc9:	6e 20 70 6f 69 6e 74 73 20 66 6f 75 6e 64 2e 0a     n points found..
	...

00006bda <gcode_M45(bool, signed char)::__c>:
    6bda:	31 2f 34 00                                         1/4.

00006bde <gcode_M45(bool, signed char)::__c>:
    6bde:	31 2f 34 00                                         1/4.

00006be2 <gcode_M45(bool, signed char)::__c>:
    6be2:	31 2f 39 00                                         1/9.

00006be6 <MSG_WELCOME>:
    6be6:	50 72 75 73 61 20 69 33 20 4d 4b 32 2e 35 20 4f     Prusa i3 MK2.5 O
    6bf6:	4b 2e 00                                            K..

00006bf9 <CardReader::mount(bool)::__c>:
    6bf9:	53 44 20 63 61 72 64 20 6f 6b 00                    SD card ok.

00006c04 <CardReader::mount(bool)::__c>:
    6c04:	6f 70 65 6e 52 6f 6f 74 20 66 61 69 6c 65 64 00     openRoot failed.

00006c14 <CardReader::mount(bool)::__c>:
    6c14:	76 6f 6c 75 6d 65 2e 69 6e 69 74 20 66 61 69 6c     volume.init fail
    6c24:	65 64 00                                            ed.

00006c27 <CardReader::mount(bool)::__c>:
    6c27:	53 44 20 69 6e 69 74 20 66 61 69 6c 00              SD init fail.

00006c34 <MSG_SD_OPEN_FILE_FAIL>:
    6c34:	6f 70 65 6e 20 66 61 69 6c 65 64 2c 20 46 69 6c     open failed, Fil
    6c44:	65 3a 20 00                                         e: .

00006c48 <CardReader::chdir(char const*, bool)::__c>:
    6c48:	43 61 6e 6e 6f 74 20 65 6e 74 65 72 20 73 75 62     Cannot enter sub
    6c58:	64 69 72 3a 20 00                                   dir: .

00006c5e <MSG_M600>:
    6c5e:	4d 36 30 30 00                                      M600.

00006c63 <MSG_M24>:
    6c63:	4d 32 34 00                                         M24.

00006c67 <MSG_M23>:
    6c67:	4d 32 33 20 25 73 00                                M23 %s.

00006c6e <MSG_ERR_STOPPED>:
    6c6e:	50 72 69 6e 74 65 72 20 73 74 6f 70 70 65 64 20     Printer stopped 
    6c7e:	64 75 65 20 74 6f 20 65 72 72 6f 72 73 2e 20 53     due to errors. S
    6c8e:	75 70 65 72 76 69 73 69 6f 6e 20 72 65 71 75 69     upervision requi
    6c9e:	72 65 64 2e 00                                      red..

00006ca3 <G1_E_F2700>:
    6ca3:	47 31 20 45 25 2d 2e 33 66 20 46 32 37 30 30 00     G1 E%-.3f F2700.

00006cb3 <MSG_M83>:
    6cb3:	4d 38 33 00                                         M83.

00006cb7 <__noloc_end>:
    6cb7:	08 4a       	sbci	r16, 0xA8	; 168
    6cb9:	d7 3b       	cpi	r29, 0xB7	; 183
    6cbb:	3b ce       	rjmp	.-906    	; 0x6933 <fw_crash_init()::__c+0x15>
    6cbd:	01 6e       	ori	r16, 0xE1	; 225
    6cbf:	84 bc       	out	0x24, r8	; 36
    6cc1:	bf fd       	.word	0xfdbf	; ????
    6cc3:	c1 2f       	mov	r28, r17
    6cc5:	3d 6c       	ori	r19, 0xCD	; 205
    6cc7:	74 31       	cpi	r23, 0x14	; 20
    6cc9:	9a bd       	out	0x2a, r25	; 42
    6ccb:	56 83       	std	Z+6, r21	; 0x06
    6ccd:	3d da       	rcall	.-2950   	; 0x6149 <MSG_FIND_BED_OFFSET_AND_SKEW_LINE1+0x18>
    6ccf:	3d 00       	.word	0x003d	; ????
    6cd1:	c7 7f       	andi	r28, 0xF7	; 247
    6cd3:	11 be       	out	0x31, r1	; 49
    6cd5:	d9 e4       	ldi	r29, 0x49	; 73
    6cd7:	bb 4c       	sbci	r27, 0xCB	; 203
    6cd9:	3e 91       	ld	r19, -X
    6cdb:	6b aa       	std	Y+51, r6	; 0x33
    6cdd:	aa be       	out	0x3a, r10	; 58
    6cdf:	00 00       	nop
    6ce1:	00 80       	ld	r0, Z
    6ce3:	3f 05       	cpc	r19, r15
    6ce5:	a8 4c       	sbci	r26, 0xC8	; 200
    6ce7:	cd b2       	in	r12, 0x1d	; 29
    6ce9:	d4 4e       	sbci	r29, 0xE4	; 228
    6ceb:	b9 38       	cpi	r27, 0x89	; 137
    6ced:	36 a9       	ldd	r19, Z+54	; 0x36
    6cef:	02 0c       	add	r0, r2
    6cf1:	50 b9       	out	0x00, r21	; 0
    6cf3:	91 86       	std	Z+9, r9	; 0x09
    6cf5:	88 08       	sbc	r8, r8
    6cf7:	3c a6       	std	Y+44, r3	; 0x2c
    6cf9:	aa aa       	std	Y+50, r10	; 0x32
    6cfb:	2a be       	out	0x3a, r2	; 58
    6cfd:	00 00       	nop
    6cff:	00 80       	ld	r0, Z
    6d01:	3f 07       	cpc	r19, r31
    6d03:	63 42       	sbci	r22, 0x23	; 35
    6d05:	36 b7       	in	r19, 0x36	; 54
    6d07:	9b d8       	rcall	.-3786   	; 0x5e3f <MSG_BED_SKEW_OFFSET_DETECTION_PERFECT+0x3f>
    6d09:	a7 1a       	sub	r10, r23
    6d0b:	39 68       	ori	r19, 0x89	; 137
    6d0d:	56 18       	sub	r5, r6
    6d0f:	ae ba       	out	0x1e, r10	; 30
    6d11:	ab 55       	subi	r26, 0x5B	; 91
    6d13:	8c 1d       	adc	r24, r12
    6d15:	3c b7       	in	r19, 0x3c	; 60
    6d17:	cc 57       	subi	r28, 0x7C	; 124
    6d19:	63 bd       	out	0x23, r22	; 35
    6d1b:	6d ed       	ldi	r22, 0xDD	; 221
    6d1d:	fd 75       	andi	r31, 0x5D	; 93
    6d1f:	3e f6       	brtc	.-114    	; 0x6caf <G1_E_F2700+0xc>
    6d21:	17 72       	andi	r17, 0x27	; 39
    6d23:	31 bf       	out	0x31, r19	; 49
    6d25:	00 00       	nop
    6d27:	00 80       	ld	r0, Z
    6d29:	3f 08       	sbc	r3, r15
    6d2b:	00 00       	nop
    6d2d:	00 be       	out	0x30, r0	; 48
    6d2f:	92 24       	eor	r9, r2
    6d31:	49 12       	cpse	r4, r25
    6d33:	3e ab       	std	Y+54, r19	; 0x36
    6d35:	aa aa       	std	Y+50, r10	; 0x32
    6d37:	2a be       	out	0x3a, r2	; 58
    6d39:	cd cc       	rjmp	.-1638   	; 0x66d5 <_ZZ16process_commandsvE3__c__25_+0x2f>
    6d3b:	cc 4c       	sbci	r28, 0xCC	; 204
    6d3d:	3e 00       	.word	0x003e	; ????
    6d3f:	00 00       	nop
    6d41:	80 be       	out	0x30, r8	; 48
    6d43:	ab aa       	std	Y+51, r10	; 0x33
    6d45:	aa aa       	std	Y+50, r10	; 0x32
    6d47:	3e 00       	.word	0x003e	; ????
    6d49:	00 00       	nop
    6d4b:	00 bf       	out	0x30, r16	; 48
    6d4d:	00 00       	nop
    6d4f:	00 80       	ld	r0, Z
    6d51:	3f 00       	.word	0x003f	; ????
    6d53:	00 00       	nop
    6d55:	00 00       	nop
    6d57:	08 41       	sbci	r16, 0x18	; 24
    6d59:	78 d3       	rcall	.+1776   	; 0x744b <la10c_mode_change(LA10C_MODE)::__c>
    6d5b:	bb 43       	sbci	r27, 0x3B	; 59
    6d5d:	87 d1       	rcall	.+782    	; 0x706d <__trampolines_start+0x2e9>
    6d5f:	13 3d       	cpi	r17, 0xD3	; 211
    6d61:	19 0e       	add	r1, r25
    6d63:	3c c3       	rjmp	.+1656   	; 0x73dd <default_conf+0xb8>
    6d65:	bd 42       	sbci	r27, 0x2D	; 45
    6d67:	82 ad       	ldd	r24, Z+58	; 0x3a
    6d69:	2b 3e       	cpi	r18, 0xEB	; 235
    6d6b:	68 ec       	ldi	r22, 0xC8	; 200
    6d6d:	82 76       	andi	r24, 0x62	; 98
    6d6f:	be d9       	rcall	.-3204   	; 0x60ed <MSG_PAPER+0x54>
    6d71:	8f e1       	ldi	r24, 0x1F	; 31
    6d73:	a9 3e       	cpi	r26, 0xE9	; 233
    6d75:	4c 80       	ldd	r4, Y+4	; 0x04
    6d77:	ef ff       	.word	0xffef	; ????
    6d79:	be 01       	movw	r22, r28
    6d7b:	c4 ff       	sbrs	r28, 4
    6d7d:	7f 3f       	cpi	r23, 0xFF	; 255
    6d7f:	00 00       	nop
    6d81:	00 00       	nop
	...

00006d84 <__trampolines_start>:
    6d84:	0d 94 1a 05 	jmp	0x20a34	; 0x20a34 <lcd_cutter_enabled() [clone .lto_priv.398]>
    6d88:	0c 94 cf cf 	jmp	0x19f9e	; 0x19f9e <lcd_mmuEjectFilament()>
    6d8c:	0c 94 99 d8 	jmp	0x1b132	; 0x1b132 <lcd_first_layer_calibration_reset()>
    6d90:	0c 94 6c fe 	jmp	0x1fcd8	; 0x1fcd8 <lcd_mmu_load_to_nozzle_wrapper(unsigned char)>
    6d94:	0c 94 a6 d3 	jmp	0x1a74c	; 0x1a74c <analogWrite+0x70>
    6d98:	0c 94 9d c3 	jmp	0x1873a	; 0x1873a <lcd_move_menu_axis()>
    6d9c:	0c 94 d1 d3 	jmp	0x1a7a2	; 0x1a7a2 <analogWrite+0xc6>
    6da0:	0c 94 4b 77 	jmp	0xee96	; 0xee96 <__vector_23+0xd0>
    6da4:	0c 94 50 ec 	jmp	0x1d8a0	; 0x1d8a0 <lcd_wizard(WizState)+0x11a>
    6da8:	0d 94 db 04 	jmp	0x209b6	; 0x209b6 <lcd_menu_fails_stats_mmu() [clone .lto_priv.396]>
    6dac:	0c 94 56 d9 	jmp	0x1b2ac	; 0x1b2ac <activate_calibrate_sheet()>
    6db0:	0c 94 37 c8 	jmp	0x1906e	; 0x1906e <lcd_pinda_temp_compensation_toggle()>
    6db4:	0c 94 41 bf 	jmp	0x17e82	; 0x17e82 <lcd_check_version_set()>
    6db8:	0c 94 eb fe 	jmp	0x1fdd6	; 0x1fdd6 <loading_test_all_wrapper()>
    6dbc:	0c 94 5f bf 	jmp	0x17ebe	; 0x17ebe <lcd_fsensor_actionNA_set()>
    6dc0:	0c 94 1f bd 	jmp	0x17a3e	; 0x17a3e <turnOffPWM+0x66>
    6dc4:	0d 94 46 05 	jmp	0x20a8c	; 0x20a8c <lcd_support_menu() [clone .lto_priv.389]>
    6dc8:	0c 94 94 bf 	jmp	0x17f28	; 0x17f28 <lcd_sound_state_set()>
    6dcc:	0d 94 ee 0c 	jmp	0x219dc	; 0x219dc <mFilamentPrompt()>
    6dd0:	0c 94 18 d4 	jmp	0x1a830	; 0x1a830 <analogWrite+0x154>
    6dd4:	0c 94 5f d0 	jmp	0x1a0be	; 0x1a0be <mmu_fil_eject_menu() [clone .lto_priv.415]>
    6dd8:	0d 94 b9 26 	jmp	0x24d72	; 0x24d72 <mFilamentItem(unsigned int, unsigned int)+0x152>
    6ddc:	0c 94 32 c0 	jmp	0x18064	; 0x18064 <mmu_enable_switch()>
    6de0:	0c 94 6a fa 	jmp	0x1f4d4	; 0x1f4d4 <lcd_commands() [clone .part.42]+0x8ca>
    6de4:	0d 94 9b 0f 	jmp	0x21f36	; 0x21f36 <lcdui_print_status_line()+0x1a0>
    6de8:	0c 94 da ec 	jmp	0x1d9b4	; 0x1d9b4 <lcd_wizard(WizState)+0x22e>
    6dec:	0d 94 4b 07 	jmp	0x20e96	; 0x20e96 <lcd_menu_fails_stats_mmu_total()>
    6df0:	0c 94 33 bd 	jmp	0x17a66	; 0x17a66 <turnOffPWM+0x8e>
    6df4:	0c 94 89 bf 	jmp	0x17f12	; 0x17f12 <lcd_temp_calibration_set()>
    6df8:	0c 94 1c 77 	jmp	0xee38	; 0xee38 <__vector_23+0x72>
    6dfc:	0c 94 57 bd 	jmp	0x17aae	; 0x17aae <xyzcal_calc_delay(unsigned int, unsigned int)>
    6e00:	0c 94 4c eb 	jmp	0x1d698	; 0x1d698 <nozzle_change()>
    6e04:	0c 94 eb d3 	jmp	0x1a7d6	; 0x1a7d6 <analogWrite+0xfa>
    6e08:	0c 94 e1 cf 	jmp	0x19fc2	; 0x19fc2 <mmu_loading_test_menu() [clone .lto_priv.414]>
    6e0c:	0d 94 ab 96 	jmp	0x32d56	; 0x32d56 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x5a>
    6e10:	0c 94 54 77 	jmp	0xeea8	; 0xeea8 <__vector_23+0xe2>
    6e14:	0c 94 25 db 	jmp	0x1b64a	; 0x1b64a <lcd_selftest_error(TestError, char const*, char const*)+0x194>
    6e18:	0c 94 4a bd 	jmp	0x17a94	; 0x17a94 <turnOffPWM+0xbc>
    6e1c:	0c 94 25 c2 	jmp	0x1844a	; 0x1844a <lcd_sdcard_stop()>
    6e20:	0c 94 eb ec 	jmp	0x1d9d6	; 0x1d9d6 <lcd_wizard(WizState)+0x250>
    6e24:	0c 94 6f d0 	jmp	0x1a0de	; 0x1a0de <mmu_cut_filament_wrapper(unsigned char)>
    6e28:	0c 94 fc f9 	jmp	0x1f3f8	; 0x1f3f8 <lcd_commands() [clone .part.42]+0x7ee>
    6e2c:	0c 94 40 d4 	jmp	0x1a880	; 0x1a880 <analogWrite+0x1a4>
    6e30:	0c 94 99 c3 	jmp	0x18732	; 0x18732 <void select_sheet_menu<(unsigned char)0>()>
    6e34:	0d 94 6e 27 	jmp	0x24edc	; 0x24edc <mFilamentItem_PLA()>
    6e38:	0c 94 42 df 	jmp	0x1be84	; 0x1be84 <lcd_print_stop()>
    6e3c:	0c 94 7b d0 	jmp	0x1a0f6	; 0x1a0f6 <mmu_eject_filament(unsigned char)>
    6e40:	0d 94 77 33 	jmp	0x266ee	; 0x266ee <lcd_status_screen()>
    6e44:	0d 94 05 9d 	jmp	0x33a0a	; 0x33a0a <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]+0xb6>
    6e48:	0c 94 59 c8 	jmp	0x190b2	; 0x190b2 <lcd_move_x()>
    6e4c:	0c 94 95 d0 	jmp	0x1a12a	; 0x1a12a <load_filament_wrapper(unsigned char)>
    6e50:	0c 94 69 f7 	jmp	0x1eed2	; 0x1eed2 <lcd_commands() [clone .part.42]+0x2c8>
    6e54:	0c 94 03 ed 	jmp	0x1da06	; 0x1da06 <lcd_wizard(WizState)+0x280>
    6e58:	0c 94 27 77 	jmp	0xee4e	; 0xee4e <__vector_23+0x88>
    6e5c:	0c 94 b3 d3 	jmp	0x1a766	; 0x1a766 <analogWrite+0x8a>
    6e60:	0d 94 9f 17 	jmp	0x22f3e	; 0x22f3e <lcd_menu_statistics()>
    6e64:	0d 94 e4 0f 	jmp	0x21fc8	; 0x21fc8 <lcdui_print_status_line()+0x232>
    6e68:	0c 94 25 bd 	jmp	0x17a4a	; 0x17a4a <turnOffPWM+0x72>
    6e6c:	0c 94 20 bf 	jmp	0x17e40	; 0x17e40 <mbl_mesh_toggle()>
    6e70:	0d 94 8c 04 	jmp	0x20918	; 0x20918 <lcd_menu_fails_stats_mmu_print()>
    6e74:	0c 94 ee d0 	jmp	0x1a1dc	; 0x1a1dc <lcd_menu_xyz_offset()>
    6e78:	0c 94 19 db 	jmp	0x1b632	; 0x1b632 <lcd_selftest_error(TestError, char const*, char const*)+0x17c>
    6e7c:	0c 94 62 c8 	jmp	0x190c4	; 0x190c4 <lcd_move_y()>
    6e80:	0c 94 0e d4 	jmp	0x1a81c	; 0x1a81c <analogWrite+0x140>
    6e84:	0d 94 76 27 	jmp	0x24eec	; 0x24eec <mFilamentItem_PET()>
    6e88:	0c 94 80 c3 	jmp	0x18700	; 0x18700 <void select_sheet_menu<(unsigned char)5>()>
    6e8c:	0d 94 88 0f 	jmp	0x21f10	; 0x21f10 <lcdui_print_status_line()+0x17a>
    6e90:	0d 94 21 9d 	jmp	0x33a42	; 0x33a42 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]+0xee>
    6e94:	0c 94 2c d4 	jmp	0x1a858	; 0x1a858 <analogWrite+0x17c>
    6e98:	0c 94 33 d1 	jmp	0x1a266	; 0x1a266 <lcd_menu_xyz_skew()>
    6e9c:	0c 94 c3 be 	jmp	0x17d86	; 0x17d86 <lcd_printer_ready_state_toggle()>
    6ea0:	0c 94 2e db 	jmp	0x1b65c	; 0x1b65c <lcd_selftest_error(TestError, char const*, char const*)+0x1a6>
    6ea4:	0c 94 8a c3 	jmp	0x18714	; 0x18714 <void select_sheet_menu<(unsigned char)3>()>
    6ea8:	0c 94 92 cf 	jmp	0x19f24	; 0x19f24 <mmu_preload_filament_menu()>
    6eac:	0c 94 6b 73 	jmp	0xe6d6	; 0xe6d6 <lcd_putchar(char, __file*) [clone .lto_priv.388]>
    6eb0:	0d 94 9e 27 	jmp	0x24f3c	; 0x24f3c <mFilamentItem_ABS()>
    6eb4:	0c 94 07 c2 	jmp	0x1840e	; 0x1840e <lcd_experimental_menu()>
    6eb8:	0d 94 b2 26 	jmp	0x24d64	; 0x24d64 <mFilamentItem(unsigned int, unsigned int)+0x144>
    6ebc:	0d 94 f5 26 	jmp	0x24dea	; 0x24dea <mFilamentItem(unsigned int, unsigned int)+0x1ca>
    6ec0:	0c 94 73 c4 	jmp	0x188e6	; 0x188e6 <lcd_mesh_calibration()>
    6ec4:	0d 94 72 26 	jmp	0x24ce4	; 0x24ce4 <mFilamentItem(unsigned int, unsigned int)+0xc4>
    6ec8:	0c 94 94 c3 	jmp	0x18728	; 0x18728 <void select_sheet_menu<(unsigned char)1>()>
    6ecc:	0c 94 7a c4 	jmp	0x188f4	; 0x188f4 <lcd_mesh_calibration_z()>
    6ed0:	0d 94 a6 27 	jmp	0x24f4c	; 0x24f4c <mFilamentItem_HIPS()>
    6ed4:	0c 94 f5 ec 	jmp	0x1d9ea	; 0x1d9ea <lcd_wizard(WizState)+0x264>
    6ed8:	0d 94 ae 27 	jmp	0x24f5c	; 0x24f5c <mFilamentItem_PP()>
    6edc:	0c 94 d9 d3 	jmp	0x1a7b2	; 0x1a7b2 <analogWrite+0xd6>
    6ee0:	0c 94 5c bd 	jmp	0x17ab8	; 0x17ab8 <xyzcal_update_pos(unsigned int, unsigned int, unsigned int, unsigned int)>
    6ee4:	0c 94 c8 ce 	jmp	0x19d90	; 0x19d90 <lcd_move_e()>
    6ee8:	0d 94 d9 0b 	jmp	0x217b2	; 0x217b2 <lcd_generic_preheat_menu()>
    6eec:	0d 94 96 0c 	jmp	0x2192c	; 0x2192c <lcd_preheat_menu() [clone .lto_priv.390]>
    6ef0:	0c 94 f5 d3 	jmp	0x1a7ea	; 0x1a7ea <analogWrite+0x10e>
    6ef4:	0c 94 0a bd 	jmp	0x17a14	; 0x17a14 <turnOffPWM+0x3c>
    6ef8:	0d 94 24 27 	jmp	0x24e48	; 0x24e48 <mFilamentItem(unsigned int, unsigned int)+0x228>
    6efc:	0c 94 50 c8 	jmp	0x190a0	; 0x190a0 <lcd_move_z()>
    6f00:	0c 94 2f bd 	jmp	0x17a5e	; 0x17a5e <turnOffPWM+0x86>
    6f04:	0c 94 d5 cf 	jmp	0x19faa	; 0x19faa <lcd_mmuLoadingTest()>
    6f08:	0c 94 4b bd 	jmp	0x17a96	; 0x17a96 <turnOffPWM+0xbe>
    6f0c:	0d 94 26 97 	jmp	0x32e4c	; 0x32e4c <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x150>
    6f10:	0c 94 37 bf 	jmp	0x17e6e	; 0x17e6e <lcd_check_filament_set()>
    6f14:	0d 94 86 27 	jmp	0x24f0c	; 0x24f0c <mFilamentItem_PC()>
    6f18:	0c 94 d8 cf 	jmp	0x19fb0	; 0x19fb0 <change_sheet()>
    6f1c:	0c 94 55 bf 	jmp	0x17eaa	; 0x17eaa <lcd_check_mode_set()>
    6f20:	0c 94 d4 c7 	jmp	0x18fa8	; 0x18fa8 <lcd_reprint_from_eeprom()>
    6f24:	0d 94 2a 97 	jmp	0x32e54	; 0x32e54 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x158>
    6f28:	0c 94 db c3 	jmp	0x187b6	; 0x187b6 <lcd_checking_menu()>
    6f2c:	0c 94 88 c4 	jmp	0x18910	; 0x18910 <lcd_calibrate_pinda()>
    6f30:	0c 94 28 db 	jmp	0x1b650	; 0x1b650 <lcd_selftest_error(TestError, char const*, char const*)+0x19a>
    6f34:	0c 94 20 ed 	jmp	0x1da40	; 0x1da40 <lcd_wizard(WizState)+0x2ba>
    6f38:	0c 94 10 f9 	jmp	0x1f220	; 0x1f220 <lcd_commands() [clone .part.42]+0x616>
    6f3c:	0c 94 03 ea 	jmp	0x1d406	; 0x1d406 <lcd_mesh_bed_leveling_settings()>
    6f40:	0c 94 86 ec 	jmp	0x1d90c	; 0x1d90c <lcd_wizard(WizState)+0x186>
    6f44:	0c 94 89 77 	jmp	0xef12	; 0xef12 <__vector_23+0x14c>
    6f48:	0d 94 ef 03 	jmp	0x207de	; 0x207de <lcd_menu_extruder_info()>
    6f4c:	0d 94 26 05 	jmp	0x20a4c	; 0x20a4c <lcd_set_fan_check() [clone .lto_priv.397]>
    6f50:	0c 94 87 c0 	jmp	0x1810e	; 0x1810e <pid_extruder()>
    6f54:	0c 94 68 d7 	jmp	0x1aed0	; 0x1aed0 <lcd_babystep_z()>
    6f58:	0c 94 ff d3 	jmp	0x1a7fe	; 0x1a7fe <analogWrite+0x122>
    6f5c:	0c 94 c1 fb 	jmp	0x1f782	; 0x1f782 <lcd_wizard()>
    6f60:	0c 94 7b c3 	jmp	0x186f6	; 0x186f6 <void select_sheet_menu<(unsigned char)6>()>
    6f64:	0c 94 7c e3 	jmp	0x1c6f8	; 0x1c6f8 <lcd_selftest_v()>
    6f68:	0c 94 05 bf 	jmp	0x17e0a	; 0x17e0a <lcd_heat_bed_on_load_toggle()>
    6f6c:	0d 94 23 97 	jmp	0x32e46	; 0x32e46 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x14a>
    6f70:	0c 94 c0 ec 	jmp	0x1d980	; 0x1d980 <lcd_wizard(WizState)+0x1fa>
    6f74:	0c 94 70 ec 	jmp	0x1d8e0	; 0x1d8e0 <lcd_wizard(WizState)+0x15a>
    6f78:	0c 94 8f c4 	jmp	0x1891e	; 0x1891e <lcd_menu_show_sensors_state()>
    6f7c:	0d 94 7e 27 	jmp	0x24efc	; 0x24efc <mFilamentItem_ASA()>
    6f80:	0c 94 e1 d3 	jmp	0x1a7c2	; 0x1a7c2 <analogWrite+0xe6>
    6f84:	0c 94 3d bd 	jmp	0x17a7a	; 0x17a7a <turnOffPWM+0xa2>
    6f88:	0d 94 28 9d 	jmp	0x33a50	; 0x33a50 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]+0xfc>
    6f8c:	0c 94 97 d0 	jmp	0x1a12e	; 0x1a12e <lcd_settings_menu()::{lambda()#1}::_FUN()>
    6f90:	0c 94 29 bd 	jmp	0x17a52	; 0x17a52 <turnOffPWM+0x7a>
    6f94:	0c 94 81 c4 	jmp	0x18902	; 0x18902 <lcd_mesh_bedleveling()>
    6f98:	0d 94 96 27 	jmp	0x24f2c	; 0x24f2c <mFilamentItem_PA()>
    6f9c:	0d 94 43 05 	jmp	0x20a86	; 0x20a86 <lcd_serial_dump()>
    6fa0:	0d 94 bc 26 	jmp	0x24d78	; 0x24d78 <mFilamentItem(unsigned int, unsigned int)+0x158>
    6fa4:	0d 94 44 10 	jmp	0x22088	; 0x22088 <lcdui_print_status_line()+0x2f2>
    6fa8:	0c 94 e5 cc 	jmp	0x199ca	; 0x199ca <lcd_settings_menu()>
    6fac:	0c 94 35 77 	jmp	0xee6a	; 0xee6a <__vector_23+0xa4>
    6fb0:	0c 94 d2 cf 	jmp	0x19fa4	; 0x19fa4 <lcd_mmuCutFilament()>
    6fb4:	0c 94 d3 da 	jmp	0x1b5a6	; 0x1b5a6 <lcd_selftest_error(TestError, char const*, char const*)+0xf0>
    6fb8:	0c 94 9a d0 	jmp	0x1a134	; 0x1a134 <sheets_menu()>
    6fbc:	0c 94 a5 de 	jmp	0x1bd4a	; 0x1bd4a <lcd_colorprint_change()>
    6fc0:	0c 94 2c bf 	jmp	0x17e58	; 0x17e58 <mbl_magnets_elimination_toggle()>
    6fc4:	0d 94 d5 07 	jmp	0x20faa	; 0x20faa <lcd_return_to_status()>
    6fc8:	0c 94 75 bf 	jmp	0x17eea	; 0x17eea <lcd_fsensor_runout_set()>
    6fcc:	0d 94 5e 27 	jmp	0x24ebc	; 0x24ebc <mFilamentItem_farm()>
    6fd0:	0d 94 35 04 	jmp	0x2086a	; 0x2086a <lcd_menu_temperatures()>
    6fd4:	0d 94 8a 26 	jmp	0x24d14	; 0x24d14 <mFilamentItem(unsigned int, unsigned int)+0xf4>
    6fd8:	0c 94 5d cf 	jmp	0x19eba	; 0x19eba <lcd_sd_refresh()>
    6fdc:	0d 94 af 26 	jmp	0x24d5e	; 0x24d5e <mFilamentItem(unsigned int, unsigned int)+0x13e>
    6fe0:	0c 94 45 bd 	jmp	0x17a8a	; 0x17a8a <turnOffPWM+0xb2>
    6fe4:	0c 94 ae d3 	jmp	0x1a75c	; 0x1a75c <analogWrite+0x80>
    6fe8:	0d 94 b2 07 	jmp	0x20f64	; 0x20f64 <lcd_menu_toolchange_stats_mmu_total()>
    6fec:	0c 94 bf 7a 	jmp	0xf57e	; 0xf57e <uart_putchar(char, __file*)>
    6ff0:	0c 94 c7 d3 	jmp	0x1a78e	; 0x1a78e <analogWrite+0xb2>
    6ff4:	0c 94 fa c8 	jmp	0x191f4	; 0x191f4 <lcd_main_menu() [clone .lto_priv.420]>
    6ff8:	0d 94 c4 96 	jmp	0x32d88	; 0x32d88 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x8c>
    6ffc:	0c 94 76 c3 	jmp	0x186ec	; 0x186ec <void select_sheet_menu<(unsigned char)7>()>
    7000:	0d 94 5b 27 	jmp	0x24eb6	; 0x24eb6 <lcd_unLoadFilament() [clone .lto_priv.393]>
    7004:	0c 94 af da 	jmp	0x1b55e	; 0x1b55e <lcd_selftest_error(TestError, char const*, char const*)+0xa8>
    7008:	0c 94 a3 f8 	jmp	0x1f146	; 0x1f146 <lcd_commands() [clone .part.42]+0x53c>
    700c:	0c 94 18 bd 	jmp	0x17a30	; 0x17a30 <turnOffPWM+0x58>
    7010:	0d 94 27 27 	jmp	0x24e4e	; 0x24e4e <mFilamentItem(unsigned int, unsigned int)+0x22e>
    7014:	0d 94 75 04 	jmp	0x208ea	; 0x208ea <lcd_menu_AutoLoadFilament() [clone .lto_priv.394]>
    7018:	0c 94 3a db 	jmp	0x1b674	; 0x1b674 <lcd_selftest_error(TestError, char const*, char const*)+0x1be>
    701c:	0c 94 64 c0 	jmp	0x180c8	; 0x180c8 <lcd_fsensor_enabled_set()>
    7020:	0c 94 46 db 	jmp	0x1b68c	; 0x1b68c <lcd_selftest_error(TestError, char const*, char const*)+0x1d6>
    7024:	0c 94 5b c1 	jmp	0x182b6	; 0x182b6 <lcd_hw_setup_menu()>
    7028:	0c 94 ce be 	jmp	0x17d9c	; 0x17d9c <fsensor_reinit()>
    702c:	0c 94 77 77 	jmp	0xeeee	; 0xeeee <__vector_23+0x128>
    7030:	0c 94 41 bd 	jmp	0x17a82	; 0x17a82 <turnOffPWM+0xaa>
    7034:	0d 94 31 9d 	jmp	0x33a62	; 0x33a62 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]+0x10e>
    7038:	0c 94 62 c2 	jmp	0x184c4	; 0x184c4 <lcd_fsensor_settings_menu()>
    703c:	0d 94 36 9d 	jmp	0x33a6c	; 0x33a6c <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]+0x118>
    7040:	0d 94 06 97 	jmp	0x32e0c	; 0x32e0c <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x110>
    7044:	0c 94 67 cf 	jmp	0x19ece	; 0x19ece <lcd_sd_updir()>
    7048:	0c 94 16 e9 	jmp	0x1d22c	; 0x1d22c <lcd_language_menu()>
    704c:	0c 94 cc cf 	jmp	0x19f98	; 0x19f98 <lcd_mmuUnloadFilament()>
    7050:	0c 94 0c c6 	jmp	0x18c18	; 0x18c18 <lcd_rename_sheet_menu()>
    7054:	0c 94 c9 cf 	jmp	0x19f92	; 0x19f92 <lcd_mmuLoadFilament()>
    7058:	0d 94 38 0b 	jmp	0x21670	; 0x21670 <MMU2::tuneIdlerStallguardThresholdMenu()>
    705c:	0c 94 b9 de 	jmp	0x1bd72	; 0x1bd72 <lcd_resume_print()>
    7060:	0d 94 55 27 	jmp	0x24eaa	; 0x24eaa <lcd_AutoLoadFilament()>
    7064:	0d 94 58 27 	jmp	0x24eb0	; 0x24eb0 <lcd_LoadFilament() [clone .lto_priv.392]>
    7068:	0c 94 7c ec 	jmp	0x1d8f8	; 0x1d8f8 <lcd_wizard(WizState)+0x172>
    706c:	0c 94 6e cb 	jmp	0x196dc	; 0x196dc <lcd_adjust_bed()>
    7070:	0c 94 3b ff 	jmp	0x1fe76	; 0x1fe76 <uart2_getchar(__file*) [clone .lto_priv.365]>
    7074:	0c 94 80 e9 	jmp	0x1d300	; 0x1d300 <lcd_disable_farm_mode()>
    7078:	0c 94 7f bf 	jmp	0x17efe	; 0x17efe <lcd_toshiba_flash_air_compatibility_toggle()>
    707c:	0c 94 8f c3 	jmp	0x1871e	; 0x1871e <void select_sheet_menu<(unsigned char)2>()>
    7080:	0c 94 6d df 	jmp	0x1beda	; 0x1beda <menu_show_end_stops()>
    7084:	0c 94 aa 78 	jmp	0xf154	; 0xf154 <eeprom_switch_to_next_sheet()>
    7088:	0c 94 0c ed 	jmp	0x1da18	; 0x1da18 <lcd_wizard(WizState)+0x292>
    708c:	0c 94 86 d0 	jmp	0x1a10c	; 0x1a10c <load_all_wrapper()>
    7090:	0c 94 d6 fe 	jmp	0x1fdac	; 0x1fdac <loading_test_wrapper(unsigned char)>
    7094:	0c 94 41 ce 	jmp	0x19c82	; 0x19c82 <lcd_calibration_menu()>
    7098:	0c 94 a0 e5 	jmp	0x1cb40	; 0x1cb40 <lcd_sdcard_menu()>
    709c:	0c 94 1c bd 	jmp	0x17a38	; 0x17a38 <turnOffPWM+0x60>
    70a0:	0c 94 63 f7 	jmp	0x1eec6	; 0x1eec6 <lcd_commands() [clone .part.42]+0x2bc>
    70a4:	0c 94 4e cb 	jmp	0x1969c	; 0x1969c <lcd_control_temperature_menu()>
    70a8:	0d 94 21 27 	jmp	0x24e42	; 0x24e42 <mFilamentItem(unsigned int, unsigned int)+0x222>
    70ac:	0c 94 11 bf 	jmp	0x17e22	; 0x17e22 <mbl_probe_nr_toggle()>
    70b0:	0c 94 14 f9 	jmp	0x1f228	; 0x1f228 <lcd_commands() [clone .part.42]+0x61e>
    70b4:	0d 94 17 10 	jmp	0x2202e	; 0x2202e <lcdui_print_status_line()+0x298>
    70b8:	0c 94 49 c4 	jmp	0x18892	; 0x18892 <lcd_language()>
    70bc:	0c 94 85 c3 	jmp	0x1870a	; 0x1870a <void select_sheet_menu<(unsigned char)4>()>
    70c0:	0c 94 a5 f9 	jmp	0x1f34a	; 0x1f34a <lcd_commands() [clone .part.42]+0x740>
    70c4:	0c 94 57 d0 	jmp	0x1a0ae	; 0x1a0ae <mmu_cut_filament_menu() [clone .lto_priv.416]>
    70c8:	0c 94 4b bf 	jmp	0x17e96	; 0x17e96 <lcd_check_model_set()>
    70cc:	0c 94 22 d4 	jmp	0x1a844	; 0x1a844 <analogWrite+0x168>
    70d0:	0c 94 96 e9 	jmp	0x1d32c	; 0x1d32c <lcd_v2_calibration()>
    70d4:	0c 94 53 ff 	jmp	0x1fea6	; 0x1fea6 <uart2_putchar(char, __file*) [clone .lto_priv.364]>
    70d8:	0c 94 bb da 	jmp	0x1b576	; 0x1b576 <lcd_selftest_error(TestError, char const*, char const*)+0xc0>
    70dc:	0c 94 27 cc 	jmp	0x1984e	; 0x1984e <lcd_tune_menu()>
    70e0:	0c 94 6b bf 	jmp	0x17ed6	; 0x17ed6 <lcd_fsensor_autoload_set()>
    70e4:	0d 94 bf 9c 	jmp	0x3397e	; 0x3397e <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]+0x2a>
    70e8:	0c 94 2b db 	jmp	0x1b656	; 0x1b656 <lcd_selftest_error(TestError, char const*, char const*)+0x1a0>
    70ec:	0c 94 37 bd 	jmp	0x17a6e	; 0x17a6e <turnOffPWM+0x96>
    70f0:	0c 94 02 77 	jmp	0xee04	; 0xee04 <__vector_23+0x3e>
    70f4:	0c 94 92 c6 	jmp	0x18d24	; 0x18d24 <lcd_menu_xyz_y_min() [clone .lto_priv.418]>
    70f8:	0c 94 66 fa 	jmp	0x1f4cc	; 0x1f4cc <lcd_commands() [clone .part.42]+0x8c2>
    70fc:	0c 94 10 bd 	jmp	0x17a20	; 0x17a20 <turnOffPWM+0x48>
    7100:	0d 94 b6 27 	jmp	0x24f6c	; 0x24f6c <mFilamentItem_FLEX()>
    7104:	0c 94 4f bd 	jmp	0x17a9e	; 0x17a9e <turnOffPWM+0xc6>
    7108:	0c 94 bd d3 	jmp	0x1a77a	; 0x1a77a <analogWrite+0x9e>
    710c:	0d 94 29 64 	jmp	0x2c852	; 0x2c852 <global constructors keyed to 65535_0_adc.cpp.obj.13918>
    7110:	0c 94 bd be 	jmp	0x17d7a	; 0x17d7a <lcd_send_action_start()>
    7114:	0c 94 4e c0 	jmp	0x1809c	; 0x1809c <lcd_silent_mode_set()>
    7118:	0c 94 53 bd 	jmp	0x17aa6	; 0x17aa6 <check_pinda_1()>
    711c:	0d 94 28 10 	jmp	0x22050	; 0x22050 <lcdui_print_status_line()+0x2ba>
    7120:	0c 94 8b de 	jmp	0x1bd16	; 0x1bd16 <lcd_resume_usb_print()>
    7124:	0c 94 36 d4 	jmp	0x1a86c	; 0x1a86c <analogWrite+0x190>
    7128:	0c 94 c8 fa 	jmp	0x1f590	; 0x1f590 <menu_lcd_lcdupdate_func()>
    712c:	0c 94 be bf 	jmp	0x17f7c	; 0x17f7c <lcd_nozzle_diameter_cycle()>
    7130:	0d 94 1a 11 	jmp	0x22234	; 0x22234 <lcd_cooldown() [clone .lto_priv.406]>
    7134:	0c 94 67 d0 	jmp	0x1a0ce	; 0x1a0ce <mmu_load_to_nozzle_menu() [clone .lto_priv.413]>
    7138:	0c 94 6b c8 	jmp	0x190d6	; 0x190d6 <menu_lcd_longpress_func()>
    713c:	0d 94 66 27 	jmp	0x24ecc	; 0x24ecc <mFilamentItem_farm_nozzle()>
    7140:	0c 94 e9 d0 	jmp	0x1a1d2	; 0x1a1d2 <lcd_adjust_bed_reset()>
    7144:	0d 94 24 9d 	jmp	0x33a48	; 0x33a48 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]+0xf4>
    7148:	0c 94 07 d7 	jmp	0x1ae0e	; 0x1ae0e <lcd_reset_sheet()>
    714c:	0d 94 8e 27 	jmp	0x24f1c	; 0x24f1c <mFilamentItem_PVB()>
    7150:	0d 94 37 05 	jmp	0x20a6e	; 0x20a6e <SpoolJoin::SpoolJoin::toggleSpoolJoin()>
    7154:	0c 94 82 73 	jmp	0xe704	; 0xe704 <_menu_edit_P()>
    7158:	0d 94 fc 0d 	jmp	0x21bf8	; 0x21bf8 <lcd_pause_print()>
    715c:	0c 94 f1 ec 	jmp	0x1d9e2	; 0x1d9e2 <lcd_wizard(WizState)+0x25c>
    7160:	0c 94 cf 63 	jmp	0xc79e	; 0xc79e <_GLOBAL__sub_D_card>
    7164:	0d 94 d1 07 	jmp	0x20fa2	; 0x20fa2 <lcd_pause_usb_print()>
    7168:	0d 94 f7 06 	jmp	0x20dee	; 0x20dee <lcd_menu_fails_stats() [clone .lto_priv.395]>
    716c:	0c 94 14 bd 	jmp	0x17a28	; 0x17a28 <turnOffPWM+0x50>
    7170:	0c 94 ab bf 	jmp	0x17f56	; 0x17f56 <lcd_sort_type_set()>
    7174:	0c 94 6b c0 	jmp	0x180d6	; 0x180d6 <lcd_fsensor_jam_detection_set()>

00007178 <__trampolines_end>:
    7178:	6e 61       	ori	r22, 0x1E	; 30
    717a:	6e 00       	.word	0x006e	; ????

0000717c <__c.2228>:
    717c:	69 6e 66 00 00 40 7a 10 f3 5a 00 a0 72 4e 18 09     inf..@z..Z..rN..
    718c:	00 10 a5 d4 e8 00 00 e8 76 48 17 00 00 e4 0b 54     ........vH.....T
    719c:	02 00 00 ca 9a 3b 00 00 00 e1 f5 05 00 00 80 96     .....;..........
    71ac:	98 00 00 00 40 42 0f 00 00 00 a0 86 01 00 00 00     ....@B..........
    71bc:	10 27 00 00 00 00 e8 03 00 00 00 00 64 00 00 00     .'..........d...
    71cc:	00 00 0a 00 00 00 00 00 01 00 00 00 00 00 2c 76     ..............,v
    71dc:	d8 88 dc 67 4f 08 23 df c1 df ae 59 e1 b1 b7 96     ...gO.#....Y....
    71ec:	e5 e3 e4 53 c6 3a e6 51 99 76 96 e8 e6 c2 84 26     ...S.:.Q.v.....&
    71fc:	eb 89 8c 9b 62 ed 40 7c 6f fc ef bc 9c 9f 40 f2     ....b.@|o.....@.
    720c:	ba a5 6f a5 f4 90 05 5a 2a f7 5c 93 6b 6c f9 67     ..o....Z*.\.kl.g
    721c:	6d c1 1b fc e0 e4 0d 47 fe f5 20 e6 b5 00 d0 ed     m......G.. .....
    722c:	90 2e 03 00 94 35 77 05 00 80 84 1e 08 00 00 20     .....5w........ 
    723c:	4e 0a 00 00 00 c8 0c 33 33 33 33 0f 98 6e 12 83     N......3333..n..
    724c:	11 41 ef 8d 21 14 89 3b e6 55 16 cf fe e6 db 18     .A..!..;.U......
    725c:	d1 84 4b 38 1b f7 7c 1d 90 1d a4 bb e4 24 20 32     ..K8..|......$ 2
    726c:	84 72 5e 22 81 00 c9 f1 24 ec a1 e5 3d 27           .r^"....$...='

0000727a <enquecommand(char const*, bool)::__c>:
    727a:	22 00                                               ".

0000727c <mp_echo_config_state()::__c>:
	...

0000727d <mp_echo_config_state()::__c>:
    727d:	20 45 53 50 00                                       ESP.

00007282 <mp_echo_config_state()::__c>:
    7282:	20 4e 53 50 00                                       NSP.

00007287 <mp_echo_config_state()::__c>:
    7287:	20 4f 46 46 00                                       OFF.

0000728c <mp_echo_config_state()::__c>:
    728c:	20 4f 4e 00                                          ON.

00007290 <mp_echo_config_state()::__c>:
    7290:	50 56 30 31 00                                      PV01.

00007295 <mp_echo_config_state()::__c>:
    7295:	20 5b 4d 50 5d 20 00                                 [MP] .

0000729c <get_command()::__c>:
    729c:	25 69 20 68 6f 75 72 73 20 25 69 20 6d 69 6e 75     %i hours %i minu
    72ac:	74 65 73 00                                         tes.

000072b0 <get_command()::__c>:
    72b0:	52 58 20 74 69 6d 65 6f 75 74 00                    RX timeout.

000072bb <get_command()::__c>:
    72bb:	4d 33 31 30 00                                      M310.

000072c0 <get_command()::__c>:
    72c0:	4d 31 31 32 00                                      M112.

000072c5 <get_command()::__c>:
    72c5:	4d 31 31 30 00                                      M110.

000072ca <get_command()::__c>:
    72ca:	46 75 6c 6c 20 52 58 20 42 75 66 66 65 72 00        Full RX Buffer.

000072d9 <Config_StoreSettings()::__c>:
    72d9:	53 65 74 74 69 6e 67 73 20 53 74 6f 72 65 64 00     Settings Stored.

000072e9 <Config_RetrieveSettings()::__c>:
    72e9:	53 74 6f 72 65 64 20 73 65 74 74 69 6e 67 73 20     Stored settings 
    72f9:	72 65 74 72 69 65 76 65 64 00                       retrieved.

00007303 <Config_ResetDefault()::__c>:
    7303:	48 61 72 64 63 6f 64 65 64 20 44 65 66 61 75 6c     Hardcoded Defaul
    7313:	74 20 53 65 74 74 69 6e 67 73 20 4c 6f 61 64 65     t Settings Loade
    7323:	64 00                                               d.

00007325 <default_conf>:
    7325:	56 32 00 00 00 00 c8 42 00 00 c8 42 00 00 c8 43     V2.....B...B...C
    7335:	00 00 05 43 00 00 48 43 00 00 48 43 00 00 40 41     ...C..HC..HC..@A
    7345:	00 00 f0 42 e8 03 00 00 e8 03 00 00 c8 00 00 00     ...B............
    7355:	88 13 00 00 00 40 9c 44 00 40 9c 44 00 00 00 00     .....@.D.@.D....
    7365:	00 00 00 00 20 4e 00 00 00 00 20 41 00 00 20 41     .... N.... A.. A
    7375:	cd cc cc 3e 00 00 90 40 00 00 00 00 00 00 00 00     ...>...@........
    7385:	00 00 00 00 cd cc cc 3e 3d 0a 81 41 ff 08 43 3e     .......>=..A..C>
    7395:	b0 99 ab 43 8f 42 fc 42 e6 5a 34 3f 4c 62 b0 45     ...C.B.B.Z4?Lb.E
    73a5:	00 00 00 00 00 40 40 00 00 34 42 00 00 00 00 00     .....@@..4B.....
    73b5:	00 00 00 00 00 00 41 00 00 00 e0 3f 00 00 2c 43     ......A....?..,C
    73c5:	00 00 2c 43 00 00 40 41 00 00 f0 42 c0 03 00 00     ..,C..@A...B....
    73d5:	c0 03 00 00 c8 00 00 00 88 13 00 00 10 10 10 10     ................
    73e5:	00 40 9c 44 00 00 80 3f 00 00 00 3f 19 14 00 00     .@.D...?...?....
	...

000073f6 <serial_dump_and_reset(dump_crash_reason)::__c>:
    73f6:	20 30 78 00                                          0x.

000073fa <serial_dump_and_reset(dump_crash_reason)::__c>:
    73fa:	20 30 78 00                                          0x.

000073fe <serial_dump_and_reset(dump_crash_reason)::__c>:
    73fe:	65 72 72 6f 72 3a 20 00                             error: .

00007406 <serial_dump_and_reset(dump_crash_reason)::__c>:
    7406:	44 32 33 20 2d 20 65 6d 65 72 67 65 6e 63 79 20     D23 - emergency 
    7416:	73 65 72 69 61 6c 20 64 75 6d 70 00                 serial dump.

00007422 <eeprom_default_sheet_name(unsigned char, SheetName&)::__c>:
    7422:	43 75 73 74 6f 6d 00                                Custom.

00007429 <eeprom_default_sheet_name(unsigned char, SheetName&)::__c>:
    7429:	4e 79 6c 6f 6e 50 41 00                             NylonPA.

00007431 <eeprom_default_sheet_name(unsigned char, SheetName&)::__c>:
    7431:	53 61 74 69 6e 20 20 00                             Satin  .

00007439 <eeprom_default_sheet_name(unsigned char, SheetName&)::__c>:
    7439:	54 65 78 74 75 72 00                                Textur.

00007440 <eeprom_default_sheet_name(unsigned char, SheetName&)::__c>:
    7440:	53 6d 6f 6f 74 68 00                                Smooth.

00007447 <la10c_mode_change(LA10C_MODE)::__c>:
    7447:	31 2e 30 00                                         1.0.

0000744b <la10c_mode_change(LA10C_MODE)::__c>:
    744b:	31 2e 35 00                                         1.5.

0000744f <la10c_mode_change(LA10C_MODE)::__c>:
    744f:	55 4e 4b 4e 4f 57 4e 00                             UNKNOWN.

00007457 <la10c_mode_change(LA10C_MODE)::__c>:
    7457:	4c 41 31 30 43 3a 20 4c 69 6e 65 61 72 20 41 64     LA10C: Linear Ad
    7467:	76 61 6e 63 65 20 6d 6f 64 65 3a 20 00              vance mode: .

00007474 <la10c_jerk(float)::__c>:
    7474:	4c 41 31 30 43 3a 20 41 64 6a 75 73 74 65 64 20     LA10C: Adjusted 
    7484:	45 2d 4a 65 72 6b 3a 20 00                          E-Jerk: .

0000748d <_PRI_LANG_SIGNATURE>:
    748d:	ff ff ff ff                                         ....

00007491 <Font>:
    7491:	3e 0f a8 af 00 48 00 69 96 00 00 df 60 25 55 58     >....H.i....`%UX
    74a1:	87 68 04 27 f2 e0 00 5e 34 03 cc 19 60 f3 3c 0e     .h.'...^4...`.<.
    74b1:	f8 8f 00 db 08 02 94 92 00 3e 1c 07 9a 87 00 e5     .........>......
    74c1:	24 00 85 28 52 7e 06 00 1b e4 00 7e 78 12 70 78     $..(R~.....~x.px
    74d1:	70 61 f8 12 78 8f 88 41 78 42 70 78 70 61 78 25     pa..x..AxBpxpax%
    74e1:	70 78 70 61 f8 50 78 8f 88 d1 f0 25 27 07 87 61     pxpa.Px....%'..a
    74f1:	f0 25 27 8f 88 41 2c 0d 27 aa 50 d1 bc 07 07 87     .%'..A,.'.P.....
    7501:	11 61 be 78 8f 88 11 41 78 52 70 78 70 61 f8 52     .a.x...AxRpxpa.R
    7511:	78 8f 88 41 20 12 78 88 70 63 20 52 78 88 70 63     x..A .x.pc Rx.pc
    7521:	48 52 78 88 87 43 03 11 17 99 70 64 18 12 78 f8     HRx..C....pd..x.
    7531:	70 65 44 12 f8 f8 f0 45 18 42 78 f8 70 65 18 25     peD....E.Bx.pe.%
    7541:	78 f8 70 65 18 52 78 f8 70 65 18 50 78 f8 70 65     x.pe.Rx.pe.Px.pe
    7551:	0c 07 8f 87 23 65 a2 0f 8f 8f 11 45 00 12 06 22     ....#e.....E..."
    7561:	70 69 00 12 07 22 27 49 00 25 06 22 70 69 00 25     pi..."'I.%."pi.%
    7571:	07 22 27 49 00 12 06 22 27 6c 02 62 36 a2 70 6c     ."'I..."'l.b6.pl
    7581:	40 45 6c 44 70 4c 03 62 22 22 70 6c 43 88 88 88     @ElDpL.b""plC...
    7591:	f0 4c 78 12 bc 88 80 6e 78 52 bc 88 80 6e 38 12     .Lx....nxR...n8.
    75a1:	78 88 70 6f 78 12 78 88 87 4f 38 42 78 88 70 6f     x.pox.x..O8Bx.po
    75b1:	38 25 78 88 70 6f 3a 00 79 ac 78 6f 3d 07 9a ac     8%x.po:.y.xo=...
    75c1:	78 6f 78 50 78 88 87 ef 39 49 78 88 70 6f 08 52     xoxPx...9Ix.po.R
    75d1:	bc 88 80 72 98 52 f8 8f 98 52 20 12 78 70 f0 73     ...r.R...R .xp.s
    75e1:	48 12 78 63 87 53 20 52 78 70 f0 73 48 52 78 63     H.xc.S Rxp.sHRxc
    75f1:	87 53 10 07 87 0f 24 73 12 78 63 87 24 53 60 69     .S....$s.xc.$S`i
    7601:	9a 98 8b e2 23 04 e4 44 30 74 10 4e 44 43 24 74     ....#..D0t.NDC$t
    7611:	7c 12 88 89 60 75 3c 50 88 88 70 55 78 25 28 89     |...`u<P..pUx%(.
    7621:	60 75 79 49 08 89 60 75 3c 12 88 70 70 79 0c 12     `uyI..`u<..ppy..
    7631:	88 52 22 59 44 12 f1 24 f0 7a 44 52 f1 24 f0 7a     .R"YD..$.zDR.$.z
    7641:	8c 52 f0 36 8f 5a 44 20 f1 24 f0 7a                 .R.6.ZD .$.z

0000764d <row_offsets>:
    764d:	00 40 14 54                                         .@.T

00007651 <pwr_m10>:
    7651:	cd cc cc 3d 0a d7 23 3c 17 b7 d1 38 77 cc 2b 32     ...=..#<...8w.+2
    7661:	95 95 e6 24 1f b1 4f 0a                             ...$..O.

00007669 <pwr_p10>:
    7669:	00 00 20 41 00 00 c8 42 00 40 1c 46 20 bc be 4c     .. A...B.@.F ..L
    7679:	ca 1b 0e 5a ae c5 9d 74                             ...Z...t

00007681 <pstr_nan>:
    7681:	4e 41 4e                                            NAN

00007684 <pstr_inf>:
    7684:	49 4e 46                                            INF

00007687 <base_max_pos_P>:
    7687:	00 00 7a 43 00 00 52 43 00 00 52 43                 ..zC..RC..RC

00007693 <base_min_pos_P>:
    7693:	00 00 00 00 00 00 80 c0 9a 99 19 3e                 ...........>

0000769f <base_home_pos_P>:
    769f:	00 00 00 00 00 00 80 c0 9a 99 19 3e                 ...........>

000076ab <gcode_M105()::__c>:
    76ab:	20 50 3a 00                                          P:.

000076af <gcode_M105()::__c>:
    76af:	20 42 40 3a 00                                       B@:.

000076b4 <gcode_M105()::__c>:
    76b4:	20 40 3a 00                                          @:.

000076b8 <gcode_M105()::__c>:
    76b8:	20 2f 00                                             /.

000076bb <gcode_M105()::__c>:
    76bb:	20 54 30 3a 00                                       T0:.

000076c0 <gcode_M105()::__c>:
    76c0:	20 2f 00                                             /.

000076c3 <gcode_M105()::__c>:
    76c3:	20 42 3a 00                                          B:.

000076c7 <gcode_M105()::__c>:
    76c7:	20 2f 00                                             /.

000076ca <gcode_M105()::__c>:
    76ca:	54 3a 00                                            T:.

000076cd <gcode_G80()::{lambda(char, unsigned char*)#1}::operator()(char, unsigned char*) const::__c>:
    76cd:	25 53 45 78 63 65 73 73 69 76 65 20 62 65 64 20     %SExcessive bed 
    76dd:	6c 65 76 65 6c 69 6e 67 20 63 6f 72 72 65 63 74     leveling correct
    76ed:	69 6f 6e 3a 20 25 69 20 6d 69 63 72 6f 6e 73 0a     ion: %i microns.
	...

000076fe <gcode_G80()::__c>:
    76fe:	42 65 64 20 6c 65 76 65 6c 69 6e 67 20 66 61 69     Bed leveling fai
    770e:	6c 65 64 2e 20 54 6f 6f 20 6d 75 63 68 20 76 61     led. Too much va
    771e:	72 69 61 74 69 6f 6e 20 66 72 6f 6d 20 65 65 70     riation from eep
    772e:	72 6f 6d 20 6d 65 73 68 00                          rom mesh.

00007737 <gcode_G80()::__c>:
    7737:	42 65 64 20 6c 65 76 65 6c 69 6e 67 20 66 61 69     Bed leveling fai
    7747:	6c 65 64 2e 20 53 65 6e 73 6f 72 20 74 72 69 67     led. Sensor trig
    7757:	67 65 72 65 64 20 74 6f 6f 20 73 6f 6f 6e 00        gered too soon.

00007766 <mesh_bed_leveling::print()::__c>:
    7766:	20 20 00                                              .

00007769 <mesh_bed_leveling::print()::__c>:
    7769:	4d 65 61 73 75 72 65 64 20 70 6f 69 6e 74 73 3a     Measured points:
	...

0000777a <mesh_bed_leveling::print()::__c>:
    777a:	5a 20 73 65 61 72 63 68 20 68 65 69 67 68 74 3a     Z search height:
    778a:	20 35 2e 30 66 00                                    5.0f.

00007790 <mesh_bed_leveling::print()::__c>:
    7790:	4e 75 6d 20 58 2c 59 3a 20 37 2c 37 00              Num X,Y: 7,7.

0000779d <gcode_G81_M420()::__c>:
    779d:	4d 65 73 68 20 62 65 64 20 6c 65 76 65 6c 69 6e     Mesh bed levelin
    77ad:	67 20 6e 6f 74 20 61 63 74 69 76 65 2e 00           g not active..

000077bb <gcode_M114()::__c>:
    77bb:	20 45 3a 00                                          E:.

000077bf <gcode_M114()::__c>:
    77bf:	20 5a 3a 00                                          Z:.

000077c3 <gcode_M114()::__c>:
    77c3:	20 59 3a 00                                          Y:.

000077c7 <gcode_M114()::__c>:
    77c7:	20 45 3a 00                                          E:.

000077cb <gcode_M114()::__c>:
    77cb:	20 5a 3a 00                                          Z:.

000077cf <gcode_M114()::__c>:
    77cf:	20 59 3a 00                                          Y:.

000077d3 <gcode_M114()::__c>:
    77d3:	58 3a 00                                            X:.

000077d6 <SpoolJoin::SpoolJoin::nextSlot()::__c>:
    77d6:	20 2d 3e 20 00                                       -> .

000077db <SpoolJoin::SpoolJoin::nextSlot()::__c>:
    77db:	53 70 6f 6f 6c 4a 6f 69 6e 3a 20 00                 SpoolJoin: .

000077e7 <gcode_M861_print_pinda_cal_eeprom()::comma_sep>:
    77e7:	2c 20 00                                            , .

000077ea <manage_inactivity(bool)::__c>:
    77ea:	49 6e 61 63 74 69 76 69 74 79 20 53 68 75 74 64     Inactivity Shutd
    77fa:	6f 77 6e 00                                         own.

000077fe <kill(char const*)::__c>:
    77fe:	4b 49 4c 4c 45 44 2e 00                             KILLED..

00007806 <kill(char const*)::__c>:
    7806:	50 72 69 6e 74 65 72 20 68 61 6c 74 65 64 2e 20     Printer halted. 
    7816:	6b 69 6c 6c 28 29 20 63 61 6c 6c 65 64 21 00        kill() called!.

00007825 <check_babystep()::__c>:
    7825:	5a 20 6c 69 76 65 20 61 64 6a 75 73 74 20 6f 75     Z live adjust ou
    7835:	74 20 6f 66 20 72 61 6e 67 65 2e 20 53 65 74 74     t of range. Sett
    7845:	69 6e 67 20 74 6f 20 30 2e 20 43 6c 69 63 6b 20     ing to 0. Click 
    7855:	74 6f 20 63 6f 6e 74 69 6e 75 65 2e 00              to continue..

00007862 <check_babystep()::__c>:
    7862:	5a 20 6c 69 76 65 20 61 64 6a 75 73 74 20 6f 75     Z live adjust ou
    7872:	74 20 6f 66 20 72 61 6e 67 65 2e 20 53 65 74 74     t of range. Sett
    7882:	69 6e 67 20 74 6f 20 30 00                          ing to 0.

0000788b <serialecho_temperatures()::__c>:
    788b:	20 45 3a 30 20 42 3a 00                              E:0 B:.

00007893 <serialecho_temperatures()::__c>:
    7893:	54 3a 00                                            T:.

00007896 <host_keepalive()::__c>:
    7896:	62 75 73 79 3a 20 70 61 75 73 65 64 20 66 6f 72     busy: paused for
    78a6:	20 69 6e 70 75 74 00                                 input.

000078ad <host_keepalive()::__c>:
    78ad:	62 75 73 79 3a 20 70 61 75 73 65 64 20 66 6f 72     busy: paused for
    78bd:	20 75 73 65 72 00                                    user.

000078c3 <host_keepalive()::__c>:
    78c3:	62 75 73 79 3a 20 70 72 6f 63 65 73 73 69 6e 67     busy: processing
	...

000078d4 <dcode_23()::__c>:
    78d4:	73 65 72 69 61 6c 20 64 75 6d 70 20 00              serial dump .

000078e1 <TCodeInvalid()::__c>:
    78e1:	49 6e 76 61 6c 69 64 20 54 20 63 6f 64 65 2e 00     Invalid T code..

000078f1 <duplicate_Tcode_ignored>:
    78f1:	44 75 70 6c 69 63 61 74 65 20 54 2d 63 6f 64 65     Duplicate T-code
    7901:	20 69 67 6e 6f 72 65 64 2e 00                        ignored..

0000790b <gcode_M900()::__c>:
    790b:	41 64 76 61 6e 63 65 20 4b 3d 00                    Advance K=.

00007916 <gcode_M900()::__c>:
    7916:	4b 20 6f 75 74 20 6f 66 20 61 6c 6c 6f 77 65 64     K out of allowed
    7926:	20 72 61 6e 67 65 21 00                              range!.

0000792e <_sPrinterName>:
    792e:	4d 4b 32 2e 35 00                                   MK2.5.

00007934 <_sPrinterMmuName>:
    7934:	4d 4b 32 2e 35 4d 4d 55 32 00                       MK2.5MMU2.

0000793e <_nPrinterMmuType>:
    793e:	1a 4f                                               .O

00007940 <_nPrinterType>:
    7940:	fa 00                                               ..

00007942 <lcd_wait_for_heater()::__c>:
    7942:	25 33 64 2f 25 33 64 00                             %3d/%3d.

0000794a <M600_wait_for_user()::__c>:
    794a:	25 33 64 00                                         %3d.

0000794e <lcd_alright()::__c>:
    794e:	20 0a 20 0a 20 0a 20 00                              . . . .

00007956 <Config_PrintSettings(unsigned char)::__c>:
    7956:	25 53 53 74 61 74 69 73 74 69 63 73 3a 0a 25 53     %SStatistics:.%S
    7966:	20 20 4d 37 38 20 53 25 6c 75 20 54 25 6c 75 0a       M78 S%lu T%lu.
	...

00007977 <Config_PrintSettings(unsigned char)::__c>:
    7977:	25 53 41 72 63 20 53 65 74 74 69 6e 67 73 3a 20     %SArc Settings: 
    7987:	50 3a 4d 61 78 20 6c 65 6e 67 74 68 28 6d 6d 29     P:Max length(mm)
    7997:	20 53 3a 4d 69 6e 20 6c 65 6e 67 74 68 20 28 6d      S:Min length (m
    79a7:	6d 29 20 4e 3a 43 6f 72 72 65 63 74 69 6f 6e 73     m) N:Corrections
    79b7:	20 52 3a 4d 69 6e 20 73 65 67 6d 65 6e 74 73 20      R:Min segments 
    79c7:	46 3a 53 65 67 6d 65 6e 74 73 2f 73 65 63 2e 0a     F:Segments/sec..
    79d7:	25 53 20 20 4d 32 31 34 20 50 25 2e 32 66 20 53     %S  M214 P%.2f S
    79e7:	25 2e 32 66 20 4e 25 64 20 52 25 64 20 46 25 64     %.2f N%d R%d F%d
    79f7:	0a 00                                               ..

000079f9 <Config_PrintSettings(unsigned char)::__c>:
    79f9:	25 53 46 69 6c 61 6d 65 6e 74 20 73 65 74 74 69     %SFilament setti
    7a09:	6e 67 73 3a 20 44 69 73 61 62 6c 65 64 0a 00        ngs: Disabled..

00007a18 <Config_PrintSettings(unsigned char)::__c>:
    7a18:	25 53 46 69 6c 61 6d 65 6e 74 20 73 65 74 74 69     %SFilament setti
    7a28:	6e 67 73 3a 0a 25 53 20 20 20 4d 32 30 30 20 44     ngs:.%S   M200 D
    7a38:	25 2e 32 66 0a 00                                   %.2f..

00007a3e <Config_PrintSettings(unsigned char)::__c>:
    7a3e:	25 53 52 65 74 72 61 63 74 3a 20 53 3d 4c 65 6e     %SRetract: S=Len
    7a4e:	67 74 68 20 28 6d 6d 29 20 46 3a 53 70 65 65 64     gth (mm) F:Speed
    7a5e:	20 28 6d 6d 2f 6d 29 20 5a 3a 20 5a 4c 69 66 74      (mm/m) Z: ZLift
    7a6e:	20 28 6d 6d 29 0a 25 53 20 20 20 4d 32 30 37 20      (mm).%S   M207 
    7a7e:	53 25 2e 32 66 20 46 25 2e 32 66 20 5a 25 2e 32     S%.2f F%.2f Z%.2
    7a8e:	66 0a 25 53 52 65 63 6f 76 65 72 3a 20 53 3d 45     f.%SRecover: S=E
    7a9e:	78 74 72 61 20 6c 65 6e 67 74 68 20 28 6d 6d 29     xtra length (mm)
    7aae:	20 46 3a 53 70 65 65 64 20 28 6d 6d 2f 6d 29 0a      F:Speed (mm/m).
    7abe:	25 53 20 20 20 4d 32 30 38 20 53 25 2e 32 66 20     %S   M208 S%.2f 
    7ace:	46 25 2e 32 66 0a 25 53 41 75 74 6f 2d 52 65 74     F%.2f.%SAuto-Ret
    7ade:	72 61 63 74 3a 20 53 3d 30 20 74 6f 20 64 69 73     ract: S=0 to dis
    7aee:	61 62 6c 65 2c 20 31 20 74 6f 20 69 6e 74 65 72     able, 1 to inter
    7afe:	70 72 65 74 20 65 78 74 72 75 64 65 2d 6f 6e 6c     pret extrude-onl
    7b0e:	79 20 6d 6f 76 65 73 20 61 73 20 72 65 74 72 61     y moves as retra
    7b1e:	63 74 73 20 6f 72 20 72 65 63 6f 76 65 72 69 65     cts or recoverie
    7b2e:	73 0a 25 53 20 20 20 4d 32 30 39 20 53 25 64 0a     s.%S   M209 S%d.
	...

00007b3f <Config_PrintSettings(unsigned char)::__c>:
    7b3f:	25 53 50 49 44 20 68 65 61 74 62 65 64 20 73 65     %SPID heatbed se
    7b4f:	74 74 69 6e 67 73 3a 0a 25 53 20 20 20 4d 33 30     ttings:.%S   M30
    7b5f:	34 20 50 25 2e 32 66 20 49 25 2e 32 66 20 44 25     4 P%.2f I%.2f D%
    7b6f:	2e 32 66 0a 00                                      .2f..

00007b74 <Config_PrintSettings(unsigned char)::__c>:
    7b74:	25 53 50 49 44 20 73 65 74 74 69 6e 67 73 3a 0a     %SPID settings:.
    7b84:	25 53 20 20 20 4d 33 30 31 20 50 25 2e 32 66 20     %S   M301 P%.2f 
    7b94:	49 25 2e 32 66 20 44 25 2e 32 66 0a 00              I%.2f D%.2f..

00007ba1 <Config_PrintSettings(unsigned char)::__c>:
    7ba1:	25 53 53 74 65 70 73 20 70 65 72 20 75 6e 69 74     %SSteps per unit
    7bb1:	3a 0a 25 53 20 20 4d 39 32 20 58 25 2e 32 66 20     :.%S  M92 X%.2f 
    7bc1:	59 25 2e 32 66 20 5a 25 2e 32 66 20 45 25 2e 32     Y%.2f Z%.2f E%.2
    7bd1:	66 0a 25 53 4d 61 78 69 6d 75 6d 20 66 65 65 64     f.%SMaximum feed
    7be1:	72 61 74 65 73 20 28 6d 6d 2f 73 29 3a 0a 25 53     rates (mm/s):.%S
    7bf1:	20 20 4d 32 30 33 20 58 25 2e 32 66 20 59 25 2e       M203 X%.2f Y%.
    7c01:	32 66 20 5a 25 2e 32 66 20 45 25 2e 32 66 0a 25     2f Z%.2f E%.2f.%
    7c11:	53 4d 61 78 69 6d 75 6d 20 61 63 63 65 6c 65 72     SMaximum acceler
    7c21:	61 74 69 6f 6e 20 28 6d 6d 2f 73 32 29 3a 0a 25     ation (mm/s2):.%
    7c31:	53 20 20 4d 32 30 31 20 58 25 6c 75 20 59 25 6c     S  M201 X%lu Y%l
    7c41:	75 20 5a 25 6c 75 20 45 25 6c 75 0a 25 53 41 63     u Z%lu E%lu.%SAc
    7c51:	63 65 6c 65 72 61 74 69 6f 6e 3a 20 50 3d 70 72     celeration: P=pr
    7c61:	69 6e 74 2c 20 52 3d 72 65 74 72 61 63 74 2c 20     int, R=retract, 
    7c71:	54 3d 74 72 61 76 65 6c 0a 25 53 20 20 4d 32 30     T=travel.%S  M20
    7c81:	34 20 50 25 2e 32 66 20 52 25 2e 32 66 20 54 25     4 P%.2f R%.2f T%
    7c91:	2e 32 66 0a 25 53 41 64 76 61 6e 63 65 64 20 76     .2f.%SAdvanced v
    7ca1:	61 72 69 61 62 6c 65 73 3a 20 53 3d 4d 69 6e 20     ariables: S=Min 
    7cb1:	66 65 65 64 72 61 74 65 20 28 6d 6d 2f 73 29 2c     feedrate (mm/s),
    7cc1:	20 54 3d 4d 69 6e 20 74 72 61 76 65 6c 20 66 65      T=Min travel fe
    7cd1:	65 64 72 61 74 65 20 28 6d 6d 2f 73 29 2c 20 42     edrate (mm/s), B
    7ce1:	3d 6d 69 6e 69 6d 75 6d 20 73 65 67 6d 65 6e 74     =minimum segment
    7cf1:	20 74 69 6d 65 20 28 75 73 29 2c 20 58 3d 6d 61      time (us), X=ma
    7d01:	78 69 6d 75 6d 20 58 59 20 6a 65 72 6b 20 28 6d     ximum XY jerk (m
    7d11:	6d 2f 73 29 2c 20 20 5a 3d 6d 61 78 69 6d 75 6d     m/s),  Z=maximum
    7d21:	20 5a 20 6a 65 72 6b 20 28 6d 6d 2f 73 29 2c 20      Z jerk (mm/s), 
    7d31:	20 45 3d 6d 61 78 69 6d 75 6d 20 45 20 6a 65 72      E=maximum E jer
    7d41:	6b 20 28 6d 6d 2f 73 29 0a 25 53 20 20 4d 32 30     k (mm/s).%S  M20
    7d51:	35 20 53 25 2e 32 66 20 54 25 2e 32 66 20 42 25     5 S%.2f T%.2f B%
    7d61:	6c 75 20 58 25 2e 32 66 20 59 25 2e 32 66 20 5a     lu X%.2f Y%.2f Z
    7d71:	25 2e 32 66 20 45 25 2e 32 66 0a 25 53 48 6f 6d     %.2f E%.2f.%SHom
    7d81:	65 20 6f 66 66 73 65 74 20 28 6d 6d 29 3a 0a 25     e offset (mm):.%
    7d91:	53 20 20 4d 32 30 36 20 58 25 2e 32 66 20 59 25     S  M206 X%.2f Y%
    7da1:	2e 32 66 20 5a 25 2e 32 66 0a 00                    .2f Z%.2f..

00007dac <cap_line(char const*, bool)::__c>:
    7dac:	43 61 70 3a 25 53 3a 25 63 0a 00                    Cap:%S:%c..

00007db7 <extended_capabilities_report()::__c>:
    7db7:	50 52 55 53 41 5f 4d 4d 55 32 00                    PRUSA_MMU2.

00007dc2 <extended_capabilities_report()::__c>:
    7dc2:	45 58 54 45 4e 44 45 44 5f 4d 32 30 00              EXTENDED_M20.

00007dcf <extended_capabilities_report()::__c>:
    7dcf:	41 55 54 4f 52 45 50 4f 52 54 5f 50 4f 53 49 54     AUTOREPORT_POSIT
    7ddf:	49 4f 4e 00                                         ION.

00007de3 <extended_capabilities_report()::__c>:
    7de3:	41 55 54 4f 52 45 50 4f 52 54 5f 46 41 4e 53 00     AUTOREPORT_FANS.

00007df3 <extended_capabilities_report()::__c>:
    7df3:	41 55 54 4f 52 45 50 4f 52 54 5f 54 45 4d 50 00     AUTOREPORT_TEMP.

00007e03 <show_upgrade_dialog_if_version_newer(char const*)::__c>:
	...

00007e04 <CardReader::removeFile(char const*)::__c>:
    7e04:	44 65 6c 65 74 69 6f 6e 20 66 61 69 6c 65 64 2c     Deletion failed,
    7e14:	20 46 69 6c 65 3a 20 00                              File: .

00007e1c <CardReader::removeFile(char const*)::__c>:
    7e1c:	46 69 6c 65 20 64 65 6c 65 74 65 64 3a 00           File deleted:.

00007e2a <CardReader::getStatus(bool)::__c>:
    7e2a:	4e 6f 74 20 53 44 20 70 72 69 6e 74 69 6e 67 00     Not SD printing.

00007e3a <CardReader::getStatus(bool)::__c>:
    7e3a:	50 72 69 6e 74 20 73 61 76 65 64 00                 Print saved.

00007e46 <CardReader::getStatus(bool)::__c>:
    7e46:	53 44 20 70 72 69 6e 74 20 70 61 75 73 65 64 00     SD print paused.

00007e56 <lcd_wait_for_pinda(float)::__c>:
    7e56:	25 33 64 2f 25 33 64 00                             %3d/%3d.

00007e5e <farm_prusa_code_seen()::__c>:
    7e5e:	66 76 00                                            fv.

00007e61 <farm_prusa_code_seen()::__c>:
    7e61:	74 68 78 00                                         thx.

00007e65 <farm_prusa_code_seen()::__c>:
    7e65:	50 52 4e 00                                         PRN.

00007e69 <_ZZ16process_commandsvE3__c__84_>:
    7e69:	22 28 32 29 00                                      "(2).

00007e6e <_ZZ16process_commandsvE3__c__83_>:
    7e6e:	6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 61 6e 64     no valid command
	...

00007e7f <_ZZ16process_commandsvE3__c__82_>:
    7e7f:	7a 65 72 6f 72 69 7a 65 64 00                       zerorized.

00007e89 <_ZZ16process_commandsvE3__c__81_>:
    7e89:	66 61 63 74 6f 72 79 20 72 65 73 74 6f 72 65 64     factory restored
	...

00007e9a <_ZZ16process_commandsvE3__c__79_>:
    7e9a:	69 6e 64 65 78 2c 20 74 65 6d 70 2c 20 75 73 74     index, temp, ust
    7eaa:	65 70 2c 20 75 6d 00                                ep, um.

00007eb1 <_ZZ16process_commandsvE3__c__80_>:
    7eb1:	50 49 4e 44 41 20 63 61 6c 20 73 74 61 74 75 73     PINDA cal status
    7ec1:	3a 20 00                                            : .

00007ec4 <_ZZ16process_commandsvE3__c__78_>:
    7ec4:	50 3a 00                                            P:.

00007ec7 <_ZZ16process_commandsvE3__c__77_>:
    7ec7:	57 61 69 74 20 66 6f 72 20 50 49 4e 44 41 20 74     Wait for PINDA t
    7ed7:	61 72 67 65 74 20 74 65 6d 70 65 72 61 74 75 72     arget temperatur
    7ee7:	65 3a 00                                            e:.

00007eea <_ZZ16process_commandsvE3__c__76_>:
    7eea:	20 41 00                                             A.

00007eed <_ZZ16process_commandsvE3__c__75_>:
    7eed:	20 50 00                                             P.

00007ef0 <_ZZ16process_commandsvE3__c__74_>:
    7ef0:	20 42 00                                             B.

00007ef3 <_ZZ16process_commandsvE3__c__73_>:
    7ef3:	20 4c 00                                             L.

00007ef6 <_ZZ16process_commandsvE3__c__72_>:
    7ef6:	20 52 00                                             R.

00007ef9 <_ZZ16process_commandsvE3__c__71_>:
    7ef9:	20 5a 00                                             Z.

00007efc <_ZZ16process_commandsvE3__c__70_>:
    7efc:	20 4e 4f 54 20 49 4e 49 54 49 41 4c 49 5a 45 44      NOT INITIALIZED
	...

00007f0d <_ZZ16process_commandsvE3__c__69_>:
    7f0d:	53 68 65 65 74 20 00                                Sheet .

00007f14 <_ZZ16process_commandsvE3__c__68_>:
    7f14:	20 5a 20 56 41 4c 55 45 20 4f 55 54 20 4f 46 20      Z VALUE OUT OF 
    7f24:	52 41 4e 47 45 00                                   RANGE.

00007f2a <_ZZ16process_commandsvE3__c__67_>:
    7f2a:	49 6e 76 61 6c 69 64 20 73 68 65 65 74 20 49 44     Invalid sheet ID
    7f3a:	2e 20 41 6c 6c 6f 77 65 64 3a 20 30 2e 2e 00        . Allowed: 0...

00007f49 <_ZZ16process_commandsvE3__c__66_>:
    7f49:	41 55 54 4f 00                                      AUTO.

00007f4e <_ZZ16process_commandsvE3__c__65_>:
    7f4e:	4c 41 4e 47 20 53 45 4c 20 46 4f 52 43 45 44 00     LANG SEL FORCED.

00007f5e <_ZZ16process_commandsvE3__c__64_>:
    7f5e:	20 64 3a 00                                          d:.

00007f62 <_ZZ16process_commandsvE3__c__63_>:
    7f62:	20 69 3a 00                                          i:.

00007f66 <_ZZ16process_commandsvE3__c__62_>:
    7f66:	20 70 3a 00                                          p:.

00007f6a <_ZZ16process_commandsvE3__c__61_>:
    7f6a:	20 64 3a 00                                          d:.

00007f6e <_ZZ16process_commandsvE3__c__60_>:
    7f6e:	20 69 3a 00                                          i:.

00007f72 <_ZZ16process_commandsvE3__c__59_>:
    7f72:	20 70 3a 00                                          p:.

00007f76 <_ZZ16process_commandsvE3__c__58_>:
    7f76:	25 69 25 25 0a 00                                   %i%%..

00007f7c <_ZZ16process_commandsvE3__c__57_>:
    7f7c:	25 69 25 25 0a 00                                   %i%%..

00007f82 <_ZZ16process_commandsvE3__c__56_>:
    7f82:	22 28 31 29 00                                      "(1).

00007f87 <_ZZ16process_commandsvE3__c__51_>:
    7f87:	2f 2f 00                                            //.

00007f8a <_ZZ16process_commandsvE3__c__50_>:
	...

00007f8b <_ZZ16process_commandsvE3__c__49_>:
    7f8b:	20 45 58 54 52 55 44 45 52 5f 43 4f 55 4e 54 3a      EXTRUDER_COUNT:
    7f9b:	31 00                                               1.

00007f9d <_ZZ16process_commandsvE3__c__48_>:
    7f9d:	20 4d 41 43 48 49 4e 45 5f 54 59 50 45 3a 00         MACHINE_TYPE:.

00007fac <_ZZ16process_commandsvE3__c__47_>:
    7fac:	31 2e 30 00                                         1.0.

00007fb0 <_ZZ16process_commandsvE3__c__46_>:
    7fb0:	20 62 61 73 65 64 20 6f 6e 20 4d 61 72 6c 69 6e      based on Marlin
    7fc0:	20 46 49 52 4d 57 41 52 45 5f 55 52 4c 3a 68 74      FIRMWARE_URL:ht
    7fd0:	74 70 73 3a 2f 2f 67 69 74 68 75 62 2e 63 6f 6d     tps://github.com
    7fe0:	2f 70 72 75 73 61 33 64 2f 50 72 75 73 61 2d 46     /prusa3d/Prusa-F
    7ff0:	69 72 6d 77 61 72 65 20 50 52 4f 54 4f 43 4f 4c     irmware PROTOCOL
    8000:	5f 56 45 52 53 49 4f 4e 3a 00                       _VERSION:.

0000800a <_ZZ16process_commandsvE3__c__45_>:
    800a:	37 37 33 31 30 32 34 65 64 00                       7731024ed.

00008014 <_ZZ16process_commandsvE3__c__44_>:
    8014:	5f 00                                               _.

00008016 <_ZZ16process_commandsvE3__c__43_>:
    8016:	38 32 37 39 00                                      8279.

0000801b <_ZZ16process_commandsvE3__c__42_>:
    801b:	2b 00                                               +.

0000801d <_ZZ16process_commandsvE3__c__41_>:
    801d:	46 49 52 4d 57 41 52 45 5f 4e 41 4d 45 3a 50 72     FIRMWARE_NAME:Pr
    802d:	75 73 61 2d 46 69 72 6d 77 61 72 65 20 00           usa-Firmware .

0000803b <_ZZ16process_commandsvE3__c__40_>:
    803b:	4d 31 31 33 20 53 00                                M113 S.

00008042 <_ZZ16process_commandsvE3__c__39_>:
    8042:	6f 6b 20 00                                         ok .

00008046 <_ZZ16process_commandsvE3__c__33_>:
    8046:	6e 2f 61 00                                         n/a.

0000804a <_ZZ16process_commandsvE3__c__32_>:
    804a:	3f 54 6f 73 68 69 62 61 20 46 6c 61 73 68 41 69     ?Toshiba FlashAi
    805a:	72 20 47 65 74 49 50 20 66 61 69 6c 65 64 0a 00     r GetIP failed..

0000806a <sensitive_pins>:
    806a:	00 01 25 30 1d 0c ff 24 31 1c 0b ff 23 2f 1b 0a     ..%0...$1...#/..
    807a:	17 ff 04 06 22 2b 1a 03 36 35 35 38                 ...."+..6558

00008086 <_ZZ16process_commandsvE3__c__31_>:
    8086:	25 69 20 6d 69 6e 2c 20 25 69 20 73 65 63 00        %i min, %i sec.

00008095 <_ZZ16process_commandsvE3__c__28_>:
    8095:	49 6e 76 61 6c 69 64 20 4d 20 63 6f 64 65 3a 20     Invalid M code: 
    80a5:	25 73 0a 00                                         %s..

000080a9 <_ZZ16process_commandsvE3__c__22_>:
    80a9:	50 49 4e 44 41 20 70 72 6f 62 65 20 63 61 6c 69     PINDA probe cali
    80b9:	62 72 61 74 69 6f 6e 20 73 74 61 72 74 00           bration start.

000080c7 <_ZZ16process_commandsvE3__c__21_>:
    80c7:	4e 6f 20 50 49 4e 44 41 20 74 68 65 72 6d 69 73     No PINDA thermis
    80d7:	74 6f 72 00                                         tor.

000080db <_ZZ16process_commandsvE3__c__17_>:
    80db:	73 65 74 00                                         set.

000080df <_ZZ16process_commandsvE3__c__16_>:
    80df:	6e 6f 7a 7a 6c 65 00                                nozzle.

000080e6 <_ZZ16process_commandsvE3__c__15_>:
    80e6:	4d 42 4c 00                                         MBL.

000080ea <_ZZ16process_commandsvE3__c__14_>:
    80ea:	46 52 00                                            FR.

000080ed <_ZZ16process_commandsvE3__c__13_>:
    80ed:	4c 7a 00                                            Lz.

000080f0 <_ZZ16process_commandsvE3__c__12_>:
    80f0:	4c 61 6e 67 00                                      Lang.

000080f5 <_ZZ16process_commandsvE3__c__11_>:
    80f5:	31 5f 37 35 6d 6d 5f 4d 4b 32 35 2d 52 41 4d 42     1_75mm_MK25-RAMB
    8105:	6f 31 33 61 2d 45 33 44 76 36 66 75 6c 6c 00        o13a-E3Dv6full.

00008114 <_ZZ16process_commandsvE3__c__10_>:
    8114:	52 65 76 00                                         Rev.

00008118 <process_commands()::__c>:
    8118:	33 2e 31 34 2e 31 2d 38 32 37 39 00                 3.14.1-8279.

00008124 <process_commands()::__c>:
    8124:	46 69 72 00                                         Fir.

00008128 <process_commands()::__c>:
    8128:	53 4e 20 69 6e 76 61 6c 69 64 00                    SN invalid.

00008133 <process_commands()::__c>:
    8133:	53 4e 00                                            SN.

00008136 <process_commands()::__c>:
    8136:	52 45 53 45 54 00                                   RESET.

0000813c <process_commands()::__c>:
    813c:	4d 4d 55 52 45 53 00                                MMURES.

00008143 <process_commands()::__c>:
    8143:	75 76 6c 6f 00                                      uvlo.

00008148 <process_commands()::__c>:
    8148:	46 41 4e 00                                         FAN.

0000814c <process_commands()::__c>:
    814c:	46 41 4e 50 49 4e 54 53 54 00                       FANPINTST.

00008156 <process_commands()::__c>:
    8156:	50 52 55 53 41 00                                   PRUSA.

0000815c <menu_format_sheet_E(Sheet const&, SheetFormatBuffer&)::__c>:
    815c:	25 2e 31 30 53 20 00                                %.10S .

00008163 <menu_draw_P(char, char const*, int)::__c>:
    8163:	25 34 64 00                                         %4d.

00008167 <sample_mesh_and_store_reference()::__c>:
    8167:	45 78 72 65 6d 65 20 73 70 61 6e 20 6f 66 20 74     Exreme span of t
    8177:	68 65 20 5a 20 76 61 6c 75 65 73 21 00              he Z values!.

00008184 <sample_mesh_and_store_reference()::__c>:
    8184:	25 64 2f 39 00                                      %d/9.

00008189 <lay1cal_finish()::cmd_cal_finish_8>:
    8189:	4d 31 30 34 53 30 00                                M104S0.

00008190 <lay1cal_finish()::cmd_cal_finish_6>:
    8190:	47 31 58 31 30 59 31 38 30 46 34 30 30 30 00        G1X10Y180F4000.

0000819f <lay1cal_finish()::cmd_cal_finish_5>:
    819f:	47 31 5a 31 30 46 31 33 30 30 00                    G1Z10F1300.

000081aa <lay1cal_finish()::cmd_cal_finish_4>:
    81aa:	4d 31 34 30 53 30 00                                M140S0.

000081b1 <lay1cal_finish()::cmd_cal_finish_3>:
    81b1:	47 31 45 2d 30 2e 30 37 35 46 32 31 30 30 00        G1E-0.075F2100.

000081c0 <lay1cal_before_meander()::cmd_pre_meander_6>:
    81c0:	4d 32 30 34 53 31 30 30 30 00                       M204S1000.

000081ca <lay1cal_before_meander()::cmd_pre_meander_5>:
    81ca:	47 31 5a 35 46 37 32 30 30 00                       G1Z5F7200.

000081d4 <lay1cal_before_meander()::cmd_pre_meander_4>:
    81d4:	47 31 45 2d 31 2e 35 46 32 31 30 30 00              G1E-1.5F2100.

000081e1 <lay1cal_intro_line(bool, float, float)::cmd_intro_mmu_11>:
    81e1:	47 31 5a 30 2e 32 00                                G1Z0.2.

000081e8 <lay1cal_intro_line(bool, float, float)::cmd_intro_mmu_10>:
    81e8:	47 31 58 32 30 32 2e 35 45 38 46 31 34 30 30 00     G1X202.5E8F1400.

000081f8 <lay1cal_intro_line(bool, float, float)::cmd_intro_mmu_9>:
    81f8:	47 31 59 2d 32 46 31 30 30 30 00                    G1Y-2F1000.

00008203 <lay1cal_intro_line(bool, float, float)::cmd_intro_mmu_8>:
    8203:	47 31 58 32 34 30 45 32 35 46 32 32 30 30 00        G1X240E25F2200.

00008212 <lay1cal_intro_line(bool, float, float)::cmd_intro_mmu_6>:
    8212:	47 31 5a 30 2e 33 46 31 30 30 30 00                 G1Z0.3F1000.

0000821e <lay1cal_intro_line(bool, float, float)::cmd_intro_mmu_5>:
    821e:	47 31 58 35 35 45 38 46 32 30 30 30 00              G1X55E8F2000.

0000822b <lay1cal_intro_line(bool, float, float)::cmd_intro_mmu_4>:
    822b:	47 31 58 35 45 32 39 46 31 38 30 30 00              G1X5E29F1800.

00008238 <lay1cal_intro_line(bool, float, float)::cmd_intro_mmu_3>:
    8238:	47 31 58 35 35 45 32 39 46 31 30 37 33 00           G1X55E29F1073.

00008246 <zero_extrusion>:
    8246:	47 39 32 45 30 00                                   G92E0.

0000824c <lay1cal_wait_preheat()::preheat_cmd_4>:
    824c:	47 32 38 00                                         G28.

00008250 <lay1cal_wait_preheat()::preheat_cmd_3>:
    8250:	4d 31 30 39 00                                      M109.

00008255 <lay1cal_wait_preheat()::preheat_cmd_2>:
    8255:	4d 31 39 30 00                                      M190.

0000825a <menu_fmt_float31>:
    825a:	25 2d 31 32 2e 31 32 53 25 2b 38 2e 31 66 00        %-12.12S%+8.1f.

00008269 <lcd_move_e()::__c>:
    8269:	45 78 74 72 75 64 65 72 3a 00                       Extruder:.

00008273 <lcd_menu_xyz_offset()::__c>:
    8273:	25 63 25 31 37 2e 32 66 6d 6d 00                    %c%17.2fmm.

0000827e <lcd_move_x()::__c>:
    827e:	58 3a 00                                            X:.

00008281 <lcd_move_y()::__c>:
    8281:	59 3a 00                                            Y:.

00008284 <lcd_move_z()::__c>:
    8284:	5a 3a 00                                            Z:.

00008287 <menu_fmt_float13>:
    8287:	25 63 25 2d 31 33 2e 31 33 53 25 2b 35 2e 33 66     %c%-13.13S%+5.3f
	...

00008298 <pid_extruder()::__c>:
    8298:	25 33 75 00                                         %3u.

0000829c <lcd_temp_cal_show_result(bool)::__c>:
    829c:	50 49 4e 44 41 20 63 61 6c 69 62 72 61 74 69 6f     PINDA calibratio
    82ac:	6e 20 66 61 69 6c 65 64 2e 20 43 6f 6e 74 69 6e     n failed. Contin
    82bc:	75 65 20 77 69 74 68 20 70 72 65 73 73 69 6e 67     ue with pressing
    82cc:	20 74 68 65 20 6b 6e 6f 62 2e 00                     the knob..

000082d7 <lcd_temp_cal_show_result(bool)::__c>:
    82d7:	50 49 4e 44 41 20 63 61 6c 69 62 72 61 74 69 6f     PINDA calibratio
    82e7:	6e 20 64 6f 6e 65 2e 20 43 6f 6e 74 69 6e 75 65     n done. Continue
    82f7:	20 77 69 74 68 20 70 72 65 73 73 69 6e 67 20 74      with pressing t
    8307:	68 65 20 6b 6e 6f 62 2e 00                          he knob..

00008310 <lcd_show_end_stops()::__c>:
    8310:	5a 30 00                                            Z0.

00008313 <lcd_show_end_stops()::__c>:
    8313:	5a 31 00                                            Z1.

00008316 <lcd_show_end_stops()::__c>:
    8316:	59 30 00                                            Y0.

00008319 <lcd_show_end_stops()::__c>:
    8319:	59 31 00                                            Y1.

0000831c <lcd_show_end_stops()::__c>:
    831c:	58 30 00                                            X0.

0000831f <lcd_show_end_stops()::__c>:
    831f:	58 31 00                                            X1.

00008322 <lcd_show_end_stops()::__c>:
    8322:	45 6e 64 20 73 74 6f 70 73 20 64 69 61 67 00        End stops diag.

00008331 <lcd_mesh_bedleveling()::__c>:
    8331:	47 38 30 00                                         G80.

00008335 <lcd_mesh_calibration()::__c>:
    8335:	4d 34 35 00                                         M45.

00008339 <lcd_mesh_calibration_z()::__c>:
    8339:	4d 34 35 20 5a 00                                   M45 Z.

0000833f <lcd_calibrate_pinda()::__c>:
    833f:	47 37 36 00                                         G76.

00008343 <lcd_wizard_load()::__c>:
    8343:	4d 37 30 31 20 50 30 00                             M701 P0.

0000834b <lcd_wizard(WizState)::__c>:
    834b:	57 69 7a 61 72 64 20 73 74 61 74 65 3a 20 25 64     Wizard state: %d
    835b:	0a 00                                               ..

0000835d <lcd_hw_setup_menu()::__c>:
    835d:	45 78 70 65 72 69 6d 65 6e 74 61 6c 00              Experimental.

0000836a <lcd_hw_setup_menu()::__c>:
    836a:	30 2e 38 30 00                                      0.80.

0000836f <lcd_hw_setup_menu()::__c>:
    836f:	30 2e 36 30 00                                      0.60.

00008374 <lcd_hw_setup_menu()::__c>:
    8374:	30 2e 34 30 00                                      0.40.

00008379 <lcd_hw_setup_menu()::__c>:
    8379:	30 2e 32 35 00                                      0.25.

0000837e <lcd_settings_menu()::__c>:
    837e:	44 69 73 61 62 6c 65 20 66 61 72 6d 20 6d 6f 64     Disable farm mod
    838e:	65 00                                               e.

00008390 <lcd_settings_menu()::__c>:
    8390:	52 65 73 65 74 20 4d 4d 55 00                       Reset MMU.

0000839a <lcd_settings_menu()::__c>:
    839a:	4d 4d 55 00                                         MMU.

0000839e <lcd_calibration_menu()::__c>:
    839e:	4d 34 34 00                                         M44.

000083a2 <lcd_disable_farm_mode()::__c>:
    83a2:	47 39 39 00                                         G99.

000083a6 <lcd_disable_farm_mode()::__c>:
    83a6:	44 69 73 61 62 6c 65 20 66 61 72 6d 20 6d 6f 64     Disable farm mod
    83b6:	65 3f 00                                            e?.

000083b9 <lcd_tune_menu()::__c>:
    83b9:	47 32 38 20 58 59 00                                G28 XY.

000083c0 <check_commands()::__c>:
    83c0:	4d 20 38 34 00                                      M 84.

000083c5 <lcd_sdcard_menu()::__c>:
    83c5:	85 2e 2e 00                                         ....

000083c9 <lcd_wait_for_cool_down()::__c>:
    83c9:	25 33 64 2f 30 00                                   %3d/0.

000083cf <lcd_wait_for_cool_down()::__c>:
    83cf:	25 33 64 2f 30 00                                   %3d/0.

000083d5 <lcd_selfcheck_axis(int, int)::__c>:
    83d5:	6c 63 64 5f 73 65 6c 66 63 68 65 63 6b 5f 61 78     lcd_selfcheck_ax
    83e5:	69 73 20 25 64 2c 20 25 64 0a 00                    is %d, %d..

000083f0 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)::__c>:
    83f0:	48 6f 74 65 6e 64 00                                Hotend.

000083f7 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)::__c>:
    83f7:	42 65 64 00                                         Bed.

000083fb <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)::__c>:
    83fb:	5a 00                                               Z.

000083fd <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)::__c>:
    83fd:	59 00                                               Y.

000083ff <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)::__c>:
    83ff:	58 00                                               X.

00008401 <_ZL13STR_SEPARATOR.lto_priv.417>:
    8401:	2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     ----------------
    8411:	2d 2d 2d 2d 00                                      ----.

00008416 <lcd_pinda_temp_compensation_toggle()::__c>:
    8416:	53 75 70 65 72 50 49 4e 44 41 3a 00                 SuperPINDA:.

00008422 <lay1cal_finish()::cmd_cal_finish>:
    8422:	51 67 55 67 b1 81 aa 81 9f 81 90 81 cc 68 89 81     QgUg.........h..
    8432:	8e 68                                               .h

00008434 <extrude_fmt_Y>:
    8434:	47 31 59 25 2e 34 66 45 25 2e 34 66 00              G1Y%.4fE%.4f.

00008441 <lay1cal_meander_start(float, float)::fmt1>:
    8441:	47 31 5a 25 2e 32 66 00                             G1Z%.2f.

00008449 <lay1cal_meander_start(float, float)::__c>:
    8449:	47 31 58 35 30 59 31 35 35 00                       G1X50Y155.

00008453 <lay1cal_before_meander()::cmd_pre_meander>:
    8453:	46 82 51 67 b3 6c d4 81 ca 81 c0 81                 F.Qg.l......

0000845f <extrude_fmt_X>:
    845f:	47 31 58 25 2e 34 66 45 25 2e 34 66 00              G1X%.4fE%.4f.

0000846c <feedrate_F1080>:
    846c:	47 31 46 31 30 38 30 00                             G1F1080.

00008474 <lay1cal_intro_line(bool, float, float)::cmd_intro_mmu>:
    8474:	38 82 2b 82 1e 82 12 82 46 82 03 82 f8 81 e8 81     8.+.....F.......
    8484:	e1 81                                               ..

00008486 <lay1cal_load_filament(unsigned char)::__c>:
    8486:	54 25 64 00                                         T%d.

0000848a <lay1cal_load_filament(unsigned char)::__c>:
    848a:	47 31 5a 30 2e 34 00                                G1Z0.4.

00008491 <lay1cal_load_filament(unsigned char)::__c>:
    8491:	47 31 59 2d 33 46 31 30 30 30 00                    G1Y-3F1000.

0000849c <lay1cal_wait_preheat()::preheat_cmd>:
    849c:	55 67 55 82 50 82 4c 82 46 82                       UgU.P.L.F.

000084a6 <lcd_commands()::__c>:
    84a6:	4d 38 34 20 58 59 00                                M84 XY.

000084ad <lcd_commands()::__c>:
    84ad:	4d 31 30 39 20 53 32 38 30 00                       M109 S280.

000084b7 <lcd_commands()::__c>:
    84b7:	47 31 20 58 31 32 35 20 5a 32 30 30 20 46 31 30     G1 X125 Z200 F10
    84c7:	30 30 00                                            00.

000084ca <lcd_commands()::__c>:
    84ca:	49 6e 76 61 6c 69 64 20 50 49 44 20 63 61 6c 2e     Invalid PID cal.
    84da:	20 72 65 73 75 6c 74 73 2e 20 4e 6f 74 20 73 74      results. Not st
    84ea:	6f 72 65 64 20 74 6f 20 45 45 50 52 4f 4d 2e 00     ored to EEPROM..

000084fa <lcd_commands()::__c>:
    84fa:	4d 33 30 31 20 50 25 2e 32 66 20 49 25 2e 32 66     M301 P%.2f I%.2f
    850a:	20 44 25 2e 32 66 00                                 D%.2f.

00008511 <lcd_commands()::__c>:
    8511:	4d 33 30 33 20 45 30 20 53 25 33 75 00              M303 E0 S%3u.

0000851e <STR_REVISION_RC>:
    851e:	52 43 00                                            RC.

00008521 <STR_REVISION_DEV>:
    8521:	44 45 56 00                                         DEV.

00008525 <STR_REVISION_BETA>:
    8525:	42 45 54 41 00                                      BETA.

0000852a <STR_REVISION_ALPHA>:
    852a:	41 4c 50 48 41 00                                   ALPHA.

00008530 <port_to_mode_PGM>:
    8530:	00 00 21 00 24 00 27 00 2a 00 2d 00 30 00 33 00     ..!.$.'.*.-.0.3.
    8540:	01 01 00 00 04 01 07 01 0a 01                       ..........

0000854a <port_to_output_PGM>:
    854a:	00 00 22 00 25 00 28 00 2b 00 2e 00 31 00 34 00     ..".%.(.+...1.4.
    855a:	02 01 00 00 05 01 08 01 0b 01                       ..........

00008564 <port_to_input_PGM>:
    8564:	00 00 20 00 23 00 26 00 29 00 2c 00 2f 00 32 00     .. .#.&.).,./.2.
    8574:	00 01 00 00 03 01 06 01 09 01                       ..........

0000857e <digital_pin_to_port_PGM>:
    857e:	05 05 05 05 07 05 08 08 08 08 02 02 02 02 0a 0a     ................
    858e:	08 08 04 04 04 04 01 01 01 01 01 01 01 01 03 03     ................
    859e:	03 03 03 03 03 03 04 07 07 07 0c 0c 0c 0c 0c 0c     ................
    85ae:	0c 0c 02 02 02 02 06 06 06 06 06 06 06 06 0b 0b     ................
    85be:	0b 0b 0b 0b 0b 0b 07 07 0a 0a 0a 0a 0a 0a 05 05     ................
    85ce:	05 04 04 04 08 08                                   ......

000085d4 <digital_pin_to_bit_mask_PGM>:
    85d4:	01 02 10 20 20 08 08 10 20 40 10 20 40 80 02 01     ...  ... @. @...
    85e4:	02 01 08 04 02 01 01 02 04 08 10 20 40 80 80 40     ........... @..@
    85f4:	20 10 08 04 02 01 80 04 02 01 80 40 20 10 08 04      ..........@ ...
    8604:	02 01 08 04 02 01 01 02 04 08 10 20 40 80 01 02     ........... @...
    8614:	04 08 10 20 40 80 10 08 04 08 80 10 20 40 04 40     ... @....... @.@
    8624:	80 10 20 40 04 80                                   .. @..

0000862a <digital_pin_to_timer_PGM>:
    862a:	00 00 0a 0b 02 09 0c 0d 0e 08 07 03 04 01 00 00     ................
	...
    8656:	12 11 10 00 00 00 00 00 00 00 00 00 00 00 00 00     ................
	...

00008680 <lcd_splash()::__c>:
    8680:	33 2e 31 34 2e 31 00                                3.14.1.

00008687 <lcd_splash()::__c>:
    8687:	0a 20 4f 72 69 67 69 6e 61 6c 20 50 72 75 73 61     . Original Prusa
    8697:	20 69 33 0a 20 20 20 50 72 75 73 61 20 52 65 73      i3.   Prusa Res
    86a7:	65 61 72 63 68 0a 25 32 30 2e 32 30 53 00           earch.%20.20S.

000086b5 <SpoolJoin::SpoolJoin::initSpoolJoinStatus()::__c>:
    86b5:	53 70 6f 6f 6c 4a 6f 69 6e 20 69 73 20 00           SpoolJoin is .

000086c3 <adc_init()::__c>:
    86c3:	61 64 63 5f 69 6e 69 74 00                          adc_init.

000086cc <reset_menu()::__c>:
    86cc:	20 0a 20 0a 20 0a 20 00                              . . . .

000086d4 <reset_menu()::__c>:
    86d4:	41 6c 6c 20 44 61 74 61 00                          All Data.

000086dd <reset_menu()::__c>:
    86dd:	53 65 72 76 69 63 65 20 70 72 65 70 00              Service prep.

000086ea <reset_menu()::__c>:
    86ea:	53 68 69 70 70 69 6e 67 20 70 72 65 70 00           Shipping prep.

000086f8 <reset_menu()::__c>:
    86f8:	53 74 61 74 69 73 74 69 63 73 00                    Statistics.

00008703 <reset_menu()::__c>:
    8703:	4c 61 6e 67 75 61 67 65 00                          Language.

0000870c <_ZZL13factory_resetcE3__c.lto_priv.494>:
    870c:	45 52 41 53 49 4e 47 20 61 6c 6c 20 64 61 74 61     ERASING all data
	...

0000871d <factory_reset()::__c>:
    871d:	46 61 63 74 6f 72 79 20 52 45 53 45 54 00           Factory RESET.

0000872b <FW_PRUSA3D_MAGIC_STR>:
    872b:	50 52 55 53 41 33 44 46 57 00                       PRUSA3DFW.

00008735 <FW_VERSION_NR>:
    8735:	03 00 0e 00 01 00 40 00                             ......@.

0000873d <setup::v3_2_0_4>:
    873d:	03 00 02 00 00 00 04 00                             ........

00008745 <setup::__c>:
    8745:	70 72 75 73 61 33 64 00                             prusa3d.

0000874d <setup::__c>:
    874d:	32 30 32 35 2d 30 34 2d 32 32 20 32 32 3a 30 33     2025-04-22 22:03
    875d:	3a 35 33 00                                         :53.

00008761 <setup::__c>:
    8761:	20 33 2e 31 34 2e 31 2d 38 32 37 39 5f 37 37 33      3.14.1-8279_773
    8771:	31 30 32 34 65 64 00                                1024ed.

00008778 <setup::__c>:
    8778:	73 74 61 72 74 00                                   start.

0000877e <loop::__c>:
    877e:	4d 32 39 00                                         M29.

00008782 <menu_format_sheet_select_E(Sheet const&, SheetFormatBuffer&)::__c>:
    8782:	25 2d 39 2e 39 53 5b 00                             %-9.9S[.

0000878a <choose_menu_P(char const*, char const*, char const*)::__c>:
    878a:	20 0a 20 0a 20 00                                    . . .

00008790 <load_to_nozzle_sequence>:
    8790:	00 00 48 42 00 00 58 41 9a 99 8d 41 33 33 53 40     ..HB..XA...A33S@

000087a0 <mmu2Magic>:
    87a0:	4d 4d 55 32 3a 00                                   MMU2:.

000087a6 <m2bed>:
    87a6:	4d 49 4e 54 45 4d 50 20 42 45 44 20 66 69 78 65     MINTEMP BED fixe
    87b6:	64 00                                               d.

000087b8 <m2hotend>:
    87b8:	4d 49 4e 54 45 4d 50 20 48 4f 54 45 4e 44 20 66     MINTEMP HOTEND f
    87c8:	69 78 65 64 00                                      ixed.

000087cd <mmu2Magic>:
    87cd:	4d 4d 55 32 3a 00                                   MMU2:.

000087d3 <MMU2::ReportErrorHookDynamicRender()::__c>:
    87d3:	25 33 64 00                                         %3d.

000087d7 <MMU2::TuneItems>:
    87d7:	18 01 04 19 02 0a                                   ......

000087dd <MMU2::errorDescs>:
    87dd:	5e 55 e8 54 6e 54 01 54 b8 53 26 53 ae 52 46 52     ^U.TnT.T.S&S.RFR
    87ed:	f7 51 d7 51 8b 51 d7 51 74 51 74 51 74 51 74 51     .Q.Q.Q.QtQtQtQtQ
    87fd:	74 51 74 51 74 51 74 51 74 51 74 51 74 51 74 51     tQtQtQtQtQtQtQtQ
    880d:	74 51 74 51 74 51 74 51 74 51 74 51 74 51 74 51     tQtQtQtQtQtQtQtQ
    881d:	74 51 74 51 3d 51 fc 50 b2 50 3f 50 0a 50 c0 4f     tQtQ=Q.P.P?P.P.O
    882d:	76 4f 18 4f df 4e 9d 4e 80 4e                       vO.O.N.N.N

00008837 <MMU2::errorButtons>:
    8837:	01 01 01 01 01 01 01 02 71 01 71 01 32 32 32 03     ........q.q.222.
    8847:	03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03     ................
    8857:	03 03 93 93 24 38 03 93 03 01 02 56 03              ....$8.....V.

00008864 <MMU2::errorCodes>:
    8864:	65 00 66 00 67 00 68 00 69 00 6a 00 6b 00 6c 00     e.f.g.h.i.j.k.l.
    8874:	73 00 74 00 7d 00 7e 00 c9 00 d3 00 dd 00 ca 00     s.t.}.~.........
    8884:	d4 00 de 00 2d 01 37 01 41 01 2e 01 38 01 42 01     ....-.7.A...8.B.
    8894:	2f 01 39 01 43 01 30 01 3a 01 44 01 31 01 3b 01     /.9.C.0.:.D.1.;.
    88a4:	45 01 32 01 91 01 92 01 f5 01 f6 01 f7 01 f8 01     E.2.............
    88b4:	f9 01 fa 01 fb 01 fc 01 84 03                       ..........

000088be <MMU2::btnOperation>:
    88be:	eb 55 01 56 e0 55 d7 55 d0 55 46 58 e6 47 c9 55     .U.V.U.U.UFX.G.U
    88ce:	bf 55                                               .U

000088d0 <MMU2::ReportErrorHookStaticRender(unsigned char)::__c>:
    88d0:	25 2e 32 30 53 0a 70 72 75 73 61 2e 69 6f 2f 30     %.20S.prusa.io/0
    88e0:	34 25 68 75 00                                      4%hu.

000088e5 <prusa_statistics_err(char)::__c>:
    88e5:	7b 5b 45 52 52 3a 00                                {[ERR:.

000088ec <_ZL14FW_VERSION_STR.lto_priv.497>:
    88ec:	33 2e 31 34 2e 31 00                                3.14.1.

000088f3 <prusa_stat_printinfo()::__c>:
    88f3:	5d 5b 46 57 52 3a 00                                ][FWR:.

000088fa <prusa_stat_printinfo()::__c>:
    88fa:	5d 5b 54 49 4d 3a 00                                ][TIM:.

00008901 <prusa_stat_printinfo()::__c>:
    8901:	5d 5b 46 4e 4d 3a 00                                ][FNM:.

00008908 <prusa_stat_printinfo()::__c>:
    8908:	5d 5b 46 45 4d 3a 00                                ][FEM:.

0000890f <prusa_stat_printinfo()::__c>:
    890f:	5d 5b 50 43 44 3a 00                                ][PCD:.

00008916 <prusa_stat_printinfo()::__c>:
    8916:	5b 54 46 55 3a 00                                   [TFU:.

0000891c <prusa_stat_printerstatus(unsigned char)::__c>:
    891c:	5b 50 52 4e 3a 00                                   [PRN:.

00008922 <prusa_stat_farm_number()::__c>:
    8922:	5b 50 46 4e 3a 30 5d 00                             [PFN:0].

0000892a <prusa_stat_diameter()::__c>:
    892a:	5b 44 49 41 3a 00                                   [DIA:.

00008930 <prusa_stat_temperatures()::__c>:
    8930:	5d 5b 41 54 42 3a 00                                ][ATB:.

00008937 <prusa_stat_temperatures()::__c>:
    8937:	5d 5b 41 54 30 3a 00                                ][AT0:.

0000893e <prusa_stat_temperatures()::__c>:
    893e:	5d 5b 53 54 42 3a 00                                ][STB:.

00008945 <prusa_stat_temperatures()::__c>:
    8945:	5b 53 54 30 3a 00                                   [ST0:.

0000894b <prusa_statistics(unsigned char)::__c>:
    894b:	7b 5b 50 52 4e 3a 35 5d 00                          {[PRN:5].

00008954 <prusa_statistics(unsigned char)::__c>:
    8954:	7b 5b 50 52 4e 3a 30 5d 00                          {[PRN:0].

0000895d <prusa_statistics(unsigned char)::__c>:
    895d:	7b 5b 50 52 4e 3a 39 5d 00                          {[PRN:9].

00008966 <prusa_statistics(unsigned char)::__c>:
    8966:	7b 5b 50 52 4e 3a 38 5d 00                          {[PRN:8].

0000896f <prusa_statistics(unsigned char)::__c>:
    896f:	7b 5b 52 45 53 3a 30 5d 5b 46 49 4c 3a 00           {[RES:0][FIL:.

0000897d <prusa_statistics(unsigned char)::__c>:
    897d:	7b 5b 52 45 53 3a 31 5d 5b 46 49 4c 3a 00           {[RES:1][FIL:.

0000898b <crctab>:
    898b:	00 00 21 10 42 20 63 30 84 40 a5 50 c6 60 e7 70     ..!.B c0.@.P.`.p
    899b:	08 81 29 91 4a a1 6b b1 8c c1 ad d1 ce e1 ef f1     ..).J.k.........
    89ab:	31 12 10 02 73 32 52 22 b5 52 94 42 f7 72 d6 62     1...s2R".R.B.r.b
    89bb:	39 93 18 83 7b b3 5a a3 bd d3 9c c3 ff f3 de e3     9...{.Z.........
    89cb:	62 24 43 34 20 04 01 14 e6 64 c7 74 a4 44 85 54     b$C4 ....d.t.D.T
    89db:	6a a5 4b b5 28 85 09 95 ee e5 cf f5 ac c5 8d d5     j.K.(...........
    89eb:	53 36 72 26 11 16 30 06 d7 76 f6 66 95 56 b4 46     S6r&..0..v.f.V.F
    89fb:	5b b7 7a a7 19 97 38 87 df f7 fe e7 9d d7 bc c7     [.z...8.........
    8a0b:	c4 48 e5 58 86 68 a7 78 40 08 61 18 02 28 23 38     .H.X.h.x@.a..(#8
    8a1b:	cc c9 ed d9 8e e9 af f9 48 89 69 99 0a a9 2b b9     ........H.i...+.
    8a2b:	f5 5a d4 4a b7 7a 96 6a 71 1a 50 0a 33 3a 12 2a     .Z.J.z.jq.P.3:.*
    8a3b:	fd db dc cb bf fb 9e eb 79 9b 58 8b 3b bb 1a ab     ........y.X.;...
    8a4b:	a6 6c 87 7c e4 4c c5 5c 22 2c 03 3c 60 0c 41 1c     .l.|.L.\",.<`.A.
    8a5b:	ae ed 8f fd ec cd cd dd 2a ad 0b bd 68 8d 49 9d     ........*...h.I.
    8a6b:	97 7e b6 6e d5 5e f4 4e 13 3e 32 2e 51 1e 70 0e     .~.n.^.N.>2.Q.p.
    8a7b:	9f ff be ef dd df fc cf 1b bf 3a af 59 9f 78 8f     ..........:.Y.x.
    8a8b:	88 91 a9 81 ca b1 eb a1 0c d1 2d c1 4e f1 6f e1     ..........-.N.o.
    8a9b:	80 10 a1 00 c2 30 e3 20 04 50 25 40 46 70 67 60     .....0. .P%@Fpg`
    8aab:	b9 83 98 93 fb a3 da b3 3d c3 1c d3 7f e3 5e f3     ........=.....^.
    8abb:	b1 02 90 12 f3 22 d2 32 35 42 14 52 77 62 56 72     .....".25B.RwbVr
    8acb:	ea b5 cb a5 a8 95 89 85 6e f5 4f e5 2c d5 0d c5     ........n.O.,...
    8adb:	e2 34 c3 24 a0 14 81 04 66 74 47 64 24 54 05 44     .4.$....ftGd$T.D
    8aeb:	db a7 fa b7 99 87 b8 97 5f e7 7e f7 1d c7 3c d7     ........_.~...<.
    8afb:	d3 26 f2 36 91 06 b0 16 57 66 76 76 15 46 34 56     .&.6....Wfvv.F4V
    8b0b:	4c d9 6d c9 0e f9 2f e9 c8 99 e9 89 8a b9 ab a9     L.m.../.........
    8b1b:	44 58 65 48 06 78 27 68 c0 18 e1 08 82 38 a3 28     DXeH.x'h.....8.(
    8b2b:	7d cb 5c db 3f eb 1e fb f9 8b d8 9b bb ab 9a bb     }.\.?...........
    8b3b:	75 4a 54 5a 37 6a 16 7a f1 0a d0 1a b3 2a 92 3a     uJTZ7j.z.....*.:
    8b4b:	2e fd 0f ed 6c dd 4d cd aa bd 8b ad e8 9d c9 8d     ....l.M.........
    8b5b:	26 7c 07 6c 64 5c 45 4c a2 3c 83 2c e0 1c c1 0c     &|.ld\EL.<.,....
    8b6b:	1f ef 3e ff 5d cf 7c df 9b af ba bf d9 8f f8 9f     ..>.].|.........
    8b7b:	17 6e 36 7e 55 4e 74 5e 93 2e b2 3e d1 0e f0 1e     .n6~UNt^...>....

00008b8b <SdBaseFile::make83Name(char const*, unsigned char*, char const**)::__c>:
    8b8b:	7c 3c 3e 3f 2f 2a 22 5c 00                          |<>?/*"\.

00008b94 <speed_lookuptable_slow>:
    8b94:	24 f4 d4 30 50 c3 8e 20 c2 a2 40 17 82 8b 70 11     $..0P.. ..@...p.
    8ba4:	12 7a 91 0d 81 6c d9 0a a8 61 e1 08 c7 58 66 07     .z...l...a...Xf.
    8bb4:	61 51 43 06 1e 4b 5d 05 c1 45 a7 04 1a 41 11 04     aQC..K]..E...A..
    8bc4:	09 3d 98 03 71 39 31 03 40 36 db 02 65 33 91 02     .=..q91.@6..e3..
    8bd4:	d4 30 54 02 80 2e 1d 02 63 2c ee 01 75 2a c5 01     .0T.....c,..u*..
    8be4:	b0 28 a0 01 10 27 81 01 8f 25 64 01 2b 24 4b 01     .(...'...%d.+$K.
    8bf4:	e0 22 34 01 ac 21 1f 01 8d 20 0d 01 80 1f fc 00     ."4..!... ......
    8c04:	84 1e ed 00 97 1d df 00 b8 1c d2 00 e6 1b c6 00     ................
    8c14:	20 1b bc 00 64 1a b2 00 b2 19 a8 00 0a 19 a0 00      ...d...........
    8c24:	6a 18 99 00 d1 17 91 00 40 17 8b 00 b5 16 84 00     j.......@.......
    8c34:	31 16 7e 00 b3 15 79 00 3a 15 73 00 c7 14 6f 00     1.~...y.:.s...o.
    8c44:	58 14 6a 00 ee 13 66 00 88 13 63 00 25 13 5e 00     X.j...f...c.%.^.
    8c54:	c7 12 5b 00 6c 12 57 00 15 12 54 00 c1 11 51 00     ..[.l.W...T...Q.
    8c64:	70 11 4f 00 21 11 4b 00 d6 10 49 00 8d 10 47 00     p.O.!.K...I...G.
    8c74:	46 10 44 00 02 10 42 00 c0 0f 40 00 80 0f 3e 00     F.D...B...@...>.
    8c84:	42 0f 3c 00 06 0f 3b 00 cb 0e 38 00 93 0e 37 00     B.<...;...8...7.
    8c94:	5c 0e 35 00 27 0e 34 00 f3 0d 32 00 c1 0d 31 00     \.5.'.4...2...1.
    8ca4:	90 0d 30 00 60 0d 2e 00 32 0d 2d 00 05 0d 2c 00     ..0.`...2.-...,.
    8cb4:	d9 0c 2b 00 ae 0c 29 00 85 0c 29 00 5c 0c 27 00     ..+...)...).\.'.
    8cc4:	35 0c 27 00 0e 0c 26 00 e8 0b 24 00 c4 0b 24 00     5.'...&...$...$.
    8cd4:	a0 0b 23 00 7d 0b 23 00 5a 0b 21 00 39 0b 21 00     ..#.}.#.Z.!.9.!.
    8ce4:	18 0b 20 00 f8 0a 1f 00 d9 0a 1e 00 bb 0a 1e 00     .. .............
    8cf4:	9d 0a 1d 00 80 0a 1d 00 63 0a 1c 00 47 0a 1b 00     ........c...G...
    8d04:	2c 0a 1b 00 11 0a 1a 00 f7 09 1a 00 dd 09 19 00     ,...............
    8d14:	c4 09 19 00 ab 09 19 00 92 09 17 00 7b 09 18 00     ............{...
    8d24:	63 09 17 00 4c 09 16 00 36 09 16 00 20 09 16 00     c...L...6... ...
    8d34:	0a 09 15 00 f5 08 15 00 e0 08 14 00 cc 08 14 00     ................
    8d44:	b8 08 14 00 a4 08 14 00 90 08 13 00 7d 08 12 00     ............}...
    8d54:	6b 08 13 00 58 08 12 00 46 08 12 00 34 08 11 00     k...X...F...4...
    8d64:	23 08 11 00 12 08 11 00 01 08 11 00 f0 07 10 00     #...............
    8d74:	e0 07 10 00 d0 07 10 00 c0 07 10 00 b0 07 0f 00     ................
    8d84:	a1 07 10 00 91 07 0e 00 83 07 0f 00 74 07 0f 00     ............t...
    8d94:	65 07 0e 00 57 07 0e 00 49 07 0e 00 3b 07 0d 00     e...W...I...;...
    8da4:	2e 07 0e 00 20 07 0d 00 13 07 0d 00 06 07 0d 00     .... ...........
    8db4:	f9 06 0c 00 ed 06 0d 00 e0 06 0c 00 d4 06 0c 00     ................
    8dc4:	c8 06 0c 00 bc 06 0c 00 b0 06 0c 00 a4 06 0b 00     ................
    8dd4:	99 06 0c 00 8d 06 0b 00 82 06 0b 00 77 06 0b 00     ............w...
    8de4:	6c 06 0b 00 61 06 0a 00 57 06 0b 00 4c 06 0a 00     l...a...W...L...
    8df4:	42 06 0a 00 38 06 0a 00 2e 06 0a 00 24 06 0a 00     B...8.......$...
    8e04:	1a 06 0a 00 10 06 09 00 07 06 0a 00 fd 05 09 00     ................
    8e14:	f4 05 09 00 eb 05 09 00 e2 05 09 00 d9 05 09 00     ................
    8e24:	d0 05 09 00 c7 05 09 00 be 05 09 00 b5 05 08 00     ................
    8e34:	ad 05 08 00 a5 05 09 00 9c 05 08 00 94 05 08 00     ................
    8e44:	8c 05 08 00 84 05 08 00 7c 05 08 00 74 05 08 00     ........|...t...
    8e54:	6c 05 07 00 65 05 08 00 5d 05 07 00 56 05 08 00     l...e...]...V...
    8e64:	4e 05 07 00 47 05 07 00 40 05 08 00 38 05 07 00     N...G...@...8...
    8e74:	31 05 07 00 2a 05 07 00 23 05 07 00 1c 05 06 00     1...*...#.......
    8e84:	16 05 07 00 0f 05 07 00 08 05 06 00 02 05 07 00     ................
    8e94:	fb 04 06 00 f5 04 07 00 ee 04 06 00 e8 04 06 00     ................
    8ea4:	e2 04 07 00 db 04 06 00 d5 04 06 00 cf 04 06 00     ................
    8eb4:	c9 04 06 00 c3 04 06 00 bd 04 06 00 b7 04 06 00     ................
    8ec4:	b1 04 05 00 ac 04 06 00 a6 04 06 00 a0 04 05 00     ................
    8ed4:	9b 04 06 00 95 04 05 00 90 04 06 00 8a 04 05 00     ................
    8ee4:	85 04 05 00 80 04 06 00 7a 04 05 00 75 04 05 00     ........z...u...
    8ef4:	70 04 05 00 6b 04 05 00 66 04 05 00 61 04 05 00     p...k...f...a...
    8f04:	5c 04 05 00 57 04 05 00 52 04 05 00 4d 04 05 00     \...W...R...M...
    8f14:	48 04 05 00 43 04 05 00 3e 04 04 00 3a 04 05 00     H...C...>...:...
    8f24:	35 04 05 00 30 04 04 00 2c 04 05 00 27 04 04 00     5...0...,...'...
    8f34:	23 04 05 00 1e 04 04 00 1a 04 04 00 16 04 05 00     #...............
    8f44:	11 04 04 00 0d 04 04 00 09 04 05 00 04 04 04 00     ................
    8f54:	00 04 04 00 fc 03 04 00 f8 03 04 00 f4 03 04 00     ................
    8f64:	f0 03 04 00 ec 03 04 00 e8 03 04 00 e4 03 04 00     ................
    8f74:	e0 03 04 00 dc 03 04 00 d8 03 04 00 d4 03 04 00     ................
    8f84:	d0 03 04 00 cc 03 04 00 c8 03 03 00 c5 03 03 00     ................

00008f94 <speed_lookuptable_fast>:
    8f94:	24 f4 04 d9 20 1b c4 0c 5c 0e 98 04 c4 09 5f 02     $... ...\....._.
    8fa4:	65 07 71 01 f4 05 f9 00 fb 04 b3 00 48 04 87 00     e.q.........H...
    8fb4:	c1 03 69 00 58 03 55 00 03 03 45 00 be 02 3a 00     ..i.X.U...E...:.
    8fc4:	84 02 31 00 53 02 2a 00 29 02 25 00 04 02 20 00     ..1.S.*.).%... .
    8fd4:	e4 01 1c 00 c8 01 19 00 af 01 17 00 98 01 14 00     ................
    8fe4:	84 01 13 00 71 01 10 00 61 01 10 00 51 01 0e 00     ....q...a...Q...
    8ff4:	43 01 0d 00 36 01 0b 00 2b 01 0b 00 20 01 0b 00     C...6...+... ...
    9004:	15 01 09 00 0c 01 09 00 03 01 08 00 fb 00 08 00     ................
    9014:	f3 00 08 00 eb 00 07 00 e4 00 06 00 de 00 06 00     ................
    9024:	d8 00 06 00 d2 00 06 00 cc 00 05 00 c7 00 05 00     ................
    9034:	c2 00 05 00 bd 00 04 00 b9 00 04 00 b5 00 04 00     ................
    9044:	b1 00 04 00 ad 00 04 00 a9 00 04 00 a5 00 03 00     ................
    9054:	a2 00 03 00 9f 00 04 00 9b 00 03 00 98 00 03 00     ................
    9064:	95 00 02 00 93 00 03 00 90 00 03 00 8d 00 02 00     ................
    9074:	8b 00 03 00 88 00 02 00 86 00 02 00 84 00 03 00     ................
    9084:	81 00 02 00 7f 00 02 00 7d 00 02 00 7b 00 02 00     ........}...{...
    9094:	79 00 02 00 77 00 01 00 76 00 02 00 74 00 02 00     y...w...v...t...
    90a4:	72 00 01 00 71 00 02 00 6f 00 02 00 6d 00 01 00     r...q...o...m...
    90b4:	6c 00 02 00 6a 00 01 00 69 00 02 00 67 00 01 00     l...j...i...g...
    90c4:	66 00 01 00 65 00 01 00 64 00 02 00 62 00 01 00     f...e...d...b...
    90d4:	61 00 01 00 60 00 01 00 5f 00 02 00 5d 00 01 00     a...`..._...]...
    90e4:	5c 00 01 00 5b 00 01 00 5a 00 01 00 59 00 01 00     \...[...Z...Y...
    90f4:	58 00 01 00 57 00 01 00 56 00 01 00 55 00 01 00     X...W...V...U...
    9104:	54 00 01 00 53 00 00 00 53 00 01 00 52 00 01 00     T...S...S...R...
    9114:	51 00 01 00 50 00 01 00 4f 00 01 00 4e 00 00 00     Q...P...O...N...
    9124:	4e 00 01 00 4d 00 01 00 4c 00 01 00 4b 00 00 00     N...M...L...K...
    9134:	4b 00 01 00 4a 00 01 00 49 00 01 00 48 00 00 00     K...J...I...H...
    9144:	48 00 01 00 47 00 01 00 46 00 00 00 46 00 01 00     H...G...F...F...
    9154:	45 00 00 00 45 00 01 00 44 00 01 00 43 00 00 00     E...E...D...C...
    9164:	43 00 01 00 42 00 00 00 42 00 01 00 41 00 00 00     C...B...B...A...
    9174:	41 00 01 00 40 00 01 00 3f 00 00 00 3f 00 01 00     A...@...?...?...
    9184:	3e 00 00 00 3e 00 01 00 3d 00 00 00 3d 00 01 00     >...>...=...=...
    9194:	3c 00 00 00 3c 00 00 00 3c 00 01 00 3b 00 00 00     <...<...<...;...
    91a4:	3b 00 01 00 3a 00 00 00 3a 00 01 00 39 00 00 00     ;...:...:...9...
    91b4:	39 00 01 00 38 00 00 00 38 00 00 00 38 00 01 00     9...8...8...8...
    91c4:	37 00 00 00 37 00 01 00 36 00 00 00 36 00 00 00     7...7...6...6...
    91d4:	36 00 01 00 35 00 00 00 35 00 00 00 35 00 01 00     6...5...5...5...
    91e4:	34 00 00 00 34 00 00 00 34 00 01 00 33 00 00 00     4...4...4...3...
    91f4:	33 00 00 00 33 00 01 00 32 00 00 00 32 00 00 00     3...3...2...2...
    9204:	32 00 01 00 31 00 00 00 31 00 00 00 31 00 01 00     2...1...1...1...
    9214:	30 00 00 00 30 00 00 00 30 00 01 00 2f 00 00 00     0...0...0.../...
    9224:	2f 00 00 00 2f 00 00 00 2f 00 01 00 2e 00 00 00     /.../.../.......
    9234:	2e 00 00 00 2e 00 01 00 2d 00 00 00 2d 00 00 00     ........-...-...
    9244:	2d 00 00 00 2d 00 01 00 2c 00 00 00 2c 00 00 00     -...-...,...,...
    9254:	2c 00 00 00 2c 00 01 00 2b 00 00 00 2b 00 00 00     ,...,...+...+...
    9264:	2b 00 00 00 2b 00 01 00 2a 00 00 00 2a 00 00 00     +...+...*...*...
    9274:	2a 00 00 00 2a 00 01 00 29 00 00 00 29 00 00 00     *...*...)...)...
    9284:	29 00 00 00 29 00 00 00 29 00 01 00 28 00 00 00     )...)...)...(...
    9294:	28 00 00 00 28 00 00 00 28 00 00 00 28 00 01 00     (...(...(...(...
    92a4:	27 00 00 00 27 00 00 00 27 00 00 00 27 00 00 00     '...'...'...'...
    92b4:	27 00 01 00 26 00 00 00 26 00 00 00 26 00 00 00     '...&...&...&...
    92c4:	26 00 00 00 26 00 01 00 25 00 00 00 25 00 00 00     &...&...%...%...
    92d4:	25 00 00 00 25 00 00 00 25 00 00 00 25 00 01 00     %...%...%...%...
    92e4:	24 00 00 00 24 00 00 00 24 00 00 00 24 00 00 00     $...$...$...$...
    92f4:	24 00 01 00 23 00 00 00 23 00 00 00 23 00 00 00     $...#...#...#...
    9304:	23 00 00 00 23 00 00 00 23 00 00 00 23 00 01 00     #...#...#...#...
    9314:	22 00 00 00 22 00 00 00 22 00 00 00 22 00 00 00     "..."..."..."...
    9324:	22 00 00 00 22 00 01 00 21 00 00 00 21 00 00 00     "..."...!...!...
    9334:	21 00 00 00 21 00 00 00 21 00 00 00 21 00 00 00     !...!...!...!...
    9344:	21 00 01 00 20 00 00 00 20 00 00 00 20 00 00 00     !... ... ... ...
    9354:	20 00 00 00 20 00 00 00 20 00 00 00 20 00 00 00      ... ... ... ...
    9364:	20 00 01 00 1f 00 00 00 1f 00 00 00 1f 00 00 00      ...............
    9374:	1f 00 00 00 1f 00 00 00 1f 00 00 00 1f 00 01 00     ................
    9384:	1e 00 00 00 1e 00 00 00 1e 00 00 00 1e 00 00 00     ................

00009394 <microstep_readings()::__c>:
    9394:	45 30 3a 20 00                                      E0: .

00009399 <microstep_readings()::__c>:
    9399:	5a 3a 20 00                                         Z: .

0000939d <microstep_readings()::__c>:
    939d:	59 3a 20 00                                         Y: .

000093a1 <microstep_readings()::__c>:
    93a1:	58 3a 20 00                                         X: .

000093a5 <microstep_readings()::__c>:
    93a5:	4d 53 31 2c 4d 53 32 20 50 69 6e 73 00              MS1,MS2 Pins.

000093b2 <_ZZ12PID_autotunefiiE3__c__16_>:
    93b2:	50 49 44 20 41 75 74 6f 74 75 6e 65 20 66 69 6e     PID Autotune fin
    93c2:	69 73 68 65 64 21 20 50 75 74 20 74 68 65 20 6c     ished! Put the l
    93d2:	61 73 74 20 4b 70 2c 20 4b 69 20 61 6e 64 20 4b     ast Kp, Ki and K
    93e2:	64 20 63 6f 6e 73 74 61 6e 74 73 20 66 72 6f 6d     d constants from
    93f2:	20 61 62 6f 76 65 20 69 6e 74 6f 20 43 6f 6e 66      above into Conf
    9402:	69 67 75 72 61 74 69 6f 6e 2e 68 00                 iguration.h.

0000940e <_ZZ12PID_autotunefiiE3__c__15_>:
    940e:	50 49 44 20 41 75 74 6f 74 75 6e 65 20 66 61 69     PID Autotune fai
    941e:	6c 65 64 21 20 74 69 6d 65 6f 75 74 00              led! timeout.

0000942b <_ZZ12PID_autotunefiiE3__c__14_>:
    942b:	20 40 3a 00                                          @:.

0000942f <_ZZ12PID_autotunefiiE3__c__13_>:
    942f:	54 3a 00                                            T:.

00009432 <_ZZ12PID_autotunefiiE3__c__12_>:
    9432:	42 3a 00                                            B:.

00009435 <_ZZ12PID_autotunefiiE3__c__11_>:
    9435:	50 49 44 20 41 75 74 6f 74 75 6e 65 20 66 61 69     PID Autotune fai
    9445:	6c 65 64 21 20 54 65 6d 70 65 72 61 74 75 72 65     led! Temperature
    9455:	20 74 6f 6f 20 68 69 67 68 00                        too high.

0000945f <_ZZ12PID_autotunefiiE3__c__10_>:
    945f:	20 4b 64 3a 20 00                                    Kd: .

00009465 <PID_autotune(float, int, int)::__c>:
    9465:	20 4b 69 3a 20 00                                    Ki: .

0000946b <PID_autotune(float, int, int)::__c>:
    946b:	20 4b 70 3a 20 00                                    Kp: .

00009471 <PID_autotune(float, int, int)::__c>:
    9471:	20 43 6c 61 73 73 69 63 20 50 49 44 20 00            Classic PID .

0000947f <PID_autotune(float, int, int)::__c>:
    947f:	20 54 75 3a 20 00                                    Tu: .

00009485 <PID_autotune(float, int, int)::__c>:
    9485:	20 4b 75 3a 20 00                                    Ku: .

0000948b <PID_autotune(float, int, int)::__c>:
    948b:	20 6d 61 78 3a 20 00                                 max: .

00009492 <PID_autotune(float, int, int)::__c>:
    9492:	20 6d 69 6e 3a 20 00                                 min: .

00009499 <PID_autotune(float, int, int)::__c>:
    9499:	20 64 3a 20 00                                       d: .

0000949e <PID_autotune(float, int, int)::__c>:
    949e:	20 62 69 61 73 3a 20 00                              bias: .

000094a6 <PID_autotune(float, int, int)::__c>:
    94a6:	50 49 44 20 41 75 74 6f 74 75 6e 65 20 73 74 61     PID Autotune sta
    94b6:	72 74 00                                            rt.

000094b9 <PID_autotune(float, int, int)::__c>:
    94b9:	50 49 44 20 41 75 74 6f 74 75 6e 65 20 66 61 69     PID Autotune fai
    94c9:	6c 65 64 2e 20 42 61 64 20 65 78 74 72 75 64 65     led. Bad extrude
    94d9:	72 20 6e 75 6d 62 65 72 2e 00                       r number..

000094e3 <fanSpeedError(unsigned char)::__c>:
    94e3:	48 6f 74 65 6e 64 20 66 61 6e 20 73 70 65 65 64     Hotend fan speed
    94f3:	20 69 73 20 6c 6f 77 65 72 20 74 68 61 6e 20 65      is lower than e
    9503:	78 70 65 63 74 65 64 00                             xpected.

0000950b <fanSpeedError(unsigned char)::__c>:
    950b:	50 72 69 6e 74 20 66 61 6e 20 73 70 65 65 64 20     Print fan speed 
    951b:	69 73 20 6c 6f 77 65 72 20 74 68 61 6e 20 65 78     is lower than ex
    952b:	70 65 63 74 65 64 00                                pected.

00009532 <bed_min_temp_error()::err>:
    9532:	4d 49 4e 54 45 4d 50 20 42 45 44 00                 MINTEMP BED.

0000953e <min_temp_error(unsigned char)::err>:
    953e:	4d 49 4e 54 45 4d 50 00                             MINTEMP.

00009546 <max_temp_error(unsigned char)::__c>:
    9546:	4d 41 58 54 45 4d 50 00                             MAXTEMP.

0000954e <bed_max_temp_error()::__c>:
    954e:	4d 41 58 54 45 4d 50 20 42 45 44 00                 MAXTEMP BED.

0000955a <temptable_1>:
    955a:	70 01 2c 01 90 01 27 01 b0 01 22 01 c0 01 1d 01     p.,...'...".....
    956a:	f0 01 18 01 10 02 13 01 30 02 0e 01 60 02 09 01     ........0...`...
    957a:	90 02 04 01 c0 02 ff 00 00 03 fa 00 40 03 f5 00     ............@...
    958a:	80 03 f0 00 d0 03 eb 00 20 04 e6 00 70 04 e1 00     ........ ...p...
    959a:	e0 04 dc 00 40 05 d7 00 c0 05 d2 00 40 06 cd 00     ....@.......@...
    95aa:	d0 06 c8 00 80 07 c3 00 30 08 be 00 f0 08 b9 00     ........0.......
    95ba:	c0 09 b4 00 b0 0a af 00 b0 0b aa 00 d0 0c a5 00     ................
    95ca:	00 0e a0 00 50 0f 9b 00 c0 10 96 00 50 12 91 00     ....P.......P...
    95da:	00 14 8c 00 c0 15 87 00 b0 17 82 00 b0 19 7d 00     ..............}.
    95ea:	d0 1b 78 00 00 1e 73 00 40 20 6e 00 90 22 69 00     ..x...s.@ n.."i.
    95fa:	f0 24 64 00 40 27 5f 00 90 29 5a 00 e0 2b 55 00     .$d.@'_..)Z..+U.
    960a:	10 2e 50 00 20 30 4b 00 10 32 46 00 e0 33 41 00     ..P. 0K..2F..3A.
    961a:	90 35 3c 00 10 37 37 00 70 38 32 00 a0 39 2d 00     .5<..77.p82..9-.
    962a:	b0 3a 28 00 a0 3b 23 00 60 3c 1e 00 10 3d 19 00     .:(..;#.`<...=..
    963a:	90 3d 14 00 10 3e 0f 00 70 3e 0a 00 c0 3e 05 00     .=...>..p>...>..
    964a:	00 3f 00 00                                         .?..

0000964e <temp_runaway_stop(bool, bool)::__c>:
    964e:	20 48 4f 54 45 4e 44 20 54 48 45 52 4d 41 4c 20      HOTEND THERMAL 
    965e:	52 55 4e 41 57 41 59 00                             RUNAWAY.

00009666 <temp_runaway_stop(bool, bool)::__c>:
    9666:	20 48 45 41 54 42 45 44 20 54 48 45 52 4d 41 4c      HEATBED THERMAL
    9676:	20 52 55 4e 41 57 41 59 00                           RUNAWAY.

0000967f <temp_runaway_stop(bool, bool)::__c>:
    967f:	54 48 45 52 4d 41 4c 20 52 55 4e 41 57 41 59 00     THERMAL RUNAWAY.

0000968f <temp_runaway_stop(bool, bool)::__c>:
    968f:	42 45 44 20 54 48 45 52 4d 41 4c 20 52 55 4e 41     BED THERMAL RUNA
    969f:	57 41 59 00                                         WAY.

000096a3 <temp_runaway_stop(bool, bool)::__c>:
    96a3:	20 54 48 45 52 4d 41 4c 20 52 55 4e 41 57 41 59      THERMAL RUNAWAY
    96b3:	20 28 50 52 45 48 45 41 54 20 48 4f 54 45 4e 44      (PREHEAT HOTEND
    96c3:	29 00                                               ).

000096c5 <temp_runaway_stop(bool, bool)::__c>:
    96c5:	20 54 48 45 52 4d 41 4c 20 52 55 4e 41 57 41 59      THERMAL RUNAWAY
    96d5:	20 28 50 52 45 48 45 41 54 20 48 45 41 54 42 45      (PREHEAT HEATBE
    96e5:	44 29 00                                            D).

000096e8 <temp_runaway_stop(bool, bool)::__c>:
    96e8:	50 52 45 48 45 41 54 20 45 52 52 4f 52 00           PREHEAT ERROR.

000096f6 <temp_runaway_stop(bool, bool)::__c>:
    96f6:	42 45 44 20 50 52 45 48 45 41 54 20 45 52 52 4f     BED PREHEAT ERRO
    9706:	52 00                                               R.

00009708 <temp_error_messagepgm(char const*, unsigned char)::__c>:
    9708:	20 74 72 69 67 67 65 72 65 64 21 00                  triggered!.

00009714 <temp_error_messagepgm(char const*, unsigned char)::__c>:
    9714:	48 65 61 74 65 72 73 20 73 77 69 74 63 68 65 64     Heaters switched
    9724:	20 6f 66 66 2e 20 00                                 off. .

0000972b <temp_error_messagepgm(char const*, unsigned char)::__c>:
    972b:	3a 20 00                                            : .

0000972e <temp_error_messagepgm(char const*, unsigned char)::__c>:
    972e:	45 72 72 3a 20 00                                   Err: .

00009734 <lcd_buttons_update()::encrot_table>:
    9734:	00 ff 01 02 01 00 02 ff ff fe 00 01 fe 01 ff 00     ................

00009744 <alert_automaton_mintemp::step(float, float)::m1>:
    9744:	50 6c 65 61 73 65 20 72 65 73 74 61 72 74 00        Please restart.

00009753 <__vector_51::__c>:
    9753:	55 53 41 52 54 32 20 72 78 20 46 75 6c 6c 21 21     USART2 rx Full!!
    9763:	21 00                                               !.

00009765 <lcdui_print_status_line()::__c>:
    9765:	3a 20 00                                            : .

00009768 <lcdui_print_status_line()::__c>:
    9768:	25 2d 31 32 2e 31 32 53 25 2d 64 2f 36 00           %-12.12S%-d/6.

00009776 <lcdui_print_status_line()::__c>:
    9776:	25 33 64 2f 25 2d 33 64 00                          %3d/%-3d.

0000977f <lcdui_print_status_line()::__c>:
    977f:	20 3a 20 00                                          : .

00009783 <lcdui_print_percent_done()::__c>:
    9783:	25 33 53 00                                         %3S.

00009787 <lcdui_print_percent_done()::__c>:
    9787:	25 2d 37 73 00                                      %-7s.

0000978c <lcd_menu_extruder_info()::__c>:
    978c:	25 2d 31 35 2e 31 35 53 25 2d 35 64 0a 25 2d 31     %-15.15S%-5d.%-1
    979c:	35 2e 31 35 53 25 2d 35 64 0a 00                    5.15S%-5d..

000097a7 <lcd_menu_fails_stats_mmu_print()::__c>:
    97a7:	25 53 0a 20 25 2d 31 36 2e 31 36 53 25 2d 33 64     %S. %-16.16S%-3d
    97b7:	0a 20 25 2d 31 36 2e 31 36 53 25 2d 33 64 00        . %-16.16S%-3d.

000097c6 <lcd_menu_fails_stats_mmu_total()::__c>:
    97c6:	25 53 0a 20 25 2d 31 36 2e 31 36 53 25 2d 33 64     %S. %-16.16S%-3d
    97d6:	0a 20 25 2d 31 36 2e 31 36 53 25 2d 33 64 0a 20     . %-16.16S%-3d. 
    97e6:	25 2d 31 36 2e 31 36 53 25 2d 33 64 00              %-16.16S%-3d.

000097f3 <failStatsFmt>:
    97f3:	25 53 0a 20 25 2d 31 36 2e 31 36 53 25 2d 33 64     %S. %-16.16S%-3d
    9803:	0a 25 53 0a 20 25 2d 31 36 2e 31 36 53 25 2d 33     .%S. %-16.16S%-3
    9813:	64 0a 00                                            d..

00009816 <lcd_menu_temperatures_line(char const*, int)::__c>:
    9816:	20 25 73 25 33 64 81 20 0a 00                        %s%3d. ..

00009820 <ip4_to_str(char*, unsigned char*)::__c>:
    9820:	25 75 2e 25 75 2e 25 75 2e 25 75 00                 %u.%u.%u.%u.

0000982c <_ZZL16lcd_support_menuvE3__c__15_>:
    982c:	20 00                                                .

0000982e <_ZZL16lcd_support_menuvE3__c__14_>:
    982e:	20 00                                                .

00009830 <_ZZL16lcd_support_menuvE3__c__13_>:
    9830:	46 6c 61 73 68 41 69 72 20 49 50 20 41 64 64 72     FlashAir IP Addr
    9840:	3a 00                                               :.

00009842 <_ZZL16lcd_support_menuvE3__c__12_>:
    9842:	4d 4d 55 20 20 20 20 20 20 20 20 4e 2f 41 00        MMU        N/A.

00009851 <_ZZL16lcd_support_menuvE3__c__11_>:
    9851:	25 64 2e 25 64 2e 25 64 00                          %d.%d.%d.

0000985a <_ZZL16lcd_support_menuvE3__c__10_>:
    985a:	20 46 57 3a 00                                       FW:.

0000985f <lcd_support_menu()::__c>:
    985f:	32 30 32 35 2d 30 34 2d 32 32 00                    2025-04-22.

0000986a <lcd_support_menu()::__c>:
    986a:	45 33 44 76 36 66 75 6c 6c 00                       E3Dv6full.

00009874 <lcd_support_menu()::__c>:
    9874:	52 41 4d 42 6f 31 33 61 00                          RAMBo13a.

0000987d <lcd_support_menu()::__c>:
    987d:	31 5f 37 35 6d 6d 5f 4d 4b 32 35 00                 1_75mm_MK25.

00009889 <lcd_support_menu()::__c>:
    9889:	20 48 61 73 68 3a 37 37 33 31 30 32 34 65 64 00      Hash:7731024ed.

00009899 <lcd_support_menu()::__c>:
    9899:	20 52 65 70 6f 3a 70 72 75 73 61 33 64 00            Repo:prusa3d.

000098a7 <lcd_support_menu()::__c>:
    98a7:	20 33 2e 31 34 2e 31 2d 38 32 37 39 00               3.14.1-8279.

000098b4 <lcd_support_menu()::__c>:
    98b4:	46 69 72 6d 77 61 72 65 3a 00                       Firmware:.

000098be <mFilamentItem(unsigned int, unsigned int)::__c>:
    98be:	3e 00                                               >.

000098c0 <_ZZ24lcd_generic_preheat_menuvE3__c__20_>:
    98c0:	46 4c 45 58 20 2d 20 20 32 34 30 2f 35 30 00        FLEX -  240/50.

000098cf <_ZZ24lcd_generic_preheat_menuvE3__c__19_>:
    98cf:	46 4c 45 58 20 2d 20 20 32 34 30 00                 FLEX -  240.

000098db <_ZZ24lcd_generic_preheat_menuvE3__c__18_>:
    98db:	50 50 20 20 20 2d 20 20 32 35 34 2f 31 30 30 00     PP   -  254/100.

000098eb <_ZZ24lcd_generic_preheat_menuvE3__c__17_>:
    98eb:	50 50 20 20 20 2d 20 20 32 35 34 00                 PP   -  254.

000098f7 <_ZZ24lcd_generic_preheat_menuvE3__c__16_>:
    98f7:	48 49 50 53 20 2d 20 20 32 32 30 2f 31 30 30 00     HIPS -  220/100.

00009907 <_ZZ24lcd_generic_preheat_menuvE3__c__15_>:
    9907:	48 49 50 53 20 2d 20 20 32 32 30 00                 HIPS -  220.

00009913 <_ZZ24lcd_generic_preheat_menuvE3__c__14_>:
    9913:	41 42 53 20 20 2d 20 20 32 35 35 2f 31 30 30 00     ABS  -  255/100.

00009923 <_ZZ24lcd_generic_preheat_menuvE3__c__13_>:
    9923:	41 42 53 20 20 2d 20 20 32 35 35 00                 ABS  -  255.

0000992f <_ZZ24lcd_generic_preheat_menuvE3__c__12_>:
    992f:	50 41 20 20 20 2d 20 20 32 37 35 2f 39 30 00        PA   -  275/90.

0000993e <_ZZ24lcd_generic_preheat_menuvE3__c__11_>:
    993e:	50 41 20 20 20 2d 20 20 32 37 35 00                 PA   -  275.

0000994a <_ZZ24lcd_generic_preheat_menuvE3__c__10_>:
    994a:	50 56 42 20 20 2d 20 20 32 31 35 2f 37 35 00        PVB  -  215/75.

00009959 <lcd_generic_preheat_menu()::__c>:
    9959:	50 56 42 20 20 2d 20 20 32 31 35 00                 PVB  -  215.

00009965 <lcd_generic_preheat_menu()::__c>:
    9965:	50 43 20 20 20 2d 20 20 32 37 35 2f 31 30 35 00     PC   -  275/105.

00009975 <lcd_generic_preheat_menu()::__c>:
    9975:	50 43 20 20 20 2d 20 20 32 37 35 00                 PC   -  275.

00009981 <lcd_generic_preheat_menu()::__c>:
    9981:	41 53 41 20 20 2d 20 20 32 36 30 2f 31 30 35 00     ASA  -  260/105.

00009991 <lcd_generic_preheat_menu()::__c>:
    9991:	41 53 41 20 20 2d 20 20 32 36 30 00                 ASA  -  260.

0000999d <lcd_generic_preheat_menu()::__c>:
    999d:	50 45 54 20 20 2d 20 20 32 33 30 2f 38 35 00        PET  -  230/85.

000099ac <lcd_generic_preheat_menu()::__c>:
    99ac:	50 45 54 20 20 2d 20 20 32 33 30 00                 PET  -  230.

000099b8 <lcd_generic_preheat_menu()::__c>:
    99b8:	50 4c 41 20 20 2d 20 20 32 31 35 2f 36 30 00        PLA  -  215/60.

000099c7 <lcd_generic_preheat_menu()::__c>:
    99c7:	50 4c 41 20 20 2d 20 20 32 31 35 00                 PLA  -  215.

000099d3 <lcd_generic_preheat_menu()::__c>:
    99d3:	6e 6f 7a 7a 6c 65 20 2d 20 20 32 35 30 2f 30 00     nozzle -  250/0.

000099e3 <lcd_generic_preheat_menu()::__c>:
    99e3:	66 61 72 6d 20 20 20 2d 20 20 32 35 30 2f 38 30     farm   -  250/80
	...

000099f4 <temptable_5>:
    99f4:	10 00 c9 02 10 01 2c 01 40 01 22 01 70 01 18 01     ......,.@.".p...
    9a04:	b0 01 0e 01 f0 01 04 01 50 02 fa 00 b0 02 f0 00     ........P.......
    9a14:	30 03 e6 00 d0 03 dc 00 90 04 d2 00 70 05 c8 00     0...........p...
    9a24:	a0 06 be 00 00 08 b4 00 b0 09 aa 00 d0 0b a0 00     ................
    9a34:	60 0e 96 00 60 11 8c 00 00 15 82 00 20 19 78 00     `...`....... .x.
    9a44:	c0 1d 6e 00 a0 22 64 00 b0 27 5a 00 90 2c 50 00     ..n.."d..'Z..,P.
    9a54:	00 31 46 00 e0 34 3c 00 10 38 32 00 90 3a 28 00     .1F..4<..82..:(.
    9a64:	60 3c 1e 00 a0 3d 14 00 80 3e 0a 00 20 3f 00 00     `<...=...>.. ?..

00009a74 <xyzcal_measure_enter()::__c>:
    9a74:	4d 65 61 73 75 72 65 20 63 65 6e 74 65 72 20 20     Measure center  
	...

00009a85 <xyzcal_measure_enter()::__c>:
    9a85:	78 79 7a 63 61 6c 5f 6d 65 61 73 75 72 65 5f 65     xyzcal_measure_e
    9a95:	6e 74 65 72 0a 00                                   nter..

00009a9b <xyzcal_spiral8(int, int, int, int, int, unsigned int, signed char, unsigned int*)::__c>:
    9a9b:	78 79 7a 63 61 6c 5f 73 70 69 72 61 6c 38 20 63     xyzcal_spiral8 c
    9aab:	78 3d 25 64 20 63 79 3d 25 64 20 7a 30 3d 25 64     x=%d cy=%d z0=%d
    9abb:	20 64 7a 3d 25 64 20 72 61 64 69 75 73 3d 25 64      dz=%d radius=%d
    9acb:	20 61 64 3d 25 64 0a 00                              ad=%d..

00009ad3 <xyzcal_searchZ()::__c>:
    9ad3:	78 79 7a 63 61 6c 5f 73 65 61 72 63 68 5a 20 6e     xyzcal_searchZ n
    9ae3:	6f 20 73 69 67 6e 61 6c 0a 20 78 3d 25 6c 64 20     o signal. x=%ld 
    9af3:	79 3d 25 6c 64 20 7a 3d 25 6c 64 0a 00              y=%ld z=%ld..

00009b00 <xyzcal_searchZ()::__c>:
    9b00:	20 4f 4e 2d 53 49 47 4e 41 4c 20 61 74 20 78 3d      ON-SIGNAL at x=
    9b10:	25 64 20 79 3d 25 64 20 7a 3d 25 64 20 61 64 3d     %d y=%d z=%d ad=
    9b20:	25 64 0a 00                                         %d..

00009b24 <xyzcal_searchZ()::__c>:
    9b24:	78 79 7a 63 61 6c 5f 73 65 61 72 63 68 5a 20 78     xyzcal_searchZ x
    9b34:	3d 25 6c 64 20 79 3d 25 6c 64 20 7a 3d 25 6c 64     =%ld y=%ld z=%ld
    9b44:	0a 00                                               ..

00009b46 <print_image(unsigned char const*)::__c>:
    9b46:	25 30 32 78 00                                      %02x.

00009b4b <xyzcal_scan_and_process()::__c>:
    9b4b:	20 5b 25 66 20 25 66 5d 20 6d 6d 20 70 61 74 74      [%f %f] mm patt
    9b5b:	65 72 6e 20 63 65 6e 74 65 72 0a 00                 ern center..

00009b67 <xyzcal_scan_and_process()::__c>:
    9b67:	20 5b 25 66 20 25 66 5d 5b 25 66 5d 20 6d 6d 20      [%f %f][%f] mm 
    9b77:	64 69 76 65 72 67 65 6e 63 65 0a 00                 divergence..

00009b83 <xyzcal_point_pattern_10>:
    9b83:	00 00 f0 00 f8 01 fc 03 fe 07 fe 07 fe 07 fe 07     ................
    9b93:	fc 03 f8 01 f0 00 00 00                             ........

00009b9b <xyzcal_point_pattern_08>:
    9b9b:	00 00 00 00 f0 00 f8 01 fc 03 fc 03 fc 03 fc 03     ................
    9bab:	f8 01 f0 00 00 00 00 00                             ........

00009bb3 <xyzcal_measure_leave()::__c>:
    9bb3:	78 79 7a 63 61 6c 5f 6d 65 61 73 75 72 65 5f 6c     xyzcal_measure_l
    9bc3:	65 61 76 65 0a 00                                   eave..

00009bc9 <find_bed_offset_and_skew(signed char, unsigned char&)::__c>:
    9bc9:	20 3c 20 00                                          < .

00009bcd <find_bed_offset_and_skew(signed char, unsigned char&)::__c>:
    9bcd:	57 41 52 4e 49 4e 47 3a 20 46 72 6f 6e 74 20 70     WARNING: Front p
    9bdd:	6f 69 6e 74 20 6e 6f 74 20 72 65 61 63 68 61 62     oint not reachab
    9bed:	6c 65 2e 20 59 20 63 6f 6f 72 64 69 6e 61 74 65     le. Y coordinate
    9bfd:	3a 00                                               :.

00009bff <find_bed_offset_and_skew(signed char, unsigned char&)::__c>:
	...

00009c00 <bed_ref_points_4>:
    9c00:	00 00 40 41 00 00 80 40 00 00 5c 43 00 00 80 40     ..@A...@..\C...@
    9c10:	00 00 5c 43 00 00 44 43 00 00 40 41 00 00 44 43     ..\C..DC..@A..DC

00009c20 <find_bed_offset_and_skew(signed char, unsigned char&)::__c>:
    9c20:	25 64 2f 34 00                                      %d/4.

00009c25 <find_bed_offset_and_skew(signed char, unsigned char&)::__c>:
    9c25:	49 74 65 72 61 74 69 6f 6e 3a 20 00                 Iteration: .

00009c31 <gcode_M45(bool, signed char)::__c>:
    9c31:	43 61 6c 69 62 72 61 74 69 6f 6e 20 66 61 69 6c     Calibration fail
    9c41:	65 64 21 20 43 68 65 63 6b 20 74 68 65 20 61 78     ed! Check the ax
    9c51:	65 73 20 61 6e 64 20 72 75 6e 20 61 67 61 69 6e     es and run again
    9c61:	2e 00                                               ..

00009c63 <xyzcal_spiral2(int, int, int, int, int, int, unsigned int, signed char, unsigned int*)::__c>:
    9c63:	78 79 7a 63 61 6c 5f 73 70 69 72 61 6c 32 20 63     xyzcal_spiral2 c
    9c73:	78 3d 25 64 20 63 79 3d 25 64 20 7a 30 3d 25 64     x=%d cy=%d z0=%d
    9c83:	20 64 7a 3d 25 64 20 72 61 64 69 75 73 3d 25 64      dz=%d radius=%d
    9c93:	20 61 64 3d 25 64 0a 00                              ad=%d..

00009c9b <endl>:
    9c9b:	0a 00                                               ..

00009c9d <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*)::__c>:
    9c9d:	43 6f 75 6e 74 64 6f 77 6e 3a 20 25 64 20 00        Countdown: %d .

00009cac <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*)::__c>:
    9cac:	25 64 0a 00                                         %d..

00009cb0 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*)::__c>:
    9cb0:	53 63 61 6e 20 63 6f 75 6e 74 64 6f 77 6e 3a 20     Scan countdown: 
	...

00009cc1 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*)::__c>:
    9cc1:	50 61 74 74 65 72 6e 20 63 65 6e 74 65 72 20 5b     Pattern center [
    9cd1:	25 66 20 25 66 5d 2c 20 6d 61 74 63 68 20 25 66     %f %f], match %f
    9ce1:	25 25 0a 00                                         %%..

00009ce5 <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char)::__c>:
    9ce5:	20 5b 25 66 2c 20 25 66 5d 5b 25 66 5d 20 66 69      [%f, %f][%f] fi
    9cf5:	6e 61 6c 20 63 69 72 63 6c 65 0a 00                 nal circle..

00009d01 <home_retract_mm_P>:
    9d01:	00 00 a0 40 00 00 a0 40 00 00 00 40                 ...@...@...@

00009d0d <max_length_P>:
    9d0d:	00 00 7a 43 00 00 56 43 9a d9 51 43                 ..zC..VC..QC

00009d19 <home_dir_P>:
    9d19:	ff ff ff                                            ...

00009d1c <_ZL16ramming_sequence.lto_priv.385>:
    9d1c:	e0 2d 90 3e 89 88 b2 41 11 36 9c 3e 77 77 c1 41     .-.>...A.6.>ww.A
    9d2c:	29 cb b0 3e ef ee da 41 ba 49 cc 3e ef ee fc 41     )..>...A.I.>...A
    9d3c:	61 c3 f3 3e ef ee 16 42 9c a2 13 3f cd cc 36 42     a..>...B...?..6B
    9d4c:	8a b0 11 3f ab aa 56 42 88 63 dd 3d ab aa 56 42     ...?..VB.c.=..VB
    9d5c:	b8 af 43 3f 55 55 72 42 18 26 53 3f 33 b3 82 42     ..C?UUrB.&S?3..B
    9d6c:	30 2a 59 3f ef 6e 86 42 00 00 70 c1 00 00 c8 42     0*Y?.n.B..p....B
    9d7c:	00 00 c4 c1 00 00 a0 41 00 00 e0 c0 00 00 20 41     .......A...... A
    9d8c:	00 00 60 c0 00 00 c0 40 00 00 a0 41 22 22 f2 40     ..`....@...A"".@
    9d9c:	00 00 a0 c1 9a 99 a1 40 00 00 0c c2 55 55 05 42     .......@....UU.B

00009dac <MMU2::MMU2::manage_response(bool, bool)::__c>:
    9dac:	43 6f 6f 6c 69 6e 67 20 74 69 6d 65 72 20 73 74     Cooling timer st
    9dbc:	6f 70 70 65 64 00                                   opped.

00009dc2 <MMU2::MMU2::manage_response(bool, bool)::__c>:
    9dc2:	48 65 61 74 65 72 20 63 6f 6f 6c 64 6f 77 6e 00     Heater cooldown.

00009dd2 <MMU2::MMU2::manage_response(bool, bool)::__c>:
    9dd2:	43 6f 6f 6c 69 6e 67 20 54 69 6d 65 6f 75 74 20     Cooling Timeout 
    9de2:	73 74 61 72 74 65 64 00                             started.

00009dea <MMU2::MMU2::SaveAndPark(bool)::__c>:
    9dea:	53 61 76 69 6e 67 20 61 6e 64 20 70 61 72 6b 69     Saving and parki
    9dfa:	6e 67 00                                            ng.

00009dfd <MMU2::MMU2::SaveHotendTemp(bool)::__c>:
    9dfd:	48 65 61 74 65 72 20 63 6f 6f 6c 64 6f 77 6e 20     Heater cooldown 
    9e0d:	70 65 6e 64 69 6e 67 00                             pending.

00009e15 <MMU2::MMU2::ResumeUnpark()::__c>:
    9e15:	52 65 73 75 6d 69 6e 67 20 58 59 5a 00              Resuming XYZ.

00009e22 <ofWritingToFile>:
    9e22:	57 72 69 74 69 6e 67 20 74 6f 20 66 69 6c 65 3a     Writing to file:
    9e32:	20 00                                                .

00009e34 <CardReader::openFileWrite(char const*)::__c>:
    9e34:	46 69 6c 65 20 61 6c 72 65 61 64 79 20 6f 70 65     File already ope
    9e44:	6e 65 64 00                                         ned.

00009e48 <MMU2::progressTexts>:
    9e48:	ba 5a a9 5a 95 5a 80 5a 6a 5a 57 5a 41 5a 2d 5a     .Z.Z.Z.ZjZWZAZ-Z
    9e58:	1c 5a 06 5a 95 5a a9 5a f2 59 e3 59 cf 59 be 59     .Z.Z.Z.Z.Y.Y.Y.Y
    9e68:	a9 59 ed 61 93 59 81 59 6e 59 5d 59 48 59 35 59     .Y.a.Y.YnY]YHY5Y
    9e78:	21 59 0c 59 03 59 f1 58 dc 58                       !Y.Y.Y.X.X

00009e82 <MMU2::MMU2::CheckFINDARunout()::__c>:
    9e82:	4d 36 30 30 20 41 55 54 4f 00                       M600 AUTO.

00009e8c <MMU2::MMU2::CheckFINDARunout()::__c>:
    9e8c:	46 49 4e 44 41 20 66 69 6c 61 6d 65 6e 74 20 72     FINDA filament r
    9e9c:	75 6e 6f 75 74 21 00                                unout!.

00009ea3 <MMU2::ProtocolLogic::HandleCommunicationTimeout()::__c>:
    9ea3:	43 6f 6d 6d 75 6e 69 63 61 74 69 6f 6e 20 74 69     Communication ti
    9eb3:	6d 65 6f 75 74 00                                   meout.

00009eb9 <MMU2::ProtocolLogic::HandleProtocolError()::__c>:
    9eb9:	50 72 6f 74 6f 63 6f 6c 20 45 72 72 6f 72 00        Protocol Error.

00009ec8 <MMU2::supportedMmuFWVersion>:
    9ec8:	03 00 03                                            ...

00009ecb <MMU2::ProtocolLogic::Step()::__c>:
    9ecb:	56 65 72 73 69 6f 6e 20 6d 69 73 6d 61 74 63 68     Version mismatch
	...

00009edc <MMU2::ProtocolLogic::Step()::__c>:
    9edc:	43 6f 6d 6d 61 6e 64 20 45 72 72 6f 72 00           Command Error.

00009eea <MMU2::ProtocolLogic::Step()::__c>:
    9eea:	43 6f 6d 6d 61 6e 64 20 72 65 6a 65 63 74 65 64     Command rejected
	...

00009efb <MMU2::MMU2::LogicStep(bool)::__c>:
    9efb:	4d 4d 55 20 42 75 74 74 6f 6e 20 70 75 73 68 65     MMU Button pushe
    9f0b:	64 00                                               d.

00009f0d <MMU2::MMU2::RetryIfPossible(ErrorCode)::__c>:
    9f0d:	52 65 74 72 79 42 75 74 74 6f 6e 50 72 65 73 73     RetryButtonPress
    9f1d:	65 64 00                                            ed.

00009f20 <_ZN4MMU2L11errorTitlesE.lto_priv.449>:
    9f20:	17 5d 02 5d eb 5c d6 5c c1 5c ad 5c 9d 5c 86 5c     .].].\.\.\.\.\.\
    9f30:	6f 5c 58 5c 44 5c 30 5c 1a 5c 1a 5c 1a 5c 05 5c     o\X\D\0\.\.\.\.\
    9f40:	05 5c 05 5c f2 5b f2 5b f2 5b df 5b df 5b df 5b     .\.\.[.[.[.[.[.[
    9f50:	c8 5b c8 5b c8 5b b3 5b b3 5b b3 5b 9d 5b 9d 5b     .[.[.[.[.[.[.[.[
    9f60:	9d 5b 8d 5b 78 5b 62 5b 4c 5b 3d 5b 30 5b 19 5b     .[.[x[b[L[=[0[.[
    9f70:	06 5b f4 5a e1 5a cf 5a bf 5a                       .[.Z.Z.Z.Z

00009f7a <MMU2::MMU2::Button(unsigned char)::__c>:
    9f7a:	42 75 74 74 6f 6e 00                                Button.

00009f81 <MMU2::MMU2::CheckUserInput()::__c>:
    9f81:	43 68 65 63 6b 55 73 65 72 49 6e 70 75 74 2d 62     CheckUserInput-b
    9f91:	74 6e 4c 4d 52 20 00                                tnLMR .

00009f98 <MMU2::ProtocolLogic::ResetRetryAttempts()::__c>:
    9f98:	52 65 73 65 74 52 65 74 72 79 41 74 74 65 6d 70     ResetRetryAttemp
    9fa8:	74 73 00                                            ts.

00009fab <_ZZN4MMU231ReportErrorHookSensorLineRenderEvE3__c.lto_priv.448>:
    9fab:	46 49 3a 20 20 46 53 3a 20 20 20 20 3e 20 20 82     FI:  FS:    >  .
    9fbb:	20 20 20 81 00                                         ..

00009fc0 <MMU2::MMU2::ResumeHotendTemp()::__c>:
    9fc0:	48 6f 74 65 6e 64 20 74 65 6d 70 65 72 61 74 75     Hotend temperatu
    9fd0:	72 65 20 72 65 61 63 68 65 64 00                    re reached.

00009fdb <MMU2::MMU2::ResumeHotendTemp()::__c>:
    9fdb:	52 65 73 75 6d 69 6e 67 20 54 65 6d 70 00           Resuming Temp.

00009fe9 <MMU2::MMU2::ResumeHotendTemp()::__c>:
    9fe9:	43 6f 6f 6c 64 6f 77 6e 20 66 6c 61 67 20 63 6c     Cooldown flag cl
    9ff9:	65 61 72 65 64 00                                   eared.

00009fff <wait_for_heater(long, unsigned char)::__c>:
    9fff:	20 57 3a 00                                          W:.

0000a003 <wait_for_heater(long, unsigned char)::__c>:
    a003:	20 45 3a 00                                          E:.

0000a007 <wait_for_heater(long, unsigned char)::__c>:
    a007:	54 3a 00                                            T:.

0000a00a <Sd2Card::init(unsigned char)::__c>:
    a00a:	4e 6f 20 30 78 46 46 20 72 65 63 65 69 76 65 64     No 0xFF received
	...

0000a01b <Sd2Card::init(unsigned char)::__c>:
    a01b:	53 65 6e 64 69 6e 67 20 30 78 46 46 00              Sending 0xFF.

0000a028 <ofFileSelected>:
    a028:	46 69 6c 65 20 73 65 6c 65 63 74 65 64 00           File selected.

0000a036 <ofSize>:
    a036:	20 53 69 7a 65 3a 20 00                              Size: .

0000a03e <ofFileOpened>:
    a03e:	46 69 6c 65 20 6f 70 65 6e 65 64 3a 20 00           File opened: .

0000a04c <ofNowFreshFile>:
    a04c:	4e 6f 77 20 66 72 65 73 68 20 66 69 6c 65 3a 20     Now fresh file: 
	...

0000a05d <ofNowDoingFile>:
    a05d:	4e 6f 77 20 64 6f 69 6e 67 20 66 69 6c 65 3a 20     Now doing file: 
	...

0000a06e <ofPos>:
    a06e:	22 20 70 6f 73 00                                   " pos.

0000a074 <ofParent>:
    a074:	22 20 70 61 72 65 6e 74 3a 22 00                    " parent:".

0000a07f <ofSubroutineCallTgt>:
    a07f:	53 55 42 52 4f 55 54 49 4e 45 20 43 41 4c 4c 20     SUBROUTINE CALL 
    a08f:	74 61 72 67 65 74 3a 22 00                          target:".

0000a098 <ofKill>:
    a098:	74 72 79 69 6e 67 20 74 6f 20 63 61 6c 6c 20 73     trying to call s
    a0a8:	75 62 2d 67 63 6f 64 65 20 66 69 6c 65 73 20 77     ub-gcode files w
    a0b8:	69 74 68 20 74 6f 6f 20 6d 61 6e 79 20 6c 65 76     ith too many lev
    a0c8:	65 6c 73 2e 00                                      els..

0000a0cd <pat9125_init_bank1>:
    a0cd:	06 28 33 d0 36 c2 3e 01 3f 15 41 32 42 3b 43 f2     .(3.6.>.?.A2B;C.
    a0dd:	44 3b 45 f2 46 22 47 3b 48 f2 49 3b 4a f0 58 98     D;E.F"G;H.I;J.X.
    a0ed:	59 0c 5a 08 5b 0c 5c 08 61 10 67 9b 6e 22 71 07     Y.Z.[.\.a.g.n"q.
    a0fd:	72 08 ff                                            r..

0000a100 <pat9125_init_bank0>:
    a100:	09 5a 0d 00 0e f0 19 14 5e 08 20 64 2b 6d 32 2f     .Z......^. d+m2/
    a110:	ff                                                  .

0000a111 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param)::__c>:
    a111:	20 22 25 73 22 00                                    "%s".

0000a117 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param)::__c>:
    a117:	20 25 23 6c 78 00                                    %#lx.

0000a11d <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param)::__c>:
    a11d:	44 49 52 5f 45 58 49 54 00                          DIR_EXIT.

0000a126 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param)::__c>:
    a126:	44 49 52 5f 45 4e 54 45 52 3a 20 25 73 20 22 25     DIR_ENTER: %s "%
    a136:	73 22 0a 00                                         s"..

0000a13a <CardReader::checkautostart(bool)::__c>:
    a13a:	61 75 74 6f 25 69 2e 67 00                          auto%i.g.

0000a143 <MMU2::ProtocolLogic::regs16Addrs>:
    a143:	04 1a                                               ..

0000a145 <MMU2::ProtocolLogic::DecrementRetryAttempts()::__c>:
    a145:	44 65 63 72 65 6d 65 6e 74 52 65 74 72 79 41 74     DecrementRetryAt
    a155:	74 65 6d 70 74 73 00                                tempts.

0000a15c <MMU2::ProtocolLogic::regs8Addrs>:
    a15c:	08 1b 1c                                            ...

0000a15f <MMU2::ProtocolLogic::initRegs8Addrs>:
    a15f:	0b 14                                               ..

0000a161 <MMU2::ProtocolLogic::ResetCommunicationTimeoutAttempts()::__c>:
    a161:	52 53 54 43 6f 6d 6d 54 69 6d 65 6f 75 74 00        RSTCommTimeout.

0000a170 <MMU2::ProtocolLogic::LogError(char const*)::__c>:
    a170:	2c 20 6c 61 73 74 20 62 79 74 65 73 3a 20 00        , last bytes: .

0000a17f <_ZL10bufferFull.lto_priv.516>:
    a17f:	22 20 66 61 69 6c 65 64 3a 20 42 75 66 66 65 72     " failed: Buffer
    a18f:	20 66 75 6c 6c 21 00                                 full!.

0000a196 <enquecommand_front(char const*, bool)::__c>:
    a196:	22 00                                               ".

0000a198 <enqueingFront>:
    a198:	45 6e 71 75 65 69 6e 67 20 74 6f 20 74 68 65 20     Enqueing to the 
    a1a8:	66 72 6f 6e 74 3a 20 22 00                          front: ".

0000a1b1 <errormagic>:
    a1b1:	45 72 72 6f 72 3a 00                                Error:.

0000a1b8 <MMU2::MMU2::SetCurrentTool(unsigned char)::__c>:
    a1b8:	4d 4d 55 32 74 6f 6f 6c 3d 00                       MMU2tool=.

0000a1c2 <_ZL9mmu2Magic.lto_priv.362>:
    a1c2:	4d 4d 55 32 3a 00                                   MMU2:.

0000a1c8 <_ZL9mmu2Magic.lto_priv.363>:
    a1c8:	4d 4d 55 32 3a 00                                   MMU2:.

0000a1ce <echomagic>:
    a1ce:	65 63 68 6f 3a 00                                   echo:.

0000a1d4 <MMU2::ProtocolLogic::LogRequestMsg(unsigned char const*, unsigned char)::__c>:
    a1d4:	3e 53 30 2a 63 36 2e 00                             >S0*c6..

0000a1dc <MMU2::MMU2::Status()::__c>:
    a1dc:	4d 4d 55 20 69 73 20 00                             MMU is .

0000a1e4 <__ctors_start>:
    a1e4:	86 38       	cpi	r24, 0x86	; 134

0000a1e6 <__ctors_end>:
    a1e6:	cf 63       	ori	r28, 0x3F	; 63

0000a1e8 <__dtors_end>:
    a1e8:	11 24       	eor	r1, r1
    a1ea:	1f be       	out	0x3f, r1	; 63
    a1ec:	cf ef       	ldi	r28, 0xFF	; 255
    a1ee:	d1 e2       	ldi	r29, 0x21	; 33
    a1f0:	de bf       	out	0x3e, r29	; 62
    a1f2:	cd bf       	out	0x3d, r28	; 61
    a1f4:	00 e0       	ldi	r16, 0x00	; 0
    a1f6:	0c bf       	out	0x3c, r16	; 60

0000a1f8 <__do_copy_data>:
    a1f8:	13 e0       	ldi	r17, 0x03	; 3
    a1fa:	a0 e0       	ldi	r26, 0x00	; 0
    a1fc:	b2 e0       	ldi	r27, 0x02	; 2
    a1fe:	e8 e5       	ldi	r30, 0x58	; 88
    a200:	f5 e5       	ldi	r31, 0x55	; 85
    a202:	03 e0       	ldi	r16, 0x03	; 3
    a204:	0b bf       	out	0x3b, r16	; 59
    a206:	02 c0       	rjmp	.+4      	; 0xa20c <__do_copy_data+0x14>
    a208:	07 90       	elpm	r0, Z+
    a20a:	0d 92       	st	X+, r0
    a20c:	a2 30       	cpi	r26, 0x02	; 2
    a20e:	b1 07       	cpc	r27, r17
    a210:	d9 f7       	brne	.-10     	; 0xa208 <__do_copy_data+0x10>

0000a212 <__do_clear_bss>:
    a212:	27 e1       	ldi	r18, 0x17	; 23
    a214:	a2 e0       	ldi	r26, 0x02	; 2
    a216:	b3 e0       	ldi	r27, 0x03	; 3
    a218:	01 c0       	rjmp	.+2      	; 0xa21c <.do_clear_bss_start>

0000a21a <.do_clear_bss_loop>:
    a21a:	1d 92       	st	X+, r1

0000a21c <.do_clear_bss_start>:
    a21c:	a7 31       	cpi	r26, 0x17	; 23
    a21e:	b2 07       	cpc	r27, r18
    a220:	e1 f7       	brne	.-8      	; 0xa21a <.do_clear_bss_loop>

0000a222 <__do_global_ctors>:
    a222:	10 e5       	ldi	r17, 0x50	; 80
    a224:	c3 ef       	ldi	r28, 0xF3	; 243
    a226:	d0 e5       	ldi	r29, 0x50	; 80
    a228:	00 e0       	ldi	r16, 0x00	; 0
    a22a:	06 c0       	rjmp	.+12     	; 0xa238 <__do_global_ctors+0x16>
    a22c:	21 97       	sbiw	r28, 0x01	; 1
    a22e:	01 09       	sbc	r16, r1
    a230:	80 2f       	mov	r24, r16
    a232:	fe 01       	movw	r30, r28
    a234:	0f 94 f0 a4 	call	0x349e0	; 0x349e0 <__tablejump2__>
    a238:	c2 3f       	cpi	r28, 0xF2	; 242
    a23a:	d1 07       	cpc	r29, r17
    a23c:	80 e0       	ldi	r24, 0x00	; 0
    a23e:	08 07       	cpc	r16, r24
    a240:	a9 f7       	brne	.-22     	; 0xa22c <__do_global_ctors+0xa>
    a242:	0e 94 41 ed 	call	0x1da82	; 0x1da82 <main>
    a246:	0d 94 9a aa 	jmp	0x35534	; 0x35534 <__do_global_dtors>

0000a24a <__bad_interrupt>:
    a24a:	0c 94 de 86 	jmp	0x10dbc	; 0x10dbc <__vector_default>

0000a24e <vfprintf>:
    a24e:	2f 92       	push	r2
    a250:	3f 92       	push	r3
    a252:	4f 92       	push	r4
    a254:	5f 92       	push	r5
    a256:	6f 92       	push	r6
    a258:	7f 92       	push	r7
    a25a:	8f 92       	push	r8
    a25c:	9f 92       	push	r9
    a25e:	af 92       	push	r10
    a260:	bf 92       	push	r11
    a262:	cf 92       	push	r12
    a264:	df 92       	push	r13
    a266:	ef 92       	push	r14
    a268:	ff 92       	push	r15
    a26a:	0f 93       	push	r16
    a26c:	1f 93       	push	r17
    a26e:	cf 93       	push	r28
    a270:	df 93       	push	r29
    a272:	cd b7       	in	r28, 0x3d	; 61
    a274:	de b7       	in	r29, 0x3e	; 62
    a276:	2f 97       	sbiw	r28, 0x0f	; 15
    a278:	0f b6       	in	r0, 0x3f	; 63
    a27a:	f8 94       	cli
    a27c:	de bf       	out	0x3e, r29	; 62
    a27e:	0f be       	out	0x3f, r0	; 63
    a280:	cd bf       	out	0x3d, r28	; 61
    a282:	6c 01       	movw	r12, r24
    a284:	1b 01       	movw	r2, r22
    a286:	5a 01       	movw	r10, r20
    a288:	fc 01       	movw	r30, r24
    a28a:	17 82       	std	Z+7, r1	; 0x07
    a28c:	16 82       	std	Z+6, r1	; 0x06
    a28e:	83 81       	ldd	r24, Z+3	; 0x03
    a290:	9e 01       	movw	r18, r28
    a292:	2f 5f       	subi	r18, 0xFF	; 255
    a294:	3f 4f       	sbci	r19, 0xFF	; 255
    a296:	49 01       	movw	r8, r18
    a298:	81 fd       	sbrc	r24, 1
    a29a:	d2 c0       	rjmp	.+420    	; 0xa440 <vfprintf+0x1f2>
    a29c:	8f ef       	ldi	r24, 0xFF	; 255
    a29e:	9f ef       	ldi	r25, 0xFF	; 255
    a2a0:	ee c2       	rjmp	.+1500   	; 0xa87e <vfprintf+0x630>
    a2a2:	f1 2c       	mov	r15, r1
    a2a4:	51 2c       	mov	r5, r1
    a2a6:	00 e0       	ldi	r16, 0x00	; 0
    a2a8:	00 32       	cpi	r16, 0x20	; 32
    a2aa:	38 f4       	brcc	.+14     	; 0xa2ba <vfprintf+0x6c>
    a2ac:	8b 32       	cpi	r24, 0x2B	; 43
    a2ae:	09 f1       	breq	.+66     	; 0xa2f2 <vfprintf+0xa4>
    a2b0:	90 f4       	brcc	.+36     	; 0xa2d6 <vfprintf+0x88>
    a2b2:	80 32       	cpi	r24, 0x20	; 32
    a2b4:	f9 f0       	breq	.+62     	; 0xa2f4 <vfprintf+0xa6>
    a2b6:	83 32       	cpi	r24, 0x23	; 35
    a2b8:	09 f1       	breq	.+66     	; 0xa2fc <vfprintf+0xae>
    a2ba:	07 fd       	sbrc	r16, 7
    a2bc:	34 c0       	rjmp	.+104    	; 0xa326 <vfprintf+0xd8>
    a2be:	20 ed       	ldi	r18, 0xD0	; 208
    a2c0:	28 0f       	add	r18, r24
    a2c2:	2a 30       	cpi	r18, 0x0A	; 10
    a2c4:	20 f5       	brcc	.+72     	; 0xa30e <vfprintf+0xc0>
    a2c6:	06 ff       	sbrs	r16, 6
    a2c8:	1b c0       	rjmp	.+54     	; 0xa300 <vfprintf+0xb2>
    a2ca:	fa e0       	ldi	r31, 0x0A	; 10
    a2cc:	ff 9e       	mul	r15, r31
    a2ce:	20 0d       	add	r18, r0
    a2d0:	11 24       	eor	r1, r1
    a2d2:	f2 2e       	mov	r15, r18
    a2d4:	05 c0       	rjmp	.+10     	; 0xa2e0 <vfprintf+0x92>
    a2d6:	8d 32       	cpi	r24, 0x2D	; 45
    a2d8:	79 f0       	breq	.+30     	; 0xa2f8 <vfprintf+0xaa>
    a2da:	80 33       	cpi	r24, 0x30	; 48
    a2dc:	71 f7       	brne	.-36     	; 0xa2ba <vfprintf+0x6c>
    a2de:	01 60       	ori	r16, 0x01	; 1
    a2e0:	f1 01       	movw	r30, r2
    a2e2:	93 fd       	sbrc	r25, 3
    a2e4:	85 91       	lpm	r24, Z+
    a2e6:	93 ff       	sbrs	r25, 3
    a2e8:	81 91       	ld	r24, Z+
    a2ea:	1f 01       	movw	r2, r30
    a2ec:	81 11       	cpse	r24, r1
    a2ee:	dc cf       	rjmp	.-72     	; 0xa2a8 <vfprintf+0x5a>
    a2f0:	1a c0       	rjmp	.+52     	; 0xa326 <vfprintf+0xd8>
    a2f2:	02 60       	ori	r16, 0x02	; 2
    a2f4:	04 60       	ori	r16, 0x04	; 4
    a2f6:	f4 cf       	rjmp	.-24     	; 0xa2e0 <vfprintf+0x92>
    a2f8:	08 60       	ori	r16, 0x08	; 8
    a2fa:	f2 cf       	rjmp	.-28     	; 0xa2e0 <vfprintf+0x92>
    a2fc:	00 61       	ori	r16, 0x10	; 16
    a2fe:	f0 cf       	rjmp	.-32     	; 0xa2e0 <vfprintf+0x92>
    a300:	3a e0       	ldi	r19, 0x0A	; 10
    a302:	53 9e       	mul	r5, r19
    a304:	20 0d       	add	r18, r0
    a306:	11 24       	eor	r1, r1
    a308:	52 2e       	mov	r5, r18
    a30a:	00 62       	ori	r16, 0x20	; 32
    a30c:	e9 cf       	rjmp	.-46     	; 0xa2e0 <vfprintf+0x92>
    a30e:	8e 32       	cpi	r24, 0x2E	; 46
    a310:	21 f4       	brne	.+8      	; 0xa31a <vfprintf+0xcc>
    a312:	06 fd       	sbrc	r16, 6
    a314:	b1 c2       	rjmp	.+1378   	; 0xa878 <vfprintf+0x62a>
    a316:	00 64       	ori	r16, 0x40	; 64
    a318:	e3 cf       	rjmp	.-58     	; 0xa2e0 <vfprintf+0x92>
    a31a:	8c 36       	cpi	r24, 0x6C	; 108
    a31c:	11 f4       	brne	.+4      	; 0xa322 <vfprintf+0xd4>
    a31e:	00 68       	ori	r16, 0x80	; 128
    a320:	df cf       	rjmp	.-66     	; 0xa2e0 <vfprintf+0x92>
    a322:	88 36       	cpi	r24, 0x68	; 104
    a324:	e9 f2       	breq	.-70     	; 0xa2e0 <vfprintf+0x92>
    a326:	9b eb       	ldi	r25, 0xBB	; 187
    a328:	98 0f       	add	r25, r24
    a32a:	93 30       	cpi	r25, 0x03	; 3
    a32c:	08 f0       	brcs	.+2      	; 0xa330 <vfprintf+0xe2>
    a32e:	5f c0       	rjmp	.+190    	; 0xa3ee <vfprintf+0x1a0>
    a330:	00 61       	ori	r16, 0x10	; 16
    a332:	80 5e       	subi	r24, 0xE0	; 224
    a334:	06 fd       	sbrc	r16, 6
    a336:	02 c0       	rjmp	.+4      	; 0xa33c <vfprintf+0xee>
    a338:	46 e0       	ldi	r20, 0x06	; 6
    a33a:	f4 2e       	mov	r15, r20
    a33c:	10 2f       	mov	r17, r16
    a33e:	1f 73       	andi	r17, 0x3F	; 63
    a340:	85 36       	cpi	r24, 0x65	; 101
    a342:	09 f0       	breq	.+2      	; 0xa346 <vfprintf+0xf8>
    a344:	5b c0       	rjmp	.+182    	; 0xa3fc <vfprintf+0x1ae>
    a346:	10 64       	ori	r17, 0x40	; 64
    a348:	17 ff       	sbrs	r17, 7
    a34a:	61 c0       	rjmp	.+194    	; 0xa40e <vfprintf+0x1c0>
    a34c:	8f 2d       	mov	r24, r15
    a34e:	9b e3       	ldi	r25, 0x3B	; 59
    a350:	9f 15       	cp	r25, r15
    a352:	08 f4       	brcc	.+2      	; 0xa356 <vfprintf+0x108>
    a354:	8b e3       	ldi	r24, 0x3B	; 59
    a356:	44 24       	eor	r4, r4
    a358:	43 94       	inc	r4
    a35a:	48 0e       	add	r4, r24
    a35c:	27 e0       	ldi	r18, 0x07	; 7
    a35e:	35 01       	movw	r6, r10
    a360:	f4 e0       	ldi	r31, 0x04	; 4
    a362:	6f 0e       	add	r6, r31
    a364:	71 1c       	adc	r7, r1
    a366:	f5 01       	movw	r30, r10
    a368:	60 81       	ld	r22, Z
    a36a:	71 81       	ldd	r23, Z+1	; 0x01
    a36c:	82 81       	ldd	r24, Z+2	; 0x02
    a36e:	93 81       	ldd	r25, Z+3	; 0x03
    a370:	04 2d       	mov	r16, r4
    a372:	a4 01       	movw	r20, r8
    a374:	0f 94 99 a0 	call	0x34132	; 0x34132 <__ftoa_engine>
    a378:	5c 01       	movw	r10, r24
    a37a:	f9 81       	ldd	r31, Y+1	; 0x01
    a37c:	fc 87       	std	Y+12, r31	; 0x0c
    a37e:	f0 ff       	sbrs	r31, 0
    a380:	03 c0       	rjmp	.+6      	; 0xa388 <vfprintf+0x13a>
    a382:	0d e2       	ldi	r16, 0x2D	; 45
    a384:	f3 ff       	sbrs	r31, 3
    a386:	07 c0       	rjmp	.+14     	; 0xa396 <vfprintf+0x148>
    a388:	0b e2       	ldi	r16, 0x2B	; 43
    a38a:	11 fd       	sbrc	r17, 1
    a38c:	04 c0       	rjmp	.+8      	; 0xa396 <vfprintf+0x148>
    a38e:	01 2f       	mov	r16, r17
    a390:	04 70       	andi	r16, 0x04	; 4
    a392:	12 fd       	sbrc	r17, 2
    a394:	00 e2       	ldi	r16, 0x20	; 32
    a396:	2c 85       	ldd	r18, Y+12	; 0x0c
    a398:	2c 70       	andi	r18, 0x0C	; 12
    a39a:	e2 2e       	mov	r14, r18
    a39c:	09 f4       	brne	.+2      	; 0xa3a0 <vfprintf+0x152>
    a39e:	6b c0       	rjmp	.+214    	; 0xa476 <vfprintf+0x228>
    a3a0:	01 11       	cpse	r16, r1
    a3a2:	d8 c2       	rjmp	.+1456   	; 0xa954 <vfprintf+0x706>
    a3a4:	f3 e0       	ldi	r31, 0x03	; 3
    a3a6:	e1 2c       	mov	r14, r1
    a3a8:	f5 15       	cp	r31, r5
    a3aa:	a0 f4       	brcc	.+40     	; 0xa3d4 <vfprintf+0x186>
    a3ac:	83 e0       	ldi	r24, 0x03	; 3
    a3ae:	e5 2c       	mov	r14, r5
    a3b0:	e8 1a       	sub	r14, r24
    a3b2:	13 fd       	sbrc	r17, 3
    a3b4:	08 c0       	rjmp	.+16     	; 0xa3c6 <vfprintf+0x178>
    a3b6:	b6 01       	movw	r22, r12
    a3b8:	80 e2       	ldi	r24, 0x20	; 32
    a3ba:	90 e0       	ldi	r25, 0x00	; 0
    a3bc:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
    a3c0:	ea 94       	dec	r14
    a3c2:	e1 10       	cpse	r14, r1
    a3c4:	f8 cf       	rjmp	.-16     	; 0xa3b6 <vfprintf+0x168>
    a3c6:	00 23       	and	r16, r16
    a3c8:	29 f0       	breq	.+10     	; 0xa3d4 <vfprintf+0x186>
    a3ca:	b6 01       	movw	r22, r12
    a3cc:	80 2f       	mov	r24, r16
    a3ce:	90 e0       	ldi	r25, 0x00	; 0
    a3d0:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
    a3d4:	3c 85       	ldd	r19, Y+12	; 0x0c
    a3d6:	28 e7       	ldi	r18, 0x78	; 120
    a3d8:	a2 2e       	mov	r10, r18
    a3da:	21 e7       	ldi	r18, 0x71	; 113
    a3dc:	b2 2e       	mov	r11, r18
    a3de:	33 fd       	sbrc	r19, 3
    a3e0:	04 c0       	rjmp	.+8      	; 0xa3ea <vfprintf+0x19c>
    a3e2:	9c e7       	ldi	r25, 0x7C	; 124
    a3e4:	a9 2e       	mov	r10, r25
    a3e6:	91 e7       	ldi	r25, 0x71	; 113
    a3e8:	b9 2e       	mov	r11, r25
    a3ea:	10 71       	andi	r17, 0x10	; 16
    a3ec:	22 c0       	rjmp	.+68     	; 0xa432 <vfprintf+0x1e4>
    a3ee:	9b e9       	ldi	r25, 0x9B	; 155
    a3f0:	98 0f       	add	r25, r24
    a3f2:	93 30       	cpi	r25, 0x03	; 3
    a3f4:	08 f0       	brcs	.+2      	; 0xa3f8 <vfprintf+0x1aa>
    a3f6:	47 c1       	rjmp	.+654    	; 0xa686 <vfprintf+0x438>
    a3f8:	0f 7e       	andi	r16, 0xEF	; 239
    a3fa:	9c cf       	rjmp	.-200    	; 0xa334 <vfprintf+0xe6>
    a3fc:	86 36       	cpi	r24, 0x66	; 102
    a3fe:	11 f4       	brne	.+4      	; 0xa404 <vfprintf+0x1b6>
    a400:	10 68       	ori	r17, 0x80	; 128
    a402:	a2 cf       	rjmp	.-188    	; 0xa348 <vfprintf+0xfa>
    a404:	ff 20       	and	r15, r15
    a406:	09 f4       	brne	.+2      	; 0xa40a <vfprintf+0x1bc>
    a408:	9f cf       	rjmp	.-194    	; 0xa348 <vfprintf+0xfa>
    a40a:	fa 94       	dec	r15
    a40c:	9d cf       	rjmp	.-198    	; 0xa348 <vfprintf+0xfa>
    a40e:	e7 e0       	ldi	r30, 0x07	; 7
    a410:	2f 2d       	mov	r18, r15
    a412:	ef 15       	cp	r30, r15
    a414:	18 f4       	brcc	.+6      	; 0xa41c <vfprintf+0x1ce>
    a416:	27 e0       	ldi	r18, 0x07	; 7
    a418:	37 e0       	ldi	r19, 0x07	; 7
    a41a:	f3 2e       	mov	r15, r19
    a41c:	41 2c       	mov	r4, r1
    a41e:	9f cf       	rjmp	.-194    	; 0xa35e <vfprintf+0x110>
    a420:	11 11       	cpse	r17, r1
    a422:	80 52       	subi	r24, 0x20	; 32
    a424:	b6 01       	movw	r22, r12
    a426:	90 e0       	ldi	r25, 0x00	; 0
    a428:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
    a42c:	8f ef       	ldi	r24, 0xFF	; 255
    a42e:	a8 1a       	sub	r10, r24
    a430:	b8 0a       	sbc	r11, r24
    a432:	f5 01       	movw	r30, r10
    a434:	84 91       	lpm	r24, Z
    a436:	81 11       	cpse	r24, r1
    a438:	f3 cf       	rjmp	.-26     	; 0xa420 <vfprintf+0x1d2>
    a43a:	e1 10       	cpse	r14, r1
    a43c:	84 c2       	rjmp	.+1288   	; 0xa946 <vfprintf+0x6f8>
    a43e:	53 01       	movw	r10, r6
    a440:	f6 01       	movw	r30, r12
    a442:	93 81       	ldd	r25, Z+3	; 0x03
    a444:	f1 01       	movw	r30, r2
    a446:	93 fd       	sbrc	r25, 3
    a448:	85 91       	lpm	r24, Z+
    a44a:	93 ff       	sbrs	r25, 3
    a44c:	81 91       	ld	r24, Z+
    a44e:	1f 01       	movw	r2, r30
    a450:	88 23       	and	r24, r24
    a452:	09 f4       	brne	.+2      	; 0xa456 <vfprintf+0x208>
    a454:	11 c2       	rjmp	.+1058   	; 0xa878 <vfprintf+0x62a>
    a456:	85 32       	cpi	r24, 0x25	; 37
    a458:	41 f4       	brne	.+16     	; 0xa46a <vfprintf+0x21c>
    a45a:	93 fd       	sbrc	r25, 3
    a45c:	85 91       	lpm	r24, Z+
    a45e:	93 ff       	sbrs	r25, 3
    a460:	81 91       	ld	r24, Z+
    a462:	1f 01       	movw	r2, r30
    a464:	85 32       	cpi	r24, 0x25	; 37
    a466:	09 f0       	breq	.+2      	; 0xa46a <vfprintf+0x21c>
    a468:	1c cf       	rjmp	.-456    	; 0xa2a2 <vfprintf+0x54>
    a46a:	b6 01       	movw	r22, r12
    a46c:	90 e0       	ldi	r25, 0x00	; 0
    a46e:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
    a472:	35 01       	movw	r6, r10
    a474:	e4 cf       	rjmp	.-56     	; 0xa43e <vfprintf+0x1f0>
    a476:	17 ff       	sbrs	r17, 7
    a478:	6f c0       	rjmp	.+222    	; 0xa558 <vfprintf+0x30a>
    a47a:	4a 0c       	add	r4, r10
    a47c:	fc 85       	ldd	r31, Y+12	; 0x0c
    a47e:	f4 ff       	sbrs	r31, 4
    a480:	04 c0       	rjmp	.+8      	; 0xa48a <vfprintf+0x23c>
    a482:	8a 81       	ldd	r24, Y+2	; 0x02
    a484:	81 33       	cpi	r24, 0x31	; 49
    a486:	09 f4       	brne	.+2      	; 0xa48a <vfprintf+0x23c>
    a488:	4a 94       	dec	r4
    a48a:	14 14       	cp	r1, r4
    a48c:	0c f0       	brlt	.+2      	; 0xa490 <vfprintf+0x242>
    a48e:	86 c0       	rjmp	.+268    	; 0xa59c <vfprintf+0x34e>
    a490:	28 e0       	ldi	r18, 0x08	; 8
    a492:	24 15       	cp	r18, r4
    a494:	10 f4       	brcc	.+4      	; 0xa49a <vfprintf+0x24c>
    a496:	88 e0       	ldi	r24, 0x08	; 8
    a498:	48 2e       	mov	r4, r24
    a49a:	85 e0       	ldi	r24, 0x05	; 5
    a49c:	90 e0       	ldi	r25, 0x00	; 0
    a49e:	17 ff       	sbrs	r17, 7
    a4a0:	06 c0       	rjmp	.+12     	; 0xa4ae <vfprintf+0x260>
    a4a2:	c5 01       	movw	r24, r10
    a4a4:	b7 fe       	sbrs	r11, 7
    a4a6:	02 c0       	rjmp	.+4      	; 0xa4ac <vfprintf+0x25e>
    a4a8:	90 e0       	ldi	r25, 0x00	; 0
    a4aa:	80 e0       	ldi	r24, 0x00	; 0
    a4ac:	01 96       	adiw	r24, 0x01	; 1
    a4ae:	01 11       	cpse	r16, r1
    a4b0:	01 96       	adiw	r24, 0x01	; 1
    a4b2:	ff 20       	and	r15, r15
    a4b4:	31 f0       	breq	.+12     	; 0xa4c2 <vfprintf+0x274>
    a4b6:	2f 2d       	mov	r18, r15
    a4b8:	30 e0       	ldi	r19, 0x00	; 0
    a4ba:	2f 5f       	subi	r18, 0xFF	; 255
    a4bc:	3f 4f       	sbci	r19, 0xFF	; 255
    a4be:	82 0f       	add	r24, r18
    a4c0:	93 1f       	adc	r25, r19
    a4c2:	58 16       	cp	r5, r24
    a4c4:	19 06       	cpc	r1, r25
    a4c6:	19 f0       	breq	.+6      	; 0xa4ce <vfprintf+0x280>
    a4c8:	14 f0       	brlt	.+4      	; 0xa4ce <vfprintf+0x280>
    a4ca:	e5 2c       	mov	r14, r5
    a4cc:	e8 1a       	sub	r14, r24
    a4ce:	81 2f       	mov	r24, r17
    a4d0:	89 70       	andi	r24, 0x09	; 9
    a4d2:	11 f4       	brne	.+4      	; 0xa4d8 <vfprintf+0x28a>
    a4d4:	e1 10       	cpse	r14, r1
    a4d6:	67 c0       	rjmp	.+206    	; 0xa5a6 <vfprintf+0x358>
    a4d8:	00 23       	and	r16, r16
    a4da:	29 f0       	breq	.+10     	; 0xa4e6 <vfprintf+0x298>
    a4dc:	b6 01       	movw	r22, r12
    a4de:	80 2f       	mov	r24, r16
    a4e0:	90 e0       	ldi	r25, 0x00	; 0
    a4e2:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
    a4e6:	13 fd       	sbrc	r17, 3
    a4e8:	02 c0       	rjmp	.+4      	; 0xa4ee <vfprintf+0x2a0>
    a4ea:	e1 10       	cpse	r14, r1
    a4ec:	63 c0       	rjmp	.+198    	; 0xa5b4 <vfprintf+0x366>
    a4ee:	17 ff       	sbrs	r17, 7
    a4f0:	7c c0       	rjmp	.+248    	; 0xa5ea <vfprintf+0x39c>
    a4f2:	85 01       	movw	r16, r10
    a4f4:	b7 fe       	sbrs	r11, 7
    a4f6:	02 c0       	rjmp	.+4      	; 0xa4fc <vfprintf+0x2ae>
    a4f8:	10 e0       	ldi	r17, 0x00	; 0
    a4fa:	00 e0       	ldi	r16, 0x00	; 0
    a4fc:	c5 01       	movw	r24, r10
    a4fe:	84 19       	sub	r24, r4
    a500:	91 09       	sbc	r25, r1
    a502:	2c 01       	movw	r4, r24
    a504:	6f 2d       	mov	r22, r15
    a506:	70 e0       	ldi	r23, 0x00	; 0
    a508:	ee 27       	eor	r30, r30
    a50a:	ff 27       	eor	r31, r31
    a50c:	e6 1b       	sub	r30, r22
    a50e:	f7 0b       	sbc	r31, r23
    a510:	ff 87       	std	Y+15, r31	; 0x0f
    a512:	ee 87       	std	Y+14, r30	; 0x0e
    a514:	0f 3f       	cpi	r16, 0xFF	; 255
    a516:	10 07       	cpc	r17, r16
    a518:	29 f4       	brne	.+10     	; 0xa524 <vfprintf+0x2d6>
    a51a:	b6 01       	movw	r22, r12
    a51c:	8e e2       	ldi	r24, 0x2E	; 46
    a51e:	90 e0       	ldi	r25, 0x00	; 0
    a520:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
    a524:	a0 16       	cp	r10, r16
    a526:	b1 06       	cpc	r11, r17
    a528:	0c f4       	brge	.+2      	; 0xa52c <vfprintf+0x2de>
    a52a:	4b c0       	rjmp	.+150    	; 0xa5c2 <vfprintf+0x374>
    a52c:	40 16       	cp	r4, r16
    a52e:	51 06       	cpc	r5, r17
    a530:	0c f0       	brlt	.+2      	; 0xa534 <vfprintf+0x2e6>
    a532:	47 c0       	rjmp	.+142    	; 0xa5c2 <vfprintf+0x374>
    a534:	f5 01       	movw	r30, r10
    a536:	e0 1b       	sub	r30, r16
    a538:	f1 0b       	sbc	r31, r17
    a53a:	e8 0d       	add	r30, r8
    a53c:	f9 1d       	adc	r31, r9
    a53e:	81 81       	ldd	r24, Z+1	; 0x01
    a540:	01 50       	subi	r16, 0x01	; 1
    a542:	11 09       	sbc	r17, r1
    a544:	2e 85       	ldd	r18, Y+14	; 0x0e
    a546:	3f 85       	ldd	r19, Y+15	; 0x0f
    a548:	02 17       	cp	r16, r18
    a54a:	13 07       	cpc	r17, r19
    a54c:	e4 f1       	brlt	.+120    	; 0xa5c6 <vfprintf+0x378>
    a54e:	b6 01       	movw	r22, r12
    a550:	90 e0       	ldi	r25, 0x00	; 0
    a552:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
    a556:	de cf       	rjmp	.-68     	; 0xa514 <vfprintf+0x2c6>
    a558:	16 fd       	sbrc	r17, 6
    a55a:	9f cf       	rjmp	.-194    	; 0xa49a <vfprintf+0x24c>
    a55c:	ef 2d       	mov	r30, r15
    a55e:	f0 e0       	ldi	r31, 0x00	; 0
    a560:	ea 15       	cp	r30, r10
    a562:	fb 05       	cpc	r31, r11
    a564:	34 f0       	brlt	.+12     	; 0xa572 <vfprintf+0x324>
    a566:	3c ef       	ldi	r19, 0xFC	; 252
    a568:	a3 16       	cp	r10, r19
    a56a:	3f ef       	ldi	r19, 0xFF	; 255
    a56c:	b3 06       	cpc	r11, r19
    a56e:	0c f0       	brlt	.+2      	; 0xa572 <vfprintf+0x324>
    a570:	10 68       	ori	r17, 0x80	; 128
    a572:	32 96       	adiw	r30, 0x02	; 2
    a574:	e8 0d       	add	r30, r8
    a576:	f9 1d       	adc	r31, r9
    a578:	01 c0       	rjmp	.+2      	; 0xa57c <vfprintf+0x32e>
    a57a:	fa 94       	dec	r15
    a57c:	ff 20       	and	r15, r15
    a57e:	19 f0       	breq	.+6      	; 0xa586 <vfprintf+0x338>
    a580:	82 91       	ld	r24, -Z
    a582:	80 33       	cpi	r24, 0x30	; 48
    a584:	d1 f3       	breq	.-12     	; 0xa57a <vfprintf+0x32c>
    a586:	17 ff       	sbrs	r17, 7
    a588:	88 cf       	rjmp	.-240    	; 0xa49a <vfprintf+0x24c>
    a58a:	44 24       	eor	r4, r4
    a58c:	43 94       	inc	r4
    a58e:	4f 0c       	add	r4, r15
    a590:	fa 14       	cp	r15, r10
    a592:	1b 04       	cpc	r1, r11
    a594:	31 f0       	breq	.+12     	; 0xa5a2 <vfprintf+0x354>
    a596:	2c f0       	brlt	.+10     	; 0xa5a2 <vfprintf+0x354>
    a598:	fa 18       	sub	r15, r10
    a59a:	7f cf       	rjmp	.-258    	; 0xa49a <vfprintf+0x24c>
    a59c:	44 24       	eor	r4, r4
    a59e:	43 94       	inc	r4
    a5a0:	7c cf       	rjmp	.-264    	; 0xa49a <vfprintf+0x24c>
    a5a2:	f1 2c       	mov	r15, r1
    a5a4:	7a cf       	rjmp	.-268    	; 0xa49a <vfprintf+0x24c>
    a5a6:	b6 01       	movw	r22, r12
    a5a8:	80 e2       	ldi	r24, 0x20	; 32
    a5aa:	90 e0       	ldi	r25, 0x00	; 0
    a5ac:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
    a5b0:	ea 94       	dec	r14
    a5b2:	90 cf       	rjmp	.-224    	; 0xa4d4 <vfprintf+0x286>
    a5b4:	b6 01       	movw	r22, r12
    a5b6:	80 e3       	ldi	r24, 0x30	; 48
    a5b8:	90 e0       	ldi	r25, 0x00	; 0
    a5ba:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
    a5be:	ea 94       	dec	r14
    a5c0:	94 cf       	rjmp	.-216    	; 0xa4ea <vfprintf+0x29c>
    a5c2:	80 e3       	ldi	r24, 0x30	; 48
    a5c4:	bd cf       	rjmp	.-134    	; 0xa540 <vfprintf+0x2f2>
    a5c6:	a0 16       	cp	r10, r16
    a5c8:	b1 06       	cpc	r11, r17
    a5ca:	41 f4       	brne	.+16     	; 0xa5dc <vfprintf+0x38e>
    a5cc:	9a 81       	ldd	r25, Y+2	; 0x02
    a5ce:	96 33       	cpi	r25, 0x36	; 54
    a5d0:	50 f4       	brcc	.+20     	; 0xa5e6 <vfprintf+0x398>
    a5d2:	95 33       	cpi	r25, 0x35	; 53
    a5d4:	19 f4       	brne	.+6      	; 0xa5dc <vfprintf+0x38e>
    a5d6:	3c 85       	ldd	r19, Y+12	; 0x0c
    a5d8:	34 ff       	sbrs	r19, 4
    a5da:	05 c0       	rjmp	.+10     	; 0xa5e6 <vfprintf+0x398>
    a5dc:	b6 01       	movw	r22, r12
    a5de:	90 e0       	ldi	r25, 0x00	; 0
    a5e0:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
    a5e4:	2a cf       	rjmp	.-428    	; 0xa43a <vfprintf+0x1ec>
    a5e6:	81 e3       	ldi	r24, 0x31	; 49
    a5e8:	f9 cf       	rjmp	.-14     	; 0xa5dc <vfprintf+0x38e>
    a5ea:	8a 81       	ldd	r24, Y+2	; 0x02
    a5ec:	81 33       	cpi	r24, 0x31	; 49
    a5ee:	19 f0       	breq	.+6      	; 0xa5f6 <vfprintf+0x3a8>
    a5f0:	9c 85       	ldd	r25, Y+12	; 0x0c
    a5f2:	9f 7e       	andi	r25, 0xEF	; 239
    a5f4:	9c 87       	std	Y+12, r25	; 0x0c
    a5f6:	b6 01       	movw	r22, r12
    a5f8:	90 e0       	ldi	r25, 0x00	; 0
    a5fa:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
    a5fe:	ff 20       	and	r15, r15
    a600:	a9 f0       	breq	.+42     	; 0xa62c <vfprintf+0x3de>
    a602:	b6 01       	movw	r22, r12
    a604:	8e e2       	ldi	r24, 0x2E	; 46
    a606:	90 e0       	ldi	r25, 0x00	; 0
    a608:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
    a60c:	f3 94       	inc	r15
    a60e:	f3 94       	inc	r15
    a610:	e2 e0       	ldi	r30, 0x02	; 2
    a612:	01 e0       	ldi	r16, 0x01	; 1
    a614:	0e 0f       	add	r16, r30
    a616:	e8 0d       	add	r30, r8
    a618:	f9 2d       	mov	r31, r9
    a61a:	f1 1d       	adc	r31, r1
    a61c:	80 81       	ld	r24, Z
    a61e:	b6 01       	movw	r22, r12
    a620:	90 e0       	ldi	r25, 0x00	; 0
    a622:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
    a626:	e0 2f       	mov	r30, r16
    a628:	0f 11       	cpse	r16, r15
    a62a:	f3 cf       	rjmp	.-26     	; 0xa612 <vfprintf+0x3c4>
    a62c:	85 e6       	ldi	r24, 0x65	; 101
    a62e:	90 e0       	ldi	r25, 0x00	; 0
    a630:	14 ff       	sbrs	r17, 4
    a632:	02 c0       	rjmp	.+4      	; 0xa638 <vfprintf+0x3ea>
    a634:	85 e4       	ldi	r24, 0x45	; 69
    a636:	90 e0       	ldi	r25, 0x00	; 0
    a638:	b6 01       	movw	r22, r12
    a63a:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
    a63e:	b7 fc       	sbrc	r11, 7
    a640:	06 c0       	rjmp	.+12     	; 0xa64e <vfprintf+0x400>
    a642:	a1 14       	cp	r10, r1
    a644:	b1 04       	cpc	r11, r1
    a646:	c1 f4       	brne	.+48     	; 0xa678 <vfprintf+0x42a>
    a648:	ec 85       	ldd	r30, Y+12	; 0x0c
    a64a:	e4 ff       	sbrs	r30, 4
    a64c:	15 c0       	rjmp	.+42     	; 0xa678 <vfprintf+0x42a>
    a64e:	b1 94       	neg	r11
    a650:	a1 94       	neg	r10
    a652:	b1 08       	sbc	r11, r1
    a654:	8d e2       	ldi	r24, 0x2D	; 45
    a656:	b6 01       	movw	r22, r12
    a658:	90 e0       	ldi	r25, 0x00	; 0
    a65a:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
    a65e:	80 e3       	ldi	r24, 0x30	; 48
    a660:	2a e0       	ldi	r18, 0x0A	; 10
    a662:	a2 16       	cp	r10, r18
    a664:	b1 04       	cpc	r11, r1
    a666:	54 f4       	brge	.+20     	; 0xa67c <vfprintf+0x42e>
    a668:	b6 01       	movw	r22, r12
    a66a:	90 e0       	ldi	r25, 0x00	; 0
    a66c:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
    a670:	b6 01       	movw	r22, r12
    a672:	c5 01       	movw	r24, r10
    a674:	c0 96       	adiw	r24, 0x30	; 48
    a676:	b4 cf       	rjmp	.-152    	; 0xa5e0 <vfprintf+0x392>
    a678:	8b e2       	ldi	r24, 0x2B	; 43
    a67a:	ed cf       	rjmp	.-38     	; 0xa656 <vfprintf+0x408>
    a67c:	8f 5f       	subi	r24, 0xFF	; 255
    a67e:	fa e0       	ldi	r31, 0x0A	; 10
    a680:	af 1a       	sub	r10, r31
    a682:	b1 08       	sbc	r11, r1
    a684:	ed cf       	rjmp	.-38     	; 0xa660 <vfprintf+0x412>
    a686:	83 36       	cpi	r24, 0x63	; 99
    a688:	c9 f0       	breq	.+50     	; 0xa6bc <vfprintf+0x46e>
    a68a:	83 37       	cpi	r24, 0x73	; 115
    a68c:	71 f1       	breq	.+92     	; 0xa6ea <vfprintf+0x49c>
    a68e:	83 35       	cpi	r24, 0x53	; 83
    a690:	09 f0       	breq	.+2      	; 0xa694 <vfprintf+0x446>
    a692:	5b c0       	rjmp	.+182    	; 0xa74a <vfprintf+0x4fc>
    a694:	35 01       	movw	r6, r10
    a696:	f2 e0       	ldi	r31, 0x02	; 2
    a698:	6f 0e       	add	r6, r31
    a69a:	71 1c       	adc	r7, r1
    a69c:	f5 01       	movw	r30, r10
    a69e:	a0 80       	ld	r10, Z
    a6a0:	b1 80       	ldd	r11, Z+1	; 0x01
    a6a2:	6f 2d       	mov	r22, r15
    a6a4:	70 e0       	ldi	r23, 0x00	; 0
    a6a6:	06 fd       	sbrc	r16, 6
    a6a8:	02 c0       	rjmp	.+4      	; 0xa6ae <vfprintf+0x460>
    a6aa:	6f ef       	ldi	r22, 0xFF	; 255
    a6ac:	7f ef       	ldi	r23, 0xFF	; 255
    a6ae:	c5 01       	movw	r24, r10
    a6b0:	0f 94 dc a1 	call	0x343b8	; 0x343b8 <strnlen_P>
    a6b4:	9d 87       	std	Y+13, r25	; 0x0d
    a6b6:	8c 87       	std	Y+12, r24	; 0x0c
    a6b8:	00 68       	ori	r16, 0x80	; 128
    a6ba:	0d c0       	rjmp	.+26     	; 0xa6d6 <vfprintf+0x488>
    a6bc:	35 01       	movw	r6, r10
    a6be:	32 e0       	ldi	r19, 0x02	; 2
    a6c0:	63 0e       	add	r6, r19
    a6c2:	71 1c       	adc	r7, r1
    a6c4:	f5 01       	movw	r30, r10
    a6c6:	80 81       	ld	r24, Z
    a6c8:	89 83       	std	Y+1, r24	; 0x01
    a6ca:	21 e0       	ldi	r18, 0x01	; 1
    a6cc:	30 e0       	ldi	r19, 0x00	; 0
    a6ce:	3d 87       	std	Y+13, r19	; 0x0d
    a6d0:	2c 87       	std	Y+12, r18	; 0x0c
    a6d2:	54 01       	movw	r10, r8
    a6d4:	0f 77       	andi	r16, 0x7F	; 127
    a6d6:	03 fd       	sbrc	r16, 3
    a6d8:	06 c0       	rjmp	.+12     	; 0xa6e6 <vfprintf+0x498>
    a6da:	2c 85       	ldd	r18, Y+12	; 0x0c
    a6dc:	3d 85       	ldd	r19, Y+13	; 0x0d
    a6de:	52 16       	cp	r5, r18
    a6e0:	13 06       	cpc	r1, r19
    a6e2:	09 f0       	breq	.+2      	; 0xa6e6 <vfprintf+0x498>
    a6e4:	a8 f4       	brcc	.+42     	; 0xa710 <vfprintf+0x4c2>
    a6e6:	e5 2c       	mov	r14, r5
    a6e8:	2b c0       	rjmp	.+86     	; 0xa740 <vfprintf+0x4f2>
    a6ea:	35 01       	movw	r6, r10
    a6ec:	32 e0       	ldi	r19, 0x02	; 2
    a6ee:	63 0e       	add	r6, r19
    a6f0:	71 1c       	adc	r7, r1
    a6f2:	f5 01       	movw	r30, r10
    a6f4:	a0 80       	ld	r10, Z
    a6f6:	b1 80       	ldd	r11, Z+1	; 0x01
    a6f8:	6f 2d       	mov	r22, r15
    a6fa:	70 e0       	ldi	r23, 0x00	; 0
    a6fc:	06 fd       	sbrc	r16, 6
    a6fe:	02 c0       	rjmp	.+4      	; 0xa704 <vfprintf+0x4b6>
    a700:	6f ef       	ldi	r22, 0xFF	; 255
    a702:	7f ef       	ldi	r23, 0xFF	; 255
    a704:	c5 01       	movw	r24, r10
    a706:	0f 94 01 a2 	call	0x34402	; 0x34402 <strnlen>
    a70a:	9d 87       	std	Y+13, r25	; 0x0d
    a70c:	8c 87       	std	Y+12, r24	; 0x0c
    a70e:	e2 cf       	rjmp	.-60     	; 0xa6d4 <vfprintf+0x486>
    a710:	b6 01       	movw	r22, r12
    a712:	80 e2       	ldi	r24, 0x20	; 32
    a714:	90 e0       	ldi	r25, 0x00	; 0
    a716:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
    a71a:	5a 94       	dec	r5
    a71c:	de cf       	rjmp	.-68     	; 0xa6da <vfprintf+0x48c>
    a71e:	f5 01       	movw	r30, r10
    a720:	07 fd       	sbrc	r16, 7
    a722:	85 91       	lpm	r24, Z+
    a724:	07 ff       	sbrs	r16, 7
    a726:	81 91       	ld	r24, Z+
    a728:	5f 01       	movw	r10, r30
    a72a:	b6 01       	movw	r22, r12
    a72c:	90 e0       	ldi	r25, 0x00	; 0
    a72e:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
    a732:	e1 10       	cpse	r14, r1
    a734:	ea 94       	dec	r14
    a736:	8c 85       	ldd	r24, Y+12	; 0x0c
    a738:	9d 85       	ldd	r25, Y+13	; 0x0d
    a73a:	01 97       	sbiw	r24, 0x01	; 1
    a73c:	9d 87       	std	Y+13, r25	; 0x0d
    a73e:	8c 87       	std	Y+12, r24	; 0x0c
    a740:	ec 85       	ldd	r30, Y+12	; 0x0c
    a742:	fd 85       	ldd	r31, Y+13	; 0x0d
    a744:	ef 2b       	or	r30, r31
    a746:	59 f7       	brne	.-42     	; 0xa71e <vfprintf+0x4d0>
    a748:	78 ce       	rjmp	.-784    	; 0xa43a <vfprintf+0x1ec>
    a74a:	84 36       	cpi	r24, 0x64	; 100
    a74c:	19 f0       	breq	.+6      	; 0xa754 <vfprintf+0x506>
    a74e:	89 36       	cpi	r24, 0x69	; 105
    a750:	09 f0       	breq	.+2      	; 0xa754 <vfprintf+0x506>
    a752:	74 c0       	rjmp	.+232    	; 0xa83c <vfprintf+0x5ee>
    a754:	35 01       	movw	r6, r10
    a756:	07 ff       	sbrs	r16, 7
    a758:	66 c0       	rjmp	.+204    	; 0xa826 <vfprintf+0x5d8>
    a75a:	f4 e0       	ldi	r31, 0x04	; 4
    a75c:	6f 0e       	add	r6, r31
    a75e:	71 1c       	adc	r7, r1
    a760:	f5 01       	movw	r30, r10
    a762:	60 81       	ld	r22, Z
    a764:	71 81       	ldd	r23, Z+1	; 0x01
    a766:	82 81       	ldd	r24, Z+2	; 0x02
    a768:	93 81       	ldd	r25, Z+3	; 0x03
    a76a:	10 2f       	mov	r17, r16
    a76c:	1f 76       	andi	r17, 0x6F	; 111
    a76e:	97 ff       	sbrs	r25, 7
    a770:	08 c0       	rjmp	.+16     	; 0xa782 <vfprintf+0x534>
    a772:	90 95       	com	r25
    a774:	80 95       	com	r24
    a776:	70 95       	com	r23
    a778:	61 95       	neg	r22
    a77a:	7f 4f       	sbci	r23, 0xFF	; 255
    a77c:	8f 4f       	sbci	r24, 0xFF	; 255
    a77e:	9f 4f       	sbci	r25, 0xFF	; 255
    a780:	10 68       	ori	r17, 0x80	; 128
    a782:	2a e0       	ldi	r18, 0x0A	; 10
    a784:	30 e0       	ldi	r19, 0x00	; 0
    a786:	a4 01       	movw	r20, r8
    a788:	0f 94 6f a3 	call	0x346de	; 0x346de <__ultoa_invert>
    a78c:	a8 2e       	mov	r10, r24
    a78e:	a8 18       	sub	r10, r8
    a790:	ba 2c       	mov	r11, r10
    a792:	01 2f       	mov	r16, r17
    a794:	16 ff       	sbrs	r17, 6
    a796:	0a c0       	rjmp	.+20     	; 0xa7ac <vfprintf+0x55e>
    a798:	0e 7f       	andi	r16, 0xFE	; 254
    a79a:	af 14       	cp	r10, r15
    a79c:	38 f4       	brcc	.+14     	; 0xa7ac <vfprintf+0x55e>
    a79e:	14 ff       	sbrs	r17, 4
    a7a0:	04 c0       	rjmp	.+8      	; 0xa7aa <vfprintf+0x55c>
    a7a2:	12 fd       	sbrc	r17, 2
    a7a4:	02 c0       	rjmp	.+4      	; 0xa7aa <vfprintf+0x55c>
    a7a6:	01 2f       	mov	r16, r17
    a7a8:	0e 7e       	andi	r16, 0xEE	; 238
    a7aa:	bf 2c       	mov	r11, r15
    a7ac:	04 ff       	sbrs	r16, 4
    a7ae:	a3 c0       	rjmp	.+326    	; 0xa8f6 <vfprintf+0x6a8>
    a7b0:	fe 01       	movw	r30, r28
    a7b2:	ea 0d       	add	r30, r10
    a7b4:	f1 1d       	adc	r31, r1
    a7b6:	80 81       	ld	r24, Z
    a7b8:	80 33       	cpi	r24, 0x30	; 48
    a7ba:	09 f0       	breq	.+2      	; 0xa7be <vfprintf+0x570>
    a7bc:	95 c0       	rjmp	.+298    	; 0xa8e8 <vfprintf+0x69a>
    a7be:	09 7e       	andi	r16, 0xE9	; 233
    a7c0:	f0 2f       	mov	r31, r16
    a7c2:	f8 70       	andi	r31, 0x08	; 8
    a7c4:	ef 2e       	mov	r14, r31
    a7c6:	03 fd       	sbrc	r16, 3
    a7c8:	a5 c0       	rjmp	.+330    	; 0xa914 <vfprintf+0x6c6>
    a7ca:	00 ff       	sbrs	r16, 0
    a7cc:	9f c0       	rjmp	.+318    	; 0xa90c <vfprintf+0x6be>
    a7ce:	fa 2c       	mov	r15, r10
    a7d0:	b5 14       	cp	r11, r5
    a7d2:	10 f4       	brcc	.+4      	; 0xa7d8 <vfprintf+0x58a>
    a7d4:	f5 0c       	add	r15, r5
    a7d6:	fb 18       	sub	r15, r11
    a7d8:	04 ff       	sbrs	r16, 4
    a7da:	a2 c0       	rjmp	.+324    	; 0xa920 <vfprintf+0x6d2>
    a7dc:	b6 01       	movw	r22, r12
    a7de:	80 e3       	ldi	r24, 0x30	; 48
    a7e0:	90 e0       	ldi	r25, 0x00	; 0
    a7e2:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
    a7e6:	02 ff       	sbrs	r16, 2
    a7e8:	09 c0       	rjmp	.+18     	; 0xa7fc <vfprintf+0x5ae>
    a7ea:	88 e7       	ldi	r24, 0x78	; 120
    a7ec:	90 e0       	ldi	r25, 0x00	; 0
    a7ee:	01 ff       	sbrs	r16, 1
    a7f0:	02 c0       	rjmp	.+4      	; 0xa7f6 <vfprintf+0x5a8>
    a7f2:	88 e5       	ldi	r24, 0x58	; 88
    a7f4:	90 e0       	ldi	r25, 0x00	; 0
    a7f6:	b6 01       	movw	r22, r12
    a7f8:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
    a7fc:	af 14       	cp	r10, r15
    a7fe:	08 f4       	brcc	.+2      	; 0xa802 <vfprintf+0x5b4>
    a800:	9b c0       	rjmp	.+310    	; 0xa938 <vfprintf+0x6ea>
    a802:	aa 94       	dec	r10
    a804:	0a 2d       	mov	r16, r10
    a806:	10 e0       	ldi	r17, 0x00	; 0
    a808:	0f 5f       	subi	r16, 0xFF	; 255
    a80a:	1f 4f       	sbci	r17, 0xFF	; 255
    a80c:	08 0d       	add	r16, r8
    a80e:	19 1d       	adc	r17, r9
    a810:	f8 01       	movw	r30, r16
    a812:	82 91       	ld	r24, -Z
    a814:	8f 01       	movw	r16, r30
    a816:	b6 01       	movw	r22, r12
    a818:	90 e0       	ldi	r25, 0x00	; 0
    a81a:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
    a81e:	80 16       	cp	r8, r16
    a820:	91 06       	cpc	r9, r17
    a822:	b1 f7       	brne	.-20     	; 0xa810 <vfprintf+0x5c2>
    a824:	0a ce       	rjmp	.-1004   	; 0xa43a <vfprintf+0x1ec>
    a826:	f2 e0       	ldi	r31, 0x02	; 2
    a828:	6f 0e       	add	r6, r31
    a82a:	71 1c       	adc	r7, r1
    a82c:	f5 01       	movw	r30, r10
    a82e:	60 81       	ld	r22, Z
    a830:	71 81       	ldd	r23, Z+1	; 0x01
    a832:	07 2e       	mov	r0, r23
    a834:	00 0c       	add	r0, r0
    a836:	88 0b       	sbc	r24, r24
    a838:	99 0b       	sbc	r25, r25
    a83a:	97 cf       	rjmp	.-210    	; 0xa76a <vfprintf+0x51c>
    a83c:	10 2f       	mov	r17, r16
    a83e:	85 37       	cpi	r24, 0x75	; 117
    a840:	a9 f4       	brne	.+42     	; 0xa86c <vfprintf+0x61e>
    a842:	1f 7e       	andi	r17, 0xEF	; 239
    a844:	2a e0       	ldi	r18, 0x0A	; 10
    a846:	30 e0       	ldi	r19, 0x00	; 0
    a848:	35 01       	movw	r6, r10
    a84a:	17 ff       	sbrs	r17, 7
    a84c:	44 c0       	rjmp	.+136    	; 0xa8d6 <vfprintf+0x688>
    a84e:	f4 e0       	ldi	r31, 0x04	; 4
    a850:	6f 0e       	add	r6, r31
    a852:	71 1c       	adc	r7, r1
    a854:	f5 01       	movw	r30, r10
    a856:	60 81       	ld	r22, Z
    a858:	71 81       	ldd	r23, Z+1	; 0x01
    a85a:	82 81       	ldd	r24, Z+2	; 0x02
    a85c:	93 81       	ldd	r25, Z+3	; 0x03
    a85e:	a4 01       	movw	r20, r8
    a860:	0f 94 6f a3 	call	0x346de	; 0x346de <__ultoa_invert>
    a864:	a8 2e       	mov	r10, r24
    a866:	a8 18       	sub	r10, r8
    a868:	1f 77       	andi	r17, 0x7F	; 127
    a86a:	92 cf       	rjmp	.-220    	; 0xa790 <vfprintf+0x542>
    a86c:	19 7f       	andi	r17, 0xF9	; 249
    a86e:	8f 36       	cpi	r24, 0x6F	; 111
    a870:	79 f1       	breq	.+94     	; 0xa8d0 <vfprintf+0x682>
    a872:	f0 f4       	brcc	.+60     	; 0xa8b0 <vfprintf+0x662>
    a874:	88 35       	cpi	r24, 0x58	; 88
    a876:	39 f1       	breq	.+78     	; 0xa8c6 <vfprintf+0x678>
    a878:	f6 01       	movw	r30, r12
    a87a:	86 81       	ldd	r24, Z+6	; 0x06
    a87c:	97 81       	ldd	r25, Z+7	; 0x07
    a87e:	2f 96       	adiw	r28, 0x0f	; 15
    a880:	0f b6       	in	r0, 0x3f	; 63
    a882:	f8 94       	cli
    a884:	de bf       	out	0x3e, r29	; 62
    a886:	0f be       	out	0x3f, r0	; 63
    a888:	cd bf       	out	0x3d, r28	; 61
    a88a:	df 91       	pop	r29
    a88c:	cf 91       	pop	r28
    a88e:	1f 91       	pop	r17
    a890:	0f 91       	pop	r16
    a892:	ff 90       	pop	r15
    a894:	ef 90       	pop	r14
    a896:	df 90       	pop	r13
    a898:	cf 90       	pop	r12
    a89a:	bf 90       	pop	r11
    a89c:	af 90       	pop	r10
    a89e:	9f 90       	pop	r9
    a8a0:	8f 90       	pop	r8
    a8a2:	7f 90       	pop	r7
    a8a4:	6f 90       	pop	r6
    a8a6:	5f 90       	pop	r5
    a8a8:	4f 90       	pop	r4
    a8aa:	3f 90       	pop	r3
    a8ac:	2f 90       	pop	r2
    a8ae:	08 95       	ret
    a8b0:	80 37       	cpi	r24, 0x70	; 112
    a8b2:	39 f0       	breq	.+14     	; 0xa8c2 <vfprintf+0x674>
    a8b4:	88 37       	cpi	r24, 0x78	; 120
    a8b6:	01 f7       	brne	.-64     	; 0xa878 <vfprintf+0x62a>
    a8b8:	14 fd       	sbrc	r17, 4
    a8ba:	14 60       	ori	r17, 0x04	; 4
    a8bc:	20 e1       	ldi	r18, 0x10	; 16
    a8be:	30 e0       	ldi	r19, 0x00	; 0
    a8c0:	c3 cf       	rjmp	.-122    	; 0xa848 <vfprintf+0x5fa>
    a8c2:	10 61       	ori	r17, 0x10	; 16
    a8c4:	f9 cf       	rjmp	.-14     	; 0xa8b8 <vfprintf+0x66a>
    a8c6:	04 fd       	sbrc	r16, 4
    a8c8:	16 60       	ori	r17, 0x06	; 6
    a8ca:	20 e1       	ldi	r18, 0x10	; 16
    a8cc:	32 e0       	ldi	r19, 0x02	; 2
    a8ce:	bc cf       	rjmp	.-136    	; 0xa848 <vfprintf+0x5fa>
    a8d0:	28 e0       	ldi	r18, 0x08	; 8
    a8d2:	30 e0       	ldi	r19, 0x00	; 0
    a8d4:	b9 cf       	rjmp	.-142    	; 0xa848 <vfprintf+0x5fa>
    a8d6:	f2 e0       	ldi	r31, 0x02	; 2
    a8d8:	6f 0e       	add	r6, r31
    a8da:	71 1c       	adc	r7, r1
    a8dc:	f5 01       	movw	r30, r10
    a8de:	60 81       	ld	r22, Z
    a8e0:	71 81       	ldd	r23, Z+1	; 0x01
    a8e2:	90 e0       	ldi	r25, 0x00	; 0
    a8e4:	80 e0       	ldi	r24, 0x00	; 0
    a8e6:	bb cf       	rjmp	.-138    	; 0xa85e <vfprintf+0x610>
    a8e8:	02 fd       	sbrc	r16, 2
    a8ea:	02 c0       	rjmp	.+4      	; 0xa8f0 <vfprintf+0x6a2>
    a8ec:	b3 94       	inc	r11
    a8ee:	68 cf       	rjmp	.-304    	; 0xa7c0 <vfprintf+0x572>
    a8f0:	b3 94       	inc	r11
    a8f2:	b3 94       	inc	r11
    a8f4:	65 cf       	rjmp	.-310    	; 0xa7c0 <vfprintf+0x572>
    a8f6:	80 2f       	mov	r24, r16
    a8f8:	86 78       	andi	r24, 0x86	; 134
    a8fa:	09 f4       	brne	.+2      	; 0xa8fe <vfprintf+0x6b0>
    a8fc:	61 cf       	rjmp	.-318    	; 0xa7c0 <vfprintf+0x572>
    a8fe:	f6 cf       	rjmp	.-20     	; 0xa8ec <vfprintf+0x69e>
    a900:	b6 01       	movw	r22, r12
    a902:	80 e2       	ldi	r24, 0x20	; 32
    a904:	90 e0       	ldi	r25, 0x00	; 0
    a906:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
    a90a:	b3 94       	inc	r11
    a90c:	b5 14       	cp	r11, r5
    a90e:	c0 f3       	brcs	.-16     	; 0xa900 <vfprintf+0x6b2>
    a910:	e1 2c       	mov	r14, r1
    a912:	62 cf       	rjmp	.-316    	; 0xa7d8 <vfprintf+0x58a>
    a914:	e5 2c       	mov	r14, r5
    a916:	eb 18       	sub	r14, r11
    a918:	b5 14       	cp	r11, r5
    a91a:	08 f4       	brcc	.+2      	; 0xa91e <vfprintf+0x6d0>
    a91c:	5d cf       	rjmp	.-326    	; 0xa7d8 <vfprintf+0x58a>
    a91e:	f8 cf       	rjmp	.-16     	; 0xa910 <vfprintf+0x6c2>
    a920:	80 2f       	mov	r24, r16
    a922:	86 78       	andi	r24, 0x86	; 134
    a924:	09 f4       	brne	.+2      	; 0xa928 <vfprintf+0x6da>
    a926:	6a cf       	rjmp	.-300    	; 0xa7fc <vfprintf+0x5ae>
    a928:	8b e2       	ldi	r24, 0x2B	; 43
    a92a:	01 ff       	sbrs	r16, 1
    a92c:	80 e2       	ldi	r24, 0x20	; 32
    a92e:	07 fd       	sbrc	r16, 7
    a930:	8d e2       	ldi	r24, 0x2D	; 45
    a932:	b6 01       	movw	r22, r12
    a934:	90 e0       	ldi	r25, 0x00	; 0
    a936:	60 cf       	rjmp	.-320    	; 0xa7f8 <vfprintf+0x5aa>
    a938:	b6 01       	movw	r22, r12
    a93a:	80 e3       	ldi	r24, 0x30	; 48
    a93c:	90 e0       	ldi	r25, 0x00	; 0
    a93e:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
    a942:	fa 94       	dec	r15
    a944:	5b cf       	rjmp	.-330    	; 0xa7fc <vfprintf+0x5ae>
    a946:	b6 01       	movw	r22, r12
    a948:	80 e2       	ldi	r24, 0x20	; 32
    a94a:	90 e0       	ldi	r25, 0x00	; 0
    a94c:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
    a950:	ea 94       	dec	r14
    a952:	73 cd       	rjmp	.-1306   	; 0xa43a <vfprintf+0x1ec>
    a954:	24 e0       	ldi	r18, 0x04	; 4
    a956:	e1 2c       	mov	r14, r1
    a958:	25 15       	cp	r18, r5
    a95a:	08 f0       	brcs	.+2      	; 0xa95e <vfprintf+0x710>
    a95c:	36 cd       	rjmp	.-1428   	; 0xa3ca <vfprintf+0x17c>
    a95e:	84 e0       	ldi	r24, 0x04	; 4
    a960:	26 cd       	rjmp	.-1460   	; 0xa3ae <vfprintf+0x160>

0000a962 <restore_interrupted_gcode()>:

uint16_t restore_interrupted_gcode() {
    // When recovering from a previous print move, restore the originally
    // calculated start position on the first USB/SD command. This accounts
    // properly for relative moves
    if (
    a962:	20 e0       	ldi	r18, 0x00	; 0
    a964:	30 e0       	ldi	r19, 0x00	; 0
    a966:	40 e8       	ldi	r20, 0x80	; 128
    a968:	5f eb       	ldi	r21, 0xBF	; 191
    a96a:	60 91 7e 02 	lds	r22, 0x027E	; 0x80027e <saved_start_position>
    a96e:	70 91 7f 02 	lds	r23, 0x027F	; 0x80027f <saved_start_position+0x1>
    a972:	80 91 80 02 	lds	r24, 0x0280	; 0x800280 <saved_start_position+0x2>
    a976:	90 91 81 02 	lds	r25, 0x0281	; 0x800281 <saved_start_position+0x3>
    a97a:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
    a97e:	88 23       	and	r24, r24
    a980:	21 f1       	breq	.+72     	; 0xa9ca <restore_interrupted_gcode()+0x68>
        (saved_start_position[0] != SAVED_START_POSITION_UNSET) && (
            (CMDBUFFER_CURRENT_TYPE == CMDBUFFER_CURRENT_TYPE_SDCARD) ||
    a982:	e0 91 38 12 	lds	r30, 0x1238	; 0x801238 <bufindr>
    a986:	f0 91 39 12 	lds	r31, 0x1239	; 0x801239 <bufindr+0x1>
    a98a:	e5 5b       	subi	r30, 0xB5	; 181
    a98c:	ff 4e       	sbci	r31, 0xEF	; 239
uint16_t restore_interrupted_gcode() {
    // When recovering from a previous print move, restore the originally
    // calculated start position on the first USB/SD command. This accounts
    // properly for relative moves
    if (
        (saved_start_position[0] != SAVED_START_POSITION_UNSET) && (
    a98e:	80 81       	ld	r24, Z
    a990:	8b 7f       	andi	r24, 0xFB	; 251
    a992:	82 30       	cpi	r24, 0x02	; 2
    a994:	d1 f4       	brne	.+52     	; 0xa9ca <restore_interrupted_gcode()+0x68>
            (CMDBUFFER_CURRENT_TYPE == CMDBUFFER_CURRENT_TYPE_SDCARD) ||
            (CMDBUFFER_CURRENT_TYPE == CMDBUFFER_CURRENT_TYPE_USB_WITH_LINENR)
        )
    ) {
        memcpy(current_position, saved_start_position, sizeof(current_position));
    a996:	80 e1       	ldi	r24, 0x10	; 16
    a998:	ee e7       	ldi	r30, 0x7E	; 126
    a99a:	f2 e0       	ldi	r31, 0x02	; 2
    a99c:	a1 e6       	ldi	r26, 0x61	; 97
    a99e:	b2 e1       	ldi	r27, 0x12	; 18
    a9a0:	01 90       	ld	r0, Z+
    a9a2:	0d 92       	st	X+, r0
    a9a4:	8a 95       	dec	r24
    a9a6:	e1 f7       	brne	.-8      	; 0xa9a0 <restore_interrupted_gcode()+0x3e>
        saved_start_position[0] = SAVED_START_POSITION_UNSET;
    a9a8:	80 e0       	ldi	r24, 0x00	; 0
    a9aa:	90 e0       	ldi	r25, 0x00	; 0
    a9ac:	a0 e8       	ldi	r26, 0x80	; 128
    a9ae:	bf eb       	ldi	r27, 0xBF	; 191
    a9b0:	80 93 7e 02 	sts	0x027E, r24	; 0x80027e <saved_start_position>
    a9b4:	90 93 7f 02 	sts	0x027F, r25	; 0x80027f <saved_start_position+0x1>
    a9b8:	a0 93 80 02 	sts	0x0280, r26	; 0x800280 <saved_start_position+0x2>
    a9bc:	b0 93 81 02 	sts	0x0281, r27	; 0x800281 <saved_start_position+0x3>
        return saved_segment_idx;
    a9c0:	80 91 4d 12 	lds	r24, 0x124D	; 0x80124d <saved_segment_idx>
    a9c4:	90 91 4e 12 	lds	r25, 0x124E	; 0x80124e <saved_segment_idx+0x1>
    a9c8:	08 95       	ret
    }
    else
        return 1; //begin with the first segment
    a9ca:	81 e0       	ldi	r24, 0x01	; 1
    a9cc:	90 e0       	ldi	r25, 0x00	; 0
}
    a9ce:	08 95       	ret

0000a9d0 <set_current_to_destination()>:
void plan_set_e_position(const float &e);

// Reset the E position to zero at the start of the next segment
void plan_reset_next_e();

inline void set_current_to_destination() { memcpy(current_position, destination, sizeof(current_position)); }
    a9d0:	80 e1       	ldi	r24, 0x10	; 16
    a9d2:	e9 e2       	ldi	r30, 0x29	; 41
    a9d4:	f6 e0       	ldi	r31, 0x06	; 6
    a9d6:	a1 e6       	ldi	r26, 0x61	; 97
    a9d8:	b2 e1       	ldi	r27, 0x12	; 18
    a9da:	01 90       	ld	r0, Z+
    a9dc:	0d 92       	st	X+, r0
    a9de:	8a 95       	dec	r24
    a9e0:	e1 f7       	brne	.-8      	; 0xa9da <set_current_to_destination()+0xa>
    a9e2:	08 95       	ret

0000a9e4 <lcd_get_row_offset(unsigned char)>:
/// @brief Calculate the LCD row offset
/// @param row LCD row number, ranges from 0 to LCD_HEIGHT - 1
/// @return row offset which the LCD register understands
static uint8_t __attribute__((noinline)) lcd_get_row_offset(uint8_t row)
{
	return pgm_read_byte(row_offsets + min(row, LCD_HEIGHT - 1));
    a9e4:	e0 e5       	ldi	r30, 0x50	; 80
    a9e6:	f6 e7       	ldi	r31, 0x76	; 118
    a9e8:	83 30       	cpi	r24, 0x03	; 3
    a9ea:	21 f0       	breq	.+8      	; 0xa9f4 <lcd_get_row_offset(unsigned char)+0x10>
    a9ec:	e8 2f       	mov	r30, r24
    a9ee:	f0 e0       	ldi	r31, 0x00	; 0
    a9f0:	e3 5b       	subi	r30, 0xB3	; 179
    a9f2:	f9 48       	sbci	r31, 0x89	; 137
    a9f4:	84 91       	lpm	r24, Z
}
    a9f6:	08 95       	ret

0000a9f8 <MarlinSerial::available()>:
    static int read(void);
    static void flush(void);

    static /*FORCE_INLINE*/ int available(void)
    {
      return (unsigned int)(RX_BUFFER_SIZE + rx_buffer.head - rx_buffer.tail) % RX_BUFFER_SIZE;
    a9f8:	80 91 42 05 	lds	r24, 0x0542	; 0x800542 <rx_buffer+0x80>
    a9fc:	90 91 43 05 	lds	r25, 0x0543	; 0x800543 <rx_buffer+0x81>
    aa00:	20 91 44 05 	lds	r18, 0x0544	; 0x800544 <rx_buffer+0x82>
    aa04:	30 91 45 05 	lds	r19, 0x0545	; 0x800545 <rx_buffer+0x83>
    aa08:	82 1b       	sub	r24, r18
    aa0a:	93 0b       	sbc	r25, r19
    }
    aa0c:	8f 77       	andi	r24, 0x7F	; 127
    aa0e:	99 27       	eor	r25, r25
    aa10:	08 95       	ret

0000aa12 <adc_setmux(unsigned char)>:
    memset((void*)adc_values, 0, sizeof(adc_values));
}

static void adc_setmux(uint8_t ch)
{
	ch &= 0x0f;
    aa12:	98 2f       	mov	r25, r24
    aa14:	9f 70       	andi	r25, 0x0F	; 15
	if (ch & 0x08) ADCSRB |= (1 << MUX5);
    aa16:	83 ff       	sbrs	r24, 3
    aa18:	0d c0       	rjmp	.+26     	; 0xaa34 <adc_setmux(unsigned char)+0x22>
    aa1a:	80 91 7b 00 	lds	r24, 0x007B	; 0x80007b <__TEXT_REGION_LENGTH__+0x7c207b>
    aa1e:	88 60       	ori	r24, 0x08	; 8
	else ADCSRB &= ~(1 << MUX5);
    aa20:	80 93 7b 00 	sts	0x007B, r24	; 0x80007b <__TEXT_REGION_LENGTH__+0x7c207b>
	ADMUX = (ADMUX & ~(0x07)) | (ch & 0x07);
    aa24:	80 91 7c 00 	lds	r24, 0x007C	; 0x80007c <__TEXT_REGION_LENGTH__+0x7c207c>
    aa28:	88 7f       	andi	r24, 0xF8	; 248
    aa2a:	97 70       	andi	r25, 0x07	; 7
    aa2c:	89 2b       	or	r24, r25
    aa2e:	80 93 7c 00 	sts	0x007C, r24	; 0x80007c <__TEXT_REGION_LENGTH__+0x7c207c>
}
    aa32:	08 95       	ret

static void adc_setmux(uint8_t ch)
{
	ch &= 0x0f;
	if (ch & 0x08) ADCSRB |= (1 << MUX5);
	else ADCSRB &= ~(1 << MUX5);
    aa34:	80 91 7b 00 	lds	r24, 0x007B	; 0x80007b <__TEXT_REGION_LENGTH__+0x7c207b>
    aa38:	87 7f       	andi	r24, 0xF7	; 247
    aa3a:	f2 cf       	rjmp	.-28     	; 0xaa20 <adc_setmux(unsigned char)+0xe>

0000aa3c <reset_bed_offset_and_skew()>:
        if (previous_value != value) {
            eeprom_dword_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_dword(dst, value);
    aa3c:	4f ef       	ldi	r20, 0xFF	; 255
    aa3e:	5f ef       	ldi	r21, 0xFF	; 255
    aa40:	ba 01       	movw	r22, r20
    aa42:	85 ee       	ldi	r24, 0xE5	; 229
    aa44:	9f e0       	ldi	r25, 0x0F	; 15
    aa46:	0f 94 16 a4 	call	0x3482c	; 0x3482c <eeprom_update_dword>
    aa4a:	4f ef       	ldi	r20, 0xFF	; 255
    aa4c:	5f ef       	ldi	r21, 0xFF	; 255
    aa4e:	ba 01       	movw	r22, r20
    aa50:	89 ee       	ldi	r24, 0xE9	; 233
    aa52:	9f e0       	ldi	r25, 0x0F	; 15
    aa54:	0f 94 16 a4 	call	0x3482c	; 0x3482c <eeprom_update_dword>
    aa58:	4f ef       	ldi	r20, 0xFF	; 255
    aa5a:	5f ef       	ldi	r21, 0xFF	; 255
    aa5c:	ba 01       	movw	r22, r20
    aa5e:	8d ed       	ldi	r24, 0xDD	; 221
    aa60:	9f e0       	ldi	r25, 0x0F	; 15
    aa62:	0f 94 16 a4 	call	0x3482c	; 0x3482c <eeprom_update_dword>
    aa66:	4f ef       	ldi	r20, 0xFF	; 255
    aa68:	5f ef       	ldi	r21, 0xFF	; 255
    aa6a:	ba 01       	movw	r22, r20
    aa6c:	81 ee       	ldi	r24, 0xE1	; 225
    aa6e:	9f e0       	ldi	r25, 0x0F	; 15
    aa70:	0f 94 16 a4 	call	0x3482c	; 0x3482c <eeprom_update_dword>
    aa74:	4f ef       	ldi	r20, 0xFF	; 255
    aa76:	5f ef       	ldi	r21, 0xFF	; 255
    aa78:	ba 01       	movw	r22, r20
    aa7a:	85 ed       	ldi	r24, 0xD5	; 213
    aa7c:	9f e0       	ldi	r25, 0x0F	; 15
    aa7e:	0f 94 16 a4 	call	0x3482c	; 0x3482c <eeprom_update_dword>
    aa82:	4f ef       	ldi	r20, 0xFF	; 255
    aa84:	5f ef       	ldi	r21, 0xFF	; 255
    aa86:	ba 01       	movw	r22, r20
    aa88:	89 ed       	ldi	r24, 0xD9	; 217
    aa8a:	9f e0       	ldi	r25, 0x0F	; 15
    aa8c:	0f 94 16 a4 	call	0x3482c	; 0x3482c <eeprom_update_dword>
    aa90:	4f ef       	ldi	r20, 0xFF	; 255
    aa92:	5f ef       	ldi	r21, 0xFF	; 255
    aa94:	ba 01       	movw	r22, r20
    aa96:	85 ec       	ldi	r24, 0xC5	; 197
    aa98:	9f e0       	ldi	r25, 0x0F	; 15
    aa9a:	0f 94 16 a4 	call	0x3482c	; 0x3482c <eeprom_update_dword>
    aa9e:	4f ef       	ldi	r20, 0xFF	; 255
    aaa0:	5f ef       	ldi	r21, 0xFF	; 255
    aaa2:	ba 01       	movw	r22, r20
    aaa4:	89 ec       	ldi	r24, 0xC9	; 201
    aaa6:	9f e0       	ldi	r25, 0x0F	; 15
    aaa8:	0f 94 16 a4 	call	0x3482c	; 0x3482c <eeprom_update_dword>
    aaac:	4f ef       	ldi	r20, 0xFF	; 255
    aaae:	5f ef       	ldi	r21, 0xFF	; 255
    aab0:	ba 01       	movw	r22, r20
    aab2:	8d ec       	ldi	r24, 0xCD	; 205
    aab4:	9f e0       	ldi	r25, 0x0F	; 15
    aab6:	0f 94 16 a4 	call	0x3482c	; 0x3482c <eeprom_update_dword>
    aaba:	4f ef       	ldi	r20, 0xFF	; 255
    aabc:	5f ef       	ldi	r21, 0xFF	; 255
    aabe:	ba 01       	movw	r22, r20
    aac0:	81 ed       	ldi	r24, 0xD1	; 209
    aac2:	9f e0       	ldi	r25, 0x0F	; 15
    aac4:	0d 94 16 a4 	jmp	0x3482c	; 0x3482c <eeprom_update_dword>

0000aac8 <cmdqueue_could_enqueue_back(unsigned int)>:
// This function may update bufindw, therefore for the power panic to work, this function must be called
// with the interrupts disabled!
static bool __attribute__((noinline)) cmdqueue_could_enqueue_back(size_t len_asked)
{
    // MAX_CMD_SIZE has to accommodate the zero terminator.
    if (len_asked >= MAX_CMD_SIZE)
    aac8:	80 36       	cpi	r24, 0x60	; 96
    aaca:	91 05       	cpc	r25, r1
    aacc:	f8 f4       	brcc	.+62     	; 0xab0c <cmdqueue_could_enqueue_back(unsigned int)+0x44>
        return false;

    if (bufindr == bufindw && buflen > 0)
    aace:	40 91 38 12 	lds	r20, 0x1238	; 0x801238 <bufindr>
    aad2:	50 91 39 12 	lds	r21, 0x1239	; 0x801239 <bufindr+0x1>
    aad6:	20 91 49 10 	lds	r18, 0x1049	; 0x801049 <_ZL7bufindw.lto_priv.514>
    aada:	30 91 4a 10 	lds	r19, 0x104A	; 0x80104a <_ZL7bufindw.lto_priv.514+0x1>
    aade:	42 17       	cp	r20, r18
    aae0:	53 07       	cpc	r21, r19
    aae2:	39 f4       	brne	.+14     	; 0xaaf2 <cmdqueue_could_enqueue_back(unsigned int)+0x2a>
    aae4:	60 91 3c 12 	lds	r22, 0x123C	; 0x80123c <buflen>
    aae8:	70 91 3d 12 	lds	r23, 0x123D	; 0x80123d <buflen+0x1>
    aaec:	16 16       	cp	r1, r22
    aaee:	17 06       	cpc	r1, r23
    aaf0:	6c f0       	brlt	.+26     	; 0xab0c <cmdqueue_could_enqueue_back(unsigned int)+0x44>
    // If there is some data stored starting at bufindw, len_asked is certainly smaller than
    // the allocated data buffer. Try to reserve a new buffer and to move the already received
    // serial data.
    // How much memory to reserve for the commands pushed to the front?
    // End of the queue, when pushing to the end.
    size_t endw = bufindw + len_asked + (1 + CMDHDRSIZE);
    aaf2:	b9 01       	movw	r22, r18
    aaf4:	68 0f       	add	r22, r24
    aaf6:	79 1f       	adc	r23, r25
    aaf8:	fb 01       	movw	r30, r22
    aafa:	e3 59       	subi	r30, 0x93	; 147
    aafc:	ff 4f       	sbci	r31, 0xFF	; 255
    if (bufindw < bufindr)
    aafe:	24 17       	cp	r18, r20
    ab00:	35 07       	cpc	r19, r21
    ab02:	30 f4       	brcc	.+12     	; 0xab10 <cmdqueue_could_enqueue_back(unsigned int)+0x48>
        // Simple case. There is a contiguous space between the write buffer and the read buffer.
        return endw + CMDBUFFER_RESERVE_FRONT <= bufindr;
    ab04:	81 e0       	ldi	r24, 0x01	; 1
    ab06:	4e 17       	cp	r20, r30
    ab08:	5f 07       	cpc	r21, r31
    ab0a:	08 f4       	brcc	.+2      	; 0xab0e <cmdqueue_could_enqueue_back(unsigned int)+0x46>
// with the interrupts disabled!
static bool __attribute__((noinline)) cmdqueue_could_enqueue_back(size_t len_asked)
{
    // MAX_CMD_SIZE has to accommodate the zero terminator.
    if (len_asked >= MAX_CMD_SIZE)
        return false;
    ab0c:	80 e0       	ldi	r24, 0x00	; 0
        // Be careful! The bufindw needs to be changed atomically for the power panic & filament panic to work.
        ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { bufindw = 0; }
        return true;
    }
    return false;
}
    ab0e:	08 95       	ret
    size_t endw = bufindw + len_asked + (1 + CMDHDRSIZE);
    if (bufindw < bufindr)
        // Simple case. There is a contiguous space between the write buffer and the read buffer.
        return endw + CMDBUFFER_RESERVE_FRONT <= bufindr;
    // Otherwise the free space is split between the start and end.
    if (// Could one fit to the end, including the reserve?
    ab10:	ee 3e       	cpi	r30, 0xEE	; 238
    ab12:	f1 40       	sbci	r31, 0x01	; 1
    ab14:	f8 f0       	brcs	.+62     	; 0xab54 <cmdqueue_could_enqueue_back(unsigned int)+0x8c>
    // If there is some data stored starting at bufindw, len_asked is certainly smaller than
    // the allocated data buffer. Try to reserve a new buffer and to move the already received
    // serial data.
    // How much memory to reserve for the commands pushed to the front?
    // End of the queue, when pushing to the end.
    size_t endw = bufindw + len_asked + (1 + CMDHDRSIZE);
    ab16:	6c 5f       	subi	r22, 0xFC	; 252
    ab18:	7f 4f       	sbci	r23, 0xFF	; 255
    if (bufindw < bufindr)
        // Simple case. There is a contiguous space between the write buffer and the read buffer.
        return endw + CMDBUFFER_RESERVE_FRONT <= bufindr;
    // Otherwise the free space is split between the start and end.
    if (// Could one fit to the end, including the reserve?
        endw + CMDBUFFER_RESERVE_FRONT <= sizeof(cmdbuffer) ||
    ab1a:	6e 3e       	cpi	r22, 0xEE	; 238
    ab1c:	71 40       	sbci	r23, 0x01	; 1
    ab1e:	18 f4       	brcc	.+6      	; 0xab26 <cmdqueue_could_enqueue_back(unsigned int)+0x5e>
        // Could one fit to the end, and the reserve to the start?
        (endw <= sizeof(cmdbuffer) && CMDBUFFER_RESERVE_FRONT <= bufindr))
    ab20:	49 36       	cpi	r20, 0x69	; 105
    ab22:	51 05       	cpc	r21, r1
    ab24:	b8 f4       	brcc	.+46     	; 0xab54 <cmdqueue_could_enqueue_back(unsigned int)+0x8c>
        return true;
    // Could one fit both to the start?
    if (len_asked + (1 + CMDHDRSIZE) + CMDBUFFER_RESERVE_FRONT <= bufindr) {
    ab26:	83 59       	subi	r24, 0x93	; 147
    ab28:	9f 4f       	sbci	r25, 0xFF	; 255
    ab2a:	48 17       	cp	r20, r24
    ab2c:	59 07       	cpc	r21, r25
    ab2e:	70 f3       	brcs	.-36     	; 0xab0c <cmdqueue_could_enqueue_back(unsigned int)+0x44>
        // Mark the rest of the buffer as used.
        memset(cmdbuffer+bufindw, 0, sizeof(cmdbuffer)-bufindw);
    ab30:	4d ee       	ldi	r20, 0xED	; 237
    ab32:	51 e0       	ldi	r21, 0x01	; 1
    ab34:	42 1b       	sub	r20, r18
    ab36:	53 0b       	sbc	r21, r19
    ab38:	70 e0       	ldi	r23, 0x00	; 0
    ab3a:	60 e0       	ldi	r22, 0x00	; 0
    ab3c:	c9 01       	movw	r24, r18
    ab3e:	85 5b       	subi	r24, 0xB5	; 181
    ab40:	9f 4e       	sbci	r25, 0xEF	; 239
    ab42:	0f 94 12 aa 	call	0x35424	; 0x35424 <memset>
        // and point to the start.
        // Be careful! The bufindw needs to be changed atomically for the power panic & filament panic to work.
        ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { bufindw = 0; }
    ab46:	8f b7       	in	r24, 0x3f	; 63
    return 1;
}

static __inline__ uint8_t __iCliRetVal(void)
{
    cli();
    ab48:	f8 94       	cli
    ab4a:	10 92 4a 10 	sts	0x104A, r1	; 0x80104a <_ZL7bufindw.lto_priv.514+0x1>
    ab4e:	10 92 49 10 	sts	0x1049, r1	; 0x801049 <_ZL7bufindw.lto_priv.514>
    (void)__s;
}

static __inline__ void __iRestore(const  uint8_t *__s)
{
    SREG = *__s;
    ab52:	8f bf       	out	0x3f, r24	; 63
    // Otherwise the free space is split between the start and end.
    if (// Could one fit to the end, including the reserve?
        endw + CMDBUFFER_RESERVE_FRONT <= sizeof(cmdbuffer) ||
        // Could one fit to the end, and the reserve to the start?
        (endw <= sizeof(cmdbuffer) && CMDBUFFER_RESERVE_FRONT <= bufindr))
        return true;
    ab54:	81 e0       	ldi	r24, 0x01	; 1
    ab56:	08 95       	ret

0000ab58 <FlushSerialRequestResend()>:
  // don't reverse this or there may be problems if the RX interrupt
  // occurs after reading the value of rx_buffer_head but before writing
  // the value to rx_buffer_tail; the previous value of rx_buffer_head
  // may be written to rx_buffer_tail, making it appear as if the buffer
  // were full, not empty.
  rx_buffer.head = rx_buffer.tail;
    ab58:	80 91 44 05 	lds	r24, 0x0544	; 0x800544 <rx_buffer+0x82>
    ab5c:	90 91 45 05 	lds	r25, 0x0545	; 0x800545 <rx_buffer+0x83>
    ab60:	90 93 43 05 	sts	0x0543, r25	; 0x800543 <rx_buffer+0x81>
    ab64:	80 93 42 05 	sts	0x0542, r24	; 0x800542 <rx_buffer+0x80>

void FlushSerialRequestResend()
{
  //char cmdbuffer[bufindr][100]="Resend:";
  MYSERIAL.flush();
  printf_P(_N("%S: %ld\n%S\n"), _n("Resend"), gcode_LastN + 1, MSG_OK);
    ab68:	80 ef       	ldi	r24, 0xF0	; 240
    ab6a:	99 e6       	ldi	r25, 0x69	; 105
    ab6c:	9f 93       	push	r25
    ab6e:	8f 93       	push	r24
    ab70:	80 91 3e 12 	lds	r24, 0x123E	; 0x80123e <gcode_LastN>
    ab74:	90 91 3f 12 	lds	r25, 0x123F	; 0x80123f <gcode_LastN+0x1>
    ab78:	a0 91 40 12 	lds	r26, 0x1240	; 0x801240 <gcode_LastN+0x2>
    ab7c:	b0 91 41 12 	lds	r27, 0x1241	; 0x801241 <gcode_LastN+0x3>
    ab80:	01 96       	adiw	r24, 0x01	; 1
    ab82:	a1 1d       	adc	r26, r1
    ab84:	b1 1d       	adc	r27, r1
    ab86:	bf 93       	push	r27
    ab88:	af 93       	push	r26
    ab8a:	9f 93       	push	r25
    ab8c:	8f 93       	push	r24
    ab8e:	8b e4       	ldi	r24, 0x4B	; 75
    ab90:	94 e6       	ldi	r25, 0x64	; 100
    ab92:	9f 93       	push	r25
    ab94:	8f 93       	push	r24
    ab96:	82 e5       	ldi	r24, 0x52	; 82
    ab98:	94 e6       	ldi	r25, 0x64	; 100
    ab9a:	9f 93       	push	r25
    ab9c:	8f 93       	push	r24
    ab9e:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
    aba2:	8d b7       	in	r24, 0x3d	; 61
    aba4:	9e b7       	in	r25, 0x3e	; 62
    aba6:	0a 96       	adiw	r24, 0x0a	; 10
    aba8:	0f b6       	in	r0, 0x3f	; 63
    abaa:	f8 94       	cli
    abac:	9e bf       	out	0x3e, r25	; 62
    abae:	0f be       	out	0x3f, r0	; 63
    abb0:	8d bf       	out	0x3d, r24	; 61
}
    abb2:	08 95       	ret

0000abb4 <eeprom_is_initialized_block(void const*, unsigned int)>:
bool __attribute__((noinline)) eeprom_is_sheet_initialized(uint8_t sheet_num) {
    return (eeprom_read_word(reinterpret_cast<uint16_t*>(&(EEPROM_Sheets_base->s[sheet_num].z_offset))) != EEPROM_EMPTY_VALUE16);
}


bool __attribute__((noinline)) eeprom_is_initialized_block(const void *__p, size_t __n) {
    abb4:	0f 93       	push	r16
    abb6:	1f 93       	push	r17
    abb8:	cf 93       	push	r28
    abba:	df 93       	push	r29
    abbc:	ec 01       	movw	r28, r24
    abbe:	c6 0f       	add	r28, r22
    abc0:	d7 1f       	adc	r29, r23
    const uint8_t *p = (const uint8_t*)__p;
    while (__n--) {
    abc2:	8c 17       	cp	r24, r28
    abc4:	9d 07       	cpc	r25, r29
    abc6:	79 f0       	breq	.+30     	; 0xabe6 <eeprom_is_initialized_block(void const*, unsigned int)+0x32>
        if (eeprom_read_byte(p++) != EEPROM_EMPTY_VALUE)
    abc8:	8c 01       	movw	r16, r24
    abca:	0f 5f       	subi	r16, 0xFF	; 255
    abcc:	1f 4f       	sbci	r17, 0xFF	; 255
    abce:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
    abd2:	8f 3f       	cpi	r24, 0xFF	; 255
    abd4:	31 f0       	breq	.+12     	; 0xabe2 <eeprom_is_initialized_block(void const*, unsigned int)+0x2e>
            return true;
    abd6:	81 e0       	ldi	r24, 0x01	; 1
    }
    return false;
}
    abd8:	df 91       	pop	r29
    abda:	cf 91       	pop	r28
    abdc:	1f 91       	pop	r17
    abde:	0f 91       	pop	r16
    abe0:	08 95       	ret


bool __attribute__((noinline)) eeprom_is_initialized_block(const void *__p, size_t __n) {
    const uint8_t *p = (const uint8_t*)__p;
    while (__n--) {
        if (eeprom_read_byte(p++) != EEPROM_EMPTY_VALUE)
    abe2:	c8 01       	movw	r24, r16
    abe4:	ee cf       	rjmp	.-36     	; 0xabc2 <eeprom_is_initialized_block(void const*, unsigned int)+0xe>
            return true;
    }
    return false;
    abe6:	80 e0       	ldi	r24, 0x00	; 0
    abe8:	f7 cf       	rjmp	.-18     	; 0xabd8 <eeprom_is_initialized_block(void const*, unsigned int)+0x24>

0000abea <code_seen(char) [clone .lto_priv.511]>:
#if defined(__cplusplus)
}
#endif

// Return True if a character was found
static inline bool    code_seen(char code) { return (strchr_pointer = strchr(CMDBUFFER_CURRENT_STRING, code)) != NULL; }
    abea:	68 2f       	mov	r22, r24
    abec:	88 0f       	add	r24, r24
    abee:	77 0b       	sbc	r23, r23
    abf0:	80 91 38 12 	lds	r24, 0x1238	; 0x801238 <bufindr>
    abf4:	90 91 39 12 	lds	r25, 0x1239	; 0x801239 <bufindr+0x1>
    abf8:	82 5b       	subi	r24, 0xB2	; 178
    abfa:	9f 4e       	sbci	r25, 0xEF	; 239
    abfc:	0f 94 37 aa 	call	0x3546e	; 0x3546e <strchr>
    ac00:	9c 01       	movw	r18, r24
    ac02:	90 93 bc 04 	sts	0x04BC, r25	; 0x8004bc <strchr_pointer+0x1>
    ac06:	80 93 bb 04 	sts	0x04BB, r24	; 0x8004bb <strchr_pointer>
    ac0a:	81 e0       	ldi	r24, 0x01	; 1
    ac0c:	23 2b       	or	r18, r19
    ac0e:	09 f4       	brne	.+2      	; 0xac12 <code_seen(char) [clone .lto_priv.511]+0x28>
    ac10:	80 e0       	ldi	r24, 0x00	; 0
    ac12:	08 95       	ret

0000ac14 <code_value_uint8()>:
static inline bool    code_seen_P(const char *code_PROGMEM) { return (strchr_pointer = strstr_P(CMDBUFFER_CURRENT_STRING, code_PROGMEM)) != NULL; }
static inline float   code_value()      { return strtod_noE(strchr_pointer+1, NULL);}
static inline long    code_value_long()    { return strtol(strchr_pointer+1, NULL, 10); }
static inline int16_t code_value_short()   { return int16_t(strtol(strchr_pointer+1, NULL, 10)); };
static inline uint8_t code_value_uint8()   { return uint8_t(strtol(strchr_pointer+1, NULL, 10)); };
    ac14:	80 91 bb 04 	lds	r24, 0x04BB	; 0x8004bb <strchr_pointer>
    ac18:	90 91 bc 04 	lds	r25, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
    ac1c:	4a e0       	ldi	r20, 0x0A	; 10
    ac1e:	50 e0       	ldi	r21, 0x00	; 0
    ac20:	70 e0       	ldi	r23, 0x00	; 0
    ac22:	60 e0       	ldi	r22, 0x00	; 0
    ac24:	01 96       	adiw	r24, 0x01	; 1
    ac26:	0f 94 6b 9f 	call	0x33ed6	; 0x33ed6 <strtol>
    ac2a:	86 2f       	mov	r24, r22
    ac2c:	08 95       	ret

0000ac2e <code_value_short() [clone .lto_priv.505]>:
// Return True if a character was found
static inline bool    code_seen(char code) { return (strchr_pointer = strchr(CMDBUFFER_CURRENT_STRING, code)) != NULL; }
static inline bool    code_seen_P(const char *code_PROGMEM) { return (strchr_pointer = strstr_P(CMDBUFFER_CURRENT_STRING, code_PROGMEM)) != NULL; }
static inline float   code_value()      { return strtod_noE(strchr_pointer+1, NULL);}
static inline long    code_value_long()    { return strtol(strchr_pointer+1, NULL, 10); }
static inline int16_t code_value_short()   { return int16_t(strtol(strchr_pointer+1, NULL, 10)); };
    ac2e:	80 91 bb 04 	lds	r24, 0x04BB	; 0x8004bb <strchr_pointer>
    ac32:	90 91 bc 04 	lds	r25, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
    ac36:	4a e0       	ldi	r20, 0x0A	; 10
    ac38:	50 e0       	ldi	r21, 0x00	; 0
    ac3a:	70 e0       	ldi	r23, 0x00	; 0
    ac3c:	60 e0       	ldi	r22, 0x00	; 0
    ac3e:	01 96       	adiw	r24, 0x01	; 1
    ac40:	0f 94 6b 9f 	call	0x33ed6	; 0x33ed6 <strtol>
    ac44:	cb 01       	movw	r24, r22
    ac46:	08 95       	ret

0000ac48 <gcode_G80()::{lambda(char, unsigned char*)#1}::operator()(char, unsigned char*) const>:
#endif
    babystep_apply(); // Apply Z height correction aka baby stepping before mesh bed leveing gets activated.

    { // Apply the bed level correction to the mesh
        bool eeprom_bed_correction_valid = eeprom_read_byte((unsigned char*)EEPROM_BED_CORRECTION_VALID) == 1;
        auto bedCorrectHelper = [eeprom_bed_correction_valid] (char code, uint8_t *eep_address) -> int8_t {
    ac48:	0f 93       	push	r16
    ac4a:	1f 93       	push	r17
    ac4c:	cf 93       	push	r28
    ac4e:	df 93       	push	r29
    ac50:	8c 01       	movw	r16, r24
    ac52:	86 2f       	mov	r24, r22
    ac54:	ea 01       	movw	r28, r20
            if (code_seen(code)) {
    ac56:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
    ac5a:	88 23       	and	r24, r24
    ac5c:	19 f1       	breq	.+70     	; 0xaca4 <gcode_G80()::{lambda(char, unsigned char*)#1}::operator()(char, unsigned char*) const+0x5c>
                // Verify value is within allowed range
                int16_t temp = code_value_short();
    ac5e:	0e 94 17 56 	call	0xac2e	; 0xac2e <code_value_short() [clone .lto_priv.505]>
                if (abs(temp) > BED_ADJUSTMENT_UM_MAX) {
    ac62:	9c 01       	movw	r18, r24
    ac64:	97 ff       	sbrs	r25, 7
    ac66:	03 c0       	rjmp	.+6      	; 0xac6e <gcode_G80()::{lambda(char, unsigned char*)#1}::operator()(char, unsigned char*) const+0x26>
    ac68:	31 95       	neg	r19
    ac6a:	21 95       	neg	r18
    ac6c:	31 09       	sbc	r19, r1
    ac6e:	25 36       	cpi	r18, 0x65	; 101
    ac70:	31 05       	cpc	r19, r1
    ac72:	9c f0       	brlt	.+38     	; 0xac9a <gcode_G80()::{lambda(char, unsigned char*)#1}::operator()(char, unsigned char*) const+0x52>
                    printf_P(PSTR("%SExcessive bed leveling correction: %i microns\n"), errormagic, temp);
    ac74:	9f 93       	push	r25
    ac76:	8f 93       	push	r24
    ac78:	81 eb       	ldi	r24, 0xB1	; 177
    ac7a:	91 ea       	ldi	r25, 0xA1	; 161
    ac7c:	9f 93       	push	r25
    ac7e:	8f 93       	push	r24
    ac80:	8d ec       	ldi	r24, 0xCD	; 205
    ac82:	96 e7       	ldi	r25, 0x76	; 118
    ac84:	9f 93       	push	r25
    ac86:	8f 93       	push	r24
    ac88:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
    ac8c:	0f 90       	pop	r0
    ac8e:	0f 90       	pop	r0
    ac90:	0f 90       	pop	r0
    ac92:	0f 90       	pop	r0
    ac94:	0f 90       	pop	r0
    ac96:	0f 90       	pop	r0
                    return (int8_t)temp; // Value is valid, use it
                }
            } else if (eeprom_bed_correction_valid) {
                return (int8_t)eeprom_read_byte(eep_address);
            }
            return 0;
    ac98:	80 e0       	ldi	r24, 0x00	; 0
        };
    ac9a:	df 91       	pop	r29
    ac9c:	cf 91       	pop	r28
    ac9e:	1f 91       	pop	r17
    aca0:	0f 91       	pop	r16
    aca2:	08 95       	ret
                if (abs(temp) > BED_ADJUSTMENT_UM_MAX) {
                    printf_P(PSTR("%SExcessive bed leveling correction: %i microns\n"), errormagic, temp);
                } else {
                    return (int8_t)temp; // Value is valid, use it
                }
            } else if (eeprom_bed_correction_valid) {
    aca4:	f8 01       	movw	r30, r16
    aca6:	80 81       	ld	r24, Z
    aca8:	88 23       	and	r24, r24
    acaa:	b1 f3       	breq	.-20     	; 0xac98 <gcode_G80()::{lambda(char, unsigned char*)#1}::operator()(char, unsigned char*) const+0x50>
                return (int8_t)eeprom_read_byte(eep_address);
    acac:	ce 01       	movw	r24, r28
            }
            return 0;
        };
    acae:	df 91       	pop	r29
    acb0:	cf 91       	pop	r28
    acb2:	1f 91       	pop	r17
    acb4:	0f 91       	pop	r16
                    printf_P(PSTR("%SExcessive bed leveling correction: %i microns\n"), errormagic, temp);
                } else {
                    return (int8_t)temp; // Value is valid, use it
                }
            } else if (eeprom_bed_correction_valid) {
                return (int8_t)eeprom_read_byte(eep_address);
    acb6:	0d 94 e0 a3 	jmp	0x347c0	; 0x347c0 <eeprom_read_byte>

0000acba <code_value_long() [clone .lto_priv.507]>:

// Return True if a character was found
static inline bool    code_seen(char code) { return (strchr_pointer = strchr(CMDBUFFER_CURRENT_STRING, code)) != NULL; }
static inline bool    code_seen_P(const char *code_PROGMEM) { return (strchr_pointer = strstr_P(CMDBUFFER_CURRENT_STRING, code_PROGMEM)) != NULL; }
static inline float   code_value()      { return strtod_noE(strchr_pointer+1, NULL);}
static inline long    code_value_long()    { return strtol(strchr_pointer+1, NULL, 10); }
    acba:	80 91 bb 04 	lds	r24, 0x04BB	; 0x8004bb <strchr_pointer>
    acbe:	90 91 bc 04 	lds	r25, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
    acc2:	4a e0       	ldi	r20, 0x0A	; 10
    acc4:	50 e0       	ldi	r21, 0x00	; 0
    acc6:	70 e0       	ldi	r23, 0x00	; 0
    acc8:	60 e0       	ldi	r22, 0x00	; 0
    acca:	01 96       	adiw	r24, 0x01	; 1
    accc:	0d 94 6b 9f 	jmp	0x33ed6	; 0x33ed6 <strtol>

0000acd0 <failstats_reset_print()>:
        if (previous_value != value) {
            eeprom_byte_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_byte(dst, value);
    acd0:	60 e0       	ldi	r22, 0x00	; 0
    acd2:	86 e6       	ldi	r24, 0x66	; 102
    acd4:	9f e0       	ldi	r25, 0x0F	; 15
    acd6:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
    acda:	60 e0       	ldi	r22, 0x00	; 0
    acdc:	88 e6       	ldi	r24, 0x68	; 104
    acde:	9f e0       	ldi	r25, 0x0F	; 15
    ace0:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
    ace4:	60 e0       	ldi	r22, 0x00	; 0
    ace6:	85 e6       	ldi	r24, 0x65	; 101
    ace8:	9f e0       	ldi	r25, 0x0F	; 15
    acea:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
    acee:	60 e0       	ldi	r22, 0x00	; 0
    acf0:	84 e6       	ldi	r24, 0x64	; 100
    acf2:	9f e0       	ldi	r25, 0x0F	; 15
    acf4:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
    acf8:	60 e0       	ldi	r22, 0x00	; 0
    acfa:	82 ed       	ldi	r24, 0xD2	; 210
    acfc:	9e e0       	ldi	r25, 0x0E	; 14
    acfe:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
    ad02:	60 e0       	ldi	r22, 0x00	; 0
    ad04:	8f ec       	ldi	r24, 0xCF	; 207
    ad06:	9e e0       	ldi	r25, 0x0E	; 14
    ad08:	0d 94 04 a4 	jmp	0x34808	; 0x34808 <eeprom_update_byte>

0000ad0c <temp_comp_interpolation(float)>:
		//we have no temp compensation data
	}
}
#endif //ndef PINDA_THERMISTOR

float temp_comp_interpolation(float inp_temperature) {
    ad0c:	2f 92       	push	r2
    ad0e:	3f 92       	push	r3
    ad10:	4f 92       	push	r4
    ad12:	5f 92       	push	r5
    ad14:	6f 92       	push	r6
    ad16:	7f 92       	push	r7
    ad18:	8f 92       	push	r8
    ad1a:	9f 92       	push	r9
    ad1c:	af 92       	push	r10
    ad1e:	bf 92       	push	r11
    ad20:	cf 92       	push	r12
    ad22:	df 92       	push	r13
    ad24:	ef 92       	push	r14
    ad26:	ff 92       	push	r15
    ad28:	0f 93       	push	r16
    ad2a:	1f 93       	push	r17
    ad2c:	cf 93       	push	r28
    ad2e:	df 93       	push	r29
    ad30:	cd b7       	in	r28, 0x3d	; 61
    ad32:	de b7       	in	r29, 0x3e	; 62
    ad34:	cc 58       	subi	r28, 0x8C	; 140
    ad36:	d2 40       	sbci	r29, 0x02	; 2
    ad38:	0f b6       	in	r0, 0x3f	; 63
    ad3a:	f8 94       	cli
    ad3c:	de bf       	out	0x3e, r29	; 62
    ad3e:	0f be       	out	0x3f, r0	; 63
    ad40:	cd bf       	out	0x3d, r28	; 61
    ad42:	cb 58       	subi	r28, 0x8B	; 139
    ad44:	dd 4f       	sbci	r29, 0xFD	; 253
    ad46:	68 83       	st	Y, r22
    ad48:	79 83       	std	Y+1, r23	; 0x01
    ad4a:	8a 83       	std	Y+2, r24	; 0x02
    ad4c:	9b 83       	std	Y+3, r25	; 0x03
    ad4e:	c5 57       	subi	r28, 0x75	; 117
    ad50:	d2 40       	sbci	r29, 0x02	; 2

	//cubic spline interpolation

	int n, i, j;
	float h[10], a, b, c, d, sum, s[10] = { 0 }, x[10], F[10], f[10], m[10][10] = { 0 }, temp;
    ad52:	fe 01       	movw	r30, r28
    ad54:	e7 54       	subi	r30, 0x47	; 71
    ad56:	fe 4f       	sbci	r31, 0xFE	; 254
    ad58:	88 e2       	ldi	r24, 0x28	; 40
    ad5a:	df 01       	movw	r26, r30
    ad5c:	1d 92       	st	X+, r1
    ad5e:	8a 95       	dec	r24
    ad60:	e9 f7       	brne	.-6      	; 0xad5c <temp_comp_interpolation(float)+0x50>
    ad62:	e8 5b       	subi	r30, 0xB8	; 184
    ad64:	f1 40       	sbci	r31, 0x01	; 1
    ad66:	1f 01       	movw	r2, r30
    ad68:	80 e9       	ldi	r24, 0x90	; 144
    ad6a:	91 e0       	ldi	r25, 0x01	; 1
    ad6c:	df 01       	movw	r26, r30
    ad6e:	fc 01       	movw	r30, r24
    ad70:	1d 92       	st	X+, r1
    ad72:	31 97       	sbiw	r30, 0x01	; 1
    ad74:	e9 f7       	brne	.-6      	; 0xad70 <temp_comp_interpolation(float)+0x64>
	int shift[10];
	int temp_C[10];

	n = 6; //number of measured points

	shift[0] = 0;
    ad76:	c7 5a       	subi	r28, 0xA7	; 167
    ad78:	dd 4f       	sbci	r29, 0xFD	; 253
    ad7a:	19 82       	std	Y+1, r1	; 0x01
    ad7c:	18 82       	st	Y, r1
    ad7e:	c9 55       	subi	r28, 0x59	; 89
    ad80:	d2 40       	sbci	r29, 0x02	; 2
    ad82:	9e 01       	movw	r18, r28
    ad84:	2f 51       	subi	r18, 0x1F	; 31
    ad86:	3e 4f       	sbci	r19, 0xFE	; 254
    ad88:	c1 59       	subi	r28, 0x91	; 145
    ad8a:	dd 4f       	sbci	r29, 0xFD	; 253
    ad8c:	39 83       	std	Y+1, r19	; 0x01
    ad8e:	28 83       	st	Y, r18
    ad90:	cf 56       	subi	r28, 0x6F	; 111
    ad92:	d2 40       	sbci	r29, 0x02	; 2
    ad94:	8e 01       	movw	r16, r28
    ad96:	07 5a       	subi	r16, 0xA7	; 167
    ad98:	1d 4f       	sbci	r17, 0xFD	; 253
    ad9a:	ce 01       	movw	r24, r28
    ad9c:	8f 5c       	subi	r24, 0xCF	; 207
    ad9e:	9d 4f       	sbci	r25, 0xFD	; 253
    ada0:	c3 59       	subi	r28, 0x93	; 147
    ada2:	dd 4f       	sbci	r29, 0xFD	; 253
    ada4:	99 83       	std	Y+1, r25	; 0x01
    ada6:	88 83       	st	Y, r24
    ada8:	cd 56       	subi	r28, 0x6D	; 109
    adaa:	d2 40       	sbci	r29, 0x02	; 2
    adac:	3c 01       	movw	r6, r24
    adae:	49 01       	movw	r8, r18
    adb0:	40 eb       	ldi	r20, 0xB0	; 176
    adb2:	a4 2e       	mov	r10, r20
    adb4:	4f e0       	ldi	r20, 0x0F	; 15
    adb6:	b4 2e       	mov	r11, r20
    adb8:	53 e2       	ldi	r21, 0x23	; 35
    adba:	c5 2e       	mov	r12, r21
    adbc:	d1 2c       	mov	r13, r1
	for (i = 0; i < n; i++) {
    adbe:	f1 2c       	mov	r15, r1
    adc0:	e1 2c       	mov	r14, r1
    static_assert(start_compensating_temp >= PINDA_MINTEMP, "Temperature compensation start point is lower than PINDA_MINTEMP.");
#endif //SUPERPINDA_SUPPORT
#else
		temp_C[i] = 50 + i * 10; //temperature in C
#endif
		x[i] = (float)temp_C[i];
    adc2:	b6 01       	movw	r22, r12
    adc4:	0d 2c       	mov	r0, r13
    adc6:	00 0c       	add	r0, r0
    adc8:	88 0b       	sbc	r24, r24
    adca:	99 0b       	sbc	r25, r25
    adcc:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
    add0:	d4 01       	movw	r26, r8
    add2:	6d 93       	st	X+, r22
    add4:	7d 93       	st	X+, r23
    add6:	8d 93       	st	X+, r24
    add8:	9d 93       	st	X+, r25
    adda:	4d 01       	movw	r8, r26
		f[i] = (float)shift[i];
    addc:	f8 01       	movw	r30, r16
    adde:	61 91       	ld	r22, Z+
    ade0:	71 91       	ld	r23, Z+
    ade2:	8f 01       	movw	r16, r30
    ade4:	07 2e       	mov	r0, r23
    ade6:	00 0c       	add	r0, r0
    ade8:	88 0b       	sbc	r24, r24
    adea:	99 0b       	sbc	r25, r25
    adec:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
    adf0:	d3 01       	movw	r26, r6
    adf2:	6d 93       	st	X+, r22
    adf4:	7d 93       	st	X+, r23
    adf6:	8d 93       	st	X+, r24
    adf8:	9d 93       	st	X+, r25
    adfa:	3d 01       	movw	r6, r26
	int temp_C[10];

	n = 6; //number of measured points

	shift[0] = 0;
	for (i = 0; i < n; i++) {
    adfc:	bf ef       	ldi	r27, 0xFF	; 255
    adfe:	eb 1a       	sub	r14, r27
    ae00:	fb 0a       	sbc	r15, r27
    ae02:	e6 e0       	ldi	r30, 0x06	; 6
    ae04:	ee 16       	cp	r14, r30
    ae06:	f1 04       	cpc	r15, r1
    ae08:	09 f0       	breq	.+2      	; 0xae0c <temp_comp_interpolation(float)+0x100>
    ae0a:	38 c3       	rjmp	.+1648   	; 0xb47c <temp_comp_interpolation(float)+0x770>
		temp_C[i] = 50 + i * 10; //temperature in C
#endif
		x[i] = (float)temp_C[i];
		f[i] = (float)shift[i];
	}
	if (inp_temperature < x[0]) return 0;
    ae0c:	cb 58       	subi	r28, 0x8B	; 139
    ae0e:	dd 4f       	sbci	r29, 0xFD	; 253
    ae10:	28 81       	ld	r18, Y
    ae12:	39 81       	ldd	r19, Y+1	; 0x01
    ae14:	4a 81       	ldd	r20, Y+2	; 0x02
    ae16:	5b 81       	ldd	r21, Y+3	; 0x03
    ae18:	c5 57       	subi	r28, 0x75	; 117
    ae1a:	d2 40       	sbci	r29, 0x02	; 2
    ae1c:	c1 59       	subi	r28, 0x91	; 145
    ae1e:	dd 4f       	sbci	r29, 0xFD	; 253
    ae20:	a8 81       	ld	r26, Y
    ae22:	b9 81       	ldd	r27, Y+1	; 0x01
    ae24:	cf 56       	subi	r28, 0x6F	; 111
    ae26:	d2 40       	sbci	r29, 0x02	; 2
    ae28:	6d 91       	ld	r22, X+
    ae2a:	7d 91       	ld	r23, X+
    ae2c:	8d 91       	ld	r24, X+
    ae2e:	9c 91       	ld	r25, X
    ae30:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
    ae34:	41 2c       	mov	r4, r1
    ae36:	51 2c       	mov	r5, r1
    ae38:	32 01       	movw	r6, r4
    ae3a:	18 16       	cp	r1, r24
    ae3c:	0c f4       	brge	.+2      	; 0xae40 <temp_comp_interpolation(float)+0x134>
    ae3e:	02 c3       	rjmp	.+1540   	; 0xb444 <temp_comp_interpolation(float)+0x738>
    ae40:	c3 59       	subi	r28, 0x93	; 147
    ae42:	dd 4f       	sbci	r29, 0xFD	; 253
    ae44:	08 81       	ld	r16, Y
    ae46:	19 81       	ldd	r17, Y+1	; 0x01
    ae48:	cd 56       	subi	r28, 0x6D	; 109
    ae4a:	d2 40       	sbci	r29, 0x02	; 2
    ae4c:	0c 5e       	subi	r16, 0xEC	; 236
    ae4e:	1f 4f       	sbci	r17, 0xFF	; 255
    ae50:	c1 59       	subi	r28, 0x91	; 145
    ae52:	dd 4f       	sbci	r29, 0xFD	; 253
    ae54:	e8 80       	ld	r14, Y
    ae56:	f9 80       	ldd	r15, Y+1	; 0x01
    ae58:	cf 56       	subi	r28, 0x6F	; 111
    ae5a:	d2 40       	sbci	r29, 0x02	; 2
    ae5c:	b4 e1       	ldi	r27, 0x14	; 20
    ae5e:	eb 0e       	add	r14, r27
    ae60:	f1 1c       	adc	r15, r1
    ae62:	6e 01       	movw	r12, r28
    ae64:	ef ed       	ldi	r30, 0xDF	; 223
    ae66:	ce 1a       	sub	r12, r30
    ae68:	ed ef       	ldi	r30, 0xFD	; 253
    ae6a:	de 0a       	sbc	r13, r30
    ae6c:	9e 01       	movw	r18, r28
    ae6e:	2b 55       	subi	r18, 0x5B	; 91
    ae70:	3e 4f       	sbci	r19, 0xFE	; 254
    ae72:	cf 58       	subi	r28, 0x8F	; 143
    ae74:	dd 4f       	sbci	r29, 0xFD	; 253
    ae76:	39 83       	std	Y+1, r19	; 0x01
    ae78:	28 83       	st	Y, r18
    ae7a:	c1 57       	subi	r28, 0x71	; 113
    ae7c:	d2 40       	sbci	r29, 0x02	; 2


	for (i = n - 1; i>0; i--) {
		F[i] = (f[i] - f[i - 1]) / (x[i] - x[i - 1]);
    ae7e:	d8 01       	movw	r26, r16
    ae80:	4d 90       	ld	r4, X+
    ae82:	5d 90       	ld	r5, X+
    ae84:	6d 90       	ld	r6, X+
    ae86:	7c 90       	ld	r7, X
    ae88:	f7 01       	movw	r30, r14
    ae8a:	60 81       	ld	r22, Z
    ae8c:	71 81       	ldd	r23, Z+1	; 0x01
    ae8e:	82 81       	ldd	r24, Z+2	; 0x02
    ae90:	93 81       	ldd	r25, Z+3	; 0x03
    ae92:	d7 01       	movw	r26, r14
    ae94:	5e 91       	ld	r21, -X
    ae96:	4e 91       	ld	r20, -X
    ae98:	3e 91       	ld	r19, -X
    ae9a:	2e 91       	ld	r18, -X
    ae9c:	7d 01       	movw	r14, r26
    ae9e:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    aea2:	4b 01       	movw	r8, r22
    aea4:	5c 01       	movw	r10, r24
    aea6:	f8 01       	movw	r30, r16
    aea8:	52 91       	ld	r21, -Z
    aeaa:	42 91       	ld	r20, -Z
    aeac:	32 91       	ld	r19, -Z
    aeae:	22 91       	ld	r18, -Z
    aeb0:	8f 01       	movw	r16, r30
    aeb2:	c3 01       	movw	r24, r6
    aeb4:	b2 01       	movw	r22, r4
    aeb6:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    aeba:	a5 01       	movw	r20, r10
    aebc:	94 01       	movw	r18, r8
    aebe:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
    aec2:	d6 01       	movw	r26, r12
    aec4:	9e 93       	st	-X, r25
    aec6:	8e 93       	st	-X, r24
    aec8:	7e 93       	st	-X, r23
    aeca:	6e 93       	st	-X, r22
    aecc:	6d 01       	movw	r12, r26
		h[i - 1] = x[i] - x[i - 1];
    aece:	cf 58       	subi	r28, 0x8F	; 143
    aed0:	dd 4f       	sbci	r29, 0xFD	; 253
    aed2:	e8 81       	ld	r30, Y
    aed4:	f9 81       	ldd	r31, Y+1	; 0x01
    aed6:	c1 57       	subi	r28, 0x71	; 113
    aed8:	d2 40       	sbci	r29, 0x02	; 2
    aeda:	b2 92       	st	-Z, r11
    aedc:	a2 92       	st	-Z, r10
    aede:	92 92       	st	-Z, r9
    aee0:	82 92       	st	-Z, r8
    aee2:	cf 58       	subi	r28, 0x8F	; 143
    aee4:	dd 4f       	sbci	r29, 0xFD	; 253
    aee6:	f9 83       	std	Y+1, r31	; 0x01
    aee8:	e8 83       	st	Y, r30
    aeea:	c1 57       	subi	r28, 0x71	; 113
    aeec:	d2 40       	sbci	r29, 0x02	; 2
		f[i] = (float)shift[i];
	}
	if (inp_temperature < x[0]) return 0;


	for (i = n - 1; i>0; i--) {
    aeee:	c3 59       	subi	r28, 0x93	; 147
    aef0:	dd 4f       	sbci	r29, 0xFD	; 253
    aef2:	28 81       	ld	r18, Y
    aef4:	39 81       	ldd	r19, Y+1	; 0x01
    aef6:	cd 56       	subi	r28, 0x6D	; 109
    aef8:	d2 40       	sbci	r29, 0x02	; 2
    aefa:	02 17       	cp	r16, r18
    aefc:	13 07       	cpc	r17, r19
    aefe:	09 f0       	breq	.+2      	; 0xaf02 <temp_comp_interpolation(float)+0x1f6>
    af00:	be cf       	rjmp	.-132    	; 0xae7e <temp_comp_interpolation(float)+0x172>
    af02:	4e 01       	movw	r8, r28
    af04:	3f e6       	ldi	r19, 0x6F	; 111
    af06:	83 1a       	sub	r8, r19
    af08:	3e ef       	ldi	r19, 0xFE	; 254
    af0a:	93 0a       	sbc	r9, r19
    af0c:	5e 01       	movw	r10, r28
    af0e:	83 ef       	ldi	r24, 0xF3	; 243
    af10:	a8 1a       	sub	r10, r24
    af12:	8d ef       	ldi	r24, 0xFD	; 253
    af14:	b8 0a       	sbc	r11, r24
    af16:	61 01       	movw	r12, r2
    af18:	81 01       	movw	r16, r2
		F[i] = (f[i] - f[i - 1]) / (x[i] - x[i - 1]);
		h[i - 1] = x[i] - x[i - 1];
	}
	//*********** formation of h, s , f matrix **************
	for (i = 1; i<n - 1; i++) {
    af1a:	ee 24       	eor	r14, r14
    af1c:	e3 94       	inc	r14
    af1e:	f1 2c       	mov	r15, r1
		m[i][i] = 2 * (h[i - 1] + h[i]);
    af20:	d4 01       	movw	r26, r8
    af22:	4d 90       	ld	r4, X+
    af24:	5d 90       	ld	r5, X+
    af26:	6d 90       	ld	r6, X+
    af28:	7d 90       	ld	r7, X+
    af2a:	4d 01       	movw	r8, r26
    af2c:	2d 91       	ld	r18, X+
    af2e:	3d 91       	ld	r19, X+
    af30:	4d 91       	ld	r20, X+
    af32:	5c 91       	ld	r21, X
    af34:	c3 01       	movw	r24, r6
    af36:	b2 01       	movw	r22, r4
    af38:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    af3c:	9b 01       	movw	r18, r22
    af3e:	ac 01       	movw	r20, r24
    af40:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    af44:	f8 01       	movw	r30, r16
    af46:	64 a7       	std	Z+44, r22	; 0x2c
    af48:	75 a7       	std	Z+45, r23	; 0x2d
    af4a:	86 a7       	std	Z+46, r24	; 0x2e
    af4c:	97 a7       	std	Z+47, r25	; 0x2f
		if (i != 1) {
    af4e:	f1 e0       	ldi	r31, 0x01	; 1
    af50:	ef 16       	cp	r14, r31
    af52:	f1 04       	cpc	r15, r1
    af54:	61 f0       	breq	.+24     	; 0xaf6e <temp_comp_interpolation(float)+0x262>
			m[i][i - 1] = h[i - 1];
    af56:	d8 01       	movw	r26, r16
    af58:	98 96       	adiw	r26, 0x28	; 40
    af5a:	4d 92       	st	X+, r4
    af5c:	5d 92       	st	X+, r5
    af5e:	6d 92       	st	X+, r6
    af60:	7c 92       	st	X, r7
    af62:	9b 97       	sbiw	r26, 0x2b	; 43
			m[i - 1][i] = h[i - 1];
    af64:	f8 01       	movw	r30, r16
    af66:	44 82       	std	Z+4, r4	; 0x04
    af68:	55 82       	std	Z+5, r5	; 0x05
    af6a:	66 82       	std	Z+6, r6	; 0x06
    af6c:	77 82       	std	Z+7, r7	; 0x07
		}
		m[i][n - 1] = 6 * (F[i + 1] - F[i]);
    af6e:	ff ef       	ldi	r31, 0xFF	; 255
    af70:	ef 1a       	sub	r14, r31
    af72:	ff 0a       	sbc	r15, r31
    af74:	f5 01       	movw	r30, r10
    af76:	20 81       	ld	r18, Z
    af78:	31 81       	ldd	r19, Z+1	; 0x01
    af7a:	42 81       	ldd	r20, Z+2	; 0x02
    af7c:	53 81       	ldd	r21, Z+3	; 0x03
    af7e:	84 e0       	ldi	r24, 0x04	; 4
    af80:	a8 0e       	add	r10, r24
    af82:	b1 1c       	adc	r11, r1
    af84:	64 81       	ldd	r22, Z+4	; 0x04
    af86:	75 81       	ldd	r23, Z+5	; 0x05
    af88:	86 81       	ldd	r24, Z+6	; 0x06
    af8a:	97 81       	ldd	r25, Z+7	; 0x07
    af8c:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    af90:	20 e0       	ldi	r18, 0x00	; 0
    af92:	30 e0       	ldi	r19, 0x00	; 0
    af94:	40 ec       	ldi	r20, 0xC0	; 192
    af96:	50 e4       	ldi	r21, 0x40	; 64
    af98:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    af9c:	d6 01       	movw	r26, r12
    af9e:	dc 96       	adiw	r26, 0x3c	; 60
    afa0:	6d 93       	st	X+, r22
    afa2:	7d 93       	st	X+, r23
    afa4:	8d 93       	st	X+, r24
    afa6:	9c 93       	st	X, r25
    afa8:	df 97       	sbiw	r26, 0x3f	; 63
    afaa:	04 5d       	subi	r16, 0xD4	; 212
    afac:	1f 4f       	sbci	r17, 0xFF	; 255
    afae:	b8 e2       	ldi	r27, 0x28	; 40
    afb0:	cb 0e       	add	r12, r27
    afb2:	d1 1c       	adc	r13, r1
	for (i = n - 1; i>0; i--) {
		F[i] = (f[i] - f[i - 1]) / (x[i] - x[i - 1]);
		h[i - 1] = x[i] - x[i - 1];
	}
	//*********** formation of h, s , f matrix **************
	for (i = 1; i<n - 1; i++) {
    afb4:	e5 e0       	ldi	r30, 0x05	; 5
    afb6:	ee 16       	cp	r14, r30
    afb8:	f1 04       	cpc	r15, r1
    afba:	09 f0       	breq	.+2      	; 0xafbe <temp_comp_interpolation(float)+0x2b2>
    afbc:	b1 cf       	rjmp	.-158    	; 0xaf20 <temp_comp_interpolation(float)+0x214>
    afbe:	7e 01       	movw	r14, r28
    afc0:	fd e2       	ldi	r31, 0x2D	; 45
    afc2:	ef 0e       	add	r14, r31
    afc4:	f1 1c       	adc	r15, r1
    afc6:	28 e2       	ldi	r18, 0x28	; 40
    afc8:	a2 2e       	mov	r10, r18
    afca:	b1 2c       	mov	r11, r1
    afcc:	00 eb       	ldi	r16, 0xB0	; 176
    afce:	1f ef       	ldi	r17, 0xFF	; 255
    afd0:	24 e0       	ldi	r18, 0x04	; 4
    afd2:	22 0e       	add	r2, r18
    afd4:	31 1c       	adc	r3, r1
		}
		m[i][n - 1] = 6 * (F[i + 1] - F[i]);
	}
	//*********** forward elimination **************
	for (i = 1; i<n - 2; i++) {
		temp = (m[i + 1][i] / m[i][i]);
    afd6:	d7 01       	movw	r26, r14
    afd8:	2d 91       	ld	r18, X+
    afda:	3d 91       	ld	r19, X+
    afdc:	4d 91       	ld	r20, X+
    afde:	5c 91       	ld	r21, X
    afe0:	13 97       	sbiw	r26, 0x03	; 3
    afe2:	98 96       	adiw	r26, 0x28	; 40
    afe4:	6d 91       	ld	r22, X+
    afe6:	7d 91       	ld	r23, X+
    afe8:	8d 91       	ld	r24, X+
    afea:	9c 91       	ld	r25, X
    afec:	9b 97       	sbiw	r26, 0x2b	; 43
    afee:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
    aff2:	2b 01       	movw	r4, r22
    aff4:	3c 01       	movw	r6, r24
    aff6:	61 01       	movw	r12, r2
    aff8:	c0 1a       	sub	r12, r16
    affa:	d1 0a       	sbc	r13, r17
		for (j = 1; j <= n - 1; j++)
    affc:	88 24       	eor	r8, r8
    affe:	83 94       	inc	r8
    b000:	91 2c       	mov	r9, r1
			m[i + 1][j] -= temp*m[i][j];
    b002:	f6 01       	movw	r30, r12
    b004:	e0 0f       	add	r30, r16
    b006:	f1 1f       	adc	r31, r17
    b008:	ea 0d       	add	r30, r10
    b00a:	fb 1d       	adc	r31, r11
    b00c:	20 81       	ld	r18, Z
    b00e:	31 81       	ldd	r19, Z+1	; 0x01
    b010:	42 81       	ldd	r20, Z+2	; 0x02
    b012:	53 81       	ldd	r21, Z+3	; 0x03
    b014:	c3 01       	movw	r24, r6
    b016:	b2 01       	movw	r22, r4
    b018:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    b01c:	9b 01       	movw	r18, r22
    b01e:	ac 01       	movw	r20, r24
    b020:	f6 01       	movw	r30, r12
    b022:	60 81       	ld	r22, Z
    b024:	71 81       	ldd	r23, Z+1	; 0x01
    b026:	82 81       	ldd	r24, Z+2	; 0x02
    b028:	93 81       	ldd	r25, Z+3	; 0x03
    b02a:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    b02e:	d6 01       	movw	r26, r12
    b030:	6d 93       	st	X+, r22
    b032:	7d 93       	st	X+, r23
    b034:	8d 93       	st	X+, r24
    b036:	9d 93       	st	X+, r25
    b038:	6d 01       	movw	r12, r26
		m[i][n - 1] = 6 * (F[i + 1] - F[i]);
	}
	//*********** forward elimination **************
	for (i = 1; i<n - 2; i++) {
		temp = (m[i + 1][i] / m[i][i]);
		for (j = 1; j <= n - 1; j++)
    b03a:	bf ef       	ldi	r27, 0xFF	; 255
    b03c:	8b 1a       	sub	r8, r27
    b03e:	9b 0a       	sbc	r9, r27
    b040:	e6 e0       	ldi	r30, 0x06	; 6
    b042:	8e 16       	cp	r8, r30
    b044:	91 04       	cpc	r9, r1
    b046:	e9 f6       	brne	.-70     	; 0xb002 <temp_comp_interpolation(float)+0x2f6>
    b048:	3c e2       	ldi	r19, 0x2C	; 44
    b04a:	e3 0e       	add	r14, r19
    b04c:	f1 1c       	adc	r15, r1
    b04e:	08 52       	subi	r16, 0x28	; 40
    b050:	11 09       	sbc	r17, r1
    b052:	88 e2       	ldi	r24, 0x28	; 40
    b054:	a8 0e       	add	r10, r24
    b056:	b1 1c       	adc	r11, r1
			m[i - 1][i] = h[i - 1];
		}
		m[i][n - 1] = 6 * (F[i + 1] - F[i]);
	}
	//*********** forward elimination **************
	for (i = 1; i<n - 2; i++) {
    b058:	08 33       	cpi	r16, 0x38	; 56
    b05a:	9f ef       	ldi	r25, 0xFF	; 255
    b05c:	19 07       	cpc	r17, r25
    b05e:	09 f0       	breq	.+2      	; 0xb062 <temp_comp_interpolation(float)+0x356>
    b060:	ba cf       	rjmp	.-140    	; 0xafd6 <temp_comp_interpolation(float)+0x2ca>
    b062:	1e 01       	movw	r2, r28
    b064:	f5 eb       	ldi	r31, 0xB5	; 181
    b066:	2f 0e       	add	r2, r31
    b068:	31 1c       	adc	r3, r1
    b06a:	6e 01       	movw	r12, r28
    b06c:	21 eb       	ldi	r18, 0xB1	; 177
    b06e:	c2 0e       	add	r12, r18
    b070:	d1 1c       	adc	r13, r1
    b072:	7e 01       	movw	r14, r28
    b074:	37 e3       	ldi	r19, 0x37	; 55
    b076:	e3 1a       	sub	r14, r19
    b078:	3e ef       	ldi	r19, 0xFE	; 254
    b07a:	f3 0a       	sbc	r15, r19
		temp = (m[i + 1][i] / m[i][i]);
		for (j = 1; j <= n - 1; j++)
			m[i + 1][j] -= temp*m[i][j];
	}
	//*********** backward substitution *********
	for (i = n - 2; i>0; i--) {
    b07c:	04 e0       	ldi	r16, 0x04	; 4
    b07e:	10 e0       	ldi	r17, 0x00	; 0
    b080:	48 01       	movw	r8, r16
    b082:	b1 2c       	mov	r11, r1
    b084:	a1 2c       	mov	r10, r1
		sum = 0;
    b086:	41 2c       	mov	r4, r1
    b088:	51 2c       	mov	r5, r1
    b08a:	32 01       	movw	r6, r4
		for (j = i; j <= n - 2; j++)
			sum += m[i][j] * s[j];
    b08c:	f6 01       	movw	r30, r12
    b08e:	ea 0d       	add	r30, r10
    b090:	fb 1d       	adc	r31, r11
    b092:	d7 01       	movw	r26, r14
    b094:	aa 0d       	add	r26, r10
    b096:	bb 1d       	adc	r27, r11
    b098:	2d 91       	ld	r18, X+
    b09a:	3d 91       	ld	r19, X+
    b09c:	4d 91       	ld	r20, X+
    b09e:	5c 91       	ld	r21, X
    b0a0:	60 81       	ld	r22, Z
    b0a2:	71 81       	ldd	r23, Z+1	; 0x01
    b0a4:	82 81       	ldd	r24, Z+2	; 0x02
    b0a6:	93 81       	ldd	r25, Z+3	; 0x03
    b0a8:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    b0ac:	9b 01       	movw	r18, r22
    b0ae:	ac 01       	movw	r20, r24
    b0b0:	c3 01       	movw	r24, r6
    b0b2:	b2 01       	movw	r22, r4
    b0b4:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    b0b8:	2b 01       	movw	r4, r22
    b0ba:	3c 01       	movw	r6, r24
			m[i + 1][j] -= temp*m[i][j];
	}
	//*********** backward substitution *********
	for (i = n - 2; i>0; i--) {
		sum = 0;
		for (j = i; j <= n - 2; j++)
    b0bc:	8f ef       	ldi	r24, 0xFF	; 255
    b0be:	88 1a       	sub	r8, r24
    b0c0:	98 0a       	sbc	r9, r24
    b0c2:	94 e0       	ldi	r25, 0x04	; 4
    b0c4:	a9 0e       	add	r10, r25
    b0c6:	b1 1c       	adc	r11, r1
    b0c8:	a5 e0       	ldi	r26, 0x05	; 5
    b0ca:	8a 16       	cp	r8, r26
    b0cc:	91 04       	cpc	r9, r1
    b0ce:	f1 f6       	brne	.-68     	; 0xb08c <temp_comp_interpolation(float)+0x380>
			sum += m[i][j] * s[j];
		s[i] = (m[i][n - 1] - sum) / m[i][i];
    b0d0:	a3 01       	movw	r20, r6
    b0d2:	92 01       	movw	r18, r4
    b0d4:	f1 01       	movw	r30, r2
    b0d6:	60 81       	ld	r22, Z
    b0d8:	71 81       	ldd	r23, Z+1	; 0x01
    b0da:	82 81       	ldd	r24, Z+2	; 0x02
    b0dc:	93 81       	ldd	r25, Z+3	; 0x03
    b0de:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    b0e2:	d6 01       	movw	r26, r12
    b0e4:	2d 91       	ld	r18, X+
    b0e6:	3d 91       	ld	r19, X+
    b0e8:	4d 91       	ld	r20, X+
    b0ea:	5c 91       	ld	r21, X
    b0ec:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
    b0f0:	f7 01       	movw	r30, r14
    b0f2:	60 83       	st	Z, r22
    b0f4:	71 83       	std	Z+1, r23	; 0x01
    b0f6:	82 83       	std	Z+2, r24	; 0x02
    b0f8:	93 83       	std	Z+3, r25	; 0x03
		temp = (m[i + 1][i] / m[i][i]);
		for (j = 1; j <= n - 1; j++)
			m[i + 1][j] -= temp*m[i][j];
	}
	//*********** backward substitution *********
	for (i = n - 2; i>0; i--) {
    b0fa:	01 50       	subi	r16, 0x01	; 1
    b0fc:	11 09       	sbc	r17, r1
    b0fe:	f8 e2       	ldi	r31, 0x28	; 40
    b100:	2f 1a       	sub	r2, r31
    b102:	31 08       	sbc	r3, r1
    b104:	2c e2       	ldi	r18, 0x2C	; 44
    b106:	c2 1a       	sub	r12, r18
    b108:	d1 08       	sbc	r13, r1
    b10a:	34 e0       	ldi	r19, 0x04	; 4
    b10c:	e3 1a       	sub	r14, r19
    b10e:	f1 08       	sbc	r15, r1
    b110:	01 15       	cp	r16, r1
    b112:	11 05       	cpc	r17, r1
    b114:	09 f0       	breq	.+2      	; 0xb118 <temp_comp_interpolation(float)+0x40c>
    b116:	b4 cf       	rjmp	.-152    	; 0xb080 <temp_comp_interpolation(float)+0x374>
			sum += m[i][j] * s[j];
		s[i] = (m[i][n - 1] - sum) / m[i][i];
	}

		for (i = 0; i<n - 1; i++)
			if ((x[i] <= inp_temperature && inp_temperature <= x[i + 1]) || (i == n-2 && inp_temperature > x[i + 1])) {
    b118:	cb 50       	subi	r28, 0x0B	; 11
    b11a:	de 4f       	sbci	r29, 0xFE	; 254
    b11c:	88 81       	ld	r24, Y
    b11e:	99 81       	ldd	r25, Y+1	; 0x01
    b120:	aa 81       	ldd	r26, Y+2	; 0x02
    b122:	bb 81       	ldd	r27, Y+3	; 0x03
    b124:	c5 5f       	subi	r28, 0xF5	; 245
    b126:	d1 40       	sbci	r29, 0x01	; 1
    b128:	cf 57       	subi	r28, 0x7F	; 127
    b12a:	dd 4f       	sbci	r29, 0xFD	; 253
    b12c:	88 83       	st	Y, r24
    b12e:	99 83       	std	Y+1, r25	; 0x01
    b130:	aa 83       	std	Y+2, r26	; 0x02
    b132:	bb 83       	std	Y+3, r27	; 0x03
    b134:	c1 58       	subi	r28, 0x81	; 129
    b136:	d2 40       	sbci	r29, 0x02	; 2
    b138:	1e 01       	movw	r2, r28
    b13a:	97 e4       	ldi	r25, 0x47	; 71
    b13c:	29 1a       	sub	r2, r25
    b13e:	9e ef       	ldi	r25, 0xFE	; 254
    b140:	39 0a       	sbc	r3, r25
    b142:	10 e0       	ldi	r17, 0x00	; 0
    b144:	00 e0       	ldi	r16, 0x00	; 0
    b146:	c1 59       	subi	r28, 0x91	; 145
    b148:	dd 4f       	sbci	r29, 0xFD	; 253
    b14a:	a8 81       	ld	r26, Y
    b14c:	b9 81       	ldd	r27, Y+1	; 0x01
    b14e:	cf 56       	subi	r28, 0x6F	; 111
    b150:	d2 40       	sbci	r29, 0x02	; 2
    b152:	cd 90       	ld	r12, X+
    b154:	dd 90       	ld	r13, X+
    b156:	ed 90       	ld	r14, X+
    b158:	fd 90       	ld	r15, X+
    b15a:	c1 59       	subi	r28, 0x91	; 145
    b15c:	dd 4f       	sbci	r29, 0xFD	; 253
    b15e:	b9 83       	std	Y+1, r27	; 0x01
    b160:	a8 83       	st	Y, r26
    b162:	cf 56       	subi	r28, 0x6F	; 111
    b164:	d2 40       	sbci	r29, 0x02	; 2
    b166:	cb 58       	subi	r28, 0x8B	; 139
    b168:	dd 4f       	sbci	r29, 0xFD	; 253
    b16a:	28 81       	ld	r18, Y
    b16c:	39 81       	ldd	r19, Y+1	; 0x01
    b16e:	4a 81       	ldd	r20, Y+2	; 0x02
    b170:	5b 81       	ldd	r21, Y+3	; 0x03
    b172:	c5 57       	subi	r28, 0x75	; 117
    b174:	d2 40       	sbci	r29, 0x02	; 2
    b176:	c7 01       	movw	r24, r14
    b178:	b6 01       	movw	r22, r12
    b17a:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
    b17e:	18 16       	cp	r1, r24
    b180:	b4 f0       	brlt	.+44     	; 0xb1ae <temp_comp_interpolation(float)+0x4a2>
    b182:	cb 58       	subi	r28, 0x8B	; 139
    b184:	dd 4f       	sbci	r29, 0xFD	; 253
    b186:	28 81       	ld	r18, Y
    b188:	39 81       	ldd	r19, Y+1	; 0x01
    b18a:	4a 81       	ldd	r20, Y+2	; 0x02
    b18c:	5b 81       	ldd	r21, Y+3	; 0x03
    b18e:	c5 57       	subi	r28, 0x75	; 117
    b190:	d2 40       	sbci	r29, 0x02	; 2
    b192:	c1 59       	subi	r28, 0x91	; 145
    b194:	dd 4f       	sbci	r29, 0xFD	; 253
    b196:	e8 81       	ld	r30, Y
    b198:	f9 81       	ldd	r31, Y+1	; 0x01
    b19a:	cf 56       	subi	r28, 0x6F	; 111
    b19c:	d2 40       	sbci	r29, 0x02	; 2
    b19e:	60 81       	ld	r22, Z
    b1a0:	71 81       	ldd	r23, Z+1	; 0x01
    b1a2:	82 81       	ldd	r24, Z+2	; 0x02
    b1a4:	93 81       	ldd	r25, Z+3	; 0x03
    b1a6:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
    b1aa:	87 ff       	sbrs	r24, 7
    b1ac:	18 c0       	rjmp	.+48     	; 0xb1de <temp_comp_interpolation(float)+0x4d2>
    b1ae:	04 30       	cpi	r16, 0x04	; 4
    b1b0:	11 05       	cpc	r17, r1
    b1b2:	09 f0       	breq	.+2      	; 0xb1b6 <temp_comp_interpolation(float)+0x4aa>
    b1b4:	30 c1       	rjmp	.+608    	; 0xb416 <temp_comp_interpolation(float)+0x70a>
    b1b6:	cb 58       	subi	r28, 0x8B	; 139
    b1b8:	dd 4f       	sbci	r29, 0xFD	; 253
    b1ba:	28 81       	ld	r18, Y
    b1bc:	39 81       	ldd	r19, Y+1	; 0x01
    b1be:	4a 81       	ldd	r20, Y+2	; 0x02
    b1c0:	5b 81       	ldd	r21, Y+3	; 0x03
    b1c2:	c5 57       	subi	r28, 0x75	; 117
    b1c4:	d2 40       	sbci	r29, 0x02	; 2
    b1c6:	cf 57       	subi	r28, 0x7F	; 127
    b1c8:	dd 4f       	sbci	r29, 0xFD	; 253
    b1ca:	68 81       	ld	r22, Y
    b1cc:	79 81       	ldd	r23, Y+1	; 0x01
    b1ce:	8a 81       	ldd	r24, Y+2	; 0x02
    b1d0:	9b 81       	ldd	r25, Y+3	; 0x03
    b1d2:	c1 58       	subi	r28, 0x81	; 129
    b1d4:	d2 40       	sbci	r29, 0x02	; 2
    b1d6:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
    b1da:	87 ff       	sbrs	r24, 7
    b1dc:	1c c1       	rjmp	.+568    	; 0xb416 <temp_comp_interpolation(float)+0x70a>
				a = (s[i + 1] - s[i]) / (6 * h[i]);
    b1de:	d1 01       	movw	r26, r2
    b1e0:	14 96       	adiw	r26, 0x04	; 4
    b1e2:	8d 90       	ld	r8, X+
    b1e4:	9d 90       	ld	r9, X+
    b1e6:	ad 90       	ld	r10, X+
    b1e8:	bc 90       	ld	r11, X
    b1ea:	17 97       	sbiw	r26, 0x07	; 7
    b1ec:	8d 91       	ld	r24, X+
    b1ee:	9d 91       	ld	r25, X+
    b1f0:	0d 90       	ld	r0, X+
    b1f2:	bc 91       	ld	r27, X
    b1f4:	a0 2d       	mov	r26, r0
    b1f6:	cf 58       	subi	r28, 0x8F	; 143
    b1f8:	dd 4f       	sbci	r29, 0xFD	; 253
    b1fa:	88 83       	st	Y, r24
    b1fc:	99 83       	std	Y+1, r25	; 0x01
    b1fe:	aa 83       	std	Y+2, r26	; 0x02
    b200:	bb 83       	std	Y+3, r27	; 0x03
    b202:	c1 57       	subi	r28, 0x71	; 113
    b204:	d2 40       	sbci	r29, 0x02	; 2
    b206:	f8 01       	movw	r30, r16
    b208:	ee 0f       	add	r30, r30
    b20a:	ff 1f       	adc	r31, r31
    b20c:	ee 0f       	add	r30, r30
    b20e:	ff 1f       	adc	r31, r31
    b210:	21 e9       	ldi	r18, 0x91	; 145
    b212:	31 e0       	ldi	r19, 0x01	; 1
    b214:	2c 0f       	add	r18, r28
    b216:	3d 1f       	adc	r19, r29
    b218:	e2 0f       	add	r30, r18
    b21a:	f3 1f       	adc	r31, r19
    b21c:	40 80       	ld	r4, Z
    b21e:	51 80       	ldd	r5, Z+1	; 0x01
    b220:	62 80       	ldd	r6, Z+2	; 0x02
    b222:	73 80       	ldd	r7, Z+3	; 0x03
				b = s[i] / 2;
				c = (f[i + 1] - f[i]) / h[i] - (2 * h[i] * s[i] + s[i + 1] * h[i]) / 6;
    b224:	c3 59       	subi	r28, 0x93	; 147
    b226:	dd 4f       	sbci	r29, 0xFD	; 253
    b228:	a8 81       	ld	r26, Y
    b22a:	b9 81       	ldd	r27, Y+1	; 0x01
    b22c:	cd 56       	subi	r28, 0x6D	; 109
    b22e:	d2 40       	sbci	r29, 0x02	; 2
    b230:	8d 91       	ld	r24, X+
    b232:	9d 91       	ld	r25, X+
    b234:	0d 90       	ld	r0, X+
    b236:	bc 91       	ld	r27, X
    b238:	a0 2d       	mov	r26, r0
    b23a:	c3 58       	subi	r28, 0x83	; 131
    b23c:	dd 4f       	sbci	r29, 0xFD	; 253
    b23e:	88 83       	st	Y, r24
    b240:	99 83       	std	Y+1, r25	; 0x01
    b242:	aa 83       	std	Y+2, r26	; 0x02
    b244:	bb 83       	std	Y+3, r27	; 0x03
    b246:	cd 57       	subi	r28, 0x7D	; 125
    b248:	d2 40       	sbci	r29, 0x02	; 2
				d = f[i];
				sum = a*pow((inp_temperature - x[i]), 3) + b*pow((inp_temperature - x[i]), 2) + c*(inp_temperature - x[i]) + d;
    b24a:	a7 01       	movw	r20, r14
    b24c:	96 01       	movw	r18, r12
    b24e:	cb 58       	subi	r28, 0x8B	; 139
    b250:	dd 4f       	sbci	r29, 0xFD	; 253
    b252:	68 81       	ld	r22, Y
    b254:	79 81       	ldd	r23, Y+1	; 0x01
    b256:	8a 81       	ldd	r24, Y+2	; 0x02
    b258:	9b 81       	ldd	r25, Y+3	; 0x03
    b25a:	c5 57       	subi	r28, 0x75	; 117
    b25c:	d2 40       	sbci	r29, 0x02	; 2
    b25e:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    b262:	6b 01       	movw	r12, r22
    b264:	7c 01       	movw	r14, r24
    b266:	20 e0       	ldi	r18, 0x00	; 0
    b268:	30 e0       	ldi	r19, 0x00	; 0
    b26a:	40 e4       	ldi	r20, 0x40	; 64
    b26c:	50 e4       	ldi	r21, 0x40	; 64
    b26e:	0f 94 78 a8 	call	0x350f0	; 0x350f0 <pow>
    b272:	cb 57       	subi	r28, 0x7B	; 123
    b274:	dd 4f       	sbci	r29, 0xFD	; 253
    b276:	68 83       	st	Y, r22
    b278:	79 83       	std	Y+1, r23	; 0x01
    b27a:	8a 83       	std	Y+2, r24	; 0x02
    b27c:	9b 83       	std	Y+3, r25	; 0x03
    b27e:	c5 58       	subi	r28, 0x85	; 133
    b280:	d2 40       	sbci	r29, 0x02	; 2

		for (i = 0; i<n - 1; i++)
			if ((x[i] <= inp_temperature && inp_temperature <= x[i + 1]) || (i == n-2 && inp_temperature > x[i + 1])) {
				a = (s[i + 1] - s[i]) / (6 * h[i]);
				b = s[i] / 2;
				c = (f[i + 1] - f[i]) / h[i] - (2 * h[i] * s[i] + s[i + 1] * h[i]) / 6;
    b282:	c3 58       	subi	r28, 0x83	; 131
    b284:	dd 4f       	sbci	r29, 0xFD	; 253
    b286:	28 81       	ld	r18, Y
    b288:	39 81       	ldd	r19, Y+1	; 0x01
    b28a:	4a 81       	ldd	r20, Y+2	; 0x02
    b28c:	5b 81       	ldd	r21, Y+3	; 0x03
    b28e:	cd 57       	subi	r28, 0x7D	; 125
    b290:	d2 40       	sbci	r29, 0x02	; 2
    b292:	c3 59       	subi	r28, 0x93	; 147
    b294:	dd 4f       	sbci	r29, 0xFD	; 253
    b296:	e8 81       	ld	r30, Y
    b298:	f9 81       	ldd	r31, Y+1	; 0x01
    b29a:	cd 56       	subi	r28, 0x6D	; 109
    b29c:	d2 40       	sbci	r29, 0x02	; 2
    b29e:	64 81       	ldd	r22, Z+4	; 0x04
    b2a0:	75 81       	ldd	r23, Z+5	; 0x05
    b2a2:	86 81       	ldd	r24, Z+6	; 0x06
    b2a4:	97 81       	ldd	r25, Z+7	; 0x07
    b2a6:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    b2aa:	a3 01       	movw	r20, r6
    b2ac:	92 01       	movw	r18, r4
    b2ae:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
    b2b2:	c7 58       	subi	r28, 0x87	; 135
    b2b4:	dd 4f       	sbci	r29, 0xFD	; 253
    b2b6:	68 83       	st	Y, r22
    b2b8:	79 83       	std	Y+1, r23	; 0x01
    b2ba:	8a 83       	std	Y+2, r24	; 0x02
    b2bc:	9b 83       	std	Y+3, r25	; 0x03
    b2be:	c9 57       	subi	r28, 0x79	; 121
    b2c0:	d2 40       	sbci	r29, 0x02	; 2
    b2c2:	a3 01       	movw	r20, r6
    b2c4:	92 01       	movw	r18, r4
    b2c6:	c3 01       	movw	r24, r6
    b2c8:	b2 01       	movw	r22, r4
    b2ca:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    b2ce:	cf 58       	subi	r28, 0x8F	; 143
    b2d0:	dd 4f       	sbci	r29, 0xFD	; 253
    b2d2:	28 81       	ld	r18, Y
    b2d4:	39 81       	ldd	r19, Y+1	; 0x01
    b2d6:	4a 81       	ldd	r20, Y+2	; 0x02
    b2d8:	5b 81       	ldd	r21, Y+3	; 0x03
    b2da:	c1 57       	subi	r28, 0x71	; 113
    b2dc:	d2 40       	sbci	r29, 0x02	; 2
    b2de:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    b2e2:	c7 57       	subi	r28, 0x77	; 119
    b2e4:	dd 4f       	sbci	r29, 0xFD	; 253
    b2e6:	68 83       	st	Y, r22
    b2e8:	79 83       	std	Y+1, r23	; 0x01
    b2ea:	8a 83       	std	Y+2, r24	; 0x02
    b2ec:	9b 83       	std	Y+3, r25	; 0x03
    b2ee:	c9 58       	subi	r28, 0x89	; 137
    b2f0:	d2 40       	sbci	r29, 0x02	; 2
    b2f2:	a3 01       	movw	r20, r6
    b2f4:	92 01       	movw	r18, r4
    b2f6:	c5 01       	movw	r24, r10
    b2f8:	b4 01       	movw	r22, r8
    b2fa:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    b2fe:	9b 01       	movw	r18, r22
    b300:	ac 01       	movw	r20, r24
    b302:	c7 57       	subi	r28, 0x77	; 119
    b304:	dd 4f       	sbci	r29, 0xFD	; 253
    b306:	68 81       	ld	r22, Y
    b308:	79 81       	ldd	r23, Y+1	; 0x01
    b30a:	8a 81       	ldd	r24, Y+2	; 0x02
    b30c:	9b 81       	ldd	r25, Y+3	; 0x03
    b30e:	c9 58       	subi	r28, 0x89	; 137
    b310:	d2 40       	sbci	r29, 0x02	; 2
    b312:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    b316:	20 e0       	ldi	r18, 0x00	; 0
    b318:	30 e0       	ldi	r19, 0x00	; 0
    b31a:	40 ec       	ldi	r20, 0xC0	; 192
    b31c:	50 e4       	ldi	r21, 0x40	; 64
    b31e:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
    b322:	9b 01       	movw	r18, r22
    b324:	ac 01       	movw	r20, r24
    b326:	c7 58       	subi	r28, 0x87	; 135
    b328:	dd 4f       	sbci	r29, 0xFD	; 253
    b32a:	68 81       	ld	r22, Y
    b32c:	79 81       	ldd	r23, Y+1	; 0x01
    b32e:	8a 81       	ldd	r24, Y+2	; 0x02
    b330:	9b 81       	ldd	r25, Y+3	; 0x03
    b332:	c9 57       	subi	r28, 0x79	; 121
    b334:	d2 40       	sbci	r29, 0x02	; 2
    b336:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
				d = f[i];
				sum = a*pow((inp_temperature - x[i]), 3) + b*pow((inp_temperature - x[i]), 2) + c*(inp_temperature - x[i]) + d;
    b33a:	a7 01       	movw	r20, r14
    b33c:	96 01       	movw	r18, r12
    b33e:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    b342:	c7 58       	subi	r28, 0x87	; 135
    b344:	dd 4f       	sbci	r29, 0xFD	; 253
    b346:	68 83       	st	Y, r22
    b348:	79 83       	std	Y+1, r23	; 0x01
    b34a:	8a 83       	std	Y+2, r24	; 0x02
    b34c:	9b 83       	std	Y+3, r25	; 0x03
    b34e:	c9 57       	subi	r28, 0x79	; 121
    b350:	d2 40       	sbci	r29, 0x02	; 2
		s[i] = (m[i][n - 1] - sum) / m[i][i];
	}

		for (i = 0; i<n - 1; i++)
			if ((x[i] <= inp_temperature && inp_temperature <= x[i + 1]) || (i == n-2 && inp_temperature > x[i + 1])) {
				a = (s[i + 1] - s[i]) / (6 * h[i]);
    b352:	cf 58       	subi	r28, 0x8F	; 143
    b354:	dd 4f       	sbci	r29, 0xFD	; 253
    b356:	28 81       	ld	r18, Y
    b358:	39 81       	ldd	r19, Y+1	; 0x01
    b35a:	4a 81       	ldd	r20, Y+2	; 0x02
    b35c:	5b 81       	ldd	r21, Y+3	; 0x03
    b35e:	c1 57       	subi	r28, 0x71	; 113
    b360:	d2 40       	sbci	r29, 0x02	; 2
    b362:	c5 01       	movw	r24, r10
    b364:	b4 01       	movw	r22, r8
    b366:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    b36a:	4b 01       	movw	r8, r22
    b36c:	5c 01       	movw	r10, r24
    b36e:	20 e0       	ldi	r18, 0x00	; 0
    b370:	30 e0       	ldi	r19, 0x00	; 0
    b372:	40 ec       	ldi	r20, 0xC0	; 192
    b374:	50 e4       	ldi	r21, 0x40	; 64
    b376:	c3 01       	movw	r24, r6
    b378:	b2 01       	movw	r22, r4
    b37a:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    b37e:	9b 01       	movw	r18, r22
    b380:	ac 01       	movw	r20, r24
    b382:	c5 01       	movw	r24, r10
    b384:	b4 01       	movw	r22, r8
    b386:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
				b = s[i] / 2;
				c = (f[i + 1] - f[i]) / h[i] - (2 * h[i] * s[i] + s[i + 1] * h[i]) / 6;
				d = f[i];
				sum = a*pow((inp_temperature - x[i]), 3) + b*pow((inp_temperature - x[i]), 2) + c*(inp_temperature - x[i]) + d;
    b38a:	cb 57       	subi	r28, 0x7B	; 123
    b38c:	dd 4f       	sbci	r29, 0xFD	; 253
    b38e:	28 81       	ld	r18, Y
    b390:	39 81       	ldd	r19, Y+1	; 0x01
    b392:	4a 81       	ldd	r20, Y+2	; 0x02
    b394:	5b 81       	ldd	r21, Y+3	; 0x03
    b396:	c5 58       	subi	r28, 0x85	; 133
    b398:	d2 40       	sbci	r29, 0x02	; 2
    b39a:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    b39e:	4b 01       	movw	r8, r22
    b3a0:	5c 01       	movw	r10, r24
	}

		for (i = 0; i<n - 1; i++)
			if ((x[i] <= inp_temperature && inp_temperature <= x[i + 1]) || (i == n-2 && inp_temperature > x[i + 1])) {
				a = (s[i + 1] - s[i]) / (6 * h[i]);
				b = s[i] / 2;
    b3a2:	20 e0       	ldi	r18, 0x00	; 0
    b3a4:	30 e0       	ldi	r19, 0x00	; 0
    b3a6:	40 e0       	ldi	r20, 0x00	; 0
    b3a8:	5f e3       	ldi	r21, 0x3F	; 63
    b3aa:	cf 58       	subi	r28, 0x8F	; 143
    b3ac:	dd 4f       	sbci	r29, 0xFD	; 253
    b3ae:	68 81       	ld	r22, Y
    b3b0:	79 81       	ldd	r23, Y+1	; 0x01
    b3b2:	8a 81       	ldd	r24, Y+2	; 0x02
    b3b4:	9b 81       	ldd	r25, Y+3	; 0x03
    b3b6:	c1 57       	subi	r28, 0x71	; 113
    b3b8:	d2 40       	sbci	r29, 0x02	; 2
    b3ba:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    b3be:	2b 01       	movw	r4, r22
    b3c0:	3c 01       	movw	r6, r24
				c = (f[i + 1] - f[i]) / h[i] - (2 * h[i] * s[i] + s[i + 1] * h[i]) / 6;
				d = f[i];
				sum = a*pow((inp_temperature - x[i]), 3) + b*pow((inp_temperature - x[i]), 2) + c*(inp_temperature - x[i]) + d;
    b3c2:	a7 01       	movw	r20, r14
    b3c4:	96 01       	movw	r18, r12
    b3c6:	c7 01       	movw	r24, r14
    b3c8:	b6 01       	movw	r22, r12
    b3ca:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    b3ce:	9b 01       	movw	r18, r22
    b3d0:	ac 01       	movw	r20, r24
    b3d2:	c3 01       	movw	r24, r6
    b3d4:	b2 01       	movw	r22, r4
    b3d6:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    b3da:	9b 01       	movw	r18, r22
    b3dc:	ac 01       	movw	r20, r24
    b3de:	c5 01       	movw	r24, r10
    b3e0:	b4 01       	movw	r22, r8
    b3e2:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    b3e6:	9b 01       	movw	r18, r22
    b3e8:	ac 01       	movw	r20, r24
    b3ea:	c7 58       	subi	r28, 0x87	; 135
    b3ec:	dd 4f       	sbci	r29, 0xFD	; 253
    b3ee:	68 81       	ld	r22, Y
    b3f0:	79 81       	ldd	r23, Y+1	; 0x01
    b3f2:	8a 81       	ldd	r24, Y+2	; 0x02
    b3f4:	9b 81       	ldd	r25, Y+3	; 0x03
    b3f6:	c9 57       	subi	r28, 0x79	; 121
    b3f8:	d2 40       	sbci	r29, 0x02	; 2
    b3fa:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    b3fe:	c3 58       	subi	r28, 0x83	; 131
    b400:	dd 4f       	sbci	r29, 0xFD	; 253
    b402:	28 81       	ld	r18, Y
    b404:	39 81       	ldd	r19, Y+1	; 0x01
    b406:	4a 81       	ldd	r20, Y+2	; 0x02
    b408:	5b 81       	ldd	r21, Y+3	; 0x03
    b40a:	cd 57       	subi	r28, 0x7D	; 125
    b40c:	d2 40       	sbci	r29, 0x02	; 2
    b40e:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    b412:	2b 01       	movw	r4, r22
    b414:	3c 01       	movw	r6, r24
    b416:	0f 5f       	subi	r16, 0xFF	; 255
    b418:	1f 4f       	sbci	r17, 0xFF	; 255
    b41a:	f4 e0       	ldi	r31, 0x04	; 4
    b41c:	2f 0e       	add	r2, r31
    b41e:	31 1c       	adc	r3, r1
    b420:	c3 59       	subi	r28, 0x93	; 147
    b422:	dd 4f       	sbci	r29, 0xFD	; 253
    b424:	28 81       	ld	r18, Y
    b426:	39 81       	ldd	r19, Y+1	; 0x01
    b428:	cd 56       	subi	r28, 0x6D	; 109
    b42a:	d2 40       	sbci	r29, 0x02	; 2
    b42c:	2c 5f       	subi	r18, 0xFC	; 252
    b42e:	3f 4f       	sbci	r19, 0xFF	; 255
    b430:	c3 59       	subi	r28, 0x93	; 147
    b432:	dd 4f       	sbci	r29, 0xFD	; 253
    b434:	39 83       	std	Y+1, r19	; 0x01
    b436:	28 83       	st	Y, r18
    b438:	cd 56       	subi	r28, 0x6D	; 109
    b43a:	d2 40       	sbci	r29, 0x02	; 2
		for (j = i; j <= n - 2; j++)
			sum += m[i][j] * s[j];
		s[i] = (m[i][n - 1] - sum) / m[i][i];
	}

		for (i = 0; i<n - 1; i++)
    b43c:	05 30       	cpi	r16, 0x05	; 5
    b43e:	11 05       	cpc	r17, r1
    b440:	09 f0       	breq	.+2      	; 0xb444 <temp_comp_interpolation(float)+0x738>
    b442:	81 ce       	rjmp	.-766    	; 0xb146 <temp_comp_interpolation(float)+0x43a>
				sum = a*pow((inp_temperature - x[i]), 3) + b*pow((inp_temperature - x[i]), 2) + c*(inp_temperature - x[i]) + d;
			}

		return sum;

}
    b444:	c3 01       	movw	r24, r6
    b446:	b2 01       	movw	r22, r4
    b448:	c4 57       	subi	r28, 0x74	; 116
    b44a:	dd 4f       	sbci	r29, 0xFD	; 253
    b44c:	0f b6       	in	r0, 0x3f	; 63
    b44e:	f8 94       	cli
    b450:	de bf       	out	0x3e, r29	; 62
    b452:	0f be       	out	0x3f, r0	; 63
    b454:	cd bf       	out	0x3d, r28	; 61
    b456:	df 91       	pop	r29
    b458:	cf 91       	pop	r28
    b45a:	1f 91       	pop	r17
    b45c:	0f 91       	pop	r16
    b45e:	ff 90       	pop	r15
    b460:	ef 90       	pop	r14
    b462:	df 90       	pop	r13
    b464:	cf 90       	pop	r12
    b466:	bf 90       	pop	r11
    b468:	af 90       	pop	r10
    b46a:	9f 90       	pop	r9
    b46c:	8f 90       	pop	r8
    b46e:	7f 90       	pop	r7
    b470:	6f 90       	pop	r6
    b472:	5f 90       	pop	r5
    b474:	4f 90       	pop	r4
    b476:	3f 90       	pop	r3
    b478:	2f 90       	pop	r2
    b47a:	08 95       	ret

	shift[0] = 0;
	for (i = 0; i < n; i++) {
		if (i > 0) {
			//read shift in steps from EEPROM
			shift[i] = eeprom_read_word((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + (i - 1));
    b47c:	c5 01       	movw	r24, r10
    b47e:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
    b482:	d8 01       	movw	r26, r16
    b484:	8d 93       	st	X+, r24
    b486:	9c 93       	st	X, r25
    b488:	b5 e0       	ldi	r27, 0x05	; 5
    b48a:	cb 0e       	add	r12, r27
    b48c:	d1 1c       	adc	r13, r1
    b48e:	e2 e0       	ldi	r30, 0x02	; 2
    b490:	ae 0e       	add	r10, r30
    b492:	b1 1c       	adc	r11, r1
    b494:	96 cc       	rjmp	.-1748   	; 0xadc2 <temp_comp_interpolation(float)+0xb6>

0000b496 <gcodes_M704_M705_M706(unsigned int)>:
    eFilamentAction = FilamentAction::None;
}

// Common gcode shared by the gcodes. This saves some flash memory
static void gcodes_M704_M705_M706(uint16_t gcode)
{
    b496:	0f 93       	push	r16
    b498:	1f 93       	push	r17
    b49a:	cf 93       	push	r28
    uint8_t mmuSlotIndex = 0xffU;
    if (MMU2::mmu2.Enabled() && code_seen('P'))
    b49c:	20 91 01 13 	lds	r18, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
    b4a0:	21 30       	cpi	r18, 0x01	; 1
    b4a2:	79 f5       	brne	.+94     	; 0xb502 <gcodes_M704_M705_M706(unsigned int)+0x6c>
    b4a4:	8c 01       	movw	r16, r24
    b4a6:	80 e5       	ldi	r24, 0x50	; 80
    b4a8:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
    b4ac:	88 23       	and	r24, r24
    b4ae:	49 f1       	breq	.+82     	; 0xb502 <gcodes_M704_M705_M706(unsigned int)+0x6c>
    {
        mmuSlotIndex = code_value_uint8();
    b4b0:	0e 94 0a 56 	call	0xac14	; 0xac14 <code_value_uint8()>
    b4b4:	c8 2f       	mov	r28, r24
        if (mmuSlotIndex < MMU_FILAMENT_COUNT) {
    b4b6:	85 30       	cpi	r24, 0x05	; 5
    b4b8:	20 f5       	brcc	.+72     	; 0xb502 <gcodes_M704_M705_M706(unsigned int)+0x6c>
            switch (gcode)
    b4ba:	01 3c       	cpi	r16, 0xC1	; 193
    b4bc:	82 e0       	ldi	r24, 0x02	; 2
    b4be:	18 07       	cpc	r17, r24
    b4c0:	49 f0       	breq	.+18     	; 0xb4d4 <gcodes_M704_M705_M706(unsigned int)+0x3e>
    b4c2:	02 3c       	cpi	r16, 0xC2	; 194
    b4c4:	12 40       	sbci	r17, 0x02	; 2
    b4c6:	69 f0       	breq	.+26     	; 0xb4e2 <gcodes_M704_M705_M706(unsigned int)+0x4c>
            {
            case 704:
                MMU2::mmu2.load_filament(mmuSlotIndex);
    b4c8:	8c 2f       	mov	r24, r28
            default:
                break;
            }
        }
    }
}
    b4ca:	cf 91       	pop	r28
    b4cc:	1f 91       	pop	r17
    b4ce:	0f 91       	pop	r16
        mmuSlotIndex = code_value_uint8();
        if (mmuSlotIndex < MMU_FILAMENT_COUNT) {
            switch (gcode)
            {
            case 704:
                MMU2::mmu2.load_filament(mmuSlotIndex);
    b4d0:	0d 94 89 9d 	jmp	0x33b12	; 0x33b12 <MMU2::MMU2::load_filament(unsigned char) [clone .constprop.102]>
                break;
            case 705:
                MMU2::mmu2.eject_filament(mmuSlotIndex, false);
    b4d4:	60 e0       	ldi	r22, 0x00	; 0
    b4d6:	8c 2f       	mov	r24, r28
            default:
                break;
            }
        }
    }
}
    b4d8:	cf 91       	pop	r28
    b4da:	1f 91       	pop	r17
    b4dc:	0f 91       	pop	r16
            {
            case 704:
                MMU2::mmu2.load_filament(mmuSlotIndex);
                break;
            case 705:
                MMU2::mmu2.eject_filament(mmuSlotIndex, false);
    b4de:	0d 94 cc 9d 	jmp	0x33b98	; 0x33b98 <MMU2::MMU2::eject_filament(unsigned char, bool) [clone .constprop.99]>
                break;
            case 706:
#ifdef MMU_HAS_CUTTER
                if (eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED) != 0){
    b4e2:	8e ec       	ldi	r24, 0xCE	; 206
    b4e4:	9e e0       	ldi	r25, 0x0E	; 14
    b4e6:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
    b4ea:	88 23       	and	r24, r24
    b4ec:	51 f0       	breq	.+20     	; 0xb502 <gcodes_M704_M705_M706(unsigned int)+0x6c>
        IncrementMMUFails();
    }
}

bool MMU2::cut_filament(uint8_t slot, bool enableFullScreenMsg /*= true*/) {
    if (!WaitForMMUReady()) {
    b4ee:	0f 94 a6 79 	call	0x2f34c	; 0x2f34c <MMU2::MMU2::WaitForMMUReady() [clone .constprop.106]>
    b4f2:	88 23       	and	r24, r24
    b4f4:	31 f0       	breq	.+12     	; 0xb502 <gcodes_M704_M705_M706(unsigned int)+0x6c>
    b4f6:	8c 2f       	mov	r24, r28
            default:
                break;
            }
        }
    }
}
    b4f8:	cf 91       	pop	r28
    b4fa:	1f 91       	pop	r17
    b4fc:	0f 91       	pop	r16
    b4fe:	0d 94 49 9e 	jmp	0x33c92	; 0x33c92 <MMU2::MMU2::cut_filament(unsigned char, bool) [clone .part.39] [clone .constprop.96]>
    b502:	cf 91       	pop	r28
    b504:	1f 91       	pop	r17
    b506:	0f 91       	pop	r16
    b508:	08 95       	ret

0000b50a <code_value() [clone .lto_priv.509]>:
#endif

// Return True if a character was found
static inline bool    code_seen(char code) { return (strchr_pointer = strchr(CMDBUFFER_CURRENT_STRING, code)) != NULL; }
static inline bool    code_seen_P(const char *code_PROGMEM) { return (strchr_pointer = strstr_P(CMDBUFFER_CURRENT_STRING, code_PROGMEM)) != NULL; }
static inline float   code_value()      { return strtod_noE(strchr_pointer+1, NULL);}
    b50a:	8f 92       	push	r8
    b50c:	9f 92       	push	r9
    b50e:	af 92       	push	r10
    b510:	bf 92       	push	r11
    b512:	cf 92       	push	r12
    b514:	df 92       	push	r13
    b516:	ef 92       	push	r14
    b518:	ff 92       	push	r15
    b51a:	0f 93       	push	r16
    b51c:	1f 93       	push	r17
    b51e:	cf 93       	push	r28
    b520:	df 93       	push	r29
    b522:	00 91 bb 04 	lds	r16, 0x04BB	; 0x8004bb <strchr_pointer>
    b526:	10 91 bc 04 	lds	r17, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
    b52a:	0f 5f       	subi	r16, 0xFF	; 255
    b52c:	1f 4f       	sbci	r17, 0xFF	; 255

	if (endptr)
		*endptr = (char*)nptr;

	do {
		c = *nptr++;
    b52e:	68 01       	movw	r12, r16
    b530:	8f ef       	ldi	r24, 0xFF	; 255
    b532:	c8 1a       	sub	r12, r24
    b534:	d8 0a       	sbc	r13, r24
    b536:	d8 01       	movw	r26, r16
    b538:	dc 91       	ld	r29, X
	} while (isspace(c));
    b53a:	8d 2f       	mov	r24, r29
    b53c:	90 e0       	ldi	r25, 0x00	; 0
    b53e:	0f 94 71 a1 	call	0x342e2	; 0x342e2 <isspace>
    b542:	7c 01       	movw	r14, r24
    b544:	89 2b       	or	r24, r25
    b546:	01 f5       	brne	.+64     	; 0xb588 <code_value() [clone .lto_priv.509]+0x7e>

	flag = 0;
	if (c == '-') {
    b548:	dd 32       	cpi	r29, 0x2D	; 45
    b54a:	01 f5       	brne	.+64     	; 0xb58c <code_value() [clone .lto_priv.509]+0x82>
		flag = FL_MINUS;
		c = *nptr++;
    b54c:	68 01       	movw	r12, r16
    b54e:	b2 e0       	ldi	r27, 0x02	; 2
    b550:	cb 0e       	add	r12, r27
    b552:	d1 1c       	adc	r13, r1
    b554:	f8 01       	movw	r30, r16
    b556:	d1 81       	ldd	r29, Z+1	; 0x01
		c = *nptr++;
	} while (isspace(c));

	flag = 0;
	if (c == '-') {
		flag = FL_MINUS;
    b558:	c1 e0       	ldi	r28, 0x01	; 1
	}
	else if (c == '+') {
		c = *nptr++;
	}

	if (!strncasecmp_P(nptr - 1, pstr_inf, 3)) {
    b55a:	86 01       	movw	r16, r12
    b55c:	01 50       	subi	r16, 0x01	; 1
    b55e:	11 09       	sbc	r17, r1
    b560:	43 e0       	ldi	r20, 0x03	; 3
    b562:	50 e0       	ldi	r21, 0x00	; 0
    b564:	64 e8       	ldi	r22, 0x84	; 132
    b566:	76 e7       	ldi	r23, 0x76	; 118
    b568:	c8 01       	movw	r24, r16
    b56a:	0f 94 a7 a1 	call	0x3434e	; 0x3434e <strncasecmp_P>
    b56e:	89 2b       	or	r24, r25
    b570:	c1 f4       	brne	.+48     	; 0xb5a2 <code_value() [clone .lto_priv.509]+0x98>
		nptr += 2;
		if (!strncasecmp_P(nptr, pstr_inity, 5))
			nptr += 5;
		if (endptr)
			*endptr = (char*)nptr;
		return flag & FL_MINUS ? -INFINITY : +INFINITY;
    b572:	60 e0       	ldi	r22, 0x00	; 0
    b574:	70 e0       	ldi	r23, 0x00	; 0
    b576:	80 e8       	ldi	r24, 0x80	; 128
    b578:	9f ef       	ldi	r25, 0xFF	; 255
    b57a:	c1 11       	cpse	r28, r1
    b57c:	db c0       	rjmp	.+438    	; 0xb734 <code_value() [clone .lto_priv.509]+0x22a>
    b57e:	60 e0       	ldi	r22, 0x00	; 0
    b580:	70 e0       	ldi	r23, 0x00	; 0
    b582:	80 e8       	ldi	r24, 0x80	; 128
    b584:	9f e7       	ldi	r25, 0x7F	; 127
    b586:	d6 c0       	rjmp	.+428    	; 0xb734 <code_value() [clone .lto_priv.509]+0x22a>

	if (endptr)
		*endptr = (char*)nptr;

	do {
		c = *nptr++;
    b588:	86 01       	movw	r16, r12
    b58a:	d1 cf       	rjmp	.-94     	; 0xb52e <code_value() [clone .lto_priv.509]+0x24>
	flag = 0;
	if (c == '-') {
		flag = FL_MINUS;
		c = *nptr++;
	}
	else if (c == '+') {
    b58c:	db 32       	cpi	r29, 0x2B	; 43
    b58e:	39 f4       	brne	.+14     	; 0xb59e <code_value() [clone .lto_priv.509]+0x94>
		c = *nptr++;
    b590:	68 01       	movw	r12, r16
    b592:	f2 e0       	ldi	r31, 0x02	; 2
    b594:	cf 0e       	add	r12, r31
    b596:	d1 1c       	adc	r13, r1
    b598:	d8 01       	movw	r26, r16
    b59a:	11 96       	adiw	r26, 0x01	; 1
    b59c:	dc 91       	ld	r29, X

	do {
		c = *nptr++;
	} while (isspace(c));

	flag = 0;
    b59e:	c0 e0       	ldi	r28, 0x00	; 0
    b5a0:	dc cf       	rjmp	.-72     	; 0xb55a <code_value() [clone .lto_priv.509]+0x50>
		return flag & FL_MINUS ? -INFINITY : +INFINITY;
	}

	/* NAN() construction is not realised.
	   Length would be 3 characters only.	*/
	if (!strncasecmp_P(nptr - 1, pstr_nan, 3)) {
    b5a2:	43 e0       	ldi	r20, 0x03	; 3
    b5a4:	50 e0       	ldi	r21, 0x00	; 0
    b5a6:	61 e8       	ldi	r22, 0x81	; 129
    b5a8:	76 e7       	ldi	r23, 0x76	; 118
    b5aa:	c8 01       	movw	r24, r16
    b5ac:	0f 94 a7 a1 	call	0x3434e	; 0x3434e <strncasecmp_P>
    b5b0:	89 2b       	or	r24, r25
    b5b2:	09 f4       	brne	.+2      	; 0xb5b6 <code_value() [clone .lto_priv.509]+0xac>
    b5b4:	cc c0       	rjmp	.+408    	; 0xb74e <code_value() [clone .lto_priv.509]+0x244>
    b5b6:	f6 01       	movw	r30, r12
			*endptr = (char*)nptr + 2;
		return NAN;
	}

	x.u32 = 0;
	exp = 0;
    b5b8:	10 e0       	ldi	r17, 0x00	; 0
    b5ba:	00 e0       	ldi	r16, 0x00	; 0
		if (endptr)
			*endptr = (char*)nptr + 2;
		return NAN;
	}

	x.u32 = 0;
    b5bc:	20 e0       	ldi	r18, 0x00	; 0
    b5be:	30 e0       	ldi	r19, 0x00	; 0
    b5c0:	a9 01       	movw	r20, r18
    b5c2:	6f 01       	movw	r12, r30
	exp = 0;
	while (1) {

		c -= '0';
    b5c4:	d0 53       	subi	r29, 0x30	; 48

		if (c <= 9) {
    b5c6:	da 30       	cpi	r29, 0x0A	; 10
    b5c8:	60 f5       	brcc	.+88     	; 0xb622 <code_value() [clone .lto_priv.509]+0x118>
			flag |= FL_ANY;
    b5ca:	bc 2e       	mov	r11, r28
    b5cc:	68 94       	set
    b5ce:	b1 f8       	bld	r11, 1
    b5d0:	8c 2f       	mov	r24, r28
    b5d2:	88 70       	andi	r24, 0x08	; 8
			if (flag & FL_OVFL) {
    b5d4:	c2 ff       	sbrs	r28, 2
    b5d6:	09 c0       	rjmp	.+18     	; 0xb5ea <code_value() [clone .lto_priv.509]+0xe0>
				if (!(flag & FL_DOT))
    b5d8:	81 11       	cpse	r24, r1
    b5da:	02 c0       	rjmp	.+4      	; 0xb5e0 <code_value() [clone .lto_priv.509]+0xd6>
					exp += 1;
    b5dc:	0f 5f       	subi	r16, 0xFF	; 255
    b5de:	1f 4f       	sbci	r17, 0xFF	; 255
    b5e0:	31 96       	adiw	r30, 0x01	; 1
			flag |= FL_DOT;
		}
		else {
			break;
		}
		c = *nptr++;
    b5e2:	d6 01       	movw	r26, r12
    b5e4:	dc 91       	ld	r29, X
    b5e6:	cb 2d       	mov	r28, r11
    b5e8:	ec cf       	rjmp	.-40     	; 0xb5c2 <code_value() [clone .lto_priv.509]+0xb8>
			if (flag & FL_OVFL) {
				if (!(flag & FL_DOT))
					exp += 1;
			}
			else {
				if (flag & FL_DOT)
    b5ea:	88 23       	and	r24, r24
    b5ec:	11 f0       	breq	.+4      	; 0xb5f2 <code_value() [clone .lto_priv.509]+0xe8>
					exp -= 1;
    b5ee:	01 50       	subi	r16, 0x01	; 1
    b5f0:	11 09       	sbc	r17, r1
				/* x.u32 = x.u32 * 10 + c	*/
				x.u32 = (((x.u32 << 2) + x.u32) << 1) + c;
    b5f2:	a5 e0       	ldi	r26, 0x05	; 5
    b5f4:	b0 e0       	ldi	r27, 0x00	; 0
    b5f6:	0f 94 75 a4 	call	0x348ea	; 0x348ea <__muluhisi3>
    b5fa:	9b 01       	movw	r18, r22
    b5fc:	ac 01       	movw	r20, r24
    b5fe:	22 0f       	add	r18, r18
    b600:	33 1f       	adc	r19, r19
    b602:	44 1f       	adc	r20, r20
    b604:	55 1f       	adc	r21, r21
    b606:	2d 0f       	add	r18, r29
    b608:	31 1d       	adc	r19, r1
    b60a:	41 1d       	adc	r20, r1
    b60c:	51 1d       	adc	r21, r1
				if (x.u32 >= (ULONG_MAX - 9) / 10)
    b60e:	28 39       	cpi	r18, 0x98	; 152
    b610:	b9 e9       	ldi	r27, 0x99	; 153
    b612:	3b 07       	cpc	r19, r27
    b614:	4b 07       	cpc	r20, r27
    b616:	b9 e1       	ldi	r27, 0x19	; 25
    b618:	5b 07       	cpc	r21, r27
    b61a:	10 f3       	brcs	.-60     	; 0xb5e0 <code_value() [clone .lto_priv.509]+0xd6>
					flag |= FL_OVFL;
    b61c:	c6 60       	ori	r28, 0x06	; 6
    b61e:	bc 2e       	mov	r11, r28
    b620:	df cf       	rjmp	.-66     	; 0xb5e0 <code_value() [clone .lto_priv.509]+0xd6>
			}

		}
		else if (c == (('.' - '0') & 0xff) && !(flag & FL_DOT)) {
    b622:	de 3f       	cpi	r29, 0xFE	; 254
    b624:	31 f4       	brne	.+12     	; 0xb632 <code_value() [clone .lto_priv.509]+0x128>
    b626:	c3 fd       	sbrc	r28, 3
    b628:	33 c0       	rjmp	.+102    	; 0xb690 <code_value() [clone .lto_priv.509]+0x186>
			flag |= FL_DOT;
    b62a:	bc 2e       	mov	r11, r28
    b62c:	68 94       	set
    b62e:	b3 f8       	bld	r11, 3
    b630:	d7 cf       	rjmp	.-82     	; 0xb5e0 <code_value() [clone .lto_priv.509]+0xd6>
		}
		c = *nptr++;
	}

	// Check for exponent "E", but disable capital E
	if (c == (('e' - '0') & 0xff) /*|| c == (('E' - '0') & 0xff)*/)
    b632:	d5 33       	cpi	r29, 0x35	; 53
    b634:	69 f5       	brne	.+90     	; 0xb690 <code_value() [clone .lto_priv.509]+0x186>
	{
		int i;
		c = *nptr++;
    b636:	80 81       	ld	r24, Z
		i = 2;
		if (c == '-') {
    b638:	8d 32       	cpi	r24, 0x2D	; 45
    b63a:	31 f4       	brne	.+12     	; 0xb648 <code_value() [clone .lto_priv.509]+0x13e>
			flag |= FL_MEXP;
    b63c:	c0 61       	ori	r28, 0x10	; 16
			c = *nptr++;
    b63e:	bf 01       	movw	r22, r30
		}
		else if (c == '+') {
			c = *nptr++;
    b640:	6e 5f       	subi	r22, 0xFE	; 254
    b642:	7f 4f       	sbci	r23, 0xFF	; 255
    b644:	81 81       	ldd	r24, Z+1	; 0x01
    b646:	05 c0       	rjmp	.+10     	; 0xb652 <code_value() [clone .lto_priv.509]+0x148>
    b648:	bf 01       	movw	r22, r30
		i = 2;
		if (c == '-') {
			flag |= FL_MEXP;
			c = *nptr++;
		}
		else if (c == '+') {
    b64a:	8b 32       	cpi	r24, 0x2B	; 43
    b64c:	c9 f3       	breq	.-14     	; 0xb640 <code_value() [clone .lto_priv.509]+0x136>

	// Check for exponent "E", but disable capital E
	if (c == (('e' - '0') & 0xff) /*|| c == (('E' - '0') & 0xff)*/)
	{
		int i;
		c = *nptr++;
    b64e:	6f 5f       	subi	r22, 0xFF	; 255
    b650:	7f 4f       	sbci	r23, 0xFF	; 255
			c = *nptr++;
		}
		else {
			i = 1;
		}
		c -= '0';
    b652:	80 53       	subi	r24, 0x30	; 48
		if (c > 9) {
    b654:	8a 30       	cpi	r24, 0x0A	; 10
    b656:	e0 f4       	brcc	.+56     	; 0xb690 <code_value() [clone .lto_priv.509]+0x186>
    b658:	fb 01       	movw	r30, r22
			nptr -= i;
		}
		else {
			i = 0;
			do {
				if (i < 3200)
    b65a:	b0 e8       	ldi	r27, 0x80	; 128
    b65c:	eb 16       	cp	r14, r27
    b65e:	bc e0       	ldi	r27, 0x0C	; 12
    b660:	fb 06       	cpc	r15, r27
    b662:	5c f4       	brge	.+22     	; 0xb67a <code_value() [clone .lto_priv.509]+0x170>
					i = (((i << 2) + i) << 1) + c;	/* i = 10*i + c	*/
    b664:	b7 01       	movw	r22, r14
    b666:	66 0f       	add	r22, r22
    b668:	77 1f       	adc	r23, r23
    b66a:	66 0f       	add	r22, r22
    b66c:	77 1f       	adc	r23, r23
    b66e:	e6 0e       	add	r14, r22
    b670:	f7 1e       	adc	r15, r23
    b672:	ee 0c       	add	r14, r14
    b674:	ff 1c       	adc	r15, r15
    b676:	e8 0e       	add	r14, r24
    b678:	f1 1c       	adc	r15, r1
				c = *nptr++ - '0';
    b67a:	81 91       	ld	r24, Z+
    b67c:	80 53       	subi	r24, 0x30	; 48
			} while (c <= 9);
    b67e:	8a 30       	cpi	r24, 0x0A	; 10
    b680:	60 f3       	brcs	.-40     	; 0xb65a <code_value() [clone .lto_priv.509]+0x150>
			if (flag & FL_MEXP)
    b682:	c4 ff       	sbrs	r28, 4
    b684:	03 c0       	rjmp	.+6      	; 0xb68c <code_value() [clone .lto_priv.509]+0x182>
				i = -i;
    b686:	f1 94       	neg	r15
    b688:	e1 94       	neg	r14
    b68a:	f1 08       	sbc	r15, r1
			exp += i;
    b68c:	0e 0d       	add	r16, r14
    b68e:	1f 1d       	adc	r17, r15
	}

	if ((flag & FL_ANY) && endptr)
		*endptr = (char*)nptr - 1;

	x.flt = __floatunsisf(x.u32);		/* manually	*/
    b690:	ca 01       	movw	r24, r20
    b692:	b9 01       	movw	r22, r18
    b694:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
	if ((flag & FL_MINUS) && (flag & FL_ANY))
    b698:	c3 70       	andi	r28, 0x03	; 3
    b69a:	c3 30       	cpi	r28, 0x03	; 3
    b69c:	09 f4       	brne	.+2      	; 0xb6a0 <code_value() [clone .lto_priv.509]+0x196>
		x.flt = -x.flt;
    b69e:	90 58       	subi	r25, 0x80	; 128
    b6a0:	4b 01       	movw	r8, r22
    b6a2:	5c 01       	movw	r10, r24

	if (x.flt != 0) {
    b6a4:	20 e0       	ldi	r18, 0x00	; 0
    b6a6:	30 e0       	ldi	r19, 0x00	; 0
    b6a8:	a9 01       	movw	r20, r18
    b6aa:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
    b6ae:	88 23       	and	r24, r24
    b6b0:	09 f4       	brne	.+2      	; 0xb6b4 <code_value() [clone .lto_priv.509]+0x1aa>
    b6b2:	3e c0       	rjmp	.+124    	; 0xb730 <code_value() [clone .lto_priv.509]+0x226>
		if (exp < 0) {
			nptr = (void*)(pwr_m10 + 5);
			exp = -exp;
		}
		else {
			nptr = (void*)(pwr_p10 + 5);
    b6b4:	cd e7       	ldi	r28, 0x7D	; 125
    b6b6:	d6 e7       	ldi	r29, 0x76	; 118
	if ((flag & FL_MINUS) && (flag & FL_ANY))
		x.flt = -x.flt;

	if (x.flt != 0) {
		int pwr;
		if (exp < 0) {
    b6b8:	17 ff       	sbrs	r17, 7
    b6ba:	05 c0       	rjmp	.+10     	; 0xb6c6 <code_value() [clone .lto_priv.509]+0x1bc>
			nptr = (void*)(pwr_m10 + 5);
			exp = -exp;
    b6bc:	11 95       	neg	r17
    b6be:	01 95       	neg	r16
    b6c0:	11 09       	sbc	r17, r1
		x.flt = -x.flt;

	if (x.flt != 0) {
		int pwr;
		if (exp < 0) {
			nptr = (void*)(pwr_m10 + 5);
    b6c2:	c5 e6       	ldi	r28, 0x65	; 101
    b6c4:	d6 e7       	ldi	r29, 0x76	; 118
    b6c6:	6e 01       	movw	r12, r28
    b6c8:	e8 e1       	ldi	r30, 0x18	; 24
    b6ca:	ce 1a       	sub	r12, r30
    b6cc:	d1 08       	sbc	r13, r1
			exp = -exp;
		}
		else {
			nptr = (void*)(pwr_p10 + 5);
    b6ce:	80 e2       	ldi	r24, 0x20	; 32
    b6d0:	e8 2e       	mov	r14, r24
    b6d2:	f1 2c       	mov	r15, r1
    b6d4:	0d c0       	rjmp	.+26     	; 0xb6f0 <code_value() [clone .lto_priv.509]+0x1e6>
			for (; exp >= pwr; exp -= pwr) {
				union {
					unsigned long u32;
					float flt;
				} y;
				y.u32 = pgm_read_dword((float*)nptr);
    b6d6:	fe 01       	movw	r30, r28
    b6d8:	25 91       	lpm	r18, Z+
    b6da:	35 91       	lpm	r19, Z+
    b6dc:	45 91       	lpm	r20, Z+
    b6de:	54 91       	lpm	r21, Z
		}
		else {
			nptr = (void*)(pwr_p10 + 5);
		}
		for (pwr = 32; pwr; pwr >>= 1) {
			for (; exp >= pwr; exp -= pwr) {
    b6e0:	0e 19       	sub	r16, r14
    b6e2:	1f 09       	sbc	r17, r15
				union {
					unsigned long u32;
					float flt;
				} y;
				y.u32 = pgm_read_dword((float*)nptr);
				x.flt *= y.flt;
    b6e4:	c5 01       	movw	r24, r10
    b6e6:	b4 01       	movw	r22, r8
    b6e8:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    b6ec:	4b 01       	movw	r8, r22
    b6ee:	5c 01       	movw	r10, r24
    b6f0:	d5 01       	movw	r26, r10
    b6f2:	c4 01       	movw	r24, r8
		}
		else {
			nptr = (void*)(pwr_p10 + 5);
		}
		for (pwr = 32; pwr; pwr >>= 1) {
			for (; exp >= pwr; exp -= pwr) {
    b6f4:	0e 15       	cp	r16, r14
    b6f6:	1f 05       	cpc	r17, r15
    b6f8:	74 f7       	brge	.-36     	; 0xb6d6 <code_value() [clone .lto_priv.509]+0x1cc>
					float flt;
				} y;
				y.u32 = pgm_read_dword((float*)nptr);
				x.flt *= y.flt;
			}
			nptr -= sizeof(float);
    b6fa:	24 97       	sbiw	r28, 0x04	; 4
			exp = -exp;
		}
		else {
			nptr = (void*)(pwr_p10 + 5);
		}
		for (pwr = 32; pwr; pwr >>= 1) {
    b6fc:	f5 94       	asr	r15
    b6fe:	e7 94       	ror	r14
    b700:	cc 16       	cp	r12, r28
    b702:	dd 06       	cpc	r13, r29
    b704:	a9 f7       	brne	.-22     	; 0xb6f0 <code_value() [clone .lto_priv.509]+0x1e6>
    not plus or minus infinity, and not NaN.
 */
__ATTR_CONST__ static inline int isfinite (double __x)
{
    unsigned char __exp;
    __asm__ (
    b706:	8a 2f       	mov	r24, r26
    b708:	88 0f       	add	r24, r24
    b70a:	8b 2f       	mov	r24, r27
    b70c:	88 1f       	adc	r24, r24
				y.u32 = pgm_read_dword((float*)nptr);
				x.flt *= y.flt;
			}
			nptr -= sizeof(float);
		}
		if (!isfinite(x.flt) || x.flt == 0)
    b70e:	8f 3f       	cpi	r24, 0xFF	; 255
    b710:	49 f0       	breq	.+18     	; 0xb724 <code_value() [clone .lto_priv.509]+0x21a>
    b712:	20 e0       	ldi	r18, 0x00	; 0
    b714:	30 e0       	ldi	r19, 0x00	; 0
    b716:	a9 01       	movw	r20, r18
    b718:	c5 01       	movw	r24, r10
    b71a:	b4 01       	movw	r22, r8
    b71c:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
    b720:	81 11       	cpse	r24, r1
    b722:	06 c0       	rjmp	.+12     	; 0xb730 <code_value() [clone .lto_priv.509]+0x226>
			errno = ERANGE;
    b724:	82 e2       	ldi	r24, 0x22	; 34
    b726:	90 e0       	ldi	r25, 0x00	; 0
    b728:	90 93 0c 17 	sts	0x170C, r25	; 0x80170c <errno+0x1>
    b72c:	80 93 0b 17 	sts	0x170B, r24	; 0x80170b <errno>
	}

	return x.flt;
    b730:	c5 01       	movw	r24, r10
    b732:	b4 01       	movw	r22, r8
    b734:	df 91       	pop	r29
    b736:	cf 91       	pop	r28
    b738:	1f 91       	pop	r17
    b73a:	0f 91       	pop	r16
    b73c:	ff 90       	pop	r15
    b73e:	ef 90       	pop	r14
    b740:	df 90       	pop	r13
    b742:	cf 90       	pop	r12
    b744:	bf 90       	pop	r11
    b746:	af 90       	pop	r10
    b748:	9f 90       	pop	r9
    b74a:	8f 90       	pop	r8
    b74c:	08 95       	ret
	/* NAN() construction is not realised.
	   Length would be 3 characters only.	*/
	if (!strncasecmp_P(nptr - 1, pstr_nan, 3)) {
		if (endptr)
			*endptr = (char*)nptr + 2;
		return NAN;
    b74e:	60 e0       	ldi	r22, 0x00	; 0
    b750:	70 e0       	ldi	r23, 0x00	; 0
    b752:	80 ec       	ldi	r24, 0xC0	; 192
    b754:	9f e7       	ldi	r25, 0x7F	; 127
    b756:	ee cf       	rjmp	.-36     	; 0xb734 <code_value() [clone .lto_priv.509]+0x22a>

0000b758 <get_coordinates()>:
		}
	}
}
#endif //MOTHERBOARD == BOARD_RAMBO_MINI_1_0 || MOTHERBOARD == BOARD_RAMBO_MINI_1_3

void get_coordinates() {
    b758:	2f 92       	push	r2
    b75a:	3f 92       	push	r3
    b75c:	4f 92       	push	r4
    b75e:	5f 92       	push	r5
    b760:	6f 92       	push	r6
    b762:	7f 92       	push	r7
    b764:	8f 92       	push	r8
    b766:	9f 92       	push	r9
    b768:	af 92       	push	r10
    b76a:	bf 92       	push	r11
    b76c:	cf 92       	push	r12
    b76e:	df 92       	push	r13
    b770:	ef 92       	push	r14
    b772:	ff 92       	push	r15
    b774:	0f 93       	push	r16
    b776:	1f 93       	push	r17
    b778:	cf 93       	push	r28
    b77a:	df 93       	push	r29
    b77c:	cd b7       	in	r28, 0x3d	; 61
    b77e:	de b7       	in	r29, 0x3e	; 62
    b780:	a1 97       	sbiw	r28, 0x21	; 33
    b782:	0f b6       	in	r0, 0x3f	; 63
    b784:	f8 94       	cli
    b786:	de bf       	out	0x3e, r29	; 62
    b788:	0f be       	out	0x3f, r0	; 63
    b78a:	cd bf       	out	0x3d, r28	; 61
    b78c:	84 ec       	ldi	r24, 0xC4	; 196
    b78e:	92 e0       	ldi	r25, 0x02	; 2
    b790:	9d 8f       	std	Y+29, r25	; 0x1d
    b792:	8c 8f       	std	Y+28, r24	; 0x1c
    b794:	81 e6       	ldi	r24, 0x61	; 97
    b796:	28 2e       	mov	r2, r24
    b798:	82 e1       	ldi	r24, 0x12	; 18
    b79a:	38 2e       	mov	r3, r24
    b79c:	09 e2       	ldi	r16, 0x29	; 41
    b79e:	16 e0       	ldi	r17, 0x06	; 6
  for (uint8_t i = X_AXIS, mask = X_AXIS_MASK; i < NUM_AXIS; i++, mask <<= 1) {
    b7a0:	91 e0       	ldi	r25, 0x01	; 1
    b7a2:	9a 8f       	std	Y+26, r25	; 0x1a
    b7a4:	19 8e       	std	Y+25, r1	; 0x19
    if(code_seen(axis_codes[i]))
    b7a6:	ec 8d       	ldd	r30, Y+28	; 0x1c
    b7a8:	fd 8d       	ldd	r31, Y+29	; 0x1d
    b7aa:	81 91       	ld	r24, Z+
    b7ac:	fd 8f       	std	Y+29, r31	; 0x1d
    b7ae:	ec 8f       	std	Y+28, r30	; 0x1c
    b7b0:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
    b7b4:	e8 2e       	mov	r14, r24
    b7b6:	88 23       	and	r24, r24
    b7b8:	09 f4       	brne	.+2      	; 0xb7bc <get_coordinates()+0x64>
    b7ba:	54 c1       	rjmp	.+680    	; 0xba64 <get_coordinates()+0x30c>
    {
      bool relative = axis_relative_modes & mask;
    b7bc:	f0 90 57 12 	lds	r15, 0x1257	; 0x801257 <axis_relative_modes>
    b7c0:	fa 8d       	ldd	r31, Y+26	; 0x1a
    b7c2:	ff 22       	and	r15, r31
      destination[i] = code_value();
    b7c4:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
    b7c8:	2b 01       	movw	r4, r22
    b7ca:	3c 01       	movw	r6, r24
    b7cc:	f8 01       	movw	r30, r16
    b7ce:	40 82       	st	Z, r4
    b7d0:	51 82       	std	Z+1, r5	; 0x01
    b7d2:	62 82       	std	Z+2, r6	; 0x02
    b7d4:	73 82       	std	Z+3, r7	; 0x03
      if (i == E_AXIS) {
    b7d6:	f9 8d       	ldd	r31, Y+25	; 0x19
    b7d8:	f3 30       	cpi	r31, 0x03	; 3
    b7da:	09 f0       	breq	.+2      	; 0xb7de <get_coordinates()+0x86>
    b7dc:	45 c0       	rjmp	.+138    	; 0xb868 <get_coordinates()+0x110>

void get_coordinates() {
  for (uint8_t i = X_AXIS, mask = X_AXIS_MASK; i < NUM_AXIS; i++, mask <<= 1) {
    if(code_seen(axis_codes[i]))
    {
      bool relative = axis_relative_modes & mask;
    b7de:	dd 24       	eor	r13, r13
    b7e0:	d3 94       	inc	r13
    b7e2:	f1 10       	cpse	r15, r1
    b7e4:	01 c0       	rjmp	.+2      	; 0xb7e8 <get_coordinates()+0x90>
    b7e6:	d1 2c       	mov	r13, r1
      destination[i] = code_value();
      if (i == E_AXIS) {
        float emult = extruder_multiplier[active_extruder];
    b7e8:	80 90 10 02 	lds	r8, 0x0210	; 0x800210 <extruder_multiplier>
    b7ec:	90 90 11 02 	lds	r9, 0x0211	; 0x800211 <extruder_multiplier+0x1>
    b7f0:	a0 90 12 02 	lds	r10, 0x0212	; 0x800212 <extruder_multiplier+0x2>
    b7f4:	b0 90 13 02 	lds	r11, 0x0213	; 0x800213 <extruder_multiplier+0x3>
        if (emult != 1.) {
    b7f8:	20 e0       	ldi	r18, 0x00	; 0
    b7fa:	30 e0       	ldi	r19, 0x00	; 0
    b7fc:	40 e8       	ldi	r20, 0x80	; 128
    b7fe:	5f e3       	ldi	r21, 0x3F	; 63
    b800:	c5 01       	movw	r24, r10
    b802:	b4 01       	movw	r22, r8
    b804:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
    b808:	88 23       	and	r24, r24
    b80a:	59 f1       	breq	.+86     	; 0xb862 <get_coordinates()+0x10a>
          if (! relative) {
    b80c:	f1 10       	cpse	r15, r1
    b80e:	15 c0       	rjmp	.+42     	; 0xb83a <get_coordinates()+0xe2>
            destination[i] -= current_position[i];
    b810:	20 91 6d 12 	lds	r18, 0x126D	; 0x80126d <current_position+0xc>
    b814:	30 91 6e 12 	lds	r19, 0x126E	; 0x80126e <current_position+0xd>
    b818:	40 91 6f 12 	lds	r20, 0x126F	; 0x80126f <current_position+0xe>
    b81c:	50 91 70 12 	lds	r21, 0x1270	; 0x801270 <current_position+0xf>
    b820:	c3 01       	movw	r24, r6
    b822:	b2 01       	movw	r22, r4
    b824:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    b828:	60 93 35 06 	sts	0x0635, r22	; 0x800635 <destination+0xc>
    b82c:	70 93 36 06 	sts	0x0636, r23	; 0x800636 <destination+0xd>
    b830:	80 93 37 06 	sts	0x0637, r24	; 0x800637 <destination+0xe>
    b834:	90 93 38 06 	sts	0x0638, r25	; 0x800638 <destination+0xf>
            relative = true;
    b838:	de 2c       	mov	r13, r14
          }
          destination[i] *= emult;
    b83a:	a5 01       	movw	r20, r10
    b83c:	94 01       	movw	r18, r8
    b83e:	60 91 35 06 	lds	r22, 0x0635	; 0x800635 <destination+0xc>
    b842:	70 91 36 06 	lds	r23, 0x0636	; 0x800636 <destination+0xd>
    b846:	80 91 37 06 	lds	r24, 0x0637	; 0x800637 <destination+0xe>
    b84a:	90 91 38 06 	lds	r25, 0x0638	; 0x800638 <destination+0xf>
    b84e:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    b852:	60 93 35 06 	sts	0x0635, r22	; 0x800635 <destination+0xc>
    b856:	70 93 36 06 	sts	0x0636, r23	; 0x800636 <destination+0xd>
    b85a:	80 93 37 06 	sts	0x0637, r24	; 0x800637 <destination+0xe>
    b85e:	90 93 38 06 	sts	0x0638, r25	; 0x800638 <destination+0xf>
        }
      }
      if (relative)
    b862:	d1 10       	cpse	r13, r1
    b864:	03 c0       	rjmp	.+6      	; 0xb86c <get_coordinates()+0x114>
    b866:	5f c0       	rjmp	.+190    	; 0xb926 <get_coordinates()+0x1ce>
    b868:	ff 20       	and	r15, r15
    b86a:	89 f0       	breq	.+34     	; 0xb88e <get_coordinates()+0x136>
        destination[i] += current_position[i];
    b86c:	f1 01       	movw	r30, r2
    b86e:	20 81       	ld	r18, Z
    b870:	31 81       	ldd	r19, Z+1	; 0x01
    b872:	42 81       	ldd	r20, Z+2	; 0x02
    b874:	53 81       	ldd	r21, Z+3	; 0x03
    b876:	f8 01       	movw	r30, r16
    b878:	60 81       	ld	r22, Z
    b87a:	71 81       	ldd	r23, Z+1	; 0x01
    b87c:	82 81       	ldd	r24, Z+2	; 0x02
    b87e:	93 81       	ldd	r25, Z+3	; 0x03
    b880:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    b884:	f8 01       	movw	r30, r16
    b886:	60 83       	st	Z, r22
    b888:	71 83       	std	Z+1, r23	; 0x01
    b88a:	82 83       	std	Z+2, r24	; 0x02
    b88c:	93 83       	std	Z+3, r25	; 0x03
#if MOTHERBOARD == BOARD_RAMBO_MINI_1_0 || MOTHERBOARD == BOARD_RAMBO_MINI_1_3
	  if (i == Z_AXIS && SilentModeMenu == SILENT_MODE_AUTO) update_currents();
    b88e:	f9 8d       	ldd	r31, Y+25	; 0x19
    b890:	f2 30       	cpi	r31, 0x02	; 2
    b892:	d9 f5       	brne	.+118    	; 0xb90a <get_coordinates()+0x1b2>
    b894:	80 91 bb 03 	lds	r24, 0x03BB	; 0x8003bb <SilentModeMenu>
    b898:	82 30       	cpi	r24, 0x02	; 2
    b89a:	09 f0       	breq	.+2      	; 0xb89e <get_coordinates()+0x146>
    b89c:	ee c0       	rjmp	.+476    	; 0xba7a <get_coordinates()+0x322>
		SERIAL_PROTOCOLLNRPGM(MSG_OK);
}

#if MOTHERBOARD == BOARD_RAMBO_MINI_1_0 || MOTHERBOARD == BOARD_RAMBO_MINI_1_3
void update_currents() {
	float current_high[3] = DEFAULT_PWM_MOTOR_CURRENT_LOUD;
    b89e:	8c e0       	ldi	r24, 0x0C	; 12
    b8a0:	e0 ea       	ldi	r30, 0xA0	; 160
    b8a2:	f2 e0       	ldi	r31, 0x02	; 2
    b8a4:	de 01       	movw	r26, r28
    b8a6:	1d 96       	adiw	r26, 0x0d	; 13
    b8a8:	01 90       	ld	r0, Z+
    b8aa:	0d 92       	st	X+, r0
    b8ac:	8a 95       	dec	r24
    b8ae:	e1 f7       	brne	.-8      	; 0xb8a8 <get_coordinates()+0x150>
	float current_low[3] = DEFAULT_PWM_MOTOR_CURRENT;
    b8b0:	8c e0       	ldi	r24, 0x0C	; 12
    b8b2:	ec ea       	ldi	r30, 0xAC	; 172
    b8b4:	f2 e0       	ldi	r31, 0x02	; 2
    b8b6:	de 01       	movw	r26, r28
    b8b8:	11 96       	adiw	r26, 0x01	; 1
    b8ba:	01 90       	ld	r0, Z+
    b8bc:	0d 92       	st	X+, r0
    b8be:	8a 95       	dec	r24
    b8c0:	e1 f7       	brne	.-8      	; 0xb8ba <get_coordinates()+0x162>
	float tmp_motor[3];

	//SERIAL_ECHOLNPGM("Currents updated: ");

	if (destination[Z_AXIS] < Z_SILENT) {
    b8c2:	c0 90 31 06 	lds	r12, 0x0631	; 0x800631 <destination+0x8>
    b8c6:	d0 90 32 06 	lds	r13, 0x0632	; 0x800632 <destination+0x9>
    b8ca:	e0 90 33 06 	lds	r14, 0x0633	; 0x800633 <destination+0xa>
    b8ce:	f0 90 34 06 	lds	r15, 0x0634	; 0x800634 <destination+0xb>
    b8d2:	20 e0       	ldi	r18, 0x00	; 0
    b8d4:	30 e0       	ldi	r19, 0x00	; 0
    b8d6:	a9 01       	movw	r20, r18
    b8d8:	c7 01       	movw	r24, r14
    b8da:	b6 01       	movw	r22, r12
    b8dc:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
    b8e0:	87 ff       	sbrs	r24, 7
    b8e2:	52 c0       	rjmp	.+164    	; 0xb988 <get_coordinates()+0x230>
    b8e4:	ce 01       	movw	r24, r28
    b8e6:	01 96       	adiw	r24, 0x01	; 1
    b8e8:	7c 01       	movw	r14, r24
		//SERIAL_ECHOLNPGM("LOW");
		for (uint8_t i = 0; i < 3; i++) {
    b8ea:	d1 2c       	mov	r13, r1
			st_current_set(i, current_low[i]);
    b8ec:	f7 01       	movw	r30, r14
    b8ee:	61 91       	ld	r22, Z+
    b8f0:	71 91       	ld	r23, Z+
    b8f2:	81 91       	ld	r24, Z+
    b8f4:	91 91       	ld	r25, Z+
    b8f6:	7f 01       	movw	r14, r30
    b8f8:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
    b8fc:	8d 2d       	mov	r24, r13
    b8fe:	0f 94 5e 1a 	call	0x234bc	; 0x234bc <st_current_set(unsigned char, int)>

	//SERIAL_ECHOLNPGM("Currents updated: ");

	if (destination[Z_AXIS] < Z_SILENT) {
		//SERIAL_ECHOLNPGM("LOW");
		for (uint8_t i = 0; i < 3; i++) {
    b902:	d3 94       	inc	r13
    b904:	f3 e0       	ldi	r31, 0x03	; 3
    b906:	df 12       	cpse	r13, r31
    b908:	f1 cf       	rjmp	.-30     	; 0xb8ec <get_coordinates()+0x194>
	}
}
#endif //MOTHERBOARD == BOARD_RAMBO_MINI_1_0 || MOTHERBOARD == BOARD_RAMBO_MINI_1_3

void get_coordinates() {
  for (uint8_t i = X_AXIS, mask = X_AXIS_MASK; i < NUM_AXIS; i++, mask <<= 1) {
    b90a:	f9 8d       	ldd	r31, Y+25	; 0x19
    b90c:	ff 5f       	subi	r31, 0xFF	; 255
    b90e:	f9 8f       	std	Y+25, r31	; 0x19
    b910:	8a 8d       	ldd	r24, Y+26	; 0x1a
    b912:	88 0f       	add	r24, r24
    b914:	8a 8f       	std	Y+26, r24	; 0x1a
    b916:	94 e0       	ldi	r25, 0x04	; 4
    b918:	29 0e       	add	r2, r25
    b91a:	31 1c       	adc	r3, r1
    b91c:	0c 5f       	subi	r16, 0xFC	; 252
    b91e:	1f 4f       	sbci	r17, 0xFF	; 255
    b920:	f4 30       	cpi	r31, 0x04	; 4
    b922:	09 f0       	breq	.+2      	; 0xb926 <get_coordinates()+0x1ce>
    b924:	40 cf       	rjmp	.-384    	; 0xb7a6 <get_coordinates()+0x4e>
	  if (i == Z_AXIS && SilentModeMenu == SILENT_MODE_AUTO) update_currents();
#endif //MOTHERBOARD == BOARD_RAMBO_MINI_1_0 || MOTHERBOARD == BOARD_RAMBO_MINI_1_3
    }
    else destination[i] = current_position[i]; //Are these else lines really needed?
  }
  if(code_seen('F')) {
    b926:	86 e4       	ldi	r24, 0x46	; 70
    b928:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
    b92c:	88 23       	and	r24, r24
    b92e:	99 f0       	breq	.+38     	; 0xb956 <get_coordinates()+0x1fe>
    const float next_feedrate = code_value();
    b930:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
    b934:	6b 01       	movw	r12, r22
    b936:	7c 01       	movw	r14, r24
    if(next_feedrate > 0.f) feedrate = next_feedrate;
    b938:	20 e0       	ldi	r18, 0x00	; 0
    b93a:	30 e0       	ldi	r19, 0x00	; 0
    b93c:	a9 01       	movw	r20, r18
    b93e:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
    b942:	18 16       	cp	r1, r24
    b944:	44 f4       	brge	.+16     	; 0xb956 <get_coordinates()+0x1fe>
    b946:	c0 92 7a 02 	sts	0x027A, r12	; 0x80027a <feedrate>
    b94a:	d0 92 7b 02 	sts	0x027B, r13	; 0x80027b <feedrate+0x1>
    b94e:	e0 92 7c 02 	sts	0x027C, r14	; 0x80027c <feedrate+0x2>
    b952:	f0 92 7d 02 	sts	0x027D, r15	; 0x80027d <feedrate+0x3>
  }
}
    b956:	a1 96       	adiw	r28, 0x21	; 33
    b958:	0f b6       	in	r0, 0x3f	; 63
    b95a:	f8 94       	cli
    b95c:	de bf       	out	0x3e, r29	; 62
    b95e:	0f be       	out	0x3f, r0	; 63
    b960:	cd bf       	out	0x3d, r28	; 61
    b962:	df 91       	pop	r29
    b964:	cf 91       	pop	r28
    b966:	1f 91       	pop	r17
    b968:	0f 91       	pop	r16
    b96a:	ff 90       	pop	r15
    b96c:	ef 90       	pop	r14
    b96e:	df 90       	pop	r13
    b970:	cf 90       	pop	r12
    b972:	bf 90       	pop	r11
    b974:	af 90       	pop	r10
    b976:	9f 90       	pop	r9
    b978:	8f 90       	pop	r8
    b97a:	7f 90       	pop	r7
    b97c:	6f 90       	pop	r6
    b97e:	5f 90       	pop	r5
    b980:	4f 90       	pop	r4
    b982:	3f 90       	pop	r3
    b984:	2f 90       	pop	r2
    b986:	08 95       	ret
			/*MYSERIAL.print(int(i));
			SERIAL_ECHOPGM(": ");
			MYSERIAL.println(current_low[i]);*/
		}
	}
	else if (destination[Z_AXIS] > Z_HIGH_POWER) {
    b988:	20 e0       	ldi	r18, 0x00	; 0
    b98a:	30 e0       	ldi	r19, 0x00	; 0
    b98c:	48 e4       	ldi	r20, 0x48	; 72
    b98e:	53 e4       	ldi	r21, 0x43	; 67
    b990:	c7 01       	movw	r24, r14
    b992:	b6 01       	movw	r22, r12
    b994:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
    b998:	18 16       	cp	r1, r24
    b99a:	a4 f4       	brge	.+40     	; 0xb9c4 <get_coordinates()+0x26c>
    b99c:	ce 01       	movw	r24, r28
    b99e:	0d 96       	adiw	r24, 0x0d	; 13
    b9a0:	7c 01       	movw	r14, r24
		//SERIAL_ECHOLNPGM("HIGH");
		for (uint8_t i = 0; i < 3; i++) {
    b9a2:	d1 2c       	mov	r13, r1
			st_current_set(i, current_high[i]);
    b9a4:	f7 01       	movw	r30, r14
    b9a6:	61 91       	ld	r22, Z+
    b9a8:	71 91       	ld	r23, Z+
    b9aa:	81 91       	ld	r24, Z+
    b9ac:	91 91       	ld	r25, Z+
    b9ae:	7f 01       	movw	r14, r30
    b9b0:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
    b9b4:	8d 2d       	mov	r24, r13
    b9b6:	0f 94 5e 1a 	call	0x234bc	; 0x234bc <st_current_set(unsigned char, int)>
			MYSERIAL.println(current_low[i]);*/
		}
	}
	else if (destination[Z_AXIS] > Z_HIGH_POWER) {
		//SERIAL_ECHOLNPGM("HIGH");
		for (uint8_t i = 0; i < 3; i++) {
    b9ba:	d3 94       	inc	r13
    b9bc:	f3 e0       	ldi	r31, 0x03	; 3
    b9be:	df 12       	cpse	r13, r31
    b9c0:	f1 cf       	rjmp	.-30     	; 0xb9a4 <get_coordinates()+0x24c>
    b9c2:	a3 cf       	rjmp	.-186    	; 0xb90a <get_coordinates()+0x1b2>
    b9c4:	ce 01       	movw	r24, r28
    b9c6:	01 96       	adiw	r24, 0x01	; 1
    b9c8:	99 a3       	std	Y+33, r25	; 0x21
    b9ca:	88 a3       	std	Y+32, r24	; 0x20
    b9cc:	fe 01       	movw	r30, r28
    b9ce:	3d 96       	adiw	r30, 0x0d	; 13
    b9d0:	ff 8f       	std	Y+31, r31	; 0x1f
    b9d2:	ee 8f       	std	Y+30, r30	; 0x1e
			SERIAL_ECHOPGM(": ");
			MYSERIAL.println(current_high[i]);*/
		}
	}
	else {
		for (uint8_t i = 0; i < 3; i++) {
    b9d4:	1b 8e       	std	Y+27, r1	; 0x1b
			float q = current_low[i] - Z_SILENT*((current_high[i] - current_low[i]) / (Z_HIGH_POWER - Z_SILENT));
    b9d6:	e8 a1       	ldd	r30, Y+32	; 0x20
    b9d8:	f9 a1       	ldd	r31, Y+33	; 0x21
    b9da:	c1 90       	ld	r12, Z+
    b9dc:	d1 90       	ld	r13, Z+
    b9de:	e1 90       	ld	r14, Z+
    b9e0:	f1 90       	ld	r15, Z+
    b9e2:	f9 a3       	std	Y+33, r31	; 0x21
    b9e4:	e8 a3       	std	Y+32, r30	; 0x20
    b9e6:	ee 8d       	ldd	r30, Y+30	; 0x1e
    b9e8:	ff 8d       	ldd	r31, Y+31	; 0x1f
    b9ea:	61 91       	ld	r22, Z+
    b9ec:	71 91       	ld	r23, Z+
    b9ee:	81 91       	ld	r24, Z+
    b9f0:	91 91       	ld	r25, Z+
    b9f2:	ff 8f       	std	Y+31, r31	; 0x1f
    b9f4:	ee 8f       	std	Y+30, r30	; 0x1e
    b9f6:	a7 01       	movw	r20, r14
    b9f8:	96 01       	movw	r18, r12
    b9fa:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    b9fe:	20 e0       	ldi	r18, 0x00	; 0
    ba00:	30 e0       	ldi	r19, 0x00	; 0
    ba02:	48 e4       	ldi	r20, 0x48	; 72
    ba04:	53 e4       	ldi	r21, 0x43	; 67
    ba06:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
    ba0a:	4b 01       	movw	r8, r22
    ba0c:	5c 01       	movw	r10, r24
			tmp_motor[i] = ((current_high[i] - current_low[i]) / (Z_HIGH_POWER - Z_SILENT))*destination[Z_AXIS] + q;
    ba0e:	20 91 31 06 	lds	r18, 0x0631	; 0x800631 <destination+0x8>
    ba12:	30 91 32 06 	lds	r19, 0x0632	; 0x800632 <destination+0x9>
    ba16:	40 91 33 06 	lds	r20, 0x0633	; 0x800633 <destination+0xa>
    ba1a:	50 91 34 06 	lds	r21, 0x0634	; 0x800634 <destination+0xb>
    ba1e:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    ba22:	2b 01       	movw	r4, r22
    ba24:	3c 01       	movw	r6, r24
			MYSERIAL.println(current_high[i]);*/
		}
	}
	else {
		for (uint8_t i = 0; i < 3; i++) {
			float q = current_low[i] - Z_SILENT*((current_high[i] - current_low[i]) / (Z_HIGH_POWER - Z_SILENT));
    ba26:	20 e0       	ldi	r18, 0x00	; 0
    ba28:	30 e0       	ldi	r19, 0x00	; 0
    ba2a:	a9 01       	movw	r20, r18
    ba2c:	c5 01       	movw	r24, r10
    ba2e:	b4 01       	movw	r22, r8
    ba30:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    ba34:	9b 01       	movw	r18, r22
    ba36:	ac 01       	movw	r20, r24
    ba38:	c7 01       	movw	r24, r14
    ba3a:	b6 01       	movw	r22, r12
    ba3c:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    ba40:	9b 01       	movw	r18, r22
    ba42:	ac 01       	movw	r20, r24
			tmp_motor[i] = ((current_high[i] - current_low[i]) / (Z_HIGH_POWER - Z_SILENT))*destination[Z_AXIS] + q;
    ba44:	c3 01       	movw	r24, r6
    ba46:	b2 01       	movw	r22, r4
    ba48:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
			st_current_set(i, tmp_motor[i]);
    ba4c:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
    ba50:	8b 8d       	ldd	r24, Y+27	; 0x1b
    ba52:	0f 94 5e 1a 	call	0x234bc	; 0x234bc <st_current_set(unsigned char, int)>
			SERIAL_ECHOPGM(": ");
			MYSERIAL.println(current_high[i]);*/
		}
	}
	else {
		for (uint8_t i = 0; i < 3; i++) {
    ba56:	fb 8d       	ldd	r31, Y+27	; 0x1b
    ba58:	ff 5f       	subi	r31, 0xFF	; 255
    ba5a:	fb 8f       	std	Y+27, r31	; 0x1b
    ba5c:	f3 30       	cpi	r31, 0x03	; 3
    ba5e:	09 f0       	breq	.+2      	; 0xba62 <get_coordinates()+0x30a>
    ba60:	ba cf       	rjmp	.-140    	; 0xb9d6 <get_coordinates()+0x27e>
    ba62:	53 cf       	rjmp	.-346    	; 0xb90a <get_coordinates()+0x1b2>
        destination[i] += current_position[i];
#if MOTHERBOARD == BOARD_RAMBO_MINI_1_0 || MOTHERBOARD == BOARD_RAMBO_MINI_1_3
	  if (i == Z_AXIS && SilentModeMenu == SILENT_MODE_AUTO) update_currents();
#endif //MOTHERBOARD == BOARD_RAMBO_MINI_1_0 || MOTHERBOARD == BOARD_RAMBO_MINI_1_3
    }
    else destination[i] = current_position[i]; //Are these else lines really needed?
    ba64:	f1 01       	movw	r30, r2
    ba66:	80 81       	ld	r24, Z
    ba68:	91 81       	ldd	r25, Z+1	; 0x01
    ba6a:	a2 81       	ldd	r26, Z+2	; 0x02
    ba6c:	b3 81       	ldd	r27, Z+3	; 0x03
    ba6e:	f8 01       	movw	r30, r16
    ba70:	80 83       	st	Z, r24
    ba72:	91 83       	std	Z+1, r25	; 0x01
    ba74:	a2 83       	std	Z+2, r26	; 0x02
    ba76:	b3 83       	std	Z+3, r27	; 0x03
    ba78:	48 cf       	rjmp	.-368    	; 0xb90a <get_coordinates()+0x1b2>
	}
}
#endif //MOTHERBOARD == BOARD_RAMBO_MINI_1_0 || MOTHERBOARD == BOARD_RAMBO_MINI_1_3

void get_coordinates() {
  for (uint8_t i = X_AXIS, mask = X_AXIS_MASK; i < NUM_AXIS; i++, mask <<= 1) {
    ba7a:	ea 8d       	ldd	r30, Y+26	; 0x1a
    ba7c:	ee 0f       	add	r30, r30
    ba7e:	ea 8f       	std	Y+26, r30	; 0x1a
    ba80:	f4 e0       	ldi	r31, 0x04	; 4
    ba82:	2f 0e       	add	r2, r31
    ba84:	31 1c       	adc	r3, r1
    ba86:	0c 5f       	subi	r16, 0xFC	; 252
    ba88:	1f 4f       	sbci	r17, 0xFF	; 255
    ba8a:	83 e0       	ldi	r24, 0x03	; 3
    ba8c:	89 8f       	std	Y+25, r24	; 0x19
    ba8e:	8b ce       	rjmp	.-746    	; 0xb7a6 <get_coordinates()+0x4e>

0000ba90 <print_hex_nibble(unsigned char)>:

#define DBG(args...) printf_P(args)

inline void print_hex_nibble(uint8_t val)
{
	putchar((val > 9)?(val - 10 + 'a'):(val + '0'));
    ba90:	60 91 13 17 	lds	r22, 0x1713	; 0x801713 <__iob+0x2>
    ba94:	70 91 14 17 	lds	r23, 0x1714	; 0x801714 <__iob+0x3>
    ba98:	90 e0       	ldi	r25, 0x00	; 0
    ba9a:	8a 30       	cpi	r24, 0x0A	; 10
    ba9c:	20 f0       	brcs	.+8      	; 0xbaa6 <print_hex_nibble(unsigned char)+0x16>
    ba9e:	89 5a       	subi	r24, 0xA9	; 169
    baa0:	9f 4f       	sbci	r25, 0xFF	; 255
    baa2:	0d 94 48 a2 	jmp	0x34490	; 0x34490 <fputc>
    baa6:	c0 96       	adiw	r24, 0x30	; 48
    baa8:	fc cf       	rjmp	.-8      	; 0xbaa2 <print_hex_nibble(unsigned char)+0x12>

0000baaa <lcd_writebits(unsigned char)>:
	WRITE(LCD_PINS_D0, value & 0x01);
	WRITE(LCD_PINS_D1, value & 0x02);
	WRITE(LCD_PINS_D2, value & 0x04);
	WRITE(LCD_PINS_D3, value & 0x08);
#endif
	WRITE(LCD_PINS_D4, value & 0x10);
    baaa:	84 ff       	sbrs	r24, 4
    baac:	18 c0       	rjmp	.+48     	; 0xbade <lcd_writebits(unsigned char)+0x34>
    baae:	5a 9a       	sbi	0x0b, 2	; 11
	WRITE(LCD_PINS_D5, value & 0x20);
    bab0:	85 ff       	sbrs	r24, 5
    bab2:	17 c0       	rjmp	.+46     	; 0xbae2 <lcd_writebits(unsigned char)+0x38>
    bab4:	a4 9a       	sbi	0x14, 4	; 20
	WRITE(LCD_PINS_D6, value & 0x40);
    bab6:	2f b7       	in	r18, 0x3f	; 63
    bab8:	86 ff       	sbrs	r24, 6
    baba:	15 c0       	rjmp	.+42     	; 0xbae6 <lcd_writebits(unsigned char)+0x3c>
    babc:	f8 94       	cli
    babe:	90 91 02 01 	lds	r25, 0x0102	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
    bac2:	90 68       	ori	r25, 0x80	; 128
    bac4:	90 93 02 01 	sts	0x0102, r25	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
    bac8:	2f bf       	out	0x3f, r18	; 63
	WRITE(LCD_PINS_D7, value & 0x80);
    baca:	87 ff       	sbrs	r24, 7
    bacc:	11 c0       	rjmp	.+34     	; 0xbaf0 <lcd_writebits(unsigned char)+0x46>
    bace:	a3 9a       	sbi	0x14, 3	; 20
static void lcd_print_custom(uint8_t c);
static void lcd_invalidate_custom_characters();

static void lcd_pulseEnable(void)
{
	WRITE(LCD_PINS_ENABLE,HIGH);
    bad0:	5b 9a       	sbi	0x0b, 3	; 11
	#else
		//round up by default
		__ticks_dc = (uint32_t)(ceil(fabs(__tmp)));
	#endif

	__builtin_avr_delay_cycles(__ticks_dc);
    bad2:	85 e0       	ldi	r24, 0x05	; 5
    bad4:	8a 95       	dec	r24
    bad6:	f1 f7       	brne	.-4      	; 0xbad4 <lcd_writebits(unsigned char)+0x2a>
    bad8:	00 00       	nop
	_delay_us(1);    // enable pulse must be >450ns
	WRITE(LCD_PINS_ENABLE,LOW);
    bada:	5b 98       	cbi	0x0b, 3	; 11
	WRITE(LCD_PINS_D5, value & 0x20);
	WRITE(LCD_PINS_D6, value & 0x40);
	WRITE(LCD_PINS_D7, value & 0x80);

	lcd_pulseEnable();
}
    badc:	08 95       	ret
	WRITE(LCD_PINS_D0, value & 0x01);
	WRITE(LCD_PINS_D1, value & 0x02);
	WRITE(LCD_PINS_D2, value & 0x04);
	WRITE(LCD_PINS_D3, value & 0x08);
#endif
	WRITE(LCD_PINS_D4, value & 0x10);
    bade:	5a 98       	cbi	0x0b, 2	; 11
    bae0:	e7 cf       	rjmp	.-50     	; 0xbab0 <lcd_writebits(unsigned char)+0x6>
	WRITE(LCD_PINS_D5, value & 0x20);
    bae2:	a4 98       	cbi	0x14, 4	; 20
    bae4:	e8 cf       	rjmp	.-48     	; 0xbab6 <lcd_writebits(unsigned char)+0xc>
	WRITE(LCD_PINS_D6, value & 0x40);
    bae6:	f8 94       	cli
    bae8:	90 91 02 01 	lds	r25, 0x0102	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
    baec:	9f 77       	andi	r25, 0x7F	; 127
    baee:	ea cf       	rjmp	.-44     	; 0xbac4 <lcd_writebits(unsigned char)+0x1a>
	WRITE(LCD_PINS_D7, value & 0x80);
    baf0:	a3 98       	cbi	0x14, 3	; 20
    baf2:	ee cf       	rjmp	.-36     	; 0xbad0 <lcd_writebits(unsigned char)+0x26>

0000baf4 <lcd_send(unsigned char, unsigned char, unsigned int)>:

	lcd_pulseEnable();
}

static void lcd_send(uint8_t data, uint8_t flags, uint16_t duration = LCD_DEFAULT_DELAY)
{
    baf4:	0f 93       	push	r16
    baf6:	1f 93       	push	r17
    baf8:	cf 93       	push	r28
    bafa:	df 93       	push	r29
    bafc:	c8 2f       	mov	r28, r24
    bafe:	d6 2f       	mov	r29, r22
    bb00:	8a 01       	movw	r16, r20
	WRITE(LCD_PINS_RS,flags&LCD_RS_FLAG);
    bb02:	60 ff       	sbrs	r22, 0
    bb04:	15 c0       	rjmp	.+42     	; 0xbb30 <lcd_send(unsigned char, unsigned char, unsigned int)+0x3c>
    bb06:	5d 9a       	sbi	0x0b, 5	; 11
    bb08:	8a e1       	ldi	r24, 0x1A	; 26
    bb0a:	8a 95       	dec	r24
    bb0c:	f1 f7       	brne	.-4      	; 0xbb0a <lcd_send(unsigned char, unsigned char, unsigned int)+0x16>
    bb0e:	00 c0       	rjmp	.+0      	; 0xbb10 <lcd_send(unsigned char, unsigned char, unsigned int)+0x1c>
	_delay_us(5);
	lcd_writebits(data);
    bb10:	8c 2f       	mov	r24, r28
    bb12:	0e 94 55 5d 	call	0xbaaa	; 0xbaaa <lcd_writebits(unsigned char)>
#ifndef LCD_8BIT
	if (!(flags & LCD_HALF_FLAG)) {
    bb16:	d1 fd       	sbrc	r29, 1
    bb18:	04 c0       	rjmp	.+8      	; 0xbb22 <lcd_send(unsigned char, unsigned char, unsigned int)+0x2e>
		// _delay_us(LCD_DEFAULT_DELAY); // should not be needed when sending a two nibble instruction.
		lcd_writebits((data << 4) | (data >> 4)); //force efficient swap opcode even though the lower nibble is ignored in this case
    bb1a:	8c 2f       	mov	r24, r28
    bb1c:	82 95       	swap	r24
    bb1e:	0e 94 55 5d 	call	0xbaaa	; 0xbaaa <lcd_writebits(unsigned char)>
	}
#endif
	delayMicroseconds(duration);
    bb22:	c8 01       	movw	r24, r16
}
    bb24:	df 91       	pop	r29
    bb26:	cf 91       	pop	r28
    bb28:	1f 91       	pop	r17
    bb2a:	0f 91       	pop	r16
	if (!(flags & LCD_HALF_FLAG)) {
		// _delay_us(LCD_DEFAULT_DELAY); // should not be needed when sending a two nibble instruction.
		lcd_writebits((data << 4) | (data >> 4)); //force efficient swap opcode even though the lower nibble is ignored in this case
	}
#endif
	delayMicroseconds(duration);
    bb2c:	0c 94 db d2 	jmp	0x1a5b6	; 0x1a5b6 <delayMicroseconds>
	lcd_pulseEnable();
}

static void lcd_send(uint8_t data, uint8_t flags, uint16_t duration = LCD_DEFAULT_DELAY)
{
	WRITE(LCD_PINS_RS,flags&LCD_RS_FLAG);
    bb30:	5d 98       	cbi	0x0b, 5	; 11
    bb32:	ea cf       	rjmp	.-44     	; 0xbb08 <lcd_send(unsigned char, unsigned char, unsigned int)+0x14>

0000bb34 <eeprom_init_default_float(float*, float)>:
        return def;
    }
    return val;
}

void __attribute__((noinline)) eeprom_init_default_float(float *__p, float def) {
    bb34:	cf 92       	push	r12
    bb36:	df 92       	push	r13
    bb38:	ef 92       	push	r14
    bb3a:	ff 92       	push	r15
    bb3c:	cf 93       	push	r28
    bb3e:	df 93       	push	r29
    bb40:	ec 01       	movw	r28, r24
    bb42:	6a 01       	movw	r12, r20
    bb44:	7b 01       	movw	r14, r22
    if (eeprom_read_dword((uint32_t*)__p) == EEPROM_EMPTY_VALUE32)
    bb46:	0f 94 e8 a3 	call	0x347d0	; 0x347d0 <eeprom_read_dword>
    bb4a:	6f 3f       	cpi	r22, 0xFF	; 255
    bb4c:	7f 4f       	sbci	r23, 0xFF	; 255
    bb4e:	8f 4f       	sbci	r24, 0xFF	; 255
    bb50:	9f 4f       	sbci	r25, 0xFF	; 255
    bb52:	59 f4       	brne	.+22     	; 0xbb6a <eeprom_init_default_float(float*, float)+0x36>
    if (active) {
        float previous_value = eeprom_read_float(dst);
        eeprom_float_notify(dst, previous_value, value, true);
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_write_float(dst, value);
    bb54:	b7 01       	movw	r22, r14
    bb56:	a6 01       	movw	r20, r12
    bb58:	ce 01       	movw	r24, r28
}

void __attribute__((noinline)) eeprom_init_default_float(float *__p, float def) {
    if (eeprom_read_dword((uint32_t*)__p) == EEPROM_EMPTY_VALUE32)
        eeprom_write_float_notify(__p, def);
}
    bb5a:	df 91       	pop	r29
    bb5c:	cf 91       	pop	r28
    bb5e:	ff 90       	pop	r15
    bb60:	ef 90       	pop	r14
    bb62:	df 90       	pop	r13
    bb64:	cf 90       	pop	r12
    if (active) {
        float previous_value = eeprom_read_float(dst);
        eeprom_float_notify(dst, previous_value, value, true);
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_write_float(dst, value);
    bb66:	0d 94 36 a4 	jmp	0x3486c	; 0x3486c <eeprom_write_dword>
}

void __attribute__((noinline)) eeprom_init_default_float(float *__p, float def) {
    if (eeprom_read_dword((uint32_t*)__p) == EEPROM_EMPTY_VALUE32)
        eeprom_write_float_notify(__p, def);
}
    bb6a:	df 91       	pop	r29
    bb6c:	cf 91       	pop	r28
    bb6e:	ff 90       	pop	r15
    bb70:	ef 90       	pop	r14
    bb72:	df 90       	pop	r13
    bb74:	cf 90       	pop	r12
    bb76:	08 95       	ret

0000bb78 <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)>:
    }
}

void dcode_core(daddr_t addr_start, const daddr_t addr_end, const dcode_mem_t type,
                uint8_t dcode, const char* type_desc)
{
    bb78:	7f 92       	push	r7
    bb7a:	8f 92       	push	r8
    bb7c:	9f 92       	push	r9
    bb7e:	af 92       	push	r10
    bb80:	bf 92       	push	r11
    bb82:	cf 92       	push	r12
    bb84:	df 92       	push	r13
    bb86:	ef 92       	push	r14
    bb88:	ff 92       	push	r15
    bb8a:	0f 93       	push	r16
    bb8c:	1f 93       	push	r17
    bb8e:	cf 93       	push	r28
    bb90:	df 93       	push	r29
    bb92:	cd b7       	in	r28, 0x3d	; 61
    bb94:	de b7       	in	r29, 0x3e	; 62
    bb96:	60 97       	sbiw	r28, 0x10	; 16
    bb98:	0f b6       	in	r0, 0x3f	; 63
    bb9a:	f8 94       	cli
    bb9c:	de bf       	out	0x3e, r29	; 62
    bb9e:	0f be       	out	0x3f, r0	; 63
    bba0:	cd bf       	out	0x3d, r28	; 61
    bba2:	5c 01       	movw	r10, r24
    bba4:	6b 01       	movw	r12, r22
    bba6:	74 2e       	mov	r7, r20
    KEEPALIVE_STATE(NOT_BUSY);
    bba8:	81 e0       	ldi	r24, 0x01	; 1
    bbaa:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
    DBG(_N("D%d - Read/Write %S\n"), dcode, type_desc);
    bbae:	1f 93       	push	r17
    bbb0:	0f 93       	push	r16
    bbb2:	1f 92       	push	r1
    bbb4:	2f 93       	push	r18
    bbb6:	8d e8       	ldi	r24, 0x8D	; 141
    bbb8:	93 e6       	ldi	r25, 0x63	; 99
    bbba:	9f 93       	push	r25
    bbbc:	8f 93       	push	r24
    bbbe:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
    daddr_t count = -1; // RW the entire space by default
    if (code_seen('A'))
    bbc2:	81 e4       	ldi	r24, 0x41	; 65
    bbc4:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
    bbc8:	0f 90       	pop	r0
    bbca:	0f 90       	pop	r0
    bbcc:	0f 90       	pop	r0
    bbce:	0f 90       	pop	r0
    bbd0:	0f 90       	pop	r0
    bbd2:	0f 90       	pop	r0
    bbd4:	88 23       	and	r24, r24
    bbd6:	89 f0       	breq	.+34     	; 0xbbfa <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)+0x82>
        addr_start = (strchr_pointer[1] == 'x')?strtol(strchr_pointer + 2, 0, 16):(int)code_value();
    bbd8:	80 91 bb 04 	lds	r24, 0x04BB	; 0x8004bb <strchr_pointer>
    bbdc:	90 91 bc 04 	lds	r25, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
    bbe0:	fc 01       	movw	r30, r24
    bbe2:	21 81       	ldd	r18, Z+1	; 0x01
    bbe4:	28 37       	cpi	r18, 0x78	; 120
    bbe6:	09 f0       	breq	.+2      	; 0xbbea <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)+0x72>
    bbe8:	56 c0       	rjmp	.+172    	; 0xbc96 <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)+0x11e>
    bbea:	40 e1       	ldi	r20, 0x10	; 16
    bbec:	50 e0       	ldi	r21, 0x00	; 0
    bbee:	70 e0       	ldi	r23, 0x00	; 0
    bbf0:	60 e0       	ldi	r22, 0x00	; 0
    bbf2:	02 96       	adiw	r24, 0x02	; 2
    bbf4:	0f 94 6b 9f 	call	0x33ed6	; 0x33ed6 <strtol>
    bbf8:	5b 01       	movw	r10, r22
    if (code_seen('C'))
    bbfa:	83 e4       	ldi	r24, 0x43	; 67
    bbfc:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
    bc00:	88 23       	and	r24, r24
    bc02:	09 f4       	brne	.+2      	; 0xbc06 <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)+0x8e>
    bc04:	4d c0       	rjmp	.+154    	; 0xbca0 <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)+0x128>
        count = code_value_long();
    bc06:	0e 94 5d 56 	call	0xacba	; 0xacba <code_value_long() [clone .lto_priv.507]>
    bc0a:	4b 01       	movw	r8, r22
    bc0c:	75 01       	movw	r14, r10
    bc0e:	ca 14       	cp	r12, r10
    bc10:	db 04       	cpc	r13, r11
    bc12:	08 f4       	brcc	.+2      	; 0xbc16 <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)+0x9e>
    bc14:	76 01       	movw	r14, r12
    if (addr_start > addr_end)
        addr_start = addr_end;
    if ((addr_start + count) > addr_end || (addr_start + count) < addr_start)
    bc16:	c4 01       	movw	r24, r8
    bc18:	8e 0d       	add	r24, r14
    bc1a:	9f 1d       	adc	r25, r15
    bc1c:	c8 16       	cp	r12, r24
    bc1e:	d9 06       	cpc	r13, r25
    bc20:	18 f0       	brcs	.+6      	; 0xbc28 <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)+0xb0>
    bc22:	8e 15       	cp	r24, r14
    bc24:	9f 05       	cpc	r25, r15
    bc26:	18 f4       	brcc	.+6      	; 0xbc2e <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)+0xb6>
        count = addr_end - addr_start;
    bc28:	46 01       	movw	r8, r12
    bc2a:	8e 18       	sub	r8, r14
    bc2c:	9f 08       	sbc	r9, r15
    if (code_seen('X'))
    bc2e:	88 e5       	ldi	r24, 0x58	; 88
    bc30:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
    bc34:	88 23       	and	r24, r24
    bc36:	09 f4       	brne	.+2      	; 0xbc3a <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)+0xc2>
    bc38:	71 c0       	rjmp	.+226    	; 0xbd1c <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)+0x1a4>
    {
        uint8_t data[16];
        count = parse_hex(strchr_pointer + 1, data, 16);
    bc3a:	20 91 bb 04 	lds	r18, 0x04BB	; 0x8004bb <strchr_pointer>
    bc3e:	30 91 bc 04 	lds	r19, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
    bc42:	2f 5f       	subi	r18, 0xFF	; 255
    bc44:	3f 4f       	sbci	r19, 0xFF	; 255
    bc46:	ce 01       	movw	r24, r28
    bc48:	01 96       	adiw	r24, 0x01	; 1
    bc4a:	5c 01       	movw	r10, r24
    bc4c:	dc 01       	movw	r26, r24
    print_hex_byte(val & 0xFF);
}

int parse_hex(const char* hex, uint8_t* data, int count)
{
	int parsed = 0;
    bc4e:	d1 2c       	mov	r13, r1
    bc50:	c1 2c       	mov	r12, r1
    bc52:	f9 01       	movw	r30, r18
	while (*hex)
    bc54:	80 81       	ld	r24, Z
    bc56:	2f 5f       	subi	r18, 0xFF	; 255
    bc58:	3f 4f       	sbci	r19, 0xFF	; 255
    bc5a:	88 23       	and	r24, r24
    bc5c:	b9 f1       	breq	.+110    	; 0xbccc <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)+0x154>
	{
		if (count && (parsed >= count)) break;
    bc5e:	90 e1       	ldi	r25, 0x10	; 16
    bc60:	c9 16       	cp	r12, r25
    bc62:	d1 04       	cpc	r13, r1
    bc64:	99 f1       	breq	.+102    	; 0xbccc <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)+0x154>
		char c = *(hex++);
		if (c == ' ') continue;
    bc66:	80 32       	cpi	r24, 0x20	; 32
    bc68:	a1 f3       	breq	.-24     	; 0xbc52 <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)+0xda>
		if (c == '\n') break;
    bc6a:	8a 30       	cpi	r24, 0x0A	; 10
    bc6c:	79 f1       	breq	.+94     	; 0xbccc <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)+0x154>
		uint8_t val = 0x00;
		if ((c >= '0') && (c <= '9')) val |= ((c - '0') << 4);
    bc6e:	90 ed       	ldi	r25, 0xD0	; 208
    bc70:	98 0f       	add	r25, r24
    bc72:	9a 30       	cpi	r25, 0x0A	; 10
    bc74:	c8 f4       	brcc	.+50     	; 0xbca8 <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)+0x130>
    bc76:	82 95       	swap	r24
    bc78:	80 7f       	andi	r24, 0xF0	; 240
		else if ((c >= 'a') && (c <= 'f')) val |= ((c - 'a' + 10) << 4);
		else return -parsed;
		c = *(hex++);
    bc7a:	9f 01       	movw	r18, r30
    bc7c:	2e 5f       	subi	r18, 0xFE	; 254
    bc7e:	3f 4f       	sbci	r19, 0xFF	; 255
		if ((c >= '0') && (c <= '9')) val |= (c - '0');
    bc80:	91 81       	ldd	r25, Z+1	; 0x01
    bc82:	40 ed       	ldi	r20, 0xD0	; 208
    bc84:	49 0f       	add	r20, r25
    bc86:	4a 30       	cpi	r20, 0x0A	; 10
    bc88:	b8 f4       	brcc	.+46     	; 0xbcb8 <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)+0x140>
    bc8a:	84 2b       	or	r24, r20
		else if ((c >= 'a') && (c <= 'f')) val |= (c - 'a' + 10);
		else return -parsed;
		data[parsed] = val;
    bc8c:	8d 93       	st	X+, r24
		parsed++;
    bc8e:	ef ef       	ldi	r30, 0xFF	; 255
    bc90:	ce 1a       	sub	r12, r30
    bc92:	de 0a       	sbc	r13, r30
    bc94:	de cf       	rjmp	.-68     	; 0xbc52 <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)+0xda>
{
    KEEPALIVE_STATE(NOT_BUSY);
    DBG(_N("D%d - Read/Write %S\n"), dcode, type_desc);
    daddr_t count = -1; // RW the entire space by default
    if (code_seen('A'))
        addr_start = (strchr_pointer[1] == 'x')?strtol(strchr_pointer + 2, 0, 16):(int)code_value();
    bc96:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
    bc9a:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
    bc9e:	ac cf       	rjmp	.-168    	; 0xbbf8 <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)+0x80>
void dcode_core(daddr_t addr_start, const daddr_t addr_end, const dcode_mem_t type,
                uint8_t dcode, const char* type_desc)
{
    KEEPALIVE_STATE(NOT_BUSY);
    DBG(_N("D%d - Read/Write %S\n"), dcode, type_desc);
    daddr_t count = -1; // RW the entire space by default
    bca0:	88 24       	eor	r8, r8
    bca2:	8a 94       	dec	r8
    bca4:	98 2c       	mov	r9, r8
    bca6:	b2 cf       	rjmp	.-156    	; 0xbc0c <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)+0x94>
		char c = *(hex++);
		if (c == ' ') continue;
		if (c == '\n') break;
		uint8_t val = 0x00;
		if ((c >= '0') && (c <= '9')) val |= ((c - '0') << 4);
		else if ((c >= 'a') && (c <= 'f')) val |= ((c - 'a' + 10) << 4);
    bca8:	9f e9       	ldi	r25, 0x9F	; 159
    bcaa:	98 0f       	add	r25, r24
    bcac:	96 30       	cpi	r25, 0x06	; 6
    bcae:	58 f4       	brcc	.+22     	; 0xbcc6 <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)+0x14e>
    bcb0:	82 95       	swap	r24
    bcb2:	80 7f       	andi	r24, 0xF0	; 240
    bcb4:	80 57       	subi	r24, 0x70	; 112
    bcb6:	e1 cf       	rjmp	.-62     	; 0xbc7a <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)+0x102>
		else return -parsed;
		c = *(hex++);
		if ((c >= '0') && (c <= '9')) val |= (c - '0');
		else if ((c >= 'a') && (c <= 'f')) val |= (c - 'a' + 10);
    bcb8:	4f e9       	ldi	r20, 0x9F	; 159
    bcba:	49 0f       	add	r20, r25
    bcbc:	46 30       	cpi	r20, 0x06	; 6
    bcbe:	18 f4       	brcc	.+6      	; 0xbcc6 <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)+0x14e>
    bcc0:	97 55       	subi	r25, 0x57	; 87
    bcc2:	89 2b       	or	r24, r25
    bcc4:	e3 cf       	rjmp	.-58     	; 0xbc8c <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)+0x114>
		else return -parsed;
    bcc6:	d1 94       	neg	r13
    bcc8:	c1 94       	neg	r12
    bcca:	d1 08       	sbc	r13, r1
}

// TODO: this only handles SRAM/EEPROM 16bit addresses
void write_mem(uint16_t address, uint16_t count, const uint8_t* data, const dcode_mem_t type)
{
    for (uint16_t i = 0; i < count; i++)
    bccc:	91 2c       	mov	r9, r1
    bcce:	81 2c       	mov	r8, r1
    bcd0:	c8 14       	cp	r12, r8
    bcd2:	d9 04       	cpc	r13, r9
    bcd4:	91 f0       	breq	.+36     	; 0xbcfa <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)+0x182>
    bcd6:	f5 01       	movw	r30, r10
    bcd8:	61 91       	ld	r22, Z+
    bcda:	5f 01       	movw	r10, r30
    bcdc:	c4 01       	movw	r24, r8
    bcde:	8e 0d       	add	r24, r14
    bce0:	9f 1d       	adc	r25, r15
    {
        switch (type)
    bce2:	f1 e0       	ldi	r31, 0x01	; 1
    bce4:	7f 16       	cp	r7, r31
    bce6:	31 f0       	breq	.+12     	; 0xbcf4 <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)+0x17c>
        {
        case dcode_mem_t::sram: *((uint8_t*)address) = data[i]; break;
    bce8:	fc 01       	movw	r30, r24
    bcea:	60 83       	st	Z, r22
}

// TODO: this only handles SRAM/EEPROM 16bit addresses
void write_mem(uint16_t address, uint16_t count, const uint8_t* data, const dcode_mem_t type)
{
    for (uint16_t i = 0; i < count; i++)
    bcec:	ff ef       	ldi	r31, 0xFF	; 255
    bcee:	8f 1a       	sub	r8, r31
    bcf0:	9f 0a       	sbc	r9, r31
    bcf2:	ee cf       	rjmp	.-36     	; 0xbcd0 <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)+0x158>
    if (active) {
        uint8_t previous_value = eeprom_read_byte(dst);
        eeprom_byte_notify(dst, previous_value, value, true);
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_write_byte(dst, value);
    bcf4:	0f 94 28 a4 	call	0x34850	; 0x34850 <eeprom_write_byte>
    bcf8:	f9 cf       	rjmp	.-14     	; 0xbcec <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)+0x174>
        count = parse_hex(strchr_pointer + 1, data, 16);
        write_mem(addr_start, count, data, type);
#if DADDR_SIZE > 16
        DBG(_N("%lu bytes written to %S at address 0x%04lx\n"), count, type_desc, addr_start);
#else
        DBG(_N("%u bytes written to %S at address 0x%08x\n"), count, type_desc, addr_start);
    bcfa:	ff 92       	push	r15
    bcfc:	ef 92       	push	r14
    bcfe:	1f 93       	push	r17
    bd00:	0f 93       	push	r16
    bd02:	9f 92       	push	r9
    bd04:	8f 92       	push	r8
    bd06:	83 e6       	ldi	r24, 0x63	; 99
    bd08:	93 e6       	ldi	r25, 0x63	; 99
    bd0a:	9f 93       	push	r25
    bd0c:	8f 93       	push	r24
    bd0e:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
    bd12:	0f b6       	in	r0, 0x3f	; 63
    bd14:	f8 94       	cli
    bd16:	de bf       	out	0x3e, r29	; 62
    bd18:	0f be       	out	0x3f, r0	; 63
    bd1a:	cd bf       	out	0x3d, r28	; 61
#endif
    }
    print_mem(addr_start, count, type);
    bd1c:	47 2d       	mov	r20, r7
    bd1e:	b4 01       	movw	r22, r8
    bd20:	c7 01       	movw	r24, r14
}
    bd22:	60 96       	adiw	r28, 0x10	; 16
    bd24:	0f b6       	in	r0, 0x3f	; 63
    bd26:	f8 94       	cli
    bd28:	de bf       	out	0x3e, r29	; 62
    bd2a:	0f be       	out	0x3f, r0	; 63
    bd2c:	cd bf       	out	0x3d, r28	; 61
    bd2e:	df 91       	pop	r29
    bd30:	cf 91       	pop	r28
    bd32:	1f 91       	pop	r17
    bd34:	0f 91       	pop	r16
    bd36:	ff 90       	pop	r15
    bd38:	ef 90       	pop	r14
    bd3a:	df 90       	pop	r13
    bd3c:	cf 90       	pop	r12
    bd3e:	bf 90       	pop	r11
    bd40:	af 90       	pop	r10
    bd42:	9f 90       	pop	r9
    bd44:	8f 90       	pop	r8
    bd46:	7f 90       	pop	r7
        DBG(_N("%lu bytes written to %S at address 0x%04lx\n"), count, type_desc, addr_start);
#else
        DBG(_N("%u bytes written to %S at address 0x%08x\n"), count, type_desc, addr_start);
#endif
    }
    print_mem(addr_start, count, type);
    bd48:	0d 94 d2 78 	jmp	0x2f1a4	; 0x2f1a4 <print_mem(unsigned int, unsigned int, dcode_mem_t, unsigned char) [clone .constprop.143]>

0000bd4c <shift_z(float) [clone .lto_priv.488]>:
#endif //NEW_XYZCAL

// Shift a Z axis by a given delta.
// To replace loading of the babystep correction.
static void shift_z(float delta)
{
    bd4c:	0f 93       	push	r16
    bd4e:	1f 93       	push	r17
    bd50:	cf 93       	push	r28
    bd52:	df 93       	push	r29
    bd54:	00 d0       	rcall	.+0      	; 0xbd56 <shift_z(float) [clone .lto_priv.488]+0xa>
    bd56:	1f 92       	push	r1
    bd58:	cd b7       	in	r28, 0x3d	; 61
    bd5a:	de b7       	in	r29, 0x3e	; 62
    bd5c:	9b 01       	movw	r18, r22
    bd5e:	ac 01       	movw	r20, r24
    const float curpos_z = current_position[Z_AXIS];
    bd60:	01 e6       	ldi	r16, 0x61	; 97
    bd62:	12 e1       	ldi	r17, 0x12	; 18
    bd64:	f8 01       	movw	r30, r16
    bd66:	60 85       	ldd	r22, Z+8	; 0x08
    bd68:	71 85       	ldd	r23, Z+9	; 0x09
    bd6a:	82 85       	ldd	r24, Z+10	; 0x0a
    bd6c:	93 85       	ldd	r25, Z+11	; 0x0b
    bd6e:	69 83       	std	Y+1, r22	; 0x01
    bd70:	7a 83       	std	Y+2, r23	; 0x02
    bd72:	8b 83       	std	Y+3, r24	; 0x03
    bd74:	9c 83       	std	Y+4, r25	; 0x04
    current_position[Z_AXIS] -= delta;
    bd76:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    bd7a:	f8 01       	movw	r30, r16
    bd7c:	60 87       	std	Z+8, r22	; 0x08
    bd7e:	71 87       	std	Z+9, r23	; 0x09
    bd80:	82 87       	std	Z+10, r24	; 0x0a
    bd82:	93 87       	std	Z+11, r25	; 0x0b
    plan_buffer_line_curposXYZE(homing_feedrate[Z_AXIS] / 60);
    bd84:	65 e5       	ldi	r22, 0x55	; 85
    bd86:	75 e5       	ldi	r23, 0x55	; 85
    bd88:	85 e5       	ldi	r24, 0x55	; 85
    bd8a:	91 e4       	ldi	r25, 0x41	; 65
    bd8c:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
    st_synchronize();
    bd90:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
    current_position[Z_AXIS] = curpos_z;
    bd94:	89 81       	ldd	r24, Y+1	; 0x01
    bd96:	9a 81       	ldd	r25, Y+2	; 0x02
    bd98:	ab 81       	ldd	r26, Y+3	; 0x03
    bd9a:	bc 81       	ldd	r27, Y+4	; 0x04
    bd9c:	f8 01       	movw	r30, r16
    bd9e:	80 87       	std	Z+8, r24	; 0x08
    bda0:	91 87       	std	Z+9, r25	; 0x09
    bda2:	a2 87       	std	Z+10, r26	; 0x0a
    bda4:	b3 87       	std	Z+11, r27	; 0x0b
    plan_set_z_position(curpos_z);
    bda6:	ce 01       	movw	r24, r28
    bda8:	01 96       	adiw	r24, 0x01	; 1
    bdaa:	0f 94 0c 3d 	call	0x27a18	; 0x27a18 <plan_set_z_position(float const&)>
}
    bdae:	0f 90       	pop	r0
    bdb0:	0f 90       	pop	r0
    bdb2:	0f 90       	pop	r0
    bdb4:	0f 90       	pop	r0
    bdb6:	df 91       	pop	r29
    bdb8:	cf 91       	pop	r28
    bdba:	1f 91       	pop	r17
    bdbc:	0f 91       	pop	r16
    bdbe:	08 95       	ret

0000bdc0 <BED_X(unsigned char)>:

#define MESH_BED_CALIBRATION_SHOW_LCD

float __attribute__((noinline)) BED_X(const uint8_t col)
{
    return ((float)col * x_mesh_density + BED_X0);
    bdc0:	68 2f       	mov	r22, r24
    bdc2:	70 e0       	ldi	r23, 0x00	; 0
    bdc4:	90 e0       	ldi	r25, 0x00	; 0
    bdc6:	80 e0       	ldi	r24, 0x00	; 0
    bdc8:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
    bdcc:	20 e0       	ldi	r18, 0x00	; 0
    bdce:	30 e0       	ldi	r19, 0x00	; 0
    bdd0:	48 e0       	ldi	r20, 0x08	; 8
    bdd2:	52 e4       	ldi	r21, 0x42	; 66
    bdd4:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    bdd8:	20 e0       	ldi	r18, 0x00	; 0
    bdda:	30 e0       	ldi	r19, 0x00	; 0
    bddc:	40 e8       	ldi	r20, 0x80	; 128
    bdde:	5f e3       	ldi	r21, 0x3F	; 63
    bde0:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
}
    bde4:	08 95       	ret

0000bde6 <update_current_position_z() [clone .lto_priv.378]>:
      plan_set_position_curposXYZE();
}

static inline void update_current_position_z()
{
      current_position[Z_AXIS] = st_get_position_mm(Z_AXIS);
    bde6:	82 e0       	ldi	r24, 0x02	; 2
    bde8:	0f 94 e7 1a 	call	0x235ce	; 0x235ce <st_get_position_mm(unsigned char)>
    bdec:	60 93 69 12 	sts	0x1269, r22	; 0x801269 <current_position+0x8>
    bdf0:	70 93 6a 12 	sts	0x126A, r23	; 0x80126a <current_position+0x9>
    bdf4:	80 93 6b 12 	sts	0x126B, r24	; 0x80126b <current_position+0xa>
    bdf8:	90 93 6c 12 	sts	0x126C, r25	; 0x80126c <current_position+0xb>
      plan_set_z_position(current_position[Z_AXIS]);
    bdfc:	89 e6       	ldi	r24, 0x69	; 105
    bdfe:	92 e1       	ldi	r25, 0x12	; 18
    be00:	0d 94 0c 3d 	jmp	0x27a18	; 0x27a18 <plan_set_z_position(float const&)>

0000be04 <world2machine_update_current()>:
 * this will get the absolute coordinates from the servos,
 * applies the inverse world2machine transformation
 * and stores the result into current_position[x,y].
 */
void world2machine_update_current()
{
    be04:	4f 92       	push	r4
    be06:	5f 92       	push	r5
    be08:	6f 92       	push	r6
    be0a:	7f 92       	push	r7
    be0c:	8f 92       	push	r8
    be0e:	9f 92       	push	r9
    be10:	af 92       	push	r10
    be12:	bf 92       	push	r11
    be14:	cf 92       	push	r12
    be16:	df 92       	push	r13
    be18:	ef 92       	push	r14
    be1a:	ff 92       	push	r15
    be1c:	0f 93       	push	r16
    be1e:	1f 93       	push	r17
    be20:	cf 93       	push	r28
    be22:	df 93       	push	r29
    float x = current_position[X_AXIS] - world2machine_shift[0];
    be24:	01 e6       	ldi	r16, 0x61	; 97
    be26:	12 e1       	ldi	r17, 0x12	; 18
    be28:	ca e9       	ldi	r28, 0x9A	; 154
    be2a:	d4 e0       	ldi	r29, 0x04	; 4
    be2c:	28 81       	ld	r18, Y
    be2e:	39 81       	ldd	r19, Y+1	; 0x01
    be30:	4a 81       	ldd	r20, Y+2	; 0x02
    be32:	5b 81       	ldd	r21, Y+3	; 0x03
    be34:	f8 01       	movw	r30, r16
    be36:	60 81       	ld	r22, Z
    be38:	71 81       	ldd	r23, Z+1	; 0x01
    be3a:	82 81       	ldd	r24, Z+2	; 0x02
    be3c:	93 81       	ldd	r25, Z+3	; 0x03
    be3e:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    be42:	4b 01       	movw	r8, r22
    be44:	5c 01       	movw	r10, r24
    float y = current_position[Y_AXIS] - world2machine_shift[1];
    be46:	2c 81       	ldd	r18, Y+4	; 0x04
    be48:	3d 81       	ldd	r19, Y+5	; 0x05
    be4a:	4e 81       	ldd	r20, Y+6	; 0x06
    be4c:	5f 81       	ldd	r21, Y+7	; 0x07
    be4e:	f8 01       	movw	r30, r16
    be50:	64 81       	ldd	r22, Z+4	; 0x04
    be52:	75 81       	ldd	r23, Z+5	; 0x05
    be54:	86 81       	ldd	r24, Z+6	; 0x06
    be56:	97 81       	ldd	r25, Z+7	; 0x07
    be58:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    be5c:	6b 01       	movw	r12, r22
    be5e:	7c 01       	movw	r14, r24
    current_position[X_AXIS] = world2machine_rotation_and_skew_inv[0][0] * x + world2machine_rotation_and_skew_inv[0][1] * y;
    be60:	ca e8       	ldi	r28, 0x8A	; 138
    be62:	d4 e0       	ldi	r29, 0x04	; 4
    be64:	28 81       	ld	r18, Y
    be66:	39 81       	ldd	r19, Y+1	; 0x01
    be68:	4a 81       	ldd	r20, Y+2	; 0x02
    be6a:	5b 81       	ldd	r21, Y+3	; 0x03
    be6c:	c5 01       	movw	r24, r10
    be6e:	b4 01       	movw	r22, r8
    be70:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    be74:	2b 01       	movw	r4, r22
    be76:	3c 01       	movw	r6, r24
    be78:	2c 81       	ldd	r18, Y+4	; 0x04
    be7a:	3d 81       	ldd	r19, Y+5	; 0x05
    be7c:	4e 81       	ldd	r20, Y+6	; 0x06
    be7e:	5f 81       	ldd	r21, Y+7	; 0x07
    be80:	c7 01       	movw	r24, r14
    be82:	b6 01       	movw	r22, r12
    be84:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    be88:	9b 01       	movw	r18, r22
    be8a:	ac 01       	movw	r20, r24
    be8c:	c3 01       	movw	r24, r6
    be8e:	b2 01       	movw	r22, r4
    be90:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    be94:	f8 01       	movw	r30, r16
    be96:	60 83       	st	Z, r22
    be98:	71 83       	std	Z+1, r23	; 0x01
    be9a:	82 83       	std	Z+2, r24	; 0x02
    be9c:	93 83       	std	Z+3, r25	; 0x03
    current_position[Y_AXIS] = world2machine_rotation_and_skew_inv[1][0] * x + world2machine_rotation_and_skew_inv[1][1] * y;
    be9e:	28 85       	ldd	r18, Y+8	; 0x08
    bea0:	39 85       	ldd	r19, Y+9	; 0x09
    bea2:	4a 85       	ldd	r20, Y+10	; 0x0a
    bea4:	5b 85       	ldd	r21, Y+11	; 0x0b
    bea6:	c5 01       	movw	r24, r10
    bea8:	b4 01       	movw	r22, r8
    beaa:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    beae:	4b 01       	movw	r8, r22
    beb0:	5c 01       	movw	r10, r24
    beb2:	2c 85       	ldd	r18, Y+12	; 0x0c
    beb4:	3d 85       	ldd	r19, Y+13	; 0x0d
    beb6:	4e 85       	ldd	r20, Y+14	; 0x0e
    beb8:	5f 85       	ldd	r21, Y+15	; 0x0f
    beba:	c7 01       	movw	r24, r14
    bebc:	b6 01       	movw	r22, r12
    bebe:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    bec2:	9b 01       	movw	r18, r22
    bec4:	ac 01       	movw	r20, r24
    bec6:	c5 01       	movw	r24, r10
    bec8:	b4 01       	movw	r22, r8
    beca:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    bece:	f8 01       	movw	r30, r16
    bed0:	64 83       	std	Z+4, r22	; 0x04
    bed2:	75 83       	std	Z+5, r23	; 0x05
    bed4:	86 83       	std	Z+6, r24	; 0x06
    bed6:	97 83       	std	Z+7, r25	; 0x07
}
    bed8:	df 91       	pop	r29
    beda:	cf 91       	pop	r28
    bedc:	1f 91       	pop	r17
    bede:	0f 91       	pop	r16
    bee0:	ff 90       	pop	r15
    bee2:	ef 90       	pop	r14
    bee4:	df 90       	pop	r13
    bee6:	cf 90       	pop	r12
    bee8:	bf 90       	pop	r11
    beea:	af 90       	pop	r10
    beec:	9f 90       	pop	r9
    beee:	8f 90       	pop	r8
    bef0:	7f 90       	pop	r7
    bef2:	6f 90       	pop	r6
    bef4:	5f 90       	pop	r5
    bef6:	4f 90       	pop	r4
    bef8:	08 95       	ret

0000befa <world2machine_update(float const*, float const*, float const*) [clone .lto_priv.383]>:
	}
    return false;
}

static void world2machine_update(const float vec_x[2], const float vec_y[2], const float cntr[2])
{
    befa:	4f 92       	push	r4
    befc:	5f 92       	push	r5
    befe:	6f 92       	push	r6
    bf00:	7f 92       	push	r7
    bf02:	8f 92       	push	r8
    bf04:	9f 92       	push	r9
    bf06:	af 92       	push	r10
    bf08:	bf 92       	push	r11
    bf0a:	cf 92       	push	r12
    bf0c:	df 92       	push	r13
    bf0e:	ef 92       	push	r14
    bf10:	ff 92       	push	r15
    bf12:	0f 93       	push	r16
    bf14:	1f 93       	push	r17
    bf16:	cf 93       	push	r28
    bf18:	df 93       	push	r29
    bf1a:	00 d0       	rcall	.+0      	; 0xbf1c <world2machine_update(float const*, float const*, float const*) [clone .lto_priv.383]+0x22>
    bf1c:	00 d0       	rcall	.+0      	; 0xbf1e <world2machine_update(float const*, float const*, float const*) [clone .lto_priv.383]+0x24>
    bf1e:	1f 92       	push	r1
    bf20:	1f 92       	push	r1
    bf22:	cd b7       	in	r28, 0x3d	; 61
    bf24:	de b7       	in	r29, 0x3e	; 62
    world2machine_rotation_and_skew[0][0] = vec_x[0];
    bf26:	dc 01       	movw	r26, r24
    bf28:	cd 90       	ld	r12, X+
    bf2a:	dd 90       	ld	r13, X+
    bf2c:	ed 90       	ld	r14, X+
    bf2e:	fc 90       	ld	r15, X
    bf30:	13 97       	sbiw	r26, 0x03	; 3
    bf32:	c0 92 6f 03 	sts	0x036F, r12	; 0x80036f <world2machine_rotation_and_skew>
    bf36:	d0 92 70 03 	sts	0x0370, r13	; 0x800370 <world2machine_rotation_and_skew+0x1>
    bf3a:	e0 92 71 03 	sts	0x0371, r14	; 0x800371 <world2machine_rotation_and_skew+0x2>
    bf3e:	f0 92 72 03 	sts	0x0372, r15	; 0x800372 <world2machine_rotation_and_skew+0x3>
    world2machine_rotation_and_skew[1][0] = vec_x[1];
    bf42:	14 96       	adiw	r26, 0x04	; 4
    bf44:	0d 91       	ld	r16, X+
    bf46:	1d 91       	ld	r17, X+
    bf48:	2d 91       	ld	r18, X+
    bf4a:	3c 91       	ld	r19, X
    bf4c:	17 97       	sbiw	r26, 0x07	; 7
    bf4e:	09 83       	std	Y+1, r16	; 0x01
    bf50:	1a 83       	std	Y+2, r17	; 0x02
    bf52:	2b 83       	std	Y+3, r18	; 0x03
    bf54:	3c 83       	std	Y+4, r19	; 0x04
    bf56:	00 93 77 03 	sts	0x0377, r16	; 0x800377 <world2machine_rotation_and_skew+0x8>
    bf5a:	10 93 78 03 	sts	0x0378, r17	; 0x800378 <world2machine_rotation_and_skew+0x9>
    bf5e:	20 93 79 03 	sts	0x0379, r18	; 0x800379 <world2machine_rotation_and_skew+0xa>
    bf62:	30 93 7a 03 	sts	0x037A, r19	; 0x80037a <world2machine_rotation_and_skew+0xb>
    world2machine_rotation_and_skew[0][1] = vec_y[0];
    bf66:	db 01       	movw	r26, r22
    bf68:	0d 91       	ld	r16, X+
    bf6a:	1d 91       	ld	r17, X+
    bf6c:	2d 91       	ld	r18, X+
    bf6e:	3c 91       	ld	r19, X
    bf70:	13 97       	sbiw	r26, 0x03	; 3
    bf72:	0d 83       	std	Y+5, r16	; 0x05
    bf74:	1e 83       	std	Y+6, r17	; 0x06
    bf76:	2f 83       	std	Y+7, r18	; 0x07
    bf78:	38 87       	std	Y+8, r19	; 0x08
    bf7a:	00 93 73 03 	sts	0x0373, r16	; 0x800373 <world2machine_rotation_and_skew+0x4>
    bf7e:	10 93 74 03 	sts	0x0374, r17	; 0x800374 <world2machine_rotation_and_skew+0x5>
    bf82:	20 93 75 03 	sts	0x0375, r18	; 0x800375 <world2machine_rotation_and_skew+0x6>
    bf86:	30 93 76 03 	sts	0x0376, r19	; 0x800376 <world2machine_rotation_and_skew+0x7>
    world2machine_rotation_and_skew[1][1] = vec_y[1];
    bf8a:	14 96       	adiw	r26, 0x04	; 4
    bf8c:	4d 90       	ld	r4, X+
    bf8e:	5d 90       	ld	r5, X+
    bf90:	6d 90       	ld	r6, X+
    bf92:	7c 90       	ld	r7, X
    bf94:	17 97       	sbiw	r26, 0x07	; 7
    bf96:	40 92 7b 03 	sts	0x037B, r4	; 0x80037b <world2machine_rotation_and_skew+0xc>
    bf9a:	50 92 7c 03 	sts	0x037C, r5	; 0x80037c <world2machine_rotation_and_skew+0xd>
    bf9e:	60 92 7d 03 	sts	0x037D, r6	; 0x80037d <world2machine_rotation_and_skew+0xe>
    bfa2:	70 92 7e 03 	sts	0x037E, r7	; 0x80037e <world2machine_rotation_and_skew+0xf>
    world2machine_shift[0] = cntr[0];
    bfa6:	fa 01       	movw	r30, r20
    bfa8:	60 81       	ld	r22, Z
    bfaa:	71 81       	ldd	r23, Z+1	; 0x01
    bfac:	82 81       	ldd	r24, Z+2	; 0x02
    bfae:	93 81       	ldd	r25, Z+3	; 0x03
    bfb0:	60 93 9a 04 	sts	0x049A, r22	; 0x80049a <world2machine_shift>
    bfb4:	70 93 9b 04 	sts	0x049B, r23	; 0x80049b <world2machine_shift+0x1>
    bfb8:	80 93 9c 04 	sts	0x049C, r24	; 0x80049c <world2machine_shift+0x2>
    bfbc:	90 93 9d 04 	sts	0x049D, r25	; 0x80049d <world2machine_shift+0x3>
    world2machine_shift[1] = cntr[1];
    bfc0:	84 80       	ldd	r8, Z+4	; 0x04
    bfc2:	95 80       	ldd	r9, Z+5	; 0x05
    bfc4:	a6 80       	ldd	r10, Z+6	; 0x06
    bfc6:	b7 80       	ldd	r11, Z+7	; 0x07
    bfc8:	80 92 9e 04 	sts	0x049E, r8	; 0x80049e <world2machine_shift+0x4>
    bfcc:	90 92 9f 04 	sts	0x049F, r9	; 0x80049f <world2machine_shift+0x5>
    bfd0:	a0 92 a0 04 	sts	0x04A0, r10	; 0x8004a0 <world2machine_shift+0x6>
    bfd4:	b0 92 a1 04 	sts	0x04A1, r11	; 0x8004a1 <world2machine_shift+0x7>
    // No correction.
    world2machine_correction_mode = WORLD2MACHINE_CORRECTION_NONE;
    if (world2machine_shift[0] != 0.f || world2machine_shift[1] != 0.f)
    bfd8:	20 e0       	ldi	r18, 0x00	; 0
    bfda:	30 e0       	ldi	r19, 0x00	; 0
    bfdc:	a9 01       	movw	r20, r18
    bfde:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
    bfe2:	81 11       	cpse	r24, r1
    bfe4:	aa c0       	rjmp	.+340    	; 0xc13a <world2machine_update(float const*, float const*, float const*) [clone .lto_priv.383]+0x240>
    bfe6:	20 e0       	ldi	r18, 0x00	; 0
    bfe8:	30 e0       	ldi	r19, 0x00	; 0
    bfea:	a9 01       	movw	r20, r18
    bfec:	c5 01       	movw	r24, r10
    bfee:	b4 01       	movw	r22, r8
    bff0:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
    bff4:	81 11       	cpse	r24, r1
    bff6:	a1 c0       	rjmp	.+322    	; 0xc13a <world2machine_update(float const*, float const*, float const*) [clone .lto_priv.383]+0x240>
    world2machine_rotation_and_skew[0][1] = vec_y[0];
    world2machine_rotation_and_skew[1][1] = vec_y[1];
    world2machine_shift[0] = cntr[0];
    world2machine_shift[1] = cntr[1];
    // No correction.
    world2machine_correction_mode = WORLD2MACHINE_CORRECTION_NONE;
    bff8:	10 92 a2 04 	sts	0x04A2, r1	; 0x8004a2 <world2machine_correction_mode>
    if (world2machine_shift[0] != 0.f || world2machine_shift[1] != 0.f)
        // Shift correction.
        world2machine_correction_mode |= WORLD2MACHINE_CORRECTION_SHIFT;
    if (world2machine_rotation_and_skew[0][0] != 1.f || world2machine_rotation_and_skew[0][1] != 0.f ||
    bffc:	20 e0       	ldi	r18, 0x00	; 0
    bffe:	30 e0       	ldi	r19, 0x00	; 0
    c000:	40 e8       	ldi	r20, 0x80	; 128
    c002:	5f e3       	ldi	r21, 0x3F	; 63
    c004:	c7 01       	movw	r24, r14
    c006:	b6 01       	movw	r22, r12
    c008:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
    c00c:	81 11       	cpse	r24, r1
    c00e:	21 c0       	rjmp	.+66     	; 0xc052 <world2machine_update(float const*, float const*, float const*) [clone .lto_priv.383]+0x158>
    c010:	20 e0       	ldi	r18, 0x00	; 0
    c012:	30 e0       	ldi	r19, 0x00	; 0
    c014:	a9 01       	movw	r20, r18
    c016:	6d 81       	ldd	r22, Y+5	; 0x05
    c018:	7e 81       	ldd	r23, Y+6	; 0x06
    c01a:	8f 81       	ldd	r24, Y+7	; 0x07
    c01c:	98 85       	ldd	r25, Y+8	; 0x08
    c01e:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
    c022:	81 11       	cpse	r24, r1
    c024:	16 c0       	rjmp	.+44     	; 0xc052 <world2machine_update(float const*, float const*, float const*) [clone .lto_priv.383]+0x158>
    c026:	20 e0       	ldi	r18, 0x00	; 0
    c028:	30 e0       	ldi	r19, 0x00	; 0
    c02a:	a9 01       	movw	r20, r18
    c02c:	69 81       	ldd	r22, Y+1	; 0x01
    c02e:	7a 81       	ldd	r23, Y+2	; 0x02
    c030:	8b 81       	ldd	r24, Y+3	; 0x03
    c032:	9c 81       	ldd	r25, Y+4	; 0x04
    c034:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
    c038:	81 11       	cpse	r24, r1
    c03a:	0b c0       	rjmp	.+22     	; 0xc052 <world2machine_update(float const*, float const*, float const*) [clone .lto_priv.383]+0x158>
        world2machine_rotation_and_skew[1][0] != 0.f || world2machine_rotation_and_skew[1][1] != 1.f) {
    c03c:	20 e0       	ldi	r18, 0x00	; 0
    c03e:	30 e0       	ldi	r19, 0x00	; 0
    c040:	40 e8       	ldi	r20, 0x80	; 128
    c042:	5f e3       	ldi	r21, 0x3F	; 63
    c044:	c3 01       	movw	r24, r6
    c046:	b2 01       	movw	r22, r4
    c048:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
    c04c:	88 23       	and	r24, r24
    c04e:	09 f4       	brne	.+2      	; 0xc052 <world2machine_update(float const*, float const*, float const*) [clone .lto_priv.383]+0x158>
    c050:	78 c0       	rjmp	.+240    	; 0xc142 <world2machine_update(float const*, float const*, float const*) [clone .lto_priv.383]+0x248>
        // Rotation & skew correction.
        world2machine_correction_mode |= WORLD2MACHINE_CORRECTION_SKEW;
    c052:	80 91 a2 04 	lds	r24, 0x04A2	; 0x8004a2 <world2machine_correction_mode>
    c056:	82 60       	ori	r24, 0x02	; 2
    c058:	80 93 a2 04 	sts	0x04A2, r24	; 0x8004a2 <world2machine_correction_mode>
        // Invert the world2machine matrix.
        float d = world2machine_rotation_and_skew[0][0] * world2machine_rotation_and_skew[1][1] - world2machine_rotation_and_skew[1][0] * world2machine_rotation_and_skew[0][1];
    c05c:	a3 01       	movw	r20, r6
    c05e:	92 01       	movw	r18, r4
    c060:	c7 01       	movw	r24, r14
    c062:	b6 01       	movw	r22, r12
    c064:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    c068:	4b 01       	movw	r8, r22
    c06a:	5c 01       	movw	r10, r24
    c06c:	2d 81       	ldd	r18, Y+5	; 0x05
    c06e:	3e 81       	ldd	r19, Y+6	; 0x06
    c070:	4f 81       	ldd	r20, Y+7	; 0x07
    c072:	58 85       	ldd	r21, Y+8	; 0x08
    c074:	69 81       	ldd	r22, Y+1	; 0x01
    c076:	7a 81       	ldd	r23, Y+2	; 0x02
    c078:	8b 81       	ldd	r24, Y+3	; 0x03
    c07a:	9c 81       	ldd	r25, Y+4	; 0x04
    c07c:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    c080:	9b 01       	movw	r18, r22
    c082:	ac 01       	movw	r20, r24
    c084:	c5 01       	movw	r24, r10
    c086:	b4 01       	movw	r22, r8
    c088:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    c08c:	4b 01       	movw	r8, r22
    c08e:	5c 01       	movw	r10, r24
        world2machine_rotation_and_skew_inv[0][0] =  world2machine_rotation_and_skew[1][1] / d;
    c090:	ac 01       	movw	r20, r24
    c092:	9b 01       	movw	r18, r22
    c094:	c3 01       	movw	r24, r6
    c096:	b2 01       	movw	r22, r4
    c098:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
    c09c:	60 93 8a 04 	sts	0x048A, r22	; 0x80048a <world2machine_rotation_and_skew_inv>
    c0a0:	70 93 8b 04 	sts	0x048B, r23	; 0x80048b <world2machine_rotation_and_skew_inv+0x1>
    c0a4:	80 93 8c 04 	sts	0x048C, r24	; 0x80048c <world2machine_rotation_and_skew_inv+0x2>
    c0a8:	90 93 8d 04 	sts	0x048D, r25	; 0x80048d <world2machine_rotation_and_skew_inv+0x3>
        world2machine_rotation_and_skew_inv[0][1] = -world2machine_rotation_and_skew[0][1] / d;
    c0ac:	6d 81       	ldd	r22, Y+5	; 0x05
    c0ae:	7e 81       	ldd	r23, Y+6	; 0x06
    c0b0:	8f 81       	ldd	r24, Y+7	; 0x07
    c0b2:	98 85       	ldd	r25, Y+8	; 0x08
    c0b4:	90 58       	subi	r25, 0x80	; 128
    c0b6:	a5 01       	movw	r20, r10
    c0b8:	94 01       	movw	r18, r8
    c0ba:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
    c0be:	60 93 8e 04 	sts	0x048E, r22	; 0x80048e <world2machine_rotation_and_skew_inv+0x4>
    c0c2:	70 93 8f 04 	sts	0x048F, r23	; 0x80048f <world2machine_rotation_and_skew_inv+0x5>
    c0c6:	80 93 90 04 	sts	0x0490, r24	; 0x800490 <world2machine_rotation_and_skew_inv+0x6>
    c0ca:	90 93 91 04 	sts	0x0491, r25	; 0x800491 <world2machine_rotation_and_skew_inv+0x7>
        world2machine_rotation_and_skew_inv[1][0] = -world2machine_rotation_and_skew[1][0] / d;
    c0ce:	69 81       	ldd	r22, Y+1	; 0x01
    c0d0:	7a 81       	ldd	r23, Y+2	; 0x02
    c0d2:	8b 81       	ldd	r24, Y+3	; 0x03
    c0d4:	9c 81       	ldd	r25, Y+4	; 0x04
    c0d6:	90 58       	subi	r25, 0x80	; 128
    c0d8:	a5 01       	movw	r20, r10
    c0da:	94 01       	movw	r18, r8
    c0dc:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
    c0e0:	60 93 92 04 	sts	0x0492, r22	; 0x800492 <world2machine_rotation_and_skew_inv+0x8>
    c0e4:	70 93 93 04 	sts	0x0493, r23	; 0x800493 <world2machine_rotation_and_skew_inv+0x9>
    c0e8:	80 93 94 04 	sts	0x0494, r24	; 0x800494 <world2machine_rotation_and_skew_inv+0xa>
    c0ec:	90 93 95 04 	sts	0x0495, r25	; 0x800495 <world2machine_rotation_and_skew_inv+0xb>
        world2machine_rotation_and_skew_inv[1][1] =  world2machine_rotation_and_skew[0][0] / d;
    c0f0:	a5 01       	movw	r20, r10
    c0f2:	94 01       	movw	r18, r8
    c0f4:	c7 01       	movw	r24, r14
    c0f6:	b6 01       	movw	r22, r12
    c0f8:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
    c0fc:	60 93 96 04 	sts	0x0496, r22	; 0x800496 <world2machine_rotation_and_skew_inv+0xc>
    c100:	70 93 97 04 	sts	0x0497, r23	; 0x800497 <world2machine_rotation_and_skew_inv+0xd>
    c104:	80 93 98 04 	sts	0x0498, r24	; 0x800498 <world2machine_rotation_and_skew_inv+0xe>
    c108:	90 93 99 04 	sts	0x0499, r25	; 0x800499 <world2machine_rotation_and_skew_inv+0xf>
        world2machine_rotation_and_skew_inv[0][0] = 1.f;
        world2machine_rotation_and_skew_inv[0][1] = 0.f;
        world2machine_rotation_and_skew_inv[1][0] = 0.f;
        world2machine_rotation_and_skew_inv[1][1] = 1.f;
    }
}
    c10c:	28 96       	adiw	r28, 0x08	; 8
    c10e:	0f b6       	in	r0, 0x3f	; 63
    c110:	f8 94       	cli
    c112:	de bf       	out	0x3e, r29	; 62
    c114:	0f be       	out	0x3f, r0	; 63
    c116:	cd bf       	out	0x3d, r28	; 61
    c118:	df 91       	pop	r29
    c11a:	cf 91       	pop	r28
    c11c:	1f 91       	pop	r17
    c11e:	0f 91       	pop	r16
    c120:	ff 90       	pop	r15
    c122:	ef 90       	pop	r14
    c124:	df 90       	pop	r13
    c126:	cf 90       	pop	r12
    c128:	bf 90       	pop	r11
    c12a:	af 90       	pop	r10
    c12c:	9f 90       	pop	r9
    c12e:	8f 90       	pop	r8
    c130:	7f 90       	pop	r7
    c132:	6f 90       	pop	r6
    c134:	5f 90       	pop	r5
    c136:	4f 90       	pop	r4
    c138:	08 95       	ret
    world2machine_shift[1] = cntr[1];
    // No correction.
    world2machine_correction_mode = WORLD2MACHINE_CORRECTION_NONE;
    if (world2machine_shift[0] != 0.f || world2machine_shift[1] != 0.f)
        // Shift correction.
        world2machine_correction_mode |= WORLD2MACHINE_CORRECTION_SHIFT;
    c13a:	81 e0       	ldi	r24, 0x01	; 1
    c13c:	80 93 a2 04 	sts	0x04A2, r24	; 0x8004a2 <world2machine_correction_mode>
    c140:	5d cf       	rjmp	.-326    	; 0xbffc <world2machine_update(float const*, float const*, float const*) [clone .lto_priv.383]+0x102>
        world2machine_rotation_and_skew_inv[0][0] =  world2machine_rotation_and_skew[1][1] / d;
        world2machine_rotation_and_skew_inv[0][1] = -world2machine_rotation_and_skew[0][1] / d;
        world2machine_rotation_and_skew_inv[1][0] = -world2machine_rotation_and_skew[1][0] / d;
        world2machine_rotation_and_skew_inv[1][1] =  world2machine_rotation_and_skew[0][0] / d;
    } else {
        world2machine_rotation_and_skew_inv[0][0] = 1.f;
    c142:	80 e0       	ldi	r24, 0x00	; 0
    c144:	90 e0       	ldi	r25, 0x00	; 0
    c146:	a0 e8       	ldi	r26, 0x80	; 128
    c148:	bf e3       	ldi	r27, 0x3F	; 63
    c14a:	80 93 8a 04 	sts	0x048A, r24	; 0x80048a <world2machine_rotation_and_skew_inv>
    c14e:	90 93 8b 04 	sts	0x048B, r25	; 0x80048b <world2machine_rotation_and_skew_inv+0x1>
    c152:	a0 93 8c 04 	sts	0x048C, r26	; 0x80048c <world2machine_rotation_and_skew_inv+0x2>
    c156:	b0 93 8d 04 	sts	0x048D, r27	; 0x80048d <world2machine_rotation_and_skew_inv+0x3>
        world2machine_rotation_and_skew_inv[0][1] = 0.f;
    c15a:	10 92 8e 04 	sts	0x048E, r1	; 0x80048e <world2machine_rotation_and_skew_inv+0x4>
    c15e:	10 92 8f 04 	sts	0x048F, r1	; 0x80048f <world2machine_rotation_and_skew_inv+0x5>
    c162:	10 92 90 04 	sts	0x0490, r1	; 0x800490 <world2machine_rotation_and_skew_inv+0x6>
    c166:	10 92 91 04 	sts	0x0491, r1	; 0x800491 <world2machine_rotation_and_skew_inv+0x7>
        world2machine_rotation_and_skew_inv[1][0] = 0.f;
    c16a:	10 92 92 04 	sts	0x0492, r1	; 0x800492 <world2machine_rotation_and_skew_inv+0x8>
    c16e:	10 92 93 04 	sts	0x0493, r1	; 0x800493 <world2machine_rotation_and_skew_inv+0x9>
    c172:	10 92 94 04 	sts	0x0494, r1	; 0x800494 <world2machine_rotation_and_skew_inv+0xa>
    c176:	10 92 95 04 	sts	0x0495, r1	; 0x800495 <world2machine_rotation_and_skew_inv+0xb>
        world2machine_rotation_and_skew_inv[1][1] = 1.f;
    c17a:	80 93 96 04 	sts	0x0496, r24	; 0x800496 <world2machine_rotation_and_skew_inv+0xc>
    c17e:	90 93 97 04 	sts	0x0497, r25	; 0x800497 <world2machine_rotation_and_skew_inv+0xd>
    c182:	a0 93 98 04 	sts	0x0498, r26	; 0x800498 <world2machine_rotation_and_skew_inv+0xe>
    c186:	b0 93 99 04 	sts	0x0499, r27	; 0x800499 <world2machine_rotation_and_skew_inv+0xf>
    c18a:	c0 cf       	rjmp	.-128    	; 0xc10c <world2machine_update(float const*, float const*, float const*) [clone .lto_priv.383]+0x212>

0000c18c <world2machine_initialize()>:

/**
 * @brief Read and apply validated calibration data from EEPROM
 */
void world2machine_initialize()
{
    c18c:	4f 92       	push	r4
    c18e:	5f 92       	push	r5
    c190:	6f 92       	push	r6
    c192:	7f 92       	push	r7
    c194:	8f 92       	push	r8
    c196:	9f 92       	push	r9
    c198:	af 92       	push	r10
    c19a:	bf 92       	push	r11
    c19c:	cf 92       	push	r12
    c19e:	df 92       	push	r13
    c1a0:	ef 92       	push	r14
    c1a2:	ff 92       	push	r15
    c1a4:	1f 93       	push	r17
    c1a6:	cf 93       	push	r28
    c1a8:	df 93       	push	r29
    c1aa:	cd b7       	in	r28, 0x3d	; 61
    c1ac:	de b7       	in	r29, 0x3e	; 62
    c1ae:	a8 97       	sbiw	r28, 0x28	; 40
    c1b0:	0f b6       	in	r0, 0x3f	; 63
    c1b2:	f8 94       	cli
    c1b4:	de bf       	out	0x3e, r29	; 62
    c1b6:	0f be       	out	0x3f, r0	; 63
    c1b8:	cd bf       	out	0x3d, r28	; 61
 * @param [out] vec_y axis y vector
 * @param [out] cntr offset vector
 */
void world2machine_read_valid(float vec_x[2], float vec_y[2], float cntr[2])
{
    eeprom_read_block(&vec_x[0], (float*)(EEPROM_BED_CALIBRATION_VEC_X), 8);
    c1ba:	48 e0       	ldi	r20, 0x08	; 8
    c1bc:	50 e0       	ldi	r21, 0x00	; 0
    c1be:	6d ed       	ldi	r22, 0xDD	; 221
    c1c0:	7f e0       	ldi	r23, 0x0F	; 15
    c1c2:	ce 01       	movw	r24, r28
    c1c4:	01 96       	adiw	r24, 0x01	; 1
    c1c6:	0f 94 d0 a3 	call	0x347a0	; 0x347a0 <eeprom_read_block>
    eeprom_read_block(&vec_y[0], (float*)(EEPROM_BED_CALIBRATION_VEC_Y), 8);
    c1ca:	48 e0       	ldi	r20, 0x08	; 8
    c1cc:	50 e0       	ldi	r21, 0x00	; 0
    c1ce:	65 ed       	ldi	r22, 0xD5	; 213
    c1d0:	7f e0       	ldi	r23, 0x0F	; 15
    c1d2:	ce 01       	movw	r24, r28
    c1d4:	09 96       	adiw	r24, 0x09	; 9
    c1d6:	0f 94 d0 a3 	call	0x347a0	; 0x347a0 <eeprom_read_block>
    eeprom_read_block(&cntr[0], (float*)(EEPROM_BED_CALIBRATION_CENTER), 8);
    c1da:	48 e0       	ldi	r20, 0x08	; 8
    c1dc:	50 e0       	ldi	r21, 0x00	; 0
    c1de:	65 ee       	ldi	r22, 0xE5	; 229
    c1e0:	7f e0       	ldi	r23, 0x0F	; 15
    c1e2:	ce 01       	movw	r24, r28
    c1e4:	41 96       	adiw	r24, 0x11	; 17
    c1e6:	0f 94 d0 a3 	call	0x347a0	; 0x347a0 <eeprom_read_block>
}

static inline bool vec_undef(const float v[2])
{
    const uint32_t *vx = (const uint32_t*)v;
    return vx[0] == 0xFFFFFFFF || vx[1] == 0xFFFFFFFF;
    c1ea:	89 89       	ldd	r24, Y+17	; 0x11
    c1ec:	9a 89       	ldd	r25, Y+18	; 0x12
    c1ee:	ab 89       	ldd	r26, Y+19	; 0x13
    c1f0:	bc 89       	ldd	r27, Y+20	; 0x14
    c1f2:	89 a3       	std	Y+33, r24	; 0x21
    c1f4:	9a a3       	std	Y+34, r25	; 0x22
    c1f6:	ab a3       	std	Y+35, r26	; 0x23
    c1f8:	bc a3       	std	Y+36, r27	; 0x24
    c1fa:	8f 3f       	cpi	r24, 0xFF	; 255
    c1fc:	9f 4f       	sbci	r25, 0xFF	; 255
    c1fe:	af 4f       	sbci	r26, 0xFF	; 255
    c200:	bf 4f       	sbci	r27, 0xFF	; 255
    c202:	09 f4       	brne	.+2      	; 0xc206 <world2machine_initialize()+0x7a>
    c204:	b1 c0       	rjmp	.+354    	; 0xc368 <world2machine_initialize()+0x1dc>
    c206:	8d 89       	ldd	r24, Y+21	; 0x15
    c208:	9e 89       	ldd	r25, Y+22	; 0x16
    c20a:	af 89       	ldd	r26, Y+23	; 0x17
    c20c:	b8 8d       	ldd	r27, Y+24	; 0x18
    c20e:	8d a3       	std	Y+37, r24	; 0x25
    c210:	9e a3       	std	Y+38, r25	; 0x26
    c212:	af a3       	std	Y+39, r26	; 0x27
    c214:	b8 a7       	std	Y+40, r27	; 0x28
    c216:	8f 3f       	cpi	r24, 0xFF	; 255
    c218:	9f 4f       	sbci	r25, 0xFF	; 255
    c21a:	af 4f       	sbci	r26, 0xFF	; 255
    c21c:	bf 4f       	sbci	r27, 0xFF	; 255
    c21e:	09 f4       	brne	.+2      	; 0xc222 <world2machine_initialize()+0x96>
    c220:	a3 c0       	rjmp	.+326    	; 0xc368 <world2machine_initialize()+0x1dc>
    c222:	89 80       	ldd	r8, Y+1	; 0x01
    c224:	9a 80       	ldd	r9, Y+2	; 0x02
    c226:	ab 80       	ldd	r10, Y+3	; 0x03
    c228:	bc 80       	ldd	r11, Y+4	; 0x04
    c22a:	8f ef       	ldi	r24, 0xFF	; 255
    c22c:	88 16       	cp	r8, r24
    c22e:	98 06       	cpc	r9, r24
    c230:	a8 06       	cpc	r10, r24
    c232:	b8 06       	cpc	r11, r24
    c234:	09 f4       	brne	.+2      	; 0xc238 <world2machine_initialize()+0xac>
    c236:	98 c0       	rjmp	.+304    	; 0xc368 <world2machine_initialize()+0x1dc>
    c238:	8d 81       	ldd	r24, Y+5	; 0x05
    c23a:	9e 81       	ldd	r25, Y+6	; 0x06
    c23c:	af 81       	ldd	r26, Y+7	; 0x07
    c23e:	b8 85       	ldd	r27, Y+8	; 0x08
    c240:	89 8f       	std	Y+25, r24	; 0x19
    c242:	9a 8f       	std	Y+26, r25	; 0x1a
    c244:	ab 8f       	std	Y+27, r26	; 0x1b
    c246:	bc 8f       	std	Y+28, r27	; 0x1c
    c248:	8f 3f       	cpi	r24, 0xFF	; 255
    c24a:	9f 4f       	sbci	r25, 0xFF	; 255
    c24c:	af 4f       	sbci	r26, 0xFF	; 255
    c24e:	bf 4f       	sbci	r27, 0xFF	; 255
    c250:	09 f4       	brne	.+2      	; 0xc254 <world2machine_initialize()+0xc8>
    c252:	8a c0       	rjmp	.+276    	; 0xc368 <world2machine_initialize()+0x1dc>
    c254:	c9 84       	ldd	r12, Y+9	; 0x09
    c256:	da 84       	ldd	r13, Y+10	; 0x0a
    c258:	eb 84       	ldd	r14, Y+11	; 0x0b
    c25a:	fc 84       	ldd	r15, Y+12	; 0x0c
    c25c:	8f ef       	ldi	r24, 0xFF	; 255
    c25e:	c8 16       	cp	r12, r24
    c260:	d8 06       	cpc	r13, r24
    c262:	e8 06       	cpc	r14, r24
    c264:	f8 06       	cpc	r15, r24
    c266:	09 f4       	brne	.+2      	; 0xc26a <world2machine_initialize()+0xde>
    c268:	7f c0       	rjmp	.+254    	; 0xc368 <world2machine_initialize()+0x1dc>
    c26a:	8d 85       	ldd	r24, Y+13	; 0x0d
    c26c:	9e 85       	ldd	r25, Y+14	; 0x0e
    c26e:	af 85       	ldd	r26, Y+15	; 0x0f
    c270:	b8 89       	ldd	r27, Y+16	; 0x10
    c272:	8d 8f       	std	Y+29, r24	; 0x1d
    c274:	9e 8f       	std	Y+30, r25	; 0x1e
    c276:	af 8f       	std	Y+31, r26	; 0x1f
    c278:	b8 a3       	std	Y+32, r27	; 0x20
    c27a:	8f 3f       	cpi	r24, 0xFF	; 255
    c27c:	9f 4f       	sbci	r25, 0xFF	; 255
    c27e:	af 4f       	sbci	r26, 0xFF	; 255
    c280:	bf 4f       	sbci	r27, 0xFF	; 255
    c282:	09 f4       	brne	.+2      	; 0xc286 <world2machine_initialize()+0xfa>
    c284:	71 c0       	rjmp	.+226    	; 0xc368 <world2machine_initialize()+0x1dc>
        reset = true;
    }
    else
    {
        // Length of the vec_x shall be close to unity.
        float l = hypot(vec_x[0], vec_x[1]);
    c286:	29 8d       	ldd	r18, Y+25	; 0x19
    c288:	3a 8d       	ldd	r19, Y+26	; 0x1a
    c28a:	4b 8d       	ldd	r20, Y+27	; 0x1b
    c28c:	5c 8d       	ldd	r21, Y+28	; 0x1c
    c28e:	c5 01       	movw	r24, r10
    c290:	b4 01       	movw	r22, r8
    c292:	0f 94 a4 a7 	call	0x34f48	; 0x34f48 <hypot>
    c296:	2b 01       	movw	r4, r22
    c298:	3c 01       	movw	r6, r24
        if (l < 0.9 || l > 1.1)
    c29a:	26 e6       	ldi	r18, 0x66	; 102
    c29c:	36 e6       	ldi	r19, 0x66	; 102
    c29e:	46 e6       	ldi	r20, 0x66	; 102
    c2a0:	5f e3       	ldi	r21, 0x3F	; 63
    c2a2:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
#if 0
            SERIAL_ECHOLNPGM("X vector length:");
            MYSERIAL.println(l);
            SERIAL_ECHOLNPGM("Invalid bed correction matrix. Length of the X vector out of range.");
#endif
            reset = true;
    c2a6:	11 e0       	ldi	r17, 0x01	; 1
    }
    else
    {
        // Length of the vec_x shall be close to unity.
        float l = hypot(vec_x[0], vec_x[1]);
        if (l < 0.9 || l > 1.1)
    c2a8:	87 fd       	sbrc	r24, 7
    c2aa:	0b c0       	rjmp	.+22     	; 0xc2c2 <world2machine_initialize()+0x136>
    c2ac:	2d ec       	ldi	r18, 0xCD	; 205
    c2ae:	3c ec       	ldi	r19, 0xCC	; 204
    c2b0:	4c e8       	ldi	r20, 0x8C	; 140
    c2b2:	5f e3       	ldi	r21, 0x3F	; 63
    c2b4:	c3 01       	movw	r24, r6
    c2b6:	b2 01       	movw	r22, r4
    c2b8:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
    c2bc:	18 16       	cp	r1, r24
    c2be:	0c f0       	brlt	.+2      	; 0xc2c2 <world2machine_initialize()+0x136>
    c2c0:	10 e0       	ldi	r17, 0x00	; 0
            SERIAL_ECHOLNPGM("Invalid bed correction matrix. Length of the X vector out of range.");
#endif
            reset = true;
        }
        // Length of the vec_y shall be close to unity.
        l = hypot(vec_y[0], vec_y[1]);
    c2c2:	2d 8d       	ldd	r18, Y+29	; 0x1d
    c2c4:	3e 8d       	ldd	r19, Y+30	; 0x1e
    c2c6:	4f 8d       	ldd	r20, Y+31	; 0x1f
    c2c8:	58 a1       	ldd	r21, Y+32	; 0x20
    c2ca:	c7 01       	movw	r24, r14
    c2cc:	b6 01       	movw	r22, r12
    c2ce:	0f 94 a4 a7 	call	0x34f48	; 0x34f48 <hypot>
    c2d2:	2b 01       	movw	r4, r22
    c2d4:	3c 01       	movw	r6, r24
        if (l < 0.9 || l > 1.1)
    c2d6:	26 e6       	ldi	r18, 0x66	; 102
    c2d8:	36 e6       	ldi	r19, 0x66	; 102
    c2da:	46 e6       	ldi	r20, 0x66	; 102
    c2dc:	5f e3       	ldi	r21, 0x3F	; 63
    c2de:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
    c2e2:	87 fd       	sbrc	r24, 7
    c2e4:	7f c0       	rjmp	.+254    	; 0xc3e4 <world2machine_initialize()+0x258>
    c2e6:	2d ec       	ldi	r18, 0xCD	; 205
    c2e8:	3c ec       	ldi	r19, 0xCC	; 204
    c2ea:	4c e8       	ldi	r20, 0x8C	; 140
    c2ec:	5f e3       	ldi	r21, 0x3F	; 63
    c2ee:	c3 01       	movw	r24, r6
    c2f0:	b2 01       	movw	r22, r4
    c2f2:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
    c2f6:	18 16       	cp	r1, r24
    c2f8:	0c f4       	brge	.+2      	; 0xc2fc <world2machine_initialize()+0x170>
    c2fa:	74 c0       	rjmp	.+232    	; 0xc3e4 <world2machine_initialize()+0x258>
            SERIAL_ECHOLNPGM("Invalid bed correction matrix. Length of the Y vector out of range.");
#endif
            reset = true;
        }
        // Correction of the zero point shall be reasonably small.
        l = hypot(cntr[0], cntr[1]);
    c2fc:	2d a1       	ldd	r18, Y+37	; 0x25
    c2fe:	3e a1       	ldd	r19, Y+38	; 0x26
    c300:	4f a1       	ldd	r20, Y+39	; 0x27
    c302:	58 a5       	ldd	r21, Y+40	; 0x28
    c304:	69 a1       	ldd	r22, Y+33	; 0x21
    c306:	7a a1       	ldd	r23, Y+34	; 0x22
    c308:	8b a1       	ldd	r24, Y+35	; 0x23
    c30a:	9c a1       	ldd	r25, Y+36	; 0x24
    c30c:	0f 94 a4 a7 	call	0x34f48	; 0x34f48 <hypot>
        if (l > 15.f)
    c310:	20 e0       	ldi	r18, 0x00	; 0
    c312:	30 e0       	ldi	r19, 0x00	; 0
    c314:	40 e7       	ldi	r20, 0x70	; 112
    c316:	51 e4       	ldi	r21, 0x41	; 65
    c318:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
    c31c:	18 16       	cp	r1, r24
    c31e:	0c f4       	brge	.+2      	; 0xc322 <world2machine_initialize()+0x196>
#if 0
            SERIAL_ECHOLNPGM("Zero point correction:");
            MYSERIAL.println(l);
            SERIAL_ECHOLNPGM("Invalid bed correction matrix. Shift out of range.");
#endif
            reset = true;
    c320:	11 e0       	ldi	r17, 0x01	; 1
        }
        // vec_x and vec_y shall be nearly perpendicular.
        l = vec_x[0] * vec_y[0] + vec_x[1] * vec_y[1];
    c322:	a5 01       	movw	r20, r10
    c324:	94 01       	movw	r18, r8
    c326:	c7 01       	movw	r24, r14
    c328:	b6 01       	movw	r22, r12
    c32a:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    c32e:	6b 01       	movw	r12, r22
    c330:	7c 01       	movw	r14, r24
    c332:	2d 8d       	ldd	r18, Y+29	; 0x1d
    c334:	3e 8d       	ldd	r19, Y+30	; 0x1e
    c336:	4f 8d       	ldd	r20, Y+31	; 0x1f
    c338:	58 a1       	ldd	r21, Y+32	; 0x20
    c33a:	69 8d       	ldd	r22, Y+25	; 0x19
    c33c:	7a 8d       	ldd	r23, Y+26	; 0x1a
    c33e:	8b 8d       	ldd	r24, Y+27	; 0x1b
    c340:	9c 8d       	ldd	r25, Y+28	; 0x1c
    c342:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    c346:	9b 01       	movw	r18, r22
    c348:	ac 01       	movw	r20, r24
    c34a:	c7 01       	movw	r24, r14
    c34c:	b6 01       	movw	r22, r12
    c34e:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
        if (fabs(l) > 0.1f)
    c352:	9f 77       	andi	r25, 0x7F	; 127
    c354:	2d ec       	ldi	r18, 0xCD	; 205
    c356:	3c ec       	ldi	r19, 0xCC	; 204
    c358:	4c ec       	ldi	r20, 0xCC	; 204
    c35a:	5d e3       	ldi	r21, 0x3D	; 61
    c35c:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
    c360:	18 16       	cp	r1, r24
    c362:	14 f0       	brlt	.+4      	; 0xc368 <world2machine_initialize()+0x1dc>
#endif
            reset = true;
        }
    }

    if (reset)
    c364:	11 23       	and	r17, r17
    c366:	f1 f0       	breq	.+60     	; 0xc3a4 <world2machine_initialize()+0x218>
    {
#if 0
        SERIAL_ECHOLNPGM("Invalid bed correction matrix. Resetting to identity.");
#endif
        reset_bed_offset_and_skew();
    c368:	0e 94 1e 55 	call	0xaa3c	; 0xaa3c <reset_bed_offset_and_skew()>
 * @param [out] vec_y axis y vector
 * @param [out] cntr offset vector
 */
static void world2machine_default(float vec_x[2], float vec_y[2], float cntr[2])
{
    vec_x[0] = 1.f;
    c36c:	80 e0       	ldi	r24, 0x00	; 0
    c36e:	90 e0       	ldi	r25, 0x00	; 0
    c370:	a0 e8       	ldi	r26, 0x80	; 128
    c372:	bf e3       	ldi	r27, 0x3F	; 63
    c374:	89 83       	std	Y+1, r24	; 0x01
    c376:	9a 83       	std	Y+2, r25	; 0x02
    c378:	ab 83       	std	Y+3, r26	; 0x03
    c37a:	bc 83       	std	Y+4, r27	; 0x04
    vec_x[1] = 0.f;
    c37c:	1d 82       	std	Y+5, r1	; 0x05
    c37e:	1e 82       	std	Y+6, r1	; 0x06
    c380:	1f 82       	std	Y+7, r1	; 0x07
    c382:	18 86       	std	Y+8, r1	; 0x08
    vec_y[0] = 0.f;
    c384:	19 86       	std	Y+9, r1	; 0x09
    c386:	1a 86       	std	Y+10, r1	; 0x0a
    c388:	1b 86       	std	Y+11, r1	; 0x0b
    c38a:	1c 86       	std	Y+12, r1	; 0x0c
    vec_y[1] = 1.f;
    c38c:	8d 87       	std	Y+13, r24	; 0x0d
    c38e:	9e 87       	std	Y+14, r25	; 0x0e
    c390:	af 87       	std	Y+15, r26	; 0x0f
    c392:	b8 8b       	std	Y+16, r27	; 0x10
    cntr[0] =  0.f;
    c394:	19 8a       	std	Y+17, r1	; 0x11
    c396:	1a 8a       	std	Y+18, r1	; 0x12
    c398:	1b 8a       	std	Y+19, r1	; 0x13
    c39a:	1c 8a       	std	Y+20, r1	; 0x14
#ifdef DEFAULT_Y_OFFSET
    cntr[1] = DEFAULT_Y_OFFSET;
#else
    cntr[1] = 0.f;
    c39c:	1d 8a       	std	Y+21, r1	; 0x15
    c39e:	1e 8a       	std	Y+22, r1	; 0x16
    c3a0:	1f 8a       	std	Y+23, r1	; 0x17
    c3a2:	18 8e       	std	Y+24, r1	; 0x18
#endif
    float vec_x[2];
    float vec_y[2];
    float cntr[2];
    world2machine_read_valid(vec_x, vec_y, cntr);
    world2machine_update(vec_x, vec_y, cntr);
    c3a4:	ae 01       	movw	r20, r28
    c3a6:	4f 5e       	subi	r20, 0xEF	; 239
    c3a8:	5f 4f       	sbci	r21, 0xFF	; 255
    c3aa:	be 01       	movw	r22, r28
    c3ac:	67 5f       	subi	r22, 0xF7	; 247
    c3ae:	7f 4f       	sbci	r23, 0xFF	; 255
    c3b0:	ce 01       	movw	r24, r28
    c3b2:	01 96       	adiw	r24, 0x01	; 1
    c3b4:	0e 94 7d 5f 	call	0xbefa	; 0xbefa <world2machine_update(float const*, float const*, float const*) [clone .lto_priv.383]>
    MYSERIAL.print(world2machine_shift[0], 5);
    SERIAL_ECHOPGM(", ");
    MYSERIAL.print(world2machine_shift[1], 5);
    SERIAL_ECHOLNPGM("");
#endif
}
    c3b8:	a8 96       	adiw	r28, 0x28	; 40
    c3ba:	0f b6       	in	r0, 0x3f	; 63
    c3bc:	f8 94       	cli
    c3be:	de bf       	out	0x3e, r29	; 62
    c3c0:	0f be       	out	0x3f, r0	; 63
    c3c2:	cd bf       	out	0x3d, r28	; 61
    c3c4:	df 91       	pop	r29
    c3c6:	cf 91       	pop	r28
    c3c8:	1f 91       	pop	r17
    c3ca:	ff 90       	pop	r15
    c3cc:	ef 90       	pop	r14
    c3ce:	df 90       	pop	r13
    c3d0:	cf 90       	pop	r12
    c3d2:	bf 90       	pop	r11
    c3d4:	af 90       	pop	r10
    c3d6:	9f 90       	pop	r9
    c3d8:	8f 90       	pop	r8
    c3da:	7f 90       	pop	r7
    c3dc:	6f 90       	pop	r6
    c3de:	5f 90       	pop	r5
    c3e0:	4f 90       	pop	r4
    c3e2:	08 95       	ret
#if 0
            SERIAL_ECHOLNPGM("Y vector length:");
            MYSERIAL.println(l);
            SERIAL_ECHOLNPGM("Invalid bed correction matrix. Length of the Y vector out of range.");
#endif
            reset = true;
    c3e4:	11 e0       	ldi	r17, 0x01	; 1
    c3e6:	8a cf       	rjmp	.-236    	; 0xc2fc <world2machine_initialize()+0x170>

0000c3e8 <world2machine_reset()>:
 *
 * In contrast with world2machine_revert_to_uncorrected(), it doesn't wait for finishing moves
 * nor updates the current position with the absolute values.
 */
void world2machine_reset()
{
    c3e8:	cf 93       	push	r28
    c3ea:	df 93       	push	r29
    c3ec:	cd b7       	in	r28, 0x3d	; 61
    c3ee:	de b7       	in	r29, 0x3e	; 62
    c3f0:	68 97       	sbiw	r28, 0x18	; 24
    c3f2:	0f b6       	in	r0, 0x3f	; 63
    c3f4:	f8 94       	cli
    c3f6:	de bf       	out	0x3e, r29	; 62
    c3f8:	0f be       	out	0x3f, r0	; 63
    c3fa:	cd bf       	out	0x3d, r28	; 61
    const float vx[] = { 1.f, 0.f };
    c3fc:	80 e0       	ldi	r24, 0x00	; 0
    c3fe:	90 e0       	ldi	r25, 0x00	; 0
    c400:	a0 e8       	ldi	r26, 0x80	; 128
    c402:	bf e3       	ldi	r27, 0x3F	; 63
    c404:	89 83       	std	Y+1, r24	; 0x01
    c406:	9a 83       	std	Y+2, r25	; 0x02
    c408:	ab 83       	std	Y+3, r26	; 0x03
    c40a:	bc 83       	std	Y+4, r27	; 0x04
    c40c:	1d 82       	std	Y+5, r1	; 0x05
    c40e:	1e 82       	std	Y+6, r1	; 0x06
    c410:	1f 82       	std	Y+7, r1	; 0x07
    c412:	18 86       	std	Y+8, r1	; 0x08
    const float vy[] = { 0.f, 1.f };
    c414:	19 86       	std	Y+9, r1	; 0x09
    c416:	1a 86       	std	Y+10, r1	; 0x0a
    c418:	1b 86       	std	Y+11, r1	; 0x0b
    c41a:	1c 86       	std	Y+12, r1	; 0x0c
    c41c:	8d 87       	std	Y+13, r24	; 0x0d
    c41e:	9e 87       	std	Y+14, r25	; 0x0e
    c420:	af 87       	std	Y+15, r26	; 0x0f
    c422:	b8 8b       	std	Y+16, r27	; 0x10
    const float cntr[] = { 0.f, 0.f };
    c424:	19 8a       	std	Y+17, r1	; 0x11
    c426:	1a 8a       	std	Y+18, r1	; 0x12
    c428:	1b 8a       	std	Y+19, r1	; 0x13
    c42a:	1c 8a       	std	Y+20, r1	; 0x14
    c42c:	1d 8a       	std	Y+21, r1	; 0x15
    c42e:	1e 8a       	std	Y+22, r1	; 0x16
    c430:	1f 8a       	std	Y+23, r1	; 0x17
    c432:	18 8e       	std	Y+24, r1	; 0x18
    world2machine_update(vx, vy, cntr);
    c434:	ae 01       	movw	r20, r28
    c436:	4f 5e       	subi	r20, 0xEF	; 239
    c438:	5f 4f       	sbci	r21, 0xFF	; 255
    c43a:	be 01       	movw	r22, r28
    c43c:	67 5f       	subi	r22, 0xF7	; 247
    c43e:	7f 4f       	sbci	r23, 0xFF	; 255
    c440:	ce 01       	movw	r24, r28
    c442:	01 96       	adiw	r24, 0x01	; 1
    c444:	0e 94 7d 5f 	call	0xbefa	; 0xbefa <world2machine_update(float const*, float const*, float const*) [clone .lto_priv.383]>
}
    c448:	68 96       	adiw	r28, 0x18	; 24
    c44a:	0f b6       	in	r0, 0x3f	; 63
    c44c:	f8 94       	cli
    c44e:	de bf       	out	0x3e, r29	; 62
    c450:	0f be       	out	0x3f, r0	; 63
    c452:	cd bf       	out	0x3d, r28	; 61
    c454:	df 91       	pop	r29
    c456:	cf 91       	pop	r28
    c458:	08 95       	ret

0000c45a <world2machine_revert_to_uncorrected()>:
 *
 * Wait for the motors to stop and then update the current position with the absolute values.
 */
void world2machine_revert_to_uncorrected()
{
    if (world2machine_correction_mode != WORLD2MACHINE_CORRECTION_NONE) {
    c45a:	80 91 a2 04 	lds	r24, 0x04A2	; 0x8004a2 <world2machine_correction_mode>
    c45e:	88 23       	and	r24, r24
    c460:	d1 f0       	breq	.+52     	; 0xc496 <world2machine_revert_to_uncorrected()+0x3c>
        world2machine_reset();
    c462:	0e 94 f4 61 	call	0xc3e8	; 0xc3e8 <world2machine_reset()>
        st_synchronize();
    c466:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
        current_position[X_AXIS] = st_get_position_mm(X_AXIS);
    c46a:	80 e0       	ldi	r24, 0x00	; 0
    c46c:	0f 94 e7 1a 	call	0x235ce	; 0x235ce <st_get_position_mm(unsigned char)>
    c470:	60 93 61 12 	sts	0x1261, r22	; 0x801261 <current_position>
    c474:	70 93 62 12 	sts	0x1262, r23	; 0x801262 <current_position+0x1>
    c478:	80 93 63 12 	sts	0x1263, r24	; 0x801263 <current_position+0x2>
    c47c:	90 93 64 12 	sts	0x1264, r25	; 0x801264 <current_position+0x3>
        current_position[Y_AXIS] = st_get_position_mm(Y_AXIS);
    c480:	81 e0       	ldi	r24, 0x01	; 1
    c482:	0f 94 e7 1a 	call	0x235ce	; 0x235ce <st_get_position_mm(unsigned char)>
    c486:	60 93 65 12 	sts	0x1265, r22	; 0x801265 <current_position+0x4>
    c48a:	70 93 66 12 	sts	0x1266, r23	; 0x801266 <current_position+0x5>
    c48e:	80 93 67 12 	sts	0x1267, r24	; 0x801267 <current_position+0x6>
    c492:	90 93 68 12 	sts	0x1268, r25	; 0x801268 <current_position+0x7>
    }
}
    c496:	08 95       	ret

0000c498 <menu_item_leave()>:
	}
	menu_item++;
}

bool __attribute__((noinline)) menu_item_leave(){
    return ((menu_item == menu_line) && menu_clicked && (lcd_encoder == menu_item)) || menu_leaving;
    c498:	80 91 63 04 	lds	r24, 0x0463	; 0x800463 <menu_item>
    c49c:	90 91 62 04 	lds	r25, 0x0462	; 0x800462 <menu_line>
    c4a0:	89 13       	cpse	r24, r25
    c4a2:	0b c0       	rjmp	.+22     	; 0xc4ba <menu_item_leave()+0x22>
    c4a4:	90 91 61 04 	lds	r25, 0x0461	; 0x800461 <menu_clicked>
    c4a8:	99 23       	and	r25, r25
    c4aa:	39 f0       	breq	.+14     	; 0xc4ba <menu_item_leave()+0x22>
    c4ac:	20 91 1e 06 	lds	r18, 0x061E	; 0x80061e <lcd_encoder>
    c4b0:	30 91 1f 06 	lds	r19, 0x061F	; 0x80061f <lcd_encoder+0x1>
    c4b4:	82 17       	cp	r24, r18
    c4b6:	13 06       	cpc	r1, r19
    c4b8:	39 f0       	breq	.+14     	; 0xc4c8 <menu_item_leave()+0x30>
    c4ba:	81 e0       	ldi	r24, 0x01	; 1
    c4bc:	90 91 c4 03 	lds	r25, 0x03C4	; 0x8003c4 <menu_leaving>
    c4c0:	91 11       	cpse	r25, r1
    c4c2:	03 c0       	rjmp	.+6      	; 0xc4ca <menu_item_leave()+0x32>
    c4c4:	80 e0       	ldi	r24, 0x00	; 0
    c4c6:	08 95       	ret
    c4c8:	81 e0       	ldi	r24, 0x01	; 1
}
    c4ca:	08 95       	ret

0000c4cc <menu_selection_mark() [clone .lto_priv.401]>:
	menu_line = 0; // prevent subsequent menu items from rendering at all in the current MENU_BEGIN() for loop cycle
	menu_clicked = 0; // prevent subsequent items from being able to be clicked in case the current menu or position was changed by the clicked menu item
}

static char menu_selection_mark(){
	return (lcd_encoder == menu_item)?'>':' ';
    c4cc:	20 91 63 04 	lds	r18, 0x0463	; 0x800463 <menu_item>
    c4d0:	80 91 1e 06 	lds	r24, 0x061E	; 0x80061e <lcd_encoder>
    c4d4:	90 91 1f 06 	lds	r25, 0x061F	; 0x80061f <lcd_encoder+0x1>
    c4d8:	28 17       	cp	r18, r24
    c4da:	19 06       	cpc	r1, r25
    c4dc:	11 f0       	breq	.+4      	; 0xc4e2 <menu_selection_mark() [clone .lto_priv.401]+0x16>
    c4de:	80 e2       	ldi	r24, 0x20	; 32
    c4e0:	08 95       	ret
    c4e2:	8e e3       	ldi	r24, 0x3E	; 62
}
    c4e4:	08 95       	ret

0000c4e6 <menu_item_ret()>:
	}
}

void menu_item_ret(void)
{
	lcd_draw_update = 2;
    c4e6:	82 e0       	ldi	r24, 0x02	; 2
    c4e8:	80 93 59 02 	sts	0x0259, r24	; 0x800259 <lcd_draw_update>
	menu_item++;
    c4ec:	80 91 63 04 	lds	r24, 0x0463	; 0x800463 <menu_item>
    c4f0:	8f 5f       	subi	r24, 0xFF	; 255
    c4f2:	80 93 63 04 	sts	0x0463, r24	; 0x800463 <menu_item>

	//prevent the rest of the menu items from rendering or getting clicked
	menu_row = LCD_HEIGHT; // early exit from the MENU_BEGIN() for loop at the end of the current cycle
    c4f6:	84 e0       	ldi	r24, 0x04	; 4
    c4f8:	80 93 60 04 	sts	0x0460, r24	; 0x800460 <menu_row>
	menu_line = 0; // prevent subsequent menu items from rendering at all in the current MENU_BEGIN() for loop cycle
    c4fc:	10 92 62 04 	sts	0x0462, r1	; 0x800462 <menu_line>
	menu_clicked = 0; // prevent subsequent items from being able to be clicked in case the current menu or position was changed by the clicked menu item
    c500:	10 92 61 04 	sts	0x0461, r1	; 0x800461 <menu_clicked>
}
    c504:	08 95       	ret

0000c506 <menu_end()>:
    menu_clicked = lcd_clicked(); // Consume click event
}

void menu_end(void)
{
	if (menu_row >= LCD_HEIGHT)
    c506:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
    c50a:	84 30       	cpi	r24, 0x04	; 4
    c50c:	38 f5       	brcc	.+78     	; 0xc55c <menu_end()+0x56>
	{
		// Early abort if the menu was clicked. The current menu might have changed because of the click event
		return;
	}
	if (lcd_encoder >= menu_item)
    c50e:	80 91 63 04 	lds	r24, 0x0463	; 0x800463 <menu_item>
    c512:	90 e0       	ldi	r25, 0x00	; 0
    c514:	20 91 1e 06 	lds	r18, 0x061E	; 0x80061e <lcd_encoder>
    c518:	30 91 1f 06 	lds	r19, 0x061F	; 0x80061f <lcd_encoder+0x1>
    c51c:	28 17       	cp	r18, r24
    c51e:	39 07       	cpc	r19, r25
    c520:	44 f0       	brlt	.+16     	; 0xc532 <menu_end()+0x2c>
	{
		lcd_encoder = menu_item - 1;
    c522:	01 97       	sbiw	r24, 0x01	; 1
    c524:	90 93 1f 06 	sts	0x061F, r25	; 0x80061f <lcd_encoder+0x1>
    c528:	80 93 1e 06 	sts	0x061E, r24	; 0x80061e <lcd_encoder>
		Sound_MakeSound(e_SOUND_TYPE_BlindAlert);
    c52c:	87 e0       	ldi	r24, 0x07	; 7
    c52e:	0f 94 ad 25 	call	0x24b5a	; 0x24b5a <Sound_MakeSound(eSOUND_TYPE)>
	}
	if (((uint8_t)lcd_encoder) >= menu_top + LCD_HEIGHT)
    c532:	80 91 1e 06 	lds	r24, 0x061E	; 0x80061e <lcd_encoder>
    c536:	20 91 92 03 	lds	r18, 0x0392	; 0x800392 <menu_top>
    c53a:	30 e0       	ldi	r19, 0x00	; 0
    c53c:	2d 5f       	subi	r18, 0xFD	; 253
    c53e:	3f 4f       	sbci	r19, 0xFF	; 255
    c540:	82 17       	cp	r24, r18
    c542:	13 06       	cpc	r1, r19
    c544:	59 f0       	breq	.+22     	; 0xc55c <menu_end()+0x56>
    c546:	54 f0       	brlt	.+20     	; 0xc55c <menu_end()+0x56>
	{
		menu_top = lcd_encoder - LCD_HEIGHT + 1;
    c548:	9d ef       	ldi	r25, 0xFD	; 253
    c54a:	98 0f       	add	r25, r24
    c54c:	90 93 92 03 	sts	0x0392, r25	; 0x800392 <menu_top>
		menu_line = menu_top - 1;
    c550:	84 50       	subi	r24, 0x04	; 4
    c552:	80 93 62 04 	sts	0x0462, r24	; 0x800462 <menu_line>
		menu_row = -1;
    c556:	8f ef       	ldi	r24, 0xFF	; 255
    c558:	80 93 60 04 	sts	0x0460, r24	; 0x800460 <menu_row>
	}
}
    c55c:	08 95       	ret

0000c55e <menu_data_reset()>:

void menu_data_reset(void)
{
	// Resets the global shared C union.
	// This ensures, that the menu entered will find out, that it shall initialize itself.
	memset(&menu_data, 0, sizeof(menu_data));
    c55e:	e6 e9       	ldi	r30, 0x96	; 150
    c560:	f3 e0       	ldi	r31, 0x03	; 3
    c562:	80 e2       	ldi	r24, 0x20	; 32
    c564:	df 01       	movw	r26, r30
    c566:	1d 92       	st	X+, r1
    c568:	8a 95       	dec	r24
    c56a:	e9 f7       	brne	.-6      	; 0xc566 <menu_data_reset()+0x8>
}
    c56c:	08 95       	ret

0000c56e <menu_goto(void (*)(), int, bool, bool)>:

void menu_goto(menu_func_t menu, const int16_t encoder, bool reset_menu_state, const bool feedback)
{
    c56e:	cf 93       	push	r28
	CRITICAL_SECTION_START;
    c570:	3f b7       	in	r19, 0x3f	; 63
    c572:	f8 94       	cli
	if (menu_menu != menu)
    c574:	e0 91 02 04 	lds	r30, 0x0402	; 0x800402 <menu_menu>
    c578:	f0 91 03 04 	lds	r31, 0x0403	; 0x800403 <menu_menu+0x1>
    c57c:	e8 17       	cp	r30, r24
    c57e:	f9 07       	cpc	r31, r25
    c580:	c9 f0       	breq	.+50     	; 0xc5b4 <menu_goto(void (*)(), int, bool, bool)+0x46>
    c582:	c4 2f       	mov	r28, r20
	{
		menu_menu = menu;
    c584:	90 93 03 04 	sts	0x0403, r25	; 0x800403 <menu_menu+0x1>
    c588:	80 93 02 04 	sts	0x0402, r24	; 0x800402 <menu_menu>
		lcd_encoder = encoder;
    c58c:	70 93 1f 06 	sts	0x061F, r23	; 0x80061f <lcd_encoder+0x1>
    c590:	60 93 1e 06 	sts	0x061E, r22	; 0x80061e <lcd_encoder>
		menu_top = 0; //reset menu view. Needed if menu_back() is called from deep inside a menu, such as Support
    c594:	10 92 92 03 	sts	0x0392, r1	; 0x800392 <menu_top>
		lcd_draw_update = 2; // Full LCD re-draw
    c598:	82 e0       	ldi	r24, 0x02	; 2
    c59a:	80 93 59 02 	sts	0x0259, r24	; 0x800259 <lcd_draw_update>
		CRITICAL_SECTION_END;
    c59e:	3f bf       	out	0x3f, r19	; 63
		if (feedback) lcd_beeper_quick_feedback();
    c5a0:	22 23       	and	r18, r18
    c5a2:	19 f0       	breq	.+6      	; 0xc5aa <menu_goto(void (*)(), int, bool, bool)+0x3c>
	}
    return clicked;
}

void lcd_beeper_quick_feedback(void) {
	Sound_MakeSound(e_SOUND_TYPE_ButtonEcho);
    c5a4:	80 e0       	ldi	r24, 0x00	; 0
    c5a6:	0f 94 ad 25 	call	0x24b5a	; 0x24b5a <Sound_MakeSound(eSOUND_TYPE)>
		if (reset_menu_state) menu_data_reset();
    c5aa:	cc 23       	and	r28, r28
    c5ac:	21 f0       	breq	.+8      	; 0xc5b6 <menu_goto(void (*)(), int, bool, bool)+0x48>
	}
	else
		CRITICAL_SECTION_END;
}
    c5ae:	cf 91       	pop	r28
		lcd_encoder = encoder;
		menu_top = 0; //reset menu view. Needed if menu_back() is called from deep inside a menu, such as Support
		lcd_draw_update = 2; // Full LCD re-draw
		CRITICAL_SECTION_END;
		if (feedback) lcd_beeper_quick_feedback();
		if (reset_menu_state) menu_data_reset();
    c5b0:	0c 94 af 62 	jmp	0xc55e	; 0xc55e <menu_data_reset()>
	}
	else
		CRITICAL_SECTION_END;
    c5b4:	3f bf       	out	0x3f, r19	; 63
}
    c5b6:	cf 91       	pop	r28
    c5b8:	08 95       	ret

0000c5ba <menu_submenu(void (*)(), bool)>:
	if (lcd_clicked())
		menu_back();
}

void menu_submenu(menu_func_t submenu, const bool feedback)
{
    c5ba:	dc 01       	movw	r26, r24
    c5bc:	26 2f       	mov	r18, r22
	if (menu_depth < MENU_DEPTH_MAX)
    c5be:	90 91 df 03 	lds	r25, 0x03DF	; 0x8003df <menu_depth>
    c5c2:	97 30       	cpi	r25, 0x07	; 7
    c5c4:	d8 f4       	brcc	.+54     	; 0xc5fc <menu_submenu(void (*)(), bool)+0x42>
	{
		menu_stack[menu_depth].menu = menu_menu;
    c5c6:	49 2f       	mov	r20, r25
    c5c8:	50 e0       	ldi	r21, 0x00	; 0
    c5ca:	fa 01       	movw	r30, r20
    c5cc:	ee 0f       	add	r30, r30
    c5ce:	ff 1f       	adc	r31, r31
    c5d0:	e4 0f       	add	r30, r20
    c5d2:	f5 1f       	adc	r31, r21
    c5d4:	e9 5a       	subi	r30, 0xA9	; 169
    c5d6:	fc 4f       	sbci	r31, 0xFC	; 252
    c5d8:	40 91 02 04 	lds	r20, 0x0402	; 0x800402 <menu_menu>
    c5dc:	50 91 03 04 	lds	r21, 0x0403	; 0x800403 <menu_menu+0x1>
    c5e0:	51 83       	std	Z+1, r21	; 0x01
    c5e2:	40 83       	st	Z, r20
		menu_stack[menu_depth++].position = lcd_encoder;
    c5e4:	80 91 1e 06 	lds	r24, 0x061E	; 0x80061e <lcd_encoder>
    c5e8:	9f 5f       	subi	r25, 0xFF	; 255
    c5ea:	90 93 df 03 	sts	0x03DF, r25	; 0x8003df <menu_depth>
    c5ee:	82 83       	std	Z+2, r24	; 0x02
		menu_goto(submenu, 0, true, feedback);
    c5f0:	41 e0       	ldi	r20, 0x01	; 1
    c5f2:	70 e0       	ldi	r23, 0x00	; 0
    c5f4:	60 e0       	ldi	r22, 0x00	; 0
    c5f6:	cd 01       	movw	r24, r26
    c5f8:	0c 94 b7 62 	jmp	0xc56e	; 0xc56e <menu_goto(void (*)(), int, bool, bool)>
	}
}
    c5fc:	08 95       	ret

0000c5fe <menu_back(unsigned char)>:
		menu_row = -1;
	}
}

void menu_back(uint8_t nLevel)
{
    c5fe:	98 2f       	mov	r25, r24
     menu_depth = ((menu_depth > nLevel) ? (menu_depth - nLevel) : 0);
    c600:	80 91 df 03 	lds	r24, 0x03DF	; 0x8003df <menu_depth>
    c604:	98 17       	cp	r25, r24
    c606:	a8 f4       	brcc	.+42     	; 0xc632 <menu_back(unsigned char)+0x34>
    c608:	89 1b       	sub	r24, r25
    c60a:	80 93 df 03 	sts	0x03DF, r24	; 0x8003df <menu_depth>
     menu_goto(menu_stack[menu_depth].menu, menu_stack[menu_depth].position, true);
    c60e:	90 e0       	ldi	r25, 0x00	; 0
    c610:	fc 01       	movw	r30, r24
    c612:	ee 0f       	add	r30, r30
    c614:	ff 1f       	adc	r31, r31
    c616:	e8 0f       	add	r30, r24
    c618:	f9 1f       	adc	r31, r25
    c61a:	e9 5a       	subi	r30, 0xA9	; 169
    c61c:	fc 4f       	sbci	r31, 0xFC	; 252
    c61e:	62 81       	ldd	r22, Z+2	; 0x02
    c620:	06 2e       	mov	r0, r22
    c622:	00 0c       	add	r0, r0
    c624:	77 0b       	sbc	r23, r23
    c626:	20 e0       	ldi	r18, 0x00	; 0
    c628:	41 e0       	ldi	r20, 0x01	; 1
    c62a:	80 81       	ld	r24, Z
    c62c:	91 81       	ldd	r25, Z+1	; 0x01
    c62e:	0c 94 b7 62 	jmp	0xc56e	; 0xc56e <menu_goto(void (*)(), int, bool, bool)>
	}
}

void menu_back(uint8_t nLevel)
{
     menu_depth = ((menu_depth > nLevel) ? (menu_depth - nLevel) : 0);
    c632:	80 e0       	ldi	r24, 0x00	; 0
    c634:	ea cf       	rjmp	.-44     	; 0xc60a <menu_back(unsigned char)+0xc>

0000c636 <menu_back()>:
     menu_goto(menu_stack[menu_depth].menu, menu_stack[menu_depth].position, true);
}

void menu_back(void)
{
menu_back(1);
    c636:	81 e0       	ldi	r24, 0x01	; 1
    c638:	0c 94 ff 62 	jmp	0xc5fe	; 0xc5fe <menu_back(unsigned char)>

0000c63c <__vector_36>:
#endif //DEBUG_DUMP_TO_2ND_SERIAL
	}
}

ISR(USART1_RX_vect)
{
    c63c:	1f 92       	push	r1
    c63e:	0f 92       	push	r0
    c640:	0f b6       	in	r0, 0x3f	; 63
    c642:	0f 92       	push	r0
    c644:	11 24       	eor	r1, r1
    c646:	0b b6       	in	r0, 0x3b	; 59
    c648:	0f 92       	push	r0
    c64a:	2f 93       	push	r18
    c64c:	3f 93       	push	r19
    c64e:	4f 93       	push	r20
    c650:	6f 93       	push	r22
    c652:	7f 93       	push	r23
    c654:	8f 93       	push	r24
    c656:	9f 93       	push	r25
    c658:	ef 93       	push	r30
    c65a:	ff 93       	push	r31
	// Test for a framing error.
	if (UCSR1A & (1<<FE1))
    c65c:	80 91 c8 00 	lds	r24, 0x00C8	; 0x8000c8 <__TEXT_REGION_LENGTH__+0x7c20c8>
    c660:	84 ff       	sbrs	r24, 4
    c662:	12 c0       	rjmp	.+36     	; 0xc688 <__vector_36+0x4c>
	{
		// Characters received with the framing errors will be ignored.
		// Dummy register read (discard)
		(void)(*(char *)UDR1);
    c664:	80 91 ce 00 	lds	r24, 0x00CE	; 0x8000ce <__TEXT_REGION_LENGTH__+0x7c20ce>
			store_char(c);
#ifdef DEBUG_DUMP_TO_2ND_SERIAL
		M_UDRx = c;
#endif //DEBUG_DUMP_TO_2ND_SERIAL
	}
}
    c668:	ff 91       	pop	r31
    c66a:	ef 91       	pop	r30
    c66c:	9f 91       	pop	r25
    c66e:	8f 91       	pop	r24
    c670:	7f 91       	pop	r23
    c672:	6f 91       	pop	r22
    c674:	4f 91       	pop	r20
    c676:	3f 91       	pop	r19
    c678:	2f 91       	pop	r18
    c67a:	0f 90       	pop	r0
    c67c:	0b be       	out	0x3b, r0	; 59
    c67e:	0f 90       	pop	r0
    c680:	0f be       	out	0x3f, r0	; 63
    c682:	0f 90       	pop	r0
    c684:	1f 90       	pop	r1
    c686:	18 95       	reti
		(void)(*(char *)UDR1);
	}
	else
	{
		// Read the input register.
		unsigned char c = UDR1;
    c688:	40 91 ce 00 	lds	r20, 0x00CE	; 0x8000ce <__TEXT_REGION_LENGTH__+0x7c20ce>
		if (selectedSerialPort == 1)
    c68c:	80 91 1c 06 	lds	r24, 0x061C	; 0x80061c <selectedSerialPort>
    c690:	81 30       	cpi	r24, 0x01	; 1
    c692:	51 f7       	brne	.-44     	; 0xc668 <__vector_36+0x2c>
  ring_buffer rx_buffer  =  { { 0 }, 0, 0 };
#endif

FORCE_INLINE void store_char(unsigned char c)
{
  int i = (unsigned int)(rx_buffer.head + 1) % RX_BUFFER_SIZE;
    c694:	20 91 42 05 	lds	r18, 0x0542	; 0x800542 <rx_buffer+0x80>
    c698:	30 91 43 05 	lds	r19, 0x0543	; 0x800543 <rx_buffer+0x81>
    c69c:	c9 01       	movw	r24, r18
    c69e:	01 96       	adiw	r24, 0x01	; 1
    c6a0:	8f 77       	andi	r24, 0x7F	; 127
    c6a2:	99 27       	eor	r25, r25

  // if we should be storing the received character into the location
  // just before the tail (meaning that the head would advance to the
  // current location of the tail), we're about to overflow the buffer
  // and so we don't write the character or advance the head.
  if (i != rx_buffer.tail) {
    c6a4:	60 91 44 05 	lds	r22, 0x0544	; 0x800544 <rx_buffer+0x82>
    c6a8:	70 91 45 05 	lds	r23, 0x0545	; 0x800545 <rx_buffer+0x83>
    c6ac:	86 17       	cp	r24, r22
    c6ae:	97 07       	cpc	r25, r23
    c6b0:	d9 f2       	breq	.-74     	; 0xc668 <__vector_36+0x2c>
    rx_buffer.buffer[rx_buffer.head] = c;
    c6b2:	2e 53       	subi	r18, 0x3E	; 62
    c6b4:	3b 4f       	sbci	r19, 0xFB	; 251
    c6b6:	f9 01       	movw	r30, r18
    c6b8:	40 83       	st	Z, r20
    rx_buffer.head = i;
    c6ba:	90 93 43 05 	sts	0x0543, r25	; 0x800543 <rx_buffer+0x81>
    c6be:	80 93 42 05 	sts	0x0542, r24	; 0x800542 <rx_buffer+0x80>
    c6c2:	d2 cf       	rjmp	.-92     	; 0xc668 <__vector_36+0x2c>

0000c6c4 <__vector_25>:
// ticks at maximum 11.76 kHz and blocks for 2.688 us at each tick.
// If the serial line is fully utilized, this corresponds to 3.16%
// loading of the CPU (the interrupt invocation overhead not taken into account).
// As the serial line is not fully utilized, the CPU load is likely around 1%.
ISR(M_USARTx_RX_vect)
{
    c6c4:	1f 92       	push	r1
    c6c6:	0f 92       	push	r0
    c6c8:	0f b6       	in	r0, 0x3f	; 63
    c6ca:	0f 92       	push	r0
    c6cc:	11 24       	eor	r1, r1
    c6ce:	0b b6       	in	r0, 0x3b	; 59
    c6d0:	0f 92       	push	r0
    c6d2:	2f 93       	push	r18
    c6d4:	3f 93       	push	r19
    c6d6:	4f 93       	push	r20
    c6d8:	6f 93       	push	r22
    c6da:	7f 93       	push	r23
    c6dc:	8f 93       	push	r24
    c6de:	9f 93       	push	r25
    c6e0:	ef 93       	push	r30
    c6e2:	ff 93       	push	r31
	// Test for a framing error.
	if (M_UCSRxA & (1<<M_FEx))
    c6e4:	80 91 c0 00 	lds	r24, 0x00C0	; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7c20c0>
    c6e8:	84 ff       	sbrs	r24, 4
    c6ea:	12 c0       	rjmp	.+36     	; 0xc710 <__vector_25+0x4c>
	{
		// Characters received with the framing errors will be ignored.
		// Dummy register read (discard)
		(void)(*(char *)M_UDRx);
    c6ec:	80 91 c6 00 	lds	r24, 0x00C6	; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7c20c6>
			store_char(c);
#ifdef DEBUG_DUMP_TO_2ND_SERIAL
		UDR1 = c;
#endif //DEBUG_DUMP_TO_2ND_SERIAL
	}
}
    c6f0:	ff 91       	pop	r31
    c6f2:	ef 91       	pop	r30
    c6f4:	9f 91       	pop	r25
    c6f6:	8f 91       	pop	r24
    c6f8:	7f 91       	pop	r23
    c6fa:	6f 91       	pop	r22
    c6fc:	4f 91       	pop	r20
    c6fe:	3f 91       	pop	r19
    c700:	2f 91       	pop	r18
    c702:	0f 90       	pop	r0
    c704:	0b be       	out	0x3b, r0	; 59
    c706:	0f 90       	pop	r0
    c708:	0f be       	out	0x3f, r0	; 63
    c70a:	0f 90       	pop	r0
    c70c:	1f 90       	pop	r1
    c70e:	18 95       	reti
		(void)(*(char *)M_UDRx);
	}
	else
	{
		// Read the input register.
		unsigned char c = M_UDRx;
    c710:	40 91 c6 00 	lds	r20, 0x00C6	; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7c20c6>
		if (selectedSerialPort == 0)
    c714:	80 91 1c 06 	lds	r24, 0x061C	; 0x80061c <selectedSerialPort>
    c718:	81 11       	cpse	r24, r1
    c71a:	ea cf       	rjmp	.-44     	; 0xc6f0 <__vector_25+0x2c>
  ring_buffer rx_buffer  =  { { 0 }, 0, 0 };
#endif

FORCE_INLINE void store_char(unsigned char c)
{
  int i = (unsigned int)(rx_buffer.head + 1) % RX_BUFFER_SIZE;
    c71c:	20 91 42 05 	lds	r18, 0x0542	; 0x800542 <rx_buffer+0x80>
    c720:	30 91 43 05 	lds	r19, 0x0543	; 0x800543 <rx_buffer+0x81>
    c724:	c9 01       	movw	r24, r18
    c726:	01 96       	adiw	r24, 0x01	; 1
    c728:	8f 77       	andi	r24, 0x7F	; 127
    c72a:	99 27       	eor	r25, r25

  // if we should be storing the received character into the location
  // just before the tail (meaning that the head would advance to the
  // current location of the tail), we're about to overflow the buffer
  // and so we don't write the character or advance the head.
  if (i != rx_buffer.tail) {
    c72c:	60 91 44 05 	lds	r22, 0x0544	; 0x800544 <rx_buffer+0x82>
    c730:	70 91 45 05 	lds	r23, 0x0545	; 0x800545 <rx_buffer+0x83>
    c734:	86 17       	cp	r24, r22
    c736:	97 07       	cpc	r25, r23
    c738:	d9 f2       	breq	.-74     	; 0xc6f0 <__vector_25+0x2c>
    rx_buffer.buffer[rx_buffer.head] = c;
    c73a:	2e 53       	subi	r18, 0x3E	; 62
    c73c:	3b 4f       	sbci	r19, 0xFB	; 251
    c73e:	f9 01       	movw	r30, r18
    c740:	40 83       	st	Z, r20
    rx_buffer.head = i;
    c742:	90 93 43 05 	sts	0x0543, r25	; 0x800543 <rx_buffer+0x81>
    c746:	80 93 42 05 	sts	0x0542, r24	; 0x800542 <rx_buffer+0x80>
    c74a:	d2 cf       	rjmp	.-92     	; 0xc6f0 <__vector_25+0x2c>

0000c74c <refresh_print_state_in_ram() [clone .part.39]>:
/// This function should backup variables which may be lost
/// For example a power panic in M600 or during MMU error
void refresh_print_state_in_ram()
{
    if (saved_printing) return;
    memcpy(saved_pos, current_position, sizeof(saved_pos));
    c74c:	80 e1       	ldi	r24, 0x10	; 16
    c74e:	e1 e6       	ldi	r30, 0x61	; 97
    c750:	f2 e1       	ldi	r31, 0x12	; 18
    c752:	a0 e9       	ldi	r26, 0x90	; 144
    c754:	b2 e0       	ldi	r27, 0x02	; 2
    c756:	01 90       	ld	r0, Z+
    c758:	0d 92       	st	X+, r0
    c75a:	8a 95       	dec	r24
    c75c:	e1 f7       	brne	.-8      	; 0xc756 <refresh_print_state_in_ram() [clone .part.39]+0xa>
    saved_feedmultiply2 = feedmultiply; //save feedmultiply
    c75e:	80 91 8e 02 	lds	r24, 0x028E	; 0x80028e <feedmultiply>
    c762:	90 91 8f 02 	lds	r25, 0x028F	; 0x80028f <feedmultiply+0x1>
    c766:	90 93 60 12 	sts	0x1260, r25	; 0x801260 <_ZL19saved_feedmultiply2.lto_priv.498+0x1>
    c76a:	80 93 5f 12 	sts	0x125F, r24	; 0x80125f <_ZL19saved_feedmultiply2.lto_priv.498>
    saved_extruder_temperature = (uint16_t)degTargetHotend(active_extruder);
    c76e:	80 91 5d 12 	lds	r24, 0x125D	; 0x80125d <target_temperature>
    c772:	90 91 5e 12 	lds	r25, 0x125E	; 0x80125e <target_temperature+0x1>
    c776:	90 93 5c 12 	sts	0x125C, r25	; 0x80125c <saved_extruder_temperature+0x1>
    c77a:	80 93 5b 12 	sts	0x125B, r24	; 0x80125b <saved_extruder_temperature>
    saved_bed_temperature = (uint8_t)degTargetBed();
    c77e:	80 91 59 12 	lds	r24, 0x1259	; 0x801259 <target_temperature_bed>
    c782:	80 93 58 12 	sts	0x1258, r24	; 0x801258 <saved_bed_temperature>
    saved_extruder_relative_mode = axis_relative_modes & E_AXIS_MASK;
    c786:	80 91 57 12 	lds	r24, 0x1257	; 0x801257 <axis_relative_modes>
    c78a:	83 fb       	bst	r24, 3
    c78c:	88 27       	eor	r24, r24
    c78e:	80 f9       	bld	r24, 0
    c790:	80 93 56 12 	sts	0x1256, r24	; 0x801256 <saved_extruder_relative_mode>
    saved_fan_speed = fanSpeed;
    c794:	80 91 55 12 	lds	r24, 0x1255	; 0x801255 <fanSpeed>
    c798:	80 93 54 12 	sts	0x1254, r24	; 0x801254 <saved_fan_speed>
    isPartialBackupAvailable = true;
}
    c79c:	08 95       	ret

0000c79e <_GLOBAL__sub_D_card>:
    while(!lcd_clicked())
    {
        delay_keep_alive(0);
    }
    KEEPALIVE_STATE(busy_state_backup);
}
    c79e:	cf 93       	push	r28
    c7a0:	df 93       	push	r29
//------------------------------------------------------------------------------
/**
 * \class SdFile
 * \brief SdBaseFile with Print.
 */
class SdFile : public SdBaseFile/*, public Print*/ {
    c7a2:	87 e6       	ldi	r24, 0x67	; 103
    c7a4:	96 e1       	ldi	r25, 0x16	; 22
    c7a6:	0e 94 ab 79 	call	0xf356	; 0xf356 <SdBaseFile::~SdBaseFile()>
#ifdef SDSUPPORT

#define MAX_DIR_DEPTH 6

#include "SdFile.h"
class CardReader
    c7aa:	85 ea       	ldi	r24, 0xA5	; 165
    c7ac:	94 e1       	ldi	r25, 0x14	; 20
    c7ae:	89 2b       	or	r24, r25
    c7b0:	51 f0       	breq	.+20     	; 0xc7c6 <_GLOBAL__sub_D_card+0x28>
    c7b2:	c7 e7       	ldi	r28, 0x77	; 119
    c7b4:	d5 e1       	ldi	r29, 0x15	; 21
    c7b6:	a3 97       	sbiw	r28, 0x23	; 35
    c7b8:	ce 01       	movw	r24, r28
    c7ba:	0e 94 ab 79 	call	0xf356	; 0xf356 <SdBaseFile::~SdBaseFile()>
    c7be:	84 e1       	ldi	r24, 0x14	; 20
    c7c0:	c5 3a       	cpi	r28, 0xA5	; 165
    c7c2:	d8 07       	cpc	r29, r24
    c7c4:	c1 f7       	brne	.-16     	; 0xc7b6 <_GLOBAL__sub_D_card+0x18>
    c7c6:	82 e8       	ldi	r24, 0x82	; 130
    c7c8:	94 e1       	ldi	r25, 0x14	; 20
    c7ca:	0e 94 ab 79 	call	0xf356	; 0xf356 <SdBaseFile::~SdBaseFile()>
    c7ce:	8d e5       	ldi	r24, 0x5D	; 93
    c7d0:	94 e1       	ldi	r25, 0x14	; 20
    c7d2:	df 91       	pop	r29
    c7d4:	cf 91       	pop	r28
    c7d6:	0c 94 ab 79 	jmp	0xf356	; 0xf356 <SdBaseFile::~SdBaseFile()>

0000c7da <load_filament_final_feed()>:
    print_time_to_change_normal = PRINT_TIME_REMAINING_INIT;
    print_time_to_change_silent = PRINT_TIME_REMAINING_INIT;
}

void load_filament_final_feed()
{
    c7da:	cf 93       	push	r28
    c7dc:	df 93       	push	r29
	current_position[E_AXIS]+= FILAMENTCHANGE_FINALFEED;
    c7de:	c1 e6       	ldi	r28, 0x61	; 97
    c7e0:	d2 e1       	ldi	r29, 0x12	; 18
    c7e2:	20 e0       	ldi	r18, 0x00	; 0
    c7e4:	30 e0       	ldi	r19, 0x00	; 0
    c7e6:	48 ec       	ldi	r20, 0xC8	; 200
    c7e8:	51 e4       	ldi	r21, 0x41	; 65
    c7ea:	6c 85       	ldd	r22, Y+12	; 0x0c
    c7ec:	7d 85       	ldd	r23, Y+13	; 0x0d
    c7ee:	8e 85       	ldd	r24, Y+14	; 0x0e
    c7f0:	9f 85       	ldd	r25, Y+15	; 0x0f
    c7f2:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    c7f6:	6c 87       	std	Y+12, r22	; 0x0c
    c7f8:	7d 87       	std	Y+13, r23	; 0x0d
    c7fa:	8e 87       	std	Y+14, r24	; 0x0e
    c7fc:	9f 87       	std	Y+15, r25	; 0x0f
	plan_buffer_line_curposXYZE(FILAMENTCHANGE_EFEED_FINAL);
    c7fe:	63 e3       	ldi	r22, 0x33	; 51
    c800:	73 e3       	ldi	r23, 0x33	; 51
    c802:	83 e5       	ldi	r24, 0x53	; 83
    c804:	90 e4       	ldi	r25, 0x40	; 64
}
    c806:	df 91       	pop	r29
    c808:	cf 91       	pop	r28
}

void load_filament_final_feed()
{
	current_position[E_AXIS]+= FILAMENTCHANGE_FINALFEED;
	plan_buffer_line_curposXYZE(FILAMENTCHANGE_EFEED_FINAL);
    c80a:	0d 94 81 4c 	jmp	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>

0000c80e <cancel_saved_printing()>:
        if (previous_value != value) {
            eeprom_byte_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_byte(dst, value);
    c80e:	60 e0       	ldi	r22, 0x00	; 0
    c810:	85 ea       	ldi	r24, 0xA5	; 165
    c812:	9f e0       	ldi	r25, 0x0F	; 15
    c814:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
    c818:	60 e0       	ldi	r22, 0x00	; 0
    c81a:	8f e7       	ldi	r24, 0x7F	; 127
    c81c:	9c e0       	ldi	r25, 0x0C	; 12
    c81e:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
// Cancel the state related to a currently saved print
void cancel_saved_printing()
{
    eeprom_update_byte_notify((uint8_t*)EEPROM_UVLO, PowerPanic::NO_PENDING_RECOVERY);
    eeprom_update_byte_notify((uint8_t*)EEPROM_UVLO_Z_LIFTED, 0);
    saved_start_position[0] = SAVED_START_POSITION_UNSET;
    c822:	80 e0       	ldi	r24, 0x00	; 0
    c824:	90 e0       	ldi	r25, 0x00	; 0
    c826:	a0 e8       	ldi	r26, 0x80	; 128
    c828:	bf eb       	ldi	r27, 0xBF	; 191
    c82a:	80 93 7e 02 	sts	0x027E, r24	; 0x80027e <saved_start_position>
    c82e:	90 93 7f 02 	sts	0x027F, r25	; 0x80027f <saved_start_position+0x1>
    c832:	a0 93 80 02 	sts	0x0280, r26	; 0x800280 <saved_start_position+0x2>
    c836:	b0 93 81 02 	sts	0x0281, r27	; 0x800281 <saved_start_position+0x3>
    saved_printing_type = PowerPanic::PRINT_TYPE_NONE;
    c83a:	82 e0       	ldi	r24, 0x02	; 2
    c83c:	80 93 79 02 	sts	0x0279, r24	; 0x800279 <saved_printing_type>
    saved_printing = false;
    c840:	10 92 73 12 	sts	0x1273, r1	; 0x801273 <saved_printing>
}
    c844:	08 95       	ret

0000c846 <restore_extruder_temperature_from_ram()>:

    enquecommandf_P(MSG_M23, filename);
}

void restore_extruder_temperature_from_ram() {
    if ((uint16_t)degTargetHotend(active_extruder) != saved_extruder_temperature)
    c846:	80 91 5b 12 	lds	r24, 0x125B	; 0x80125b <saved_extruder_temperature>
    c84a:	90 91 5c 12 	lds	r25, 0x125C	; 0x80125c <saved_extruder_temperature+0x1>
    c84e:	20 91 5d 12 	lds	r18, 0x125D	; 0x80125d <target_temperature>
    c852:	30 91 5e 12 	lds	r19, 0x125E	; 0x80125e <target_temperature+0x1>
    c856:	28 17       	cp	r18, r24
    c858:	39 07       	cpc	r19, r25
    c85a:	71 f0       	breq	.+28     	; 0xc878 <restore_extruder_temperature_from_ram()+0x32>
  return target_temperature_bed;
};

// Doesn't save FLASH when FORCE_INLINE removed.
FORCE_INLINE void setTargetHotend(const float &celsius) {
  target_temperature[0] = celsius;
    c85c:	90 93 5e 12 	sts	0x125E, r25	; 0x80125e <target_temperature+0x1>
    c860:	80 93 5d 12 	sts	0x125D, r24	; 0x80125d <target_temperature>
    {
        setTargetHotend(saved_extruder_temperature);
        heating_status = HeatingStatus::EXTRUDER_HEATING;
    c864:	81 e0       	ldi	r24, 0x01	; 1
    c866:	80 93 cb 03 	sts	0x03CB, r24	; 0x8003cb <heating_status>
        wait_for_heater(_millis(), active_extruder);
    c86a:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
    c86e:	0f 94 85 74 	call	0x2e90a	; 0x2e90a <wait_for_heater(long, unsigned char) [clone .constprop.190]>
        heating_status = HeatingStatus::EXTRUDER_HEATING_COMPLETE;
    c872:	82 e0       	ldi	r24, 0x02	; 2
    c874:	80 93 cb 03 	sts	0x03CB, r24	; 0x8003cb <heating_status>
    }
}
    c878:	08 95       	ret

0000c87a <refresh_saved_feedrate_multiplier_in_ram()>:
    saved_fan_speed = fanSpeed;
    isPartialBackupAvailable = true;
}

void __attribute__((noinline)) refresh_saved_feedrate_multiplier_in_ram() {
    if (!saved_printing) {
    c87a:	80 91 73 12 	lds	r24, 0x1273	; 0x801273 <saved_printing>
    c87e:	88 23       	and	r24, r24
    c880:	41 f0       	breq	.+16     	; 0xc892 <refresh_saved_feedrate_multiplier_in_ram()+0x18>
        // There is no saved print, therefore nothing to refresh
        return;
    }

    saved_feedmultiply2 = feedmultiply;
    c882:	80 91 8e 02 	lds	r24, 0x028E	; 0x80028e <feedmultiply>
    c886:	90 91 8f 02 	lds	r25, 0x028F	; 0x80028f <feedmultiply+0x1>
    c88a:	90 93 60 12 	sts	0x1260, r25	; 0x801260 <_ZL19saved_feedmultiply2.lto_priv.498+0x1>
    c88e:	80 93 5f 12 	sts	0x125F, r24	; 0x80125f <_ZL19saved_feedmultiply2.lto_priv.498>
}
    c892:	08 95       	ret

0000c894 <calculate_extruder_multipliers()>:
  if (extrudemultiply != 100)
    out *= float(extrudemultiply) * 0.01f;
  return out;
}

void calculate_extruder_multipliers() {
    c894:	cf 92       	push	r12
    c896:	df 92       	push	r13
    c898:	ef 92       	push	r14
    c89a:	ff 92       	push	r15
	extruder_multiplier[0] = calculate_extruder_multiplier(cs.filament_size[0]);
    c89c:	c0 90 ff 0d 	lds	r12, 0x0DFF	; 0x800dff <cs+0x98>
    c8a0:	d0 90 00 0e 	lds	r13, 0x0E00	; 0x800e00 <cs+0x99>
    c8a4:	e0 90 01 0e 	lds	r14, 0x0E01	; 0x800e01 <cs+0x9a>
    c8a8:	f0 90 02 0e 	lds	r15, 0x0E02	; 0x800e02 <cs+0x9b>
    }
}

float calculate_extruder_multiplier(float diameter) {
  float out = 1.f;
  if (cs.volumetric_enabled && diameter > 0.f) {
    c8ac:	80 91 fe 0d 	lds	r24, 0x0DFE	; 0x800dfe <cs+0x97>
    c8b0:	88 23       	and	r24, r24
    c8b2:	09 f4       	brne	.+2      	; 0xc8b6 <calculate_extruder_multipliers()+0x22>
    c8b4:	4e c0       	rjmp	.+156    	; 0xc952 <calculate_extruder_multipliers()+0xbe>
    c8b6:	20 e0       	ldi	r18, 0x00	; 0
    c8b8:	30 e0       	ldi	r19, 0x00	; 0
    c8ba:	a9 01       	movw	r20, r18
    c8bc:	c7 01       	movw	r24, r14
    c8be:	b6 01       	movw	r22, r12
    c8c0:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
    c8c4:	18 16       	cp	r1, r24
    c8c6:	0c f0       	brlt	.+2      	; 0xc8ca <calculate_extruder_multipliers()+0x36>
    c8c8:	44 c0       	rjmp	.+136    	; 0xc952 <calculate_extruder_multipliers()+0xbe>
    float area = M_PI * diameter * diameter * 0.25;
    c8ca:	2b ed       	ldi	r18, 0xDB	; 219
    c8cc:	3f e0       	ldi	r19, 0x0F	; 15
    c8ce:	49 e4       	ldi	r20, 0x49	; 73
    c8d0:	50 e4       	ldi	r21, 0x40	; 64
    c8d2:	c7 01       	movw	r24, r14
    c8d4:	b6 01       	movw	r22, r12
    c8d6:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    c8da:	a7 01       	movw	r20, r14
    c8dc:	96 01       	movw	r18, r12
    c8de:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    c8e2:	20 e0       	ldi	r18, 0x00	; 0
    c8e4:	30 e0       	ldi	r19, 0x00	; 0
    c8e6:	40 e8       	ldi	r20, 0x80	; 128
    c8e8:	5e e3       	ldi	r21, 0x3E	; 62
    c8ea:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    c8ee:	9b 01       	movw	r18, r22
    c8f0:	ac 01       	movw	r20, r24
    out = 1.f / area;
    c8f2:	60 e0       	ldi	r22, 0x00	; 0
    c8f4:	70 e0       	ldi	r23, 0x00	; 0
    c8f6:	80 e8       	ldi	r24, 0x80	; 128
    c8f8:	9f e3       	ldi	r25, 0x3F	; 63
    c8fa:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
    c8fe:	6b 01       	movw	r12, r22
    c900:	7c 01       	movw	r14, r24
  }
  if (extrudemultiply != 100)
    c902:	60 91 75 02 	lds	r22, 0x0275	; 0x800275 <extrudemultiply>
    c906:	70 91 76 02 	lds	r23, 0x0276	; 0x800276 <extrudemultiply+0x1>
    c90a:	64 36       	cpi	r22, 0x64	; 100
    c90c:	71 05       	cpc	r23, r1
    c90e:	a1 f0       	breq	.+40     	; 0xc938 <calculate_extruder_multipliers()+0xa4>
    out *= float(extrudemultiply) * 0.01f;
    c910:	07 2e       	mov	r0, r23
    c912:	00 0c       	add	r0, r0
    c914:	88 0b       	sbc	r24, r24
    c916:	99 0b       	sbc	r25, r25
    c918:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
    c91c:	2a e0       	ldi	r18, 0x0A	; 10
    c91e:	37 ed       	ldi	r19, 0xD7	; 215
    c920:	43 e2       	ldi	r20, 0x23	; 35
    c922:	5c e3       	ldi	r21, 0x3C	; 60
    c924:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    c928:	9b 01       	movw	r18, r22
    c92a:	ac 01       	movw	r20, r24
    c92c:	c7 01       	movw	r24, r14
    c92e:	b6 01       	movw	r22, r12
    c930:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    c934:	6b 01       	movw	r12, r22
    c936:	7c 01       	movw	r14, r24
  return out;
}

void calculate_extruder_multipliers() {
	extruder_multiplier[0] = calculate_extruder_multiplier(cs.filament_size[0]);
    c938:	c0 92 10 02 	sts	0x0210, r12	; 0x800210 <extruder_multiplier>
    c93c:	d0 92 11 02 	sts	0x0211, r13	; 0x800211 <extruder_multiplier+0x1>
    c940:	e0 92 12 02 	sts	0x0212, r14	; 0x800212 <extruder_multiplier+0x2>
    c944:	f0 92 13 02 	sts	0x0213, r15	; 0x800213 <extruder_multiplier+0x3>
	extruder_multiplier[1] = calculate_extruder_multiplier(cs.filament_size[1]);
#if EXTRUDERS > 2
	extruder_multiplier[2] = calculate_extruder_multiplier(cs.filament_size[2]);
#endif
#endif
}
    c948:	ff 90       	pop	r15
    c94a:	ef 90       	pop	r14
    c94c:	df 90       	pop	r13
    c94e:	cf 90       	pop	r12
    c950:	08 95       	ret
        MMU2::mmu2.ClearTMCFailures(); // not stored into EEPROM
    }
}

float calculate_extruder_multiplier(float diameter) {
  float out = 1.f;
    c952:	c1 2c       	mov	r12, r1
    c954:	d1 2c       	mov	r13, r1
    c956:	80 e8       	ldi	r24, 0x80	; 128
    c958:	e8 2e       	mov	r14, r24
    c95a:	8f e3       	ldi	r24, 0x3F	; 63
    c95c:	f8 2e       	mov	r15, r24
    c95e:	d1 cf       	rjmp	.-94     	; 0xc902 <calculate_extruder_multipliers()+0x6e>

0000c960 <save_statistics()>:

  }
}
#endif //FAST_PWM_FAN

void save_statistics() {
    c960:	8f 92       	push	r8
    c962:	9f 92       	push	r9
    c964:	af 92       	push	r10
    c966:	bf 92       	push	r11
    c968:	cf 92       	push	r12
    c96a:	df 92       	push	r13
    c96c:	ef 92       	push	r14
    c96e:	ff 92       	push	r15
    uint32_t _previous_filament = eeprom_init_default_dword((uint32_t *)EEPROM_FILAMENTUSED, 0); //_previous_filament unit: centimeter
    c970:	81 ef       	ldi	r24, 0xF1	; 241
    c972:	9f e0       	ldi	r25, 0x0F	; 15
    c974:	0f 94 d8 6c 	call	0x2d9b0	; 0x2d9b0 <eeprom_init_default_dword(unsigned long*, unsigned long) [clone .constprop.222]>
    c978:	6b 01       	movw	r12, r22
    c97a:	7c 01       	movw	r14, r24
    uint32_t _previous_time = eeprom_init_default_dword((uint32_t *)EEPROM_TOTALTIME, 0);        //_previous_time unit: min
    c97c:	8d ee       	ldi	r24, 0xED	; 237
    c97e:	9f e0       	ldi	r25, 0x0F	; 15
    c980:	0f 94 d8 6c 	call	0x2d9b0	; 0x2d9b0 <eeprom_init_default_dword(unsigned long*, unsigned long) [clone .constprop.222]>
    c984:	4b 01       	movw	r8, r22
    c986:	5c 01       	movw	r10, r24

    uint32_t time_minutes = print_job_timer.duration() / 60;
    c988:	0f 94 6d 17 	call	0x22eda	; 0x22eda <Stopwatch::duration()>
    c98c:	2c e3       	ldi	r18, 0x3C	; 60
    c98e:	30 e0       	ldi	r19, 0x00	; 0
    c990:	40 e0       	ldi	r20, 0x00	; 0
    c992:	50 e0       	ldi	r21, 0x00	; 0
    c994:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
    eeprom_update_dword_notify((uint32_t *)EEPROM_TOTALTIME, _previous_time + time_minutes); // EEPROM_TOTALTIME unit: min
    c998:	ba 01       	movw	r22, r20
    c99a:	a9 01       	movw	r20, r18
    c99c:	48 0d       	add	r20, r8
    c99e:	59 1d       	adc	r21, r9
    c9a0:	6a 1d       	adc	r22, r10
    c9a2:	7b 1d       	adc	r23, r11
        if (previous_value != value) {
            eeprom_dword_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_dword(dst, value);
    c9a4:	8d ee       	ldi	r24, 0xED	; 237
    c9a6:	9f e0       	ldi	r25, 0x0F	; 15
    c9a8:	0f 94 16 a4 	call	0x3482c	; 0x3482c <eeprom_update_dword>
    eeprom_update_dword_notify((uint32_t *)EEPROM_FILAMENTUSED, _previous_filament + (total_filament_used / 1000));
    c9ac:	60 91 17 06 	lds	r22, 0x0617	; 0x800617 <total_filament_used>
    c9b0:	70 91 18 06 	lds	r23, 0x0618	; 0x800618 <total_filament_used+0x1>
    c9b4:	80 91 19 06 	lds	r24, 0x0619	; 0x800619 <total_filament_used+0x2>
    c9b8:	90 91 1a 06 	lds	r25, 0x061A	; 0x80061a <total_filament_used+0x3>
    c9bc:	28 ee       	ldi	r18, 0xE8	; 232
    c9be:	33 e0       	ldi	r19, 0x03	; 3
    c9c0:	40 e0       	ldi	r20, 0x00	; 0
    c9c2:	50 e0       	ldi	r21, 0x00	; 0
    c9c4:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
    c9c8:	ba 01       	movw	r22, r20
    c9ca:	a9 01       	movw	r20, r18
    c9cc:	4c 0d       	add	r20, r12
    c9ce:	5d 1d       	adc	r21, r13
    c9d0:	6e 1d       	adc	r22, r14
    c9d2:	7f 1d       	adc	r23, r15
    c9d4:	81 ef       	ldi	r24, 0xF1	; 241
    c9d6:	9f e0       	ldi	r25, 0x0F	; 15
    c9d8:	0f 94 16 a4 	call	0x3482c	; 0x3482c <eeprom_update_dword>

    print_job_timer.reset();
    c9dc:	0f 94 0a 19 	call	0x23214	; 0x23214 <Stopwatch::reset()>
    total_filament_used = 0;
    c9e0:	10 92 17 06 	sts	0x0617, r1	; 0x800617 <total_filament_used>
    c9e4:	10 92 18 06 	sts	0x0618, r1	; 0x800618 <total_filament_used+0x1>
    c9e8:	10 92 19 06 	sts	0x0619, r1	; 0x800619 <total_filament_used+0x2>
    c9ec:	10 92 1a 06 	sts	0x061A, r1	; 0x80061a <total_filament_used+0x3>

    if (MMU2::mmu2.Enabled()) {
    c9f0:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
    c9f4:	81 30       	cpi	r24, 0x01	; 1
    c9f6:	81 f4       	brne	.+32     	; 0xca18 <save_statistics()+0xb8>
        eeprom_add_dword((uint32_t *)EEPROM_MMU_MATERIAL_CHANGES, MMU2::mmu2.ToolChangeCounter());
    c9f8:	60 91 05 13 	lds	r22, 0x1305	; 0x801305 <MMU2::mmu2+0x73>
    c9fc:	70 91 06 13 	lds	r23, 0x1306	; 0x801306 <MMU2::mmu2+0x74>
    ca00:	90 e0       	ldi	r25, 0x00	; 0
    ca02:	80 e0       	ldi	r24, 0x00	; 0
    ca04:	0f 94 c0 6c 	call	0x2d980	; 0x2d980 <eeprom_add_dword(unsigned long*, unsigned long) [clone .constprop.223]>

    /// @return count for toolchange in current print
    inline uint16_t ToolChangeCounter() const { return toolchange_counter; };

    /// Set toolchange counter to zero
    inline void ClearToolChangeCounter() { toolchange_counter = 0; };
    ca08:	10 92 06 13 	sts	0x1306, r1	; 0x801306 <MMU2::mmu2+0x74>
    ca0c:	10 92 05 13 	sts	0x1305, r1	; 0x801305 <MMU2::mmu2+0x73>

    inline uint16_t TMCFailures() const { return tmcFailures; }
    inline void IncrementTMCFailures() { ++tmcFailures; }
    inline void ClearTMCFailures() { tmcFailures = 0; }
    ca10:	10 92 08 13 	sts	0x1308, r1	; 0x801308 <MMU2::mmu2+0x76>
    ca14:	10 92 07 13 	sts	0x1307, r1	; 0x801307 <MMU2::mmu2+0x75>
        // @@TODO why were EEPROM_MMU_FAIL_TOT and EEPROM_MMU_LOAD_FAIL_TOT behaving differently - i.e. updated with every change?
        MMU2::mmu2.ClearToolChangeCounter();
        MMU2::mmu2.ClearTMCFailures(); // not stored into EEPROM
    }
}
    ca18:	ff 90       	pop	r15
    ca1a:	ef 90       	pop	r14
    ca1c:	df 90       	pop	r13
    ca1e:	cf 90       	pop	r12
    ca20:	bf 90       	pop	r11
    ca22:	af 90       	pop	r10
    ca24:	9f 90       	pop	r9
    ca26:	8f 90       	pop	r8
    ca28:	08 95       	ret

0000ca2a <gcode_M123()>:
}

#if (defined(FANCHECK) && (((defined(TACH_0) && (TACH_0 >-1)) || (defined(TACH_1) && (TACH_1 > -1)))))
void gcode_M123()
{
  printf_P(_N("E0:%d RPM PRN1:%d RPM E0@:%u PRN1@:%u\n"), 60*fan_speed[active_extruder], 60*fan_speed[1], newFanSpeed, fanSpeed);
    ca2a:	80 91 55 12 	lds	r24, 0x1255	; 0x801255 <fanSpeed>
    ca2e:	1f 92       	push	r1
    ca30:	8f 93       	push	r24
    ca32:	80 91 3e 03 	lds	r24, 0x033E	; 0x80033e <newFanSpeed>
    ca36:	1f 92       	push	r1
    ca38:	8f 93       	push	r24
    ca3a:	e7 eb       	ldi	r30, 0xB7	; 183
    ca3c:	f3 e0       	ldi	r31, 0x03	; 3
    ca3e:	42 81       	ldd	r20, Z+2	; 0x02
    ca40:	53 81       	ldd	r21, Z+3	; 0x03
    ca42:	2c e3       	ldi	r18, 0x3C	; 60
    ca44:	24 9f       	mul	r18, r20
    ca46:	c0 01       	movw	r24, r0
    ca48:	25 9f       	mul	r18, r21
    ca4a:	90 0d       	add	r25, r0
    ca4c:	11 24       	eor	r1, r1
    ca4e:	9f 93       	push	r25
    ca50:	8f 93       	push	r24
    ca52:	40 81       	ld	r20, Z
    ca54:	51 81       	ldd	r21, Z+1	; 0x01
    ca56:	24 9f       	mul	r18, r20
    ca58:	c0 01       	movw	r24, r0
    ca5a:	25 9f       	mul	r18, r21
    ca5c:	90 0d       	add	r25, r0
    ca5e:	11 24       	eor	r1, r1
    ca60:	9f 93       	push	r25
    ca62:	8f 93       	push	r24
    ca64:	84 e2       	ldi	r24, 0x24	; 36
    ca66:	94 e6       	ldi	r25, 0x64	; 100
    ca68:	9f 93       	push	r25
    ca6a:	8f 93       	push	r24
    ca6c:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
    ca70:	8d b7       	in	r24, 0x3d	; 61
    ca72:	9e b7       	in	r25, 0x3e	; 62
    ca74:	0a 96       	adiw	r24, 0x0a	; 10
    ca76:	0f b6       	in	r0, 0x3f	; 63
    ca78:	f8 94       	cli
    ca7a:	9e bf       	out	0x3e, r25	; 62
    ca7c:	0f be       	out	0x3f, r0	; 63
    ca7e:	8d bf       	out	0x3d, r24	; 61
}
    ca80:	08 95       	ret

0000ca82 <refresh_cmd_timeout()>:
    endstops_hit_on_purpose();
}

void refresh_cmd_timeout(void)
{
  previous_millis_cmd.start();
    ca82:	88 e4       	ldi	r24, 0x48	; 72
    ca84:	93 e0       	ldi	r25, 0x03	; 3
    ca86:	0d 94 47 10 	jmp	0x2208e	; 0x2208e <Timer<unsigned long>::start()>

0000ca8a <get_feedrate_mm_s(float)>:
	}
}
#endif //TMC2130

float __attribute__((noinline)) get_feedrate_mm_s(const float feedrate_mm_min) {
  return feedrate_mm_min / 60.f;
    ca8a:	20 e0       	ldi	r18, 0x00	; 0
    ca8c:	30 e0       	ldi	r19, 0x00	; 0
    ca8e:	40 e7       	ldi	r20, 0x70	; 112
    ca90:	52 e4       	ldi	r21, 0x42	; 66
    ca92:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
}
    ca96:	08 95       	ret

0000ca98 <clean_up_after_endstop_move(int) [clone .lto_priv.382]>:
}

bool enable_endstops(bool check)
{
  bool old = check_endstops;
  check_endstops = check;
    ca98:	10 92 77 02 	sts	0x0277, r1	; 0x800277 <_ZL14check_endstops.lto_priv.387>
//! @param original_feedmultiply feedmultiply to restore
static void clean_up_after_endstop_move(int original_feedmultiply) {
#ifdef ENDSTOPS_ONLY_FOR_HOMING
    enable_endstops(false);
#endif
    feedrate = saved_feedrate;
    ca9c:	40 91 39 03 	lds	r20, 0x0339	; 0x800339 <saved_feedrate>
    caa0:	50 91 3a 03 	lds	r21, 0x033A	; 0x80033a <saved_feedrate+0x1>
    caa4:	60 91 3b 03 	lds	r22, 0x033B	; 0x80033b <saved_feedrate+0x2>
    caa8:	70 91 3c 03 	lds	r23, 0x033C	; 0x80033c <saved_feedrate+0x3>
    caac:	40 93 7a 02 	sts	0x027A, r20	; 0x80027a <feedrate>
    cab0:	50 93 7b 02 	sts	0x027B, r21	; 0x80027b <feedrate+0x1>
    cab4:	60 93 7c 02 	sts	0x027C, r22	; 0x80027c <feedrate+0x2>
    cab8:	70 93 7d 02 	sts	0x027D, r23	; 0x80027d <feedrate+0x3>
    feedmultiply = original_feedmultiply;
    cabc:	90 93 8f 02 	sts	0x028F, r25	; 0x80028f <feedmultiply+0x1>
    cac0:	80 93 8e 02 	sts	0x028E, r24	; 0x80028e <feedmultiply>
    previous_millis_cmd.start();
    cac4:	88 e4       	ldi	r24, 0x48	; 72
    cac6:	93 e0       	ldi	r25, 0x03	; 3
    cac8:	0d 94 47 10 	jmp	0x2208e	; 0x2208e <Timer<unsigned long>::start()>

0000cacc <setup_for_endstop_move(bool) [clone .lto_priv.381]>:
  min_pos[axis] =          base_min_pos(axis) + cs.add_homing[axis];
  max_pos[axis] =          base_max_pos(axis) + cs.add_homing[axis];
}

//! @return original feedmultiply
static int setup_for_endstop_move(bool enable_endstops_now = true) {
    cacc:	1f 93       	push	r17
    cace:	cf 93       	push	r28
    cad0:	df 93       	push	r29
    cad2:	18 2f       	mov	r17, r24
    saved_feedrate = feedrate;
    cad4:	80 91 7a 02 	lds	r24, 0x027A	; 0x80027a <feedrate>
    cad8:	90 91 7b 02 	lds	r25, 0x027B	; 0x80027b <feedrate+0x1>
    cadc:	a0 91 7c 02 	lds	r26, 0x027C	; 0x80027c <feedrate+0x2>
    cae0:	b0 91 7d 02 	lds	r27, 0x027D	; 0x80027d <feedrate+0x3>
    cae4:	80 93 39 03 	sts	0x0339, r24	; 0x800339 <saved_feedrate>
    cae8:	90 93 3a 03 	sts	0x033A, r25	; 0x80033a <saved_feedrate+0x1>
    caec:	a0 93 3b 03 	sts	0x033B, r26	; 0x80033b <saved_feedrate+0x2>
    caf0:	b0 93 3c 03 	sts	0x033C, r27	; 0x80033c <saved_feedrate+0x3>
    int l_feedmultiply = feedmultiply;
    caf4:	c0 91 8e 02 	lds	r28, 0x028E	; 0x80028e <feedmultiply>
    caf8:	d0 91 8f 02 	lds	r29, 0x028F	; 0x80028f <feedmultiply+0x1>
    feedmultiply = 100;
    cafc:	84 e6       	ldi	r24, 0x64	; 100
    cafe:	90 e0       	ldi	r25, 0x00	; 0
    cb00:	90 93 8f 02 	sts	0x028F, r25	; 0x80028f <feedmultiply+0x1>
    cb04:	80 93 8e 02 	sts	0x028E, r24	; 0x80028e <feedmultiply>
    previous_millis_cmd.start();
    cb08:	88 e4       	ldi	r24, 0x48	; 72
    cb0a:	93 e0       	ldi	r25, 0x03	; 3
    cb0c:	0f 94 47 10 	call	0x2208e	; 0x2208e <Timer<unsigned long>::start()>
    cb10:	10 93 77 02 	sts	0x0277, r17	; 0x800277 <_ZL14check_endstops.lto_priv.387>
    enable_endstops(enable_endstops_now);
    return l_feedmultiply;
}
    cb14:	ce 01       	movw	r24, r28
    cb16:	df 91       	pop	r29
    cb18:	cf 91       	pop	r28
    cb1a:	1f 91       	pop	r17
    cb1c:	08 95       	ret

0000cb1e <axis_is_at_home(unsigned char) [clone .lto_priv.376]>:
XYZ_CONSTS_FROM_CONFIG(float, base_home_pos,   HOME_POS);
XYZ_CONSTS_FROM_CONFIG(float, max_length,      MAX_LENGTH);
XYZ_CONSTS_FROM_CONFIG(float, home_retract_mm, HOME_RETRACT_MM);
XYZ_CONSTS_FROM_CONFIG(signed char, home_dir,  HOME_DIR);

static void axis_is_at_home(uint8_t axis) {
    cb1e:	cf 92       	push	r12
    cb20:	df 92       	push	r13
    cb22:	ef 92       	push	r14
    cb24:	ff 92       	push	r15
    cb26:	0f 93       	push	r16
    cb28:	1f 93       	push	r17
    cb2a:	cf 93       	push	r28
    cb2c:	df 93       	push	r29
type array##_ext(uint8_t axis)                      \
    { return pgm_read_any(&array##_P[axis]); }

XYZ_CONSTS_FROM_CONFIG(float, base_min_pos,    MIN_POS);
XYZ_CONSTS_FROM_CONFIG(float, base_max_pos,    MAX_POS);
XYZ_CONSTS_FROM_CONFIG(float, base_home_pos,   HOME_POS);
    cb2e:	90 e0       	ldi	r25, 0x00	; 0
    cb30:	ec 01       	movw	r28, r24
    cb32:	cc 0f       	add	r28, r28
    cb34:	dd 1f       	adc	r29, r29
    cb36:	cc 0f       	add	r28, r28
    cb38:	dd 1f       	adc	r29, r29
    cb3a:	fe 01       	movw	r30, r28
    cb3c:	e1 56       	subi	r30, 0x61	; 97
    cb3e:	f9 48       	sbci	r31, 0x89	; 137

#define DEFINE_PGM_READ_ANY(type, reader)       \
    static inline type pgm_read_any(const type *p)  \
    { return pgm_read_##reader##_near(p); }

DEFINE_PGM_READ_ANY(float,       float);
    cb40:	25 91       	lpm	r18, Z+
    cb42:	35 91       	lpm	r19, Z+
    cb44:	45 91       	lpm	r20, Z+
    cb46:	54 91       	lpm	r21, Z
XYZ_CONSTS_FROM_CONFIG(float, max_length,      MAX_LENGTH);
XYZ_CONSTS_FROM_CONFIG(float, home_retract_mm, HOME_RETRACT_MM);
XYZ_CONSTS_FROM_CONFIG(signed char, home_dir,  HOME_DIR);

static void axis_is_at_home(uint8_t axis) {
  current_position[axis] = base_home_pos(axis) + cs.add_homing[axis];
    cb48:	fe 01       	movw	r30, r28
    cb4a:	e1 54       	subi	r30, 0x41	; 65
    cb4c:	f2 4f       	sbci	r31, 0xF2	; 242
    cb4e:	c0 80       	ld	r12, Z
    cb50:	d1 80       	ldd	r13, Z+1	; 0x01
    cb52:	e2 80       	ldd	r14, Z+2	; 0x02
    cb54:	f3 80       	ldd	r15, Z+3	; 0x03
    cb56:	8e 01       	movw	r16, r28
    cb58:	0f 59       	subi	r16, 0x9F	; 159
    cb5a:	1d 4e       	sbci	r17, 0xED	; 237
    cb5c:	c7 01       	movw	r24, r14
    cb5e:	b6 01       	movw	r22, r12
    cb60:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    cb64:	f8 01       	movw	r30, r16
    cb66:	60 83       	st	Z, r22
    cb68:	71 83       	std	Z+1, r23	; 0x01
    cb6a:	82 83       	std	Z+2, r24	; 0x02
    cb6c:	93 83       	std	Z+3, r25	; 0x03
static inline type array(uint8_t axis)              \
    { return pgm_read_any(&array##_P[axis]); }  \
type array##_ext(uint8_t axis)                      \
    { return pgm_read_any(&array##_P[axis]); }

XYZ_CONSTS_FROM_CONFIG(float, base_min_pos,    MIN_POS);
    cb6e:	fe 01       	movw	r30, r28
    cb70:	ed 56       	subi	r30, 0x6D	; 109
    cb72:	f9 48       	sbci	r31, 0x89	; 137

#define DEFINE_PGM_READ_ANY(type, reader)       \
    static inline type pgm_read_any(const type *p)  \
    { return pgm_read_##reader##_near(p); }

DEFINE_PGM_READ_ANY(float,       float);
    cb74:	25 91       	lpm	r18, Z+
    cb76:	35 91       	lpm	r19, Z+
    cb78:	45 91       	lpm	r20, Z+
    cb7a:	54 91       	lpm	r21, Z
XYZ_CONSTS_FROM_CONFIG(float, home_retract_mm, HOME_RETRACT_MM);
XYZ_CONSTS_FROM_CONFIG(signed char, home_dir,  HOME_DIR);

static void axis_is_at_home(uint8_t axis) {
  current_position[axis] = base_home_pos(axis) + cs.add_homing[axis];
  min_pos[axis] =          base_min_pos(axis) + cs.add_homing[axis];
    cb7c:	8e 01       	movw	r16, r28
    cb7e:	0c 5d       	subi	r16, 0xDC	; 220
    cb80:	1d 4f       	sbci	r17, 0xFD	; 253
    cb82:	c7 01       	movw	r24, r14
    cb84:	b6 01       	movw	r22, r12
    cb86:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    cb8a:	f8 01       	movw	r30, r16
    cb8c:	60 83       	st	Z, r22
    cb8e:	71 83       	std	Z+1, r23	; 0x01
    cb90:	82 83       	std	Z+2, r24	; 0x02
    cb92:	93 83       	std	Z+3, r25	; 0x03
    { return pgm_read_any(&array##_P[axis]); }  \
type array##_ext(uint8_t axis)                      \
    { return pgm_read_any(&array##_P[axis]); }

XYZ_CONSTS_FROM_CONFIG(float, base_min_pos,    MIN_POS);
XYZ_CONSTS_FROM_CONFIG(float, base_max_pos,    MAX_POS);
    cb94:	fe 01       	movw	r30, r28
    cb96:	e9 57       	subi	r30, 0x79	; 121
    cb98:	f9 48       	sbci	r31, 0x89	; 137

#define DEFINE_PGM_READ_ANY(type, reader)       \
    static inline type pgm_read_any(const type *p)  \
    { return pgm_read_##reader##_near(p); }

DEFINE_PGM_READ_ANY(float,       float);
    cb9a:	25 91       	lpm	r18, Z+
    cb9c:	35 91       	lpm	r19, Z+
    cb9e:	45 91       	lpm	r20, Z+
    cba0:	54 91       	lpm	r21, Z
XYZ_CONSTS_FROM_CONFIG(signed char, home_dir,  HOME_DIR);

static void axis_is_at_home(uint8_t axis) {
  current_position[axis] = base_home_pos(axis) + cs.add_homing[axis];
  min_pos[axis] =          base_min_pos(axis) + cs.add_homing[axis];
  max_pos[axis] =          base_max_pos(axis) + cs.add_homing[axis];
    cba2:	c8 5e       	subi	r28, 0xE8	; 232
    cba4:	dd 4f       	sbci	r29, 0xFD	; 253
    cba6:	c7 01       	movw	r24, r14
    cba8:	b6 01       	movw	r22, r12
    cbaa:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    cbae:	68 83       	st	Y, r22
    cbb0:	79 83       	std	Y+1, r23	; 0x01
    cbb2:	8a 83       	std	Y+2, r24	; 0x02
    cbb4:	9b 83       	std	Y+3, r25	; 0x03
}
    cbb6:	df 91       	pop	r29
    cbb8:	cf 91       	pop	r28
    cbba:	1f 91       	pop	r17
    cbbc:	0f 91       	pop	r16
    cbbe:	ff 90       	pop	r15
    cbc0:	ef 90       	pop	r14
    cbc2:	df 90       	pop	r13
    cbc4:	cf 90       	pop	r12
    cbc6:	08 95       	ret

0000cbc8 <factory_reset_stats() [clone .lto_priv.403]>:
    cbc8:	40 e0       	ldi	r20, 0x00	; 0
    cbca:	50 e0       	ldi	r21, 0x00	; 0
    cbcc:	ba 01       	movw	r22, r20
    cbce:	8d ee       	ldi	r24, 0xED	; 237
    cbd0:	9f e0       	ldi	r25, 0x0F	; 15
    cbd2:	0f 94 16 a4 	call	0x3482c	; 0x3482c <eeprom_update_dword>
    cbd6:	40 e0       	ldi	r20, 0x00	; 0
    cbd8:	50 e0       	ldi	r21, 0x00	; 0
    cbda:	ba 01       	movw	r22, r20
    cbdc:	81 ef       	ldi	r24, 0xF1	; 241
    cbde:	9f e0       	ldi	r25, 0x0F	; 15
    cbe0:	0f 94 16 a4 	call	0x3482c	; 0x3482c <eeprom_update_dword>

static void factory_reset_stats(){
    eeprom_update_dword_notify((uint32_t *)EEPROM_TOTALTIME, 0);
    eeprom_update_dword_notify((uint32_t *)EEPROM_FILAMENTUSED, 0);

    failstats_reset_print();
    cbe4:	0e 94 68 56 	call	0xacd0	; 0xacd0 <failstats_reset_print()>
        if (previous_value != value) {
            eeprom_word_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_word(dst, value);
    cbe8:	70 e0       	ldi	r23, 0x00	; 0
    cbea:	60 e0       	ldi	r22, 0x00	; 0
    cbec:	85 e0       	ldi	r24, 0x05	; 5
    cbee:	9f e0       	ldi	r25, 0x0F	; 15
    cbf0:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>
    cbf4:	70 e0       	ldi	r23, 0x00	; 0
    cbf6:	60 e0       	ldi	r22, 0x00	; 0
    cbf8:	83 e0       	ldi	r24, 0x03	; 3
    cbfa:	9f e0       	ldi	r25, 0x0F	; 15
    cbfc:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>
    cc00:	70 e0       	ldi	r23, 0x00	; 0
    cc02:	60 e0       	ldi	r22, 0x00	; 0
    cc04:	81 e0       	ldi	r24, 0x01	; 1
    cc06:	9f e0       	ldi	r25, 0x0F	; 15
    cc08:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>
    cc0c:	70 e0       	ldi	r23, 0x00	; 0
    cc0e:	60 e0       	ldi	r22, 0x00	; 0
    cc10:	8f ef       	ldi	r24, 0xFF	; 255
    cc12:	9e e0       	ldi	r25, 0x0E	; 14
    cc14:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>
    cc18:	70 e0       	ldi	r23, 0x00	; 0
    cc1a:	60 e0       	ldi	r22, 0x00	; 0
    cc1c:	83 ed       	ldi	r24, 0xD3	; 211
    cc1e:	9e e0       	ldi	r25, 0x0E	; 14
    cc20:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>
    cc24:	70 e0       	ldi	r23, 0x00	; 0
    cc26:	60 e0       	ldi	r22, 0x00	; 0
    cc28:	80 ed       	ldi	r24, 0xD0	; 208
    cc2a:	9e e0       	ldi	r25, 0x0E	; 14
    cc2c:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>
        if (previous_value != value) {
            eeprom_dword_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_dword(dst, value);
    cc30:	40 e0       	ldi	r20, 0x00	; 0
    cc32:	50 e0       	ldi	r21, 0x00	; 0
    cc34:	ba 01       	movw	r22, r20
    cc36:	88 ea       	ldi	r24, 0xA8	; 168
    cc38:	9c e0       	ldi	r25, 0x0C	; 12
    cc3a:	0d 94 16 a4 	jmp	0x3482c	; 0x3482c <eeprom_update_dword>

0000cc3e <softReset>:
      wdt_disable();
    }
}

void softReset(void) {
    cli();
    cc3e:	f8 94       	cli
				: "n" (_SFR_MEM_ADDR(_WD_CONTROL_REG)),
				"r" ((uint8_t)(_BV(_WD_CHANGE_BIT) | _BV(WDE))),
				"r" ((uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00) |
						_BV(WDE) | (value & 0x07)) )
				: "r0"
		);
    cc40:	88 e1       	ldi	r24, 0x18	; 24
    cc42:	9f e0       	ldi	r25, 0x0F	; 15
    cc44:	0f b6       	in	r0, 0x3f	; 63
    cc46:	f8 94       	cli
    cc48:	a8 95       	wdr
    cc4a:	80 93 60 00 	sts	0x0060, r24	; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060>
    cc4e:	0f be       	out	0x3f, r0	; 63
    cc50:	90 93 60 00 	sts	0x0060, r25	; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060>
    cc54:	ff cf       	rjmp	.-2      	; 0xcc54 <softReset+0x16>

0000cc56 <printer_recovering()>:
}
#endif //End DEBUG_PRINTER_STATES

// Block LCD menus when
bool __attribute__((noinline)) printer_recovering() {
    return (eeprom_read_byte((uint8_t*)EEPROM_UVLO) != PowerPanic::NO_PENDING_RECOVERY);
    cc56:	85 ea       	ldi	r24, 0xA5	; 165
    cc58:	9f e0       	ldi	r25, 0x0F	; 15
    cc5a:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
    cc5e:	91 e0       	ldi	r25, 0x01	; 1
    cc60:	81 11       	cpse	r24, r1
    cc62:	01 c0       	rjmp	.+2      	; 0xcc66 <printer_recovering()+0x10>
    cc64:	90 e0       	ldi	r25, 0x00	; 0
}
    cc66:	89 2f       	mov	r24, r25
    cc68:	08 95       	ret

0000cc6a <printingIsPaused()>:
bool __attribute__((noinline)) printJobOngoing() {
    return (IS_SD_PRINTING || usb_timer.running() || print_job_timer.isRunning());
}

bool printingIsPaused() {
  return did_pause_print || print_job_timer.isPaused();
    cc6a:	80 91 cd 03 	lds	r24, 0x03CD	; 0x8003cd <did_pause_print>
    cc6e:	81 11       	cpse	r24, r1
    cc70:	06 c0       	rjmp	.+12     	; 0xcc7e <printingIsPaused()+0x14>
    cc72:	81 e0       	ldi	r24, 0x01	; 1
    cc74:	90 91 8b 03 	lds	r25, 0x038B	; 0x80038b <Stopwatch::state>
    cc78:	92 30       	cpi	r25, 0x02	; 2
    cc7a:	09 f0       	breq	.+2      	; 0xcc7e <printingIsPaused()+0x14>
    cc7c:	80 e0       	ldi	r24, 0x00	; 0
}
    cc7e:	08 95       	ret

0000cc80 <printJobOngoing()>:
    WRITE(SUICIDE_PIN, LOW);
  #endif
}

bool __attribute__((noinline)) printJobOngoing() {
    return (IS_SD_PRINTING || usb_timer.running() || print_job_timer.isRunning());
    cc80:	80 91 d7 13 	lds	r24, 0x13D7	; 0x8013d7 <card+0x2>
    cc84:	81 11       	cpse	r24, r1
    cc86:	0a c0       	rjmp	.+20     	; 0xcc9c <printJobOngoing()+0x1c>
    cc88:	80 91 42 12 	lds	r24, 0x1242	; 0x801242 <usb_timer>
    cc8c:	81 11       	cpse	r24, r1
    cc8e:	06 c0       	rjmp	.+12     	; 0xcc9c <printJobOngoing()+0x1c>
    cc90:	81 e0       	ldi	r24, 0x01	; 1
    cc92:	90 91 8b 03 	lds	r25, 0x038B	; 0x80038b <Stopwatch::state>
    cc96:	91 30       	cpi	r25, 0x01	; 1
    cc98:	09 f0       	breq	.+2      	; 0xcc9c <printJobOngoing()+0x1c>
    cc9a:	80 e0       	ldi	r24, 0x00	; 0
}
    cc9c:	08 95       	ret

0000cc9e <babystep_allowed()>:
        && !mesh_bed_leveling_flag
        && !homing_flag
        && e_active();
}

bool __attribute__((noinline)) babystep_allowed() {
    cc9e:	cf 93       	push	r28
    cca0:	df 93       	push	r29
    return ( !homing_flag
    cca2:	c0 91 71 12 	lds	r28, 0x1271	; 0x801271 <homing_flag>
        && !mesh_bed_leveling_flag
        && !printingIsPaused()
        && ((lcd_commands_type == LcdCommands::Layer1Cal && CHECK_ALL_HEATERS)
    cca6:	c1 11       	cpse	r28, r1
    cca8:	1f c0       	rjmp	.+62     	; 0xcce8 <babystep_allowed()+0x4a>
        && e_active();
}

bool __attribute__((noinline)) babystep_allowed() {
    return ( !homing_flag
        && !mesh_bed_leveling_flag
    ccaa:	80 91 72 12 	lds	r24, 0x1272	; 0x801272 <mesh_bed_leveling_flag>
    ccae:	81 11       	cpse	r24, r1
    ccb0:	1c c0       	rjmp	.+56     	; 0xccea <babystep_allowed()+0x4c>
        && !printingIsPaused()
    ccb2:	0e 94 35 66 	call	0xcc6a	; 0xcc6a <printingIsPaused()>
    ccb6:	81 11       	cpse	r24, r1
    ccb8:	18 c0       	rjmp	.+48     	; 0xccea <babystep_allowed()+0x4c>
        && ((lcd_commands_type == LcdCommands::Layer1Cal && CHECK_ALL_HEATERS)
    ccba:	d0 91 5e 0d 	lds	r29, 0x0D5E	; 0x800d5e <lcd_commands_type>
    ccbe:	d4 30       	cpi	r29, 0x04	; 4
    ccc0:	61 f4       	brne	.+24     	; 0xccda <babystep_allowed()+0x3c>
    ccc2:	80 91 5d 12 	lds	r24, 0x125D	; 0x80125d <target_temperature>
    ccc6:	90 91 5e 12 	lds	r25, 0x125E	; 0x80125e <target_temperature+0x1>
    ccca:	89 2b       	or	r24, r25
    cccc:	91 f4       	brne	.+36     	; 0xccf2 <babystep_allowed()+0x54>
    ccce:	80 91 59 12 	lds	r24, 0x1259	; 0x801259 <target_temperature_bed>
    ccd2:	90 91 5a 12 	lds	r25, 0x125A	; 0x80125a <target_temperature_bed+0x1>
    ccd6:	89 2b       	or	r24, r25
    ccd8:	61 f4       	brne	.+24     	; 0xccf2 <babystep_allowed()+0x54>
            || printJobOngoing()
    ccda:	0e 94 40 66 	call	0xcc80	; 0xcc80 <printJobOngoing()>
    ccde:	c8 2f       	mov	r28, r24
    cce0:	81 11       	cpse	r24, r1
    cce2:	03 c0       	rjmp	.+6      	; 0xccea <babystep_allowed()+0x4c>
            || lcd_commands_type == LcdCommands::Idle
    cce4:	c1 e0       	ldi	r28, 0x01	; 1
    cce6:	d1 11       	cpse	r29, r1

bool __attribute__((noinline)) babystep_allowed() {
    return ( !homing_flag
        && !mesh_bed_leveling_flag
        && !printingIsPaused()
        && ((lcd_commands_type == LcdCommands::Layer1Cal && CHECK_ALL_HEATERS)
    cce8:	c0 e0       	ldi	r28, 0x00	; 0
            || printJobOngoing()
            || lcd_commands_type == LcdCommands::Idle
        )
    );
}
    ccea:	8c 2f       	mov	r24, r28
    ccec:	df 91       	pop	r29
    ccee:	cf 91       	pop	r28
    ccf0:	08 95       	ret

bool __attribute__((noinline)) babystep_allowed() {
    return ( !homing_flag
        && !mesh_bed_leveling_flag
        && !printingIsPaused()
        && ((lcd_commands_type == LcdCommands::Layer1Cal && CHECK_ALL_HEATERS)
    ccf2:	c1 e0       	ldi	r28, 0x01	; 1
    ccf4:	fa cf       	rjmp	.-12     	; 0xccea <babystep_allowed()+0x4c>

0000ccf6 <babystep_allowed_strict()>:
        )
    );
}

bool __attribute__((noinline)) babystep_allowed_strict() {
    return ( babystep_allowed() && current_position[Z_AXIS] < Z_HEIGHT_HIDE_LIVE_ADJUST_MENU);
    ccf6:	0e 94 4f 66 	call	0xcc9e	; 0xcc9e <babystep_allowed()>
    ccfa:	88 23       	and	r24, r24
    ccfc:	89 f0       	breq	.+34     	; 0xcd20 <babystep_allowed_strict()+0x2a>
    ccfe:	20 e0       	ldi	r18, 0x00	; 0
    cd00:	30 e0       	ldi	r19, 0x00	; 0
    cd02:	40 e0       	ldi	r20, 0x00	; 0
    cd04:	50 e4       	ldi	r21, 0x40	; 64
    cd06:	60 91 69 12 	lds	r22, 0x1269	; 0x801269 <current_position+0x8>
    cd0a:	70 91 6a 12 	lds	r23, 0x126A	; 0x80126a <current_position+0x9>
    cd0e:	80 91 6b 12 	lds	r24, 0x126B	; 0x80126b <current_position+0xa>
    cd12:	90 91 6c 12 	lds	r25, 0x126C	; 0x80126c <current_position+0xb>
    cd16:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
    cd1a:	88 1f       	adc	r24, r24
    cd1c:	88 27       	eor	r24, r24
    cd1e:	88 1f       	adc	r24, r24
}
    cd20:	08 95       	ret

0000cd22 <printer_active()>:
bool printingIsPaused() {
  return did_pause_print || print_job_timer.isPaused();
}

bool __attribute__((noinline)) printer_active() {
    return printJobOngoing()
    cd22:	0e 94 40 66 	call	0xcc80	; 0xcc80 <printJobOngoing()>
        || printingIsPaused()
        || saved_printing
        || (lcd_commands_type != LcdCommands::Idle)
        || MMU2::mmu2.MMU_PRINT_SAVED()
        || homing_flag
        || mesh_bed_leveling_flag;
    cd26:	81 11       	cpse	r24, r1
    cd28:	18 c0       	rjmp	.+48     	; 0xcd5a <printer_active()+0x38>
  return did_pause_print || print_job_timer.isPaused();
}

bool __attribute__((noinline)) printer_active() {
    return printJobOngoing()
        || printingIsPaused()
    cd2a:	0e 94 35 66 	call	0xcc6a	; 0xcc6a <printingIsPaused()>
    cd2e:	81 11       	cpse	r24, r1
    cd30:	14 c0       	rjmp	.+40     	; 0xcd5a <printer_active()+0x38>
        || saved_printing
    cd32:	80 91 73 12 	lds	r24, 0x1273	; 0x801273 <saved_printing>
    cd36:	81 11       	cpse	r24, r1
    cd38:	10 c0       	rjmp	.+32     	; 0xcd5a <printer_active()+0x38>
        || (lcd_commands_type != LcdCommands::Idle)
    cd3a:	80 91 5e 0d 	lds	r24, 0x0D5E	; 0x800d5e <lcd_commands_type>
    cd3e:	81 11       	cpse	r24, r1
    cd40:	0b c0       	rjmp	.+22     	; 0xcd58 <printer_active()+0x36>
        || MMU2::mmu2.MMU_PRINT_SAVED()
    cd42:	80 91 02 13 	lds	r24, 0x1302	; 0x801302 <MMU2::mmu2+0x70>
    cd46:	81 11       	cpse	r24, r1
    cd48:	07 c0       	rjmp	.+14     	; 0xcd58 <printer_active()+0x36>
        || homing_flag
    cd4a:	80 91 71 12 	lds	r24, 0x1271	; 0x801271 <homing_flag>
    cd4e:	81 11       	cpse	r24, r1
    cd50:	04 c0       	rjmp	.+8      	; 0xcd5a <printer_active()+0x38>
        || mesh_bed_leveling_flag;
    cd52:	80 91 72 12 	lds	r24, 0x1272	; 0x801272 <mesh_bed_leveling_flag>
    cd56:	08 95       	ret
    cd58:	81 e0       	ldi	r24, 0x01	; 1
}
    cd5a:	08 95       	ret

0000cd5c <set_destination_to_current()>:
inline void set_destination_to_current() { memcpy(destination, current_position, sizeof(destination)); }
    cd5c:	80 e1       	ldi	r24, 0x10	; 16
    cd5e:	e1 e6       	ldi	r30, 0x61	; 97
    cd60:	f2 e1       	ldi	r31, 0x12	; 18
    cd62:	a9 e2       	ldi	r26, 0x29	; 41
    cd64:	b6 e0       	ldi	r27, 0x06	; 6
    cd66:	01 90       	ld	r0, Z+
    cd68:	0d 92       	st	X+, r0
    cd6a:	8a 95       	dec	r24
    cd6c:	e1 f7       	brne	.-8      	; 0xcd66 <set_destination_to_current()+0xa>
    cd6e:	08 95       	ret

0000cd70 <restore_print_from_ram_and_continue(float)>:
//!
//! Internally lcd_update() is called by wait_for_heater().
//!
//! @param e_move
void restore_print_from_ram_and_continue(float e_move)
{
    cd70:	4f 92       	push	r4
    cd72:	5f 92       	push	r5
    cd74:	6f 92       	push	r6
    cd76:	7f 92       	push	r7
    cd78:	8f 92       	push	r8
    cd7a:	9f 92       	push	r9
    cd7c:	af 92       	push	r10
    cd7e:	bf 92       	push	r11
    cd80:	cf 92       	push	r12
    cd82:	df 92       	push	r13
    cd84:	ef 92       	push	r14
    cd86:	ff 92       	push	r15
    cd88:	0f 93       	push	r16
    cd8a:	1f 93       	push	r17
    cd8c:	cf 93       	push	r28
    cd8e:	df 93       	push	r29
    cd90:	00 d0       	rcall	.+0      	; 0xcd92 <restore_print_from_ram_and_continue(float)+0x22>
    cd92:	00 d0       	rcall	.+0      	; 0xcd94 <restore_print_from_ram_and_continue(float)+0x24>
    cd94:	1f 92       	push	r1
    cd96:	1f 92       	push	r1
    cd98:	cd b7       	in	r28, 0x3d	; 61
    cd9a:	de b7       	in	r29, 0x3e	; 62
    if (!saved_printing) return;
    cd9c:	20 91 73 12 	lds	r18, 0x1273	; 0x801273 <saved_printing>
    cda0:	22 23       	and	r18, r18
    cda2:	09 f4       	brne	.+2      	; 0xcda6 <restore_print_from_ram_and_continue(float)+0x36>
    cda4:	73 c1       	rjmp	.+742    	; 0xd08c <restore_print_from_ram_and_continue(float)+0x31c>

#ifdef FANCHECK
    // Do not allow resume printing if fans are still not ok
    if (fan_check_error == EFCE_REPORTED) return;
    cda6:	20 91 ce 03 	lds	r18, 0x03CE	; 0x8003ce <fan_check_error>
    cdaa:	22 30       	cpi	r18, 0x02	; 2
    cdac:	09 f4       	brne	.+2      	; 0xcdb0 <restore_print_from_ram_and_continue(float)+0x40>
    cdae:	6e c1       	rjmp	.+732    	; 0xd08c <restore_print_from_ram_and_continue(float)+0x31c>
    if (fan_check_error == EFCE_FIXED) fan_check_error = EFCE_OK; //reenable serial stream processing if printing from usb
    cdb0:	20 91 ce 03 	lds	r18, 0x03CE	; 0x8003ce <fan_check_error>
    cdb4:	21 30       	cpi	r18, 0x01	; 1
    cdb6:	11 f4       	brne	.+4      	; 0xcdbc <restore_print_from_ram_and_continue(float)+0x4c>
    cdb8:	10 92 ce 03 	sts	0x03CE, r1	; 0x8003ce <fan_check_error>
    cdbc:	2b 01       	movw	r4, r22
    cdbe:	3c 01       	movw	r6, r24
#endif

    // Make sure fan is turned off
    fanSpeed = 0;
    cdc0:	10 92 55 12 	sts	0x1255, r1	; 0x801255 <fanSpeed>

    // restore bed temperature (bed can be disabled during a thermal warning)
    if ((uint8_t)degBed() != saved_bed_temperature)
    cdc4:	10 91 58 12 	lds	r17, 0x1258	; 0x801258 <saved_bed_temperature>
    cdc8:	60 91 bc 03 	lds	r22, 0x03BC	; 0x8003bc <current_temperature_bed>
    cdcc:	70 91 bd 03 	lds	r23, 0x03BD	; 0x8003bd <current_temperature_bed+0x1>
    cdd0:	80 91 be 03 	lds	r24, 0x03BE	; 0x8003be <current_temperature_bed+0x2>
    cdd4:	90 91 bf 03 	lds	r25, 0x03BF	; 0x8003bf <current_temperature_bed+0x3>
    cdd8:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
    cddc:	61 17       	cp	r22, r17
    cdde:	31 f0       	breq	.+12     	; 0xcdec <restore_print_from_ram_and_continue(float)+0x7c>
  resetPID(0);
};

FORCE_INLINE void setTargetBed(const float &celsius) {
  target_temperature_bed = celsius;
    cde0:	81 2f       	mov	r24, r17
    cde2:	90 e0       	ldi	r25, 0x00	; 0
    cde4:	90 93 5a 12 	sts	0x125A, r25	; 0x80125a <target_temperature_bed+0x1>
    cde8:	80 93 59 12 	sts	0x1259, r24	; 0x801259 <target_temperature_bed>
        setTargetBed(saved_bed_temperature);
    restore_extruder_temperature_from_ram();
    cdec:	0e 94 23 64 	call	0xc846	; 0xc846 <restore_extruder_temperature_from_ram()>

    // Restore saved fan speed
    fanSpeed = saved_fan_speed;
    cdf0:	80 91 54 12 	lds	r24, 0x1254	; 0x801254 <saved_fan_speed>
    cdf4:	80 93 55 12 	sts	0x1255, r24	; 0x801255 <fanSpeed>
    axis_relative_modes ^= (-saved_extruder_relative_mode ^ axis_relative_modes) & E_AXIS_MASK;
    cdf8:	90 91 57 12 	lds	r25, 0x1257	; 0x801257 <axis_relative_modes>
    cdfc:	80 91 56 12 	lds	r24, 0x1256	; 0x801256 <saved_extruder_relative_mode>
    ce00:	81 95       	neg	r24
    ce02:	89 27       	eor	r24, r25
    ce04:	88 70       	andi	r24, 0x08	; 8
    ce06:	89 27       	eor	r24, r25
    ce08:	80 93 57 12 	sts	0x1257, r24	; 0x801257 <axis_relative_modes>
    float e = saved_pos[E_AXIS] - e_move;
    ce0c:	a3 01       	movw	r20, r6
    ce0e:	92 01       	movw	r18, r4
    ce10:	60 91 9c 02 	lds	r22, 0x029C	; 0x80029c <saved_pos+0xc>
    ce14:	70 91 9d 02 	lds	r23, 0x029D	; 0x80029d <saved_pos+0xd>
    ce18:	80 91 9e 02 	lds	r24, 0x029E	; 0x80029e <saved_pos+0xe>
    ce1c:	90 91 9f 02 	lds	r25, 0x029F	; 0x80029f <saved_pos+0xf>
    ce20:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    ce24:	6d 83       	std	Y+5, r22	; 0x05
    ce26:	7e 83       	std	Y+6, r23	; 0x06
    ce28:	8f 83       	std	Y+7, r24	; 0x07
    ce2a:	98 87       	std	Y+8, r25	; 0x08
    plan_set_e_position(e);
    ce2c:	ce 01       	movw	r24, r28
    ce2e:	05 96       	adiw	r24, 0x05	; 5
    ce30:	0f 94 d9 3c 	call	0x279b2	; 0x279b2 <plan_set_e_position(float const&)>

  #ifdef FANCHECK
    fans_check_enabled = false;
    ce34:	10 92 40 02 	sts	0x0240, r1	; 0x800240 <fans_check_enabled>
  #endif

    // do not restore XY for commands that do not require that
    if (saved_pos[X_AXIS] == X_COORD_INVALID)
    ce38:	20 e0       	ldi	r18, 0x00	; 0
    ce3a:	30 e0       	ldi	r19, 0x00	; 0
    ce3c:	40 e8       	ldi	r20, 0x80	; 128
    ce3e:	5f eb       	ldi	r21, 0xBF	; 191
    ce40:	60 91 90 02 	lds	r22, 0x0290	; 0x800290 <saved_pos>
    ce44:	70 91 91 02 	lds	r23, 0x0291	; 0x800291 <saved_pos+0x1>
    ce48:	80 91 92 02 	lds	r24, 0x0292	; 0x800292 <saved_pos+0x2>
    ce4c:	90 91 93 02 	lds	r25, 0x0293	; 0x800293 <saved_pos+0x3>
    ce50:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
    ce54:	81 11       	cpse	r24, r1
    ce56:	20 c0       	rjmp	.+64     	; 0xce98 <restore_print_from_ram_and_continue(float)+0x128>
    {
        saved_pos[X_AXIS] = current_position[X_AXIS];
    ce58:	80 91 61 12 	lds	r24, 0x1261	; 0x801261 <current_position>
    ce5c:	90 91 62 12 	lds	r25, 0x1262	; 0x801262 <current_position+0x1>
    ce60:	a0 91 63 12 	lds	r26, 0x1263	; 0x801263 <current_position+0x2>
    ce64:	b0 91 64 12 	lds	r27, 0x1264	; 0x801264 <current_position+0x3>
    ce68:	80 93 90 02 	sts	0x0290, r24	; 0x800290 <saved_pos>
    ce6c:	90 93 91 02 	sts	0x0291, r25	; 0x800291 <saved_pos+0x1>
    ce70:	a0 93 92 02 	sts	0x0292, r26	; 0x800292 <saved_pos+0x2>
    ce74:	b0 93 93 02 	sts	0x0293, r27	; 0x800293 <saved_pos+0x3>
        saved_pos[Y_AXIS] = current_position[Y_AXIS];
    ce78:	80 91 65 12 	lds	r24, 0x1265	; 0x801265 <current_position+0x4>
    ce7c:	90 91 66 12 	lds	r25, 0x1266	; 0x801266 <current_position+0x5>
    ce80:	a0 91 67 12 	lds	r26, 0x1267	; 0x801267 <current_position+0x6>
    ce84:	b0 91 68 12 	lds	r27, 0x1268	; 0x801268 <current_position+0x7>
    ce88:	80 93 94 02 	sts	0x0294, r24	; 0x800294 <saved_pos+0x4>
    ce8c:	90 93 95 02 	sts	0x0295, r25	; 0x800295 <saved_pos+0x5>
    ce90:	a0 93 96 02 	sts	0x0296, r26	; 0x800296 <saved_pos+0x6>
    ce94:	b0 93 97 02 	sts	0x0297, r27	; 0x800297 <saved_pos+0x7>
    }

	//first move print head in XY to the saved position:
	plan_buffer_line(saved_pos[X_AXIS], saved_pos[Y_AXIS], current_position[Z_AXIS], saved_pos[E_AXIS] - e_move, homing_feedrate[Z_AXIS]/13);
    ce98:	a3 01       	movw	r20, r6
    ce9a:	92 01       	movw	r18, r4
    ce9c:	60 91 9c 02 	lds	r22, 0x029C	; 0x80029c <saved_pos+0xc>
    cea0:	70 91 9d 02 	lds	r23, 0x029D	; 0x80029d <saved_pos+0xd>
    cea4:	80 91 9e 02 	lds	r24, 0x029E	; 0x80029e <saved_pos+0xe>
    cea8:	90 91 9f 02 	lds	r25, 0x029F	; 0x80029f <saved_pos+0xf>
    ceac:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    ceb0:	69 83       	std	Y+1, r22	; 0x01
    ceb2:	7a 83       	std	Y+2, r23	; 0x02
    ceb4:	8b 83       	std	Y+3, r24	; 0x03
    ceb6:	9c 83       	std	Y+4, r25	; 0x04
    ceb8:	e0 90 69 12 	lds	r14, 0x1269	; 0x801269 <current_position+0x8>
    cebc:	f0 90 6a 12 	lds	r15, 0x126A	; 0x80126a <current_position+0x9>
    cec0:	00 91 6b 12 	lds	r16, 0x126B	; 0x80126b <current_position+0xa>
    cec4:	10 91 6c 12 	lds	r17, 0x126C	; 0x80126c <current_position+0xb>
    cec8:	20 91 94 02 	lds	r18, 0x0294	; 0x800294 <saved_pos+0x4>
    cecc:	30 91 95 02 	lds	r19, 0x0295	; 0x800295 <saved_pos+0x5>
    ced0:	40 91 96 02 	lds	r20, 0x0296	; 0x800296 <saved_pos+0x6>
    ced4:	50 91 97 02 	lds	r21, 0x0297	; 0x800297 <saved_pos+0x7>
    ced8:	60 91 90 02 	lds	r22, 0x0290	; 0x800290 <saved_pos>
    cedc:	70 91 91 02 	lds	r23, 0x0291	; 0x800291 <saved_pos+0x1>
    cee0:	80 91 92 02 	lds	r24, 0x0292	; 0x800292 <saved_pos+0x2>
    cee4:	90 91 93 02 	lds	r25, 0x0293	; 0x800293 <saved_pos+0x3>
    cee8:	1f 92       	push	r1
    ceea:	1f 92       	push	r1
    ceec:	1f 92       	push	r1
    ceee:	1f 92       	push	r1
    cef0:	e2 e6       	ldi	r30, 0x62	; 98
    cef2:	8e 2e       	mov	r8, r30
    cef4:	e7 e2       	ldi	r30, 0x27	; 39
    cef6:	9e 2e       	mov	r9, r30
    cef8:	e6 e7       	ldi	r30, 0x76	; 118
    cefa:	ae 2e       	mov	r10, r30
    cefc:	e2 e4       	ldi	r30, 0x42	; 66
    cefe:	be 2e       	mov	r11, r30
    cf00:	fe 01       	movw	r30, r28
    cf02:	31 96       	adiw	r30, 0x01	; 1
    cf04:	6f 01       	movw	r12, r30
    cf06:	0f 94 33 3d 	call	0x27a66	; 0x27a66 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)>
	//then move Z
	plan_buffer_line(saved_pos[X_AXIS], saved_pos[Y_AXIS], saved_pos[Z_AXIS], saved_pos[E_AXIS] - e_move, homing_feedrate[Z_AXIS]/13);
    cf0a:	a3 01       	movw	r20, r6
    cf0c:	92 01       	movw	r18, r4
    cf0e:	60 91 9c 02 	lds	r22, 0x029C	; 0x80029c <saved_pos+0xc>
    cf12:	70 91 9d 02 	lds	r23, 0x029D	; 0x80029d <saved_pos+0xd>
    cf16:	80 91 9e 02 	lds	r24, 0x029E	; 0x80029e <saved_pos+0xe>
    cf1a:	90 91 9f 02 	lds	r25, 0x029F	; 0x80029f <saved_pos+0xf>
    cf1e:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    cf22:	69 83       	std	Y+1, r22	; 0x01
    cf24:	7a 83       	std	Y+2, r23	; 0x02
    cf26:	8b 83       	std	Y+3, r24	; 0x03
    cf28:	9c 83       	std	Y+4, r25	; 0x04
    cf2a:	e0 90 98 02 	lds	r14, 0x0298	; 0x800298 <saved_pos+0x8>
    cf2e:	f0 90 99 02 	lds	r15, 0x0299	; 0x800299 <saved_pos+0x9>
    cf32:	00 91 9a 02 	lds	r16, 0x029A	; 0x80029a <saved_pos+0xa>
    cf36:	10 91 9b 02 	lds	r17, 0x029B	; 0x80029b <saved_pos+0xb>
    cf3a:	20 91 94 02 	lds	r18, 0x0294	; 0x800294 <saved_pos+0x4>
    cf3e:	30 91 95 02 	lds	r19, 0x0295	; 0x800295 <saved_pos+0x5>
    cf42:	40 91 96 02 	lds	r20, 0x0296	; 0x800296 <saved_pos+0x6>
    cf46:	50 91 97 02 	lds	r21, 0x0297	; 0x800297 <saved_pos+0x7>
    cf4a:	60 91 90 02 	lds	r22, 0x0290	; 0x800290 <saved_pos>
    cf4e:	70 91 91 02 	lds	r23, 0x0291	; 0x800291 <saved_pos+0x1>
    cf52:	80 91 92 02 	lds	r24, 0x0292	; 0x800292 <saved_pos+0x2>
    cf56:	90 91 93 02 	lds	r25, 0x0293	; 0x800293 <saved_pos+0x3>
    cf5a:	1f 92       	push	r1
    cf5c:	1f 92       	push	r1
    cf5e:	1f 92       	push	r1
    cf60:	1f 92       	push	r1
    cf62:	0f 94 33 3d 	call	0x27a66	; 0x27a66 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)>
	//and finaly unretract (35mm/s)
	plan_buffer_line(saved_pos[X_AXIS], saved_pos[Y_AXIS], saved_pos[Z_AXIS], saved_pos[E_AXIS], FILAMENTCHANGE_RFEED);
    cf66:	e0 90 98 02 	lds	r14, 0x0298	; 0x800298 <saved_pos+0x8>
    cf6a:	f0 90 99 02 	lds	r15, 0x0299	; 0x800299 <saved_pos+0x9>
    cf6e:	00 91 9a 02 	lds	r16, 0x029A	; 0x80029a <saved_pos+0xa>
    cf72:	10 91 9b 02 	lds	r17, 0x029B	; 0x80029b <saved_pos+0xb>
    cf76:	20 91 94 02 	lds	r18, 0x0294	; 0x800294 <saved_pos+0x4>
    cf7a:	30 91 95 02 	lds	r19, 0x0295	; 0x800295 <saved_pos+0x5>
    cf7e:	40 91 96 02 	lds	r20, 0x0296	; 0x800296 <saved_pos+0x6>
    cf82:	50 91 97 02 	lds	r21, 0x0297	; 0x800297 <saved_pos+0x7>
    cf86:	60 91 90 02 	lds	r22, 0x0290	; 0x800290 <saved_pos>
    cf8a:	70 91 91 02 	lds	r23, 0x0291	; 0x800291 <saved_pos+0x1>
    cf8e:	80 91 92 02 	lds	r24, 0x0292	; 0x800292 <saved_pos+0x2>
    cf92:	90 91 93 02 	lds	r25, 0x0293	; 0x800293 <saved_pos+0x3>
    cf96:	1f 92       	push	r1
    cf98:	1f 92       	push	r1
    cf9a:	1f 92       	push	r1
    cf9c:	1f 92       	push	r1
    cf9e:	81 2c       	mov	r8, r1
    cfa0:	91 2c       	mov	r9, r1
    cfa2:	f8 ee       	ldi	r31, 0xE8	; 232
    cfa4:	af 2e       	mov	r10, r31
    cfa6:	f2 e4       	ldi	r31, 0x42	; 66
    cfa8:	bf 2e       	mov	r11, r31
    cfaa:	ac e9       	ldi	r26, 0x9C	; 156
    cfac:	ca 2e       	mov	r12, r26
    cfae:	a2 e0       	ldi	r26, 0x02	; 2
    cfb0:	da 2e       	mov	r13, r26
    cfb2:	0f 94 33 3d 	call	0x27a66	; 0x27a66 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)>
	st_synchronize();
    cfb6:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>

  #ifdef FANCHECK
    fans_check_enabled = true;
    cfba:	11 e0       	ldi	r17, 0x01	; 1
    cfbc:	10 93 40 02 	sts	0x0240, r17	; 0x800240 <fans_check_enabled>
  #endif

    // restore original feedrate/feedmultiply _after_ restoring the extruder position
	feedrate = saved_feedrate2;
    cfc0:	60 91 4f 12 	lds	r22, 0x124F	; 0x80124f <saved_feedrate2>
    cfc4:	70 91 50 12 	lds	r23, 0x1250	; 0x801250 <saved_feedrate2+0x1>
    cfc8:	90 e0       	ldi	r25, 0x00	; 0
    cfca:	80 e0       	ldi	r24, 0x00	; 0
    cfcc:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
    cfd0:	60 93 7a 02 	sts	0x027A, r22	; 0x80027a <feedrate>
    cfd4:	70 93 7b 02 	sts	0x027B, r23	; 0x80027b <feedrate+0x1>
    cfd8:	80 93 7c 02 	sts	0x027C, r24	; 0x80027c <feedrate+0x2>
    cfdc:	90 93 7d 02 	sts	0x027D, r25	; 0x80027d <feedrate+0x3>
	feedmultiply = saved_feedmultiply2;
    cfe0:	80 91 5f 12 	lds	r24, 0x125F	; 0x80125f <_ZL19saved_feedmultiply2.lto_priv.498>
    cfe4:	90 91 60 12 	lds	r25, 0x1260	; 0x801260 <_ZL19saved_feedmultiply2.lto_priv.498+0x1>
    cfe8:	90 93 8f 02 	sts	0x028F, r25	; 0x80028f <feedmultiply+0x1>
    cfec:	80 93 8e 02 	sts	0x028E, r24	; 0x80028e <feedmultiply>

	memcpy(current_position, saved_pos, sizeof(saved_pos));
    cff0:	80 e1       	ldi	r24, 0x10	; 16
    cff2:	e0 e9       	ldi	r30, 0x90	; 144
    cff4:	f2 e0       	ldi	r31, 0x02	; 2
    cff6:	a1 e6       	ldi	r26, 0x61	; 97
    cff8:	b2 e1       	ldi	r27, 0x12	; 18
    cffa:	01 90       	ld	r0, Z+
    cffc:	0d 92       	st	X+, r0
    cffe:	8a 95       	dec	r24
    d000:	e1 f7       	brne	.-8      	; 0xcffa <restore_print_from_ram_and_continue(float)+0x28a>
	set_destination_to_current();
    d002:	0e 94 ae 66 	call	0xcd5c	; 0xcd5c <set_destination_to_current()>
        //not sd printing nor usb printing
    }
}

void restore_print_file_state() {
    if (saved_printing_type == PowerPanic::PRINT_TYPE_SD) { //was sd printing
    d006:	80 91 79 02 	lds	r24, 0x0279	; 0x800279 <saved_printing_type>
    d00a:	0f b6       	in	r0, 0x3f	; 63
    d00c:	f8 94       	cli
    d00e:	de bf       	out	0x3e, r29	; 62
    d010:	0f be       	out	0x3f, r0	; 63
    d012:	cd bf       	out	0x3d, r28	; 61
    d014:	81 11       	cpse	r24, r1
    d016:	51 c0       	rjmp	.+162    	; 0xd0ba <restore_print_from_ram_and_continue(float)+0x34a>
        card.setIndex(saved_sdpos);
    d018:	60 91 45 12 	lds	r22, 0x1245	; 0x801245 <saved_sdpos>
    d01c:	70 91 46 12 	lds	r23, 0x1246	; 0x801246 <saved_sdpos+0x1>
    d020:	80 91 47 12 	lds	r24, 0x1247	; 0x801247 <saved_sdpos+0x2>
    d024:	90 91 48 12 	lds	r25, 0x1248	; 0x801248 <saved_sdpos+0x3>
  {
      int16_t c = (int16_t)file.readFilteredGcode();
      sdpos = file.curPosition();
      return c;
  };
  void setIndex(long index) {sdpos = index;file.seekSetFilteredGcode(index);};
    d028:	60 93 eb 16 	sts	0x16EB, r22	; 0x8016eb <card+0x316>
    d02c:	70 93 ec 16 	sts	0x16EC, r23	; 0x8016ec <card+0x317>
    d030:	80 93 ed 16 	sts	0x16ED, r24	; 0x8016ed <card+0x318>
    d034:	90 93 ee 16 	sts	0x16EE, r25	; 0x8016ee <card+0x319>
    d038:	0f 94 17 68 	call	0x2d02e	; 0x2d02e <SdFile::seekSetFilteredGcode(unsigned long) [clone .constprop.289]>
        sdpos_atomic = saved_sdpos;
    d03c:	80 91 45 12 	lds	r24, 0x1245	; 0x801245 <saved_sdpos>
    d040:	90 91 46 12 	lds	r25, 0x1246	; 0x801246 <saved_sdpos+0x1>
    d044:	a0 91 47 12 	lds	r26, 0x1247	; 0x801247 <saved_sdpos+0x2>
    d048:	b0 91 48 12 	lds	r27, 0x1248	; 0x801248 <saved_sdpos+0x3>
    d04c:	80 93 49 12 	sts	0x1249, r24	; 0x801249 <sdpos_atomic>
    d050:	90 93 4a 12 	sts	0x124A, r25	; 0x80124a <sdpos_atomic+0x1>
    d054:	a0 93 4b 12 	sts	0x124B, r26	; 0x80124b <sdpos_atomic+0x2>
    d058:	b0 93 4c 12 	sts	0x124C, r27	; 0x80124c <sdpos_atomic+0x3>
        card.sdprinting = true;
    d05c:	10 93 d7 13 	sts	0x13D7, r17	; 0x8013d7 <card+0x2>
        if (previous_value != value) {
            eeprom_byte_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_byte(dst, value);
    d060:	60 e0       	ldi	r22, 0x00	; 0
    d062:	85 ea       	ldi	r24, 0xA5	; 165
    d064:	9f e0       	ldi	r25, 0x0F	; 15
    d066:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
    d06a:	60 e0       	ldi	r22, 0x00	; 0
    d06c:	8f e7       	ldi	r24, 0x7F	; 127
    d06e:	9c e0       	ldi	r25, 0x0C	; 12
    d070:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
	set_destination_to_current();

    restore_print_file_state();
    eeprom_update_byte_notify((uint8_t*)EEPROM_UVLO, PowerPanic::NO_PENDING_RECOVERY);
    eeprom_update_byte_notify((uint8_t*)EEPROM_UVLO_Z_LIFTED, 0);
	lcd_setstatuspgm(MSG_WELCOME);
    d074:	86 ee       	ldi	r24, 0xE6	; 230
    d076:	9b e6       	ldi	r25, 0x6B	; 107
    d078:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
    saved_printing_type = PowerPanic::PRINT_TYPE_NONE;
    d07c:	82 e0       	ldi	r24, 0x02	; 2
    d07e:	80 93 79 02 	sts	0x0279, r24	; 0x800279 <saved_printing_type>
	saved_printing = false;
    d082:	10 92 73 12 	sts	0x1273, r1	; 0x801273 <saved_printing>
    planner_aborted = true; // unroll the stack
    d086:	81 e0       	ldi	r24, 0x01	; 1
    d088:	80 93 42 0d 	sts	0x0D42, r24	; 0x800d42 <planner_aborted>
}
    d08c:	28 96       	adiw	r28, 0x08	; 8
    d08e:	0f b6       	in	r0, 0x3f	; 63
    d090:	f8 94       	cli
    d092:	de bf       	out	0x3e, r29	; 62
    d094:	0f be       	out	0x3f, r0	; 63
    d096:	cd bf       	out	0x3d, r28	; 61
    d098:	df 91       	pop	r29
    d09a:	cf 91       	pop	r28
    d09c:	1f 91       	pop	r17
    d09e:	0f 91       	pop	r16
    d0a0:	ff 90       	pop	r15
    d0a2:	ef 90       	pop	r14
    d0a4:	df 90       	pop	r13
    d0a6:	cf 90       	pop	r12
    d0a8:	bf 90       	pop	r11
    d0aa:	af 90       	pop	r10
    d0ac:	9f 90       	pop	r9
    d0ae:	8f 90       	pop	r8
    d0b0:	7f 90       	pop	r7
    d0b2:	6f 90       	pop	r6
    d0b4:	5f 90       	pop	r5
    d0b6:	4f 90       	pop	r4
    d0b8:	08 95       	ret
void restore_print_file_state() {
    if (saved_printing_type == PowerPanic::PRINT_TYPE_SD) { //was sd printing
        card.setIndex(saved_sdpos);
        sdpos_atomic = saved_sdpos;
        card.sdprinting = true;
    } else if (saved_printing_type == PowerPanic::PRINT_TYPE_HOST) { //was usb printing
    d0ba:	81 30       	cpi	r24, 0x01	; 1
    d0bc:	89 f6       	brne	.-94     	; 0xd060 <restore_print_from_ram_and_continue(float)+0x2f0>
        gcode_LastN = saved_sdpos; //saved_sdpos was reused for storing line number when usb printing
    d0be:	80 91 45 12 	lds	r24, 0x1245	; 0x801245 <saved_sdpos>
    d0c2:	90 91 46 12 	lds	r25, 0x1246	; 0x801246 <saved_sdpos+0x1>
    d0c6:	a0 91 47 12 	lds	r26, 0x1247	; 0x801247 <saved_sdpos+0x2>
    d0ca:	b0 91 48 12 	lds	r27, 0x1248	; 0x801248 <saved_sdpos+0x3>
    d0ce:	80 93 3e 12 	sts	0x123E, r24	; 0x80123e <gcode_LastN>
    d0d2:	90 93 3f 12 	sts	0x123F, r25	; 0x80123f <gcode_LastN+0x1>
    d0d6:	a0 93 40 12 	sts	0x1240, r26	; 0x801240 <gcode_LastN+0x2>
    d0da:	b0 93 41 12 	sts	0x1241, r27	; 0x801241 <gcode_LastN+0x3>
        serial_count = 0;
    d0de:	10 92 48 10 	sts	0x1048, r1	; 0x801048 <serial_count+0x1>
    d0e2:	10 92 47 10 	sts	0x1047, r1	; 0x801047 <serial_count>
        FlushSerialRequestResend();
    d0e6:	0e 94 ac 55 	call	0xab58	; 0xab58 <FlushSerialRequestResend()>
    d0ea:	ba cf       	rjmp	.-140    	; 0xd060 <restore_print_from_ram_and_continue(float)+0x2f0>

0000d0ec <world2machine(float&, float&)>:
extern void world2machine_initialize();
extern void world2machine_read_valid(float vec_x[2], float vec_y[2], float cntr[2]);
extern void world2machine_update_current();

inline void world2machine(float &x, float &y)
{
    d0ec:	3f 92       	push	r3
    d0ee:	4f 92       	push	r4
    d0f0:	5f 92       	push	r5
    d0f2:	6f 92       	push	r6
    d0f4:	7f 92       	push	r7
    d0f6:	8f 92       	push	r8
    d0f8:	9f 92       	push	r9
    d0fa:	af 92       	push	r10
    d0fc:	bf 92       	push	r11
    d0fe:	cf 92       	push	r12
    d100:	df 92       	push	r13
    d102:	ef 92       	push	r14
    d104:	ff 92       	push	r15
    d106:	0f 93       	push	r16
    d108:	1f 93       	push	r17
    d10a:	cf 93       	push	r28
    d10c:	df 93       	push	r29
	if (world2machine_correction_mode == WORLD2MACHINE_CORRECTION_NONE) {
    d10e:	30 90 a2 04 	lds	r3, 0x04A2	; 0x8004a2 <world2machine_correction_mode>
    d112:	33 20       	and	r3, r3
    d114:	09 f4       	brne	.+2      	; 0xd118 <world2machine(float&, float&)+0x2c>
    d116:	80 c0       	rjmp	.+256    	; 0xd218 <world2machine(float&, float&)+0x12c>
    d118:	8b 01       	movw	r16, r22
    d11a:	ec 01       	movw	r28, r24
		// No correction.
	} else {
		if (world2machine_correction_mode & WORLD2MACHINE_CORRECTION_SKEW) {
    d11c:	31 fe       	sbrs	r3, 1
    d11e:	54 c0       	rjmp	.+168    	; 0xd1c8 <world2machine(float&, float&)+0xdc>
			// Firs the skew & rotation correction.
			float out_x = world2machine_rotation_and_skew[0][0] * x + world2machine_rotation_and_skew[0][1] * y;
    d120:	88 80       	ld	r8, Y
    d122:	99 80       	ldd	r9, Y+1	; 0x01
    d124:	aa 80       	ldd	r10, Y+2	; 0x02
    d126:	bb 80       	ldd	r11, Y+3	; 0x03
    d128:	fb 01       	movw	r30, r22
    d12a:	c0 80       	ld	r12, Z
    d12c:	d1 80       	ldd	r13, Z+1	; 0x01
    d12e:	e2 80       	ldd	r14, Z+2	; 0x02
    d130:	f3 80       	ldd	r15, Z+3	; 0x03
			float out_y = world2machine_rotation_and_skew[1][0] * x + world2machine_rotation_and_skew[1][1] * y;
    d132:	20 91 77 03 	lds	r18, 0x0377	; 0x800377 <world2machine_rotation_and_skew+0x8>
    d136:	30 91 78 03 	lds	r19, 0x0378	; 0x800378 <world2machine_rotation_and_skew+0x9>
    d13a:	40 91 79 03 	lds	r20, 0x0379	; 0x800379 <world2machine_rotation_and_skew+0xa>
    d13e:	50 91 7a 03 	lds	r21, 0x037A	; 0x80037a <world2machine_rotation_and_skew+0xb>
    d142:	c5 01       	movw	r24, r10
    d144:	b4 01       	movw	r22, r8
    d146:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    d14a:	2b 01       	movw	r4, r22
    d14c:	3c 01       	movw	r6, r24
    d14e:	20 91 7b 03 	lds	r18, 0x037B	; 0x80037b <world2machine_rotation_and_skew+0xc>
    d152:	30 91 7c 03 	lds	r19, 0x037C	; 0x80037c <world2machine_rotation_and_skew+0xd>
    d156:	40 91 7d 03 	lds	r20, 0x037D	; 0x80037d <world2machine_rotation_and_skew+0xe>
    d15a:	50 91 7e 03 	lds	r21, 0x037E	; 0x80037e <world2machine_rotation_and_skew+0xf>
    d15e:	c7 01       	movw	r24, r14
    d160:	b6 01       	movw	r22, r12
    d162:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    d166:	9b 01       	movw	r18, r22
    d168:	ac 01       	movw	r20, r24
    d16a:	c3 01       	movw	r24, r6
    d16c:	b2 01       	movw	r22, r4
    d16e:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    d172:	2b 01       	movw	r4, r22
    d174:	3c 01       	movw	r6, r24
	if (world2machine_correction_mode == WORLD2MACHINE_CORRECTION_NONE) {
		// No correction.
	} else {
		if (world2machine_correction_mode & WORLD2MACHINE_CORRECTION_SKEW) {
			// Firs the skew & rotation correction.
			float out_x = world2machine_rotation_and_skew[0][0] * x + world2machine_rotation_and_skew[0][1] * y;
    d176:	20 91 6f 03 	lds	r18, 0x036F	; 0x80036f <world2machine_rotation_and_skew>
    d17a:	30 91 70 03 	lds	r19, 0x0370	; 0x800370 <world2machine_rotation_and_skew+0x1>
    d17e:	40 91 71 03 	lds	r20, 0x0371	; 0x800371 <world2machine_rotation_and_skew+0x2>
    d182:	50 91 72 03 	lds	r21, 0x0372	; 0x800372 <world2machine_rotation_and_skew+0x3>
    d186:	c5 01       	movw	r24, r10
    d188:	b4 01       	movw	r22, r8
    d18a:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    d18e:	4b 01       	movw	r8, r22
    d190:	5c 01       	movw	r10, r24
    d192:	20 91 73 03 	lds	r18, 0x0373	; 0x800373 <world2machine_rotation_and_skew+0x4>
    d196:	30 91 74 03 	lds	r19, 0x0374	; 0x800374 <world2machine_rotation_and_skew+0x5>
    d19a:	40 91 75 03 	lds	r20, 0x0375	; 0x800375 <world2machine_rotation_and_skew+0x6>
    d19e:	50 91 76 03 	lds	r21, 0x0376	; 0x800376 <world2machine_rotation_and_skew+0x7>
    d1a2:	c7 01       	movw	r24, r14
    d1a4:	b6 01       	movw	r22, r12
    d1a6:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    d1aa:	9b 01       	movw	r18, r22
    d1ac:	ac 01       	movw	r20, r24
    d1ae:	c5 01       	movw	r24, r10
    d1b0:	b4 01       	movw	r22, r8
    d1b2:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
			float out_y = world2machine_rotation_and_skew[1][0] * x + world2machine_rotation_and_skew[1][1] * y;
			x = out_x;
    d1b6:	68 83       	st	Y, r22
    d1b8:	79 83       	std	Y+1, r23	; 0x01
    d1ba:	8a 83       	std	Y+2, r24	; 0x02
    d1bc:	9b 83       	std	Y+3, r25	; 0x03
			y = out_y;
    d1be:	f8 01       	movw	r30, r16
    d1c0:	40 82       	st	Z, r4
    d1c2:	51 82       	std	Z+1, r5	; 0x01
    d1c4:	62 82       	std	Z+2, r6	; 0x02
    d1c6:	73 82       	std	Z+3, r7	; 0x03
		}
		if (world2machine_correction_mode & WORLD2MACHINE_CORRECTION_SHIFT) {
    d1c8:	30 fe       	sbrs	r3, 0
    d1ca:	26 c0       	rjmp	.+76     	; 0xd218 <world2machine(float&, float&)+0x12c>
			// Then add the offset.
			x += world2machine_shift[0];
    d1cc:	20 91 9a 04 	lds	r18, 0x049A	; 0x80049a <world2machine_shift>
    d1d0:	30 91 9b 04 	lds	r19, 0x049B	; 0x80049b <world2machine_shift+0x1>
    d1d4:	40 91 9c 04 	lds	r20, 0x049C	; 0x80049c <world2machine_shift+0x2>
    d1d8:	50 91 9d 04 	lds	r21, 0x049D	; 0x80049d <world2machine_shift+0x3>
    d1dc:	68 81       	ld	r22, Y
    d1de:	79 81       	ldd	r23, Y+1	; 0x01
    d1e0:	8a 81       	ldd	r24, Y+2	; 0x02
    d1e2:	9b 81       	ldd	r25, Y+3	; 0x03
    d1e4:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    d1e8:	68 83       	st	Y, r22
    d1ea:	79 83       	std	Y+1, r23	; 0x01
    d1ec:	8a 83       	std	Y+2, r24	; 0x02
    d1ee:	9b 83       	std	Y+3, r25	; 0x03
			y += world2machine_shift[1];
    d1f0:	20 91 9e 04 	lds	r18, 0x049E	; 0x80049e <world2machine_shift+0x4>
    d1f4:	30 91 9f 04 	lds	r19, 0x049F	; 0x80049f <world2machine_shift+0x5>
    d1f8:	40 91 a0 04 	lds	r20, 0x04A0	; 0x8004a0 <world2machine_shift+0x6>
    d1fc:	50 91 a1 04 	lds	r21, 0x04A1	; 0x8004a1 <world2machine_shift+0x7>
    d200:	f8 01       	movw	r30, r16
    d202:	60 81       	ld	r22, Z
    d204:	71 81       	ldd	r23, Z+1	; 0x01
    d206:	82 81       	ldd	r24, Z+2	; 0x02
    d208:	93 81       	ldd	r25, Z+3	; 0x03
    d20a:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    d20e:	f8 01       	movw	r30, r16
    d210:	60 83       	st	Z, r22
    d212:	71 83       	std	Z+1, r23	; 0x01
    d214:	82 83       	std	Z+2, r24	; 0x02
    d216:	93 83       	std	Z+3, r25	; 0x03
		}
	}
}
    d218:	df 91       	pop	r29
    d21a:	cf 91       	pop	r28
    d21c:	1f 91       	pop	r17
    d21e:	0f 91       	pop	r16
    d220:	ff 90       	pop	r15
    d222:	ef 90       	pop	r14
    d224:	df 90       	pop	r13
    d226:	cf 90       	pop	r12
    d228:	bf 90       	pop	r11
    d22a:	af 90       	pop	r10
    d22c:	9f 90       	pop	r9
    d22e:	8f 90       	pop	r8
    d230:	7f 90       	pop	r7
    d232:	6f 90       	pop	r6
    d234:	5f 90       	pop	r5
    d236:	4f 90       	pop	r4
    d238:	3f 90       	pop	r3
    d23a:	08 95       	ret

0000d23c <world2machine_clamp(float&, float&)>:
		}
	}
}

inline bool world2machine_clamp(float &x, float &y)
{
    d23c:	2f 92       	push	r2
    d23e:	3f 92       	push	r3
    d240:	4f 92       	push	r4
    d242:	5f 92       	push	r5
    d244:	6f 92       	push	r6
    d246:	7f 92       	push	r7
    d248:	8f 92       	push	r8
    d24a:	9f 92       	push	r9
    d24c:	af 92       	push	r10
    d24e:	bf 92       	push	r11
    d250:	cf 92       	push	r12
    d252:	df 92       	push	r13
    d254:	ef 92       	push	r14
    d256:	ff 92       	push	r15
    d258:	0f 93       	push	r16
    d25a:	1f 93       	push	r17
    d25c:	cf 93       	push	r28
    d25e:	df 93       	push	r29
    d260:	00 d0       	rcall	.+0      	; 0xd262 <world2machine_clamp(float&, float&)+0x26>
    d262:	00 d0       	rcall	.+0      	; 0xd264 <world2machine_clamp(float&, float&)+0x28>
    d264:	1f 92       	push	r1
    d266:	1f 92       	push	r1
    d268:	cd b7       	in	r28, 0x3d	; 61
    d26a:	de b7       	in	r29, 0x3e	; 62
    d26c:	8c 01       	movw	r16, r24
    d26e:	1b 01       	movw	r2, r22
	}
}

inline void world2machine(const float &x, const float &y, float &out_x, float &out_y)
{
    out_x = x;
    d270:	fc 01       	movw	r30, r24
    d272:	80 81       	ld	r24, Z
    d274:	91 81       	ldd	r25, Z+1	; 0x01
    d276:	a2 81       	ldd	r26, Z+2	; 0x02
    d278:	b3 81       	ldd	r27, Z+3	; 0x03
    d27a:	89 83       	std	Y+1, r24	; 0x01
    d27c:	9a 83       	std	Y+2, r25	; 0x02
    d27e:	ab 83       	std	Y+3, r26	; 0x03
    d280:	bc 83       	std	Y+4, r27	; 0x04
    out_y = y;
    d282:	fb 01       	movw	r30, r22
    d284:	80 81       	ld	r24, Z
    d286:	91 81       	ldd	r25, Z+1	; 0x01
    d288:	a2 81       	ldd	r26, Z+2	; 0x02
    d28a:	b3 81       	ldd	r27, Z+3	; 0x03
    d28c:	8d 83       	std	Y+5, r24	; 0x05
    d28e:	9e 83       	std	Y+6, r25	; 0x06
    d290:	af 83       	std	Y+7, r26	; 0x07
    d292:	b8 87       	std	Y+8, r27	; 0x08
    world2machine(out_x, out_y);
    d294:	be 01       	movw	r22, r28
    d296:	6b 5f       	subi	r22, 0xFB	; 251
    d298:	7f 4f       	sbci	r23, 0xFF	; 255
    d29a:	ce 01       	movw	r24, r28
    d29c:	01 96       	adiw	r24, 0x01	; 1
    d29e:	0e 94 76 68 	call	0xd0ec	; 0xd0ec <world2machine(float&, float&)>
inline bool world2machine_clamp(float &x, float &y)
{
	bool clamped = false;
	float tmpx, tmpy;
    world2machine(x, y, tmpx, tmpy);
    if (tmpx < X_MIN_POS) {
    d2a2:	c9 80       	ldd	r12, Y+1	; 0x01
    d2a4:	da 80       	ldd	r13, Y+2	; 0x02
    d2a6:	eb 80       	ldd	r14, Y+3	; 0x03
    d2a8:	fc 80       	ldd	r15, Y+4	; 0x04
    d2aa:	20 e0       	ldi	r18, 0x00	; 0
    d2ac:	30 e0       	ldi	r19, 0x00	; 0
    d2ae:	a9 01       	movw	r20, r18
    d2b0:	c7 01       	movw	r24, r14
    d2b2:	b6 01       	movw	r22, r12
    d2b4:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
    d2b8:	87 ff       	sbrs	r24, 7
    d2ba:	35 c0       	rjmp	.+106    	; 0xd326 <world2machine_clamp(float&, float&)+0xea>
        tmpx = X_MIN_POS;
    d2bc:	19 82       	std	Y+1, r1	; 0x01
    d2be:	1a 82       	std	Y+2, r1	; 0x02
    d2c0:	1b 82       	std	Y+3, r1	; 0x03
    d2c2:	1c 82       	std	Y+4, r1	; 0x04
        clamped = true;
    } else if (tmpx > X_MAX_POS) {
        tmpx = X_MAX_POS;
        clamped = true;
    d2c4:	ff 24       	eor	r15, r15
    d2c6:	f3 94       	inc	r15
    }

    if (tmpy < Y_MIN_POS) {
    d2c8:	8d 80       	ldd	r8, Y+5	; 0x05
    d2ca:	9e 80       	ldd	r9, Y+6	; 0x06
    d2cc:	af 80       	ldd	r10, Y+7	; 0x07
    d2ce:	b8 84       	ldd	r11, Y+8	; 0x08
    d2d0:	20 e0       	ldi	r18, 0x00	; 0
    d2d2:	30 e0       	ldi	r19, 0x00	; 0
    d2d4:	40 e8       	ldi	r20, 0x80	; 128
    d2d6:	50 ec       	ldi	r21, 0xC0	; 192
    d2d8:	c5 01       	movw	r24, r10
    d2da:	b4 01       	movw	r22, r8
    d2dc:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
    d2e0:	87 ff       	sbrs	r24, 7
    d2e2:	35 c0       	rjmp	.+106    	; 0xd34e <world2machine_clamp(float&, float&)+0x112>
        tmpy = Y_MIN_POS;
    d2e4:	80 e0       	ldi	r24, 0x00	; 0
    d2e6:	90 e0       	ldi	r25, 0x00	; 0
    d2e8:	a0 e8       	ldi	r26, 0x80	; 128
    d2ea:	b0 ec       	ldi	r27, 0xC0	; 192
        clamped = true;
    } else if (tmpy > Y_MAX_POS) {
        tmpy = Y_MAX_POS;
    d2ec:	8d 83       	std	Y+5, r24	; 0x05
    d2ee:	9e 83       	std	Y+6, r25	; 0x06
    d2f0:	af 83       	std	Y+7, r26	; 0x07
    d2f2:	b8 87       	std	Y+8, r27	; 0x08
        clamped = true;
    }
    if (clamped)
        machine2world(tmpx, tmpy, x, y);
    d2f4:	cd 80       	ldd	r12, Y+5	; 0x05
    d2f6:	de 80       	ldd	r13, Y+6	; 0x06
    d2f8:	ef 80       	ldd	r14, Y+7	; 0x07
    d2fa:	f8 84       	ldd	r15, Y+8	; 0x08
    d2fc:	89 80       	ldd	r8, Y+1	; 0x01
    d2fe:	9a 80       	ldd	r9, Y+2	; 0x02
    d300:	ab 80       	ldd	r10, Y+3	; 0x03
    d302:	bc 80       	ldd	r11, Y+4	; 0x04
    world2machine(out_x, out_y);
}

inline void machine2world(float x, float y, float &out_x, float &out_y)
{
	if (world2machine_correction_mode == WORLD2MACHINE_CORRECTION_NONE) {
    d304:	70 90 a2 04 	lds	r7, 0x04A2	; 0x8004a2 <world2machine_correction_mode>
    d308:	71 10       	cpse	r7, r1
    d30a:	4c c0       	rjmp	.+152    	; 0xd3a4 <world2machine_clamp(float&, float&)+0x168>
		// No correction.
		out_x = x;
    d30c:	f8 01       	movw	r30, r16
    d30e:	80 82       	st	Z, r8
    d310:	91 82       	std	Z+1, r9	; 0x01
    d312:	a2 82       	std	Z+2, r10	; 0x02
    d314:	b3 82       	std	Z+3, r11	; 0x03
		out_y = y;
    d316:	f1 01       	movw	r30, r2
    d318:	c0 82       	st	Z, r12
    d31a:	d1 82       	std	Z+1, r13	; 0x01
    d31c:	e2 82       	std	Z+2, r14	; 0x02
    d31e:	f3 82       	std	Z+3, r15	; 0x03
		if (world2machine_correction_mode & WORLD2MACHINE_CORRECTION_SHIFT) {
			// Then add the offset.
			x -= world2machine_shift[0];
			y -= world2machine_shift[1];
		}
		if (world2machine_correction_mode & WORLD2MACHINE_CORRECTION_SKEW) {
    d320:	ff 24       	eor	r15, r15
    d322:	f3 94       	inc	r15
    d324:	25 c0       	rjmp	.+74     	; 0xd370 <world2machine_clamp(float&, float&)+0x134>
	float tmpx, tmpy;
    world2machine(x, y, tmpx, tmpy);
    if (tmpx < X_MIN_POS) {
        tmpx = X_MIN_POS;
        clamped = true;
    } else if (tmpx > X_MAX_POS) {
    d326:	20 e0       	ldi	r18, 0x00	; 0
    d328:	30 e0       	ldi	r19, 0x00	; 0
    d32a:	4a e7       	ldi	r20, 0x7A	; 122
    d32c:	53 e4       	ldi	r21, 0x43	; 67
    d32e:	c7 01       	movw	r24, r14
    d330:	b6 01       	movw	r22, r12
    d332:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
	}
}

inline bool world2machine_clamp(float &x, float &y)
{
	bool clamped = false;
    d336:	f1 2c       	mov	r15, r1
	float tmpx, tmpy;
    world2machine(x, y, tmpx, tmpy);
    if (tmpx < X_MIN_POS) {
        tmpx = X_MIN_POS;
        clamped = true;
    } else if (tmpx > X_MAX_POS) {
    d338:	18 16       	cp	r1, r24
    d33a:	34 f6       	brge	.-116    	; 0xd2c8 <world2machine_clamp(float&, float&)+0x8c>
        tmpx = X_MAX_POS;
    d33c:	80 e0       	ldi	r24, 0x00	; 0
    d33e:	90 e0       	ldi	r25, 0x00	; 0
    d340:	aa e7       	ldi	r26, 0x7A	; 122
    d342:	b3 e4       	ldi	r27, 0x43	; 67
    d344:	89 83       	std	Y+1, r24	; 0x01
    d346:	9a 83       	std	Y+2, r25	; 0x02
    d348:	ab 83       	std	Y+3, r26	; 0x03
    d34a:	bc 83       	std	Y+4, r27	; 0x04
    d34c:	bb cf       	rjmp	.-138    	; 0xd2c4 <world2machine_clamp(float&, float&)+0x88>
    }

    if (tmpy < Y_MIN_POS) {
        tmpy = Y_MIN_POS;
        clamped = true;
    } else if (tmpy > Y_MAX_POS) {
    d34e:	20 e0       	ldi	r18, 0x00	; 0
    d350:	30 e0       	ldi	r19, 0x00	; 0
    d352:	42 e5       	ldi	r20, 0x52	; 82
    d354:	53 e4       	ldi	r21, 0x43	; 67
    d356:	c5 01       	movw	r24, r10
    d358:	b4 01       	movw	r22, r8
    d35a:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
    d35e:	18 16       	cp	r1, r24
    d360:	2c f4       	brge	.+10     	; 0xd36c <world2machine_clamp(float&, float&)+0x130>
        tmpy = Y_MAX_POS;
    d362:	80 e0       	ldi	r24, 0x00	; 0
    d364:	90 e0       	ldi	r25, 0x00	; 0
    d366:	a2 e5       	ldi	r26, 0x52	; 82
    d368:	b3 e4       	ldi	r27, 0x43	; 67
    d36a:	c0 cf       	rjmp	.-128    	; 0xd2ec <world2machine_clamp(float&, float&)+0xb0>
        clamped = true;
    }
    if (clamped)
    d36c:	f1 10       	cpse	r15, r1
    d36e:	c2 cf       	rjmp	.-124    	; 0xd2f4 <world2machine_clamp(float&, float&)+0xb8>
        machine2world(tmpx, tmpy, x, y);
    return clamped;
}
    d370:	8f 2d       	mov	r24, r15
    d372:	28 96       	adiw	r28, 0x08	; 8
    d374:	0f b6       	in	r0, 0x3f	; 63
    d376:	f8 94       	cli
    d378:	de bf       	out	0x3e, r29	; 62
    d37a:	0f be       	out	0x3f, r0	; 63
    d37c:	cd bf       	out	0x3d, r28	; 61
    d37e:	df 91       	pop	r29
    d380:	cf 91       	pop	r28
    d382:	1f 91       	pop	r17
    d384:	0f 91       	pop	r16
    d386:	ff 90       	pop	r15
    d388:	ef 90       	pop	r14
    d38a:	df 90       	pop	r13
    d38c:	cf 90       	pop	r12
    d38e:	bf 90       	pop	r11
    d390:	af 90       	pop	r10
    d392:	9f 90       	pop	r9
    d394:	8f 90       	pop	r8
    d396:	7f 90       	pop	r7
    d398:	6f 90       	pop	r6
    d39a:	5f 90       	pop	r5
    d39c:	4f 90       	pop	r4
    d39e:	3f 90       	pop	r3
    d3a0:	2f 90       	pop	r2
    d3a2:	08 95       	ret
	if (world2machine_correction_mode == WORLD2MACHINE_CORRECTION_NONE) {
		// No correction.
		out_x = x;
		out_y = y;
	} else {
		if (world2machine_correction_mode & WORLD2MACHINE_CORRECTION_SHIFT) {
    d3a4:	70 fe       	sbrs	r7, 0
    d3a6:	1c c0       	rjmp	.+56     	; 0xd3e0 <world2machine_clamp(float&, float&)+0x1a4>
			// Then add the offset.
			x -= world2machine_shift[0];
    d3a8:	20 91 9a 04 	lds	r18, 0x049A	; 0x80049a <world2machine_shift>
    d3ac:	30 91 9b 04 	lds	r19, 0x049B	; 0x80049b <world2machine_shift+0x1>
    d3b0:	40 91 9c 04 	lds	r20, 0x049C	; 0x80049c <world2machine_shift+0x2>
    d3b4:	50 91 9d 04 	lds	r21, 0x049D	; 0x80049d <world2machine_shift+0x3>
    d3b8:	c5 01       	movw	r24, r10
    d3ba:	b4 01       	movw	r22, r8
    d3bc:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    d3c0:	4b 01       	movw	r8, r22
    d3c2:	5c 01       	movw	r10, r24
			y -= world2machine_shift[1];
    d3c4:	20 91 9e 04 	lds	r18, 0x049E	; 0x80049e <world2machine_shift+0x4>
    d3c8:	30 91 9f 04 	lds	r19, 0x049F	; 0x80049f <world2machine_shift+0x5>
    d3cc:	40 91 a0 04 	lds	r20, 0x04A0	; 0x8004a0 <world2machine_shift+0x6>
    d3d0:	50 91 a1 04 	lds	r21, 0x04A1	; 0x8004a1 <world2machine_shift+0x7>
    d3d4:	c7 01       	movw	r24, r14
    d3d6:	b6 01       	movw	r22, r12
    d3d8:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    d3dc:	6b 01       	movw	r12, r22
    d3de:	7c 01       	movw	r14, r24
		}
		if (world2machine_correction_mode & WORLD2MACHINE_CORRECTION_SKEW) {
    d3e0:	71 fe       	sbrs	r7, 1
    d3e2:	9e cf       	rjmp	.-196    	; 0xd320 <world2machine_clamp(float&, float&)+0xe4>
			// Firs the skew & rotation correction.
			out_x = world2machine_rotation_and_skew_inv[0][0] * x + world2machine_rotation_and_skew_inv[0][1] * y;
    d3e4:	20 91 8a 04 	lds	r18, 0x048A	; 0x80048a <world2machine_rotation_and_skew_inv>
    d3e8:	30 91 8b 04 	lds	r19, 0x048B	; 0x80048b <world2machine_rotation_and_skew_inv+0x1>
    d3ec:	40 91 8c 04 	lds	r20, 0x048C	; 0x80048c <world2machine_rotation_and_skew_inv+0x2>
    d3f0:	50 91 8d 04 	lds	r21, 0x048D	; 0x80048d <world2machine_rotation_and_skew_inv+0x3>
    d3f4:	c5 01       	movw	r24, r10
    d3f6:	b4 01       	movw	r22, r8
    d3f8:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    d3fc:	2b 01       	movw	r4, r22
    d3fe:	3c 01       	movw	r6, r24
    d400:	20 91 8e 04 	lds	r18, 0x048E	; 0x80048e <world2machine_rotation_and_skew_inv+0x4>
    d404:	30 91 8f 04 	lds	r19, 0x048F	; 0x80048f <world2machine_rotation_and_skew_inv+0x5>
    d408:	40 91 90 04 	lds	r20, 0x0490	; 0x800490 <world2machine_rotation_and_skew_inv+0x6>
    d40c:	50 91 91 04 	lds	r21, 0x0491	; 0x800491 <world2machine_rotation_and_skew_inv+0x7>
    d410:	c7 01       	movw	r24, r14
    d412:	b6 01       	movw	r22, r12
    d414:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    d418:	9b 01       	movw	r18, r22
    d41a:	ac 01       	movw	r20, r24
    d41c:	c3 01       	movw	r24, r6
    d41e:	b2 01       	movw	r22, r4
    d420:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    d424:	f8 01       	movw	r30, r16
    d426:	60 83       	st	Z, r22
    d428:	71 83       	std	Z+1, r23	; 0x01
    d42a:	82 83       	std	Z+2, r24	; 0x02
    d42c:	93 83       	std	Z+3, r25	; 0x03
			out_y = world2machine_rotation_and_skew_inv[1][0] * x + world2machine_rotation_and_skew_inv[1][1] * y;
    d42e:	20 91 92 04 	lds	r18, 0x0492	; 0x800492 <world2machine_rotation_and_skew_inv+0x8>
    d432:	30 91 93 04 	lds	r19, 0x0493	; 0x800493 <world2machine_rotation_and_skew_inv+0x9>
    d436:	40 91 94 04 	lds	r20, 0x0494	; 0x800494 <world2machine_rotation_and_skew_inv+0xa>
    d43a:	50 91 95 04 	lds	r21, 0x0495	; 0x800495 <world2machine_rotation_and_skew_inv+0xb>
    d43e:	c5 01       	movw	r24, r10
    d440:	b4 01       	movw	r22, r8
    d442:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    d446:	4b 01       	movw	r8, r22
    d448:	5c 01       	movw	r10, r24
    d44a:	20 91 96 04 	lds	r18, 0x0496	; 0x800496 <world2machine_rotation_and_skew_inv+0xc>
    d44e:	30 91 97 04 	lds	r19, 0x0497	; 0x800497 <world2machine_rotation_and_skew_inv+0xd>
    d452:	40 91 98 04 	lds	r20, 0x0498	; 0x800498 <world2machine_rotation_and_skew_inv+0xe>
    d456:	50 91 99 04 	lds	r21, 0x0499	; 0x800499 <world2machine_rotation_and_skew_inv+0xf>
    d45a:	c7 01       	movw	r24, r14
    d45c:	b6 01       	movw	r22, r12
    d45e:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    d462:	9b 01       	movw	r18, r22
    d464:	ac 01       	movw	r20, r24
    d466:	c5 01       	movw	r24, r10
    d468:	b4 01       	movw	r22, r8
    d46a:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    d46e:	f1 01       	movw	r30, r2
    d470:	60 83       	st	Z, r22
    d472:	71 83       	std	Z+1, r23	; 0x01
    d474:	82 83       	std	Z+2, r24	; 0x02
    d476:	93 83       	std	Z+3, r25	; 0x03
    d478:	53 cf       	rjmp	.-346    	; 0xd320 <world2machine_clamp(float&, float&)+0xe4>

0000d47a <go_home_with_z_lift()>:

    return sampled;
}

void go_home_with_z_lift()
{
    d47a:	cf 93       	push	r28
    d47c:	df 93       	push	r29
    // Don't let the manage_inactivity() function remove power from the motors.
    refresh_cmd_timeout();
    d47e:	0e 94 41 65 	call	0xca82	; 0xca82 <refresh_cmd_timeout()>
    // Go home.
    // First move up to a safe height.
    current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
    d482:	c1 e6       	ldi	r28, 0x61	; 97
    d484:	d2 e1       	ldi	r29, 0x12	; 18
    d486:	80 e0       	ldi	r24, 0x00	; 0
    d488:	90 e0       	ldi	r25, 0x00	; 0
    d48a:	a0 ea       	ldi	r26, 0xA0	; 160
    d48c:	b0 e4       	ldi	r27, 0x40	; 64
    d48e:	88 87       	std	Y+8, r24	; 0x08
    d490:	99 87       	std	Y+9, r25	; 0x09
    d492:	aa 87       	std	Y+10, r26	; 0x0a
    d494:	bb 87       	std	Y+11, r27	; 0x0b
    go_to_current(homing_feedrate[Z_AXIS] / 60);
    d496:	65 e5       	ldi	r22, 0x55	; 85
    d498:	75 e5       	ldi	r23, 0x55	; 85
    d49a:	85 e5       	ldi	r24, 0x55	; 85
    d49c:	91 e4       	ldi	r25, 0x41	; 65
    d49e:	0f 94 f6 50 	call	0x2a1ec	; 0x2a1ec <go_to_current(float) [clone .lto_priv.377]>
    // Second move to XY [0, 0].
    current_position[X_AXIS] = X_MIN_POS + 0.2;
    d4a2:	8d ec       	ldi	r24, 0xCD	; 205
    d4a4:	9c ec       	ldi	r25, 0xCC	; 204
    d4a6:	ac e4       	ldi	r26, 0x4C	; 76
    d4a8:	be e3       	ldi	r27, 0x3E	; 62
    d4aa:	88 83       	st	Y, r24
    d4ac:	99 83       	std	Y+1, r25	; 0x01
    d4ae:	aa 83       	std	Y+2, r26	; 0x02
    d4b0:	bb 83       	std	Y+3, r27	; 0x03
    current_position[Y_AXIS] = Y_MIN_POS + 0.2;
    d4b2:	83 e3       	ldi	r24, 0x33	; 51
    d4b4:	93 e3       	ldi	r25, 0x33	; 51
    d4b6:	a3 e7       	ldi	r26, 0x73	; 115
    d4b8:	b0 ec       	ldi	r27, 0xC0	; 192
    d4ba:	8c 83       	std	Y+4, r24	; 0x04
    d4bc:	9d 83       	std	Y+5, r25	; 0x05
    d4be:	ae 83       	std	Y+6, r26	; 0x06
    d4c0:	bf 83       	std	Y+7, r27	; 0x07
    // Clamp to the physical coordinates.
    world2machine_clamp(current_position[X_AXIS], current_position[Y_AXIS]);
    d4c2:	65 e6       	ldi	r22, 0x65	; 101
    d4c4:	72 e1       	ldi	r23, 0x12	; 18
    d4c6:	ce 01       	movw	r24, r28
    d4c8:	0e 94 1e 69 	call	0xd23c	; 0xd23c <world2machine_clamp(float&, float&)>
    go_to_current((3 * homing_feedrate[X_AXIS]) / 60);
    d4cc:	60 e0       	ldi	r22, 0x00	; 0
    d4ce:	70 e0       	ldi	r23, 0x00	; 0
    d4d0:	86 e1       	ldi	r24, 0x16	; 22
    d4d2:	93 e4       	ldi	r25, 0x43	; 67
    d4d4:	0f 94 f6 50 	call	0x2a1ec	; 0x2a1ec <go_to_current(float) [clone .lto_priv.377]>
    // Third move up to a safe height.
    current_position[Z_AXIS] = Z_MIN_POS;
    d4d8:	8a e9       	ldi	r24, 0x9A	; 154
    d4da:	99 e9       	ldi	r25, 0x99	; 153
    d4dc:	a9 e1       	ldi	r26, 0x19	; 25
    d4de:	be e3       	ldi	r27, 0x3E	; 62
    d4e0:	88 87       	std	Y+8, r24	; 0x08
    d4e2:	99 87       	std	Y+9, r25	; 0x09
    d4e4:	aa 87       	std	Y+10, r26	; 0x0a
    d4e6:	bb 87       	std	Y+11, r27	; 0x0b
    go_to_current(homing_feedrate[Z_AXIS] / 60);
    d4e8:	65 e5       	ldi	r22, 0x55	; 85
    d4ea:	75 e5       	ldi	r23, 0x55	; 85
    d4ec:	85 e5       	ldi	r24, 0x55	; 85
    d4ee:	91 e4       	ldi	r25, 0x41	; 65
}
    d4f0:	df 91       	pop	r29
    d4f2:	cf 91       	pop	r28
    // Clamp to the physical coordinates.
    world2machine_clamp(current_position[X_AXIS], current_position[Y_AXIS]);
    go_to_current((3 * homing_feedrate[X_AXIS]) / 60);
    // Third move up to a safe height.
    current_position[Z_AXIS] = Z_MIN_POS;
    go_to_current(homing_feedrate[Z_AXIS] / 60);
    d4f4:	0d 94 f6 50 	jmp	0x2a1ec	; 0x2a1ec <go_to_current(float) [clone .lto_priv.377]>

0000d4f8 <clamp_to_software_endstops(float*)>:
    if(next_feedrate > 0.f) feedrate = next_feedrate;
  }
}

void clamp_to_software_endstops(float target[3])
{
    d4f8:	cf 92       	push	r12
    d4fa:	df 92       	push	r13
    d4fc:	ef 92       	push	r14
    d4fe:	ff 92       	push	r15
    d500:	cf 93       	push	r28
    d502:	df 93       	push	r29
    d504:	ec 01       	movw	r28, r24
#ifdef DEBUG_DISABLE_SWLIMITS
	return;
#endif //DEBUG_DISABLE_SWLIMITS
    world2machine_clamp(target[0], target[1]);
    d506:	bc 01       	movw	r22, r24
    d508:	6c 5f       	subi	r22, 0xFC	; 252
    d50a:	7f 4f       	sbci	r23, 0xFF	; 255
    d50c:	0e 94 1e 69 	call	0xd23c	; 0xd23c <world2machine_clamp(float&, float&)>

    // Clamp the Z coordinate.
    if (min_software_endstops) {
        if (target[Z_AXIS] < min_pos[Z_AXIS]) target[Z_AXIS] = min_pos[Z_AXIS];
    d510:	c0 90 2c 02 	lds	r12, 0x022C	; 0x80022c <min_pos+0x8>
    d514:	d0 90 2d 02 	lds	r13, 0x022D	; 0x80022d <min_pos+0x9>
    d518:	e0 90 2e 02 	lds	r14, 0x022E	; 0x80022e <min_pos+0xa>
    d51c:	f0 90 2f 02 	lds	r15, 0x022F	; 0x80022f <min_pos+0xb>
    d520:	a7 01       	movw	r20, r14
    d522:	96 01       	movw	r18, r12
    d524:	68 85       	ldd	r22, Y+8	; 0x08
    d526:	79 85       	ldd	r23, Y+9	; 0x09
    d528:	8a 85       	ldd	r24, Y+10	; 0x0a
    d52a:	9b 85       	ldd	r25, Y+11	; 0x0b
    d52c:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
    d530:	87 ff       	sbrs	r24, 7
    d532:	04 c0       	rjmp	.+8      	; 0xd53c <clamp_to_software_endstops(float*)+0x44>
    d534:	c8 86       	std	Y+8, r12	; 0x08
    d536:	d9 86       	std	Y+9, r13	; 0x09
    d538:	ea 86       	std	Y+10, r14	; 0x0a
    d53a:	fb 86       	std	Y+11, r15	; 0x0b
    }
    if (max_software_endstops) {
        if (target[Z_AXIS] > max_pos[Z_AXIS]) target[Z_AXIS] = max_pos[Z_AXIS];
    d53c:	c0 90 20 02 	lds	r12, 0x0220	; 0x800220 <max_pos+0x8>
    d540:	d0 90 21 02 	lds	r13, 0x0221	; 0x800221 <max_pos+0x9>
    d544:	e0 90 22 02 	lds	r14, 0x0222	; 0x800222 <max_pos+0xa>
    d548:	f0 90 23 02 	lds	r15, 0x0223	; 0x800223 <max_pos+0xb>
    d54c:	a7 01       	movw	r20, r14
    d54e:	96 01       	movw	r18, r12
    d550:	68 85       	ldd	r22, Y+8	; 0x08
    d552:	79 85       	ldd	r23, Y+9	; 0x09
    d554:	8a 85       	ldd	r24, Y+10	; 0x0a
    d556:	9b 85       	ldd	r25, Y+11	; 0x0b
    d558:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
    d55c:	18 16       	cp	r1, r24
    d55e:	24 f4       	brge	.+8      	; 0xd568 <clamp_to_software_endstops(float*)+0x70>
    d560:	c8 86       	std	Y+8, r12	; 0x08
    d562:	d9 86       	std	Y+9, r13	; 0x09
    d564:	ea 86       	std	Y+10, r14	; 0x0a
    d566:	fb 86       	std	Y+11, r15	; 0x0b
    }
}
    d568:	df 91       	pop	r29
    d56a:	cf 91       	pop	r28
    d56c:	ff 90       	pop	r15
    d56e:	ef 90       	pop	r14
    d570:	df 90       	pop	r13
    d572:	cf 90       	pop	r12
    d574:	08 95       	ret

0000d576 <prepare_move(unsigned int)>:
        plan_buffer_line(x, y, z, e, feed_rate, current_position);
    }
#endif  // MESH_BED_LEVELING

void prepare_move(uint16_t start_segment_idx)
{
    d576:	2f 92       	push	r2
    d578:	3f 92       	push	r3
    d57a:	4f 92       	push	r4
    d57c:	5f 92       	push	r5
    d57e:	6f 92       	push	r6
    d580:	7f 92       	push	r7
    d582:	8f 92       	push	r8
    d584:	9f 92       	push	r9
    d586:	af 92       	push	r10
    d588:	bf 92       	push	r11
    d58a:	cf 92       	push	r12
    d58c:	df 92       	push	r13
    d58e:	ef 92       	push	r14
    d590:	ff 92       	push	r15
    d592:	0f 93       	push	r16
    d594:	1f 93       	push	r17
    d596:	cf 93       	push	r28
    d598:	df 93       	push	r29
    d59a:	cd b7       	in	r28, 0x3d	; 61
    d59c:	de b7       	in	r29, 0x3e	; 62
    d59e:	a2 97       	sbiw	r28, 0x22	; 34
    d5a0:	0f b6       	in	r0, 0x3f	; 63
    d5a2:	f8 94       	cli
    d5a4:	de bf       	out	0x3e, r29	; 62
    d5a6:	0f be       	out	0x3f, r0	; 63
    d5a8:	cd bf       	out	0x3d, r28	; 61
    d5aa:	1c 01       	movw	r2, r24
  clamp_to_software_endstops(destination);
    d5ac:	89 e2       	ldi	r24, 0x29	; 41
    d5ae:	96 e0       	ldi	r25, 0x06	; 6
    d5b0:	0e 94 7c 6a 	call	0xd4f8	; 0xd4f8 <clamp_to_software_endstops(float*)>
  previous_millis_cmd.start();
    d5b4:	88 e4       	ldi	r24, 0x48	; 72
    d5b6:	93 e0       	ldi	r25, 0x03	; 3
    d5b8:	0f 94 47 10 	call	0x2208e	; 0x2208e <Timer<unsigned long>::start()>

  // Do not use feedmultiply for E or Z only moves
  if((current_position[X_AXIS] == destination[X_AXIS]) && (current_position[Y_AXIS] == destination[Y_AXIS])) {
    d5bc:	40 90 61 12 	lds	r4, 0x1261	; 0x801261 <current_position>
    d5c0:	50 90 62 12 	lds	r5, 0x1262	; 0x801262 <current_position+0x1>
    d5c4:	60 90 63 12 	lds	r6, 0x1263	; 0x801263 <current_position+0x2>
    d5c8:	70 90 64 12 	lds	r7, 0x1264	; 0x801264 <current_position+0x3>
    d5cc:	c0 90 29 06 	lds	r12, 0x0629	; 0x800629 <destination>
    d5d0:	d0 90 2a 06 	lds	r13, 0x062A	; 0x80062a <destination+0x1>
    d5d4:	e0 90 2b 06 	lds	r14, 0x062B	; 0x80062b <destination+0x2>
    d5d8:	f0 90 2c 06 	lds	r15, 0x062C	; 0x80062c <destination+0x3>
    d5dc:	a7 01       	movw	r20, r14
    d5de:	96 01       	movw	r18, r12
    d5e0:	c3 01       	movw	r24, r6
    d5e2:	b2 01       	movw	r22, r4
    d5e4:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
    d5e8:	81 11       	cpse	r24, r1
    d5ea:	3f c0       	rjmp	.+126    	; 0xd66a <prepare_move(unsigned int)+0xf4>
    d5ec:	20 91 2d 06 	lds	r18, 0x062D	; 0x80062d <destination+0x4>
    d5f0:	30 91 2e 06 	lds	r19, 0x062E	; 0x80062e <destination+0x5>
    d5f4:	40 91 2f 06 	lds	r20, 0x062F	; 0x80062f <destination+0x6>
    d5f8:	50 91 30 06 	lds	r21, 0x0630	; 0x800630 <destination+0x7>
    d5fc:	60 91 65 12 	lds	r22, 0x1265	; 0x801265 <current_position+0x4>
    d600:	70 91 66 12 	lds	r23, 0x1266	; 0x801266 <current_position+0x5>
    d604:	80 91 67 12 	lds	r24, 0x1267	; 0x801267 <current_position+0x6>
    d608:	90 91 68 12 	lds	r25, 0x1268	; 0x801268 <current_position+0x7>
    d60c:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
    d610:	81 11       	cpse	r24, r1
    d612:	2b c0       	rjmp	.+86     	; 0xd66a <prepare_move(unsigned int)+0xf4>
      plan_buffer_line_destinationXYZE(feedrate/60);
    d614:	20 e0       	ldi	r18, 0x00	; 0
    d616:	30 e0       	ldi	r19, 0x00	; 0
    d618:	40 e7       	ldi	r20, 0x70	; 112
    d61a:	52 e4       	ldi	r21, 0x42	; 66
    d61c:	60 91 7a 02 	lds	r22, 0x027A	; 0x80027a <feedrate>
    d620:	70 91 7b 02 	lds	r23, 0x027B	; 0x80027b <feedrate+0x1>
    d624:	80 91 7c 02 	lds	r24, 0x027C	; 0x80027c <feedrate+0x2>
    d628:	90 91 7d 02 	lds	r25, 0x027D	; 0x80027d <feedrate+0x3>
    d62c:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
    d630:	0f 94 4e 4c 	call	0x2989c	; 0x2989c <plan_buffer_line_destinationXYZE(float)>
#else
     plan_buffer_line_destinationXYZE(feedrate*feedmultiply*(1./(60.f*100.f)));
#endif
  }

  set_current_to_destination();
    d634:	0e 94 e8 54 	call	0xa9d0	; 0xa9d0 <set_current_to_destination()>
}
    d638:	a2 96       	adiw	r28, 0x22	; 34
    d63a:	0f b6       	in	r0, 0x3f	; 63
    d63c:	f8 94       	cli
    d63e:	de bf       	out	0x3e, r29	; 62
    d640:	0f be       	out	0x3f, r0	; 63
    d642:	cd bf       	out	0x3d, r28	; 61
    d644:	df 91       	pop	r29
    d646:	cf 91       	pop	r28
    d648:	1f 91       	pop	r17
    d64a:	0f 91       	pop	r16
    d64c:	ff 90       	pop	r15
    d64e:	ef 90       	pop	r14
    d650:	df 90       	pop	r13
    d652:	cf 90       	pop	r12
    d654:	bf 90       	pop	r11
    d656:	af 90       	pop	r10
    d658:	9f 90       	pop	r9
    d65a:	8f 90       	pop	r8
    d65c:	7f 90       	pop	r7
    d65e:	6f 90       	pop	r6
    d660:	5f 90       	pop	r5
    d662:	4f 90       	pop	r4
    d664:	3f 90       	pop	r3
    d666:	2f 90       	pop	r2
    d668:	08 95       	ret
  if((current_position[X_AXIS] == destination[X_AXIS]) && (current_position[Y_AXIS] == destination[Y_AXIS])) {
      plan_buffer_line_destinationXYZE(feedrate/60);
  }
  else {
#ifdef MESH_BED_LEVELING
    mesh_plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate*feedmultiply*(1./(60.f*100.f)), start_segment_idx);
    d66a:	60 91 8e 02 	lds	r22, 0x028E	; 0x80028e <feedmultiply>
    d66e:	70 91 8f 02 	lds	r23, 0x028F	; 0x80028f <feedmultiply+0x1>
    d672:	07 2e       	mov	r0, r23
    d674:	00 0c       	add	r0, r0
    d676:	88 0b       	sbc	r24, r24
    d678:	99 0b       	sbc	r25, r25
    d67a:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
    d67e:	20 91 7a 02 	lds	r18, 0x027A	; 0x80027a <feedrate>
    d682:	30 91 7b 02 	lds	r19, 0x027B	; 0x80027b <feedrate+0x1>
    d686:	40 91 7c 02 	lds	r20, 0x027C	; 0x80027c <feedrate+0x2>
    d68a:	50 91 7d 02 	lds	r21, 0x027D	; 0x80027d <feedrate+0x3>
    d68e:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    d692:	2e e3       	ldi	r18, 0x3E	; 62
    d694:	33 ec       	ldi	r19, 0xC3	; 195
    d696:	4e e2       	ldi	r20, 0x2E	; 46
    d698:	59 e3       	ldi	r21, 0x39	; 57
    d69a:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    d69e:	6f 83       	std	Y+7, r22	; 0x07
    d6a0:	78 87       	std	Y+8, r23	; 0x08
    d6a2:	89 87       	std	Y+9, r24	; 0x09
    d6a4:	9a 87       	std	Y+10, r25	; 0x0a
void mesh_plan_buffer_line(const float &x, const float &y, const float &z, const float &e, const float &feed_rate, uint16_t start_segment_idx = 0) {
        float dx = x - current_position[X_AXIS];
        float dy = y - current_position[Y_AXIS];
        uint16_t n_segments = 0;

        if (mbl.active) {
    d6a6:	80 91 09 13 	lds	r24, 0x1309	; 0x801309 <mbl>
    d6aa:	88 23       	and	r24, r24
    d6ac:	09 f4       	brne	.+2      	; 0xd6b0 <prepare_move(unsigned int)+0x13a>
    d6ae:	0f c1       	rjmp	.+542    	; 0xd8ce <prepare_move(unsigned int)+0x358>
        return 1; //begin with the first segment
}

#ifdef MESH_BED_LEVELING
void mesh_plan_buffer_line(const float &x, const float &y, const float &z, const float &e, const float &feed_rate, uint16_t start_segment_idx = 0) {
        float dx = x - current_position[X_AXIS];
    d6b0:	a3 01       	movw	r20, r6
    d6b2:	92 01       	movw	r18, r4
    d6b4:	c7 01       	movw	r24, r14
    d6b6:	b6 01       	movw	r22, r12
    d6b8:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    d6bc:	2b 01       	movw	r4, r22
    d6be:	3c 01       	movw	r6, r24
        float dy = y - current_position[Y_AXIS];
    d6c0:	20 91 65 12 	lds	r18, 0x1265	; 0x801265 <current_position+0x4>
    d6c4:	30 91 66 12 	lds	r19, 0x1266	; 0x801266 <current_position+0x5>
    d6c8:	40 91 67 12 	lds	r20, 0x1267	; 0x801267 <current_position+0x6>
    d6cc:	50 91 68 12 	lds	r21, 0x1268	; 0x801268 <current_position+0x7>
    d6d0:	60 91 2d 06 	lds	r22, 0x062D	; 0x80062d <destination+0x4>
    d6d4:	70 91 2e 06 	lds	r23, 0x062E	; 0x80062e <destination+0x5>
    d6d8:	80 91 2f 06 	lds	r24, 0x062F	; 0x80062f <destination+0x6>
    d6dc:	90 91 30 06 	lds	r25, 0x0630	; 0x800630 <destination+0x7>
    d6e0:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    d6e4:	6b 87       	std	Y+11, r22	; 0x0b
    d6e6:	7c 87       	std	Y+12, r23	; 0x0c
    d6e8:	8d 87       	std	Y+13, r24	; 0x0d
    d6ea:	9e 87       	std	Y+14, r25	; 0x0e
        uint16_t n_segments = 0;

        if (mbl.active) {
            float len = fabs(dx) + fabs(dy);
    d6ec:	c3 01       	movw	r24, r6
    d6ee:	b2 01       	movw	r22, r4
    d6f0:	9f 77       	andi	r25, 0x7F	; 127
    d6f2:	2b 85       	ldd	r18, Y+11	; 0x0b
    d6f4:	3c 85       	ldd	r19, Y+12	; 0x0c
    d6f6:	4d 85       	ldd	r20, Y+13	; 0x0d
    d6f8:	5e 85       	ldd	r21, Y+14	; 0x0e
    d6fa:	5f 77       	andi	r21, 0x7F	; 127
    d6fc:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    d700:	6b 01       	movw	r12, r22
    d702:	7c 01       	movw	r14, r24
            if (len > 0)
    d704:	20 e0       	ldi	r18, 0x00	; 0
    d706:	30 e0       	ldi	r19, 0x00	; 0
    d708:	a9 01       	movw	r20, r18
    d70a:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
    d70e:	18 16       	cp	r1, r24
    d710:	0c f0       	brlt	.+2      	; 0xd714 <prepare_move(unsigned int)+0x19e>
    d712:	dd c0       	rjmp	.+442    	; 0xd8ce <prepare_move(unsigned int)+0x358>
                // Split to 3cm segments or shorter.
                n_segments = uint16_t(ceil(len / 30.f));
    d714:	20 e0       	ldi	r18, 0x00	; 0
    d716:	30 e0       	ldi	r19, 0x00	; 0
    d718:	40 ef       	ldi	r20, 0xF0	; 240
    d71a:	51 e4       	ldi	r21, 0x41	; 65
    d71c:	c7 01       	movw	r24, r14
    d71e:	b6 01       	movw	r22, r12
    d720:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
    d724:	0f 94 e6 a5 	call	0x34bcc	; 0x34bcc <ceil>
    d728:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
    d72c:	7e 83       	std	Y+6, r23	; 0x06
    d72e:	6d 83       	std	Y+5, r22	; 0x05
        }

        if (n_segments > 1 && start_segment_idx) {
    d730:	62 30       	cpi	r22, 0x02	; 2
    d732:	71 05       	cpc	r23, r1
    d734:	08 f4       	brcc	.+2      	; 0xd738 <prepare_move(unsigned int)+0x1c2>
    d736:	cb c0       	rjmp	.+406    	; 0xd8ce <prepare_move(unsigned int)+0x358>
    d738:	21 14       	cp	r2, r1
    d73a:	31 04       	cpc	r3, r1
    d73c:	09 f4       	brne	.+2      	; 0xd740 <prepare_move(unsigned int)+0x1ca>
    d73e:	c7 c0       	rjmp	.+398    	; 0xd8ce <prepare_move(unsigned int)+0x358>

            float dz = z - current_position[Z_AXIS];
    d740:	20 91 69 12 	lds	r18, 0x1269	; 0x801269 <current_position+0x8>
    d744:	30 91 6a 12 	lds	r19, 0x126A	; 0x80126a <current_position+0x9>
    d748:	40 91 6b 12 	lds	r20, 0x126B	; 0x80126b <current_position+0xa>
    d74c:	50 91 6c 12 	lds	r21, 0x126C	; 0x80126c <current_position+0xb>
    d750:	60 91 31 06 	lds	r22, 0x0631	; 0x800631 <destination+0x8>
    d754:	70 91 32 06 	lds	r23, 0x0632	; 0x800632 <destination+0x9>
    d758:	80 91 33 06 	lds	r24, 0x0633	; 0x800633 <destination+0xa>
    d75c:	90 91 34 06 	lds	r25, 0x0634	; 0x800634 <destination+0xb>
    d760:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    d764:	6f 87       	std	Y+15, r22	; 0x0f
    d766:	78 8b       	std	Y+16, r23	; 0x10
    d768:	89 8b       	std	Y+17, r24	; 0x11
    d76a:	9a 8b       	std	Y+18, r25	; 0x12
            float de = e - current_position[E_AXIS];
    d76c:	20 91 6d 12 	lds	r18, 0x126D	; 0x80126d <current_position+0xc>
    d770:	30 91 6e 12 	lds	r19, 0x126E	; 0x80126e <current_position+0xd>
    d774:	40 91 6f 12 	lds	r20, 0x126F	; 0x80126f <current_position+0xe>
    d778:	50 91 70 12 	lds	r21, 0x1270	; 0x801270 <current_position+0xf>
    d77c:	60 91 35 06 	lds	r22, 0x0635	; 0x800635 <destination+0xc>
    d780:	70 91 36 06 	lds	r23, 0x0636	; 0x800636 <destination+0xd>
    d784:	80 91 37 06 	lds	r24, 0x0637	; 0x800637 <destination+0xe>
    d788:	90 91 38 06 	lds	r25, 0x0638	; 0x800638 <destination+0xf>
    d78c:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    d790:	6b 8b       	std	Y+19, r22	; 0x13
    d792:	7c 8b       	std	Y+20, r23	; 0x14
    d794:	8d 8b       	std	Y+21, r24	; 0x15
    d796:	9e 8b       	std	Y+22, r25	; 0x16

            for (uint16_t i = start_segment_idx; i < n_segments; ++ i) {
                float t = float(i) / float(n_segments);
    d798:	ad 81       	ldd	r26, Y+5	; 0x05
    d79a:	be 81       	ldd	r27, Y+6	; 0x06
    d79c:	cd 01       	movw	r24, r26
    d79e:	b0 e0       	ldi	r27, 0x00	; 0
    d7a0:	a0 e0       	ldi	r26, 0x00	; 0
    d7a2:	8f 8f       	std	Y+31, r24	; 0x1f
    d7a4:	98 a3       	std	Y+32, r25	; 0x20
    d7a6:	a9 a3       	std	Y+33, r26	; 0x21
    d7a8:	ba a3       	std	Y+34, r27	; 0x22
        if (n_segments > 1 && start_segment_idx) {

            float dz = z - current_position[Z_AXIS];
            float de = e - current_position[E_AXIS];

            for (uint16_t i = start_segment_idx; i < n_segments; ++ i) {
    d7aa:	2d 81       	ldd	r18, Y+5	; 0x05
    d7ac:	3e 81       	ldd	r19, Y+6	; 0x06
    d7ae:	22 16       	cp	r2, r18
    d7b0:	33 06       	cpc	r3, r19
    d7b2:	08 f0       	brcs	.+2      	; 0xd7b6 <prepare_move(unsigned int)+0x240>
    d7b4:	8c c0       	rjmp	.+280    	; 0xd8ce <prepare_move(unsigned int)+0x358>
                float t = float(i) / float(n_segments);
    d7b6:	b1 01       	movw	r22, r2
    d7b8:	90 e0       	ldi	r25, 0x00	; 0
    d7ba:	80 e0       	ldi	r24, 0x00	; 0
    d7bc:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
    d7c0:	6b 01       	movw	r12, r22
    d7c2:	7c 01       	movw	r14, r24
    d7c4:	6f 8d       	ldd	r22, Y+31	; 0x1f
    d7c6:	78 a1       	ldd	r23, Y+32	; 0x20
    d7c8:	89 a1       	ldd	r24, Y+33	; 0x21
    d7ca:	9a a1       	ldd	r25, Y+34	; 0x22
    d7cc:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
    d7d0:	9b 01       	movw	r18, r22
    d7d2:	ac 01       	movw	r20, r24
    d7d4:	c7 01       	movw	r24, r14
    d7d6:	b6 01       	movw	r22, r12
    d7d8:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
    d7dc:	6b 01       	movw	r12, r22
    d7de:	7c 01       	movw	r14, r24
                plan_buffer_line(current_position[X_AXIS] + t * dx,
                                 current_position[Y_AXIS] + t * dy,
                                 current_position[Z_AXIS] + t * dz,
                                 current_position[E_AXIS] + t * de,
    d7e0:	ac 01       	movw	r20, r24
    d7e2:	9b 01       	movw	r18, r22
    d7e4:	6b 89       	ldd	r22, Y+19	; 0x13
    d7e6:	7c 89       	ldd	r23, Y+20	; 0x14
    d7e8:	8d 89       	ldd	r24, Y+21	; 0x15
    d7ea:	9e 89       	ldd	r25, Y+22	; 0x16
    d7ec:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    d7f0:	9b 01       	movw	r18, r22
    d7f2:	ac 01       	movw	r20, r24
    d7f4:	60 91 6d 12 	lds	r22, 0x126D	; 0x80126d <current_position+0xc>
    d7f8:	70 91 6e 12 	lds	r23, 0x126E	; 0x80126e <current_position+0xd>
    d7fc:	80 91 6f 12 	lds	r24, 0x126F	; 0x80126f <current_position+0xe>
    d800:	90 91 70 12 	lds	r25, 0x1270	; 0x801270 <current_position+0xf>
    d804:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    d808:	69 83       	std	Y+1, r22	; 0x01
    d80a:	7a 83       	std	Y+2, r23	; 0x02
    d80c:	8b 83       	std	Y+3, r24	; 0x03
    d80e:	9c 83       	std	Y+4, r25	; 0x04

            for (uint16_t i = start_segment_idx; i < n_segments; ++ i) {
                float t = float(i) / float(n_segments);
                plan_buffer_line(current_position[X_AXIS] + t * dx,
                                 current_position[Y_AXIS] + t * dy,
                                 current_position[Z_AXIS] + t * dz,
    d810:	a7 01       	movw	r20, r14
    d812:	96 01       	movw	r18, r12
    d814:	6f 85       	ldd	r22, Y+15	; 0x0f
    d816:	78 89       	ldd	r23, Y+16	; 0x10
    d818:	89 89       	ldd	r24, Y+17	; 0x11
    d81a:	9a 89       	ldd	r25, Y+18	; 0x12
    d81c:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
            float dz = z - current_position[Z_AXIS];
            float de = e - current_position[E_AXIS];

            for (uint16_t i = start_segment_idx; i < n_segments; ++ i) {
                float t = float(i) / float(n_segments);
                plan_buffer_line(current_position[X_AXIS] + t * dx,
    d820:	20 91 69 12 	lds	r18, 0x1269	; 0x801269 <current_position+0x8>
    d824:	30 91 6a 12 	lds	r19, 0x126A	; 0x80126a <current_position+0x9>
    d828:	40 91 6b 12 	lds	r20, 0x126B	; 0x80126b <current_position+0xa>
    d82c:	50 91 6c 12 	lds	r21, 0x126C	; 0x80126c <current_position+0xb>
    d830:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    d834:	6f 8b       	std	Y+23, r22	; 0x17
    d836:	78 8f       	std	Y+24, r23	; 0x18
    d838:	89 8f       	std	Y+25, r24	; 0x19
    d83a:	9a 8f       	std	Y+26, r25	; 0x1a
                                 current_position[Y_AXIS] + t * dy,
    d83c:	a7 01       	movw	r20, r14
    d83e:	96 01       	movw	r18, r12
    d840:	6b 85       	ldd	r22, Y+11	; 0x0b
    d842:	7c 85       	ldd	r23, Y+12	; 0x0c
    d844:	8d 85       	ldd	r24, Y+13	; 0x0d
    d846:	9e 85       	ldd	r25, Y+14	; 0x0e
    d848:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
            float dz = z - current_position[Z_AXIS];
            float de = e - current_position[E_AXIS];

            for (uint16_t i = start_segment_idx; i < n_segments; ++ i) {
                float t = float(i) / float(n_segments);
                plan_buffer_line(current_position[X_AXIS] + t * dx,
    d84c:	20 91 65 12 	lds	r18, 0x1265	; 0x801265 <current_position+0x4>
    d850:	30 91 66 12 	lds	r19, 0x1266	; 0x801266 <current_position+0x5>
    d854:	40 91 67 12 	lds	r20, 0x1267	; 0x801267 <current_position+0x6>
    d858:	50 91 68 12 	lds	r21, 0x1268	; 0x801268 <current_position+0x7>
    d85c:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    d860:	6b 8f       	std	Y+27, r22	; 0x1b
    d862:	7c 8f       	std	Y+28, r23	; 0x1c
    d864:	8d 8f       	std	Y+29, r24	; 0x1d
    d866:	9e 8f       	std	Y+30, r25	; 0x1e
    d868:	a7 01       	movw	r20, r14
    d86a:	96 01       	movw	r18, r12
    d86c:	c3 01       	movw	r24, r6
    d86e:	b2 01       	movw	r22, r4
    d870:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    d874:	20 91 61 12 	lds	r18, 0x1261	; 0x801261 <current_position>
    d878:	30 91 62 12 	lds	r19, 0x1262	; 0x801262 <current_position+0x1>
    d87c:	40 91 63 12 	lds	r20, 0x1263	; 0x801263 <current_position+0x2>
    d880:	50 91 64 12 	lds	r21, 0x1264	; 0x801264 <current_position+0x3>
    d884:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    d888:	3f 92       	push	r3
    d88a:	2f 92       	push	r2
    d88c:	a1 e6       	ldi	r26, 0x61	; 97
    d88e:	b2 e1       	ldi	r27, 0x12	; 18
    d890:	bf 93       	push	r27
    d892:	af 93       	push	r26
    d894:	8f 80       	ldd	r8, Y+7	; 0x07
    d896:	98 84       	ldd	r9, Y+8	; 0x08
    d898:	a9 84       	ldd	r10, Y+9	; 0x09
    d89a:	ba 84       	ldd	r11, Y+10	; 0x0a
    d89c:	de 01       	movw	r26, r28
    d89e:	11 96       	adiw	r26, 0x01	; 1
    d8a0:	6d 01       	movw	r12, r26
    d8a2:	ef 88       	ldd	r14, Y+23	; 0x17
    d8a4:	f8 8c       	ldd	r15, Y+24	; 0x18
    d8a6:	09 8d       	ldd	r16, Y+25	; 0x19
    d8a8:	1a 8d       	ldd	r17, Y+26	; 0x1a
    d8aa:	2b 8d       	ldd	r18, Y+27	; 0x1b
    d8ac:	3c 8d       	ldd	r19, Y+28	; 0x1c
    d8ae:	4d 8d       	ldd	r20, Y+29	; 0x1d
    d8b0:	5e 8d       	ldd	r21, Y+30	; 0x1e
    d8b2:	0f 94 33 3d 	call	0x27a66	; 0x27a66 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)>
                                 current_position[Y_AXIS] + t * dy,
                                 current_position[Z_AXIS] + t * dz,
                                 current_position[E_AXIS] + t * de,
                                 feed_rate, current_position, i);
                if (planner_aborted)
    d8b6:	0f 90       	pop	r0
    d8b8:	0f 90       	pop	r0
    d8ba:	0f 90       	pop	r0
    d8bc:	0f 90       	pop	r0
    d8be:	80 91 42 0d 	lds	r24, 0x0D42	; 0x800d42 <planner_aborted>
    d8c2:	81 11       	cpse	r24, r1
    d8c4:	b7 ce       	rjmp	.-658    	; 0xd634 <prepare_move(unsigned int)+0xbe>
        if (n_segments > 1 && start_segment_idx) {

            float dz = z - current_position[Z_AXIS];
            float de = e - current_position[E_AXIS];

            for (uint16_t i = start_segment_idx; i < n_segments; ++ i) {
    d8c6:	bf ef       	ldi	r27, 0xFF	; 255
    d8c8:	2b 1a       	sub	r2, r27
    d8ca:	3b 0a       	sbc	r3, r27
    d8cc:	6e cf       	rjmp	.-292    	; 0xd7aa <prepare_move(unsigned int)+0x234>
                if (planner_aborted)
                    return;
            }
        }
        // The rest of the path.
        plan_buffer_line(x, y, z, e, feed_rate, current_position);
    d8ce:	e0 90 31 06 	lds	r14, 0x0631	; 0x800631 <destination+0x8>
    d8d2:	f0 90 32 06 	lds	r15, 0x0632	; 0x800632 <destination+0x9>
    d8d6:	00 91 33 06 	lds	r16, 0x0633	; 0x800633 <destination+0xa>
    d8da:	10 91 34 06 	lds	r17, 0x0634	; 0x800634 <destination+0xb>
    d8de:	20 91 2d 06 	lds	r18, 0x062D	; 0x80062d <destination+0x4>
    d8e2:	30 91 2e 06 	lds	r19, 0x062E	; 0x80062e <destination+0x5>
    d8e6:	40 91 2f 06 	lds	r20, 0x062F	; 0x80062f <destination+0x6>
    d8ea:	50 91 30 06 	lds	r21, 0x0630	; 0x800630 <destination+0x7>
    d8ee:	60 91 29 06 	lds	r22, 0x0629	; 0x800629 <destination>
    d8f2:	70 91 2a 06 	lds	r23, 0x062A	; 0x80062a <destination+0x1>
    d8f6:	80 91 2b 06 	lds	r24, 0x062B	; 0x80062b <destination+0x2>
    d8fa:	90 91 2c 06 	lds	r25, 0x062C	; 0x80062c <destination+0x3>
    d8fe:	1f 92       	push	r1
    d900:	1f 92       	push	r1
    d902:	e1 e6       	ldi	r30, 0x61	; 97
    d904:	f2 e1       	ldi	r31, 0x12	; 18
    d906:	ff 93       	push	r31
    d908:	ef 93       	push	r30
    d90a:	8f 80       	ldd	r8, Y+7	; 0x07
    d90c:	98 84       	ldd	r9, Y+8	; 0x08
    d90e:	a9 84       	ldd	r10, Y+9	; 0x09
    d910:	ba 84       	ldd	r11, Y+10	; 0x0a
    d912:	e5 e3       	ldi	r30, 0x35	; 53
    d914:	ce 2e       	mov	r12, r30
    d916:	e6 e0       	ldi	r30, 0x06	; 6
    d918:	de 2e       	mov	r13, r30
    d91a:	0f 94 33 3d 	call	0x27a66	; 0x27a66 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)>
    d91e:	0f 90       	pop	r0
    d920:	0f 90       	pop	r0
    d922:	0f 90       	pop	r0
    d924:	0f 90       	pop	r0
    d926:	86 ce       	rjmp	.-756    	; 0xd634 <prepare_move(unsigned int)+0xbe>

0000d928 <raise_z(float)>:

/// @brief Safely move Z-axis by distance delta (mm)
/// @param delta travel distance in mm
/// @returns The actual travel distance in mm. Endstop may limit the requested move.
float raise_z(float delta)
{
    d928:	cf 92       	push	r12
    d92a:	df 92       	push	r13
    d92c:	ef 92       	push	r14
    d92e:	ff 92       	push	r15
    d930:	cf 93       	push	r28
    float travel_z = current_position[Z_AXIS];
    d932:	c0 90 69 12 	lds	r12, 0x1269	; 0x801269 <current_position+0x8>
    d936:	d0 90 6a 12 	lds	r13, 0x126A	; 0x80126a <current_position+0x9>
    d93a:	e0 90 6b 12 	lds	r14, 0x126B	; 0x80126b <current_position+0xa>
    d93e:	f0 90 6c 12 	lds	r15, 0x126C	; 0x80126c <current_position+0xb>

    // Prepare to move Z axis
    current_position[Z_AXIS] += delta;
    d942:	a7 01       	movw	r20, r14
    d944:	96 01       	movw	r18, r12
    d946:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    d94a:	60 93 69 12 	sts	0x1269, r22	; 0x801269 <current_position+0x8>
    d94e:	70 93 6a 12 	sts	0x126A, r23	; 0x80126a <current_position+0x9>
    d952:	80 93 6b 12 	sts	0x126B, r24	; 0x80126b <current_position+0xa>
    d956:	90 93 6c 12 	sts	0x126C, r25	; 0x80126c <current_position+0xb>

#if defined(Z_MIN_PIN) && (Z_MIN_PIN > -1) && !defined(DEBUG_DISABLE_ZMINLIMIT)
    bool z_min_endstop = (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING);
    d95a:	83 b1       	in	r24, 0x03	; 3
#else
    bool z_min_endstop = false;
#endif

    if (axis_known_position[Z_AXIS] || z_min_endstop)
    d95c:	90 91 3b 06 	lds	r25, 0x063B	; 0x80063b <axis_known_position+0x2>
    d960:	91 11       	cpse	r25, r1
    d962:	02 c0       	rjmp	.+4      	; 0xd968 <raise_z(float)+0x40>
    d964:	84 ff       	sbrs	r24, 4
    d966:	26 c0       	rjmp	.+76     	; 0xd9b4 <raise_z(float)+0x8c>
    {
        // current position is known or very low, it's safe to raise Z
        clamp_to_software_endstops(current_position);
    d968:	81 e6       	ldi	r24, 0x61	; 97
    d96a:	92 e1       	ldi	r25, 0x12	; 18
    d96c:	0e 94 7c 6a 	call	0xd4f8	; 0xd4f8 <clamp_to_software_endstops(float*)>
        plan_buffer_line_curposXYZE(max_feedrate[Z_AXIS]);
    d970:	60 91 83 0d 	lds	r22, 0x0D83	; 0x800d83 <cs+0x1c>
    d974:	70 91 84 0d 	lds	r23, 0x0D84	; 0x800d84 <cs+0x1d>
    d978:	80 91 85 0d 	lds	r24, 0x0D85	; 0x800d85 <cs+0x1e>
    d97c:	90 91 86 0d 	lds	r25, 0x0D86	; 0x800d86 <cs+0x1f>
    d980:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
        st_synchronize();
    d984:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>

        // Get the final travel distance
        travel_z = current_position[Z_AXIS] - travel_z;
    d988:	a7 01       	movw	r20, r14
    d98a:	96 01       	movw	r18, r12
    d98c:	60 91 69 12 	lds	r22, 0x1269	; 0x801269 <current_position+0x8>
    d990:	70 91 6a 12 	lds	r23, 0x126A	; 0x80126a <current_position+0x9>
    d994:	80 91 6b 12 	lds	r24, 0x126B	; 0x80126b <current_position+0xa>
    d998:	90 91 6c 12 	lds	r25, 0x126C	; 0x80126c <current_position+0xb>
    d99c:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    d9a0:	6b 01       	movw	r12, r22
    d9a2:	7c 01       	movw	r14, r24
#endif //TMC2130
        enable_z_endstop(z_endstop_enabled);
    }

    return travel_z;
}
    d9a4:	c7 01       	movw	r24, r14
    d9a6:	b6 01       	movw	r22, r12
    d9a8:	cf 91       	pop	r28
    d9aa:	ff 90       	pop	r15
    d9ac:	ef 90       	pop	r14
    d9ae:	df 90       	pop	r13
    d9b0:	cf 90       	pop	r12
    d9b2:	08 95       	ret

        // Get the final travel distance
        travel_z = current_position[Z_AXIS] - travel_z;
    } else {
        // ensure Z is powered in normal mode to overcome initial load
        enable_z();
    d9b4:	15 98       	cbi	0x02, 5	; 2
        st_synchronize();
    d9b6:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>

        // rely on crashguard to limit damage
        bool z_endstop_enabled = enable_z_endstop(true);
    d9ba:	81 e0       	ldi	r24, 0x01	; 1
    d9bc:	0f 94 88 25 	call	0x24b10	; 0x24b10 <enable_z_endstop(bool)>
    d9c0:	c8 2f       	mov	r28, r24
#ifdef TMC2130
        tmc2130_home_enter(Z_AXIS_MASK);
#endif //TMC2130
        plan_buffer_line_curposXYZE(homing_feedrate[Z_AXIS] / 60);
    d9c2:	65 e5       	ldi	r22, 0x55	; 85
    d9c4:	75 e5       	ldi	r23, 0x55	; 85
    d9c6:	85 e5       	ldi	r24, 0x55	; 85
    d9c8:	91 e4       	ldi	r25, 0x41	; 65
    d9ca:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
        st_synchronize();
    d9ce:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>

        // Get the final travel distance
        travel_z = st_get_position_mm(Z_AXIS) - travel_z;
    d9d2:	82 e0       	ldi	r24, 0x02	; 2
    d9d4:	0f 94 e7 1a 	call	0x235ce	; 0x235ce <st_get_position_mm(unsigned char)>
    d9d8:	a7 01       	movw	r20, r14
    d9da:	96 01       	movw	r18, r12
    d9dc:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    d9e0:	6b 01       	movw	r12, r22
    d9e2:	7c 01       	movw	r14, r24
            current_position[Z_AXIS] = max_pos[Z_AXIS];
            plan_set_position_curposXYZE();
        }
        tmc2130_home_exit();
#endif //TMC2130
        enable_z_endstop(z_endstop_enabled);
    d9e4:	8c 2f       	mov	r24, r28
    d9e6:	0f 94 88 25 	call	0x24b10	; 0x24b10 <enable_z_endstop(bool)>
    d9ea:	dc cf       	rjmp	.-72     	; 0xd9a4 <raise_z(float)+0x7c>

0000d9ec <raise_z_above(float)>:
//
// contrarily to a simple move, this function will carefully plan a move
// when the current Z position is unknown. In such cases, stallguard is
// enabled and will prevent prolonged pushing against the Z tops
void raise_z_above(float target)
{
    d9ec:	8f 92       	push	r8
    d9ee:	9f 92       	push	r9
    d9f0:	af 92       	push	r10
    d9f2:	bf 92       	push	r11
    d9f4:	cf 92       	push	r12
    d9f6:	df 92       	push	r13
    d9f8:	ef 92       	push	r14
    d9fa:	ff 92       	push	r15
    d9fc:	4b 01       	movw	r8, r22
    d9fe:	5c 01       	movw	r10, r24
    if (current_position[Z_AXIS] >= target)
    da00:	c0 90 69 12 	lds	r12, 0x1269	; 0x801269 <current_position+0x8>
    da04:	d0 90 6a 12 	lds	r13, 0x126A	; 0x80126a <current_position+0x9>
    da08:	e0 90 6b 12 	lds	r14, 0x126B	; 0x80126b <current_position+0xa>
    da0c:	f0 90 6c 12 	lds	r15, 0x126C	; 0x80126c <current_position+0xb>
    da10:	ac 01       	movw	r20, r24
    da12:	9b 01       	movw	r18, r22
    da14:	c7 01       	movw	r24, r14
    da16:	b6 01       	movw	r22, r12
    da18:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
    da1c:	87 ff       	sbrs	r24, 7
    da1e:	11 c0       	rjmp	.+34     	; 0xda42 <raise_z_above(float)+0x56>
        return;

    // Use absolute value in case the current position is unknown
    raise_z(fabs(current_position[Z_AXIS] - target));
    da20:	a5 01       	movw	r20, r10
    da22:	94 01       	movw	r18, r8
    da24:	c7 01       	movw	r24, r14
    da26:	b6 01       	movw	r22, r12
    da28:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    da2c:	9f 77       	andi	r25, 0x7F	; 127
}
    da2e:	ff 90       	pop	r15
    da30:	ef 90       	pop	r14
    da32:	df 90       	pop	r13
    da34:	cf 90       	pop	r12
    da36:	bf 90       	pop	r11
    da38:	af 90       	pop	r10
    da3a:	9f 90       	pop	r9
    da3c:	8f 90       	pop	r8
{
    if (current_position[Z_AXIS] >= target)
        return;

    // Use absolute value in case the current position is unknown
    raise_z(fabs(current_position[Z_AXIS] - target));
    da3e:	0c 94 94 6c 	jmp	0xd928	; 0xd928 <raise_z(float)>
}
    da42:	ff 90       	pop	r15
    da44:	ef 90       	pop	r14
    da46:	df 90       	pop	r13
    da48:	cf 90       	pop	r12
    da4a:	bf 90       	pop	r11
    da4c:	af 90       	pop	r10
    da4e:	9f 90       	pop	r9
    da50:	8f 90       	pop	r8
    da52:	08 95       	ret

0000da54 <gcode_G28(bool, long, bool, long, bool, long, bool)>:
#ifdef TMC2130
static void gcode_G28(bool home_x_axis, long home_x_value, bool home_y_axis, long home_y_value, bool home_z_axis, long home_z_value, bool calib, bool without_mbl)
#else
static void gcode_G28(bool home_x_axis, long home_x_value, bool home_y_axis, long home_y_value, bool home_z_axis, long home_z_value, bool without_mbl)
#endif //TMC2130
{
    da54:	2f 92       	push	r2
    da56:	3f 92       	push	r3
    da58:	4f 92       	push	r4
    da5a:	5f 92       	push	r5
    da5c:	6f 92       	push	r6
    da5e:	7f 92       	push	r7
    da60:	8f 92       	push	r8
    da62:	9f 92       	push	r9
    da64:	af 92       	push	r10
    da66:	bf 92       	push	r11
    da68:	cf 92       	push	r12
    da6a:	df 92       	push	r13
    da6c:	ef 92       	push	r14
    da6e:	ff 92       	push	r15
    da70:	0f 93       	push	r16
    da72:	1f 93       	push	r17
    da74:	cf 93       	push	r28
    da76:	df 93       	push	r29
    da78:	00 d0       	rcall	.+0      	; 0xda7a <gcode_G28(bool, long, bool, long, bool, long, bool)+0x26>
    da7a:	1f 92       	push	r1
    da7c:	1f 92       	push	r1
    da7e:	cd b7       	in	r28, 0x3d	; 61
    da80:	de b7       	in	r29, 0x3e	; 62
    da82:	d8 2e       	mov	r13, r24
    da84:	2a 01       	movw	r4, r20
    da86:	3b 01       	movw	r6, r22
    da88:	32 2e       	mov	r3, r18
    da8a:	e9 82       	std	Y+1, r14	; 0x01
    da8c:	fa 82       	std	Y+2, r15	; 0x02
    da8e:	0b 83       	std	Y+3, r16	; 0x03
    da90:	1c 83       	std	Y+4, r17	; 0x04
	// Flag for the display update routine and to disable the print cancelation during homing.
	st_synchronize();
    da92:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
	homing_flag = true;
    da96:	81 e0       	ldi	r24, 0x01	; 1
    da98:	80 93 71 12 	sts	0x1271, r24	; 0x801271 <homing_flag>
	bool home_x = home_x_axis;
	bool home_y = home_y_axis;
	bool home_z = home_z_axis;

	// Either all X,Y,Z codes are present, or none of them.
	bool home_all_axes = home_x == home_y && home_x == home_z;
    da9c:	fc 2c       	mov	r15, r12
    da9e:	e3 2c       	mov	r14, r3
    daa0:	d3 10       	cpse	r13, r3
    daa2:	10 c0       	rjmp	.+32     	; 0xdac4 <gcode_G28(bool, long, bool, long, bool, long, bool)+0x70>
    daa4:	ed 2c       	mov	r14, r13
    daa6:	dc 10       	cpse	r13, r12
    daa8:	0d c0       	rjmp	.+26     	; 0xdac4 <gcode_G28(bool, long, bool, long, bool, long, bool)+0x70>
		// No X/Y/Z code provided means to home all axes.
		home_x = home_y = home_z = true;

	//if we are homing all axes, first move z higher to protect heatbed/steel sheet
	if (home_all_axes) {
        raise_z_above(MESH_HOME_Z_SEARCH);
    daaa:	60 e0       	ldi	r22, 0x00	; 0
    daac:	70 e0       	ldi	r23, 0x00	; 0
    daae:	80 ea       	ldi	r24, 0xA0	; 160
    dab0:	90 e4       	ldi	r25, 0x40	; 64
    dab2:	0e 94 f6 6c 	call	0xd9ec	; 0xd9ec <raise_z_above(float)>

	// Either all X,Y,Z codes are present, or none of them.
	bool home_all_axes = home_x == home_y && home_x == home_z;
	if (home_all_axes)
		// No X/Y/Z code provided means to home all axes.
		home_x = home_y = home_z = true;
    dab6:	ff 24       	eor	r15, r15
    dab8:	f3 94       	inc	r15
    daba:	ee 24       	eor	r14, r14
    dabc:	e3 94       	inc	r14
    dabe:	22 24       	eor	r2, r2
    dac0:	23 94       	inc	r2
    dac2:	01 c0       	rjmp	.+2      	; 0xdac6 <gcode_G28(bool, long, bool, long, bool, long, bool)+0x72>
	bool home_x = home_x_axis;
	bool home_y = home_y_axis;
	bool home_z = home_z_axis;

	// Either all X,Y,Z codes are present, or none of them.
	bool home_all_axes = home_x == home_y && home_x == home_z;
    dac4:	2d 2c       	mov	r2, r13
	}

      // Reset world2machine_rotation_and_skew and world2machine_shift, therefore
      // the planner will not perform any adjustments in the XY plane.
      // Wait for the motors to stop and update the current position with the absolute values.
      world2machine_revert_to_uncorrected();
    dac6:	0e 94 2d 62 	call	0xc45a	; 0xc45a <world2machine_revert_to_uncorrected()>
      // For mesh bed leveling deactivate the matrix temporarily.
      // It is necessary to disable the bed leveling for the X and Y homing moves, so that the move is performed
      // in a single axis only.
      // In case of re-homing the X or Y axes only, the mesh bed leveling is restored after G28.
#ifdef MESH_BED_LEVELING
      uint8_t mbl_was_active = mbl.active;
    daca:	80 91 09 13 	lds	r24, 0x1309	; 0x801309 <mbl>
    dace:	8d 83       	std	Y+5, r24	; 0x05
      mbl.active = 0;
    dad0:	10 92 09 13 	sts	0x1309, r1	; 0x801309 <mbl>
      current_position[Z_AXIS] = st_get_position_mm(Z_AXIS);
    dad4:	82 e0       	ldi	r24, 0x02	; 2
    dad6:	0f 94 e7 1a 	call	0x235ce	; 0x235ce <st_get_position_mm(unsigned char)>
    dada:	60 93 69 12 	sts	0x1269, r22	; 0x801269 <current_position+0x8>
    dade:	70 93 6a 12 	sts	0x126A, r23	; 0x80126a <current_position+0x9>
    dae2:	80 93 6b 12 	sts	0x126B, r24	; 0x80126b <current_position+0xa>
    dae6:	90 93 6c 12 	sts	0x126C, r25	; 0x80126c <current_position+0xb>
#endif

      // Reset baby stepping to zero, if the babystepping has already been loaded before.
      if (home_z)
    daea:	f1 10       	cpse	r15, r1
        babystep_undo();
    daec:	0f 94 aa 54 	call	0x2a954	; 0x2a954 <babystep_undo()>

      int l_feedmultiply = setup_for_endstop_move();
    daf0:	81 e0       	ldi	r24, 0x01	; 1
    daf2:	0e 94 66 65 	call	0xcacc	; 0xcacc <setup_for_endstop_move(bool) [clone .lto_priv.381]>
    daf6:	8c 01       	movw	r16, r24

      set_destination_to_current();
    daf8:	0e 94 ae 66 	call	0xcd5c	; 0xcd5c <set_destination_to_current()>
      feedrate = 0.0;
    dafc:	10 92 7a 02 	sts	0x027A, r1	; 0x80027a <feedrate>
    db00:	10 92 7b 02 	sts	0x027B, r1	; 0x80027b <feedrate+0x1>
    db04:	10 92 7c 02 	sts	0x027C, r1	; 0x80027c <feedrate+0x2>
    db08:	10 92 7d 02 	sts	0x027D, r1	; 0x80027d <feedrate+0x3>
	        homeaxis(Y_AXIS);
		else
			tmc2130_home_calibrate(Y_AXIS);
	  }
#else //TMC2130
      if(home_x) homeaxis(X_AXIS);
    db0c:	22 20       	and	r2, r2
    db0e:	19 f0       	breq	.+6      	; 0xdb16 <gcode_G28(bool, long, bool, long, bool, long, bool)+0xc2>
    db10:	80 e0       	ldi	r24, 0x00	; 0
    db12:	0f 94 ae 79 	call	0x2f35c	; 0x2f35c <homeaxis(unsigned char, unsigned char) [clone .constprop.88]>
      if(home_y) homeaxis(Y_AXIS);
    db16:	ee 20       	and	r14, r14
    db18:	19 f0       	breq	.+6      	; 0xdb20 <gcode_G28(bool, long, bool, long, bool, long, bool)+0xcc>
    db1a:	81 e0       	ldi	r24, 0x01	; 1
    db1c:	0f 94 ae 79 	call	0x2f35c	; 0x2f35c <homeaxis(unsigned char, unsigned char) [clone .constprop.88]>
#endif //TMC2130


      if(home_x_axis && home_x_value != 0)
    db20:	dd 20       	and	r13, r13
    db22:	e9 f0       	breq	.+58     	; 0xdb5e <gcode_G28(bool, long, bool, long, bool, long, bool)+0x10a>
    db24:	41 14       	cp	r4, r1
    db26:	51 04       	cpc	r5, r1
    db28:	61 04       	cpc	r6, r1
    db2a:	71 04       	cpc	r7, r1
    db2c:	c1 f0       	breq	.+48     	; 0xdb5e <gcode_G28(bool, long, bool, long, bool, long, bool)+0x10a>
        current_position[X_AXIS]=home_x_value+cs.add_homing[X_AXIS];
    db2e:	c3 01       	movw	r24, r6
    db30:	b2 01       	movw	r22, r4
    db32:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
    db36:	9b 01       	movw	r18, r22
    db38:	ac 01       	movw	r20, r24
    db3a:	60 91 bf 0d 	lds	r22, 0x0DBF	; 0x800dbf <cs+0x58>
    db3e:	70 91 c0 0d 	lds	r23, 0x0DC0	; 0x800dc0 <cs+0x59>
    db42:	80 91 c1 0d 	lds	r24, 0x0DC1	; 0x800dc1 <cs+0x5a>
    db46:	90 91 c2 0d 	lds	r25, 0x0DC2	; 0x800dc2 <cs+0x5b>
    db4a:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    db4e:	60 93 61 12 	sts	0x1261, r22	; 0x801261 <current_position>
    db52:	70 93 62 12 	sts	0x1262, r23	; 0x801262 <current_position+0x1>
    db56:	80 93 63 12 	sts	0x1263, r24	; 0x801263 <current_position+0x2>
    db5a:	90 93 64 12 	sts	0x1264, r25	; 0x801264 <current_position+0x3>

      if(home_y_axis && home_y_value != 0)
    db5e:	33 20       	and	r3, r3
    db60:	01 f1       	breq	.+64     	; 0xdba2 <gcode_G28(bool, long, bool, long, bool, long, bool)+0x14e>
    db62:	89 81       	ldd	r24, Y+1	; 0x01
    db64:	9a 81       	ldd	r25, Y+2	; 0x02
    db66:	ab 81       	ldd	r26, Y+3	; 0x03
    db68:	bc 81       	ldd	r27, Y+4	; 0x04
    db6a:	00 97       	sbiw	r24, 0x00	; 0
    db6c:	a1 05       	cpc	r26, r1
    db6e:	b1 05       	cpc	r27, r1
    db70:	c1 f0       	breq	.+48     	; 0xdba2 <gcode_G28(bool, long, bool, long, bool, long, bool)+0x14e>
        current_position[Y_AXIS]=home_y_value+cs.add_homing[Y_AXIS];
    db72:	bc 01       	movw	r22, r24
    db74:	cd 01       	movw	r24, r26
    db76:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
    db7a:	9b 01       	movw	r18, r22
    db7c:	ac 01       	movw	r20, r24
    db7e:	60 91 c3 0d 	lds	r22, 0x0DC3	; 0x800dc3 <cs+0x5c>
    db82:	70 91 c4 0d 	lds	r23, 0x0DC4	; 0x800dc4 <cs+0x5d>
    db86:	80 91 c5 0d 	lds	r24, 0x0DC5	; 0x800dc5 <cs+0x5e>
    db8a:	90 91 c6 0d 	lds	r25, 0x0DC6	; 0x800dc6 <cs+0x5f>
    db8e:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    db92:	60 93 65 12 	sts	0x1265, r22	; 0x801265 <current_position+0x4>
    db96:	70 93 66 12 	sts	0x1266, r23	; 0x801266 <current_position+0x5>
    db9a:	80 93 67 12 	sts	0x1267, r24	; 0x801267 <current_position+0x6>
    db9e:	90 93 68 12 	sts	0x1268, r25	; 0x801268 <current_position+0x7>

      #if Z_HOME_DIR < 0                      // If homing towards BED do Z last
          if(home_z) {
    dba2:	ff 20       	and	r15, r15
    dba4:	09 f4       	brne	.+2      	; 0xdba8 <gcode_G28(bool, long, bool, long, bool, long, bool)+0x154>
    dba6:	99 c0       	rjmp	.+306    	; 0xdcda <gcode_G28(bool, long, bool, long, bool, long, bool)+0x286>
            #ifdef MESH_BED_LEVELING  // If Mesh bed leveling, move X&Y to safe position for home
              raise_z_above(MESH_HOME_Z_SEARCH);
    dba8:	60 e0       	ldi	r22, 0x00	; 0
    dbaa:	70 e0       	ldi	r23, 0x00	; 0
    dbac:	80 ea       	ldi	r24, 0xA0	; 160
    dbae:	90 e4       	ldi	r25, 0x40	; 64
    dbb0:	0e 94 f6 6c 	call	0xd9ec	; 0xd9ec <raise_z_above(float)>
              if (!axis_known_position[X_AXIS]) homeaxis(X_AXIS);
    dbb4:	80 91 39 06 	lds	r24, 0x0639	; 0x800639 <axis_known_position>
    dbb8:	81 11       	cpse	r24, r1
    dbba:	02 c0       	rjmp	.+4      	; 0xdbc0 <gcode_G28(bool, long, bool, long, bool, long, bool)+0x16c>
    dbbc:	0f 94 ae 79 	call	0x2f35c	; 0x2f35c <homeaxis(unsigned char, unsigned char) [clone .constprop.88]>
              if (!axis_known_position[Y_AXIS]) homeaxis(Y_AXIS);
    dbc0:	80 91 3a 06 	lds	r24, 0x063A	; 0x80063a <axis_known_position+0x1>
    dbc4:	81 11       	cpse	r24, r1
    dbc6:	03 c0       	rjmp	.+6      	; 0xdbce <gcode_G28(bool, long, bool, long, bool, long, bool)+0x17a>
    dbc8:	81 e0       	ldi	r24, 0x01	; 1
    dbca:	0f 94 ae 79 	call	0x2f35c	; 0x2f35c <homeaxis(unsigned char, unsigned char) [clone .constprop.88]>
              // 1st mesh bed leveling measurement point, corrected.
              world2machine_initialize();
    dbce:	0e 94 c6 60 	call	0xc18c	; 0xc18c <world2machine_initialize()>
              world2machine(pgm_read_float(bed_ref_points_4), pgm_read_float(bed_ref_points_4+1), destination[X_AXIS], destination[Y_AXIS]);
    dbd2:	e4 e0       	ldi	r30, 0x04	; 4
    dbd4:	fc e9       	ldi	r31, 0x9C	; 156
    dbd6:	85 91       	lpm	r24, Z+
    dbd8:	95 91       	lpm	r25, Z+
    dbda:	a5 91       	lpm	r26, Z+
    dbdc:	b4 91       	lpm	r27, Z
    dbde:	e0 e0       	ldi	r30, 0x00	; 0
    dbe0:	fc e9       	ldi	r31, 0x9C	; 156
    dbe2:	45 91       	lpm	r20, Z+
    dbe4:	55 91       	lpm	r21, Z+
    dbe6:	65 91       	lpm	r22, Z+
    dbe8:	74 91       	lpm	r23, Z
	}
}

inline void world2machine(const float &x, const float &y, float &out_x, float &out_y)
{
    out_x = x;
    dbea:	40 93 29 06 	sts	0x0629, r20	; 0x800629 <destination>
    dbee:	50 93 2a 06 	sts	0x062A, r21	; 0x80062a <destination+0x1>
    dbf2:	60 93 2b 06 	sts	0x062B, r22	; 0x80062b <destination+0x2>
    dbf6:	70 93 2c 06 	sts	0x062C, r23	; 0x80062c <destination+0x3>
    out_y = y;
    dbfa:	80 93 2d 06 	sts	0x062D, r24	; 0x80062d <destination+0x4>
    dbfe:	90 93 2e 06 	sts	0x062E, r25	; 0x80062e <destination+0x5>
    dc02:	a0 93 2f 06 	sts	0x062F, r26	; 0x80062f <destination+0x6>
    dc06:	b0 93 30 06 	sts	0x0630, r27	; 0x800630 <destination+0x7>
    world2machine(out_x, out_y);
    dc0a:	6d e2       	ldi	r22, 0x2D	; 45
    dc0c:	76 e0       	ldi	r23, 0x06	; 6
    dc0e:	89 e2       	ldi	r24, 0x29	; 41
    dc10:	96 e0       	ldi	r25, 0x06	; 6
    dc12:	0e 94 76 68 	call	0xd0ec	; 0xd0ec <world2machine(float&, float&)>
              world2machine_reset();
    dc16:	0e 94 f4 61 	call	0xc3e8	; 0xc3e8 <world2machine_reset()>
              if (destination[Y_AXIS] < Y_MIN_POS)
    dc1a:	20 e0       	ldi	r18, 0x00	; 0
    dc1c:	30 e0       	ldi	r19, 0x00	; 0
    dc1e:	40 e8       	ldi	r20, 0x80	; 128
    dc20:	50 ec       	ldi	r21, 0xC0	; 192
    dc22:	60 91 2d 06 	lds	r22, 0x062D	; 0x80062d <destination+0x4>
    dc26:	70 91 2e 06 	lds	r23, 0x062E	; 0x80062e <destination+0x5>
    dc2a:	80 91 2f 06 	lds	r24, 0x062F	; 0x80062f <destination+0x6>
    dc2e:	90 91 30 06 	lds	r25, 0x0630	; 0x800630 <destination+0x7>
    dc32:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
    dc36:	87 ff       	sbrs	r24, 7
    dc38:	0c c0       	rjmp	.+24     	; 0xdc52 <gcode_G28(bool, long, bool, long, bool, long, bool)+0x1fe>
                  destination[Y_AXIS] = Y_MIN_POS;
    dc3a:	80 e0       	ldi	r24, 0x00	; 0
    dc3c:	90 e0       	ldi	r25, 0x00	; 0
    dc3e:	a0 e8       	ldi	r26, 0x80	; 128
    dc40:	b0 ec       	ldi	r27, 0xC0	; 192
    dc42:	80 93 2d 06 	sts	0x062D, r24	; 0x80062d <destination+0x4>
    dc46:	90 93 2e 06 	sts	0x062E, r25	; 0x80062e <destination+0x5>
    dc4a:	a0 93 2f 06 	sts	0x062F, r26	; 0x80062f <destination+0x6>
    dc4e:	b0 93 30 06 	sts	0x0630, r27	; 0x800630 <destination+0x7>
              feedrate = homing_feedrate[X_AXIS] / 20;
    dc52:	80 e0       	ldi	r24, 0x00	; 0
    dc54:	90 e0       	ldi	r25, 0x00	; 0
    dc56:	a6 e1       	ldi	r26, 0x16	; 22
    dc58:	b3 e4       	ldi	r27, 0x43	; 67
    dc5a:	80 93 7a 02 	sts	0x027A, r24	; 0x80027a <feedrate>
    dc5e:	90 93 7b 02 	sts	0x027B, r25	; 0x80027b <feedrate+0x1>
    dc62:	a0 93 7c 02 	sts	0x027C, r26	; 0x80027c <feedrate+0x2>
    dc66:	b0 93 7d 02 	sts	0x027D, r27	; 0x80027d <feedrate+0x3>
    dc6a:	10 92 77 02 	sts	0x0277, r1	; 0x800277 <_ZL14check_endstops.lto_priv.387>
#ifdef DEBUG_BUILD
              SERIAL_ECHOLNPGM("plan_set_position()");
              MYSERIAL.println(current_position[X_AXIS]);MYSERIAL.println(current_position[Y_AXIS]);
              MYSERIAL.println(current_position[Z_AXIS]);MYSERIAL.println(current_position[E_AXIS]);
#endif
              plan_set_position_curposXYZE();
    dc6e:	0f 94 41 4b 	call	0x29682	; 0x29682 <plan_set_position_curposXYZE()>
              SERIAL_ECHOLNPGM("plan_buffer_line()");
              MYSERIAL.println(destination[X_AXIS]);MYSERIAL.println(destination[Y_AXIS]);
              MYSERIAL.println(destination[Z_AXIS]);MYSERIAL.println(destination[E_AXIS]);
              MYSERIAL.println(feedrate);MYSERIAL.println(active_extruder);
#endif
              plan_buffer_line_destinationXYZE(feedrate);
    dc72:	60 91 7a 02 	lds	r22, 0x027A	; 0x80027a <feedrate>
    dc76:	70 91 7b 02 	lds	r23, 0x027B	; 0x80027b <feedrate+0x1>
    dc7a:	80 91 7c 02 	lds	r24, 0x027C	; 0x80027c <feedrate+0x2>
    dc7e:	90 91 7d 02 	lds	r25, 0x027D	; 0x80027d <feedrate+0x3>
    dc82:	0f 94 4e 4c 	call	0x2989c	; 0x2989c <plan_buffer_line_destinationXYZE(float)>
              st_synchronize();
    dc86:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
              current_position[X_AXIS] = destination[X_AXIS];
    dc8a:	80 91 29 06 	lds	r24, 0x0629	; 0x800629 <destination>
    dc8e:	90 91 2a 06 	lds	r25, 0x062A	; 0x80062a <destination+0x1>
    dc92:	a0 91 2b 06 	lds	r26, 0x062B	; 0x80062b <destination+0x2>
    dc96:	b0 91 2c 06 	lds	r27, 0x062C	; 0x80062c <destination+0x3>
    dc9a:	80 93 61 12 	sts	0x1261, r24	; 0x801261 <current_position>
    dc9e:	90 93 62 12 	sts	0x1262, r25	; 0x801262 <current_position+0x1>
    dca2:	a0 93 63 12 	sts	0x1263, r26	; 0x801263 <current_position+0x2>
    dca6:	b0 93 64 12 	sts	0x1264, r27	; 0x801264 <current_position+0x3>
              current_position[Y_AXIS] = destination[Y_AXIS];
    dcaa:	80 91 2d 06 	lds	r24, 0x062D	; 0x80062d <destination+0x4>
    dcae:	90 91 2e 06 	lds	r25, 0x062E	; 0x80062e <destination+0x5>
    dcb2:	a0 91 2f 06 	lds	r26, 0x062F	; 0x80062f <destination+0x6>
    dcb6:	b0 91 30 06 	lds	r27, 0x0630	; 0x800630 <destination+0x7>
    dcba:	80 93 65 12 	sts	0x1265, r24	; 0x801265 <current_position+0x4>
    dcbe:	90 93 66 12 	sts	0x1266, r25	; 0x801266 <current_position+0x5>
    dcc2:	a0 93 67 12 	sts	0x1267, r26	; 0x801267 <current_position+0x6>
    dcc6:	b0 93 68 12 	sts	0x1268, r27	; 0x801268 <current_position+0x7>
    dcca:	81 e0       	ldi	r24, 0x01	; 1
    dccc:	80 93 77 02 	sts	0x0277, r24	; 0x800277 <_ZL14check_endstops.lto_priv.387>
              enable_endstops(true);
              endstops_hit_on_purpose();
    dcd0:	0f 94 a4 25 	call	0x24b48	; 0x24b48 <endstops_hit_on_purpose()>
              homeaxis(Z_AXIS);
    dcd4:	82 e0       	ldi	r24, 0x02	; 2
    dcd6:	0f 94 ae 79 	call	0x2f35c	; 0x2f35c <homeaxis(unsigned char, unsigned char) [clone .constprop.88]>
              homeaxis(Z_AXIS);
            #endif // MESH_BED_LEVELING
          }
      #endif // Z_HOME_DIR < 0

      if(home_z_axis && home_z_value != 0)
    dcda:	cc 20       	and	r12, r12
    dcdc:	e9 f0       	breq	.+58     	; 0xdd18 <gcode_G28(bool, long, bool, long, bool, long, bool)+0x2c4>
    dcde:	81 14       	cp	r8, r1
    dce0:	91 04       	cpc	r9, r1
    dce2:	a1 04       	cpc	r10, r1
    dce4:	b1 04       	cpc	r11, r1
    dce6:	c1 f0       	breq	.+48     	; 0xdd18 <gcode_G28(bool, long, bool, long, bool, long, bool)+0x2c4>
        current_position[Z_AXIS]=home_z_value+cs.add_homing[Z_AXIS];
    dce8:	c5 01       	movw	r24, r10
    dcea:	b4 01       	movw	r22, r8
    dcec:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
    dcf0:	9b 01       	movw	r18, r22
    dcf2:	ac 01       	movw	r20, r24
    dcf4:	60 91 c7 0d 	lds	r22, 0x0DC7	; 0x800dc7 <cs+0x60>
    dcf8:	70 91 c8 0d 	lds	r23, 0x0DC8	; 0x800dc8 <cs+0x61>
    dcfc:	80 91 c9 0d 	lds	r24, 0x0DC9	; 0x800dc9 <cs+0x62>
    dd00:	90 91 ca 0d 	lds	r25, 0x0DCA	; 0x800dca <cs+0x63>
    dd04:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    dd08:	60 93 69 12 	sts	0x1269, r22	; 0x801269 <current_position+0x8>
    dd0c:	70 93 6a 12 	sts	0x126A, r23	; 0x80126a <current_position+0x9>
    dd10:	80 93 6b 12 	sts	0x126B, r24	; 0x80126b <current_position+0xa>
    dd14:	90 93 6c 12 	sts	0x126C, r25	; 0x80126c <current_position+0xb>

      // Set the planner and stepper routine positions.
      // At this point the mesh bed leveling and world2machine corrections are disabled and current_position
      // contains the machine coordinates.
      plan_set_position_curposXYZE();
    dd18:	0f 94 41 4b 	call	0x29682	; 0x29682 <plan_set_position_curposXYZE()>

      clean_up_after_endstop_move(l_feedmultiply);
    dd1c:	c8 01       	movw	r24, r16
    dd1e:	0e 94 4c 65 	call	0xca98	; 0xca98 <clean_up_after_endstop_move(int) [clone .lto_priv.382]>
      endstops_hit_on_purpose();
    dd22:	0f 94 a4 25 	call	0x24b48	; 0x24b48 <endstops_hit_on_purpose()>

    // Load the machine correction matrix
    world2machine_initialize();
    dd26:	0e 94 c6 60 	call	0xc18c	; 0xc18c <world2machine_initialize()>
    // and correct the current_position XY axes to match the transformed coordinate system.
    world2machine_update_current();
    dd2a:	0e 94 02 5f 	call	0xbe04	; 0xbe04 <world2machine_update_current()>

#ifdef MESH_BED_LEVELING
	if (home_x_axis || home_y_axis || without_mbl || home_z_axis)
    dd2e:	d1 10       	cpse	r13, r1
    dd30:	07 c0       	rjmp	.+14     	; 0xdd40 <gcode_G28(bool, long, bool, long, bool, long, bool)+0x2ec>
    dd32:	31 10       	cpse	r3, r1
    dd34:	05 c0       	rjmp	.+10     	; 0xdd40 <gcode_G28(bool, long, bool, long, bool, long, bool)+0x2ec>
    dd36:	8b 8d       	ldd	r24, Y+27	; 0x1b
    dd38:	81 11       	cpse	r24, r1
    dd3a:	02 c0       	rjmp	.+4      	; 0xdd40 <gcode_G28(bool, long, bool, long, bool, long, bool)+0x2ec>
    dd3c:	cc 20       	and	r12, r12
    dd3e:	39 f1       	breq	.+78     	; 0xdd8e <gcode_G28(bool, long, bool, long, bool, long, bool)+0x33a>
    {
      if (! home_z && mbl_was_active) {
    dd40:	f1 10       	cpse	r15, r1
    dd42:	25 c0       	rjmp	.+74     	; 0xdd8e <gcode_G28(bool, long, bool, long, bool, long, bool)+0x33a>
    dd44:	9d 81       	ldd	r25, Y+5	; 0x05
    dd46:	99 23       	and	r25, r25
    dd48:	11 f1       	breq	.+68     	; 0xdd8e <gcode_G28(bool, long, bool, long, bool, long, bool)+0x33a>
        // Re-enable the mesh bed leveling if only the X and Y axes were re-homed.
        mbl.active = true;
    dd4a:	81 e0       	ldi	r24, 0x01	; 1
    dd4c:	80 93 09 13 	sts	0x1309, r24	; 0x801309 <mbl>
        // and re-adjust the current logical Z axis with the bed leveling offset applicable at the current XY position.
        current_position[Z_AXIS] -= mbl.get_z(st_get_position_mm(X_AXIS), st_get_position_mm(Y_AXIS));
    dd50:	0f 94 e7 1a 	call	0x235ce	; 0x235ce <st_get_position_mm(unsigned char)>
    dd54:	6b 01       	movw	r12, r22
    dd56:	7c 01       	movw	r14, r24
    dd58:	80 e0       	ldi	r24, 0x00	; 0
    dd5a:	0f 94 e7 1a 	call	0x235ce	; 0x235ce <st_get_position_mm(unsigned char)>
    dd5e:	a7 01       	movw	r20, r14
    dd60:	96 01       	movw	r18, r12
    dd62:	0f 94 78 91 	call	0x322f0	; 0x322f0 <mesh_bed_leveling::get_z(float, float) [clone .constprop.344]>
    dd66:	9b 01       	movw	r18, r22
    dd68:	ac 01       	movw	r20, r24
    dd6a:	60 91 69 12 	lds	r22, 0x1269	; 0x801269 <current_position+0x8>
    dd6e:	70 91 6a 12 	lds	r23, 0x126A	; 0x80126a <current_position+0x9>
    dd72:	80 91 6b 12 	lds	r24, 0x126B	; 0x80126b <current_position+0xa>
    dd76:	90 91 6c 12 	lds	r25, 0x126C	; 0x80126c <current_position+0xb>
    dd7a:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    dd7e:	60 93 69 12 	sts	0x1269, r22	; 0x801269 <current_position+0x8>
    dd82:	70 93 6a 12 	sts	0x126A, r23	; 0x80126a <current_position+0x9>
    dd86:	80 93 6b 12 	sts	0x126B, r24	; 0x80126b <current_position+0xa>
    dd8a:	90 93 6c 12 	sts	0x126C, r25	; 0x80126c <current_position+0xb>
      }
    }
#endif

      prusa_statistics(20);
    dd8e:	84 e1       	ldi	r24, 0x14	; 20
    dd90:	0f 94 79 32 	call	0x264f2	; 0x264f2 <prusa_statistics(unsigned char)>

      st_synchronize();
    dd94:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
	  homing_flag = false;
    dd98:	10 92 71 12 	sts	0x1271, r1	; 0x801271 <homing_flag>
#if 0
      SERIAL_ECHOPGM("G28, final ");  print_world_coordinates();
      SERIAL_ECHOPGM("G28, final ");  print_physical_coordinates();
      SERIAL_ECHOPGM("G28, final ");  print_mesh_bed_leveling_table();
#endif
}
    dd9c:	0f 90       	pop	r0
    dd9e:	0f 90       	pop	r0
    dda0:	0f 90       	pop	r0
    dda2:	0f 90       	pop	r0
    dda4:	0f 90       	pop	r0
    dda6:	df 91       	pop	r29
    dda8:	cf 91       	pop	r28
    ddaa:	1f 91       	pop	r17
    ddac:	0f 91       	pop	r16
    ddae:	ff 90       	pop	r15
    ddb0:	ef 90       	pop	r14
    ddb2:	df 90       	pop	r13
    ddb4:	cf 90       	pop	r12
    ddb6:	bf 90       	pop	r11
    ddb8:	af 90       	pop	r10
    ddba:	9f 90       	pop	r9
    ddbc:	8f 90       	pop	r8
    ddbe:	7f 90       	pop	r7
    ddc0:	6f 90       	pop	r6
    ddc2:	5f 90       	pop	r5
    ddc4:	4f 90       	pop	r4
    ddc6:	3f 90       	pop	r3
    ddc8:	2f 90       	pop	r2
    ddca:	08 95       	ret

0000ddcc <lcd_frame_start()>:

static void lcd_invalidate_custom_characters() {
	memset(lcd_custom_characters, 0x7F, sizeof(lcd_custom_characters));
}

void lcd_frame_start() {
    ddcc:	e1 e3       	ldi	r30, 0x31	; 49
    ddce:	f3 e0       	ldi	r31, 0x03	; 3
		}
		else { //character is no longer used (or invalid?), mark it as unused
#ifdef DEBUG_CUSTOM_CHARACTERS
			printf_P(PSTR("discarded char %02x at slot %u\n"), c, i);
#endif // DEBUG_CUSTOM_CHARACTERS
			lcd_custom_characters[i] = 0x7F;
    ddd0:	9f e7       	ldi	r25, 0x7F	; 127
}

void lcd_frame_start() {
	// check all custom characters and discard unused ones
	for (uint8_t i = 0; i < 8; i++) {
		uint8_t c = lcd_custom_characters[i];
    ddd2:	81 91       	ld	r24, Z+
		if (c == 0x7F) { //slot empty
    ddd4:	8f 37       	cpi	r24, 0x7F	; 127
    ddd6:	31 f0       	breq	.+12     	; 0xdde4 <lcd_frame_start()+0x18>
    ddd8:	df 01       	movw	r26, r30
    ddda:	11 97       	sbiw	r26, 0x01	; 1
			continue;
		}
		else if (c & 0x80) { //slot was used on the last frame update, mark it as potentially unused this time
    dddc:	87 ff       	sbrs	r24, 7
    ddde:	07 c0       	rjmp	.+14     	; 0xddee <lcd_frame_start()+0x22>
			lcd_custom_characters[i] = c & 0x7F;
    dde0:	8f 77       	andi	r24, 0x7F	; 127
    dde2:	8c 93       	st	X, r24
	memset(lcd_custom_characters, 0x7F, sizeof(lcd_custom_characters));
}

void lcd_frame_start() {
	// check all custom characters and discard unused ones
	for (uint8_t i = 0; i < 8; i++) {
    dde4:	83 e0       	ldi	r24, 0x03	; 3
    dde6:	e9 33       	cpi	r30, 0x39	; 57
    dde8:	f8 07       	cpc	r31, r24
    ddea:	99 f7       	brne	.-26     	; 0xddd2 <lcd_frame_start()+0x6>
	for (uint8_t i = 0; i < 8; i++) {
		printf_P(PSTR(" %02x"), lcd_custom_characters[i]);
	}
	printf_P(PSTR("\n"));
#endif // DEBUG_CUSTOM_CHARACTERS
}
    ddec:	08 95       	ret
		}
		else { //character is no longer used (or invalid?), mark it as unused
#ifdef DEBUG_CUSTOM_CHARACTERS
			printf_P(PSTR("discarded char %02x at slot %u\n"), c, i);
#endif // DEBUG_CUSTOM_CHARACTERS
			lcd_custom_characters[i] = 0x7F;
    ddee:	9c 93       	st	X, r25
    ddf0:	f9 cf       	rjmp	.-14     	; 0xdde4 <lcd_frame_start()+0x18>

0000ddf2 <lcd_update(unsigned char)>:
	}
}

void lcd_update(uint8_t lcdDrawUpdateOverride)
{
	if (lcd_draw_update < lcdDrawUpdateOverride)
    ddf2:	90 91 59 02 	lds	r25, 0x0259	; 0x800259 <lcd_draw_update>
    ddf6:	98 17       	cp	r25, r24
    ddf8:	10 f4       	brcc	.+4      	; 0xddfe <lcd_update(unsigned char)+0xc>
		lcd_draw_update = lcdDrawUpdateOverride;
    ddfa:	80 93 59 02 	sts	0x0259, r24	; 0x800259 <lcd_draw_update>

	if (!lcd_update_enabled) return;
    ddfe:	80 91 5a 02 	lds	r24, 0x025A	; 0x80025a <lcd_update_enabled>
    de02:	88 23       	and	r24, r24
    de04:	39 f0       	breq	.+14     	; 0xde14 <lcd_update(unsigned char)+0x22>

	if (lcd_lcdupdate_func)
    de06:	e0 91 04 04 	lds	r30, 0x0404	; 0x800404 <lcd_lcdupdate_func>
    de0a:	f0 91 05 04 	lds	r31, 0x0405	; 0x800405 <lcd_lcdupdate_func+0x1>
    de0e:	30 97       	sbiw	r30, 0x00	; 0
    de10:	09 f0       	breq	.+2      	; 0xde14 <lcd_update(unsigned char)+0x22>
		lcd_lcdupdate_func();
    de12:	19 94       	eijmp
}
    de14:	08 95       	ret

0000de16 <lcd_printf_P(char const*, ...)>:
	lcd_set_cursor(c, r);
	return fputs_P(str, lcdout);
}

int lcd_printf_P(const char* format, ...)
{
    de16:	cf 93       	push	r28
    de18:	df 93       	push	r29
    de1a:	cd b7       	in	r28, 0x3d	; 61
    de1c:	de b7       	in	r29, 0x3e	; 62
    de1e:	ae 01       	movw	r20, r28
    de20:	4a 5f       	subi	r20, 0xFA	; 250
    de22:	5f 4f       	sbci	r21, 0xFF	; 255
    de24:	fa 01       	movw	r30, r20
    de26:	61 91       	ld	r22, Z+
    de28:	71 91       	ld	r23, Z+
    de2a:	af 01       	movw	r20, r30
	va_list args;
	va_start(args, format);
	int ret = vfprintf_P(lcdout, format, args);
    de2c:	82 ef       	ldi	r24, 0xF2	; 242
    de2e:	93 e0       	ldi	r25, 0x03	; 3
    de30:	0f 94 27 a3 	call	0x3464e	; 0x3464e <vfprintf_P>
	va_end(args);
	return ret;
}
    de34:	df 91       	pop	r29
    de36:	cf 91       	pop	r28
    de38:	08 95       	ret

0000de3a <lcd_puts_P(char const*)>:
	return fputc(ch, lcdout);
}

int lcd_puts_P(const char* str)
{
	return fputs_P(str, lcdout);
    de3a:	62 ef       	ldi	r22, 0xF2	; 242
    de3c:	73 e0       	ldi	r23, 0x03	; 3
    de3e:	0d 94 78 a2 	jmp	0x344f0	; 0x344f0 <fputs_P>

0000de42 <lcd_putc(char)>:
	lcd_command(LCD_SETDDRAMADDR | lcd_ddram_address); // no need for masking the address
}

int lcd_putc(char c)
{
	return fputc(c, lcdout);
    de42:	62 ef       	ldi	r22, 0xF2	; 242
    de44:	73 e0       	ldi	r23, 0x03	; 3
    de46:	08 2e       	mov	r0, r24
    de48:	00 0c       	add	r0, r0
    de4a:	99 0b       	sbc	r25, r25
    de4c:	0d 94 48 a2 	jmp	0x34490	; 0x34490 <fputc>

0000de50 <lcd_space(unsigned char)>:
	va_end(args);
	return ret;
}

void lcd_space(uint8_t n)
{
    de50:	cf 93       	push	r28
    de52:	c8 2f       	mov	r28, r24
	while (n--) lcd_putc(' ');
    de54:	c1 50       	subi	r28, 0x01	; 1
    de56:	20 f0       	brcs	.+8      	; 0xde60 <lcd_space(unsigned char)+0x10>
    de58:	80 e2       	ldi	r24, 0x20	; 32
    de5a:	0e 94 21 6f 	call	0xde42	; 0xde42 <lcd_putc(char)>
    de5e:	fa cf       	rjmp	.-12     	; 0xde54 <lcd_space(unsigned char)+0x4>
}
    de60:	cf 91       	pop	r28
    de62:	08 95       	ret

0000de64 <menu_draw_P(char, char const*, int)>:
/// @brief Draw the label and value for a menu edit item
/// @param chr 1 byte character
/// @param str String residing in program memory (PROGMEM)
/// @param val value to render, ranges from -999 to 9999
static void menu_draw_P(const char chr, const char* str, const int16_t val)
{
    de64:	0f 93       	push	r16
    de66:	1f 93       	push	r17
    de68:	cf 93       	push	r28
    de6a:	df 93       	push	r29
    de6c:	eb 01       	movw	r28, r22
    de6e:	14 2f       	mov	r17, r20
    de70:	05 2f       	mov	r16, r21
	lcd_putc(chr);
    de72:	0e 94 21 6f 	call	0xde42	; 0xde42 <lcd_putc(char)>
	lcd_puts_P(str);
    de76:	ce 01       	movw	r24, r28
    de78:	0e 94 1d 6f 	call	0xde3a	; 0xde3a <lcd_puts_P(char const*)>
	lcd_putc(':');
    de7c:	8a e3       	ldi	r24, 0x3A	; 58
    de7e:	0e 94 21 6f 	call	0xde42	; 0xde42 <lcd_putc(char)>
#else
extern size_t __strlen_P(const char *) __ATTR_CONST__;  /* internal helper function */
__attribute__((__always_inline__)) static __inline__ size_t strlen_P(const char * s);
static __inline__ size_t strlen_P(const char *s) {
  return __builtin_constant_p(__builtin_strlen(s))
     ? __builtin_strlen(s) : __strlen_P(s);
    de82:	ce 01       	movw	r24, r28
    de84:	0f 94 9e a1 	call	0x3433c	; 0x3433c <__strlen_P>

	// Padding to compensate variable string length
	const uint8_t len = strlen_P(str);
	lcd_space((LCD_WIDTH - 4) - (2 + len));
    de88:	9e e0       	ldi	r25, 0x0E	; 14
    de8a:	98 1b       	sub	r25, r24
    de8c:	89 2f       	mov	r24, r25
    de8e:	0e 94 28 6f 	call	0xde50	; 0xde50 <lcd_space(unsigned char)>

	// Right adjusted value
	lcd_printf_P(PSTR("%4d"), val);
    de92:	0f 93       	push	r16
    de94:	1f 93       	push	r17
    de96:	83 e6       	ldi	r24, 0x63	; 99
    de98:	91 e8       	ldi	r25, 0x81	; 129
    de9a:	9f 93       	push	r25
    de9c:	8f 93       	push	r24
    de9e:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
    dea2:	0f 90       	pop	r0
    dea4:	0f 90       	pop	r0
    dea6:	0f 90       	pop	r0
    dea8:	0f 90       	pop	r0
}
    deaa:	df 91       	pop	r29
    deac:	cf 91       	pop	r28
    deae:	1f 91       	pop	r17
    deb0:	0f 91       	pop	r16
    deb2:	08 95       	ret

0000deb4 <lcd_set_cursor(unsigned char, unsigned char)>:
{
	return pgm_read_byte(row_offsets + min(row, LCD_HEIGHT - 1));
}

void lcd_set_cursor(uint8_t col, uint8_t row)
{
    deb4:	cf 93       	push	r28
    deb6:	c8 2f       	mov	r28, r24
    deb8:	86 2f       	mov	r24, r22

/// @brief set the current LCD row
/// @param row LCD row number, ranges from 0 to LCD_HEIGHT - 1
static void FORCE_INLINE lcd_set_current_row(uint8_t row)
{
	lcd_currline = min(row, LCD_HEIGHT - 1);
    deba:	64 30       	cpi	r22, 0x04	; 4
    debc:	08 f0       	brcs	.+2      	; 0xdec0 <lcd_set_cursor(unsigned char, unsigned char)+0xc>
    debe:	83 e0       	ldi	r24, 0x03	; 3
    dec0:	80 93 30 03 	sts	0x0330, r24	; 0x800330 <lcd_currline>
}

void lcd_set_cursor(uint8_t col, uint8_t row)
{
	lcd_set_current_row(row);
    uint8_t addr = col + lcd_get_row_offset(lcd_currline);
    dec4:	0e 94 f2 54 	call	0xa9e4	; 0xa9e4 <lcd_get_row_offset(unsigned char)>
    dec8:	8c 0f       	add	r24, r28
	lcd_ddram_address = addr;
    deca:	80 93 2f 03 	sts	0x032F, r24	; 0x80032f <lcd_ddram_address>
	delayMicroseconds(duration);
}

static void lcd_command(uint8_t value, uint16_t duration = LCD_DEFAULT_DELAY)
{
	lcd_send(value, LOW, duration);
    dece:	44 e6       	ldi	r20, 0x64	; 100
    ded0:	50 e0       	ldi	r21, 0x00	; 0
    ded2:	60 e0       	ldi	r22, 0x00	; 0
    ded4:	80 68       	ori	r24, 0x80	; 128
{
	lcd_set_current_row(row);
    uint8_t addr = col + lcd_get_row_offset(lcd_currline);
	lcd_ddram_address = addr;
	lcd_command(LCD_SETDDRAMADDR | addr);
}
    ded6:	cf 91       	pop	r28
	delayMicroseconds(duration);
}

static void lcd_command(uint8_t value, uint16_t duration = LCD_DEFAULT_DELAY)
{
	lcd_send(value, LOW, duration);
    ded8:	0c 94 7a 5d 	jmp	0xbaf4	; 0xbaf4 <lcd_send(unsigned char, unsigned char, unsigned int)>

0000dedc <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)>:
		menu_back_no_reset();
	}
}

void menu_item_edit_P(const char* str, void* pval, uint8_t pbits, int16_t min_val, int16_t max_val, int16_t jmp_val)
{
    dedc:	7f 92       	push	r7
    dede:	8f 92       	push	r8
    dee0:	9f 92       	push	r9
    dee2:	af 92       	push	r10
    dee4:	bf 92       	push	r11
    dee6:	cf 92       	push	r12
    dee8:	df 92       	push	r13
    deea:	ef 92       	push	r14
    deec:	ff 92       	push	r15
    deee:	0f 93       	push	r16
    def0:	1f 93       	push	r17
    def2:	cf 93       	push	r28
    def4:	df 93       	push	r29
	menu_data_edit_t* _md = (menu_data_edit_t*)&(menu_data[0]);
	if (menu_item == menu_line)
    def6:	e0 91 63 04 	lds	r30, 0x0463	; 0x800463 <menu_item>
    defa:	50 91 62 04 	lds	r21, 0x0462	; 0x800462 <menu_line>
    defe:	e5 13       	cpse	r30, r21
    df00:	73 c0       	rjmp	.+230    	; 0xdfe8 <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)+0x10c>
	{
        int16_t cur_val = (pbits == 8 ? *((uint8_t*)pval) : *((int16_t*)pval));
    df02:	fb 01       	movw	r30, r22
    df04:	48 30       	cpi	r20, 0x08	; 8
    df06:	09 f0       	breq	.+2      	; 0xdf0a <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)+0x2e>
    df08:	6c c0       	rjmp	.+216    	; 0xdfe2 <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)+0x106>
    df0a:	c0 81       	ld	r28, Z
    df0c:	d0 e0       	ldi	r29, 0x00	; 0
    df0e:	49 01       	movw	r8, r18
    df10:	74 2e       	mov	r7, r20
    df12:	6b 01       	movw	r12, r22
    df14:	5c 01       	movw	r10, r24

		if (lcd_draw_update)
    df16:	80 91 59 02 	lds	r24, 0x0259	; 0x800259 <lcd_draw_update>
    df1a:	88 23       	and	r24, r24
    df1c:	59 f0       	breq	.+22     	; 0xdf34 <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)+0x58>
		{
			lcd_set_cursor(0, menu_row);
    df1e:	60 91 60 04 	lds	r22, 0x0460	; 0x800460 <menu_row>
    df22:	80 e0       	ldi	r24, 0x00	; 0
    df24:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
			menu_draw_P(menu_selection_mark(), str, cur_val);
    df28:	0e 94 66 62 	call	0xc4cc	; 0xc4cc <menu_selection_mark() [clone .lto_priv.401]>
    df2c:	ae 01       	movw	r20, r28
    df2e:	b5 01       	movw	r22, r10
    df30:	0e 94 32 6f 	call	0xde64	; 0xde64 <menu_draw_P(char, char const*, int)>
		}
		if (menu_clicked && (lcd_encoder == menu_item))
    df34:	80 91 61 04 	lds	r24, 0x0461	; 0x800461 <menu_clicked>
    df38:	88 23       	and	r24, r24
    df3a:	09 f4       	brne	.+2      	; 0xdf3e <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)+0x62>
    df3c:	55 c0       	rjmp	.+170    	; 0xdfe8 <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)+0x10c>
    df3e:	90 91 63 04 	lds	r25, 0x0463	; 0x800463 <menu_item>
    df42:	20 91 1e 06 	lds	r18, 0x061E	; 0x80061e <lcd_encoder>
    df46:	30 91 1f 06 	lds	r19, 0x061F	; 0x80061f <lcd_encoder+0x1>
    df4a:	92 17       	cp	r25, r18
    df4c:	13 06       	cpc	r1, r19
    df4e:	09 f0       	breq	.+2      	; 0xdf52 <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)+0x76>
    df50:	4b c0       	rjmp	.+150    	; 0xdfe8 <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)+0x10c>
	}
}

void menu_submenu_no_reset(menu_func_t submenu, const bool feedback)
{
	if (menu_depth < MENU_DEPTH_MAX)
    df52:	80 91 df 03 	lds	r24, 0x03DF	; 0x8003df <menu_depth>
    df56:	87 30       	cpi	r24, 0x07	; 7
    df58:	d8 f4       	brcc	.+54     	; 0xdf90 <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)+0xb4>
	{
		menu_stack[menu_depth].menu = menu_menu;
    df5a:	28 2f       	mov	r18, r24
    df5c:	30 e0       	ldi	r19, 0x00	; 0
    df5e:	f9 01       	movw	r30, r18
    df60:	ee 0f       	add	r30, r30
    df62:	ff 1f       	adc	r31, r31
    df64:	e2 0f       	add	r30, r18
    df66:	f3 1f       	adc	r31, r19
    df68:	e9 5a       	subi	r30, 0xA9	; 169
    df6a:	fc 4f       	sbci	r31, 0xFC	; 252
    df6c:	20 91 02 04 	lds	r18, 0x0402	; 0x800402 <menu_menu>
    df70:	30 91 03 04 	lds	r19, 0x0403	; 0x800403 <menu_menu+0x1>
    df74:	31 83       	std	Z+1, r19	; 0x01
    df76:	20 83       	st	Z, r18
		menu_stack[menu_depth++].position = lcd_encoder;
    df78:	8f 5f       	subi	r24, 0xFF	; 255
    df7a:	80 93 df 03 	sts	0x03DF, r24	; 0x8003df <menu_depth>
    df7e:	92 83       	std	Z+2, r25	; 0x02
		menu_goto(submenu, 0, false, feedback);
    df80:	20 e0       	ldi	r18, 0x00	; 0
    df82:	40 e0       	ldi	r20, 0x00	; 0
    df84:	70 e0       	ldi	r23, 0x00	; 0
    df86:	60 e0       	ldi	r22, 0x00	; 0
    df88:	82 e8       	ldi	r24, 0x82	; 130
    df8a:	93 e7       	ldi	r25, 0x73	; 115
    df8c:	0e 94 b7 62 	call	0xc56e	; 0xc56e <menu_goto(void (*)(), int, bool, bool)>
			menu_draw_P(menu_selection_mark(), str, cur_val);
		}
		if (menu_clicked && (lcd_encoder == menu_item))
		{
			menu_submenu_no_reset(_menu_edit_P);
			_md->editLabel = str;
    df90:	b0 92 97 03 	sts	0x0397, r11	; 0x800397 <menu_data+0x1>
    df94:	a0 92 96 03 	sts	0x0396, r10	; 0x800396 <menu_data>
			_md->editValuePtr = pval;
    df98:	d0 92 9a 03 	sts	0x039A, r13	; 0x80039a <menu_data+0x4>
    df9c:	c0 92 99 03 	sts	0x0399, r12	; 0x800399 <menu_data+0x3>
			_md->editValueBits = pbits;
    dfa0:	70 92 98 03 	sts	0x0398, r7	; 0x800398 <menu_data+0x2>
			_md->currentValue = cur_val;
    dfa4:	d0 93 9c 03 	sts	0x039C, r29	; 0x80039c <menu_data+0x6>
    dfa8:	c0 93 9b 03 	sts	0x039B, r28	; 0x80039b <menu_data+0x5>
			_md->minEditValue = min_val;
    dfac:	90 92 9e 03 	sts	0x039E, r9	; 0x80039e <menu_data+0x8>
    dfb0:	80 92 9d 03 	sts	0x039D, r8	; 0x80039d <menu_data+0x7>
			_md->maxEditValue = max_val;
    dfb4:	10 93 a0 03 	sts	0x03A0, r17	; 0x8003a0 <menu_data+0xa>
    dfb8:	00 93 9f 03 	sts	0x039F, r16	; 0x80039f <menu_data+0x9>
			_md->minJumpValue = jmp_val;
    dfbc:	f0 92 a2 03 	sts	0x03A2, r15	; 0x8003a2 <menu_data+0xc>
    dfc0:	e0 92 a1 03 	sts	0x03A1, r14	; 0x8003a1 <menu_data+0xb>
			menu_item_ret();
			return;
		}
	}
	menu_item++;
}
    dfc4:	df 91       	pop	r29
    dfc6:	cf 91       	pop	r28
    dfc8:	1f 91       	pop	r17
    dfca:	0f 91       	pop	r16
    dfcc:	ff 90       	pop	r15
    dfce:	ef 90       	pop	r14
    dfd0:	df 90       	pop	r13
    dfd2:	cf 90       	pop	r12
    dfd4:	bf 90       	pop	r11
    dfd6:	af 90       	pop	r10
    dfd8:	9f 90       	pop	r9
    dfda:	8f 90       	pop	r8
    dfdc:	7f 90       	pop	r7
			_md->editValueBits = pbits;
			_md->currentValue = cur_val;
			_md->minEditValue = min_val;
			_md->maxEditValue = max_val;
			_md->minJumpValue = jmp_val;
			menu_item_ret();
    dfde:	0c 94 73 62 	jmp	0xc4e6	; 0xc4e6 <menu_item_ret()>
void menu_item_edit_P(const char* str, void* pval, uint8_t pbits, int16_t min_val, int16_t max_val, int16_t jmp_val)
{
	menu_data_edit_t* _md = (menu_data_edit_t*)&(menu_data[0]);
	if (menu_item == menu_line)
	{
        int16_t cur_val = (pbits == 8 ? *((uint8_t*)pval) : *((int16_t*)pval));
    dfe2:	c0 81       	ld	r28, Z
    dfe4:	d1 81       	ldd	r29, Z+1	; 0x01
    dfe6:	93 cf       	rjmp	.-218    	; 0xdf0e <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)+0x32>
			_md->minJumpValue = jmp_val;
			menu_item_ret();
			return;
		}
	}
	menu_item++;
    dfe8:	80 91 63 04 	lds	r24, 0x0463	; 0x800463 <menu_item>
    dfec:	8f 5f       	subi	r24, 0xFF	; 255
    dfee:	80 93 63 04 	sts	0x0463, r24	; 0x800463 <menu_item>
}
    dff2:	df 91       	pop	r29
    dff4:	cf 91       	pop	r28
    dff6:	1f 91       	pop	r17
    dff8:	0f 91       	pop	r16
    dffa:	ff 90       	pop	r15
    dffc:	ef 90       	pop	r14
    dffe:	df 90       	pop	r13
    e000:	cf 90       	pop	r12
    e002:	bf 90       	pop	r11
    e004:	af 90       	pop	r10
    e006:	9f 90       	pop	r9
    e008:	8f 90       	pop	r8
    e00a:	7f 90       	pop	r7
    e00c:	08 95       	ret

0000e00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>:
{
	return fputs_P(str, lcdout);
}

int lcd_puts_at_P(uint8_t c, uint8_t r, const char* str)
{
    e00e:	cf 93       	push	r28
    e010:	df 93       	push	r29
    e012:	ea 01       	movw	r28, r20
	lcd_set_cursor(c, r);
    e014:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
	return fputs_P(str, lcdout);
    e018:	62 ef       	ldi	r22, 0xF2	; 242
    e01a:	73 e0       	ldi	r23, 0x03	; 3
    e01c:	ce 01       	movw	r24, r28
}
    e01e:	df 91       	pop	r29
    e020:	cf 91       	pop	r28
}

int lcd_puts_at_P(uint8_t c, uint8_t r, const char* str)
{
	lcd_set_cursor(c, r);
	return fputs_P(str, lcdout);
    e022:	0d 94 78 a2 	jmp	0x344f0	; 0x344f0 <fputs_P>

0000e026 <lcd_putc_at(unsigned char, unsigned char, char)>:
{
	return fputc(c, lcdout);
}

int lcd_putc_at(uint8_t c, uint8_t r, char ch)
{
    e026:	cf 93       	push	r28
    e028:	c4 2f       	mov	r28, r20
	lcd_set_cursor(c, r);
    e02a:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
	return fputc(ch, lcdout);
    e02e:	62 ef       	ldi	r22, 0xF2	; 242
    e030:	73 e0       	ldi	r23, 0x03	; 3
    e032:	8c 2f       	mov	r24, r28
    e034:	cc 0f       	add	r28, r28
    e036:	99 0b       	sbc	r25, r25
}
    e038:	cf 91       	pop	r28
}

int lcd_putc_at(uint8_t c, uint8_t r, char ch)
{
	lcd_set_cursor(c, r);
	return fputc(ch, lcdout);
    e03a:	0d 94 48 a2 	jmp	0x34490	; 0x34490 <fputc>

0000e03e <lcd_home()>:
}

// Set cursor position to zero and in DDRAM. It does not unshift the display.
void lcd_home(void)
{
	lcd_set_cursor(0, 0);
    e03e:	60 e0       	ldi	r22, 0x00	; 0
    e040:	80 e0       	ldi	r24, 0x00	; 0
    e042:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
	lcd_ddram_address = 0;
    e046:	10 92 2f 03 	sts	0x032F, r1	; 0x80032f <lcd_ddram_address>
}
    e04a:	08 95       	ret

0000e04c <lcd_clear()>:
	delayMicroseconds(duration);
}

static void lcd_command(uint8_t value, uint16_t duration = LCD_DEFAULT_DELAY)
{
	lcd_send(value, LOW, duration);
    e04c:	40 e4       	ldi	r20, 0x40	; 64
    e04e:	56 e0       	ldi	r21, 0x06	; 6
    e050:	60 e0       	ldi	r22, 0x00	; 0
    e052:	81 e0       	ldi	r24, 0x01	; 1
    e054:	0e 94 7a 5d 	call	0xbaf4	; 0xbaf4 <lcd_send(unsigned char, unsigned char, unsigned int)>

// Clear display, set cursor position to zero and unshift the display. It also invalidates all custom characters
void lcd_clear(void)
{
	lcd_command(LCD_CLEARDISPLAY, 1600);
	lcd_currline = 0;
    e058:	10 92 30 03 	sts	0x0330, r1	; 0x800330 <lcd_currline>
	lcd_ddram_address = 0;
    e05c:	10 92 2f 03 	sts	0x032F, r1	; 0x80032f <lcd_ddram_address>
	lcd_send(charToSend, HIGH);
	lcd_ddram_address++; // no need for preventing ddram overflow
}

static void lcd_invalidate_custom_characters() {
	memset(lcd_custom_characters, 0x7F, sizeof(lcd_custom_characters));
    e060:	48 e0       	ldi	r20, 0x08	; 8
    e062:	50 e0       	ldi	r21, 0x00	; 0
    e064:	6f e7       	ldi	r22, 0x7F	; 127
    e066:	70 e0       	ldi	r23, 0x00	; 0
    e068:	81 e3       	ldi	r24, 0x31	; 49
    e06a:	93 e0       	ldi	r25, 0x03	; 3
    e06c:	0d 94 12 aa 	jmp	0x35424	; 0x35424 <memset>

0000e070 <lcd_update_enable(unsigned char)>:
}

void lcd_update_enable(uint8_t enabled)
{
	// printf_P(PSTR("lcd_update_enable(%u -> %u)\n"), lcd_update_enabled, enabled);
	if (lcd_update_enabled != enabled)
    e070:	90 91 5a 02 	lds	r25, 0x025A	; 0x80025a <lcd_update_enabled>
    e074:	98 17       	cp	r25, r24
    e076:	09 f1       	breq	.+66     	; 0xe0ba <lcd_update_enable(unsigned char)+0x4a>
	{
		lcd_update_enabled = enabled;
    e078:	80 93 5a 02 	sts	0x025A, r24	; 0x80025a <lcd_update_enabled>
		if (enabled)
    e07c:	88 23       	and	r24, r24
    e07e:	e9 f0       	breq	.+58     	; 0xe0ba <lcd_update_enable(unsigned char)+0x4a>
		{ // Reset encoder position. This is equivalent to re-entering a menu.
			lcd_encoder = 0;
    e080:	10 92 1f 06 	sts	0x061F, r1	; 0x80061f <lcd_encoder+0x1>
    e084:	10 92 1e 06 	sts	0x061E, r1	; 0x80061e <lcd_encoder>
			lcd_encoder_diff = 0;
    e088:	10 92 a4 05 	sts	0x05A4, r1	; 0x8005a4 <_ZL16lcd_encoder_diff.lto_priv.502>
			// Enabling the normal LCD update procedure.
			// Reset the timeout interval.
			lcd_timeoutToStatus.start();
    e08c:	83 ee       	ldi	r24, 0xE3	; 227
    e08e:	93 e0       	ldi	r25, 0x03	; 3
    e090:	0f 94 47 10 	call	0x2208e	; 0x2208e <Timer<unsigned long>::start()>
			// Force the keypad update now.
			lcd_next_update_millis = _millis() - 1;
    e094:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
    e098:	61 50       	subi	r22, 0x01	; 1
    e09a:	71 09       	sbc	r23, r1
    e09c:	81 09       	sbc	r24, r1
    e09e:	91 09       	sbc	r25, r1
    e0a0:	60 93 c5 03 	sts	0x03C5, r22	; 0x8003c5 <lcd_next_update_millis>
    e0a4:	70 93 c6 03 	sts	0x03C6, r23	; 0x8003c6 <lcd_next_update_millis+0x1>
    e0a8:	80 93 c7 03 	sts	0x03C7, r24	; 0x8003c7 <lcd_next_update_millis+0x2>
    e0ac:	90 93 c8 03 	sts	0x03C8, r25	; 0x8003c8 <lcd_next_update_millis+0x3>
			// Full update.
			lcd_clear();
    e0b0:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
			lcd_update(2);
    e0b4:	82 e0       	ldi	r24, 0x02	; 2
    e0b6:	0c 94 f9 6e 	jmp	0xddf2	; 0xddf2 <lcd_update(unsigned char)>
		} else
		{
			// Clear the LCD always, or let it to the caller?
		}
	}
}
    e0ba:	08 95       	ret

0000e0bc <lcd_begin(unsigned char) [clone .lto_priv.405]>:
		lcd_ddram_address++; // no need for preventing ddram overflow
	}
}

static void lcd_begin(uint8_t clear)
{
    e0bc:	cf 93       	push	r28
    e0be:	c8 2f       	mov	r28, r24
	lcd_currline = 0;
    e0c0:	10 92 30 03 	sts	0x0330, r1	; 0x800330 <lcd_currline>
	lcd_ddram_address = 0;
    e0c4:	10 92 2f 03 	sts	0x032F, r1	; 0x80032f <lcd_ddram_address>
	lcd_send(charToSend, HIGH);
	lcd_ddram_address++; // no need for preventing ddram overflow
}

static void lcd_invalidate_custom_characters() {
	memset(lcd_custom_characters, 0x7F, sizeof(lcd_custom_characters));
    e0c8:	48 e0       	ldi	r20, 0x08	; 8
    e0ca:	50 e0       	ldi	r21, 0x00	; 0
    e0cc:	6f e7       	ldi	r22, 0x7F	; 127
    e0ce:	70 e0       	ldi	r23, 0x00	; 0
    e0d0:	81 e3       	ldi	r24, 0x31	; 49
    e0d2:	93 e0       	ldi	r25, 0x03	; 3
    e0d4:	0f 94 12 aa 	call	0x35424	; 0x35424 <memset>
	lcd_currline = 0;
	lcd_ddram_address = 0;

	lcd_invalidate_custom_characters();

	lcd_send(LCD_FUNCTIONSET | LCD_8BITMODE, LOW | LCD_HALF_FLAG, 4500); // wait min 4.1ms
    e0d8:	44 e9       	ldi	r20, 0x94	; 148
    e0da:	51 e1       	ldi	r21, 0x11	; 17
    e0dc:	62 e0       	ldi	r22, 0x02	; 2
    e0de:	80 e3       	ldi	r24, 0x30	; 48
    e0e0:	0e 94 7a 5d 	call	0xbaf4	; 0xbaf4 <lcd_send(unsigned char, unsigned char, unsigned int)>
	// second try
	lcd_send(LCD_FUNCTIONSET | LCD_8BITMODE, LOW | LCD_HALF_FLAG, 150);
    e0e4:	46 e9       	ldi	r20, 0x96	; 150
    e0e6:	50 e0       	ldi	r21, 0x00	; 0
    e0e8:	62 e0       	ldi	r22, 0x02	; 2
    e0ea:	80 e3       	ldi	r24, 0x30	; 48
    e0ec:	0e 94 7a 5d 	call	0xbaf4	; 0xbaf4 <lcd_send(unsigned char, unsigned char, unsigned int)>
	// third go!
	lcd_send(LCD_FUNCTIONSET | LCD_8BITMODE, LOW | LCD_HALF_FLAG, 150);
    e0f0:	46 e9       	ldi	r20, 0x96	; 150
    e0f2:	50 e0       	ldi	r21, 0x00	; 0
    e0f4:	62 e0       	ldi	r22, 0x02	; 2
    e0f6:	80 e3       	ldi	r24, 0x30	; 48
    e0f8:	0e 94 7a 5d 	call	0xbaf4	; 0xbaf4 <lcd_send(unsigned char, unsigned char, unsigned int)>
#ifndef LCD_8BIT
	// set to 4-bit interface
	lcd_send(LCD_FUNCTIONSET | LCD_4BITMODE, LOW | LCD_HALF_FLAG, 150);
    e0fc:	46 e9       	ldi	r20, 0x96	; 150
    e0fe:	50 e0       	ldi	r21, 0x00	; 0
    e100:	62 e0       	ldi	r22, 0x02	; 2
    e102:	80 e2       	ldi	r24, 0x20	; 32
    e104:	0e 94 7a 5d 	call	0xbaf4	; 0xbaf4 <lcd_send(unsigned char, unsigned char, unsigned int)>
#endif

	// finally, set # lines, font size, etc.0
	lcd_command(LCD_FUNCTIONSET | lcd_displayfunction);
    e108:	80 91 00 04 	lds	r24, 0x0400	; 0x800400 <_ZL19lcd_displayfunction.lto_priv.513>
	delayMicroseconds(duration);
}

static void lcd_command(uint8_t value, uint16_t duration = LCD_DEFAULT_DELAY)
{
	lcd_send(value, LOW, duration);
    e10c:	44 e6       	ldi	r20, 0x64	; 100
    e10e:	50 e0       	ldi	r21, 0x00	; 0
    e110:	60 e0       	ldi	r22, 0x00	; 0
    e112:	80 62       	ori	r24, 0x20	; 32
    e114:	0e 94 7a 5d 	call	0xbaf4	; 0xbaf4 <lcd_send(unsigned char, unsigned char, unsigned int)>
}

// Turn the display on/off (quickly)
void lcd_display(void)
{
    lcd_displaycontrol |= LCD_DISPLAYON;
    e118:	84 e0       	ldi	r24, 0x04	; 4
    e11a:	80 93 2e 03 	sts	0x032E, r24	; 0x80032e <lcd_displaycontrol>
	delayMicroseconds(duration);
}

static void lcd_command(uint8_t value, uint16_t duration = LCD_DEFAULT_DELAY)
{
	lcd_send(value, LOW, duration);
    e11e:	44 e6       	ldi	r20, 0x64	; 100
    e120:	50 e0       	ldi	r21, 0x00	; 0
    e122:	60 e0       	ldi	r22, 0x00	; 0
    e124:	8c e0       	ldi	r24, 0x0C	; 12
    e126:	0e 94 7a 5d 	call	0xbaf4	; 0xbaf4 <lcd_send(unsigned char, unsigned char, unsigned int)>
	lcd_command(LCD_FUNCTIONSET | lcd_displayfunction);
	// turn the display on with no cursor or blinking default
	lcd_displaycontrol = LCD_CURSOROFF | LCD_BLINKOFF;
	lcd_display();
	// clear it off
	if (clear) lcd_clear();
    e12a:	c1 11       	cpse	r28, r1
    e12c:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
	delayMicroseconds(duration);
}

static void lcd_command(uint8_t value, uint16_t duration = LCD_DEFAULT_DELAY)
{
	lcd_send(value, LOW, duration);
    e130:	44 e6       	ldi	r20, 0x64	; 100
    e132:	50 e0       	ldi	r21, 0x00	; 0
    e134:	60 e0       	ldi	r22, 0x00	; 0
    e136:	86 e0       	ldi	r24, 0x06	; 6
	if (clear) lcd_clear();
	// Initialize to default text direction (for romance languages)
	lcd_displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT;
	// set the entry mode
	lcd_command(LCD_ENTRYMODESET | lcd_displaymode);
}
    e138:	cf 91       	pop	r28
	delayMicroseconds(duration);
}

static void lcd_command(uint8_t value, uint16_t duration = LCD_DEFAULT_DELAY)
{
	lcd_send(value, LOW, duration);
    e13a:	0c 94 7a 5d 	jmp	0xbaf4	; 0xbaf4 <lcd_send(unsigned char, unsigned char, unsigned int)>

0000e13e <lcd_refresh()>:
	fdev_setup_stream(lcdout, lcd_putchar, NULL, _FDEV_SETUP_WRITE); //setup lcdout stream
}

void lcd_refresh(void)
{
    lcd_begin(1);
    e13e:	81 e0       	ldi	r24, 0x01	; 1
    e140:	0c 94 5e 70 	jmp	0xe0bc	; 0xe0bc <lcd_begin(unsigned char) [clone .lto_priv.405]>

0000e144 <lcd_write(unsigned char) [clone .lto_priv.402]>:
{
	lcd_send(value, LOW, duration);
}

static void lcd_write(uint8_t value)
{
    e144:	cf 92       	push	r12
    e146:	df 92       	push	r13
    e148:	ff 92       	push	r15
    e14a:	0f 93       	push	r16
    e14c:	1f 93       	push	r17
    e14e:	cf 93       	push	r28
    e150:	df 93       	push	r29
    e152:	00 d0       	rcall	.+0      	; 0xe154 <lcd_write(unsigned char) [clone .lto_priv.402]+0x10>
    e154:	00 d0       	rcall	.+0      	; 0xe156 <lcd_write(unsigned char) [clone .lto_priv.402]+0x12>
    e156:	1f 92       	push	r1
    e158:	1f 92       	push	r1
    e15a:	cd b7       	in	r28, 0x3d	; 61
    e15c:	de b7       	in	r29, 0x3e	; 62
	if (value == '\n') {
    e15e:	8a 30       	cpi	r24, 0x0A	; 10
    e160:	d9 f4       	brne	.+54     	; 0xe198 <lcd_write(unsigned char) [clone .lto_priv.402]+0x54>
		if (lcd_currline > 3) lcd_currline = -1;
    e162:	80 91 30 03 	lds	r24, 0x0330	; 0x800330 <lcd_currline>
    e166:	84 30       	cpi	r24, 0x04	; 4
    e168:	18 f0       	brcs	.+6      	; 0xe170 <lcd_write(unsigned char) [clone .lto_priv.402]+0x2c>
    e16a:	8f ef       	ldi	r24, 0xFF	; 255
    e16c:	80 93 30 03 	sts	0x0330, r24	; 0x800330 <lcd_currline>
		lcd_set_cursor(0, lcd_currline + 1); // LF
    e170:	60 91 30 03 	lds	r22, 0x0330	; 0x800330 <lcd_currline>
    e174:	6f 5f       	subi	r22, 0xFF	; 255
    e176:	80 e0       	ldi	r24, 0x00	; 0
    e178:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
		lcd_print_custom(value);
	} else {
		lcd_send(value, HIGH);
		lcd_ddram_address++; // no need for preventing ddram overflow
	}
}
    e17c:	28 96       	adiw	r28, 0x08	; 8
    e17e:	0f b6       	in	r0, 0x3f	; 63
    e180:	f8 94       	cli
    e182:	de bf       	out	0x3e, r29	; 62
    e184:	0f be       	out	0x3f, r0	; 63
    e186:	cd bf       	out	0x3d, r28	; 61
    e188:	df 91       	pop	r29
    e18a:	cf 91       	pop	r28
    e18c:	1f 91       	pop	r17
    e18e:	0f 91       	pop	r16
    e190:	ff 90       	pop	r15
    e192:	df 90       	pop	r13
    e194:	cf 90       	pop	r12
    e196:	08 95       	ret
static void lcd_write(uint8_t value)
{
	if (value == '\n') {
		if (lcd_currline > 3) lcd_currline = -1;
		lcd_set_cursor(0, lcd_currline + 1); // LF
	} else if ((value >= 0x80) && (value < (0x80 + CUSTOM_CHARACTERS_CNT))) {
    e198:	90 e8       	ldi	r25, 0x80	; 128
    e19a:	98 0f       	add	r25, r24
		lcd_print_custom(value);
	} else {
		lcd_send(value, HIGH);
    e19c:	44 e6       	ldi	r20, 0x64	; 100
    e19e:	50 e0       	ldi	r21, 0x00	; 0
    e1a0:	61 e0       	ldi	r22, 0x01	; 1
static void lcd_write(uint8_t value)
{
	if (value == '\n') {
		if (lcd_currline > 3) lcd_currline = -1;
		lcd_set_cursor(0, lcd_currline + 1); // LF
	} else if ((value >= 0x80) && (value < (0x80 + CUSTOM_CHARACTERS_CNT))) {
    e1a2:	9a 34       	cpi	r25, 0x4A	; 74
    e1a4:	08 f5       	brcc	.+66     	; 0xe1e8 <lcd_write(unsigned char) [clone .lto_priv.402]+0xa4>
// Custom character data

// #define DEBUG_CUSTOM_CHARACTERS

static void lcd_print_custom(uint8_t c) {
	uint8_t charToSend = pgm_read_byte(&Font[c - 0x80].alternate); // in case no empty slot is found, use the alternate character.
    e1a6:	48 2f       	mov	r20, r24
    e1a8:	40 58       	subi	r20, 0x80	; 128
    e1aa:	55 0b       	sbc	r21, r21
    e1ac:	9a 01       	movw	r18, r20
    e1ae:	96 e0       	ldi	r25, 0x06	; 6
    e1b0:	92 9f       	mul	r25, r18
    e1b2:	a0 01       	movw	r20, r0
    e1b4:	93 9f       	mul	r25, r19
    e1b6:	50 0d       	add	r21, r0
    e1b8:	11 24       	eor	r1, r1
    e1ba:	fa 01       	movw	r30, r20
    e1bc:	ea 56       	subi	r30, 0x6A	; 106
    e1be:	fb 48       	sbci	r31, 0x8B	; 139
    e1c0:	f4 90       	lpm	r15, Z
    e1c2:	e1 e3       	ldi	r30, 0x31	; 49
    e1c4:	f3 e0       	ldi	r31, 0x03	; 3
    e1c6:	30 e0       	ldi	r19, 0x00	; 0
    e1c8:	20 e0       	ldi	r18, 0x00	; 0
	int8_t slotToUse = -1;
    e1ca:	9f ef       	ldi	r25, 0xFF	; 255

	for (uint8_t i = 0; i < 8; i++) {
		// first check if we already have the character in the lcd memory
		if ((lcd_custom_characters[i] & 0x7F) == (c & 0x7F)) {
    e1cc:	61 91       	ld	r22, Z+
    e1ce:	78 2f       	mov	r23, r24
    e1d0:	76 27       	eor	r23, r22
    e1d2:	7f 77       	andi	r23, 0x7F	; 127
    e1d4:	89 f4       	brne	.+34     	; 0xe1f8 <lcd_write(unsigned char) [clone .lto_priv.402]+0xb4>
			lcd_custom_characters[i] = c; // mark the custom character as used
    e1d6:	f9 01       	movw	r30, r18
    e1d8:	ef 5c       	subi	r30, 0xCF	; 207
    e1da:	fc 4f       	sbci	r31, 0xFC	; 252
    e1dc:	80 83       	st	Z, r24
    e1de:	f2 2e       	mov	r15, r18
#ifdef DEBUG_CUSTOM_CHARACTERS
	printf_P(PSTR("created char %02x at slot %u\n"), c, slotToUse);
#endif // DEBUG_CUSTOM_CHARACTERS

sendChar:
	lcd_send(charToSend, HIGH);
    e1e0:	44 e6       	ldi	r20, 0x64	; 100
    e1e2:	50 e0       	ldi	r21, 0x00	; 0
    e1e4:	61 e0       	ldi	r22, 0x01	; 1
    e1e6:	8f 2d       	mov	r24, r15
		if (lcd_currline > 3) lcd_currline = -1;
		lcd_set_cursor(0, lcd_currline + 1); // LF
	} else if ((value >= 0x80) && (value < (0x80 + CUSTOM_CHARACTERS_CNT))) {
		lcd_print_custom(value);
	} else {
		lcd_send(value, HIGH);
    e1e8:	0e 94 7a 5d 	call	0xbaf4	; 0xbaf4 <lcd_send(unsigned char, unsigned char, unsigned int)>
		lcd_ddram_address++; // no need for preventing ddram overflow
    e1ec:	80 91 2f 03 	lds	r24, 0x032F	; 0x80032f <lcd_ddram_address>
    e1f0:	8f 5f       	subi	r24, 0xFF	; 255
    e1f2:	80 93 2f 03 	sts	0x032F, r24	; 0x80032f <lcd_ddram_address>
    e1f6:	c2 cf       	rjmp	.-124    	; 0xe17c <lcd_write(unsigned char) [clone .lto_priv.402]+0x38>
			charToSend = i; // send the found custom character id
#ifdef DEBUG_CUSTOM_CHARACTERS
			printf_P(PSTR("found char %02x at slot %u\n"), c, i);
#endif // DEBUG_CUSTOM_CHARACTERS
			goto sendChar;
		} else if (lcd_custom_characters[i] == 0x7F) { //found an empty slot. create a new custom character and send it
    e1f8:	6f 37       	cpi	r22, 0x7F	; 127
    e1fa:	09 f0       	breq	.+2      	; 0xe1fe <lcd_write(unsigned char) [clone .lto_priv.402]+0xba>
    e1fc:	3c c0       	rjmp	.+120    	; 0xe276 <forBegin_9104+0x58>
			lcd_custom_characters[i] = c; // mark the custom character as used
    e1fe:	f9 01       	movw	r30, r18
    e200:	ef 5c       	subi	r30, 0xCF	; 207
    e202:	fc 4f       	sbci	r31, 0xFC	; 252
    e204:	80 83       	st	Z, r24
			slotToUse = i;
    e206:	92 2f       	mov	r25, r18
#ifdef DEBUG_CUSTOM_CHARACTERS
	printf_P(PSTR("replaced char %02x at slot %u\n"), lcd_custom_characters[slotToUse], slotToUse);
#endif // DEBUG_CUSTOM_CHARACTERS

createChar:
	charToSend = slotToUse;
    e208:	f9 2e       	mov	r15, r25
	lcd_createChar_P(slotToUse, &Font[c - 0x80]);
    e20a:	fa 01       	movw	r30, r20
    e20c:	ef 56       	subi	r30, 0x6F	; 111
    e20e:	fb 48       	sbci	r31, 0x8B	; 139
		"dec __zero_reg__" "\n\t"
		"brne forBegin_%=" "\n\t"

		: "=&d" (temp), "=&r" (colByte)
		: "z" (char_p), "e" (charmap)
	);
    e210:	8e 01       	movw	r16, r28
    e212:	0f 5f       	subi	r16, 0xFF	; 255
    e214:	1f 4f       	sbci	r17, 0xFF	; 255
    e216:	d8 01       	movw	r26, r16
    e218:	95 91       	lpm	r25, Z+
    e21a:	88 e0       	ldi	r24, 0x08	; 8
    e21c:	18 2e       	mov	r1, r24

0000e21e <forBegin_9104>:
    e21e:	10 fe       	sbrs	r1, 0
    e220:	05 90       	lpm	r0, Z+
    e222:	02 94       	swap	r0
    e224:	80 2d       	mov	r24, r0
    e226:	97 95       	ror	r25
    e228:	88 1f       	adc	r24, r24
    e22a:	8d 93       	st	X+, r24
    e22c:	1a 94       	dec	r1
    e22e:	b9 f7       	brne	.-18     	; 0xe21e <forBegin_9104>

	lcd_command(LCD_SETCGRAMADDR | (location << 3));
    e230:	bf 2d       	mov	r27, r15
    e232:	e8 e0       	ldi	r30, 0x08	; 8
    e234:	be 02       	muls	r27, r30
    e236:	c0 01       	movw	r24, r0
    e238:	11 24       	eor	r1, r1
	delayMicroseconds(duration);
}

static void lcd_command(uint8_t value, uint16_t duration = LCD_DEFAULT_DELAY)
{
	lcd_send(value, LOW, duration);
    e23a:	44 e6       	ldi	r20, 0x64	; 100
    e23c:	50 e0       	ldi	r21, 0x00	; 0
    e23e:	60 e0       	ldi	r22, 0x00	; 0
    e240:	80 64       	ori	r24, 0x40	; 64
    e242:	0e 94 7a 5d 	call	0xbaf4	; 0xbaf4 <lcd_send(unsigned char, unsigned char, unsigned int)>
    e246:	6e 01       	movw	r12, r28
    e248:	f9 e0       	ldi	r31, 0x09	; 9
    e24a:	cf 0e       	add	r12, r31
    e24c:	d1 1c       	adc	r13, r1
		: "z" (char_p), "e" (charmap)
	);

	lcd_command(LCD_SETCGRAMADDR | (location << 3));
	for (uint8_t i = 0; i < 8; i++) {
		lcd_send(charmap[i], HIGH);
    e24e:	44 e6       	ldi	r20, 0x64	; 100
    e250:	50 e0       	ldi	r21, 0x00	; 0
    e252:	61 e0       	ldi	r22, 0x01	; 1
    e254:	d8 01       	movw	r26, r16
    e256:	8d 91       	ld	r24, X+
    e258:	8d 01       	movw	r16, r26
    e25a:	0e 94 7a 5d 	call	0xbaf4	; 0xbaf4 <lcd_send(unsigned char, unsigned char, unsigned int)>
		: "=&d" (temp), "=&r" (colByte)
		: "z" (char_p), "e" (charmap)
	);

	lcd_command(LCD_SETCGRAMADDR | (location << 3));
	for (uint8_t i = 0; i < 8; i++) {
    e25e:	c0 16       	cp	r12, r16
    e260:	d1 06       	cpc	r13, r17
    e262:	a9 f7       	brne	.-22     	; 0xe24e <forBegin_9104+0x30>
		lcd_send(charmap[i], HIGH);
	}
	lcd_command(LCD_SETDDRAMADDR | lcd_ddram_address); // no need for masking the address
    e264:	80 91 2f 03 	lds	r24, 0x032F	; 0x80032f <lcd_ddram_address>
	delayMicroseconds(duration);
}

static void lcd_command(uint8_t value, uint16_t duration = LCD_DEFAULT_DELAY)
{
	lcd_send(value, LOW, duration);
    e268:	44 e6       	ldi	r20, 0x64	; 100
    e26a:	50 e0       	ldi	r21, 0x00	; 0
    e26c:	60 e0       	ldi	r22, 0x00	; 0
    e26e:	80 68       	ori	r24, 0x80	; 128
    e270:	0e 94 7a 5d 	call	0xbaf4	; 0xbaf4 <lcd_send(unsigned char, unsigned char, unsigned int)>
    e274:	b5 cf       	rjmp	.-150    	; 0xe1e0 <lcd_write(unsigned char) [clone .lto_priv.402]+0x9c>
			goto sendChar;
		} else if (lcd_custom_characters[i] == 0x7F) { //found an empty slot. create a new custom character and send it
			lcd_custom_characters[i] = c; // mark the custom character as used
			slotToUse = i;
			goto createChar;
		} else if (!(lcd_custom_characters[i] & 0x80)) { // found potentially unused slot. Remember it in case it's needed
    e276:	67 ff       	sbrs	r22, 7
			slotToUse = i;
    e278:	92 2f       	mov	r25, r18
    e27a:	2f 5f       	subi	r18, 0xFF	; 255
    e27c:	3f 4f       	sbci	r19, 0xFF	; 255

static void lcd_print_custom(uint8_t c) {
	uint8_t charToSend = pgm_read_byte(&Font[c - 0x80].alternate); // in case no empty slot is found, use the alternate character.
	int8_t slotToUse = -1;

	for (uint8_t i = 0; i < 8; i++) {
    e27e:	28 30       	cpi	r18, 0x08	; 8
    e280:	31 05       	cpc	r19, r1
    e282:	09 f0       	breq	.+2      	; 0xe286 <forBegin_9104+0x68>
    e284:	a3 cf       	rjmp	.-186    	; 0xe1cc <lcd_write(unsigned char) [clone .lto_priv.402]+0x88>
	}

	// If this point was reached, then there is no empty slot available.
	// If there exists any potentially unused slot, then use that one instead.
	// Otherwise, use the alternate form of the character.
	if (slotToUse < 0) {
    e286:	9f 3f       	cpi	r25, 0xFF	; 255
    e288:	09 f0       	breq	.+2      	; 0xe28c <forBegin_9104+0x6e>
    e28a:	be cf       	rjmp	.-132    	; 0xe208 <lcd_write(unsigned char) [clone .lto_priv.402]+0xc4>
    e28c:	a9 cf       	rjmp	.-174    	; 0xe1e0 <lcd_write(unsigned char) [clone .lto_priv.402]+0x9c>

0000e28e <menu_progressbar_update(unsigned int)>:
	lcd_print_pad_P(title, LCD_WIDTH);
	lcd_set_cursor(0, 2);
}

void menu_progressbar_update(uint16_t newVal)
{
    e28e:	cf 93       	push	r28
	uint8_t newCnt = (newVal * LCD_WIDTH) / progressbar_total;
    e290:	24 e1       	ldi	r18, 0x14	; 20
    e292:	ac 01       	movw	r20, r24
    e294:	24 9f       	mul	r18, r20
    e296:	c0 01       	movw	r24, r0
    e298:	25 9f       	mul	r18, r21
    e29a:	90 0d       	add	r25, r0
    e29c:	11 24       	eor	r1, r1
    e29e:	60 91 6d 03 	lds	r22, 0x036D	; 0x80036d <progressbar_total>
    e2a2:	70 91 6e 03 	lds	r23, 0x036E	; 0x80036e <progressbar_total+0x1>
    e2a6:	0f 94 a9 a4 	call	0x34952	; 0x34952 <__udivmodhi4>
    e2aa:	c6 2f       	mov	r28, r22
    e2ac:	65 31       	cpi	r22, 0x15	; 21
    e2ae:	08 f0       	brcs	.+2      	; 0xe2b2 <menu_progressbar_update(unsigned int)+0x24>
    e2b0:	c4 e1       	ldi	r28, 0x14	; 20
	if (newCnt > LCD_WIDTH)
		newCnt = LCD_WIDTH;
	while (newCnt > progressbar_block_count)
    e2b2:	80 91 6c 03 	lds	r24, 0x036C	; 0x80036c <progressbar_block_count>
    e2b6:	8c 17       	cp	r24, r28
    e2b8:	48 f4       	brcc	.+18     	; 0xe2cc <menu_progressbar_update(unsigned int)+0x3e>
}

void lcd_print(long n, int base)
{
	if (base == 0)
		lcd_write(n);
    e2ba:	8f ef       	ldi	r24, 0xFF	; 255
    e2bc:	0e 94 a2 70 	call	0xe144	; 0xe144 <lcd_write(unsigned char) [clone .lto_priv.402]>
	{
		lcd_print(LCD_STR_SOLID_BLOCK[0]);
		progressbar_block_count++;
    e2c0:	80 91 6c 03 	lds	r24, 0x036C	; 0x80036c <progressbar_block_count>
    e2c4:	8f 5f       	subi	r24, 0xFF	; 255
    e2c6:	80 93 6c 03 	sts	0x036C, r24	; 0x80036c <progressbar_block_count>
    e2ca:	f3 cf       	rjmp	.-26     	; 0xe2b2 <menu_progressbar_update(unsigned int)+0x24>
	}
}
    e2cc:	cf 91       	pop	r28
    e2ce:	08 95       	ret

0000e2d0 <menu_progressbar_finish()>:

void menu_progressbar_finish(void)
{
	progressbar_total = 1;
    e2d0:	81 e0       	ldi	r24, 0x01	; 1
    e2d2:	90 e0       	ldi	r25, 0x00	; 0
    e2d4:	90 93 6e 03 	sts	0x036E, r25	; 0x80036e <progressbar_total+0x1>
    e2d8:	80 93 6d 03 	sts	0x036D, r24	; 0x80036d <progressbar_total>
	menu_progressbar_update(1);
    e2dc:	0e 94 47 71 	call	0xe28e	; 0xe28e <menu_progressbar_update(unsigned int)>
	_delay(300);
    e2e0:	6c e2       	ldi	r22, 0x2C	; 44
    e2e2:	71 e0       	ldi	r23, 0x01	; 1
    e2e4:	80 e0       	ldi	r24, 0x00	; 0
    e2e6:	90 e0       	ldi	r25, 0x00	; 0
    e2e8:	0d 94 bd 0d 	jmp	0x21b7a	; 0x21b7a <delay2>

0000e2ec <lcd_printNumber(unsigned long, unsigned char)>:
	else
		lcd_printNumber(n, base);
}

void lcd_printNumber(unsigned long n, uint8_t base)
{
    e2ec:	8f 92       	push	r8
    e2ee:	9f 92       	push	r9
    e2f0:	af 92       	push	r10
    e2f2:	bf 92       	push	r11
    e2f4:	ef 92       	push	r14
    e2f6:	ff 92       	push	r15
    e2f8:	0f 93       	push	r16
    e2fa:	1f 93       	push	r17
    e2fc:	cf 93       	push	r28
    e2fe:	df 93       	push	r29
    e300:	cd b7       	in	r28, 0x3d	; 61
    e302:	de b7       	in	r29, 0x3e	; 62
    e304:	a0 97       	sbiw	r28, 0x20	; 32
    e306:	0f b6       	in	r0, 0x3f	; 63
    e308:	f8 94       	cli
    e30a:	de bf       	out	0x3e, r29	; 62
    e30c:	0f be       	out	0x3f, r0	; 63
    e30e:	cd bf       	out	0x3d, r28	; 61
	unsigned char buf[8 * sizeof(long)]; // Assumes 8-bit chars.
	uint8_t i = 0;
	if (n == 0)
    e310:	61 15       	cp	r22, r1
    e312:	71 05       	cpc	r23, r1
    e314:	81 05       	cpc	r24, r1
    e316:	91 05       	cpc	r25, r1
    e318:	99 f4       	brne	.+38     	; 0xe340 <lcd_printNumber(unsigned long, unsigned char)+0x54>
}

void lcd_print(long n, int base)
{
	if (base == 0)
		lcd_write(n);
    e31a:	80 e3       	ldi	r24, 0x30	; 48
		buf[i++] = n % base;
		n /= base;
	}
	for (; i > 0; i--)
		lcd_print((char) (buf[i - 1] < 10 ?	'0' + buf[i - 1] : 'A' + buf[i - 1] - 10));
}
    e31c:	a0 96       	adiw	r28, 0x20	; 32
    e31e:	0f b6       	in	r0, 0x3f	; 63
    e320:	f8 94       	cli
    e322:	de bf       	out	0x3e, r29	; 62
    e324:	0f be       	out	0x3f, r0	; 63
    e326:	cd bf       	out	0x3d, r28	; 61
    e328:	df 91       	pop	r29
    e32a:	cf 91       	pop	r28
    e32c:	1f 91       	pop	r17
    e32e:	0f 91       	pop	r16
    e330:	ff 90       	pop	r15
    e332:	ef 90       	pop	r14
    e334:	bf 90       	pop	r11
    e336:	af 90       	pop	r10
    e338:	9f 90       	pop	r9
    e33a:	8f 90       	pop	r8
}

void lcd_print(long n, int base)
{
	if (base == 0)
		lcd_write(n);
    e33c:	0c 94 a2 70 	jmp	0xe144	; 0xe144 <lcd_write(unsigned char) [clone .lto_priv.402]>
}

void lcd_printNumber(unsigned long n, uint8_t base)
{
	unsigned char buf[8 * sizeof(long)]; // Assumes 8-bit chars.
	uint8_t i = 0;
    e340:	00 e0       	ldi	r16, 0x00	; 0
		lcd_print('0');
		return;
	}
	while (n > 0)
	{
		buf[i++] = n % base;
    e342:	84 2e       	mov	r8, r20
    e344:	91 2c       	mov	r9, r1
    e346:	b1 2c       	mov	r11, r1
    e348:	a1 2c       	mov	r10, r1
    e34a:	9e 01       	movw	r18, r28
    e34c:	2f 5f       	subi	r18, 0xFF	; 255
    e34e:	3f 4f       	sbci	r19, 0xFF	; 255
    e350:	79 01       	movw	r14, r18
    e352:	a5 01       	movw	r20, r10
    e354:	94 01       	movw	r18, r8
    e356:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
    e35a:	f7 01       	movw	r30, r14
    e35c:	e0 0f       	add	r30, r16
    e35e:	f1 1d       	adc	r31, r1
    e360:	60 83       	st	Z, r22
		n /= base;
    e362:	b9 01       	movw	r22, r18
    e364:	ca 01       	movw	r24, r20
		lcd_print('0');
		return;
	}
	while (n > 0)
	{
		buf[i++] = n % base;
    e366:	0f 5f       	subi	r16, 0xFF	; 255
	if (n == 0)
	{
		lcd_print('0');
		return;
	}
	while (n > 0)
    e368:	61 15       	cp	r22, r1
    e36a:	71 05       	cpc	r23, r1
    e36c:	81 05       	cpc	r24, r1
    e36e:	91 05       	cpc	r25, r1
    e370:	81 f7       	brne	.-32     	; 0xe352 <lcd_printNumber(unsigned long, unsigned char)+0x66>
    e372:	0e 0d       	add	r16, r14
    e374:	1f 2d       	mov	r17, r15
    e376:	11 1d       	adc	r17, r1
	{
		buf[i++] = n % base;
		n /= base;
	}
	for (; i > 0; i--)
    e378:	e0 16       	cp	r14, r16
    e37a:	f1 06       	cpc	r15, r17
    e37c:	59 f0       	breq	.+22     	; 0xe394 <lcd_printNumber(unsigned long, unsigned char)+0xa8>
		lcd_print((char) (buf[i - 1] < 10 ?	'0' + buf[i - 1] : 'A' + buf[i - 1] - 10));
    e37e:	f8 01       	movw	r30, r16
    e380:	82 91       	ld	r24, -Z
    e382:	8f 01       	movw	r16, r30
    e384:	8a 30       	cpi	r24, 0x0A	; 10
    e386:	20 f4       	brcc	.+8      	; 0xe390 <lcd_printNumber(unsigned long, unsigned char)+0xa4>
    e388:	80 5d       	subi	r24, 0xD0	; 208
}

void lcd_print(long n, int base)
{
	if (base == 0)
		lcd_write(n);
    e38a:	0e 94 a2 70 	call	0xe144	; 0xe144 <lcd_write(unsigned char) [clone .lto_priv.402]>
    e38e:	f4 cf       	rjmp	.-24     	; 0xe378 <lcd_printNumber(unsigned long, unsigned char)+0x8c>
	{
		buf[i++] = n % base;
		n /= base;
	}
	for (; i > 0; i--)
		lcd_print((char) (buf[i - 1] < 10 ?	'0' + buf[i - 1] : 'A' + buf[i - 1] - 10));
    e390:	89 5c       	subi	r24, 0xC9	; 201
    e392:	fb cf       	rjmp	.-10     	; 0xe38a <lcd_printNumber(unsigned long, unsigned char)+0x9e>
}
    e394:	a0 96       	adiw	r28, 0x20	; 32
    e396:	0f b6       	in	r0, 0x3f	; 63
    e398:	f8 94       	cli
    e39a:	de bf       	out	0x3e, r29	; 62
    e39c:	0f be       	out	0x3f, r0	; 63
    e39e:	cd bf       	out	0x3d, r28	; 61
    e3a0:	df 91       	pop	r29
    e3a2:	cf 91       	pop	r28
    e3a4:	1f 91       	pop	r17
    e3a6:	0f 91       	pop	r16
    e3a8:	ff 90       	pop	r15
    e3aa:	ef 90       	pop	r14
    e3ac:	bf 90       	pop	r11
    e3ae:	af 90       	pop	r10
    e3b0:	9f 90       	pop	r9
    e3b2:	8f 90       	pop	r8
    e3b4:	08 95       	ret

0000e3b6 <lcd_print(long, int) [clone .part.3]>:
void lcd_print(unsigned int n, int base)
{
	lcd_print((unsigned long) n, base);
}

void lcd_print(long n, int base)
    e3b6:	cf 92       	push	r12
    e3b8:	df 92       	push	r13
    e3ba:	ef 92       	push	r14
    e3bc:	ff 92       	push	r15
    e3be:	6b 01       	movw	r12, r22
    e3c0:	7c 01       	movw	r14, r24
{
	if (base == 0)
		lcd_write(n);
	else if (base == 10)
	{
		if (n < 0)
    e3c2:	f7 fe       	sbrs	r15, 7
    e3c4:	0b c0       	rjmp	.+22     	; 0xe3dc <lcd_print(long, int) [clone .part.3]+0x26>
}

void lcd_print(long n, int base)
{
	if (base == 0)
		lcd_write(n);
    e3c6:	8d e2       	ldi	r24, 0x2D	; 45
    e3c8:	0e 94 a2 70 	call	0xe144	; 0xe144 <lcd_write(unsigned char) [clone .lto_priv.402]>
	else if (base == 10)
	{
		if (n < 0)
		{
			lcd_print('-');
			n = -n;
    e3cc:	f0 94       	com	r15
    e3ce:	e0 94       	com	r14
    e3d0:	d0 94       	com	r13
    e3d2:	c0 94       	com	r12
    e3d4:	c1 1c       	adc	r12, r1
    e3d6:	d1 1c       	adc	r13, r1
    e3d8:	e1 1c       	adc	r14, r1
    e3da:	f1 1c       	adc	r15, r1
		}
		lcd_printNumber(n, 10);
    e3dc:	4a e0       	ldi	r20, 0x0A	; 10
    e3de:	c7 01       	movw	r24, r14
    e3e0:	b6 01       	movw	r22, r12
	}
	else
		lcd_printNumber(n, base);
}
    e3e2:	ff 90       	pop	r15
    e3e4:	ef 90       	pop	r14
    e3e6:	df 90       	pop	r13
    e3e8:	cf 90       	pop	r12
		if (n < 0)
		{
			lcd_print('-');
			n = -n;
		}
		lcd_printNumber(n, 10);
    e3ea:	0c 94 76 71 	jmp	0xe2ec	; 0xe2ec <lcd_printNumber(unsigned long, unsigned char)>

0000e3ee <lcd_print_pad_P(char const*, unsigned char)>:
    lcd_space(len);
    return len;
}

uint8_t lcd_print_pad_P(const char* s, uint8_t len)
{
    e3ee:	0f 93       	push	r16
    e3f0:	1f 93       	push	r17
    e3f2:	cf 93       	push	r28
    e3f4:	8c 01       	movw	r16, r24
    e3f6:	c6 2f       	mov	r28, r22
    while (len && pgm_read_byte(s)) {
    e3f8:	cc 23       	and	r28, r28
    e3fa:	59 f0       	breq	.+22     	; 0xe412 <lcd_print_pad_P(char const*, unsigned char)+0x24>
    e3fc:	f8 01       	movw	r30, r16
    e3fe:	24 91       	lpm	r18, Z
    e400:	22 23       	and	r18, r18
    e402:	39 f0       	breq	.+14     	; 0xe412 <lcd_print_pad_P(char const*, unsigned char)+0x24>
        lcd_write(pgm_read_byte(s++));
    e404:	0f 5f       	subi	r16, 0xFF	; 255
    e406:	1f 4f       	sbci	r17, 0xFF	; 255
    e408:	84 91       	lpm	r24, Z
    e40a:	0e 94 a2 70 	call	0xe144	; 0xe144 <lcd_write(unsigned char) [clone .lto_priv.402]>
        --len;
    e40e:	c1 50       	subi	r28, 0x01	; 1
    e410:	f3 cf       	rjmp	.-26     	; 0xe3f8 <lcd_print_pad_P(char const*, unsigned char)+0xa>
    }
    lcd_space(len);
    e412:	8c 2f       	mov	r24, r28
    e414:	0e 94 28 6f 	call	0xde50	; 0xde50 <lcd_space(unsigned char)>
    return len;
}
    e418:	8c 2f       	mov	r24, r28
    e41a:	cf 91       	pop	r28
    e41c:	1f 91       	pop	r17
    e41e:	0f 91       	pop	r16
    e420:	08 95       	ret

0000e422 <menu_progressbar_init(unsigned int, char const*)>:
}

static uint8_t progressbar_block_count = 0;
static uint16_t progressbar_total = 0;
void menu_progressbar_init(uint16_t total, const char* title)
{
    e422:	0f 93       	push	r16
    e424:	1f 93       	push	r17
    e426:	cf 93       	push	r28
    e428:	df 93       	push	r29
    e42a:	8c 01       	movw	r16, r24
    e42c:	eb 01       	movw	r28, r22
	lcd_clear();
    e42e:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
	progressbar_block_count = 0;
    e432:	10 92 6c 03 	sts	0x036C, r1	; 0x80036c <progressbar_block_count>
	progressbar_total = total;
    e436:	10 93 6e 03 	sts	0x036E, r17	; 0x80036e <progressbar_total+0x1>
    e43a:	00 93 6d 03 	sts	0x036D, r16	; 0x80036d <progressbar_total>

	lcd_set_cursor(0, 1);
    e43e:	61 e0       	ldi	r22, 0x01	; 1
    e440:	80 e0       	ldi	r24, 0x00	; 0
    e442:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
	lcd_print_pad_P(title, LCD_WIDTH);
    e446:	64 e1       	ldi	r22, 0x14	; 20
    e448:	ce 01       	movw	r24, r28
    e44a:	0e 94 f7 71 	call	0xe3ee	; 0xe3ee <lcd_print_pad_P(char const*, unsigned char)>
	lcd_set_cursor(0, 2);
    e44e:	62 e0       	ldi	r22, 0x02	; 2
    e450:	80 e0       	ldi	r24, 0x00	; 0
}
    e452:	df 91       	pop	r29
    e454:	cf 91       	pop	r28
    e456:	1f 91       	pop	r17
    e458:	0f 91       	pop	r16
	progressbar_block_count = 0;
	progressbar_total = total;

	lcd_set_cursor(0, 1);
	lcd_print_pad_P(title, LCD_WIDTH);
	lcd_set_cursor(0, 2);
    e45a:	0c 94 5a 6f 	jmp	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>

0000e45e <menu_item_function_P(char const*, char, void (*)(unsigned char), unsigned char)>:
//! @param func pointer to function taking uint8_t with no return value
//! @param fn_par value to be passed to function
//! @retval 0
//! @retval 1 Item was clicked
void menu_item_function_P(const char* str, char number, void (*func)(uint8_t), uint8_t fn_par)
{
    e45e:	ef 92       	push	r14
    e460:	ff 92       	push	r15
    e462:	0f 93       	push	r16
    e464:	1f 93       	push	r17
    e466:	cf 93       	push	r28
    e468:	df 93       	push	r29
    if (menu_item == menu_line)
    e46a:	70 91 63 04 	lds	r23, 0x0463	; 0x800463 <menu_item>
    e46e:	30 91 62 04 	lds	r19, 0x0462	; 0x800462 <menu_line>
    e472:	73 13       	cpse	r23, r19
    e474:	3f c0       	rjmp	.+126    	; 0xe4f4 <menu_item_function_P(char const*, char, void (*)(unsigned char), unsigned char)+0x96>
    e476:	12 2f       	mov	r17, r18
    e478:	ea 01       	movw	r28, r20
    e47a:	06 2f       	mov	r16, r22
    e47c:	7c 01       	movw	r14, r24
    {
        if (lcd_draw_update) menu_draw_item_puts_P(' ', str, number);
    e47e:	80 91 59 02 	lds	r24, 0x0259	; 0x800259 <lcd_draw_update>
    e482:	88 23       	and	r24, r24
    e484:	d1 f0       	breq	.+52     	; 0xe4ba <menu_item_function_P(char const*, char, void (*)(unsigned char), unsigned char)+0x5c>
}

static void menu_draw_item_puts_P(char type_char, const char* str, char num)
{
    const uint8_t max_strlen = LCD_WIDTH - 3;
    lcd_putc_at(0, menu_row, menu_selection_mark());
    e486:	0e 94 66 62 	call	0xc4cc	; 0xc4cc <menu_selection_mark() [clone .lto_priv.401]>
    e48a:	48 2f       	mov	r20, r24
    e48c:	60 91 60 04 	lds	r22, 0x0460	; 0x800460 <menu_row>
    e490:	80 e0       	ldi	r24, 0x00	; 0
    e492:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
    uint8_t len = lcd_print_pad_P(str, max_strlen);
    e496:	61 e1       	ldi	r22, 0x11	; 17
    e498:	c7 01       	movw	r24, r14
    e49a:	0e 94 f7 71 	call	0xe3ee	; 0xe3ee <lcd_print_pad_P(char const*, unsigned char)>
    lcd_putc_at((max_strlen - len) + 2, menu_row, num);
    e49e:	40 2f       	mov	r20, r16
    e4a0:	60 91 60 04 	lds	r22, 0x0460	; 0x800460 <menu_row>
    e4a4:	93 e1       	ldi	r25, 0x13	; 19
    e4a6:	98 1b       	sub	r25, r24
    e4a8:	89 2f       	mov	r24, r25
    e4aa:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
    lcd_putc_at(LCD_WIDTH - 1, menu_row, type_char);
    e4ae:	40 e2       	ldi	r20, 0x20	; 32
    e4b0:	60 91 60 04 	lds	r22, 0x0460	; 0x800460 <menu_row>
    e4b4:	83 e1       	ldi	r24, 0x13	; 19
    e4b6:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
void menu_item_function_P(const char* str, char number, void (*func)(uint8_t), uint8_t fn_par)
{
    if (menu_item == menu_line)
    {
        if (lcd_draw_update) menu_draw_item_puts_P(' ', str, number);
        if (menu_clicked && (lcd_encoder == menu_item))
    e4ba:	80 91 61 04 	lds	r24, 0x0461	; 0x800461 <menu_clicked>
    e4be:	88 23       	and	r24, r24
    e4c0:	c9 f0       	breq	.+50     	; 0xe4f4 <menu_item_function_P(char const*, char, void (*)(unsigned char), unsigned char)+0x96>
    e4c2:	20 91 63 04 	lds	r18, 0x0463	; 0x800463 <menu_item>
    e4c6:	80 91 1e 06 	lds	r24, 0x061E	; 0x80061e <lcd_encoder>
    e4ca:	90 91 1f 06 	lds	r25, 0x061F	; 0x80061f <lcd_encoder+0x1>
    e4ce:	28 17       	cp	r18, r24
    e4d0:	19 06       	cpc	r1, r25
    e4d2:	81 f4       	brne	.+32     	; 0xe4f4 <menu_item_function_P(char const*, char, void (*)(unsigned char), unsigned char)+0x96>
        {
            lcd_update_enabled = 0;
    e4d4:	10 92 5a 02 	sts	0x025A, r1	; 0x80025a <lcd_update_enabled>
            if (func) func(fn_par);
    e4d8:	81 2f       	mov	r24, r17
    e4da:	fe 01       	movw	r30, r28
    e4dc:	19 95       	eicall
            lcd_update_enabled = 1;
    e4de:	81 e0       	ldi	r24, 0x01	; 1
    e4e0:	80 93 5a 02 	sts	0x025A, r24	; 0x80025a <lcd_update_enabled>
            menu_item_ret();
            return;
        }
    }
    menu_item++;
}
    e4e4:	df 91       	pop	r29
    e4e6:	cf 91       	pop	r28
    e4e8:	1f 91       	pop	r17
    e4ea:	0f 91       	pop	r16
    e4ec:	ff 90       	pop	r15
    e4ee:	ef 90       	pop	r14
        if (menu_clicked && (lcd_encoder == menu_item))
        {
            lcd_update_enabled = 0;
            if (func) func(fn_par);
            lcd_update_enabled = 1;
            menu_item_ret();
    e4f0:	0c 94 73 62 	jmp	0xc4e6	; 0xc4e6 <menu_item_ret()>
            return;
        }
    }
    menu_item++;
    e4f4:	80 91 63 04 	lds	r24, 0x0463	; 0x800463 <menu_item>
    e4f8:	8f 5f       	subi	r24, 0xFF	; 255
    e4fa:	80 93 63 04 	sts	0x0463, r24	; 0x800463 <menu_item>
}
    e4fe:	df 91       	pop	r29
    e500:	cf 91       	pop	r28
    e502:	1f 91       	pop	r17
    e504:	0f 91       	pop	r16
    e506:	ff 90       	pop	r15
    e508:	ef 90       	pop	r14
    e50a:	08 95       	ret

0000e50c <menu_draw_item_puts_P(char, char const*)>:
static char menu_selection_mark(){
	return (lcd_encoder == menu_item)?'>':' ';
}

static void menu_draw_item_puts_P(char type_char, const char* str)
{
    e50c:	0f 93       	push	r16
    e50e:	1f 93       	push	r17
    e510:	cf 93       	push	r28
    e512:	c8 2f       	mov	r28, r24
    e514:	8b 01       	movw	r16, r22
    lcd_putc_at(0, menu_row, menu_selection_mark());
    e516:	0e 94 66 62 	call	0xc4cc	; 0xc4cc <menu_selection_mark() [clone .lto_priv.401]>
    e51a:	48 2f       	mov	r20, r24
    e51c:	60 91 60 04 	lds	r22, 0x0460	; 0x800460 <menu_row>
    e520:	80 e0       	ldi	r24, 0x00	; 0
    e522:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
    lcd_print_pad_P(str, LCD_WIDTH - 2);
    e526:	62 e1       	ldi	r22, 0x12	; 18
    e528:	c8 01       	movw	r24, r16
    e52a:	0e 94 f7 71 	call	0xe3ee	; 0xe3ee <lcd_print_pad_P(char const*, unsigned char)>
    lcd_putc(type_char);
    e52e:	8c 2f       	mov	r24, r28
}
    e530:	cf 91       	pop	r28
    e532:	1f 91       	pop	r17
    e534:	0f 91       	pop	r16

static void menu_draw_item_puts_P(char type_char, const char* str)
{
    lcd_putc_at(0, menu_row, menu_selection_mark());
    lcd_print_pad_P(str, LCD_WIDTH - 2);
    lcd_putc(type_char);
    e536:	0c 94 21 6f 	jmp	0xde42	; 0xde42 <lcd_putc(char)>

0000e53a <menu_item_function_P(char const*, void (*)())>:
bool __attribute__((noinline)) menu_item_leave(){
    return ((menu_item == menu_line) && menu_clicked && (lcd_encoder == menu_item)) || menu_leaving;
}

void menu_item_function_P(const char* str, menu_func_t func)
{
    e53a:	cf 93       	push	r28
    e53c:	df 93       	push	r29
	if (menu_item == menu_line)
    e53e:	30 91 63 04 	lds	r19, 0x0463	; 0x800463 <menu_item>
    e542:	20 91 62 04 	lds	r18, 0x0462	; 0x800462 <menu_line>
    e546:	32 13       	cpse	r19, r18
    e548:	21 c0       	rjmp	.+66     	; 0xe58c <menu_item_function_P(char const*, void (*)())+0x52>
    e54a:	eb 01       	movw	r28, r22
    e54c:	bc 01       	movw	r22, r24
	{
		if (lcd_draw_update) menu_draw_item_puts_P(' ', str);
    e54e:	80 91 59 02 	lds	r24, 0x0259	; 0x800259 <lcd_draw_update>
    e552:	88 23       	and	r24, r24
    e554:	19 f0       	breq	.+6      	; 0xe55c <menu_item_function_P(char const*, void (*)())+0x22>
    e556:	80 e2       	ldi	r24, 0x20	; 32
    e558:	0e 94 86 72 	call	0xe50c	; 0xe50c <menu_draw_item_puts_P(char, char const*)>
		if (menu_clicked && (lcd_encoder == menu_item))
    e55c:	80 91 61 04 	lds	r24, 0x0461	; 0x800461 <menu_clicked>
    e560:	88 23       	and	r24, r24
    e562:	a1 f0       	breq	.+40     	; 0xe58c <menu_item_function_P(char const*, void (*)())+0x52>
    e564:	20 91 63 04 	lds	r18, 0x0463	; 0x800463 <menu_item>
    e568:	80 91 1e 06 	lds	r24, 0x061E	; 0x80061e <lcd_encoder>
    e56c:	90 91 1f 06 	lds	r25, 0x061F	; 0x80061f <lcd_encoder+0x1>
    e570:	28 17       	cp	r18, r24
    e572:	19 06       	cpc	r1, r25
    e574:	59 f4       	brne	.+22     	; 0xe58c <menu_item_function_P(char const*, void (*)())+0x52>
		{
			lcd_update_enabled = 0;
    e576:	10 92 5a 02 	sts	0x025A, r1	; 0x80025a <lcd_update_enabled>
			if (func) func();
    e57a:	fe 01       	movw	r30, r28
    e57c:	19 95       	eicall
			lcd_update_enabled = 1;
    e57e:	81 e0       	ldi	r24, 0x01	; 1
    e580:	80 93 5a 02 	sts	0x025A, r24	; 0x80025a <lcd_update_enabled>
			menu_item_ret();
			return;
		}
	}
	menu_item++;
}
    e584:	df 91       	pop	r29
    e586:	cf 91       	pop	r28
		if (menu_clicked && (lcd_encoder == menu_item))
		{
			lcd_update_enabled = 0;
			if (func) func();
			lcd_update_enabled = 1;
			menu_item_ret();
    e588:	0c 94 73 62 	jmp	0xc4e6	; 0xc4e6 <menu_item_ret()>
			return;
		}
	}
	menu_item++;
    e58c:	80 91 63 04 	lds	r24, 0x0463	; 0x800463 <menu_item>
    e590:	8f 5f       	subi	r24, 0xFF	; 255
    e592:	80 93 63 04 	sts	0x0463, r24	; 0x800463 <menu_item>
}
    e596:	df 91       	pop	r29
    e598:	cf 91       	pop	r28
    e59a:	08 95       	ret

0000e59c <menu_item_back_P(char const*)>:
    menu_item++;
}

void menu_item_back_P(const char* str)
{
	if (menu_item == menu_line)
    e59c:	30 91 63 04 	lds	r19, 0x0463	; 0x800463 <menu_item>
    e5a0:	20 91 62 04 	lds	r18, 0x0462	; 0x800462 <menu_line>
    e5a4:	32 13       	cpse	r19, r18
    e5a6:	19 c0       	rjmp	.+50     	; 0xe5da <menu_item_back_P(char const*)+0x3e>
    e5a8:	bc 01       	movw	r22, r24
	{
		if (lcd_draw_update) menu_draw_item_puts_P(LCD_STR_UPLEVEL[0], str);
    e5aa:	80 91 59 02 	lds	r24, 0x0259	; 0x800259 <lcd_draw_update>
    e5ae:	88 23       	and	r24, r24
    e5b0:	19 f0       	breq	.+6      	; 0xe5b8 <menu_item_back_P(char const*)+0x1c>
    e5b2:	83 e8       	ldi	r24, 0x83	; 131
    e5b4:	0e 94 86 72 	call	0xe50c	; 0xe50c <menu_draw_item_puts_P(char, char const*)>
		if (menu_clicked && (lcd_encoder == menu_item))
    e5b8:	80 91 61 04 	lds	r24, 0x0461	; 0x800461 <menu_clicked>
    e5bc:	88 23       	and	r24, r24
    e5be:	69 f0       	breq	.+26     	; 0xe5da <menu_item_back_P(char const*)+0x3e>
    e5c0:	20 91 63 04 	lds	r18, 0x0463	; 0x800463 <menu_item>
    e5c4:	80 91 1e 06 	lds	r24, 0x061E	; 0x80061e <lcd_encoder>
    e5c8:	90 91 1f 06 	lds	r25, 0x061F	; 0x80061f <lcd_encoder+0x1>
    e5cc:	28 17       	cp	r18, r24
    e5ce:	19 06       	cpc	r1, r25
    e5d0:	21 f4       	brne	.+8      	; 0xe5da <menu_item_back_P(char const*)+0x3e>
		{
			menu_back();
    e5d2:	0e 94 1b 63 	call	0xc636	; 0xc636 <menu_back()>
			menu_item_ret();
    e5d6:	0c 94 73 62 	jmp	0xc4e6	; 0xc4e6 <menu_item_ret()>
			return;
		}
	}
	menu_item++;
    e5da:	80 91 63 04 	lds	r24, 0x0463	; 0x800463 <menu_item>
    e5de:	8f 5f       	subi	r24, 0xFF	; 255
    e5e0:	80 93 63 04 	sts	0x0463, r24	; 0x800463 <menu_item>
}
    e5e4:	08 95       	ret

0000e5e6 <menu_item_submenu_P(char const*, void (*)())>:
	menu_item++;
	return 0;
}

void menu_item_submenu_P(const char* str, menu_func_t submenu)
{
    e5e6:	cf 93       	push	r28
    e5e8:	df 93       	push	r29
	if (menu_item == menu_line)
    e5ea:	30 91 63 04 	lds	r19, 0x0463	; 0x800463 <menu_item>
    e5ee:	20 91 62 04 	lds	r18, 0x0462	; 0x800462 <menu_line>
    e5f2:	32 13       	cpse	r19, r18
    e5f4:	1e c0       	rjmp	.+60     	; 0xe632 <menu_item_submenu_P(char const*, void (*)())+0x4c>
    e5f6:	eb 01       	movw	r28, r22
    e5f8:	bc 01       	movw	r22, r24
	{
		if (lcd_draw_update) menu_draw_item_puts_P(LCD_STR_ARROW_RIGHT[0], str);
    e5fa:	80 91 59 02 	lds	r24, 0x0259	; 0x800259 <lcd_draw_update>
    e5fe:	88 23       	and	r24, r24
    e600:	19 f0       	breq	.+6      	; 0xe608 <menu_item_submenu_P(char const*, void (*)())+0x22>
    e602:	8e e7       	ldi	r24, 0x7E	; 126
    e604:	0e 94 86 72 	call	0xe50c	; 0xe50c <menu_draw_item_puts_P(char, char const*)>
		if (menu_clicked && (lcd_encoder == menu_item))
    e608:	80 91 61 04 	lds	r24, 0x0461	; 0x800461 <menu_clicked>
    e60c:	88 23       	and	r24, r24
    e60e:	89 f0       	breq	.+34     	; 0xe632 <menu_item_submenu_P(char const*, void (*)())+0x4c>
    e610:	20 91 63 04 	lds	r18, 0x0463	; 0x800463 <menu_item>
    e614:	80 91 1e 06 	lds	r24, 0x061E	; 0x80061e <lcd_encoder>
    e618:	90 91 1f 06 	lds	r25, 0x061F	; 0x80061f <lcd_encoder+0x1>
    e61c:	28 17       	cp	r18, r24
    e61e:	19 06       	cpc	r1, r25
    e620:	41 f4       	brne	.+16     	; 0xe632 <menu_item_submenu_P(char const*, void (*)())+0x4c>
		{
			menu_submenu(submenu);
    e622:	60 e0       	ldi	r22, 0x00	; 0
    e624:	ce 01       	movw	r24, r28
    e626:	0e 94 dd 62 	call	0xc5ba	; 0xc5ba <menu_submenu(void (*)(), bool)>
			menu_item_ret();
			return;
		}
	}
	menu_item++;
}
    e62a:	df 91       	pop	r29
    e62c:	cf 91       	pop	r28
	{
		if (lcd_draw_update) menu_draw_item_puts_P(LCD_STR_ARROW_RIGHT[0], str);
		if (menu_clicked && (lcd_encoder == menu_item))
		{
			menu_submenu(submenu);
			menu_item_ret();
    e62e:	0c 94 73 62 	jmp	0xc4e6	; 0xc4e6 <menu_item_ret()>
			return;
		}
	}
	menu_item++;
    e632:	80 91 63 04 	lds	r24, 0x0463	; 0x800463 <menu_item>
    e636:	8f 5f       	subi	r24, 0xFF	; 255
    e638:	80 93 63 04 	sts	0x0463, r24	; 0x800463 <menu_item>
}
    e63c:	df 91       	pop	r29
    e63e:	cf 91       	pop	r28
    e640:	08 95       	ret

0000e642 <menu_item_text_P(char const*)>:
	menu_item++;
}

uint8_t menu_item_text_P(const char* str)
{
	if (menu_item == menu_line)
    e642:	30 91 63 04 	lds	r19, 0x0463	; 0x800463 <menu_item>
    e646:	20 91 62 04 	lds	r18, 0x0462	; 0x800462 <menu_line>
    e64a:	32 13       	cpse	r19, r18
    e64c:	19 c0       	rjmp	.+50     	; 0xe680 <menu_item_text_P(char const*)+0x3e>
    e64e:	bc 01       	movw	r22, r24
	{
		if (lcd_draw_update) menu_draw_item_puts_P(' ', str);
    e650:	80 91 59 02 	lds	r24, 0x0259	; 0x800259 <lcd_draw_update>
    e654:	88 23       	and	r24, r24
    e656:	19 f0       	breq	.+6      	; 0xe65e <menu_item_text_P(char const*)+0x1c>
    e658:	80 e2       	ldi	r24, 0x20	; 32
    e65a:	0e 94 86 72 	call	0xe50c	; 0xe50c <menu_draw_item_puts_P(char, char const*)>
		if (menu_clicked && (lcd_encoder == menu_item))
    e65e:	80 91 61 04 	lds	r24, 0x0461	; 0x800461 <menu_clicked>
    e662:	88 23       	and	r24, r24
    e664:	69 f0       	breq	.+26     	; 0xe680 <menu_item_text_P(char const*)+0x3e>
    e666:	20 91 63 04 	lds	r18, 0x0463	; 0x800463 <menu_item>
    e66a:	80 91 1e 06 	lds	r24, 0x061E	; 0x80061e <lcd_encoder>
    e66e:	90 91 1f 06 	lds	r25, 0x061F	; 0x80061f <lcd_encoder+0x1>
    e672:	28 17       	cp	r18, r24
    e674:	19 06       	cpc	r1, r25
    e676:	21 f4       	brne	.+8      	; 0xe680 <menu_item_text_P(char const*)+0x3e>
		{
			menu_item_ret();
    e678:	0e 94 73 62 	call	0xc4e6	; 0xc4e6 <menu_item_ret()>
			return 1;
    e67c:	81 e0       	ldi	r24, 0x01	; 1
    e67e:	08 95       	ret
		}
	}
	menu_item++;
    e680:	80 91 63 04 	lds	r24, 0x0463	; 0x800463 <menu_item>
    e684:	8f 5f       	subi	r24, 0xFF	; 255
    e686:	80 93 63 04 	sts	0x0463, r24	; 0x800463 <menu_item>
	return 0;
    e68a:	80 e0       	ldi	r24, 0x00	; 0
}
    e68c:	08 95       	ret

0000e68e <lcd_print_pad(char const*, unsigned char)>:
{
	while (*s) lcd_write(*(s++));
}

uint8_t lcd_print_pad(const char* s, uint8_t len)
{
    e68e:	0f 93       	push	r16
    e690:	1f 93       	push	r17
    e692:	cf 93       	push	r28
    e694:	8c 01       	movw	r16, r24
    e696:	c6 2f       	mov	r28, r22
    while (len && *s) {
    e698:	cc 23       	and	r28, r28
    e69a:	49 f0       	breq	.+18     	; 0xe6ae <lcd_print_pad(char const*, unsigned char)+0x20>
    e69c:	f8 01       	movw	r30, r16
    e69e:	81 91       	ld	r24, Z+
    e6a0:	8f 01       	movw	r16, r30
    e6a2:	88 23       	and	r24, r24
    e6a4:	21 f0       	breq	.+8      	; 0xe6ae <lcd_print_pad(char const*, unsigned char)+0x20>
        lcd_write(*(s++));
    e6a6:	0e 94 a2 70 	call	0xe144	; 0xe144 <lcd_write(unsigned char) [clone .lto_priv.402]>
        --len;
    e6aa:	c1 50       	subi	r28, 0x01	; 1
    e6ac:	f5 cf       	rjmp	.-22     	; 0xe698 <lcd_print_pad(char const*, unsigned char)+0xa>
    }
    lcd_space(len);
    e6ae:	8c 2f       	mov	r24, r28
    e6b0:	0e 94 28 6f 	call	0xde50	; 0xde50 <lcd_space(unsigned char)>
    return len;
}
    e6b4:	8c 2f       	mov	r24, r28
    e6b6:	cf 91       	pop	r28
    e6b8:	1f 91       	pop	r17
    e6ba:	0f 91       	pop	r16
    e6bc:	08 95       	ret

0000e6be <lcd_print(char const*)>:
	while (n--) lcd_putc(' ');
}


void lcd_print(const char* s)
{
    e6be:	cf 93       	push	r28
    e6c0:	df 93       	push	r29
    e6c2:	ec 01       	movw	r28, r24
	while (*s) lcd_write(*(s++));
    e6c4:	89 91       	ld	r24, Y+
    e6c6:	88 23       	and	r24, r24
    e6c8:	19 f0       	breq	.+6      	; 0xe6d0 <lcd_print(char const*)+0x12>
    e6ca:	0e 94 a2 70 	call	0xe144	; 0xe144 <lcd_write(unsigned char) [clone .lto_priv.402]>
    e6ce:	fa cf       	rjmp	.-12     	; 0xe6c4 <lcd_print(char const*)+0x6>
}
    e6d0:	df 91       	pop	r29
    e6d2:	cf 91       	pop	r28
    e6d4:	08 95       	ret

0000e6d6 <lcd_putchar(char, __file*) [clone .lto_priv.388]>:
	lcd_command(LCD_ENTRYMODESET | lcd_displaymode);
}

static int lcd_putchar(char c, FILE *)
{
	lcd_write(c);
    e6d6:	0e 94 a2 70 	call	0xe144	; 0xe144 <lcd_write(unsigned char) [clone .lto_priv.402]>
	return 0;
}
    e6da:	90 e0       	ldi	r25, 0x00	; 0
    e6dc:	80 e0       	ldi	r24, 0x00	; 0
    e6de:	08 95       	ret

0000e6e0 <lcd_consume_click()>:
extern void lcd_frame_start();

//! @brief Consume click and longpress event
inline void lcd_consume_click()
{
    lcd_click_trigger = 0;
    e6e0:	10 92 95 03 	sts	0x0395, r1	; 0x800395 <lcd_click_trigger>
    lcd_longpress_trigger = 0;
    e6e4:	10 92 a7 05 	sts	0x05A7, r1	; 0x8005a7 <lcd_longpress_trigger>
}
    e6e8:	08 95       	ret

0000e6ea <lcd_clicked()>:
//! Generally is used in modal dialogs.
//!
//! @retval 0 not clicked
//! @retval nonzero clicked
uint8_t lcd_clicked(void)
{
    e6ea:	cf 93       	push	r28
	bool clicked = LCD_CLICKED;
    e6ec:	80 91 95 03 	lds	r24, 0x0395	; 0x800395 <lcd_click_trigger>
    e6f0:	c1 e0       	ldi	r28, 0x01	; 1
    e6f2:	81 11       	cpse	r24, r1
    e6f4:	04 c0       	rjmp	.+8      	; 0xe6fe <lcd_clicked()+0x14>
    e6f6:	c0 e0       	ldi	r28, 0x00	; 0
	if(clicked)
	{
	    lcd_consume_click();
	}
    return clicked;
}
    e6f8:	8c 2f       	mov	r24, r28
    e6fa:	cf 91       	pop	r28
    e6fc:	08 95       	ret
uint8_t lcd_clicked(void)
{
	bool clicked = LCD_CLICKED;
	if(clicked)
	{
	    lcd_consume_click();
    e6fe:	0e 94 70 73 	call	0xe6e0	; 0xe6e0 <lcd_consume_click()>
    e702:	fa cf       	rjmp	.-12     	; 0xe6f8 <lcd_clicked()+0xe>

0000e704 <_menu_edit_P()>:
}

static void _menu_edit_P()
{
	menu_data_edit_t* _md = (menu_data_edit_t*)&(menu_data[0]);
	if (lcd_draw_update)
    e704:	80 91 59 02 	lds	r24, 0x0259	; 0x800259 <lcd_draw_update>
    e708:	88 23       	and	r24, r24
    e70a:	09 f4       	brne	.+2      	; 0xe70e <_menu_edit_P()+0xa>
    e70c:	52 c0       	rjmp	.+164    	; 0xe7b2 <_menu_edit_P()+0xae>
	{
        // handle initial value jumping
        if (_md->minJumpValue && lcd_encoder) {
    e70e:	20 91 a1 03 	lds	r18, 0x03A1	; 0x8003a1 <menu_data+0xb>
    e712:	30 91 a2 03 	lds	r19, 0x03A2	; 0x8003a2 <menu_data+0xc>
    e716:	80 91 9d 03 	lds	r24, 0x039D	; 0x80039d <menu_data+0x7>
    e71a:	90 91 9e 03 	lds	r25, 0x039E	; 0x80039e <menu_data+0x8>
    e71e:	21 15       	cp	r18, r1
    e720:	31 05       	cpc	r19, r1
    e722:	d9 f0       	breq	.+54     	; 0xe75a <_menu_edit_P()+0x56>
    e724:	40 91 1e 06 	lds	r20, 0x061E	; 0x80061e <lcd_encoder>
    e728:	50 91 1f 06 	lds	r21, 0x061F	; 0x80061f <lcd_encoder+0x1>
    e72c:	41 15       	cp	r20, r1
    e72e:	51 05       	cpc	r21, r1
    e730:	a1 f0       	breq	.+40     	; 0xe75a <_menu_edit_P()+0x56>
            if (lcd_encoder > 0 && _md->currentValue == _md->minEditValue) {
    e732:	7c f0       	brlt	.+30     	; 0xe752 <_menu_edit_P()+0x4e>
    e734:	40 91 9b 03 	lds	r20, 0x039B	; 0x80039b <menu_data+0x5>
    e738:	50 91 9c 03 	lds	r21, 0x039C	; 0x80039c <menu_data+0x6>
    e73c:	48 17       	cp	r20, r24
    e73e:	59 07       	cpc	r21, r25
    e740:	41 f4       	brne	.+16     	; 0xe752 <_menu_edit_P()+0x4e>
                _md->currentValue = _md->minJumpValue;
    e742:	30 93 9c 03 	sts	0x039C, r19	; 0x80039c <menu_data+0x6>
    e746:	20 93 9b 03 	sts	0x039B, r18	; 0x80039b <menu_data+0x5>
                lcd_encoder = 0;
    e74a:	10 92 1f 06 	sts	0x061F, r1	; 0x80061f <lcd_encoder+0x1>
    e74e:	10 92 1e 06 	sts	0x061E, r1	; 0x80061e <lcd_encoder>
            }
            // disable after first use and/or if the initial value is not minEditValue
            _md->minJumpValue = 0;
    e752:	10 92 a2 03 	sts	0x03A2, r1	; 0x8003a2 <menu_data+0xc>
    e756:	10 92 a1 03 	sts	0x03A1, r1	; 0x8003a1 <menu_data+0xb>
        }
		_md->currentValue += lcd_encoder;
    e75a:	20 91 9b 03 	lds	r18, 0x039B	; 0x80039b <menu_data+0x5>
    e75e:	30 91 9c 03 	lds	r19, 0x039C	; 0x80039c <menu_data+0x6>
    e762:	40 91 1e 06 	lds	r20, 0x061E	; 0x80061e <lcd_encoder>
    e766:	50 91 1f 06 	lds	r21, 0x061F	; 0x80061f <lcd_encoder+0x1>
    e76a:	24 0f       	add	r18, r20
    e76c:	35 1f       	adc	r19, r21
		lcd_encoder = 0; // Consume knob rotation event
    e76e:	10 92 1f 06 	sts	0x061F, r1	; 0x80061f <lcd_encoder+0x1>
    e772:	10 92 1e 06 	sts	0x061E, r1	; 0x80061e <lcd_encoder>
		// Constrain the value in case it's outside the allowed limits
		_md->currentValue = constrain(_md->currentValue, _md->minEditValue, _md->maxEditValue);
    e776:	28 17       	cp	r18, r24
    e778:	39 07       	cpc	r19, r25
    e77a:	44 f0       	brlt	.+16     	; 0xe78c <_menu_edit_P()+0x88>
    e77c:	80 91 9f 03 	lds	r24, 0x039F	; 0x80039f <menu_data+0x9>
    e780:	90 91 a0 03 	lds	r25, 0x03A0	; 0x8003a0 <menu_data+0xa>
    e784:	28 17       	cp	r18, r24
    e786:	39 07       	cpc	r19, r25
    e788:	0c f4       	brge	.+2      	; 0xe78c <_menu_edit_P()+0x88>
    e78a:	c9 01       	movw	r24, r18
    e78c:	90 93 9c 03 	sts	0x039C, r25	; 0x80039c <menu_data+0x6>
    e790:	80 93 9b 03 	sts	0x039B, r24	; 0x80039b <menu_data+0x5>
		lcd_set_cursor(0, 1);
    e794:	61 e0       	ldi	r22, 0x01	; 1
    e796:	80 e0       	ldi	r24, 0x00	; 0
    e798:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
		menu_draw_P(' ', _md->editLabel, _md->currentValue);
    e79c:	40 91 9b 03 	lds	r20, 0x039B	; 0x80039b <menu_data+0x5>
    e7a0:	50 91 9c 03 	lds	r21, 0x039C	; 0x80039c <menu_data+0x6>
    e7a4:	60 91 96 03 	lds	r22, 0x0396	; 0x800396 <menu_data>
    e7a8:	70 91 97 03 	lds	r23, 0x0397	; 0x800397 <menu_data+0x1>
    e7ac:	80 e2       	ldi	r24, 0x20	; 32
    e7ae:	0e 94 32 6f 	call	0xde64	; 0xde64 <menu_draw_P(char, char const*, int)>
	}
	if (lcd_clicked())
    e7b2:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
    e7b6:	88 23       	and	r24, r24
    e7b8:	41 f1       	breq	.+80     	; 0xe80a <_menu_edit_P()+0x106>
    e7ba:	e0 91 99 03 	lds	r30, 0x0399	; 0x800399 <menu_data+0x3>
    e7be:	f0 91 9a 03 	lds	r31, 0x039A	; 0x80039a <menu_data+0x4>
    e7c2:	80 91 9b 03 	lds	r24, 0x039B	; 0x80039b <menu_data+0x5>
    e7c6:	90 91 9c 03 	lds	r25, 0x039C	; 0x80039c <menu_data+0x6>
	{
        if (_md->editValueBits == 8)
    e7ca:	20 91 98 03 	lds	r18, 0x0398	; 0x800398 <menu_data+0x2>
            *((uint8_t*)(_md->editValuePtr)) = _md->currentValue;
    e7ce:	80 83       	st	Z, r24
		lcd_set_cursor(0, 1);
		menu_draw_P(' ', _md->editLabel, _md->currentValue);
	}
	if (lcd_clicked())
	{
        if (_md->editValueBits == 8)
    e7d0:	28 30       	cpi	r18, 0x08	; 8
    e7d2:	c9 f4       	brne	.+50     	; 0xe806 <_menu_edit_P()+0x102>
menu_back(1);
}

void menu_back_no_reset(void)
{
	if (menu_depth > 0)
    e7d4:	80 91 df 03 	lds	r24, 0x03DF	; 0x8003df <menu_depth>
    e7d8:	88 23       	and	r24, r24
    e7da:	b9 f0       	breq	.+46     	; 0xe80a <_menu_edit_P()+0x106>
	{
		menu_depth--;
    e7dc:	81 50       	subi	r24, 0x01	; 1
    e7de:	80 93 df 03 	sts	0x03DF, r24	; 0x8003df <menu_depth>
		menu_goto(menu_stack[menu_depth].menu, menu_stack[menu_depth].position, false);
    e7e2:	90 e0       	ldi	r25, 0x00	; 0
    e7e4:	fc 01       	movw	r30, r24
    e7e6:	ee 0f       	add	r30, r30
    e7e8:	ff 1f       	adc	r31, r31
    e7ea:	e8 0f       	add	r30, r24
    e7ec:	f9 1f       	adc	r31, r25
    e7ee:	e9 5a       	subi	r30, 0xA9	; 169
    e7f0:	fc 4f       	sbci	r31, 0xFC	; 252
    e7f2:	62 81       	ldd	r22, Z+2	; 0x02
    e7f4:	06 2e       	mov	r0, r22
    e7f6:	00 0c       	add	r0, r0
    e7f8:	77 0b       	sbc	r23, r23
    e7fa:	20 e0       	ldi	r18, 0x00	; 0
    e7fc:	40 e0       	ldi	r20, 0x00	; 0
    e7fe:	80 81       	ld	r24, Z
    e800:	91 81       	ldd	r25, Z+1	; 0x01
    e802:	0c 94 b7 62 	jmp	0xc56e	; 0xc56e <menu_goto(void (*)(), int, bool, bool)>
	if (lcd_clicked())
	{
        if (_md->editValueBits == 8)
            *((uint8_t*)(_md->editValuePtr)) = _md->currentValue;
        else
            *((int16_t*)(_md->editValuePtr)) = _md->currentValue;
    e806:	91 83       	std	Z+1, r25	; 0x01
    e808:	e5 cf       	rjmp	.-54     	; 0xe7d4 <_menu_edit_P()+0xd0>
		menu_back_no_reset();
	}
}
    e80a:	08 95       	ret

0000e80c <menu_back_if_clicked()>:
	}
}

void menu_back_if_clicked(void)
{
	if (lcd_clicked())
    e80c:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
    e810:	81 11       	cpse	r24, r1
		menu_back();
    e812:	0c 94 1b 63 	jmp	0xc636	; 0xc636 <menu_back()>
}
    e816:	08 95       	ret

0000e818 <menu_start()>:
		CRITICAL_SECTION_END;
}

void menu_start(void)
{
    if (lcd_encoder < 0)
    e818:	80 91 1e 06 	lds	r24, 0x061E	; 0x80061e <lcd_encoder>
    e81c:	90 91 1f 06 	lds	r25, 0x061F	; 0x80061f <lcd_encoder+0x1>
    e820:	97 ff       	sbrs	r25, 7
    e822:	07 c0       	rjmp	.+14     	; 0xe832 <menu_start()+0x1a>
    {
        lcd_encoder = 0;
    e824:	10 92 1f 06 	sts	0x061F, r1	; 0x80061f <lcd_encoder+0x1>
    e828:	10 92 1e 06 	sts	0x061E, r1	; 0x80061e <lcd_encoder>
		Sound_MakeSound(e_SOUND_TYPE_BlindAlert);
    e82c:	87 e0       	ldi	r24, 0x07	; 7
    e82e:	0f 94 ad 25 	call	0x24b5a	; 0x24b5a <Sound_MakeSound(eSOUND_TYPE)>
    }
    if (lcd_encoder < menu_top)
    e832:	80 91 1e 06 	lds	r24, 0x061E	; 0x80061e <lcd_encoder>
    e836:	90 91 1f 06 	lds	r25, 0x061F	; 0x80061f <lcd_encoder+0x1>
    e83a:	20 91 92 03 	lds	r18, 0x0392	; 0x800392 <menu_top>
    e83e:	28 17       	cp	r18, r24
    e840:	19 06       	cpc	r1, r25
    e842:	19 f0       	breq	.+6      	; 0xe84a <menu_start()+0x32>
    e844:	14 f0       	brlt	.+4      	; 0xe84a <menu_start()+0x32>
		menu_top = lcd_encoder;
    e846:	80 93 92 03 	sts	0x0392, r24	; 0x800392 <menu_top>
    menu_line = menu_top;
    e84a:	80 91 92 03 	lds	r24, 0x0392	; 0x800392 <menu_top>
    e84e:	80 93 62 04 	sts	0x0462, r24	; 0x800462 <menu_line>
    menu_clicked = lcd_clicked(); // Consume click event
    e852:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
    e856:	80 93 61 04 	sts	0x0461, r24	; 0x800461 <menu_clicked>
}
    e85a:	08 95       	ret

0000e85c <lang_is_selected>:
	eeprom_update_byte((unsigned char*)EEPROM_LANG, LANG_ID_FORCE_SELECTION);
}

uint8_t lang_is_selected(void)
{
	uint8_t lang_eeprom = eeprom_read_byte((unsigned char*)EEPROM_LANG);
    e85c:	8e ef       	ldi	r24, 0xFE	; 254
    e85e:	9f e0       	ldi	r25, 0x0F	; 15
    e860:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
	return (lang_eeprom != LANG_ID_FORCE_SELECTION) && (lang_eeprom == lang_selected);
    e864:	8e 3f       	cpi	r24, 0xFE	; 254
    e866:	39 f0       	breq	.+14     	; 0xe876 <lang_is_selected+0x1a>
    e868:	91 e0       	ldi	r25, 0x01	; 1
    e86a:	20 91 2d 03 	lds	r18, 0x032D	; 0x80032d <lang_selected>
    e86e:	28 13       	cpse	r18, r24
    e870:	90 e0       	ldi	r25, 0x00	; 0
    e872:	89 2f       	mov	r24, r25
    e874:	08 95       	ret
    e876:	80 e0       	ldi	r24, 0x00	; 0
}
    e878:	08 95       	ret

0000e87a <lang_reset>:
	return _n("??");
}

void lang_reset(void)
{
	lang_selected = 0;
    e87a:	10 92 2d 03 	sts	0x032D, r1	; 0x80032d <lang_selected>
	eeprom_update_byte((unsigned char*)EEPROM_LANG, LANG_ID_FORCE_SELECTION);
    e87e:	6e ef       	ldi	r22, 0xFE	; 254
    e880:	8e ef       	ldi	r24, 0xFE	; 254
    e882:	9f e0       	ldi	r25, 0x0F	; 15
    e884:	0d 94 04 a4 	jmp	0x34808	; 0x34808 <eeprom_update_byte>

0000e888 <lang_get_name_by_code>:
	return LANG_CODE_XX;
}

const char* lang_get_name_by_code(uint16_t code)
{
	switch (code)
    e888:	85 37       	cpi	r24, 0x75	; 117
    e88a:	28 e6       	ldi	r18, 0x68	; 104
    e88c:	92 07       	cpc	r25, r18
    e88e:	09 f4       	brne	.+2      	; 0xe892 <lang_get_name_by_code+0xa>
    e890:	59 c0       	rjmp	.+178    	; 0xe944 <lang_get_name_by_code+0xbc>
    e892:	f8 f4       	brcc	.+62     	; 0xe8d2 <lang_get_name_by_code+0x4a>
    e894:	8e 36       	cpi	r24, 0x6E	; 110
    e896:	25 e6       	ldi	r18, 0x65	; 101
    e898:	92 07       	cpc	r25, r18
    e89a:	09 f4       	brne	.+2      	; 0xe89e <lang_get_name_by_code+0x16>
    e89c:	59 c0       	rjmp	.+178    	; 0xe950 <lang_get_name_by_code+0xc8>
    e89e:	50 f4       	brcc	.+20     	; 0xe8b4 <lang_get_name_by_code+0x2c>
    e8a0:	83 37       	cpi	r24, 0x73	; 115
    e8a2:	23 e6       	ldi	r18, 0x63	; 99
    e8a4:	92 07       	cpc	r25, r18
    e8a6:	b1 f1       	breq	.+108    	; 0xe914 <lang_get_name_by_code+0x8c>
    e8a8:	85 36       	cpi	r24, 0x65	; 101
    e8aa:	94 46       	sbci	r25, 0x64	; 100
    e8ac:	b1 f1       	breq	.+108    	; 0xe91a <lang_get_name_by_code+0x92>
//#ifdef COMMUNITY_LANG_GROUP1_QR
//	case LANG_CODE_QR: return _n("New language"); //community contribution
//#endif // COMMUNITY_LANG_GROUP1_QR
#endif // COMMUNITY_LANGUAGE_SUPPORT
	}
	return _n("??");
    e8ae:	82 ea       	ldi	r24, 0xA2	; 162
    e8b0:	93 e6       	ldi	r25, 0x63	; 99
    e8b2:	08 95       	ret
	return LANG_CODE_XX;
}

const char* lang_get_name_by_code(uint16_t code)
{
	switch (code)
    e8b4:	82 37       	cpi	r24, 0x72	; 114
    e8b6:	26 e6       	ldi	r18, 0x66	; 102
    e8b8:	92 07       	cpc	r25, r18
    e8ba:	91 f1       	breq	.+100    	; 0xe920 <lang_get_name_by_code+0x98>
    e8bc:	82 37       	cpi	r24, 0x72	; 114
    e8be:	28 e6       	ldi	r18, 0x68	; 104
    e8c0:	92 07       	cpc	r25, r18
    e8c2:	09 f4       	brne	.+2      	; 0xe8c6 <lang_get_name_by_code+0x3e>
    e8c4:	42 c0       	rjmp	.+132    	; 0xe94a <lang_get_name_by_code+0xc2>
    e8c6:	83 37       	cpi	r24, 0x73	; 115
    e8c8:	95 46       	sbci	r25, 0x65	; 101
    e8ca:	89 f7       	brne	.-30     	; 0xe8ae <lang_get_name_by_code+0x26>
	{
	case LANG_CODE_EN: return _n("English");
	case LANG_CODE_CZ: return _n("Cestina");
	case LANG_CODE_DE: return _n("Deutsch");
	case LANG_CODE_ES: return _n("Espanol");
    e8cc:	89 ef       	ldi	r24, 0xF9	; 249
    e8ce:	93 e6       	ldi	r25, 0x63	; 99
    e8d0:	08 95       	ret
	return LANG_CODE_XX;
}

const char* lang_get_name_by_code(uint16_t code)
{
	switch (code)
    e8d2:	8c 36       	cpi	r24, 0x6C	; 108
    e8d4:	20 e7       	ldi	r18, 0x70	; 112
    e8d6:	92 07       	cpc	r25, r18
    e8d8:	31 f1       	breq	.+76     	; 0xe926 <lang_get_name_by_code+0x9e>
    e8da:	70 f4       	brcc	.+28     	; 0xe8f8 <lang_get_name_by_code+0x70>
    e8dc:	8c 36       	cpi	r24, 0x6C	; 108
    e8de:	2e e6       	ldi	r18, 0x6E	; 110
    e8e0:	92 07       	cpc	r25, r18
    e8e2:	21 f1       	breq	.+72     	; 0xe92c <lang_get_name_by_code+0xa4>
    e8e4:	8f 36       	cpi	r24, 0x6F	; 111
    e8e6:	2e e6       	ldi	r18, 0x6E	; 110
    e8e8:	92 07       	cpc	r25, r18
    e8ea:	31 f1       	breq	.+76     	; 0xe938 <lang_get_name_by_code+0xb0>
    e8ec:	84 37       	cpi	r24, 0x74	; 116
    e8ee:	99 46       	sbci	r25, 0x69	; 105
    e8f0:	f1 f6       	brne	.-68     	; 0xe8ae <lang_get_name_by_code+0x26>
	case LANG_CODE_EN: return _n("English");
	case LANG_CODE_CZ: return _n("Cestina");
	case LANG_CODE_DE: return _n("Deutsch");
	case LANG_CODE_ES: return _n("Espanol");
	case LANG_CODE_FR: return _n("Francais");
	case LANG_CODE_IT: return _n("Italiano");
    e8f2:	87 ee       	ldi	r24, 0xE7	; 231
    e8f4:	93 e6       	ldi	r25, 0x63	; 99
    e8f6:	08 95       	ret
	return LANG_CODE_XX;
}

const char* lang_get_name_by_code(uint16_t code)
{
	switch (code)
    e8f8:	8b 36       	cpi	r24, 0x6B	; 107
    e8fa:	23 e7       	ldi	r18, 0x73	; 115
    e8fc:	92 07       	cpc	r25, r18
    e8fe:	f9 f0       	breq	.+62     	; 0xe93e <lang_get_name_by_code+0xb6>
    e900:	86 37       	cpi	r24, 0x76	; 118
    e902:	23 e7       	ldi	r18, 0x73	; 115
    e904:	92 07       	cpc	r25, r18
    e906:	a9 f0       	breq	.+42     	; 0xe932 <lang_get_name_by_code+0xaa>
    e908:	8f 36       	cpi	r24, 0x6F	; 111
    e90a:	92 47       	sbci	r25, 0x72	; 114
    e90c:	81 f6       	brne	.-96     	; 0xe8ae <lang_get_name_by_code+0x26>
#endif // COMMUNITY_LANG_GROUP1_HR
#ifdef COMMUNITY_LANG_GROUP2_LT
	case LANG_CODE_LT: return _n("Lietuviu"); //community Lithuanian contribution
#endif // COMMUNITY_LANG_GROUP2_LT
#ifdef COMMUNITY_LANG_GROUP1_RO
	case LANG_CODE_RO: return _n("Romana"); //community Romanian contribution
    e90e:	85 ea       	ldi	r24, 0xA5	; 165
    e910:	93 e6       	ldi	r25, 0x63	; 99
    e912:	08 95       	ret
const char* lang_get_name_by_code(uint16_t code)
{
	switch (code)
	{
	case LANG_CODE_EN: return _n("English");
	case LANG_CODE_CZ: return _n("Cestina");
    e914:	89 e0       	ldi	r24, 0x09	; 9
    e916:	94 e6       	ldi	r25, 0x64	; 100
    e918:	08 95       	ret
	case LANG_CODE_DE: return _n("Deutsch");
    e91a:	81 e0       	ldi	r24, 0x01	; 1
    e91c:	94 e6       	ldi	r25, 0x64	; 100
    e91e:	08 95       	ret
	case LANG_CODE_ES: return _n("Espanol");
	case LANG_CODE_FR: return _n("Francais");
    e920:	80 ef       	ldi	r24, 0xF0	; 240
    e922:	93 e6       	ldi	r25, 0x63	; 99
    e924:	08 95       	ret
	case LANG_CODE_IT: return _n("Italiano");
	case LANG_CODE_PL: return _n("Polski");
    e926:	80 ee       	ldi	r24, 0xE0	; 224
    e928:	93 e6       	ldi	r25, 0x63	; 99
    e92a:	08 95       	ret
#ifdef COMMUNITY_LANGUAGE_SUPPORT //Community language support
#ifdef COMMUNITY_LANG_GROUP1_NL
	case LANG_CODE_NL: return _n("Nederlands"); //community Dutch contribution
    e92c:	85 ed       	ldi	r24, 0xD5	; 213
    e92e:	93 e6       	ldi	r25, 0x63	; 99
    e930:	08 95       	ret
#endif // COMMUNITY_LANG_GROUP1_NL
#ifdef COMMUNITY_LANG_GROUP1_SV
	case LANG_CODE_SV: return _n("Svenska"); //community Swedish contribution
    e932:	8d ec       	ldi	r24, 0xCD	; 205
    e934:	93 e6       	ldi	r25, 0x63	; 99
    e936:	08 95       	ret
#endif // COMMUNITY_LANG_GROUP1_SV
#ifdef COMMUNITY_LANG_GROUP1_NO
	case LANG_CODE_NO: return _n("Norsk"); //community Swedish contribution
    e938:	87 ec       	ldi	r24, 0xC7	; 199
    e93a:	93 e6       	ldi	r25, 0x63	; 99
    e93c:	08 95       	ret
#endif // COMMUNITY_LANG_GROUP1_NO
#ifdef COMMUNITY_LANG_GROUP1_DA
	case LANG_CODE_DA: return _n("Dansk"); //community Danish contribution
#endif // COMMUNITY_LANG_GROUP1_DA
#ifdef COMMUNITY_LANG_GROUP1_SK
	case LANG_CODE_SK: return _n("Slovencina"); //community Slovak contribution
    e93e:	8c eb       	ldi	r24, 0xBC	; 188
    e940:	93 e6       	ldi	r25, 0x63	; 99
    e942:	08 95       	ret
#endif // COMMUNITY_LANG_GROUP1_SK
#ifdef COMMUNITY_LANG_GROUP1_SL
	case LANG_CODE_SL: return _n("Slovenscina"); //community Slovanian contribution
#endif // COMMUNITY_LANG_GROUP1_SL
#ifdef COMMUNITY_LANG_GROUP1_HU
	case LANG_CODE_HU: return _n("Magyar"); //community Hungarian contribution
    e944:	85 eb       	ldi	r24, 0xB5	; 181
    e946:	93 e6       	ldi	r25, 0x63	; 99
    e948:	08 95       	ret
#endif // COMMUNITY_LANG_GROUP1_HU
#ifdef COMMUNITY_LANG_GROUP1_LB
	case LANG_CODE_LB: return _n("Letzebuergesch"); //community Luxembourgish contribution
#endif // COMMUNITY_LANG_GROUP1_LB
#ifdef COMMUNITY_LANG_GROUP1_HR
	case LANG_CODE_HR: return _n("Hrvatski"); //community Croatian contribution
    e94a:	8c ea       	ldi	r24, 0xAC	; 172
    e94c:	93 e6       	ldi	r25, 0x63	; 99
    e94e:	08 95       	ret

const char* lang_get_name_by_code(uint16_t code)
{
	switch (code)
	{
	case LANG_CODE_EN: return _n("English");
    e950:	81 e1       	ldi	r24, 0x11	; 17
    e952:	94 e6       	ldi	r25, 0x64	; 100
//	case LANG_CODE_QR: return _n("New language"); //community contribution
//#endif // COMMUNITY_LANG_GROUP1_QR
#endif // COMMUNITY_LANGUAGE_SUPPORT
	}
	return _n("??");
}
    e954:	08 95       	ret

0000e956 <lang_get_count>:
	return (sum == lt_sum);
}

uint8_t lang_get_count()
{
	if (pgm_read_dword(((uint32_t*)(_PRI_LANG_SIGNATURE))) == 0xffffffff)
    e956:	ed e8       	ldi	r30, 0x8D	; 141
    e958:	f4 e7       	ldi	r31, 0x74	; 116
    e95a:	85 91       	lpm	r24, Z+
    e95c:	95 91       	lpm	r25, Z+
    e95e:	a5 91       	lpm	r26, Z+
    e960:	b4 91       	lpm	r27, Z
    e962:	8f 3f       	cpi	r24, 0xFF	; 255
    e964:	9f 4f       	sbci	r25, 0xFF	; 255
    e966:	af 4f       	sbci	r26, 0xFF	; 255
    e968:	bf 4f       	sbci	r27, 0xFF	; 255
    e96a:	b1 f0       	breq	.+44     	; 0xe998 <lang_get_count+0x42>
		if (header.magic != LANG_MAGIC) break; //break if magic not valid
		addr += header.size; //calc address of next table
		count++; //inc counter
	}
#else //XFLASH
	uint16_t table = _SEC_LANG_TABLE;
    e96c:	20 e0       	ldi	r18, 0x00	; 0
    e96e:	31 e0       	ldi	r19, 0x01	; 1
	uint8_t count = 1; //count = 1 (primary)
    e970:	81 e0       	ldi	r24, 0x01	; 1
	while (pgm_read_dword(((uint32_t*)table)) == LANG_MAGIC) //magic valid
    e972:	f9 01       	movw	r30, r18
    e974:	45 91       	lpm	r20, Z+
    e976:	55 91       	lpm	r21, Z+
    e978:	65 91       	lpm	r22, Z+
    e97a:	74 91       	lpm	r23, Z
    e97c:	45 3a       	cpi	r20, 0xA5	; 165
    e97e:	5a 45       	sbci	r21, 0x5A	; 90
    e980:	64 4b       	sbci	r22, 0xB4	; 180
    e982:	7b 44       	sbci	r23, 0x4B	; 75
    e984:	09 f0       	breq	.+2      	; 0xe988 <lang_get_count+0x32>
    e986:	08 95       	ret
	{
		table += pgm_read_word((uint16_t*)(table + 4));
    e988:	f9 01       	movw	r30, r18
    e98a:	34 96       	adiw	r30, 0x04	; 4
    e98c:	45 91       	lpm	r20, Z+
    e98e:	54 91       	lpm	r21, Z
    e990:	24 0f       	add	r18, r20
    e992:	35 1f       	adc	r19, r21
		count++;
    e994:	8f 5f       	subi	r24, 0xFF	; 255
    e996:	ed cf       	rjmp	.-38     	; 0xe972 <lang_get_count+0x1c>
}

uint8_t lang_get_count()
{
	if (pgm_read_dword(((uint32_t*)(_PRI_LANG_SIGNATURE))) == 0xffffffff)
		return 1; //signature not set - only primary language will be available
    e998:	81 e0       	ldi	r24, 0x01	; 1
		table += pgm_read_word((uint16_t*)(table + 4));
		count++;
	}
#endif //XFLASH
	return count;
}
    e99a:	08 95       	ret

0000e99c <lang_select>:
		return s + 2;//zero length string == not translated, return orig. str.
	return (const char*)((char*)lang_table + ui); //return calculated pointer
}

uint8_t lang_select(uint8_t lang)
{
    e99c:	0f 93       	push	r16
    e99e:	1f 93       	push	r17
	if (lang == LANG_ID_PRI) //primary language
    e9a0:	81 11       	cpse	r24, r1
    e9a2:	13 c0       	rjmp	.+38     	; 0xe9ca <lang_select+0x2e>
	{
		lang_table = 0;
    e9a4:	10 92 2c 03 	sts	0x032C, r1	; 0x80032c <lang_table+0x1>
    e9a8:	10 92 2b 03 	sts	0x032B, r1	; 0x80032b <lang_table>
		lang_selected = lang;
    e9ac:	10 92 2d 03 	sts	0x032D, r1	; 0x80032d <lang_selected>
					lang_selected = lang; // set language id
				}
		}
	}
#endif //XFLASH
	if (lang_selected == lang)
    e9b0:	90 91 2d 03 	lds	r25, 0x032D	; 0x80032d <lang_selected>
    e9b4:	98 13       	cpse	r25, r24
    e9b6:	5c c0       	rjmp	.+184    	; 0xea70 <lang_select+0xd4>
    e9b8:	68 2f       	mov	r22, r24
	{
		eeprom_update_byte((unsigned char*)EEPROM_LANG, lang_selected);
    e9ba:	8e ef       	ldi	r24, 0xFE	; 254
    e9bc:	9f e0       	ldi	r25, 0x0F	; 15
    e9be:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
		return 1;
    e9c2:	81 e0       	ldi	r24, 0x01	; 1
	}
	return 0;
}
    e9c4:	1f 91       	pop	r17
    e9c6:	0f 91       	pop	r16
    e9c8:	08 95       	ret
					lang_selected = lang; // set language id
				}
		}
	}
#else //XFLASH
	if (lang == LANG_ID_SEC)
    e9ca:	81 30       	cpi	r24, 0x01	; 1
    e9cc:	89 f7       	brne	.-30     	; 0xe9b0 <lang_select+0x14>
	{
		uint16_t table = _SEC_LANG_TABLE;
		if (pgm_read_dword(((uint32_t*)table)) == LANG_MAGIC) //magic valid
    e9ce:	e0 e0       	ldi	r30, 0x00	; 0
    e9d0:	f1 e0       	ldi	r31, 0x01	; 1
    e9d2:	45 91       	lpm	r20, Z+
    e9d4:	55 91       	lpm	r21, Z+
    e9d6:	65 91       	lpm	r22, Z+
    e9d8:	74 91       	lpm	r23, Z
    e9da:	45 3a       	cpi	r20, 0xA5	; 165
    e9dc:	5a 45       	sbci	r21, 0x5A	; 90
    e9de:	64 4b       	sbci	r22, 0xB4	; 180
    e9e0:	7b 44       	sbci	r23, 0x4B	; 75
    e9e2:	31 f7       	brne	.-52     	; 0xe9b0 <lang_select+0x14>
}

uint8_t lang_check(uint16_t addr)
{
	uint16_t sum = 0;
	uint16_t size = pgm_read_word((uint16_t*)(addr + 4));
    e9e4:	e4 e0       	ldi	r30, 0x04	; 4
    e9e6:	f1 e0       	ldi	r31, 0x01	; 1
    e9e8:	a5 91       	lpm	r26, Z+
    e9ea:	b4 91       	lpm	r27, Z
	uint16_t lt_sum = pgm_read_word((uint16_t*)(addr + 8));
    e9ec:	e8 e0       	ldi	r30, 0x08	; 8
    e9ee:	f1 e0       	ldi	r31, 0x01	; 1
    e9f0:	65 91       	lpm	r22, Z+
    e9f2:	74 91       	lpm	r23, Z
	uint16_t i; for (i = 0; i < size; i++)
    e9f4:	50 e0       	ldi	r21, 0x00	; 0
    e9f6:	40 e0       	ldi	r20, 0x00	; 0
	return 0;
}

uint8_t lang_check(uint16_t addr)
{
	uint16_t sum = 0;
    e9f8:	30 e0       	ldi	r19, 0x00	; 0
    e9fa:	20 e0       	ldi	r18, 0x00	; 0
	uint16_t size = pgm_read_word((uint16_t*)(addr + 4));
	uint16_t lt_sum = pgm_read_word((uint16_t*)(addr + 8));
	uint16_t i; for (i = 0; i < size; i++)
    e9fc:	a4 17       	cp	r26, r20
    e9fe:	b5 07       	cpc	r27, r21
    ea00:	29 f5       	brne	.+74     	; 0xea4c <lang_select+0xb0>
		sum += (uint16_t)pgm_read_byte((uint8_t*)(addr + i)) << ((i & 1)?0:8);
	sum -= lt_sum; //subtract checksum
    ea02:	26 1b       	sub	r18, r22
    ea04:	37 0b       	sbc	r19, r23
	sum = (sum >> 8) | ((sum & 0xff) << 8); //swap bytes
    ea06:	32 27       	eor	r19, r18
    ea08:	23 27       	eor	r18, r19
    ea0a:	32 27       	eor	r19, r18
	if (lang == LANG_ID_SEC)
	{
		uint16_t table = _SEC_LANG_TABLE;
		if (pgm_read_dword(((uint32_t*)table)) == LANG_MAGIC) //magic valid
		{
			if (lang_check(table))
    ea0c:	62 17       	cp	r22, r18
    ea0e:	73 07       	cpc	r23, r19
    ea10:	09 f0       	breq	.+2      	; 0xea14 <lang_select+0x78>
    ea12:	ce cf       	rjmp	.-100    	; 0xe9b0 <lang_select+0x14>
				if (pgm_read_dword(((uint32_t*)(table + 12))) == pgm_read_dword(((uint32_t*)(_PRI_LANG_SIGNATURE)))) //signature valid
    ea14:	ec e0       	ldi	r30, 0x0C	; 12
    ea16:	f1 e0       	ldi	r31, 0x01	; 1
    ea18:	05 91       	lpm	r16, Z+
    ea1a:	15 91       	lpm	r17, Z+
    ea1c:	25 91       	lpm	r18, Z+
    ea1e:	34 91       	lpm	r19, Z
    ea20:	ed e8       	ldi	r30, 0x8D	; 141
    ea22:	f4 e7       	ldi	r31, 0x74	; 116
    ea24:	45 91       	lpm	r20, Z+
    ea26:	55 91       	lpm	r21, Z+
    ea28:	65 91       	lpm	r22, Z+
    ea2a:	74 91       	lpm	r23, Z
    ea2c:	04 17       	cp	r16, r20
    ea2e:	15 07       	cpc	r17, r21
    ea30:	26 07       	cpc	r18, r22
    ea32:	37 07       	cpc	r19, r23
    ea34:	09 f0       	breq	.+2      	; 0xea38 <lang_select+0x9c>
    ea36:	bc cf       	rjmp	.-136    	; 0xe9b0 <lang_select+0x14>
				{
					lang_table = (lang_table_t*)table; // set table pointer
    ea38:	20 e0       	ldi	r18, 0x00	; 0
    ea3a:	31 e0       	ldi	r19, 0x01	; 1
    ea3c:	30 93 2c 03 	sts	0x032C, r19	; 0x80032c <lang_table+0x1>
    ea40:	20 93 2b 03 	sts	0x032B, r18	; 0x80032b <lang_table>
					lang_selected = lang; // set language id
    ea44:	91 e0       	ldi	r25, 0x01	; 1
    ea46:	90 93 2d 03 	sts	0x032D, r25	; 0x80032d <lang_selected>
    ea4a:	b2 cf       	rjmp	.-156    	; 0xe9b0 <lang_select+0x14>
{
	uint16_t sum = 0;
	uint16_t size = pgm_read_word((uint16_t*)(addr + 4));
	uint16_t lt_sum = pgm_read_word((uint16_t*)(addr + 8));
	uint16_t i; for (i = 0; i < size; i++)
		sum += (uint16_t)pgm_read_byte((uint8_t*)(addr + i)) << ((i & 1)?0:8);
    ea4c:	fa 01       	movw	r30, r20
    ea4e:	e0 50       	subi	r30, 0x00	; 0
    ea50:	ff 4f       	sbci	r31, 0xFF	; 255
    ea52:	e4 91       	lpm	r30, Z
    ea54:	f0 e0       	ldi	r31, 0x00	; 0
    ea56:	98 e0       	ldi	r25, 0x08	; 8
    ea58:	40 fd       	sbrc	r20, 0
    ea5a:	90 e0       	ldi	r25, 0x00	; 0
    ea5c:	02 c0       	rjmp	.+4      	; 0xea62 <lang_select+0xc6>
    ea5e:	ee 0f       	add	r30, r30
    ea60:	ff 1f       	adc	r31, r31
    ea62:	9a 95       	dec	r25
    ea64:	e2 f7       	brpl	.-8      	; 0xea5e <lang_select+0xc2>
    ea66:	2e 0f       	add	r18, r30
    ea68:	3f 1f       	adc	r19, r31
uint8_t lang_check(uint16_t addr)
{
	uint16_t sum = 0;
	uint16_t size = pgm_read_word((uint16_t*)(addr + 4));
	uint16_t lt_sum = pgm_read_word((uint16_t*)(addr + 8));
	uint16_t i; for (i = 0; i < size; i++)
    ea6a:	4f 5f       	subi	r20, 0xFF	; 255
    ea6c:	5f 4f       	sbci	r21, 0xFF	; 255
    ea6e:	c6 cf       	rjmp	.-116    	; 0xe9fc <lang_select+0x60>
	if (lang_selected == lang)
	{
		eeprom_update_byte((unsigned char*)EEPROM_LANG, lang_selected);
		return 1;
	}
	return 0;
    ea70:	80 e0       	ldi	r24, 0x00	; 0
    ea72:	a8 cf       	rjmp	.-176    	; 0xe9c4 <lang_select+0x28>

0000ea74 <lang_get_translation>:
//lang_table pointer
lang_table_t* lang_table = 0;

const char* lang_get_translation(const char* s)
{
	if (lang_selected == 0) return s + 2; //primary language selected, return orig. str.
    ea74:	20 91 2d 03 	lds	r18, 0x032D	; 0x80032d <lang_selected>
    ea78:	21 11       	cpse	r18, r1
    ea7a:	04 c0       	rjmp	.+8      	; 0xea84 <lang_get_translation+0x10>
    ea7c:	fc 01       	movw	r30, r24
    ea7e:	32 96       	adiw	r30, 0x02	; 2
	if (ui == 0xffff) return s + 2; //id not assigned, return orig. str.
	ui = pgm_read_word(((uint16_t*)(((char*)lang_table + 16 + ui*2)))); //read relative offset
	if (pgm_read_byte(((uint8_t*)((char*)lang_table + ui))) == 0) //read first character
		return s + 2;//zero length string == not translated, return orig. str.
	return (const char*)((char*)lang_table + ui); //return calculated pointer
}
    ea80:	cf 01       	movw	r24, r30
    ea82:	08 95       	ret
lang_table_t* lang_table = 0;

const char* lang_get_translation(const char* s)
{
	if (lang_selected == 0) return s + 2; //primary language selected, return orig. str.
	if (lang_table == 0) return s + 2; //sec. lang table not found, return orig. str.
    ea84:	40 91 2b 03 	lds	r20, 0x032B	; 0x80032b <lang_table>
    ea88:	50 91 2c 03 	lds	r21, 0x032C	; 0x80032c <lang_table+0x1>
    ea8c:	41 15       	cp	r20, r1
    ea8e:	51 05       	cpc	r21, r1
    ea90:	a9 f3       	breq	.-22     	; 0xea7c <lang_get_translation+0x8>
	uint16_t ui = pgm_read_word(((uint16_t*)s)); //read string id
    ea92:	fc 01       	movw	r30, r24
    ea94:	25 91       	lpm	r18, Z+
    ea96:	34 91       	lpm	r19, Z
	if (ui == 0xffff) return s + 2; //id not assigned, return orig. str.
    ea98:	2f 3f       	cpi	r18, 0xFF	; 255
    ea9a:	32 07       	cpc	r19, r18
    ea9c:	79 f3       	breq	.-34     	; 0xea7c <lang_get_translation+0x8>
	ui = pgm_read_word(((uint16_t*)(((char*)lang_table + 16 + ui*2)))); //read relative offset
    ea9e:	f9 01       	movw	r30, r18
    eaa0:	38 96       	adiw	r30, 0x08	; 8
    eaa2:	ee 0f       	add	r30, r30
    eaa4:	ff 1f       	adc	r31, r31
    eaa6:	e4 0f       	add	r30, r20
    eaa8:	f5 1f       	adc	r31, r21
    eaaa:	25 91       	lpm	r18, Z+
    eaac:	34 91       	lpm	r19, Z
	if (pgm_read_byte(((uint8_t*)((char*)lang_table + ui))) == 0) //read first character
    eaae:	fa 01       	movw	r30, r20
    eab0:	e2 0f       	add	r30, r18
    eab2:	f3 1f       	adc	r31, r19
    eab4:	24 91       	lpm	r18, Z
    eab6:	22 23       	and	r18, r18
    eab8:	09 f3       	breq	.-62     	; 0xea7c <lang_get_translation+0x8>
    eaba:	e2 cf       	rjmp	.-60     	; 0xea80 <lang_get_translation+0xc>

0000eabc <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>:
    }
    menu_item++;
}

void menu_item_toggle_P(const char* str, const char* toggle, menu_func_t func, const uint8_t settings)
{
    eabc:	8f 92       	push	r8
    eabe:	9f 92       	push	r9
    eac0:	af 92       	push	r10
    eac2:	bf 92       	push	r11
    eac4:	cf 92       	push	r12
    eac6:	df 92       	push	r13
    eac8:	ef 92       	push	r14
    eaca:	ff 92       	push	r15
    eacc:	0f 93       	push	r16
    eace:	1f 93       	push	r17
    ead0:	cf 93       	push	r28
    ead2:	df 93       	push	r29
	if (menu_item == menu_line)
    ead4:	e0 91 63 04 	lds	r30, 0x0463	; 0x800463 <menu_item>
    ead8:	30 91 62 04 	lds	r19, 0x0462	; 0x800462 <menu_line>
    eadc:	e3 13       	cpse	r30, r19
    eade:	73 c0       	rjmp	.+230    	; 0xebc6 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0x10a>
    eae0:	c2 2f       	mov	r28, r18
    eae2:	6a 01       	movw	r12, r20
    eae4:	7b 01       	movw	r14, r22
    eae6:	5c 01       	movw	r10, r24
	{
		if (lcd_draw_update) menu_draw_toggle_puts_P(str, toggle, settings | (menu_selection_mark()=='>'));
    eae8:	80 91 59 02 	lds	r24, 0x0259	; 0x800259 <lcd_draw_update>
    eaec:	88 23       	and	r24, r24
    eaee:	a1 f1       	breq	.+104    	; 0xeb58 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0x9c>
    eaf0:	0e 94 66 62 	call	0xc4cc	; 0xc4cc <menu_selection_mark() [clone .lto_priv.401]>
    eaf4:	01 e0       	ldi	r16, 0x01	; 1
    eaf6:	8e 33       	cpi	r24, 0x3E	; 62
    eaf8:	09 f0       	breq	.+2      	; 0xeafc <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0x40>
    eafa:	00 e0       	ldi	r16, 0x00	; 0
    eafc:	0c 2b       	or	r16, r28
{
    //settings:
    //xxxxxcba
    //a = selection mark. If it's set(1), then '>' will be used as the first character on the line. Else leave blank
    //b = toggle string is from progmem
    uint8_t is_progmem = settings & 0x02;
    eafe:	80 2f       	mov	r24, r16
    eb00:	82 70       	andi	r24, 0x02	; 2
    eb02:	88 2e       	mov	r8, r24
    const char eol = (toggle == NULL) ? LCD_STR_ARROW_RIGHT[0] : ' ';
    eb04:	e1 14       	cp	r14, r1
    eb06:	f1 04       	cpc	r15, r1
    eb08:	09 f4       	brne	.+2      	; 0xeb0c <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0x50>
    eb0a:	6f c0       	rjmp	.+222    	; 0xebea <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0x12e>
    eb0c:	e7 01       	movw	r28, r14
    eb0e:	90 e2       	ldi	r25, 0x20	; 32
    eb10:	99 2e       	mov	r9, r25
    if (toggle == NULL) toggle = _T(MSG_NA);
    uint8_t len = 4 + (is_progmem ? strlen_P(toggle) : strlen(toggle));
    eb12:	88 20       	and	r8, r8
    eb14:	09 f4       	brne	.+2      	; 0xeb18 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0x5c>
    eb16:	41 c0       	rjmp	.+130    	; 0xeb9a <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0xde>
    eb18:	ce 01       	movw	r24, r28
    eb1a:	0f 94 9e a1 	call	0x3433c	; 0x3433c <__strlen_P>
    eb1e:	14 e0       	ldi	r17, 0x04	; 4
    eb20:	18 0f       	add	r17, r24
	lcd_putc_at(0, menu_row, (settings & 0x01) ? '>' : ' ');
    eb22:	4e e3       	ldi	r20, 0x3E	; 62
    eb24:	00 ff       	sbrs	r16, 0
    eb26:	40 e2       	ldi	r20, 0x20	; 32
    eb28:	60 91 60 04 	lds	r22, 0x0460	; 0x800460 <menu_row>
    eb2c:	80 e0       	ldi	r24, 0x00	; 0
    eb2e:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
    lcd_print_pad_P(str, LCD_WIDTH - len);
    eb32:	64 e1       	ldi	r22, 0x14	; 20
    eb34:	61 1b       	sub	r22, r17
    eb36:	c5 01       	movw	r24, r10
    eb38:	0e 94 f7 71 	call	0xe3ee	; 0xe3ee <lcd_print_pad_P(char const*, unsigned char)>
    lcd_putc('[');
    eb3c:	8b e5       	ldi	r24, 0x5B	; 91
    eb3e:	0e 94 21 6f 	call	0xde42	; 0xde42 <lcd_putc(char)>
    if (is_progmem)
    {
        lcd_puts_P(toggle);
    eb42:	ce 01       	movw	r24, r28
    if (toggle == NULL) toggle = _T(MSG_NA);
    uint8_t len = 4 + (is_progmem ? strlen_P(toggle) : strlen(toggle));
	lcd_putc_at(0, menu_row, (settings & 0x01) ? '>' : ' ');
    lcd_print_pad_P(str, LCD_WIDTH - len);
    lcd_putc('[');
    if (is_progmem)
    eb44:	88 20       	and	r8, r8
    eb46:	89 f1       	breq	.+98     	; 0xebaa <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0xee>
    {
        lcd_puts_P(toggle);
    eb48:	0e 94 1d 6f 	call	0xde3a	; 0xde3a <lcd_puts_P(char const*)>
    } else {
        lcd_print(toggle);
    }
    lcd_putc(']');
    eb4c:	8d e5       	ldi	r24, 0x5D	; 93
    eb4e:	0e 94 21 6f 	call	0xde42	; 0xde42 <lcd_putc(char)>
    lcd_putc(eol);
    eb52:	89 2d       	mov	r24, r9
    eb54:	0e 94 21 6f 	call	0xde42	; 0xde42 <lcd_putc(char)>
void menu_item_toggle_P(const char* str, const char* toggle, menu_func_t func, const uint8_t settings)
{
	if (menu_item == menu_line)
	{
		if (lcd_draw_update) menu_draw_toggle_puts_P(str, toggle, settings | (menu_selection_mark()=='>'));
		if (menu_clicked && (lcd_encoder == menu_item))
    eb58:	80 91 61 04 	lds	r24, 0x0461	; 0x800461 <menu_clicked>
    eb5c:	88 23       	and	r24, r24
    eb5e:	99 f1       	breq	.+102    	; 0xebc6 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0x10a>
    eb60:	20 91 63 04 	lds	r18, 0x0463	; 0x800463 <menu_item>
    eb64:	80 91 1e 06 	lds	r24, 0x061E	; 0x80061e <lcd_encoder>
    eb68:	90 91 1f 06 	lds	r25, 0x061F	; 0x80061f <lcd_encoder+0x1>
    eb6c:	28 17       	cp	r18, r24
    eb6e:	19 06       	cpc	r1, r25
    eb70:	51 f5       	brne	.+84     	; 0xebc6 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0x10a>
		{
			if (toggle == NULL) // print N/A warning message
    eb72:	ef 28       	or	r14, r15
    eb74:	e9 f4       	brne	.+58     	; 0xebb0 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0xf4>
			{
				menu_submenu(func);
    eb76:	60 e0       	ldi	r22, 0x00	; 0
    eb78:	c6 01       	movw	r24, r12
    eb7a:	0e 94 dd 62 	call	0xc5ba	; 0xc5ba <menu_submenu(void (*)(), bool)>
			menu_item_ret();
			return;
		}
	}
	menu_item++;
}
    eb7e:	df 91       	pop	r29
    eb80:	cf 91       	pop	r28
    eb82:	1f 91       	pop	r17
    eb84:	0f 91       	pop	r16
    eb86:	ff 90       	pop	r15
    eb88:	ef 90       	pop	r14
    eb8a:	df 90       	pop	r13
    eb8c:	cf 90       	pop	r12
    eb8e:	bf 90       	pop	r11
    eb90:	af 90       	pop	r10
    eb92:	9f 90       	pop	r9
    eb94:	8f 90       	pop	r8
			{
				lcd_update_enabled = 0;
				if (func) func();
				lcd_update_enabled = 1;
			}
			menu_item_ret();
    eb96:	0c 94 73 62 	jmp	0xc4e6	; 0xc4e6 <menu_item_ret()>
    //a = selection mark. If it's set(1), then '>' will be used as the first character on the line. Else leave blank
    //b = toggle string is from progmem
    uint8_t is_progmem = settings & 0x02;
    const char eol = (toggle == NULL) ? LCD_STR_ARROW_RIGHT[0] : ' ';
    if (toggle == NULL) toggle = _T(MSG_NA);
    uint8_t len = 4 + (is_progmem ? strlen_P(toggle) : strlen(toggle));
    eb9a:	fe 01       	movw	r30, r28
    eb9c:	01 90       	ld	r0, Z+
    eb9e:	00 20       	and	r0, r0
    eba0:	e9 f7       	brne	.-6      	; 0xeb9c <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0xe0>
    eba2:	ec 1b       	sub	r30, r28
    eba4:	13 e0       	ldi	r17, 0x03	; 3
    eba6:	1e 0f       	add	r17, r30
    eba8:	bc cf       	rjmp	.-136    	; 0xeb22 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0x66>
    lcd_putc('[');
    if (is_progmem)
    {
        lcd_puts_P(toggle);
    } else {
        lcd_print(toggle);
    ebaa:	0e 94 5f 73 	call	0xe6be	; 0xe6be <lcd_print(char const*)>
    ebae:	ce cf       	rjmp	.-100    	; 0xeb4c <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0x90>
			{
				menu_submenu(func);
			}
			else // do the actual toggling
			{
				lcd_update_enabled = 0;
    ebb0:	10 92 5a 02 	sts	0x025A, r1	; 0x80025a <lcd_update_enabled>
				if (func) func();
    ebb4:	c1 14       	cp	r12, r1
    ebb6:	d1 04       	cpc	r13, r1
    ebb8:	11 f0       	breq	.+4      	; 0xebbe <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0x102>
    ebba:	f6 01       	movw	r30, r12
    ebbc:	19 95       	eicall
				lcd_update_enabled = 1;
    ebbe:	81 e0       	ldi	r24, 0x01	; 1
    ebc0:	80 93 5a 02 	sts	0x025A, r24	; 0x80025a <lcd_update_enabled>
    ebc4:	dc cf       	rjmp	.-72     	; 0xeb7e <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0xc2>
			}
			menu_item_ret();
			return;
		}
	}
	menu_item++;
    ebc6:	80 91 63 04 	lds	r24, 0x0463	; 0x800463 <menu_item>
    ebca:	8f 5f       	subi	r24, 0xFF	; 255
    ebcc:	80 93 63 04 	sts	0x0463, r24	; 0x800463 <menu_item>
}
    ebd0:	df 91       	pop	r29
    ebd2:	cf 91       	pop	r28
    ebd4:	1f 91       	pop	r17
    ebd6:	0f 91       	pop	r16
    ebd8:	ff 90       	pop	r15
    ebda:	ef 90       	pop	r14
    ebdc:	df 90       	pop	r13
    ebde:	cf 90       	pop	r12
    ebe0:	bf 90       	pop	r11
    ebe2:	af 90       	pop	r10
    ebe4:	9f 90       	pop	r9
    ebe6:	8f 90       	pop	r8
    ebe8:	08 95       	ret
    //xxxxxcba
    //a = selection mark. If it's set(1), then '>' will be used as the first character on the line. Else leave blank
    //b = toggle string is from progmem
    uint8_t is_progmem = settings & 0x02;
    const char eol = (toggle == NULL) ? LCD_STR_ARROW_RIGHT[0] : ' ';
    if (toggle == NULL) toggle = _T(MSG_NA);
    ebea:	83 e7       	ldi	r24, 0x73	; 115
    ebec:	98 e4       	ldi	r25, 0x48	; 72
    ebee:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
    ebf2:	ec 01       	movw	r28, r24
    //settings:
    //xxxxxcba
    //a = selection mark. If it's set(1), then '>' will be used as the first character on the line. Else leave blank
    //b = toggle string is from progmem
    uint8_t is_progmem = settings & 0x02;
    const char eol = (toggle == NULL) ? LCD_STR_ARROW_RIGHT[0] : ' ';
    ebf4:	8e e7       	ldi	r24, 0x7E	; 126
    ebf6:	98 2e       	mov	r9, r24
    ebf8:	8c cf       	rjmp	.-232    	; 0xeb12 <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)+0x56>

0000ebfa <menu_format_sheet_E(Sheet const&, SheetFormatBuffer&)>:
//! @brief Format sheet name
//!
//! @param[in] sheet_E Sheet in EEPROM
//! @param[out] buffer for formatted output
void menu_format_sheet_E(const Sheet &sheet_E, SheetFormatBuffer &buffer)
{
    ebfa:	0f 93       	push	r16
    ebfc:	1f 93       	push	r17
    ebfe:	cf 93       	push	r28
    ec00:	df 93       	push	r29
    ec02:	8c 01       	movw	r16, r24
    ec04:	eb 01       	movw	r28, r22
    uint_least8_t index = sprintf_P(buffer.c, PSTR("%.10S "), _T(MSG_SHEET));
    ec06:	88 e7       	ldi	r24, 0x78	; 120
    ec08:	9e e4       	ldi	r25, 0x4E	; 78
    ec0a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
    ec0e:	9f 93       	push	r25
    ec10:	8f 93       	push	r24
    ec12:	8c e5       	ldi	r24, 0x5C	; 92
    ec14:	91 e8       	ldi	r25, 0x81	; 129
    ec16:	9f 93       	push	r25
    ec18:	8f 93       	push	r24
    ec1a:	df 93       	push	r29
    ec1c:	cf 93       	push	r28
    ec1e:	0f 94 f7 a2 	call	0x345ee	; 0x345ee <sprintf_P>
    eeprom_read_block(&(buffer.c[index]), sheet_E.name, 7);
    ec22:	c8 0f       	add	r28, r24
    ec24:	d1 1d       	adc	r29, r1
    ec26:	47 e0       	ldi	r20, 0x07	; 7
    ec28:	50 e0       	ldi	r21, 0x00	; 0
    ec2a:	b8 01       	movw	r22, r16
    ec2c:	ce 01       	movw	r24, r28
    ec2e:	0f 94 d0 a3 	call	0x347a0	; 0x347a0 <eeprom_read_block>
    //index += 7;
    buffer.c[index + 7] = '\0';
    ec32:	1f 82       	std	Y+7, r1	; 0x07
    ec34:	0f 90       	pop	r0
    ec36:	0f 90       	pop	r0
    ec38:	0f 90       	pop	r0
    ec3a:	0f 90       	pop	r0
    ec3c:	0f 90       	pop	r0
    ec3e:	0f 90       	pop	r0
}
    ec40:	df 91       	pop	r29
    ec42:	cf 91       	pop	r28
    ec44:	1f 91       	pop	r17
    ec46:	0f 91       	pop	r16
    ec48:	08 95       	ret

0000ec4a <menu_item_submenu_E(Sheet const&, void (*)())>:
	}
	menu_item++;
}

void menu_item_submenu_E(const Sheet &sheet, menu_func_t submenu)
{
    ec4a:	0f 93       	push	r16
    ec4c:	1f 93       	push	r17
    ec4e:	cf 93       	push	r28
    ec50:	df 93       	push	r29
    ec52:	cd b7       	in	r28, 0x3d	; 61
    ec54:	de b7       	in	r29, 0x3e	; 62
    ec56:	63 97       	sbiw	r28, 0x13	; 19
    ec58:	0f b6       	in	r0, 0x3f	; 63
    ec5a:	f8 94       	cli
    ec5c:	de bf       	out	0x3e, r29	; 62
    ec5e:	0f be       	out	0x3f, r0	; 63
    ec60:	cd bf       	out	0x3d, r28	; 61
    if (menu_item == menu_line)
    ec62:	30 91 63 04 	lds	r19, 0x0463	; 0x800463 <menu_item>
    ec66:	20 91 62 04 	lds	r18, 0x0462	; 0x800462 <menu_line>
    ec6a:	32 13       	cpse	r19, r18
    ec6c:	38 c0       	rjmp	.+112    	; 0xecde <menu_item_submenu_E(Sheet const&, void (*)())+0x94>
    ec6e:	8b 01       	movw	r16, r22
    {
        if (lcd_draw_update) menu_draw_item_puts_E(LCD_STR_ARROW_RIGHT[0], sheet);
    ec70:	20 91 59 02 	lds	r18, 0x0259	; 0x800259 <lcd_draw_update>
    ec74:	22 23       	and	r18, r18
    ec76:	a9 f0       	breq	.+42     	; 0xeca2 <menu_item_submenu_E(Sheet const&, void (*)())+0x58>


static void menu_draw_item_puts_E(char type_char, const Sheet &sheet)
{
    SheetFormatBuffer buffer;
    menu_format_sheet_E(sheet, buffer);
    ec78:	be 01       	movw	r22, r28
    ec7a:	6f 5f       	subi	r22, 0xFF	; 255
    ec7c:	7f 4f       	sbci	r23, 0xFF	; 255
    ec7e:	0e 94 fd 75 	call	0xebfa	; 0xebfa <menu_format_sheet_E(Sheet const&, SheetFormatBuffer&)>
    lcd_putc_at(0, menu_row, menu_selection_mark());
    ec82:	0e 94 66 62 	call	0xc4cc	; 0xc4cc <menu_selection_mark() [clone .lto_priv.401]>
    ec86:	48 2f       	mov	r20, r24
    ec88:	60 91 60 04 	lds	r22, 0x0460	; 0x800460 <menu_row>
    ec8c:	80 e0       	ldi	r24, 0x00	; 0
    ec8e:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
    lcd_print_pad(buffer.c, LCD_WIDTH - 2);
    ec92:	62 e1       	ldi	r22, 0x12	; 18
    ec94:	ce 01       	movw	r24, r28
    ec96:	01 96       	adiw	r24, 0x01	; 1
    ec98:	0e 94 47 73 	call	0xe68e	; 0xe68e <lcd_print_pad(char const*, unsigned char)>
    lcd_putc(type_char);
    ec9c:	8e e7       	ldi	r24, 0x7E	; 126
    ec9e:	0e 94 21 6f 	call	0xde42	; 0xde42 <lcd_putc(char)>
void menu_item_submenu_E(const Sheet &sheet, menu_func_t submenu)
{
    if (menu_item == menu_line)
    {
        if (lcd_draw_update) menu_draw_item_puts_E(LCD_STR_ARROW_RIGHT[0], sheet);
        if (menu_clicked && (lcd_encoder == menu_item))
    eca2:	80 91 61 04 	lds	r24, 0x0461	; 0x800461 <menu_clicked>
    eca6:	88 23       	and	r24, r24
    eca8:	d1 f0       	breq	.+52     	; 0xecde <menu_item_submenu_E(Sheet const&, void (*)())+0x94>
    ecaa:	20 91 63 04 	lds	r18, 0x0463	; 0x800463 <menu_item>
    ecae:	80 91 1e 06 	lds	r24, 0x061E	; 0x80061e <lcd_encoder>
    ecb2:	90 91 1f 06 	lds	r25, 0x061F	; 0x80061f <lcd_encoder+0x1>
    ecb6:	28 17       	cp	r18, r24
    ecb8:	19 06       	cpc	r1, r25
    ecba:	89 f4       	brne	.+34     	; 0xecde <menu_item_submenu_E(Sheet const&, void (*)())+0x94>
	if (menu_item == menu_line)
	{
		if (lcd_draw_update) menu_draw_item_puts_P(LCD_STR_ARROW_RIGHT[0], str);
		if (menu_clicked && (lcd_encoder == menu_item))
		{
			menu_submenu(submenu);
    ecbc:	60 e0       	ldi	r22, 0x00	; 0
    ecbe:	c8 01       	movw	r24, r16
    ecc0:	0e 94 dd 62 	call	0xc5ba	; 0xc5ba <menu_submenu(void (*)(), bool)>
			menu_item_ret();
    ecc4:	0e 94 73 62 	call	0xc4e6	; 0xc4e6 <menu_item_ret()>
            menu_item_ret();
            return;
        }
    }
    menu_item++;
}
    ecc8:	63 96       	adiw	r28, 0x13	; 19
    ecca:	0f b6       	in	r0, 0x3f	; 63
    eccc:	f8 94       	cli
    ecce:	de bf       	out	0x3e, r29	; 62
    ecd0:	0f be       	out	0x3f, r0	; 63
    ecd2:	cd bf       	out	0x3d, r28	; 61
    ecd4:	df 91       	pop	r29
    ecd6:	cf 91       	pop	r28
    ecd8:	1f 91       	pop	r17
    ecda:	0f 91       	pop	r16
    ecdc:	08 95       	ret
            menu_submenu(submenu);
            menu_item_ret();
            return;
        }
    }
    menu_item++;
    ecde:	80 91 63 04 	lds	r24, 0x0463	; 0x800463 <menu_item>
    ece2:	8f 5f       	subi	r24, 0xFF	; 255
    ece4:	80 93 63 04 	sts	0x0463, r24	; 0x800463 <menu_item>
    ece8:	ef cf       	rjmp	.-34     	; 0xecc8 <menu_item_submenu_E(Sheet const&, void (*)())+0x7e>

0000ecea <M600_load_filament_movements(char const*)>:
		}
		sound_wait_for_user_reset();
}

void M600_load_filament_movements(const char* filament_name)
{
    ecea:	cf 93       	push	r28
    ecec:	df 93       	push	r29
    ecee:	ec 01       	movw	r28, r24
	current_position[E_AXIS]+= FILAMENTCHANGE_FIRSTFEED;
    ecf0:	20 e0       	ldi	r18, 0x00	; 0
    ecf2:	30 e0       	ldi	r19, 0x00	; 0
    ecf4:	4c e8       	ldi	r20, 0x8C	; 140
    ecf6:	52 e4       	ldi	r21, 0x42	; 66
    ecf8:	60 91 6d 12 	lds	r22, 0x126D	; 0x80126d <current_position+0xc>
    ecfc:	70 91 6e 12 	lds	r23, 0x126E	; 0x80126e <current_position+0xd>
    ed00:	80 91 6f 12 	lds	r24, 0x126F	; 0x80126f <current_position+0xe>
    ed04:	90 91 70 12 	lds	r25, 0x1270	; 0x801270 <current_position+0xf>
    ed08:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    ed0c:	60 93 6d 12 	sts	0x126D, r22	; 0x80126d <current_position+0xc>
    ed10:	70 93 6e 12 	sts	0x126E, r23	; 0x80126e <current_position+0xd>
    ed14:	80 93 6f 12 	sts	0x126F, r24	; 0x80126f <current_position+0xe>
    ed18:	90 93 70 12 	sts	0x1270, r25	; 0x801270 <current_position+0xf>
	plan_buffer_line_curposXYZE(FILAMENTCHANGE_EFEED_FIRST);
    ed1c:	60 e0       	ldi	r22, 0x00	; 0
    ed1e:	70 e0       	ldi	r23, 0x00	; 0
    ed20:	80 ea       	ldi	r24, 0xA0	; 160
    ed22:	91 e4       	ldi	r25, 0x41	; 65
    ed24:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
	load_filament_final_feed();
    ed28:	0e 94 ed 63 	call	0xc7da	; 0xc7da <load_filament_final_feed()>
}


void lcd_loading_filament(const char* filament_name) {

  lcd_clear();
    ed2c:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>

  lcd_puts_at_P(0, 0, _T(MSG_LOADING_FILAMENT));
    ed30:	8d ee       	ldi	r24, 0xED	; 237
    ed32:	91 e6       	ldi	r25, 0x61	; 97
    ed34:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
    ed38:	ac 01       	movw	r20, r24
    ed3a:	60 e0       	ldi	r22, 0x00	; 0
    ed3c:	80 e0       	ldi	r24, 0x00	; 0
    ed3e:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
  if (filament_name[0]) {
    ed42:	88 81       	ld	r24, Y
    ed44:	88 23       	and	r24, r24
    ed46:	39 f0       	breq	.+14     	; 0xed56 <M600_load_filament_movements(char const*)+0x6c>
      lcd_set_cursor(0, 1);
    ed48:	61 e0       	ldi	r22, 0x01	; 1
    ed4a:	80 e0       	ldi	r24, 0x00	; 0
    ed4c:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
      lcd_print(filament_name);
    ed50:	ce 01       	movw	r24, r28
    ed52:	0e 94 5f 73 	call	0xe6be	; 0xe6be <lcd_print(char const*)>
  }
  lcd_puts_at_P(0, 2, _T(MSG_PLEASE_WAIT));
    ed56:	85 e6       	ldi	r24, 0x65	; 101
    ed58:	99 e3       	ldi	r25, 0x39	; 57
    ed5a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
    ed5e:	ac 01       	movw	r20, r24
    ed60:	62 e0       	ldi	r22, 0x02	; 2
    ed62:	80 e0       	ldi	r24, 0x00	; 0
    ed64:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
  uint16_t slow_seq_time = (FILAMENTCHANGE_FINALFEED * 1000ul) / FILAMENTCHANGE_EFEED_FINAL;
  uint16_t fast_seq_time = (FILAMENTCHANGE_FIRSTFEED * 1000ul) / FILAMENTCHANGE_EFEED_FIRST;
  lcd_loading_progress_bar(slow_seq_time + fast_seq_time); //show progress bar for total time of filament loading fast + slow sequence
    ed68:	83 e4       	ldi	r24, 0x43	; 67
    ed6a:	9b e2       	ldi	r25, 0x2B	; 43
    ed6c:	0f 94 b2 0b 	call	0x21764	; 0x21764 <lcd_loading_progress_bar(unsigned int) [clone .lto_priv.520]>
	lcd_loading_filament(filament_name);
	st_synchronize();
}
    ed70:	df 91       	pop	r29
    ed72:	cf 91       	pop	r28
{
	current_position[E_AXIS]+= FILAMENTCHANGE_FIRSTFEED;
	plan_buffer_line_curposXYZE(FILAMENTCHANGE_EFEED_FIRST);
	load_filament_final_feed();
	lcd_loading_filament(filament_name);
	st_synchronize();
    ed74:	0d 94 fb 1a 	jmp	0x235f6	; 0x235f6 <st_synchronize()>

0000ed78 <mmu_M600_unload_filament()>:
 * A fullscreen message showing "Unloading Filament x"
 * should be shown on the LCD and LCD updates should be
 * are disabled in the meantime.
 */
static void mmu_M600_unload_filament() {
    if (MMU2::mmu2.get_current_tool() == (uint8_t)MMU2::FILAMENT_UNKNOWN) return;
    ed78:	0f 94 a7 65 	call	0x2cb4e	; 0x2cb4e <MMU2::MMU2::get_current_tool() const [clone .constprop.351]>
    ed7c:	8f 3f       	cpi	r24, 0xFF	; 255
    ed7e:	11 f1       	breq	.+68     	; 0xedc4 <mmu_M600_unload_filament()+0x4c>

    lcd_update_enable(false);
    ed80:	80 e0       	ldi	r24, 0x00	; 0
    ed82:	0e 94 38 70 	call	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>
    lcd_clear();
    ed86:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
    lcd_puts_at_P(0, 1, _T(MSG_UNLOADING_FILAMENT));
    ed8a:	89 ea       	ldi	r24, 0xA9	; 169
    ed8c:	99 e5       	ldi	r25, 0x59	; 89
    ed8e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
    ed92:	ac 01       	movw	r20, r24
    ed94:	61 e0       	ldi	r22, 0x01	; 1
    ed96:	80 e0       	ldi	r24, 0x00	; 0
    ed98:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
}

void lcd_print(long n, int base)
{
	if (base == 0)
		lcd_write(n);
    ed9c:	80 e2       	ldi	r24, 0x20	; 32
    ed9e:	0e 94 a2 70 	call	0xe144	; 0xe144 <lcd_write(unsigned char) [clone .lto_priv.402]>
    lcd_print(' ');
    lcd_print(MMU2::mmu2.get_current_tool() + 1);
    eda2:	0f 94 a7 65 	call	0x2cb4e	; 0x2cb4e <MMU2::MMU2::get_current_tool() const [clone .constprop.351]>
    eda6:	68 2f       	mov	r22, r24
    eda8:	70 e0       	ldi	r23, 0x00	; 0
    edaa:	6f 5f       	subi	r22, 0xFF	; 255
    edac:	7f 4f       	sbci	r23, 0xFF	; 255
	lcd_print((unsigned long) b, base);
}

void lcd_print(int n, int base)
{
	lcd_print((long) n, base);
    edae:	07 2e       	mov	r0, r23
    edb0:	00 0c       	add	r0, r0
    edb2:	88 0b       	sbc	r24, r24
    edb4:	99 0b       	sbc	r25, r25
    edb6:	0e 94 db 71 	call	0xe3b6	; 0xe3b6 <lcd_print(long, int) [clone .part.3]>

    // unload just current filament for multimaterial printers (used also in M702)
    MMU2::mmu2.unload();
    edba:	0f 94 71 9d 	call	0x33ae2	; 0x33ae2 <MMU2::MMU2::unload() [clone .constprop.105]>
    lcd_update_enable(true);
    edbe:	81 e0       	ldi	r24, 0x01	; 1
    edc0:	0c 94 38 70 	jmp	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>
}
    edc4:	08 95       	ret

0000edc6 <__vector_23>:
/// that may further reduce the CPU cycles required by the bed heating automaton
/// Due to the nature of bed heating the reduced PID precision may not be a major issue, however doing 8x less ISR(timer0_ovf) may significantly improve the performance
static const uint8_t slowInc = 1;

ISR(TIMER0_OVF_vect)          // timer compare interrupt service routine
{
    edc6:	1f 92       	push	r1
    edc8:	0f 92       	push	r0
    edca:	0f b6       	in	r0, 0x3f	; 63
    edcc:	0f 92       	push	r0
    edce:	11 24       	eor	r1, r1
    edd0:	0b b6       	in	r0, 0x3b	; 59
    edd2:	0f 92       	push	r0
    edd4:	2f 93       	push	r18
    edd6:	8f 93       	push	r24
    edd8:	9f 93       	push	r25
    edda:	ef 93       	push	r30
    eddc:	ff 93       	push	r31
	switch(state){
    edde:	e0 91 26 03 	lds	r30, 0x0326	; 0x800326 <state>
    ede2:	e8 30       	cpi	r30, 0x08	; 8
    ede4:	e8 f4       	brcc	.+58     	; 0xee20 <__vector_23+0x5a>
    ede6:	f0 e0       	ldi	r31, 0x00	; 0
    ede8:	88 27       	eor	r24, r24
    edea:	e6 50       	subi	r30, 0x06	; 6
    edec:	f9 48       	sbci	r31, 0x89	; 137
    edee:	8f 4f       	sbci	r24, 0xFF	; 255
    edf0:	0d 94 f0 a4 	jmp	0x349e0	; 0x349e0 <__tablejump2__>
    edf4:	02 77       	andi	r16, 0x72	; 114
    edf6:	1c 77       	andi	r17, 0x7C	; 124
    edf8:	27 77       	andi	r18, 0x77	; 119
    edfa:	35 77       	andi	r19, 0x75	; 117
    edfc:	4b 77       	andi	r20, 0x7B	; 123
    edfe:	54 77       	andi	r21, 0x74	; 116
    ee00:	77 77       	andi	r23, 0x77	; 119
    ee02:	89 77       	andi	r24, 0x79	; 121
	case States::ZERO_START:
		if (bedPWMDisabled) return; // stay in the OFF state and do not change the output pin
    ee04:	80 91 28 06 	lds	r24, 0x0628	; 0x800628 <bedPWMDisabled>
    ee08:	81 11       	cpse	r24, r1
    ee0a:	0a c0       	rjmp	.+20     	; 0xee20 <__vector_23+0x5a>
		pwm = soft_pwm_bed << 1;// expecting soft_pwm_bed to be 7bit!
    ee0c:	80 91 ee 05 	lds	r24, 0x05EE	; 0x8005ee <soft_pwm_bed>
    ee10:	88 0f       	add	r24, r24
    ee12:	80 93 25 03 	sts	0x0325, r24	; 0x800325 <pwm>
		if( pwm != 0 ){
    ee16:	88 23       	and	r24, r24
    ee18:	19 f0       	breq	.+6      	; 0xee20 <__vector_23+0x5a>
			state = States::ZERO;     // do nothing, let it tick once again after the 30Hz period
    ee1a:	81 e0       	ldi	r24, 0x01	; 1
		// In any case update our cache of pwm value for the next whole cycle from soft_pwm_bed
		slowCounter += slowInc; // this does software timer_clk/256 or less (depends on slowInc)
		if( slowCounter > pwm ){
			return;
		} // otherwise moving towards RISE
		state = States::ZERO_TO_RISE; // and finalize the change in a transitional state RISE0
    ee1c:	80 93 26 03 	sts	0x0326, r24	; 0x800326 <state>
		TCNT0 = 128;
		OCR0B = 255;
		TCCR0B = (1 << CS01); // change prescaler to 8, i.e. 7.8kHz
		break;
    }
}
    ee20:	ff 91       	pop	r31
    ee22:	ef 91       	pop	r30
    ee24:	9f 91       	pop	r25
    ee26:	8f 91       	pop	r24
    ee28:	2f 91       	pop	r18
    ee2a:	0f 90       	pop	r0
    ee2c:	0b be       	out	0x3b, r0	; 59
    ee2e:	0f 90       	pop	r0
    ee30:	0f be       	out	0x3f, r0	; 63
    ee32:	0f 90       	pop	r0
    ee34:	1f 90       	pop	r1
    ee36:	18 95       	reti
			state = States::ZERO;     // do nothing, let it tick once again after the 30Hz period
		}
		break;
	case States::ZERO: // end of state ZERO - we'll either stay in ZERO or change to RISE
		// In any case update our cache of pwm value for the next whole cycle from soft_pwm_bed
		slowCounter += slowInc; // this does software timer_clk/256 or less (depends on slowInc)
    ee38:	80 91 24 03 	lds	r24, 0x0324	; 0x800324 <slowCounter>
    ee3c:	8f 5f       	subi	r24, 0xFF	; 255
    ee3e:	80 93 24 03 	sts	0x0324, r24	; 0x800324 <slowCounter>
		if( slowCounter > pwm ){
    ee42:	90 91 25 03 	lds	r25, 0x0325	; 0x800325 <pwm>
    ee46:	98 17       	cp	r25, r24
    ee48:	58 f3       	brcs	.-42     	; 0xee20 <__vector_23+0x5a>
			return;
		} // otherwise moving towards RISE
		state = States::ZERO_TO_RISE; // and finalize the change in a transitional state RISE0
    ee4a:	82 e0       	ldi	r24, 0x02	; 2
    ee4c:	e7 cf       	rjmp	.-50     	; 0xee1c <__vector_23+0x56>
	// even though it may look like the ZERO state may be glued together with the ZERO_TO_RISE, don't do it
	// the timer must tick once more in order to get rid of occasional output pin toggles.
	case States::ZERO_TO_RISE:  // special state for handling transition between prescalers and switching inverted->non-inverted fast-PWM without toggling the output pin.
		// It must be done in consequent steps, otherwise the pin will get flipped up and down during one PWM cycle.
		// Also beware of the correct sequence of the following timer control registers initialization - it really matters!
		state = States::RISE;     // prepare for standard RISE cycles
    ee4e:	83 e0       	ldi	r24, 0x03	; 3
    ee50:	80 93 26 03 	sts	0x0326, r24	; 0x800326 <state>
		fastCounter = fastMax - 1;// we'll do 16-1 cycles of RISE
    ee54:	8f e0       	ldi	r24, 0x0F	; 15
    ee56:	80 93 23 03 	sts	0x0323, r24	; 0x800323 <fastCounter>
		TCNT0 = 255;              // force overflow on the next clock cycle
    ee5a:	8f ef       	ldi	r24, 0xFF	; 255
    ee5c:	86 bd       	out	0x26, r24	; 38
		TCCR0B = (1 << CS00);     // change prescaler to 1, i.e. 62.5kHz
    ee5e:	81 e0       	ldi	r24, 0x01	; 1
    ee60:	85 bd       	out	0x25, r24	; 37
		TCCR0A &= ~(1 << COM0B0); // Clear OC0B on Compare Match, set OC0B at BOTTOM (non-inverting mode)
    ee62:	84 b5       	in	r24, 0x24	; 36
    ee64:	8f 7e       	andi	r24, 0xEF	; 239
		fastCounter = fastMax - 1;// we'll do 16-1 cycles of RISE
		TCNT0 = 255;              // force overflow on the next clock cycle
		TCCR0B = (1 << CS00);     // change prescaler to 1, i.e. 62.5kHz
		// must switch to inverting mode already here, because it takes a whole PWM cycle and it would make a "1" at the end of this pwm cycle
		// COM0B1 remains set both in inverting and non-inverting mode
		TCCR0A |= (1 << COM0B0);  // inverting mode
    ee66:	84 bd       	out	0x24, r24	; 36
    ee68:	db cf       	rjmp	.-74     	; 0xee20 <__vector_23+0x5a>
		TCNT0 = 255;              // force overflow on the next clock cycle
		TCCR0B = (1 << CS00);     // change prescaler to 1, i.e. 62.5kHz
		TCCR0A &= ~(1 << COM0B0); // Clear OC0B on Compare Match, set OC0B at BOTTOM (non-inverting mode)
		break;
	case States::RISE:
		OCR0B = (fastMax - fastCounter) << fastShift;
    ee6a:	80 91 23 03 	lds	r24, 0x0323	; 0x800323 <fastCounter>
    ee6e:	82 95       	swap	r24
    ee70:	80 7f       	andi	r24, 0xF0	; 240
    ee72:	81 95       	neg	r24
    ee74:	88 bd       	out	0x28, r24	; 40
		if( fastCounter ){
    ee76:	80 91 23 03 	lds	r24, 0x0323	; 0x800323 <fastCounter>
    ee7a:	88 23       	and	r24, r24
    ee7c:	21 f0       	breq	.+8      	; 0xee86 <__vector_23+0xc0>
		break;
	case States::FALL:
		OCR0B = (fastMax - fastCounter) << fastShift; // this is the same as in RISE, because now we are setting the zero part of duty due to inverting mode
		//TCCR0A |= (1 << COM0B0); // already set in ONE_TO_FALL
		if( fastCounter ){
			--fastCounter;
    ee7e:	81 50       	subi	r24, 0x01	; 1
    ee80:	80 93 23 03 	sts	0x0323, r24	; 0x800323 <fastCounter>
    ee84:	cd cf       	rjmp	.-102    	; 0xee20 <__vector_23+0x5a>
	case States::RISE:
		OCR0B = (fastMax - fastCounter) << fastShift;
		if( fastCounter ){
			--fastCounter;
		} else { // end of RISE cycles, changing into state ONE
			state = States::RISE_TO_ONE;
    ee86:	84 e0       	ldi	r24, 0x04	; 4
    ee88:	80 93 26 03 	sts	0x0326, r24	; 0x800326 <state>
			OCR0B = 255;          // full duty
    ee8c:	8f ef       	ldi	r24, 0xFF	; 255
    ee8e:	88 bd       	out	0x28, r24	; 40
			TCNT0 = 254;          // make the timer overflow in the next cycle
    ee90:	8e ef       	ldi	r24, 0xFE	; 254
    ee92:	86 bd       	out	0x26, r24	; 38
    ee94:	c5 cf       	rjmp	.-118    	; 0xee20 <__vector_23+0x5a>
			// @@TODO these constants are still subject to investigation
		}
		break;
	case States::RISE_TO_ONE:
		state = States::ONE;
    ee96:	85 e0       	ldi	r24, 0x05	; 5
    ee98:	80 93 26 03 	sts	0x0326, r24	; 0x800326 <state>
		OCR0B = 255;              // full duty
    ee9c:	8f ef       	ldi	r24, 0xFF	; 255
    ee9e:	88 bd       	out	0x28, r24	; 40
		TCNT0 = 255;              // make the timer overflow in the next cycle
    eea0:	86 bd       	out	0x26, r24	; 38
		break;
	case States::FALL_TO_ZERO:
		state = States::ZERO_START; // go to read new soft_pwm_bed value for the next cycle
		TCNT0 = 128;
		OCR0B = 255;
		TCCR0B = (1 << CS01); // change prescaler to 8, i.e. 7.8kHz
    eea2:	82 e0       	ldi	r24, 0x02	; 2
    eea4:	85 bd       	out	0x25, r24	; 37
    eea6:	bc cf       	rjmp	.-136    	; 0xee20 <__vector_23+0x5a>
		OCR0B = 255;              // full duty
		TCNT0 = 255;              // make the timer overflow in the next cycle
		TCCR0B = (1 << CS01);     // change prescaler to 8, i.e. 7.8kHz
		break;
	case States::ONE:             // state ONE - we'll either stay in ONE or change to FALL
		OCR0B = 255;
    eea8:	2f ef       	ldi	r18, 0xFF	; 255
    eeaa:	28 bd       	out	0x28, r18	; 40
		if (bedPWMDisabled) return; // stay in the ON state and do not change the output pin
    eeac:	80 91 28 06 	lds	r24, 0x0628	; 0x800628 <bedPWMDisabled>
    eeb0:	81 11       	cpse	r24, r1
    eeb2:	b6 cf       	rjmp	.-148    	; 0xee20 <__vector_23+0x5a>
		slowCounter += slowInc;   // this does software timer_clk/256 or less
    eeb4:	80 91 24 03 	lds	r24, 0x0324	; 0x800324 <slowCounter>
    eeb8:	8f 5f       	subi	r24, 0xFF	; 255
    eeba:	80 93 24 03 	sts	0x0324, r24	; 0x800324 <slowCounter>
		if( slowCounter < pwm ){
    eebe:	90 91 25 03 	lds	r25, 0x0325	; 0x800325 <pwm>
    eec2:	89 17       	cp	r24, r25
    eec4:	08 f4       	brcc	.+2      	; 0xeec8 <__vector_23+0x102>
    eec6:	ac cf       	rjmp	.-168    	; 0xee20 <__vector_23+0x5a>
			return;
		}
		if( (soft_pwm_bed << 1) >= (255 - slowInc - 1) ){  //@@TODO simplify & explain
    eec8:	80 91 ee 05 	lds	r24, 0x05EE	; 0x8005ee <soft_pwm_bed>
    eecc:	90 e0       	ldi	r25, 0x00	; 0
    eece:	8f 37       	cpi	r24, 0x7F	; 127
    eed0:	91 05       	cpc	r25, r1
    eed2:	0c f0       	brlt	.+2      	; 0xeed6 <__vector_23+0x110>
    eed4:	a5 cf       	rjmp	.-182    	; 0xee20 <__vector_23+0x5a>
			// if slowInc==2, soft_pwm == 251 will be the first to do short drops to zero. 252 will keep full heating
			return;           // want full duty for the next ONE cycle again - so keep on heating and just wait for the next timer ovf
		}
		// otherwise moving towards FALL
		state=States::FALL;
    eed6:	86 e0       	ldi	r24, 0x06	; 6
    eed8:	80 93 26 03 	sts	0x0326, r24	; 0x800326 <state>
		fastCounter = fastMax - 1;// we'll do 16-1 cycles of RISE
    eedc:	8f e0       	ldi	r24, 0x0F	; 15
    eede:	80 93 23 03 	sts	0x0323, r24	; 0x800323 <fastCounter>
		TCNT0 = 255;              // force overflow on the next clock cycle
    eee2:	26 bd       	out	0x26, r18	; 38
		TCCR0B = (1 << CS00);     // change prescaler to 1, i.e. 62.5kHz
    eee4:	81 e0       	ldi	r24, 0x01	; 1
    eee6:	85 bd       	out	0x25, r24	; 37
		// must switch to inverting mode already here, because it takes a whole PWM cycle and it would make a "1" at the end of this pwm cycle
		// COM0B1 remains set both in inverting and non-inverting mode
		TCCR0A |= (1 << COM0B0);  // inverting mode
    eee8:	84 b5       	in	r24, 0x24	; 36
    eeea:	80 61       	ori	r24, 0x10	; 16
    eeec:	bc cf       	rjmp	.-136    	; 0xee66 <__vector_23+0xa0>
		break;
	case States::FALL:
		OCR0B = (fastMax - fastCounter) << fastShift; // this is the same as in RISE, because now we are setting the zero part of duty due to inverting mode
    eeee:	80 91 23 03 	lds	r24, 0x0323	; 0x800323 <fastCounter>
    eef2:	82 95       	swap	r24
    eef4:	80 7f       	andi	r24, 0xF0	; 240
    eef6:	81 95       	neg	r24
    eef8:	88 bd       	out	0x28, r24	; 40
		//TCCR0A |= (1 << COM0B0); // already set in ONE_TO_FALL
		if( fastCounter ){
    eefa:	80 91 23 03 	lds	r24, 0x0323	; 0x800323 <fastCounter>
    eefe:	81 11       	cpse	r24, r1
    ef00:	be cf       	rjmp	.-132    	; 0xee7e <__vector_23+0xb8>
			--fastCounter;
		} else {   // end of FALL cycles, changing into state ZERO
			state = States::FALL_TO_ZERO;
    ef02:	87 e0       	ldi	r24, 0x07	; 7
    ef04:	80 93 26 03 	sts	0x0326, r24	; 0x800326 <state>
			TCNT0 = 128; //@@TODO again - need to wait long enough to propagate the timer state changes
    ef08:	80 e8       	ldi	r24, 0x80	; 128
    ef0a:	86 bd       	out	0x26, r24	; 38
			OCR0B = 255;
    ef0c:	8f ef       	ldi	r24, 0xFF	; 255
    ef0e:	88 bd       	out	0x28, r24	; 40
    ef10:	87 cf       	rjmp	.-242    	; 0xee20 <__vector_23+0x5a>
		}
		break;
	case States::FALL_TO_ZERO:
		state = States::ZERO_START; // go to read new soft_pwm_bed value for the next cycle
    ef12:	10 92 26 03 	sts	0x0326, r1	; 0x800326 <state>
		TCNT0 = 128;
    ef16:	80 e8       	ldi	r24, 0x80	; 128
    ef18:	86 bd       	out	0x26, r24	; 38
		OCR0B = 255;
    ef1a:	8f ef       	ldi	r24, 0xFF	; 255
    ef1c:	88 bd       	out	0x28, r24	; 40
    ef1e:	c1 cf       	rjmp	.-126    	; 0xeea2 <__vector_23+0xdc>

0000ef20 <Filament_sensor::setEnabled(bool)>:
#else // FILAMENT_SENSOR
FSensorBlockRunout::FSensorBlockRunout() { }
FSensorBlockRunout::~FSensorBlockRunout() { }
#endif // FILAMENT_SENSOR

void Filament_sensor::setEnabled(bool enabled) {
    ef20:	cf 93       	push	r28
    ef22:	c8 2f       	mov	r28, r24
    ef24:	68 2f       	mov	r22, r24
    ef26:	87 e6       	ldi	r24, 0x67	; 103
    ef28:	9f e0       	ldi	r25, 0x0F	; 15
    ef2a:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
    eeprom_update_byte_notify((uint8_t *)EEPROM_FSENSOR, enabled);
    if (enabled) {
    ef2e:	cc 23       	and	r28, r28
    ef30:	19 f0       	breq	.+6      	; 0xef38 <Filament_sensor::setEnabled(bool)+0x18>
        fsensor.init();
    } else {
        fsensor.deinit();
    }
}
    ef32:	cf 91       	pop	r28
#endif // FILAMENT_SENSOR

void Filament_sensor::setEnabled(bool enabled) {
    eeprom_update_byte_notify((uint8_t *)EEPROM_FSENSOR, enabled);
    if (enabled) {
        fsensor.init();
    ef34:	0d 94 dc 6d 	jmp	0x2dbb8	; 0x2dbb8 <PAT9125_sensor::init() [clone .constprop.206]>
}

void PAT9125_sensor::deinit() {
//    puts_P(PSTR("fsensor::deinit()"));
    ; //
    state = State::disabled;
    ef38:	10 92 f1 16 	sts	0x16F1, r1	; 0x8016f1 <fsensor>
    filter = 0;
    ef3c:	10 92 fd 16 	sts	0x16FD, r1	; 0x8016fd <fsensor+0xc>
    if (enabled) {
        fsensor.init();
    } else {
        fsensor.deinit();
    }
}
    ef40:	cf 91       	pop	r28
    ef42:	08 95       	ret

0000ef44 <resetFanCheck()>:
#endif
#endif //DEBUG_DISABLE_FANCHECK
}

void resetFanCheck() {
    fan_measuring = false;
    ef44:	10 92 b6 03 	sts	0x03B6, r1	; 0x8003b6 <fan_measuring>
    extruder_autofan_last_check = _millis();
    ef48:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
    ef4c:	60 93 07 17 	sts	0x1707, r22	; 0x801707 <extruder_autofan_last_check>
    ef50:	70 93 08 17 	sts	0x1708, r23	; 0x801708 <extruder_autofan_last_check+0x1>
    ef54:	80 93 09 17 	sts	0x1709, r24	; 0x801709 <extruder_autofan_last_check+0x2>
    ef58:	90 93 0a 17 	sts	0x170A, r25	; 0x80170a <extruder_autofan_last_check+0x3>
}
    ef5c:	08 95       	ret

0000ef5e <setExtruderAutoFanState(unsigned char)>:
void setExtruderAutoFanState(uint8_t state)
{
    //If bit 1 is set (0x02), then the hotend fan speed won't be adjusted according to temperature. Useful for forcing
    //the fan to either On or Off during certain tests/errors.

    fanState = state;
    ef5e:	80 93 22 03 	sts	0x0322, r24	; 0x800322 <fanState>
    newFanSpeed = 0;
    if (fanState & 0x01)
    ef62:	80 fd       	sbrc	r24, 0
    ef64:	1c c0       	rjmp	.+56     	; 0xef9e <setExtruderAutoFanState(unsigned char)+0x40>
{
    //If bit 1 is set (0x02), then the hotend fan speed won't be adjusted according to temperature. Useful for forcing
    //the fan to either On or Off during certain tests/errors.

    fanState = state;
    newFanSpeed = 0;
    ef66:	10 92 3e 03 	sts	0x033E, r1	; 0x80033e <newFanSpeed>
        else newFanSpeed = EXTRUDER_AUTO_FAN_SPEED;
#else //EXTRUDER_ALTFAN_DETECT
        newFanSpeed = EXTRUDER_AUTO_FAN_SPEED;
#endif //EXTRUDER_ALTFAN_DETECT
    }
    timer4_set_fan0(newFanSpeed);
    ef6a:	20 91 3e 03 	lds	r18, 0x033E	; 0x80033e <newFanSpeed>
}

#ifdef EXTRUDER_0_AUTO_FAN_PIN
void timer4_set_fan0(uint8_t duty)
{
	if (duty == 0 || duty == 255)
    ef6e:	8f ef       	ldi	r24, 0xFF	; 255
    ef70:	82 0f       	add	r24, r18
    ef72:	8e 3f       	cpi	r24, 0xFE	; 254
    ef74:	e8 f0       	brcs	.+58     	; 0xefb0 <setExtruderAutoFanState(unsigned char)+0x52>
	{
		// We use digital logic if the duty cycle is 0% or 100%
		TCCR4A &= ~_BV(COM4C1);
    ef76:	80 91 a0 00 	lds	r24, 0x00A0	; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0>
    ef7a:	87 7f       	andi	r24, 0xF7	; 247
    ef7c:	80 93 a0 00 	sts	0x00A0, r24	; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0>
		OCR4C = 0;
    ef80:	10 92 ad 00 	sts	0x00AD, r1	; 0x8000ad <__TEXT_REGION_LENGTH__+0x7c20ad>
    ef84:	10 92 ac 00 	sts	0x00AC, r1	; 0x8000ac <__TEXT_REGION_LENGTH__+0x7c20ac>
		WRITE(EXTRUDER_0_AUTO_FAN_PIN, duty);
    ef88:	9f b7       	in	r25, 0x3f	; 63
    ef8a:	22 23       	and	r18, r18
    ef8c:	61 f0       	breq	.+24     	; 0xefa6 <setExtruderAutoFanState(unsigned char)+0x48>
    ef8e:	f8 94       	cli
    ef90:	80 91 02 01 	lds	r24, 0x0102	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
    ef94:	80 62       	ori	r24, 0x20	; 32
    ef96:	80 93 02 01 	sts	0x0102, r24	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
    ef9a:	9f bf       	out	0x3f, r25	; 63
    ef9c:	08 95       	ret
    {
#ifdef EXTRUDER_ALTFAN_DETECT
        if (altfanStatus.isAltfan && !altfanStatus.altfanOverride) newFanSpeed = EXTRUDER_ALTFAN_SPEED_SILENT;
        else newFanSpeed = EXTRUDER_AUTO_FAN_SPEED;
#else //EXTRUDER_ALTFAN_DETECT
        newFanSpeed = EXTRUDER_AUTO_FAN_SPEED;
    ef9e:	8f ef       	ldi	r24, 0xFF	; 255
    efa0:	80 93 3e 03 	sts	0x033E, r24	; 0x80033e <newFanSpeed>
    efa4:	e2 cf       	rjmp	.-60     	; 0xef6a <setExtruderAutoFanState(unsigned char)+0xc>
    efa6:	f8 94       	cli
    efa8:	80 91 02 01 	lds	r24, 0x0102	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
    efac:	8f 7d       	andi	r24, 0xDF	; 223
    efae:	f3 cf       	rjmp	.-26     	; 0xef96 <setExtruderAutoFanState(unsigned char)+0x38>
	else
	{
		// Use the timer for fan speed. Enable the timer compare output and set the duty cycle.
		// This function also handles the impossible scenario of a fan speed change during a Tone.
		// Better be safe than sorry.
		CRITICAL_SECTION_START;
    efb0:	ef b7       	in	r30, 0x3f	; 63
    efb2:	f8 94       	cli
		// Enable the PWM output on the fan pin.
		TCCR4A |= _BV(COM4C1);
    efb4:	80 91 a0 00 	lds	r24, 0x00A0	; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0>
    efb8:	88 60       	ori	r24, 0x08	; 8
    efba:	80 93 a0 00 	sts	0x00A0, r24	; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0>
		OCR4C = (((uint16_t)duty) * ((uint16_t)((TIMSK4 & _BV(OCIE4A)) ? OCR4A : 255U))) / 255U;
    efbe:	30 e0       	ldi	r19, 0x00	; 0
    efc0:	80 91 72 00 	lds	r24, 0x0072	; 0x800072 <__TEXT_REGION_LENGTH__+0x7c2072>
    efc4:	4f ef       	ldi	r20, 0xFF	; 255
    efc6:	50 e0       	ldi	r21, 0x00	; 0
    efc8:	81 ff       	sbrs	r24, 1
    efca:	04 c0       	rjmp	.+8      	; 0xefd4 <setExtruderAutoFanState(unsigned char)+0x76>
    efcc:	40 91 a8 00 	lds	r20, 0x00A8	; 0x8000a8 <__TEXT_REGION_LENGTH__+0x7c20a8>
    efd0:	50 91 a9 00 	lds	r21, 0x00A9	; 0x8000a9 <__TEXT_REGION_LENGTH__+0x7c20a9>
    efd4:	24 9f       	mul	r18, r20
    efd6:	c0 01       	movw	r24, r0
    efd8:	25 9f       	mul	r18, r21
    efda:	90 0d       	add	r25, r0
    efdc:	34 9f       	mul	r19, r20
    efde:	90 0d       	add	r25, r0
    efe0:	11 24       	eor	r1, r1
    efe2:	6f ef       	ldi	r22, 0xFF	; 255
    efe4:	70 e0       	ldi	r23, 0x00	; 0
    efe6:	0f 94 a9 a4 	call	0x34952	; 0x34952 <__udivmodhi4>
    efea:	70 93 ad 00 	sts	0x00AD, r23	; 0x8000ad <__TEXT_REGION_LENGTH__+0x7c20ad>
    efee:	60 93 ac 00 	sts	0x00AC, r22	; 0x8000ac <__TEXT_REGION_LENGTH__+0x7c20ac>
		CRITICAL_SECTION_END;
    eff2:	ef bf       	out	0x3f, r30	; 63
#endif //EXTRUDER_ALTFAN_DETECT
    }
    timer4_set_fan0(newFanSpeed);
}
    eff4:	08 95       	ret

0000eff6 <checkExtruderAutoFans()>:
}

#endif //EXTRUDER_ALTFAN_DETECT

void checkExtruderAutoFans()
{
    eff6:	1f 93       	push	r17
    eff8:	cf 93       	push	r28
    effa:	df 93       	push	r29
#if defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1
    if (!(fanState & 0x02))
    effc:	d0 91 22 03 	lds	r29, 0x0322	; 0x800322 <fanState>
    f000:	d1 fd       	sbrc	r29, 1
    f002:	1d c0       	rjmp	.+58     	; 0xf03e <checkExtruderAutoFans()+0x48>
    temp_error_state.assert = true;
}

bool get_temp_error()
{
    return temp_error_state.v;
    f004:	10 91 cc 03 	lds	r17, 0x03CC	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
    {
        fanState &= ~1;
        fanState |= current_temperature[0] > EXTRUDER_AUTO_FAN_TEMPERATURE;
    f008:	c1 e0       	ldi	r28, 0x01	; 1
    f00a:	20 e0       	ldi	r18, 0x00	; 0
    f00c:	30 e0       	ldi	r19, 0x00	; 0
    f00e:	48 e4       	ldi	r20, 0x48	; 72
    f010:	52 e4       	ldi	r21, 0x42	; 66
    f012:	60 91 5a 0d 	lds	r22, 0x0D5A	; 0x800d5a <current_temperature>
    f016:	70 91 5b 0d 	lds	r23, 0x0D5B	; 0x800d5b <current_temperature+0x1>
    f01a:	80 91 5c 0d 	lds	r24, 0x0D5C	; 0x800d5c <current_temperature+0x2>
    f01e:	90 91 5d 0d 	lds	r25, 0x0D5D	; 0x800d5d <current_temperature+0x3>
    f022:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
    f026:	18 16       	cp	r1, r24
    f028:	0c f0       	brlt	.+2      	; 0xf02c <checkExtruderAutoFans()+0x36>
    f02a:	c0 e0       	ldi	r28, 0x00	; 0
void checkExtruderAutoFans()
{
#if defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1
    if (!(fanState & 0x02))
    {
        fanState &= ~1;
    f02c:	de 7f       	andi	r29, 0xFE	; 254
        fanState |= current_temperature[0] > EXTRUDER_AUTO_FAN_TEMPERATURE;
    f02e:	cd 2b       	or	r28, r29
    f030:	81 e0       	ldi	r24, 0x01	; 1
    f032:	11 11       	cpse	r17, r1
    f034:	01 c0       	rjmp	.+2      	; 0xf038 <checkExtruderAutoFans()+0x42>
    f036:	80 e0       	ldi	r24, 0x00	; 0
        fanState |= get_temp_error();
    f038:	c8 2b       	or	r28, r24
    f03a:	c0 93 22 03 	sts	0x0322, r28	; 0x800322 <fanState>
    }
    setExtruderAutoFanState(fanState);
    f03e:	80 91 22 03 	lds	r24, 0x0322	; 0x800322 <fanState>
#endif
}
    f042:	df 91       	pop	r29
    f044:	cf 91       	pop	r28
    f046:	1f 91       	pop	r17
    {
        fanState &= ~1;
        fanState |= current_temperature[0] > EXTRUDER_AUTO_FAN_TEMPERATURE;
        fanState |= get_temp_error();
    }
    setExtruderAutoFanState(fanState);
    f048:	0c 94 af 77 	jmp	0xef5e	; 0xef5e <setExtruderAutoFanState(unsigned char)>

0000f04c <eeprom_init_default_block(void*, unsigned int, void const*)>:
void __attribute__((noinline)) eeprom_init_default_float(float *__p, float def) {
    if (eeprom_read_dword((uint32_t*)__p) == EEPROM_EMPTY_VALUE32)
        eeprom_write_float_notify(__p, def);
}

void __attribute__((noinline)) eeprom_init_default_block(void *__p, size_t __n, const void *def) {
    f04c:	ef 92       	push	r14
    f04e:	ff 92       	push	r15
    f050:	0f 93       	push	r16
    f052:	1f 93       	push	r17
    f054:	cf 93       	push	r28
    f056:	df 93       	push	r29
    f058:	ec 01       	movw	r28, r24
    f05a:	8b 01       	movw	r16, r22
    f05c:	7a 01       	movw	r14, r20
    if (!eeprom_is_initialized_block(__p, __n))
    f05e:	0e 94 da 55 	call	0xabb4	; 0xabb4 <eeprom_is_initialized_block(void const*, unsigned int)>
    f062:	81 11       	cpse	r24, r1
    f064:	0b c0       	rjmp	.+22     	; 0xf07c <eeprom_init_default_block(void*, unsigned int, void const*)+0x30>
#endif //DEBUG_EEPROM_CHANGES
}

#ifndef DEBUG_EEPROM_CHANGES
void eeprom_update_block_notify(const void *__src, void *__dst, size_t __n){
    eeprom_update_block(__src, __dst, __n);
    f066:	a8 01       	movw	r20, r16
    f068:	be 01       	movw	r22, r28
    f06a:	c7 01       	movw	r24, r14
}

void __attribute__((noinline)) eeprom_init_default_block(void *__p, size_t __n, const void *def) {
    if (!eeprom_is_initialized_block(__p, __n))
        eeprom_update_block_notify(def, __p, __n);
}
    f06c:	df 91       	pop	r29
    f06e:	cf 91       	pop	r28
    f070:	1f 91       	pop	r17
    f072:	0f 91       	pop	r16
    f074:	ff 90       	pop	r15
    f076:	ef 90       	pop	r14
#endif //DEBUG_EEPROM_CHANGES
}

#ifndef DEBUG_EEPROM_CHANGES
void eeprom_update_block_notify(const void *__src, void *__dst, size_t __n){
    eeprom_update_block(__src, __dst, __n);
    f078:	0d 94 f4 a3 	jmp	0x347e8	; 0x347e8 <eeprom_update_block>
}

void __attribute__((noinline)) eeprom_init_default_block(void *__p, size_t __n, const void *def) {
    if (!eeprom_is_initialized_block(__p, __n))
        eeprom_update_block_notify(def, __p, __n);
}
    f07c:	df 91       	pop	r29
    f07e:	cf 91       	pop	r28
    f080:	1f 91       	pop	r17
    f082:	0f 91       	pop	r16
    f084:	ff 90       	pop	r15
    f086:	ef 90       	pop	r14
    f088:	08 95       	ret

0000f08a <eeprom_init_default_word(unsigned int*, unsigned int)>:
        return def;
    }
    return val;
}

uint16_t __attribute__((noinline)) eeprom_init_default_word(uint16_t *__p, uint16_t def) {
    f08a:	0f 93       	push	r16
    f08c:	1f 93       	push	r17
    f08e:	cf 93       	push	r28
    f090:	df 93       	push	r29
    f092:	8c 01       	movw	r16, r24
    f094:	d6 2f       	mov	r29, r22
    f096:	c7 2f       	mov	r28, r23
    uint16_t val = eeprom_read_word(__p);
    f098:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
    if (val == EEPROM_EMPTY_VALUE16) {
    f09c:	8f 3f       	cpi	r24, 0xFF	; 255
    f09e:	98 07       	cpc	r25, r24
    f0a0:	39 f4       	brne	.+14     	; 0xf0b0 <eeprom_init_default_word(unsigned int*, unsigned int)+0x26>
    if (active) {
        uint16_t previous_value = eeprom_read_word(dst);
        eeprom_word_notify(dst, previous_value, value, true);
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_write_word(dst, value);
    f0a2:	6d 2f       	mov	r22, r29
    f0a4:	7c 2f       	mov	r23, r28
    f0a6:	c8 01       	movw	r24, r16
    f0a8:	0f 94 3e a4 	call	0x3487c	; 0x3487c <eeprom_write_word>

uint16_t __attribute__((noinline)) eeprom_init_default_word(uint16_t *__p, uint16_t def) {
    uint16_t val = eeprom_read_word(__p);
    if (val == EEPROM_EMPTY_VALUE16) {
        eeprom_write_word_notify(__p, def);
        return def;
    f0ac:	8d 2f       	mov	r24, r29
    f0ae:	9c 2f       	mov	r25, r28
    }
    return val;
}
    f0b0:	df 91       	pop	r29
    f0b2:	cf 91       	pop	r28
    f0b4:	1f 91       	pop	r17
    f0b6:	0f 91       	pop	r16
    f0b8:	08 95       	ret

0000f0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>:
void __attribute__((noinline)) eeprom_add_dword(uint32_t *__p, uint32_t add) {
    eeprom_write_dword_notify(__p, eeprom_read_dword(__p) + add);
}


uint8_t __attribute__((noinline)) eeprom_init_default_byte(uint8_t *__p, uint8_t def) {
    f0ba:	0f 93       	push	r16
    f0bc:	1f 93       	push	r17
    f0be:	cf 93       	push	r28
    f0c0:	8c 01       	movw	r16, r24
    f0c2:	c6 2f       	mov	r28, r22
    uint8_t val = eeprom_read_byte(__p);
    f0c4:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
    if (val == EEPROM_EMPTY_VALUE) {
    f0c8:	8f 3f       	cpi	r24, 0xFF	; 255
    f0ca:	29 f4       	brne	.+10     	; 0xf0d6 <eeprom_init_default_byte(unsigned char*, unsigned char)+0x1c>
    if (active) {
        uint8_t previous_value = eeprom_read_byte(dst);
        eeprom_byte_notify(dst, previous_value, value, true);
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_write_byte(dst, value);
    f0cc:	6c 2f       	mov	r22, r28
    f0ce:	c8 01       	movw	r24, r16
    f0d0:	0f 94 28 a4 	call	0x34850	; 0x34850 <eeprom_write_byte>

uint8_t __attribute__((noinline)) eeprom_init_default_byte(uint8_t *__p, uint8_t def) {
    uint8_t val = eeprom_read_byte(__p);
    if (val == EEPROM_EMPTY_VALUE) {
        eeprom_write_byte_notify(__p, def);
        return def;
    f0d4:	8c 2f       	mov	r24, r28
    }
    return val;
}
    f0d6:	cf 91       	pop	r28
    f0d8:	1f 91       	pop	r17
    f0da:	0f 91       	pop	r16
    f0dc:	08 95       	ret

0000f0de <eeprom_increment_word(unsigned int*)>:

void __attribute__((noinline)) eeprom_increment_byte(uint8_t *__p) {
    eeprom_write_byte_notify(__p, eeprom_read_byte(__p) + 1);
}

void __attribute__((noinline)) eeprom_increment_word(uint16_t *__p) {
    f0de:	cf 93       	push	r28
    f0e0:	df 93       	push	r29
    f0e2:	ec 01       	movw	r28, r24
    eeprom_write_word_notify(__p, eeprom_read_word(__p) + 1);
    f0e4:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
    f0e8:	bc 01       	movw	r22, r24
    f0ea:	6f 5f       	subi	r22, 0xFF	; 255
    f0ec:	7f 4f       	sbci	r23, 0xFF	; 255
    if (active) {
        uint16_t previous_value = eeprom_read_word(dst);
        eeprom_word_notify(dst, previous_value, value, true);
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_write_word(dst, value);
    f0ee:	ce 01       	movw	r24, r28
    eeprom_write_byte_notify(__p, eeprom_read_byte(__p) + 1);
}

void __attribute__((noinline)) eeprom_increment_word(uint16_t *__p) {
    eeprom_write_word_notify(__p, eeprom_read_word(__p) + 1);
}
    f0f0:	df 91       	pop	r29
    f0f2:	cf 91       	pop	r28
    if (active) {
        uint16_t previous_value = eeprom_read_word(dst);
        eeprom_word_notify(dst, previous_value, value, true);
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_write_word(dst, value);
    f0f4:	0d 94 3e a4 	jmp	0x3487c	; 0x3487c <eeprom_write_word>

0000f0f8 <eeprom_increment_byte(unsigned char*)>:

void eeprom_toggle(uint8_t *__p) {
    eeprom_write_byte_notify(__p, !eeprom_read_byte(__p));
}

void __attribute__((noinline)) eeprom_increment_byte(uint8_t *__p) {
    f0f8:	cf 93       	push	r28
    f0fa:	df 93       	push	r29
    f0fc:	ec 01       	movw	r28, r24
    eeprom_write_byte_notify(__p, eeprom_read_byte(__p) + 1);
    f0fe:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
    f102:	61 e0       	ldi	r22, 0x01	; 1
    f104:	68 0f       	add	r22, r24
    if (active) {
        uint8_t previous_value = eeprom_read_byte(dst);
        eeprom_byte_notify(dst, previous_value, value, true);
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_write_byte(dst, value);
    f106:	ce 01       	movw	r24, r28
    eeprom_write_byte_notify(__p, !eeprom_read_byte(__p));
}

void __attribute__((noinline)) eeprom_increment_byte(uint8_t *__p) {
    eeprom_write_byte_notify(__p, eeprom_read_byte(__p) + 1);
}
    f108:	df 91       	pop	r29
    f10a:	cf 91       	pop	r28
    if (active) {
        uint8_t previous_value = eeprom_read_byte(dst);
        eeprom_byte_notify(dst, previous_value, value, true);
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_write_byte(dst, value);
    f10c:	0d 94 28 a4 	jmp	0x34850	; 0x34850 <eeprom_write_byte>

0000f110 <eeprom_is_sheet_initialized(unsigned char)>:
    sheet = eeprom_next_initialized_sheet(sheet);
    if (sheet >= 0) eeprom_update_byte_notify(&(EEPROM_Sheets_base->active_sheet), sheet);
}

bool __attribute__((noinline)) eeprom_is_sheet_initialized(uint8_t sheet_num) {
    return (eeprom_read_word(reinterpret_cast<uint16_t*>(&(EEPROM_Sheets_base->s[sheet_num].z_offset))) != EEPROM_EMPTY_VALUE16);
    f110:	2b e0       	ldi	r18, 0x0B	; 11
    f112:	82 9f       	mul	r24, r18
    f114:	c0 01       	movw	r24, r0
    f116:	11 24       	eor	r1, r1
    f118:	80 5b       	subi	r24, 0xB0	; 176
    f11a:	92 4f       	sbci	r25, 0xF2	; 242
    f11c:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
    f120:	21 e0       	ldi	r18, 0x01	; 1
    f122:	01 96       	adiw	r24, 0x01	; 1
    f124:	09 f4       	brne	.+2      	; 0xf128 <eeprom_is_sheet_initialized(unsigned char)+0x18>
    f126:	20 e0       	ldi	r18, 0x00	; 0
}
    f128:	82 2f       	mov	r24, r18
    f12a:	08 95       	ret

0000f12c <eeprom_next_initialized_sheet(signed char)>:
//!
//! @param sheet Current sheet
//! @return next initialized sheet
//! @retval -1 no sheet is initialized
int8_t eeprom_next_initialized_sheet(int8_t sheet)
{
    f12c:	cf 93       	push	r28
    f12e:	df 93       	push	r29
    f130:	c8 2f       	mov	r28, r24
    f132:	d8 e0       	ldi	r29, 0x08	; 8
    for (int8_t i = 0; i < static_cast<int8_t>(sizeof(Sheets::s)/sizeof(Sheet)); ++i)
    {
        ++sheet;
    f134:	cf 5f       	subi	r28, 0xFF	; 255
        if (sheet >= static_cast<int8_t>(sizeof(Sheets::s)/sizeof(Sheet))) sheet = 0;
    f136:	c8 30       	cpi	r28, 0x08	; 8
    f138:	0c f0       	brlt	.+2      	; 0xf13c <eeprom_next_initialized_sheet(signed char)+0x10>
    f13a:	c0 e0       	ldi	r28, 0x00	; 0
        if (eeprom_is_sheet_initialized(sheet)) return sheet;
    f13c:	8c 2f       	mov	r24, r28
    f13e:	0e 94 88 78 	call	0xf110	; 0xf110 <eeprom_is_sheet_initialized(unsigned char)>
    f142:	81 11       	cpse	r24, r1
    f144:	03 c0       	rjmp	.+6      	; 0xf14c <eeprom_next_initialized_sheet(signed char)+0x20>
    f146:	d1 50       	subi	r29, 0x01	; 1
//! @param sheet Current sheet
//! @return next initialized sheet
//! @retval -1 no sheet is initialized
int8_t eeprom_next_initialized_sheet(int8_t sheet)
{
    for (int8_t i = 0; i < static_cast<int8_t>(sizeof(Sheets::s)/sizeof(Sheet)); ++i)
    f148:	a9 f7       	brne	.-22     	; 0xf134 <eeprom_next_initialized_sheet(signed char)+0x8>
    {
        ++sheet;
        if (sheet >= static_cast<int8_t>(sizeof(Sheets::s)/sizeof(Sheet))) sheet = 0;
        if (eeprom_is_sheet_initialized(sheet)) return sheet;
    }
    return -1;
    f14a:	cf ef       	ldi	r28, 0xFF	; 255
}
    f14c:	8c 2f       	mov	r24, r28
    f14e:	df 91       	pop	r29
    f150:	cf 91       	pop	r28
    f152:	08 95       	ret

0000f154 <eeprom_switch_to_next_sheet()>:
#endif //DEBUG_EEPROM_CHANGES
}

void eeprom_switch_to_next_sheet()
{
    int8_t sheet = eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet));
    f154:	81 ea       	ldi	r24, 0xA1	; 161
    f156:	9d e0       	ldi	r25, 0x0D	; 13
    f158:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>

    sheet = eeprom_next_initialized_sheet(sheet);
    f15c:	0e 94 96 78 	call	0xf12c	; 0xf12c <eeprom_next_initialized_sheet(signed char)>
    if (sheet >= 0) eeprom_update_byte_notify(&(EEPROM_Sheets_base->active_sheet), sheet);
    f160:	87 fd       	sbrc	r24, 7
    f162:	05 c0       	rjmp	.+10     	; 0xf16e <eeprom_switch_to_next_sheet()+0x1a>
        if (previous_value != value) {
            eeprom_byte_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_byte(dst, value);
    f164:	68 2f       	mov	r22, r24
    f166:	81 ea       	ldi	r24, 0xA1	; 161
    f168:	9d e0       	ldi	r25, 0x0D	; 13
    f16a:	0d 94 04 a4 	jmp	0x34808	; 0x34808 <eeprom_update_byte>
{
    int8_t sheet = eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet));

    sheet = eeprom_next_initialized_sheet(sheet);
    if (sheet >= 0) eeprom_update_byte_notify(&(EEPROM_Sheets_base->active_sheet), sheet);
}
    f16e:	08 95       	ret

0000f170 <eeprom_default_sheet_name(unsigned char, SheetName&)>:
//! | 7     | Custom2   |
//!
//! @param[in] index
//! @param[out] sheetName
void eeprom_default_sheet_name(uint8_t index, SheetName &sheetName)
{
    f170:	0f 93       	push	r16
    f172:	1f 93       	push	r17
    f174:	cf 93       	push	r28
    f176:	c8 2f       	mov	r28, r24
    f178:	8b 01       	movw	r16, r22
    static_assert(8 == sizeof(SheetName),"Default sheet name needs to be adjusted.");

    if (index < 2)
    {
        strcpy_P(sheetName.c, PSTR("Smooth"));
    f17a:	60 e4       	ldi	r22, 0x40	; 64
    f17c:	74 e7       	ldi	r23, 0x74	; 116
//! @param[out] sheetName
void eeprom_default_sheet_name(uint8_t index, SheetName &sheetName)
{
    static_assert(8 == sizeof(SheetName),"Default sheet name needs to be adjusted.");

    if (index < 2)
    f17e:	82 30       	cpi	r24, 0x02	; 2
    f180:	70 f0       	brcs	.+28     	; 0xf19e <eeprom_default_sheet_name(unsigned char, SheetName&)+0x2e>
    {
        strcpy_P(sheetName.c, PSTR("Smooth"));
    }
    else if (index < 4)
    {
        strcpy_P(sheetName.c, PSTR("Textur"));
    f182:	69 e3       	ldi	r22, 0x39	; 57
    f184:	74 e7       	ldi	r23, 0x74	; 116

    if (index < 2)
    {
        strcpy_P(sheetName.c, PSTR("Smooth"));
    }
    else if (index < 4)
    f186:	84 30       	cpi	r24, 0x04	; 4
    f188:	50 f0       	brcs	.+20     	; 0xf19e <eeprom_default_sheet_name(unsigned char, SheetName&)+0x2e>
    {
        strcpy_P(sheetName.c, PSTR("Textur"));
    }
    else if (index < 5)
    {
        strcpy_P(sheetName.c, PSTR("Satin  "));
    f18a:	61 e3       	ldi	r22, 0x31	; 49
    f18c:	74 e7       	ldi	r23, 0x74	; 116
    }
    else if (index < 4)
    {
        strcpy_P(sheetName.c, PSTR("Textur"));
    }
    else if (index < 5)
    f18e:	84 30       	cpi	r24, 0x04	; 4
    f190:	31 f0       	breq	.+12     	; 0xf19e <eeprom_default_sheet_name(unsigned char, SheetName&)+0x2e>
    {
        strcpy_P(sheetName.c, PSTR("Satin  "));
    }
    else if (index < 6)
    {
        strcpy_P(sheetName.c, PSTR("NylonPA"));
    f192:	69 e2       	ldi	r22, 0x29	; 41
    f194:	74 e7       	ldi	r23, 0x74	; 116
    }
    else if (index < 5)
    {
        strcpy_P(sheetName.c, PSTR("Satin  "));
    }
    else if (index < 6)
    f196:	85 30       	cpi	r24, 0x05	; 5
    f198:	11 f0       	breq	.+4      	; 0xf19e <eeprom_default_sheet_name(unsigned char, SheetName&)+0x2e>
    {
        strcpy_P(sheetName.c, PSTR("NylonPA"));
    }
    else
    {
        strcpy_P(sheetName.c, PSTR("Custom"));
    f19a:	62 e2       	ldi	r22, 0x22	; 34
    f19c:	74 e7       	ldi	r23, 0x74	; 116
    f19e:	c8 01       	movw	r24, r16
    f1a0:	0f 94 97 a1 	call	0x3432e	; 0x3432e <strcpy_P>
    }
    if (index <4 || index >5)
    f1a4:	8c ef       	ldi	r24, 0xFC	; 252
    f1a6:	8c 0f       	add	r24, r28
    f1a8:	82 30       	cpi	r24, 0x02	; 2
    f1aa:	28 f0       	brcs	.+10     	; 0xf1b6 <eeprom_default_sheet_name(unsigned char, SheetName&)+0x46>
    {
        sheetName.c[6] = '0' + ((index % 2)+1);
    f1ac:	c1 70       	andi	r28, 0x01	; 1
    f1ae:	cf 5c       	subi	r28, 0xCF	; 207
    f1b0:	f8 01       	movw	r30, r16
    f1b2:	c6 83       	std	Z+6, r28	; 0x06
        sheetName.c[7] = '\0';
    f1b4:	17 82       	std	Z+7, r1	; 0x07
    }
}
    f1b6:	cf 91       	pop	r28
    f1b8:	1f 91       	pop	r17
    f1ba:	0f 91       	pop	r16
    f1bc:	08 95       	ret

0000f1be <eeprom_adjust_bed_reset()>:
        if (previous_value != value) {
            eeprom_byte_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_byte(dst, value);
    f1be:	61 e0       	ldi	r22, 0x01	; 1
    f1c0:	80 ec       	ldi	r24, 0xC0	; 192
    f1c2:	9f e0       	ldi	r25, 0x0F	; 15
    f1c4:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
    f1c8:	60 e0       	ldi	r22, 0x00	; 0
    f1ca:	8f eb       	ldi	r24, 0xBF	; 191
    f1cc:	9f e0       	ldi	r25, 0x0F	; 15
    f1ce:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
    f1d2:	60 e0       	ldi	r22, 0x00	; 0
    f1d4:	8e eb       	ldi	r24, 0xBE	; 190
    f1d6:	9f e0       	ldi	r25, 0x0F	; 15
    f1d8:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
    f1dc:	60 e0       	ldi	r22, 0x00	; 0
    f1de:	8d eb       	ldi	r24, 0xBD	; 189
    f1e0:	9f e0       	ldi	r25, 0x0F	; 15
    f1e2:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
    f1e6:	60 e0       	ldi	r22, 0x00	; 0
    f1e8:	8c eb       	ldi	r24, 0xBC	; 188
    f1ea:	9f e0       	ldi	r25, 0x0F	; 15
    f1ec:	0d 94 04 a4 	jmp	0x34808	; 0x34808 <eeprom_update_byte>

0000f1f0 <print_hex_byte(unsigned char)>:
{
	putchar((val > 9)?(val - 10 + 'a'):(val + '0'));
}

void print_hex_byte(uint8_t val)
{
    f1f0:	cf 93       	push	r28
    f1f2:	c8 2f       	mov	r28, r24
	print_hex_nibble(val >> 4);
    f1f4:	82 95       	swap	r24
    f1f6:	8f 70       	andi	r24, 0x0F	; 15
    f1f8:	0e 94 48 5d 	call	0xba90	; 0xba90 <print_hex_nibble(unsigned char)>
	print_hex_nibble(val & 15);
    f1fc:	8c 2f       	mov	r24, r28
    f1fe:	8f 70       	andi	r24, 0x0F	; 15
}
    f200:	cf 91       	pop	r28
}

void print_hex_byte(uint8_t val)
{
	print_hex_nibble(val >> 4);
	print_hex_nibble(val & 15);
    f202:	0c 94 48 5d 	jmp	0xba90	; 0xba90 <print_hex_nibble(unsigned char)>

0000f206 <cmdqueue_calc_sd_length()>:
  #endif //SDSUPPORT
}

uint16_t cmdqueue_calc_sd_length()
{
    if (buflen == 0)
    f206:	40 91 3c 12 	lds	r20, 0x123C	; 0x80123c <buflen>
    f20a:	50 91 3d 12 	lds	r21, 0x123D	; 0x80123d <buflen+0x1>
        return 0;
    f20e:	90 e0       	ldi	r25, 0x00	; 0
    f210:	80 e0       	ldi	r24, 0x00	; 0
  #endif //SDSUPPORT
}

uint16_t cmdqueue_calc_sd_length()
{
    if (buflen == 0)
    f212:	41 15       	cp	r20, r1
    f214:	51 05       	cpc	r21, r1
    f216:	b1 f1       	breq	.+108    	; 0xf284 <cmdqueue_calc_sd_length()+0x7e>
            char hi;
        } lohi;
        uint16_t value;
    } sdlen_single;
    uint16_t sdlen = 0;
    for (size_t _buflen = buflen, _bufindr = bufindr;;) {
    f218:	20 91 38 12 	lds	r18, 0x1238	; 0x801238 <bufindr>
    f21c:	30 91 39 12 	lds	r19, 0x1239	; 0x801239 <bufindr+0x1>
            char lo;
            char hi;
        } lohi;
        uint16_t value;
    } sdlen_single;
    uint16_t sdlen = 0;
    f220:	90 e0       	ldi	r25, 0x00	; 0
    f222:	80 e0       	ldi	r24, 0x00	; 0
    for (size_t _buflen = buflen, _bufindr = bufindr;;) {
        if (cmdbuffer[_bufindr] == CMDBUFFER_CURRENT_TYPE_SDCARD) {
    f224:	f9 01       	movw	r30, r18
    f226:	e5 5b       	subi	r30, 0xB5	; 181
    f228:	ff 4e       	sbci	r31, 0xEF	; 239
    f22a:	a0 81       	ld	r26, Z
    f22c:	a2 30       	cpi	r26, 0x02	; 2
    f22e:	21 f4       	brne	.+8      	; 0xf238 <cmdqueue_calc_sd_length()+0x32>
            sdlen_single.lohi.lo = cmdbuffer[_bufindr + 1];
    f230:	61 81       	ldd	r22, Z+1	; 0x01
            sdlen_single.lohi.hi = cmdbuffer[_bufindr + 2];
    f232:	72 81       	ldd	r23, Z+2	; 0x02
            sdlen += sdlen_single.value;
    f234:	86 0f       	add	r24, r22
    f236:	97 1f       	adc	r25, r23
        }
        if (-- _buflen == 0)
    f238:	41 50       	subi	r20, 0x01	; 1
    f23a:	51 09       	sbc	r21, r1
    f23c:	19 f1       	breq	.+70     	; 0xf284 <cmdqueue_calc_sd_length()+0x7e>
    f23e:	f9 01       	movw	r30, r18
    f240:	e2 5b       	subi	r30, 0xB2	; 178
    f242:	ff 4e       	sbci	r31, 0xEF	; 239
            break;
        // First skip the current command ID and iterate up to the end of the string.
        for (_bufindr += CMDHDRSIZE; cmdbuffer[_bufindr] != 0; ++ _bufindr) ;
    f244:	a1 91       	ld	r26, Z+
    f246:	9f 01       	movw	r18, r30
    f248:	2b 54       	subi	r18, 0x4B	; 75
    f24a:	30 41       	sbci	r19, 0x10	; 16
    f24c:	a1 11       	cpse	r26, r1
    f24e:	fa cf       	rjmp	.-12     	; 0xf244 <cmdqueue_calc_sd_length()+0x3e>
    f250:	f9 01       	movw	r30, r18
    f252:	e5 5b       	subi	r30, 0xB5	; 181
    f254:	ff 4e       	sbci	r31, 0xEF	; 239
        // Second, skip the end of string null character and iterate until a nonzero command ID is found.
        for (++ _bufindr; _bufindr < sizeof(cmdbuffer) && cmdbuffer[_bufindr] == 0; ++ _bufindr) ;
    f256:	2d 3e       	cpi	r18, 0xED	; 237
    f258:	a1 e0       	ldi	r26, 0x01	; 1
    f25a:	3a 07       	cpc	r19, r26
    f25c:	30 f4       	brcc	.+12     	; 0xf26a <cmdqueue_calc_sd_length()+0x64>
    f25e:	a1 91       	ld	r26, Z+
    f260:	a1 11       	cpse	r26, r1
    f262:	e0 cf       	rjmp	.-64     	; 0xf224 <cmdqueue_calc_sd_length()+0x1e>
    f264:	2f 5f       	subi	r18, 0xFF	; 255
    f266:	3f 4f       	sbci	r19, 0xFF	; 255
    f268:	f6 cf       	rjmp	.-20     	; 0xf256 <cmdqueue_calc_sd_length()+0x50>
        // If the end of the buffer was empty,
        if (_bufindr == sizeof(cmdbuffer)) {
    f26a:	2d 3e       	cpi	r18, 0xED	; 237
    f26c:	e1 e0       	ldi	r30, 0x01	; 1
    f26e:	3e 07       	cpc	r19, r30
    f270:	c9 f6       	brne	.-78     	; 0xf224 <cmdqueue_calc_sd_length()+0x1e>
    f272:	eb e4       	ldi	r30, 0x4B	; 75
    f274:	f0 e1       	ldi	r31, 0x10	; 16
    f276:	9f 01       	movw	r18, r30
    f278:	2b 54       	subi	r18, 0x4B	; 75
    f27a:	30 41       	sbci	r19, 0x10	; 16
            // skip to the start and find the nonzero command.
            for (_bufindr = 0; cmdbuffer[_bufindr] == 0; ++ _bufindr) ;
    f27c:	a1 91       	ld	r26, Z+
    f27e:	aa 23       	and	r26, r26
    f280:	d1 f3       	breq	.-12     	; 0xf276 <cmdqueue_calc_sd_length()+0x70>
    f282:	d0 cf       	rjmp	.-96     	; 0xf224 <cmdqueue_calc_sd_length()+0x1e>
        }
    }
    return sdlen;
}
    f284:	08 95       	ret

0000f286 <cmdqueue_pop_front()>:

// Pop the currently processed command from the queue.
// It is expected, that there is at least one command in the queue.
bool cmdqueue_pop_front()
{
    if (buflen > 0) {
    f286:	80 91 3c 12 	lds	r24, 0x123C	; 0x80123c <buflen>
    f28a:	90 91 3d 12 	lds	r25, 0x123D	; 0x80123d <buflen+0x1>
    f28e:	18 16       	cp	r1, r24
    f290:	19 06       	cpc	r1, r25
    f292:	0c f0       	brlt	.+2      	; 0xf296 <cmdqueue_pop_front()+0x10>
    f294:	43 c0       	rjmp	.+134    	; 0xf31c <cmdqueue_pop_front()+0x96>
        SERIAL_ECHO(serial_count);
        SERIAL_ECHOPGM(", bufsize ");
        SERIAL_ECHO(sizeof(cmdbuffer));
        SERIAL_ECHOLNPGM("");
#endif /* CMDBUFFER_DEBUG */
        if (-- buflen == 0) {
    f296:	01 97       	sbiw	r24, 0x01	; 1
    f298:	90 93 3d 12 	sts	0x123D, r25	; 0x80123d <buflen+0x1>
    f29c:	80 93 3c 12 	sts	0x123C, r24	; 0x80123c <buflen>
    f2a0:	89 2b       	or	r24, r25
    f2a2:	a1 f4       	brne	.+40     	; 0xf2cc <cmdqueue_pop_front()+0x46>
            // Empty buffer.
            if (serial_count == 0)
    f2a4:	80 91 47 10 	lds	r24, 0x1047	; 0x801047 <serial_count>
    f2a8:	90 91 48 10 	lds	r25, 0x1048	; 0x801048 <serial_count+0x1>
    f2ac:	89 2b       	or	r24, r25
    f2ae:	21 f4       	brne	.+8      	; 0xf2b8 <cmdqueue_pop_front()+0x32>
                // No serial communication is pending. Reset both pointers to zero.
                bufindw = 0;
    f2b0:	10 92 4a 10 	sts	0x104A, r1	; 0x80104a <_ZL7bufindw.lto_priv.514+0x1>
    f2b4:	10 92 49 10 	sts	0x1049, r1	; 0x801049 <_ZL7bufindw.lto_priv.514>
            bufindr = bufindw;
    f2b8:	80 91 49 10 	lds	r24, 0x1049	; 0x801049 <_ZL7bufindw.lto_priv.514>
    f2bc:	90 91 4a 10 	lds	r25, 0x104A	; 0x80104a <_ZL7bufindw.lto_priv.514+0x1>
    f2c0:	90 93 39 12 	sts	0x1239, r25	; 0x801239 <bufindr+0x1>
    f2c4:	80 93 38 12 	sts	0x1238, r24	; 0x801238 <bufindr>
            SERIAL_ECHOPGM(" new command on the top: ");
            SERIAL_ECHO(cmdbuffer+bufindr+CMDHDRSIZE);
            SERIAL_ECHOLNPGM("");
#endif /* CMDBUFFER_DEBUG */
        }
        return true;
    f2c8:	81 e0       	ldi	r24, 0x01	; 1
    f2ca:	08 95       	ret
                bufindw = 0;
            bufindr = bufindw;
        } else {
            // There is at least one ready line in the buffer.
            // First skip the current command ID and iterate up to the end of the string.
            for (bufindr += CMDHDRSIZE; cmdbuffer[bufindr] != 0; ++ bufindr) ;
    f2cc:	80 91 38 12 	lds	r24, 0x1238	; 0x801238 <bufindr>
    f2d0:	90 91 39 12 	lds	r25, 0x1239	; 0x801239 <bufindr+0x1>
    f2d4:	03 96       	adiw	r24, 0x03	; 3
    f2d6:	fc 01       	movw	r30, r24
    f2d8:	e5 5b       	subi	r30, 0xB5	; 181
    f2da:	ff 4e       	sbci	r31, 0xEF	; 239
    f2dc:	20 81       	ld	r18, Z
    f2de:	01 96       	adiw	r24, 0x01	; 1
    f2e0:	21 11       	cpse	r18, r1
    f2e2:	f9 cf       	rjmp	.-14     	; 0xf2d6 <cmdqueue_pop_front()+0x50>
    f2e4:	fc 01       	movw	r30, r24
    f2e6:	e5 5b       	subi	r30, 0xB5	; 181
    f2e8:	ff 4e       	sbci	r31, 0xEF	; 239
            // Second, skip the end of string null character and iterate until a nonzero command ID is found.
            for (++ bufindr; bufindr < sizeof(cmdbuffer) && cmdbuffer[bufindr] == 0; ++ bufindr) ;
    f2ea:	8d 3e       	cpi	r24, 0xED	; 237
    f2ec:	21 e0       	ldi	r18, 0x01	; 1
    f2ee:	92 07       	cpc	r25, r18
    f2f0:	40 f4       	brcc	.+16     	; 0xf302 <cmdqueue_pop_front()+0x7c>
    f2f2:	41 91       	ld	r20, Z+
    f2f4:	9c 01       	movw	r18, r24
    f2f6:	2f 5f       	subi	r18, 0xFF	; 255
    f2f8:	3f 4f       	sbci	r19, 0xFF	; 255
    f2fa:	41 11       	cpse	r20, r1
    f2fc:	e1 cf       	rjmp	.-62     	; 0xf2c0 <cmdqueue_pop_front()+0x3a>
    f2fe:	c9 01       	movw	r24, r18
    f300:	f4 cf       	rjmp	.-24     	; 0xf2ea <cmdqueue_pop_front()+0x64>
            // If the end of the buffer was empty,
            if (bufindr == sizeof(cmdbuffer)) {
    f302:	eb e4       	ldi	r30, 0x4B	; 75
    f304:	f0 e1       	ldi	r31, 0x10	; 16
    f306:	8d 3e       	cpi	r24, 0xED	; 237
    f308:	21 e0       	ldi	r18, 0x01	; 1
    f30a:	92 07       	cpc	r25, r18
    f30c:	c9 f6       	brne	.-78     	; 0xf2c0 <cmdqueue_pop_front()+0x3a>
    f30e:	cf 01       	movw	r24, r30
    f310:	8b 54       	subi	r24, 0x4B	; 75
    f312:	90 41       	sbci	r25, 0x10	; 16
                // skip to the start and find the nonzero command.
                for (bufindr = 0; cmdbuffer[bufindr] == 0; ++ bufindr) ;
    f314:	21 91       	ld	r18, Z+
    f316:	22 23       	and	r18, r18
    f318:	d1 f3       	breq	.-12     	; 0xf30e <cmdqueue_pop_front()+0x88>
    f31a:	d2 cf       	rjmp	.-92     	; 0xf2c0 <cmdqueue_pop_front()+0x3a>
            SERIAL_ECHOLNPGM("");
#endif /* CMDBUFFER_DEBUG */
        }
        return true;
    }
    return false;
    f31c:	80 e0       	ldi	r24, 0x00	; 0
}
    f31e:	08 95       	ret

0000f320 <createFilename(char*, directoryEntry const&)>:
  autostart_atmillis.start(); // reset timer
}

char *createFilename(char *buffer,const dir_t &p) //buffer>12characters
{
  char *pos=buffer;
    f320:	fc 01       	movw	r30, r24
  for (uint8_t i = 0; i < 11; i++)
    f322:	20 e0       	ldi	r18, 0x00	; 0
  {
    if (p.name[i] == ' ')continue;
    if (i == 8)
    {
      *pos++='.';
    f324:	3e e2       	ldi	r19, 0x2E	; 46
char *createFilename(char *buffer,const dir_t &p) //buffer>12characters
{
  char *pos=buffer;
  for (uint8_t i = 0; i < 11; i++)
  {
    if (p.name[i] == ' ')continue;
    f326:	db 01       	movw	r26, r22
    f328:	4d 91       	ld	r20, X+
    f32a:	bd 01       	movw	r22, r26
    f32c:	40 32       	cpi	r20, 0x20	; 32
    f32e:	49 f0       	breq	.+18     	; 0xf342 <createFilename(char*, directoryEntry const&)+0x22>
    if (i == 8)
    f330:	28 30       	cpi	r18, 0x08	; 8
    f332:	11 f4       	brne	.+4      	; 0xf338 <createFilename(char*, directoryEntry const&)+0x18>
    {
      *pos++='.';
    f334:	30 83       	st	Z, r19
    f336:	31 96       	adiw	r30, 0x01	; 1
    }
    *pos++=p.name[i];
    f338:	db 01       	movw	r26, r22
    f33a:	11 97       	sbiw	r26, 0x01	; 1
    f33c:	4c 91       	ld	r20, X
    f33e:	40 83       	st	Z, r20
    f340:	31 96       	adiw	r30, 0x01	; 1
}

char *createFilename(char *buffer,const dir_t &p) //buffer>12characters
{
  char *pos=buffer;
  for (uint8_t i = 0; i < 11; i++)
    f342:	2f 5f       	subi	r18, 0xFF	; 255
    f344:	2b 30       	cpi	r18, 0x0B	; 11
    f346:	79 f7       	brne	.-34     	; 0xf326 <createFilename(char*, directoryEntry const&)+0x6>
    {
      *pos++='.';
    }
    *pos++=p.name[i];
  }
  *pos++=0;
    f348:	10 82       	st	Z, r1
  return buffer;
}
    f34a:	08 95       	ret

0000f34c <SdBaseFile::rewind()>:
public:
  int8_t readDir(dir_t* dir, char* longFilename);
  static bool remove(SdBaseFile* dirFile, const char* path);
  bool remove();
  /** Set the file's current position to zero. */
  void rewind() {seekSet(0);}
    f34c:	40 e0       	ldi	r20, 0x00	; 0
    f34e:	50 e0       	ldi	r21, 0x00	; 0
    f350:	ba 01       	movw	r22, r20
    f352:	0d 94 0b 2d 	jmp	0x25a16	; 0x25a16 <SdBaseFile::seekSet(unsigned long)>

0000f356 <SdBaseFile::~SdBaseFile()>:
class SdBaseFile {
 public:
  /** Create an instance. */
  SdBaseFile() : writeError(false), type_(FAT_FILE_TYPE_CLOSED) {}
  SdBaseFile(const char* path, uint8_t oflag);
  ~SdBaseFile() {if(isOpen()) close();}
    f356:	fc 01       	movw	r30, r24
    f358:	23 81       	ldd	r18, Z+3	; 0x03
    f35a:	21 11       	cpse	r18, r1
    f35c:	0d 94 e9 2e 	jmp	0x25dd2	; 0x25dd2 <SdBaseFile::close()>
    f360:	08 95       	ret

0000f362 <MarlinSerial::write(unsigned char)>:
      M_UDRx = c;
    }
    */
	static void write(uint8_t c)
	{
		if (selectedSerialPort == 0)
    f362:	90 91 1c 06 	lds	r25, 0x061C	; 0x80061c <selectedSerialPort>
    f366:	91 11       	cpse	r25, r1
    f368:	07 c0       	rjmp	.+14     	; 0xf378 <MarlinSerial::write(unsigned char)+0x16>
		{
			while (!((M_UCSRxA) & (1 << M_UDREx)));
    f36a:	90 91 c0 00 	lds	r25, 0x00C0	; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7c20c0>
    f36e:	95 ff       	sbrs	r25, 5
    f370:	fc cf       	rjmp	.-8      	; 0xf36a <MarlinSerial::write(unsigned char)+0x8>
			M_UDRx = c;
    f372:	80 93 c6 00 	sts	0x00C6, r24	; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7c20c6>
    f376:	08 95       	ret
		}
		else if (selectedSerialPort == 1)
    f378:	91 30       	cpi	r25, 0x01	; 1
    f37a:	31 f4       	brne	.+12     	; 0xf388 <MarlinSerial::write(unsigned char)+0x26>
		{
			while (!((UCSR1A) & (1 << UDRE1)));
    f37c:	90 91 c8 00 	lds	r25, 0x00C8	; 0x8000c8 <__TEXT_REGION_LENGTH__+0x7c20c8>
    f380:	95 ff       	sbrs	r25, 5
    f382:	fc cf       	rjmp	.-8      	; 0xf37c <MarlinSerial::write(unsigned char)+0x1a>
			UDR1 = c;
    f384:	80 93 ce 00 	sts	0x00CE, r24	; 0x8000ce <__TEXT_REGION_LENGTH__+0x7c20ce>
		}
	}
    f388:	08 95       	ret

0000f38a <MarlinSerial::printNumber(unsigned long, unsigned char)>:
}

// Private Methods /////////////////////////////////////////////////////////////

void MarlinSerial::printNumber(unsigned long n, uint8_t base)
{
    f38a:	8f 92       	push	r8
    f38c:	9f 92       	push	r9
    f38e:	af 92       	push	r10
    f390:	bf 92       	push	r11
    f392:	ef 92       	push	r14
    f394:	ff 92       	push	r15
    f396:	0f 93       	push	r16
    f398:	1f 93       	push	r17
    f39a:	cf 93       	push	r28
    f39c:	df 93       	push	r29
    f39e:	cd b7       	in	r28, 0x3d	; 61
    f3a0:	de b7       	in	r29, 0x3e	; 62
    f3a2:	a0 97       	sbiw	r28, 0x20	; 32
    f3a4:	0f b6       	in	r0, 0x3f	; 63
    f3a6:	f8 94       	cli
    f3a8:	de bf       	out	0x3e, r29	; 62
    f3aa:	0f be       	out	0x3f, r0	; 63
    f3ac:	cd bf       	out	0x3d, r28	; 61
  unsigned char buf[8 * sizeof(long)]; // Assumes 8-bit chars.
  uint8_t i = 0;

  if (n == 0) {
    f3ae:	61 15       	cp	r22, r1
    f3b0:	71 05       	cpc	r23, r1
    f3b2:	81 05       	cpc	r24, r1
    f3b4:	91 05       	cpc	r25, r1
    f3b6:	99 f4       	brne	.+38     	; 0xf3de <MarlinSerial::printNumber(unsigned long, unsigned char)+0x54>
}

void MarlinSerial::print(long n, int base)
{
  if (base == 0) {
    write(n);
    f3b8:	80 e3       	ldi	r24, 0x30	; 48

  for (; i > 0; i--)
    print((char) (buf[i - 1] < 10 ?
      '0' + buf[i - 1] :
      'A' + buf[i - 1] - 10));
}
    f3ba:	a0 96       	adiw	r28, 0x20	; 32
    f3bc:	0f b6       	in	r0, 0x3f	; 63
    f3be:	f8 94       	cli
    f3c0:	de bf       	out	0x3e, r29	; 62
    f3c2:	0f be       	out	0x3f, r0	; 63
    f3c4:	cd bf       	out	0x3d, r28	; 61
    f3c6:	df 91       	pop	r29
    f3c8:	cf 91       	pop	r28
    f3ca:	1f 91       	pop	r17
    f3cc:	0f 91       	pop	r16
    f3ce:	ff 90       	pop	r15
    f3d0:	ef 90       	pop	r14
    f3d2:	bf 90       	pop	r11
    f3d4:	af 90       	pop	r10
    f3d6:	9f 90       	pop	r9
    f3d8:	8f 90       	pop	r8
}

void MarlinSerial::print(long n, int base)
{
  if (base == 0) {
    write(n);
    f3da:	0c 94 b1 79 	jmp	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
// Private Methods /////////////////////////////////////////////////////////////

void MarlinSerial::printNumber(unsigned long n, uint8_t base)
{
  unsigned char buf[8 * sizeof(long)]; // Assumes 8-bit chars.
  uint8_t i = 0;
    f3de:	00 e0       	ldi	r16, 0x00	; 0
    print('0');
    return;
  }

  while (n > 0) {
    buf[i++] = n % base;
    f3e0:	84 2e       	mov	r8, r20
    f3e2:	91 2c       	mov	r9, r1
    f3e4:	b1 2c       	mov	r11, r1
    f3e6:	a1 2c       	mov	r10, r1
    f3e8:	9e 01       	movw	r18, r28
    f3ea:	2f 5f       	subi	r18, 0xFF	; 255
    f3ec:	3f 4f       	sbci	r19, 0xFF	; 255
    f3ee:	79 01       	movw	r14, r18
    f3f0:	a5 01       	movw	r20, r10
    f3f2:	94 01       	movw	r18, r8
    f3f4:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
    f3f8:	f7 01       	movw	r30, r14
    f3fa:	e0 0f       	add	r30, r16
    f3fc:	f1 1d       	adc	r31, r1
    f3fe:	60 83       	st	Z, r22
    n /= base;
    f400:	b9 01       	movw	r22, r18
    f402:	ca 01       	movw	r24, r20
    print('0');
    return;
  }

  while (n > 0) {
    buf[i++] = n % base;
    f404:	0f 5f       	subi	r16, 0xFF	; 255
  if (n == 0) {
    print('0');
    return;
  }

  while (n > 0) {
    f406:	61 15       	cp	r22, r1
    f408:	71 05       	cpc	r23, r1
    f40a:	81 05       	cpc	r24, r1
    f40c:	91 05       	cpc	r25, r1
    f40e:	81 f7       	brne	.-32     	; 0xf3f0 <MarlinSerial::printNumber(unsigned long, unsigned char)+0x66>
    f410:	0e 0d       	add	r16, r14
    f412:	1f 2d       	mov	r17, r15
    f414:	11 1d       	adc	r17, r1
    buf[i++] = n % base;
    n /= base;
  }

  for (; i > 0; i--)
    f416:	e0 16       	cp	r14, r16
    f418:	f1 06       	cpc	r15, r17
    f41a:	59 f0       	breq	.+22     	; 0xf432 <MarlinSerial::printNumber(unsigned long, unsigned char)+0xa8>
    print((char) (buf[i - 1] < 10 ?
    f41c:	f8 01       	movw	r30, r16
    f41e:	82 91       	ld	r24, -Z
    f420:	8f 01       	movw	r16, r30
    f422:	8a 30       	cpi	r24, 0x0A	; 10
    f424:	20 f4       	brcc	.+8      	; 0xf42e <MarlinSerial::printNumber(unsigned long, unsigned char)+0xa4>
      '0' + buf[i - 1] :
    f426:	80 5d       	subi	r24, 0xD0	; 208
}

void MarlinSerial::print(long n, int base)
{
  if (base == 0) {
    write(n);
    f428:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
    f42c:	f4 cf       	rjmp	.-24     	; 0xf416 <MarlinSerial::printNumber(unsigned long, unsigned char)+0x8c>
  }

  for (; i > 0; i--)
    print((char) (buf[i - 1] < 10 ?
      '0' + buf[i - 1] :
      'A' + buf[i - 1] - 10));
    f42e:	89 5c       	subi	r24, 0xC9	; 201
    f430:	fb cf       	rjmp	.-10     	; 0xf428 <MarlinSerial::printNumber(unsigned long, unsigned char)+0x9e>
}
    f432:	a0 96       	adiw	r28, 0x20	; 32
    f434:	0f b6       	in	r0, 0x3f	; 63
    f436:	f8 94       	cli
    f438:	de bf       	out	0x3e, r29	; 62
    f43a:	0f be       	out	0x3f, r0	; 63
    f43c:	cd bf       	out	0x3d, r28	; 61
    f43e:	df 91       	pop	r29
    f440:	cf 91       	pop	r28
    f442:	1f 91       	pop	r17
    f444:	0f 91       	pop	r16
    f446:	ff 90       	pop	r15
    f448:	ef 90       	pop	r14
    f44a:	bf 90       	pop	r11
    f44c:	af 90       	pop	r10
    f44e:	9f 90       	pop	r9
    f450:	8f 90       	pop	r8
    f452:	08 95       	ret

0000f454 <MarlinSerial::print(long, int) [clone .part.1]>:
void MarlinSerial::print(unsigned int n, int base)
{
  print((unsigned long) n, base);
}

void MarlinSerial::print(long n, int base)
    f454:	cf 92       	push	r12
    f456:	df 92       	push	r13
    f458:	ef 92       	push	r14
    f45a:	ff 92       	push	r15
    f45c:	6b 01       	movw	r12, r22
    f45e:	7c 01       	movw	r14, r24
{
  if (base == 0) {
    write(n);
  } else if (base == 10) {
    if (n < 0) {
    f460:	f7 fe       	sbrs	r15, 7
    f462:	0b c0       	rjmp	.+22     	; 0xf47a <MarlinSerial::print(long, int) [clone .part.1]+0x26>
}

void MarlinSerial::print(long n, int base)
{
  if (base == 0) {
    write(n);
    f464:	8d e2       	ldi	r24, 0x2D	; 45
    f466:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
  } else if (base == 10) {
    if (n < 0) {
      print('-');
      n = -n;
    f46a:	f0 94       	com	r15
    f46c:	e0 94       	com	r14
    f46e:	d0 94       	com	r13
    f470:	c0 94       	com	r12
    f472:	c1 1c       	adc	r12, r1
    f474:	d1 1c       	adc	r13, r1
    f476:	e1 1c       	adc	r14, r1
    f478:	f1 1c       	adc	r15, r1
    }
    printNumber(n, 10);
    f47a:	4a e0       	ldi	r20, 0x0A	; 10
    f47c:	c7 01       	movw	r24, r14
    f47e:	b6 01       	movw	r22, r12
  } else {
    printNumber(n, base);
  }
}
    f480:	ff 90       	pop	r15
    f482:	ef 90       	pop	r14
    f484:	df 90       	pop	r13
    f486:	cf 90       	pop	r12
  } else if (base == 10) {
    if (n < 0) {
      print('-');
      n = -n;
    }
    printNumber(n, 10);
    f488:	0c 94 c5 79 	jmp	0xf38a	; 0xf38a <MarlinSerial::printNumber(unsigned long, unsigned char)>

0000f48c <MarlinSerial::printFloat(double, unsigned char)>:
      '0' + buf[i - 1] :
      'A' + buf[i - 1] - 10));
}

void MarlinSerial::printFloat(double number, uint8_t digits)
{
    f48c:	8f 92       	push	r8
    f48e:	9f 92       	push	r9
    f490:	af 92       	push	r10
    f492:	bf 92       	push	r11
    f494:	cf 92       	push	r12
    f496:	df 92       	push	r13
    f498:	ef 92       	push	r14
    f49a:	ff 92       	push	r15
    f49c:	cf 93       	push	r28
    f49e:	6b 01       	movw	r12, r22
    f4a0:	7c 01       	movw	r14, r24
    f4a2:	b4 2e       	mov	r11, r20
  // Handle negative numbers
  if (number < 0.0)
    f4a4:	20 e0       	ldi	r18, 0x00	; 0
    f4a6:	30 e0       	ldi	r19, 0x00	; 0
    f4a8:	a9 01       	movw	r20, r18
    f4aa:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
    f4ae:	87 ff       	sbrs	r24, 7
    f4b0:	07 c0       	rjmp	.+14     	; 0xf4c0 <MarlinSerial::printFloat(double, unsigned char)+0x34>
}

void MarlinSerial::print(long n, int base)
{
  if (base == 0) {
    write(n);
    f4b2:	8d e2       	ldi	r24, 0x2D	; 45
    f4b4:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
{
  // Handle negative numbers
  if (number < 0.0)
  {
     print('-');
     number = -number;
    f4b8:	f7 fa       	bst	r15, 7
    f4ba:	f0 94       	com	r15
    f4bc:	f7 f8       	bld	r15, 7
    f4be:	f0 94       	com	r15
  }

  // Round correctly so that print(1.999, 2) prints as "2.00"
  double rounding = 0.5;
  for (uint8_t i=0; i<digits; ++i)
    f4c0:	c0 e0       	ldi	r28, 0x00	; 0
     print('-');
     number = -number;
  }

  // Round correctly so that print(1.999, 2) prints as "2.00"
  double rounding = 0.5;
    f4c2:	60 e0       	ldi	r22, 0x00	; 0
    f4c4:	70 e0       	ldi	r23, 0x00	; 0
    f4c6:	80 e0       	ldi	r24, 0x00	; 0
    f4c8:	9f e3       	ldi	r25, 0x3F	; 63
  for (uint8_t i=0; i<digits; ++i)
    f4ca:	cb 15       	cp	r28, r11
    f4cc:	41 f0       	breq	.+16     	; 0xf4de <MarlinSerial::printFloat(double, unsigned char)+0x52>
    rounding /= 10.0;
    f4ce:	20 e0       	ldi	r18, 0x00	; 0
    f4d0:	30 e0       	ldi	r19, 0x00	; 0
    f4d2:	40 e2       	ldi	r20, 0x20	; 32
    f4d4:	51 e4       	ldi	r21, 0x41	; 65
    f4d6:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
     number = -number;
  }

  // Round correctly so that print(1.999, 2) prints as "2.00"
  double rounding = 0.5;
  for (uint8_t i=0; i<digits; ++i)
    f4da:	cf 5f       	subi	r28, 0xFF	; 255
    f4dc:	f6 cf       	rjmp	.-20     	; 0xf4ca <MarlinSerial::printFloat(double, unsigned char)+0x3e>
    rounding /= 10.0;

  number += rounding;
    f4de:	9b 01       	movw	r18, r22
    f4e0:	ac 01       	movw	r20, r24
    f4e2:	c7 01       	movw	r24, r14
    f4e4:	b6 01       	movw	r22, r12
    f4e6:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    f4ea:	6b 01       	movw	r12, r22
    f4ec:	7c 01       	movw	r14, r24

  // Extract the integer part of the number and print it
  unsigned long int_part = (unsigned long)number;
    f4ee:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
    f4f2:	4b 01       	movw	r8, r22
    f4f4:	5c 01       	movw	r10, r24
}

void MarlinSerial::print(unsigned long n, int base)
{
  if (base == 0) write(n);
  else printNumber(n, base);
    f4f6:	4a e0       	ldi	r20, 0x0A	; 10
    f4f8:	0e 94 c5 79 	call	0xf38a	; 0xf38a <MarlinSerial::printNumber(unsigned long, unsigned char)>
  unsigned long int_part = (unsigned long)number;
  double remainder = number - (double)int_part;
  print(int_part);

  // Print the decimal point, but only if there are digits beyond
  if (digits > 0)
    f4fc:	cc 23       	and	r28, r28
    f4fe:	91 f1       	breq	.+100    	; 0xf564 <MarlinSerial::printFloat(double, unsigned char)+0xd8>

  number += rounding;

  // Extract the integer part of the number and print it
  unsigned long int_part = (unsigned long)number;
  double remainder = number - (double)int_part;
    f500:	c5 01       	movw	r24, r10
    f502:	b4 01       	movw	r22, r8
    f504:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
    f508:	9b 01       	movw	r18, r22
    f50a:	ac 01       	movw	r20, r24
    f50c:	c7 01       	movw	r24, r14
    f50e:	b6 01       	movw	r22, r12
    f510:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    f514:	6b 01       	movw	r12, r22
    f516:	7c 01       	movw	r14, r24
}

void MarlinSerial::print(long n, int base)
{
  if (base == 0) {
    write(n);
    f518:	8e e2       	ldi	r24, 0x2E	; 46
    f51a:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
  // Print the decimal point, but only if there are digits beyond
  if (digits > 0)
    print('.');

  // Extract digits from the remainder one at a time
  while (digits-- > 0)
    f51e:	c1 50       	subi	r28, 0x01	; 1
    f520:	08 f1       	brcs	.+66     	; 0xf564 <MarlinSerial::printFloat(double, unsigned char)+0xd8>
  {
    remainder *= 10.0;
    f522:	20 e0       	ldi	r18, 0x00	; 0
    f524:	30 e0       	ldi	r19, 0x00	; 0
    f526:	40 e2       	ldi	r20, 0x20	; 32
    f528:	51 e4       	ldi	r21, 0x41	; 65
    f52a:	c7 01       	movw	r24, r14
    f52c:	b6 01       	movw	r22, r12
    f52e:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    f532:	4b 01       	movw	r8, r22
    f534:	5c 01       	movw	r10, r24
    int toPrint = int(remainder);
    f536:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
  print((unsigned long) b, base);
}

void MarlinSerial::print(int n, int base)
{
  print((long) n, base);
    f53a:	6b 01       	movw	r12, r22
    f53c:	77 0f       	add	r23, r23
    f53e:	ee 08       	sbc	r14, r14
    f540:	ff 08       	sbc	r15, r15
    f542:	c7 01       	movw	r24, r14
    f544:	b6 01       	movw	r22, r12
    f546:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
  while (digits-- > 0)
  {
    remainder *= 10.0;
    int toPrint = int(remainder);
    print(toPrint);
    remainder -= toPrint;
    f54a:	c7 01       	movw	r24, r14
    f54c:	b6 01       	movw	r22, r12
    f54e:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
    f552:	9b 01       	movw	r18, r22
    f554:	ac 01       	movw	r20, r24
    f556:	c5 01       	movw	r24, r10
    f558:	b4 01       	movw	r22, r8
    f55a:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    f55e:	6b 01       	movw	r12, r22
    f560:	7c 01       	movw	r14, r24
    f562:	dd cf       	rjmp	.-70     	; 0xf51e <MarlinSerial::printFloat(double, unsigned char)+0x92>
  }
}
    f564:	cf 91       	pop	r28
    f566:	ff 90       	pop	r15
    f568:	ef 90       	pop	r14
    f56a:	df 90       	pop	r13
    f56c:	cf 90       	pop	r12
    f56e:	bf 90       	pop	r11
    f570:	af 90       	pop	r10
    f572:	9f 90       	pop	r9
    f574:	8f 90       	pop	r8
    f576:	08 95       	ret

0000f578 <MarlinSerial::println()>:
}

void MarlinSerial::print(long n, int base)
{
  if (base == 0) {
    write(n);
    f578:	8a e0       	ldi	r24, 0x0A	; 10
    f57a:	0c 94 b1 79 	jmp	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>

0000f57e <uart_putchar(char, __file*)>:
static FILE _uartout;
#define uartout (&_uartout)

int uart_putchar(char c, FILE *)
{
	MYSERIAL.write(c);
    f57e:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
	return 0;
}
    f582:	90 e0       	ldi	r25, 0x00	; 0
    f584:	80 e0       	ldi	r24, 0x00	; 0
    f586:	08 95       	ret

0000f588 <serialprintPGM(char const*)>:
void serial_echopair_P(const char *s_P, double v)
    { serialprintPGM(s_P); SERIAL_ECHO(v); }
void serial_echopair_P(const char *s_P, unsigned long v)
    { serialprintPGM(s_P); SERIAL_ECHO(v); }

void serialprintPGM(const char *str) {
    f588:	cf 93       	push	r28
    f58a:	df 93       	push	r29
    f58c:	ec 01       	movw	r28, r24
    while(uint8_t ch = pgm_read_byte(str)) {
    f58e:	fe 01       	movw	r30, r28
    f590:	84 91       	lpm	r24, Z
    f592:	88 23       	and	r24, r24
    f594:	21 f0       	breq	.+8      	; 0xf59e <serialprintPGM(char const*)+0x16>
        MYSERIAL.write((char)ch);
    f596:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
        ++str;
    f59a:	21 96       	adiw	r28, 0x01	; 1
    f59c:	f8 cf       	rjmp	.-16     	; 0xf58e <serialprintPGM(char const*)+0x6>
    }
}
    f59e:	df 91       	pop	r29
    f5a0:	cf 91       	pop	r28
    f5a2:	08 95       	ret

0000f5a4 <serialecho_temperatures()>:
        // Turn off the print fan
        fanSpeed = 0;
    }
}

void serialecho_temperatures() {
    f5a4:	cf 92       	push	r12
    f5a6:	df 92       	push	r13
    f5a8:	ef 92       	push	r14
    f5aa:	ff 92       	push	r15
//inline so that there is no performance decrease.
//deg=degreeCelsius

// Doesn't save FLASH when FORCE_INLINE removed.
FORCE_INLINE float degHotend(uint8_t extruder) {
  return current_temperature[extruder];
    f5ac:	c0 90 5a 0d 	lds	r12, 0x0D5A	; 0x800d5a <current_temperature>
    f5b0:	d0 90 5b 0d 	lds	r13, 0x0D5B	; 0x800d5b <current_temperature+0x1>
    f5b4:	e0 90 5c 0d 	lds	r14, 0x0D5C	; 0x800d5c <current_temperature+0x2>
    f5b8:	f0 90 5d 0d 	lds	r15, 0x0D5D	; 0x800d5d <current_temperature+0x3>
	float tt = degHotend(active_extruder);
	SERIAL_PROTOCOLPGM("T:");
    f5bc:	83 e9       	ldi	r24, 0x93	; 147
    f5be:	98 e7       	ldi	r25, 0x78	; 120
    f5c0:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
  else printNumber(n, base);
}

void MarlinSerial::print(double n, int digits)
{
  printFloat(n, digits);
    f5c4:	42 e0       	ldi	r20, 0x02	; 2
    f5c6:	c7 01       	movw	r24, r14
    f5c8:	b6 01       	movw	r22, r12
    f5ca:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
	SERIAL_PROTOCOL(tt);
	SERIAL_PROTOCOLPGM(" E:0 B:");
    f5ce:	8b e8       	ldi	r24, 0x8B	; 139
    f5d0:	98 e7       	ldi	r25, 0x78	; 120
    f5d2:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    f5d6:	60 91 bc 03 	lds	r22, 0x03BC	; 0x8003bc <current_temperature_bed>
    f5da:	70 91 bd 03 	lds	r23, 0x03BD	; 0x8003bd <current_temperature_bed+0x1>
    f5de:	80 91 be 03 	lds	r24, 0x03BE	; 0x8003be <current_temperature_bed+0x2>
    f5e2:	90 91 bf 03 	lds	r25, 0x03BF	; 0x8003bf <current_temperature_bed+0x3>
    f5e6:	41 e0       	ldi	r20, 0x01	; 1
    f5e8:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
	SERIAL_PROTOCOL_F(degBed(), 1);
	SERIAL_PROTOCOLLN();
}
    f5ec:	ff 90       	pop	r15
    f5ee:	ef 90       	pop	r14
    f5f0:	df 90       	pop	r13
    f5f2:	cf 90       	pop	r12
	float tt = degHotend(active_extruder);
	SERIAL_PROTOCOLPGM("T:");
	SERIAL_PROTOCOL(tt);
	SERIAL_PROTOCOLPGM(" E:0 B:");
	SERIAL_PROTOCOL_F(degBed(), 1);
	SERIAL_PROTOCOLLN();
    f5f4:	0c 94 bc 7a 	jmp	0xf578	; 0xf578 <MarlinSerial::println()>

0000f5f8 <gcode_M861_print_pinda_cal_eeprom()>:
    }
}

/// @brief Helper function to reduce code size in M861
/// by extracting common code into one function
static void gcode_M861_print_pinda_cal_eeprom() {
    f5f8:	4f 92       	push	r4
    f5fa:	5f 92       	push	r5
    f5fc:	6f 92       	push	r6
    f5fe:	7f 92       	push	r7
    f600:	8f 92       	push	r8
    f602:	9f 92       	push	r9
    f604:	af 92       	push	r10
    f606:	bf 92       	push	r11
    f608:	cf 92       	push	r12
    f60a:	df 92       	push	r13
    f60c:	ef 92       	push	r14
    f60e:	ff 92       	push	r15
    f610:	0f 93       	push	r16
    f612:	1f 93       	push	r17
    f614:	cf 93       	push	r28
    f616:	df 93       	push	r29
    f618:	cc 24       	eor	r12, r12
    f61a:	ca 94       	dec	r12
    f61c:	dc 2c       	mov	r13, r12
    f61e:	76 01       	movw	r14, r12
    f620:	0e ea       	ldi	r16, 0xAE	; 174
    f622:	1f e0       	ldi	r17, 0x0F	; 15
    f624:	93 e2       	ldi	r25, 0x23	; 35
    f626:	89 2e       	mov	r8, r25
    f628:	91 2c       	mov	r9, r1
    f62a:	a1 2c       	mov	r10, r1
    f62c:	b1 2c       	mov	r11, r1
    int16_t usteps = 0;
    float mm = 0;
    f62e:	41 2c       	mov	r4, r1
    f630:	51 2c       	mov	r5, r1
    f632:	32 01       	movw	r6, r4
}

/// @brief Helper function to reduce code size in M861
/// by extracting common code into one function
static void gcode_M861_print_pinda_cal_eeprom() {
    int16_t usteps = 0;
    f634:	d0 e0       	ldi	r29, 0x00	; 0
    f636:	c0 e0       	ldi	r28, 0x00	; 0
    float mm = 0;
    static const char comma_sep[] PROGMEM = ", ";
    for (uint8_t i = 0; i < 6; i++) {
        if(i > 0) {
    f638:	8f ef       	ldi	r24, 0xFF	; 255
    f63a:	c8 16       	cp	r12, r24
    f63c:	09 f4       	brne	.+2      	; 0xf640 <gcode_M861_print_pinda_cal_eeprom()+0x48>
    f63e:	5d c0       	rjmp	.+186    	; 0xf6fa <gcode_M861_print_pinda_cal_eeprom()+0x102>
            usteps = eeprom_read_word((uint16_t*) EEPROM_PROBE_TEMP_SHIFT + (i - 1));
    f640:	c8 01       	movw	r24, r16
    f642:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
    f646:	ec 01       	movw	r28, r24
            mm = ((float)usteps) / cs.axis_steps_per_mm[Z_AXIS];
    f648:	bc 01       	movw	r22, r24
    f64a:	99 0f       	add	r25, r25
    f64c:	88 0b       	sbc	r24, r24
    f64e:	99 0b       	sbc	r25, r25
    f650:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
    f654:	20 91 73 0d 	lds	r18, 0x0D73	; 0x800d73 <cs+0xc>
    f658:	30 91 74 0d 	lds	r19, 0x0D74	; 0x800d74 <cs+0xd>
    f65c:	40 91 75 0d 	lds	r20, 0x0D75	; 0x800d75 <cs+0xe>
    f660:	50 91 76 0d 	lds	r21, 0x0D76	; 0x800d76 <cs+0xf>
    f664:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
    f668:	2b 01       	movw	r4, r22
    f66a:	3c 01       	movw	r6, r24
    f66c:	c7 01       	movw	r24, r14
    f66e:	b6 01       	movw	r22, r12
    f670:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
            SERIAL_PROTOCOL(i - 1);
        } else {
          SERIAL_PROTOCOLRPGM(MSG_NA);
        }
        SERIAL_PROTOCOLRPGM(comma_sep);
    f674:	87 ee       	ldi	r24, 0xE7	; 231
    f676:	97 e7       	ldi	r25, 0x77	; 119
    f678:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    f67c:	c5 01       	movw	r24, r10
    f67e:	b4 01       	movw	r22, r8
    f680:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
        SERIAL_PROTOCOL(35 + (i * 5));
        SERIAL_PROTOCOLRPGM(comma_sep);
    f684:	87 ee       	ldi	r24, 0xE7	; 231
    f686:	97 e7       	ldi	r25, 0x77	; 119
    f688:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
  print((unsigned long) b, base);
}

void MarlinSerial::print(int n, int base)
{
  print((long) n, base);
    f68c:	be 01       	movw	r22, r28
    f68e:	0d 2e       	mov	r0, r29
    f690:	00 0c       	add	r0, r0
    f692:	88 0b       	sbc	r24, r24
    f694:	99 0b       	sbc	r25, r25
    f696:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
        SERIAL_PROTOCOL(usteps);
        SERIAL_PROTOCOLRPGM(comma_sep);
    f69a:	87 ee       	ldi	r24, 0xE7	; 231
    f69c:	97 e7       	ldi	r25, 0x77	; 119
    f69e:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        SERIAL_PROTOCOLLN(mm * 1000);
    f6a2:	20 e0       	ldi	r18, 0x00	; 0
    f6a4:	30 e0       	ldi	r19, 0x00	; 0
    f6a6:	4a e7       	ldi	r20, 0x7A	; 122
    f6a8:	54 e4       	ldi	r21, 0x44	; 68
    f6aa:	c3 01       	movw	r24, r6
    f6ac:	b2 01       	movw	r22, r4
    f6ae:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    f6b2:	0f 94 a2 65 	call	0x2cb44	; 0x2cb44 <MarlinSerial::println(double, int) [clone .constprop.354]>
    f6b6:	85 e0       	ldi	r24, 0x05	; 5
    f6b8:	88 0e       	add	r8, r24
    f6ba:	91 1c       	adc	r9, r1
    f6bc:	a1 1c       	adc	r10, r1
    f6be:	b1 1c       	adc	r11, r1
    f6c0:	0e 5f       	subi	r16, 0xFE	; 254
    f6c2:	1f 4f       	sbci	r17, 0xFF	; 255
    f6c4:	8f ef       	ldi	r24, 0xFF	; 255
    f6c6:	c8 1a       	sub	r12, r24
    f6c8:	d8 0a       	sbc	r13, r24
    f6ca:	e8 0a       	sbc	r14, r24
    f6cc:	f8 0a       	sbc	r15, r24
/// by extracting common code into one function
static void gcode_M861_print_pinda_cal_eeprom() {
    int16_t usteps = 0;
    float mm = 0;
    static const char comma_sep[] PROGMEM = ", ";
    for (uint8_t i = 0; i < 6; i++) {
    f6ce:	0a 3b       	cpi	r16, 0xBA	; 186
    f6d0:	8f e0       	ldi	r24, 0x0F	; 15
    f6d2:	18 07       	cpc	r17, r24
    f6d4:	09 f0       	breq	.+2      	; 0xf6d8 <gcode_M861_print_pinda_cal_eeprom()+0xe0>
    f6d6:	b0 cf       	rjmp	.-160    	; 0xf638 <gcode_M861_print_pinda_cal_eeprom()+0x40>
        SERIAL_PROTOCOLRPGM(comma_sep);
        SERIAL_PROTOCOL(usteps);
        SERIAL_PROTOCOLRPGM(comma_sep);
        SERIAL_PROTOCOLLN(mm * 1000);
    }
}
    f6d8:	df 91       	pop	r29
    f6da:	cf 91       	pop	r28
    f6dc:	1f 91       	pop	r17
    f6de:	0f 91       	pop	r16
    f6e0:	ff 90       	pop	r15
    f6e2:	ef 90       	pop	r14
    f6e4:	df 90       	pop	r13
    f6e6:	cf 90       	pop	r12
    f6e8:	bf 90       	pop	r11
    f6ea:	af 90       	pop	r10
    f6ec:	9f 90       	pop	r9
    f6ee:	8f 90       	pop	r8
    f6f0:	7f 90       	pop	r7
    f6f2:	6f 90       	pop	r6
    f6f4:	5f 90       	pop	r5
    f6f6:	4f 90       	pop	r4
    f6f8:	08 95       	ret
        if(i > 0) {
            usteps = eeprom_read_word((uint16_t*) EEPROM_PROBE_TEMP_SHIFT + (i - 1));
            mm = ((float)usteps) / cs.axis_steps_per_mm[Z_AXIS];
            SERIAL_PROTOCOL(i - 1);
        } else {
          SERIAL_PROTOCOLRPGM(MSG_NA);
    f6fa:	83 e7       	ldi	r24, 0x73	; 115
    f6fc:	98 e4       	ldi	r25, 0x48	; 72
    f6fe:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    f702:	b8 cf       	rjmp	.-144    	; 0xf674 <gcode_M861_print_pinda_cal_eeprom()+0x7c>

0000f704 <mmu_M600_load_filament(bool)>:

/// @brief load filament for mmu v2
/// @par nozzle_temp nozzle temperature to load filament
static void mmu_M600_load_filament(bool automatic) {
    uint8_t slot;
    if (automatic) {
    f704:	88 23       	and	r24, r24
    f706:	71 f1       	breq	.+92     	; 0xf764 <mmu_M600_load_filament(bool)+0x60>
    currentMMUSlot = slot;
}

uint8_t SpoolJoin::nextSlot()
{
    SERIAL_ECHOPGM("SpoolJoin: ");
    f708:	8b ed       	ldi	r24, 0xDB	; 219
    f70a:	97 e7       	ldi	r25, 0x77	; 119
    f70c:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    f710:	60 91 90 12 	lds	r22, 0x1290	; 0x801290 <SpoolJoin::spooljoin>
    f714:	70 e0       	ldi	r23, 0x00	; 0
    f716:	90 e0       	ldi	r25, 0x00	; 0
    f718:	80 e0       	ldi	r24, 0x00	; 0
    f71a:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
    SERIAL_ECHO((int)currentMMUSlot);

    if (currentMMUSlot >= MMU_FILAMENT_COUNT-1) currentMMUSlot = 0;
    f71e:	80 91 90 12 	lds	r24, 0x1290	; 0x801290 <SpoolJoin::spooljoin>
    f722:	84 30       	cpi	r24, 0x04	; 4
    f724:	d8 f0       	brcs	.+54     	; 0xf75c <mmu_M600_load_filament(bool)+0x58>
    f726:	10 92 90 12 	sts	0x1290, r1	; 0x801290 <SpoolJoin::spooljoin>
    else currentMMUSlot++;

    SERIAL_ECHOPGM(" -> ");
    f72a:	86 ed       	ldi	r24, 0xD6	; 214
    f72c:	97 e7       	ldi	r25, 0x77	; 119
    f72e:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    SERIAL_ECHOLN((int)currentMMUSlot);
    f732:	80 91 90 12 	lds	r24, 0x1290	; 0x801290 <SpoolJoin::spooljoin>
    f736:	90 e0       	ldi	r25, 0x00	; 0
    f738:	0f 94 bf 65 	call	0x2cb7e	; 0x2cb7e <MarlinSerial::println(int, int) [clone .constprop.319]>

    return currentMMUSlot;
    f73c:	80 91 90 12 	lds	r24, 0x1290	; 0x801290 <SpoolJoin::spooljoin>
  return target_temperature_bed;
};

// Doesn't save FLASH when FORCE_INLINE removed.
FORCE_INLINE void setTargetHotend(const float &celsius) {
  target_temperature[0] = celsius;
    f740:	20 91 5b 12 	lds	r18, 0x125B	; 0x80125b <saved_extruder_temperature>
    f744:	30 91 5c 12 	lds	r19, 0x125C	; 0x80125c <saved_extruder_temperature+0x1>
    f748:	30 93 5e 12 	sts	0x125E, r19	; 0x80125e <target_temperature+0x1>
    f74c:	20 93 5d 12 	sts	0x125D, r18	; 0x80125d <target_temperature>
        slot = choose_menu_P(_T(MSG_SELECT_FILAMENT), MSG_FILAMENT);
    }

    setTargetHotend(saved_extruder_temperature);

    MMU2::mmu2.load_filament_to_nozzle(slot);
    f750:	0e 94 37 fe 	call	0x1fc6e	; 0x1fc6e <MMU2::MMU2::load_filament_to_nozzle(unsigned char) [clone .constprop.39]>

    load_filament_final_feed(); // @@TODO verify
    f754:	0e 94 ed 63 	call	0xc7da	; 0xc7da <load_filament_final_feed()>
    st_synchronize();
    f758:	0d 94 fb 1a 	jmp	0x235f6	; 0x235f6 <st_synchronize()>
{
    SERIAL_ECHOPGM("SpoolJoin: ");
    SERIAL_ECHO((int)currentMMUSlot);

    if (currentMMUSlot >= MMU_FILAMENT_COUNT-1) currentMMUSlot = 0;
    else currentMMUSlot++;
    f75c:	8f 5f       	subi	r24, 0xFF	; 255
    f75e:	80 93 90 12 	sts	0x1290, r24	; 0x801290 <SpoolJoin::spooljoin>
    f762:	e3 cf       	rjmp	.-58     	; 0xf72a <mmu_M600_load_filament(bool)+0x26>
    uint8_t slot;
    if (automatic) {
        slot = SpoolJoin::spooljoin.nextSlot();
    } else {
        // Only ask for the slot if automatic/SpoolJoin is off
        slot = choose_menu_P(_T(MSG_SELECT_FILAMENT), MSG_FILAMENT);
    f764:	86 e1       	ldi	r24, 0x16	; 22
    f766:	9d e3       	ldi	r25, 0x3D	; 61
    f768:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
    f76c:	70 e0       	ldi	r23, 0x00	; 0
    f76e:	60 e0       	ldi	r22, 0x00	; 0
    f770:	0e 94 c8 d1 	call	0x1a390	; 0x1a390 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]>
    f774:	e5 cf       	rjmp	.-54     	; 0xf740 <mmu_M600_load_filament(bool)+0x3c>

0000f776 <gcode_M114()>:

	return final_result;
}

void gcode_M114()
{
    f776:	cf 93       	push	r28
    f778:	df 93       	push	r29
	SERIAL_PROTOCOLPGM("X:");
    f77a:	83 ed       	ldi	r24, 0xD3	; 211
    f77c:	97 e7       	ldi	r25, 0x77	; 119
    f77e:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
	SERIAL_PROTOCOL(current_position[X_AXIS]);
    f782:	c1 e6       	ldi	r28, 0x61	; 97
    f784:	d2 e1       	ldi	r29, 0x12	; 18
  else printNumber(n, base);
}

void MarlinSerial::print(double n, int digits)
{
  printFloat(n, digits);
    f786:	68 81       	ld	r22, Y
    f788:	79 81       	ldd	r23, Y+1	; 0x01
    f78a:	8a 81       	ldd	r24, Y+2	; 0x02
    f78c:	9b 81       	ldd	r25, Y+3	; 0x03
    f78e:	42 e0       	ldi	r20, 0x02	; 2
    f790:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
	SERIAL_PROTOCOLPGM(" Y:");
    f794:	8f ec       	ldi	r24, 0xCF	; 207
    f796:	97 e7       	ldi	r25, 0x77	; 119
    f798:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    f79c:	6c 81       	ldd	r22, Y+4	; 0x04
    f79e:	7d 81       	ldd	r23, Y+5	; 0x05
    f7a0:	8e 81       	ldd	r24, Y+6	; 0x06
    f7a2:	9f 81       	ldd	r25, Y+7	; 0x07
    f7a4:	42 e0       	ldi	r20, 0x02	; 2
    f7a6:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
	SERIAL_PROTOCOL(current_position[Y_AXIS]);
	SERIAL_PROTOCOLPGM(" Z:");
    f7aa:	8b ec       	ldi	r24, 0xCB	; 203
    f7ac:	97 e7       	ldi	r25, 0x77	; 119
    f7ae:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    f7b2:	68 85       	ldd	r22, Y+8	; 0x08
    f7b4:	79 85       	ldd	r23, Y+9	; 0x09
    f7b6:	8a 85       	ldd	r24, Y+10	; 0x0a
    f7b8:	9b 85       	ldd	r25, Y+11	; 0x0b
    f7ba:	42 e0       	ldi	r20, 0x02	; 2
    f7bc:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
	SERIAL_PROTOCOL(current_position[Z_AXIS]);
	SERIAL_PROTOCOLPGM(" E:");
    f7c0:	87 ec       	ldi	r24, 0xC7	; 199
    f7c2:	97 e7       	ldi	r25, 0x77	; 119
    f7c4:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    f7c8:	6c 85       	ldd	r22, Y+12	; 0x0c
    f7ca:	7d 85       	ldd	r23, Y+13	; 0x0d
    f7cc:	8e 85       	ldd	r24, Y+14	; 0x0e
    f7ce:	9f 85       	ldd	r25, Y+15	; 0x0f
    f7d0:	42 e0       	ldi	r20, 0x02	; 2
    f7d2:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
	SERIAL_PROTOCOL(current_position[E_AXIS]);

	SERIAL_PROTOCOLRPGM(_n(" Count X: "));////MSG_COUNT_X
    f7d6:	89 e1       	ldi	r24, 0x19	; 25
    f7d8:	94 e6       	ldi	r25, 0x64	; 100
    f7da:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
	SERIAL_PROTOCOL(float(st_get_position(X_AXIS)) / cs.axis_steps_per_mm[X_AXIS]);
    f7de:	80 e0       	ldi	r24, 0x00	; 0
    f7e0:	0f 94 d9 1a 	call	0x235b2	; 0x235b2 <st_get_position(unsigned char)>
    f7e4:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
    f7e8:	c7 e6       	ldi	r28, 0x67	; 103
    f7ea:	dd e0       	ldi	r29, 0x0D	; 13
    f7ec:	2c 81       	ldd	r18, Y+4	; 0x04
    f7ee:	3d 81       	ldd	r19, Y+5	; 0x05
    f7f0:	4e 81       	ldd	r20, Y+6	; 0x06
    f7f2:	5f 81       	ldd	r21, Y+7	; 0x07
    f7f4:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
    f7f8:	42 e0       	ldi	r20, 0x02	; 2
    f7fa:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
	SERIAL_PROTOCOLPGM(" Y:");
    f7fe:	83 ec       	ldi	r24, 0xC3	; 195
    f800:	97 e7       	ldi	r25, 0x77	; 119
    f802:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
	SERIAL_PROTOCOL(float(st_get_position(Y_AXIS)) / cs.axis_steps_per_mm[Y_AXIS]);
    f806:	81 e0       	ldi	r24, 0x01	; 1
    f808:	0f 94 d9 1a 	call	0x235b2	; 0x235b2 <st_get_position(unsigned char)>
    f80c:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
    f810:	28 85       	ldd	r18, Y+8	; 0x08
    f812:	39 85       	ldd	r19, Y+9	; 0x09
    f814:	4a 85       	ldd	r20, Y+10	; 0x0a
    f816:	5b 85       	ldd	r21, Y+11	; 0x0b
    f818:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
    f81c:	42 e0       	ldi	r20, 0x02	; 2
    f81e:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
	SERIAL_PROTOCOLPGM(" Z:");
    f822:	8f eb       	ldi	r24, 0xBF	; 191
    f824:	97 e7       	ldi	r25, 0x77	; 119
    f826:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
	SERIAL_PROTOCOL(float(st_get_position(Z_AXIS)) / cs.axis_steps_per_mm[Z_AXIS]);
    f82a:	82 e0       	ldi	r24, 0x02	; 2
    f82c:	0f 94 d9 1a 	call	0x235b2	; 0x235b2 <st_get_position(unsigned char)>
    f830:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
    f834:	2c 85       	ldd	r18, Y+12	; 0x0c
    f836:	3d 85       	ldd	r19, Y+13	; 0x0d
    f838:	4e 85       	ldd	r20, Y+14	; 0x0e
    f83a:	5f 85       	ldd	r21, Y+15	; 0x0f
    f83c:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
    f840:	42 e0       	ldi	r20, 0x02	; 2
    f842:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
	SERIAL_PROTOCOLPGM(" E:");
    f846:	8b eb       	ldi	r24, 0xBB	; 187
    f848:	97 e7       	ldi	r25, 0x77	; 119
    f84a:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
	SERIAL_PROTOCOLLN(float(st_get_position(E_AXIS)) / cs.axis_steps_per_mm[E_AXIS]);
    f84e:	83 e0       	ldi	r24, 0x03	; 3
    f850:	0f 94 d9 1a 	call	0x235b2	; 0x235b2 <st_get_position(unsigned char)>
    f854:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
    f858:	28 89       	ldd	r18, Y+16	; 0x10
    f85a:	39 89       	ldd	r19, Y+17	; 0x11
    f85c:	4a 89       	ldd	r20, Y+18	; 0x12
    f85e:	5b 89       	ldd	r21, Y+19	; 0x13
    f860:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
}
    f864:	df 91       	pop	r29
    f866:	cf 91       	pop	r28
	SERIAL_PROTOCOLPGM(" Y:");
	SERIAL_PROTOCOL(float(st_get_position(Y_AXIS)) / cs.axis_steps_per_mm[Y_AXIS]);
	SERIAL_PROTOCOLPGM(" Z:");
	SERIAL_PROTOCOL(float(st_get_position(Z_AXIS)) / cs.axis_steps_per_mm[Z_AXIS]);
	SERIAL_PROTOCOLPGM(" E:");
	SERIAL_PROTOCOLLN(float(st_get_position(E_AXIS)) / cs.axis_steps_per_mm[E_AXIS]);
    f868:	0d 94 a2 65 	jmp	0x2cb44	; 0x2cb44 <MarlinSerial::println(double, int) [clone .constprop.354]>

0000f86c <gcode_M105()>:
#endif //TMC2130

void gcode_M105()
{
#if defined(TEMP_0_PIN) && TEMP_0_PIN > -1
    SERIAL_PROTOCOLPGM("T:");
    f86c:	8a ec       	ldi	r24, 0xCA	; 202
    f86e:	96 e7       	ldi	r25, 0x76	; 118
    f870:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    f874:	60 91 5a 0d 	lds	r22, 0x0D5A	; 0x800d5a <current_temperature>
    f878:	70 91 5b 0d 	lds	r23, 0x0D5B	; 0x800d5b <current_temperature+0x1>
    f87c:	80 91 5c 0d 	lds	r24, 0x0D5C	; 0x800d5c <current_temperature+0x2>
    f880:	90 91 5d 0d 	lds	r25, 0x0D5D	; 0x800d5d <current_temperature+0x3>
    f884:	41 e0       	ldi	r20, 0x01	; 1
    f886:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
    SERIAL_PROTOCOL_F(degHotend(active_extruder),1);
    SERIAL_PROTOCOLPGM(" /");
    f88a:	87 ec       	ldi	r24, 0xC7	; 199
    f88c:	96 e7       	ldi	r25, 0x76	; 118
    f88e:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
  return current_temperature_bed;
};

// Doesn't save FLASH when FORCE_INLINE removed.
FORCE_INLINE float degTargetHotend(uint8_t extruder) {
  return target_temperature[extruder];
    f892:	60 91 5d 12 	lds	r22, 0x125D	; 0x80125d <target_temperature>
    f896:	70 91 5e 12 	lds	r23, 0x125E	; 0x80125e <target_temperature+0x1>
    f89a:	07 2e       	mov	r0, r23
    f89c:	00 0c       	add	r0, r0
    f89e:	88 0b       	sbc	r24, r24
    f8a0:	99 0b       	sbc	r25, r25
    f8a2:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
    f8a6:	41 e0       	ldi	r20, 0x01	; 1
    f8a8:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
    SERIAL_PROTOCOL_F(degTargetHotend(active_extruder),1);
#if defined(TEMP_BED_PIN) && TEMP_BED_PIN > -1
    SERIAL_PROTOCOLPGM(" B:");
    f8ac:	83 ec       	ldi	r24, 0xC3	; 195
    f8ae:	96 e7       	ldi	r25, 0x76	; 118
    f8b0:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    f8b4:	60 91 bc 03 	lds	r22, 0x03BC	; 0x8003bc <current_temperature_bed>
    f8b8:	70 91 bd 03 	lds	r23, 0x03BD	; 0x8003bd <current_temperature_bed+0x1>
    f8bc:	80 91 be 03 	lds	r24, 0x03BE	; 0x8003be <current_temperature_bed+0x2>
    f8c0:	90 91 bf 03 	lds	r25, 0x03BF	; 0x8003bf <current_temperature_bed+0x3>
    f8c4:	41 e0       	ldi	r20, 0x01	; 1
    f8c6:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
    SERIAL_PROTOCOL_F(degBed(),1);
    SERIAL_PROTOCOLPGM(" /");
    f8ca:	80 ec       	ldi	r24, 0xC0	; 192
    f8cc:	96 e7       	ldi	r25, 0x76	; 118
    f8ce:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
};

FORCE_INLINE float degTargetBed() {
  return target_temperature_bed;
    f8d2:	60 91 59 12 	lds	r22, 0x1259	; 0x801259 <target_temperature_bed>
    f8d6:	70 91 5a 12 	lds	r23, 0x125A	; 0x80125a <target_temperature_bed+0x1>
    f8da:	07 2e       	mov	r0, r23
    f8dc:	00 0c       	add	r0, r0
    f8de:	88 0b       	sbc	r24, r24
    f8e0:	99 0b       	sbc	r25, r25
    f8e2:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
    f8e6:	41 e0       	ldi	r20, 0x01	; 1
    f8e8:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
    SERIAL_PROTOCOL_F(degTargetBed(),1);
#endif //TEMP_BED_PIN
    SERIAL_PROTOCOLPGM(" T0:");
    f8ec:	8b eb       	ldi	r24, 0xBB	; 187
    f8ee:	96 e7       	ldi	r25, 0x76	; 118
    f8f0:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    f8f4:	60 91 5a 0d 	lds	r22, 0x0D5A	; 0x800d5a <current_temperature>
    f8f8:	70 91 5b 0d 	lds	r23, 0x0D5B	; 0x800d5b <current_temperature+0x1>
    f8fc:	80 91 5c 0d 	lds	r24, 0x0D5C	; 0x800d5c <current_temperature+0x2>
    f900:	90 91 5d 0d 	lds	r25, 0x0D5D	; 0x800d5d <current_temperature+0x3>
    f904:	41 e0       	ldi	r20, 0x01	; 1
    f906:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
    SERIAL_PROTOCOL_F(degHotend(active_extruder),1);
    SERIAL_PROTOCOLPGM(" /");
    f90a:	88 eb       	ldi	r24, 0xB8	; 184
    f90c:	96 e7       	ldi	r25, 0x76	; 118
    f90e:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
  return current_temperature_bed;
};

// Doesn't save FLASH when FORCE_INLINE removed.
FORCE_INLINE float degTargetHotend(uint8_t extruder) {
  return target_temperature[extruder];
    f912:	60 91 5d 12 	lds	r22, 0x125D	; 0x80125d <target_temperature>
    f916:	70 91 5e 12 	lds	r23, 0x125E	; 0x80125e <target_temperature+0x1>
    f91a:	07 2e       	mov	r0, r23
    f91c:	00 0c       	add	r0, r0
    f91e:	88 0b       	sbc	r24, r24
    f920:	99 0b       	sbc	r25, r25
    f922:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
    f926:	41 e0       	ldi	r20, 0x01	; 1
    f928:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
#else
    SERIAL_ERROR_START;
    SERIAL_ERRORLNRPGM(_n("No thermistors - no temperature"));////MSG_ERR_NO_THERMISTORS
#endif

    SERIAL_PROTOCOLPGM(" @:");
    f92c:	84 eb       	ldi	r24, 0xB4	; 180
    f92e:	96 e7       	ldi	r25, 0x76	; 118
    f930:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
  print((unsigned long) b, base);
}

void MarlinSerial::print(int n, int base)
{
  print((long) n, base);
    f934:	60 91 f5 05 	lds	r22, 0x05F5	; 0x8005f5 <_ZL8soft_pwm.lto_priv.504>
    f938:	70 e0       	ldi	r23, 0x00	; 0
    f93a:	90 e0       	ldi	r25, 0x00	; 0
    f93c:	80 e0       	ldi	r24, 0x00	; 0
    f93e:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
    SERIAL_PROTOCOLPGM("W");
#else
    SERIAL_PROTOCOL(getHeaterPower(active_extruder));
#endif

    SERIAL_PROTOCOLPGM(" B@:");
    f942:	8f ea       	ldi	r24, 0xAF	; 175
    f944:	96 e7       	ldi	r25, 0x76	; 118
    f946:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    f94a:	60 91 ee 05 	lds	r22, 0x05EE	; 0x8005ee <soft_pwm_bed>
    f94e:	70 e0       	ldi	r23, 0x00	; 0
    f950:	90 e0       	ldi	r25, 0x00	; 0
    f952:	80 e0       	ldi	r24, 0x00	; 0
    f954:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
#else
    SERIAL_PROTOCOL(getHeaterPower(-1));
#endif

#ifdef PINDA_THERMISTOR
    SERIAL_PROTOCOLPGM(" P:");
    f958:	8b ea       	ldi	r24, 0xAB	; 171
    f95a:	96 e7       	ldi	r25, 0x76	; 118
    f95c:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
  else printNumber(n, base);
}

void MarlinSerial::print(double n, int digits)
{
  printFloat(n, digits);
    f960:	60 91 85 03 	lds	r22, 0x0385	; 0x800385 <current_temperature_pinda>
    f964:	70 91 86 03 	lds	r23, 0x0386	; 0x800386 <current_temperature_pinda+0x1>
    f968:	80 91 87 03 	lds	r24, 0x0387	; 0x800387 <current_temperature_pinda+0x2>
    f96c:	90 91 88 03 	lds	r25, 0x0388	; 0x800388 <current_temperature_pinda+0x3>
    f970:	41 e0       	ldi	r20, 0x01	; 1
    f972:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
        SERIAL_PROTOCOL_F(100 * (1 + (PtA * (raw/OVERSAMPLENR)) + (PtB * sq((raw/OVERSAMPLENR)))), 5);
        SERIAL_PROTOCOLPGM(" Rx0->");
        SERIAL_PROTOCOL_F(raw, 5);
    }
#endif
    SERIAL_PROTOCOLLN();
    f976:	0c 94 bc 7a 	jmp	0xf578	; 0xf578 <MarlinSerial::println()>

0000f97a <serialprintlnPGM(char const*)>:
        ++str;
    }
}

void serialprintlnPGM(const char *str) {
    serialprintPGM(str);
    f97a:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    MYSERIAL.println();
    f97e:	0c 94 bc 7a 	jmp	0xf578	; 0xf578 <MarlinSerial::println()>

0000f982 <host_keepalive() [clone .part.30]>:

/**
* Output a "busy" message at regular intervals
* while the machine is not accepting commands.
*/
void host_keepalive() {
    f982:	8f 92       	push	r8
    f984:	9f 92       	push	r9
    f986:	af 92       	push	r10
    f988:	bf 92       	push	r11
    f98a:	cf 92       	push	r12
    f98c:	df 92       	push	r13
    f98e:	ef 92       	push	r14
    f990:	ff 92       	push	r15
#ifndef HOST_KEEPALIVE_FEATURE
  return;
#endif //HOST_KEEPALIVE_FEATURE
  if (farm_mode) return;
  long ms = _millis();
    f992:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
    f996:	6b 01       	movw	r12, r22
    f998:	7c 01       	movw	r14, r24

  if (host_keepalive_interval && busy_state != NOT_BUSY) {
    f99a:	20 91 32 02 	lds	r18, 0x0232	; 0x800232 <host_keepalive_interval>
    f99e:	22 23       	and	r18, r18
    f9a0:	09 f1       	breq	.+66     	; 0xf9e4 <host_keepalive() [clone .part.30]+0x62>
    f9a2:	40 91 78 02 	lds	r20, 0x0278	; 0x800278 <busy_state>
    f9a6:	41 30       	cpi	r20, 0x01	; 1
    f9a8:	e9 f0       	breq	.+58     	; 0xf9e4 <host_keepalive() [clone .part.30]+0x62>
    if ((ms - prev_busy_signal_ms) < (long)(1000L * host_keepalive_interval)) return;
    f9aa:	80 91 14 02 	lds	r24, 0x0214	; 0x800214 <prev_busy_signal_ms>
    f9ae:	90 91 15 02 	lds	r25, 0x0215	; 0x800215 <prev_busy_signal_ms+0x1>
    f9b2:	a0 91 16 02 	lds	r26, 0x0216	; 0x800216 <prev_busy_signal_ms+0x2>
    f9b6:	b0 91 17 02 	lds	r27, 0x0217	; 0x800217 <prev_busy_signal_ms+0x3>
    f9ba:	46 01       	movw	r8, r12
    f9bc:	57 01       	movw	r10, r14
    f9be:	88 1a       	sub	r8, r24
    f9c0:	99 0a       	sbc	r9, r25
    f9c2:	aa 0a       	sbc	r10, r26
    f9c4:	bb 0a       	sbc	r11, r27
    f9c6:	30 e0       	ldi	r19, 0x00	; 0
    f9c8:	a8 ee       	ldi	r26, 0xE8	; 232
    f9ca:	b3 e0       	ldi	r27, 0x03	; 3
    f9cc:	0f 94 80 a4 	call	0x34900	; 0x34900 <__umulhisi3>
    f9d0:	86 16       	cp	r8, r22
    f9d2:	97 06       	cpc	r9, r23
    f9d4:	a8 06       	cpc	r10, r24
    f9d6:	b9 06       	cpc	r11, r25
    f9d8:	6c f0       	brlt	.+26     	; 0xf9f4 <host_keepalive() [clone .part.30]+0x72>
     switch (busy_state) {
    f9da:	44 30       	cpi	r20, 0x04	; 4
    f9dc:	31 f1       	breq	.+76     	; 0xfa2a <host_keepalive() [clone .part.30]+0xa8>
    f9de:	9c f4       	brge	.+38     	; 0xfa06 <host_keepalive() [clone .part.30]+0x84>
    f9e0:	42 30       	cpi	r20, 0x02	; 2
    f9e2:	d4 f4       	brge	.+52     	; 0xfa18 <host_keepalive() [clone .part.30]+0x96>
        break;
      default:
	break;
    }
  }
  prev_busy_signal_ms = ms;
    f9e4:	c0 92 14 02 	sts	0x0214, r12	; 0x800214 <prev_busy_signal_ms>
    f9e8:	d0 92 15 02 	sts	0x0215, r13	; 0x800215 <prev_busy_signal_ms+0x1>
    f9ec:	e0 92 16 02 	sts	0x0216, r14	; 0x800216 <prev_busy_signal_ms+0x2>
    f9f0:	f0 92 17 02 	sts	0x0217, r15	; 0x800217 <prev_busy_signal_ms+0x3>
}
    f9f4:	ff 90       	pop	r15
    f9f6:	ef 90       	pop	r14
    f9f8:	df 90       	pop	r13
    f9fa:	cf 90       	pop	r12
    f9fc:	bf 90       	pop	r11
    f9fe:	af 90       	pop	r10
    fa00:	9f 90       	pop	r9
    fa02:	8f 90       	pop	r8
    fa04:	08 95       	ret
  if (farm_mode) return;
  long ms = _millis();

  if (host_keepalive_interval && busy_state != NOT_BUSY) {
    if ((ms - prev_busy_signal_ms) < (long)(1000L * host_keepalive_interval)) return;
     switch (busy_state) {
    fa06:	45 30       	cpi	r20, 0x05	; 5
    fa08:	69 f7       	brne	.-38     	; 0xf9e4 <host_keepalive() [clone .part.30]+0x62>
      case PAUSED_FOR_USER:
        SERIAL_ECHO_START;
        SERIAL_ECHOLNPGM("busy: paused for user");
        break;
      case PAUSED_FOR_INPUT:
        SERIAL_ECHO_START;
    fa0a:	8e ec       	ldi	r24, 0xCE	; 206
    fa0c:	91 ea       	ldi	r25, 0xA1	; 161
    fa0e:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        SERIAL_ECHOLNPGM("busy: paused for input");
    fa12:	86 e9       	ldi	r24, 0x96	; 150
    fa14:	98 e7       	ldi	r25, 0x78	; 120
    fa16:	06 c0       	rjmp	.+12     	; 0xfa24 <host_keepalive() [clone .part.30]+0xa2>
  if (host_keepalive_interval && busy_state != NOT_BUSY) {
    if ((ms - prev_busy_signal_ms) < (long)(1000L * host_keepalive_interval)) return;
     switch (busy_state) {
      case IN_HANDLER:
      case IN_PROCESS:
        SERIAL_ECHO_START;
    fa18:	8e ec       	ldi	r24, 0xCE	; 206
    fa1a:	91 ea       	ldi	r25, 0xA1	; 161
    fa1c:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        SERIAL_ECHOLNPGM("busy: processing");
    fa20:	83 ec       	ldi	r24, 0xC3	; 195
    fa22:	98 e7       	ldi	r25, 0x78	; 120
        SERIAL_ECHO_START;
        SERIAL_ECHOLNPGM("busy: paused for user");
        break;
      case PAUSED_FOR_INPUT:
        SERIAL_ECHO_START;
        SERIAL_ECHOLNPGM("busy: paused for input");
    fa24:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
    fa28:	dd cf       	rjmp	.-70     	; 0xf9e4 <host_keepalive() [clone .part.30]+0x62>
      case IN_PROCESS:
        SERIAL_ECHO_START;
        SERIAL_ECHOLNPGM("busy: processing");
        break;
      case PAUSED_FOR_USER:
        SERIAL_ECHO_START;
    fa2a:	8e ec       	ldi	r24, 0xCE	; 206
    fa2c:	91 ea       	ldi	r25, 0xA1	; 161
    fa2e:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        SERIAL_ECHOLNPGM("busy: paused for user");
    fa32:	8d ea       	ldi	r24, 0xAD	; 173
    fa34:	98 e7       	ldi	r25, 0x78	; 120
    fa36:	f6 cf       	rjmp	.-20     	; 0xfa24 <host_keepalive() [clone .part.30]+0xa2>

0000fa38 <check_babystep()>:
#endif //TEMP_RESIDENCY_TIME
	}
}

void check_babystep()
{
    fa38:	cf 93       	push	r28
	int babystep_z = eeprom_read_word(reinterpret_cast<uint16_t *>(&(EEPROM_Sheets_base->
            s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)));
    fa3a:	81 ea       	ldi	r24, 0xA1	; 161
    fa3c:	9d e0       	ldi	r25, 0x0D	; 13
    fa3e:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
	}
}

void check_babystep()
{
	int babystep_z = eeprom_read_word(reinterpret_cast<uint16_t *>(&(EEPROM_Sheets_base->
    fa42:	cb e0       	ldi	r28, 0x0B	; 11
    fa44:	8c 9f       	mul	r24, r28
    fa46:	c0 01       	movw	r24, r0
    fa48:	11 24       	eor	r1, r1
    fa4a:	80 5b       	subi	r24, 0xB0	; 176
    fa4c:	92 4f       	sbci	r25, 0xF2	; 242
    fa4e:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
            s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)));

	if ((babystep_z < Z_BABYSTEP_MIN) || (babystep_z > Z_BABYSTEP_MAX)) {
    fa52:	81 56       	subi	r24, 0x61	; 97
    fa54:	90 4f       	sbci	r25, 0xF0	; 240
    fa56:	80 3a       	cpi	r24, 0xA0	; 160
    fa58:	9f 40       	sbci	r25, 0x0F	; 15
    fa5a:	c8 f0       	brcs	.+50     	; 0xfa8e <check_babystep()+0x56>
		babystep_z = 0; //if babystep value is out of min max range, set it to 0
		SERIAL_ECHOLNPGM("Z live adjust out of range. Setting to 0");
    fa5c:	82 e6       	ldi	r24, 0x62	; 98
    fa5e:	98 e7       	ldi	r25, 0x78	; 120
    fa60:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
		eeprom_write_word_notify(reinterpret_cast<uint16_t *>(&(EEPROM_Sheets_base->
            s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)),
    fa64:	81 ea       	ldi	r24, 0xA1	; 161
    fa66:	9d e0       	ldi	r25, 0x0D	; 13
    fa68:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
            s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)));

	if ((babystep_z < Z_BABYSTEP_MIN) || (babystep_z > Z_BABYSTEP_MAX)) {
		babystep_z = 0; //if babystep value is out of min max range, set it to 0
		SERIAL_ECHOLNPGM("Z live adjust out of range. Setting to 0");
		eeprom_write_word_notify(reinterpret_cast<uint16_t *>(&(EEPROM_Sheets_base->
    fa6c:	8c 9f       	mul	r24, r28
    fa6e:	c0 01       	movw	r24, r0
    fa70:	11 24       	eor	r1, r1
    if (active) {
        uint16_t previous_value = eeprom_read_word(dst);
        eeprom_word_notify(dst, previous_value, value, true);
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_write_word(dst, value);
    fa72:	70 e0       	ldi	r23, 0x00	; 0
    fa74:	60 e0       	ldi	r22, 0x00	; 0
    fa76:	80 5b       	subi	r24, 0xB0	; 176
    fa78:	92 4f       	sbci	r25, 0xF2	; 242
    fa7a:	0f 94 3e a4 	call	0x3487c	; 0x3487c <eeprom_write_word>
            s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)),
                    babystep_z);
		lcd_show_fullscreen_message_and_wait_P(PSTR("Z live adjust out of range. Setting to 0. Click to continue."));
    fa7e:	85 e2       	ldi	r24, 0x25	; 37
    fa80:	98 e7       	ldi	r25, 0x78	; 120
    fa82:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
		lcd_update_enable(true);
    fa86:	81 e0       	ldi	r24, 0x01	; 1
	}
}
    fa88:	cf 91       	pop	r28
		SERIAL_ECHOLNPGM("Z live adjust out of range. Setting to 0");
		eeprom_write_word_notify(reinterpret_cast<uint16_t *>(&(EEPROM_Sheets_base->
            s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)),
                    babystep_z);
		lcd_show_fullscreen_message_and_wait_P(PSTR("Z live adjust out of range. Setting to 0. Click to continue."));
		lcd_update_enable(true);
    fa8a:	0c 94 38 70 	jmp	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>
	}
}
    fa8e:	cf 91       	pop	r28
    fa90:	08 95       	ret

0000fa92 <gcode_G80()>:
}


// G80 - Automatic mesh bed leveling
static void gcode_G80()
{
    fa92:	2f 92       	push	r2
    fa94:	3f 92       	push	r3
    fa96:	4f 92       	push	r4
    fa98:	5f 92       	push	r5
    fa9a:	6f 92       	push	r6
    fa9c:	7f 92       	push	r7
    fa9e:	8f 92       	push	r8
    faa0:	9f 92       	push	r9
    faa2:	af 92       	push	r10
    faa4:	bf 92       	push	r11
    faa6:	cf 92       	push	r12
    faa8:	df 92       	push	r13
    faaa:	ef 92       	push	r14
    faac:	ff 92       	push	r15
    faae:	0f 93       	push	r16
    fab0:	1f 93       	push	r17
    fab2:	cf 93       	push	r28
    fab4:	df 93       	push	r29
    fab6:	cd b7       	in	r28, 0x3d	; 61
    fab8:	de b7       	in	r29, 0x3e	; 62
    faba:	a4 97       	sbiw	r28, 0x24	; 36
    fabc:	0f b6       	in	r0, 0x3f	; 63
    fabe:	f8 94       	cli
    fac0:	de bf       	out	0x3e, r29	; 62
    fac2:	0f be       	out	0x3f, r0	; 63
    fac4:	cd bf       	out	0x3d, r28	; 61
    constexpr float XY_AXIS_FEEDRATE = (homing_feedrate[X_AXIS] * 3) / 60;
    constexpr float Z_LIFT_FEEDRATE = homing_feedrate[Z_AXIS] / 60;
    constexpr float Z_CALIBRATION_THRESHOLD_TIGHT = 0.6f; // used for 7x7 MBL
    constexpr float Z_CALIBRATION_THRESHOLD_RELAXED = 1.f; // used for 3x3 MBL
    constexpr float MESH_HOME_Z_SEARCH_FAST = 0.35f;
    st_synchronize();
    fac6:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
    if (planner_aborted)
    faca:	80 91 42 0d 	lds	r24, 0x0D42	; 0x800d42 <planner_aborted>
    face:	81 11       	cpse	r24, r1
    fad0:	17 c0       	rjmp	.+46     	; 0xfb00 <gcode_G80()+0x6e>
        return;

    mesh_bed_leveling_flag = true;
    fad2:	81 e0       	ldi	r24, 0x01	; 1
    fad4:	80 93 72 12 	sts	0x1272, r24	; 0x801272 <mesh_bed_leveling_flag>

    // Firstly check if we know where we are
    if (!(axis_known_position[X_AXIS] && axis_known_position[Y_AXIS] && axis_known_position[Z_AXIS])) {
    fad8:	80 91 39 06 	lds	r24, 0x0639	; 0x800639 <axis_known_position>
    fadc:	88 23       	and	r24, r24
    fade:	49 f0       	breq	.+18     	; 0xfaf2 <gcode_G80()+0x60>
    fae0:	80 91 3a 06 	lds	r24, 0x063A	; 0x80063a <axis_known_position+0x1>
    fae4:	88 23       	and	r24, r24
    fae6:	29 f0       	breq	.+10     	; 0xfaf2 <gcode_G80()+0x60>
    fae8:	20 91 3b 06 	lds	r18, 0x063B	; 0x80063b <axis_known_position+0x2>
    faec:	2f 83       	std	Y+7, r18	; 0x07
    faee:	21 11       	cpse	r18, r1
    faf0:	20 c0       	rjmp	.+64     	; 0xfb32 <gcode_G80()+0xa0>

// Mark the command at the top of the command queue as new.
// Therefore it will not be removed from the queue.
void repeatcommand_front()
{
    cmdbuffer_front_already_processed = true;
    faf2:	81 e0       	ldi	r24, 0x01	; 1
    faf4:	80 93 53 12 	sts	0x1253, r24	; 0x801253 <cmdbuffer_front_already_processed>
        // We don't know where we are! HOME!
        // Push the commands to the front of the message queue in the reverse order!
        // There shall be always enough space reserved for these commands.
        repeatcommand_front(); // repeat G80 with all its parameters
        enquecommand_front_P(G28W);
    faf8:	81 ed       	ldi	r24, 0xD1	; 209
    fafa:	98 e6       	ldi	r25, 0x68	; 104
    fafc:	0f 94 78 67 	call	0x2cef0	; 0x2cef0 <enquecommand_front(char const*, bool) [clone .constprop.294]>
    custom_message_state = custom_message_state_old;
    lcd_update(2);

    st_synchronize();
    mesh_bed_leveling_flag = false;
}
    fb00:	a4 96       	adiw	r28, 0x24	; 36
    fb02:	0f b6       	in	r0, 0x3f	; 63
    fb04:	f8 94       	cli
    fb06:	de bf       	out	0x3e, r29	; 62
    fb08:	0f be       	out	0x3f, r0	; 63
    fb0a:	cd bf       	out	0x3d, r28	; 61
    fb0c:	df 91       	pop	r29
    fb0e:	cf 91       	pop	r28
    fb10:	1f 91       	pop	r17
    fb12:	0f 91       	pop	r16
    fb14:	ff 90       	pop	r15
    fb16:	ef 90       	pop	r14
    fb18:	df 90       	pop	r13
    fb1a:	cf 90       	pop	r12
    fb1c:	bf 90       	pop	r11
    fb1e:	af 90       	pop	r10
    fb20:	9f 90       	pop	r9
    fb22:	8f 90       	pop	r8
    fb24:	7f 90       	pop	r7
    fb26:	6f 90       	pop	r6
    fb28:	5f 90       	pop	r5
    fb2a:	4f 90       	pop	r4
    fb2c:	3f 90       	pop	r3
    fb2e:	2f 90       	pop	r2
    fb30:	08 95       	ret
        return;
    }
    run = false;
#endif //PINDA_THERMISTOR

    uint8_t nMeasPoints = eeprom_read_byte((uint8_t*)EEPROM_MBL_POINTS_NR);
    fb32:	8b ea       	ldi	r24, 0xAB	; 171
    fb34:	9d e0       	ldi	r25, 0x0D	; 13
    fb36:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
    fb3a:	18 2f       	mov	r17, r24
    if (uint8_t codeSeen = code_seen('N'), value = code_value_uint8(); codeSeen && (value == 7 || value == 3))
    fb3c:	8e e4       	ldi	r24, 0x4E	; 78
    fb3e:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
    fb42:	08 2f       	mov	r16, r24
    fb44:	0e 94 0a 56 	call	0xac14	; 0xac14 <code_value_uint8()>
    fb48:	8e 83       	std	Y+6, r24	; 0x06
    fb4a:	00 23       	and	r16, r16
    fb4c:	29 f0       	breq	.+10     	; 0xfb58 <gcode_G80()+0xc6>
    fb4e:	87 30       	cpi	r24, 0x07	; 7
    fb50:	09 f4       	brne	.+2      	; 0xfb54 <gcode_G80()+0xc2>
    fb52:	c9 c0       	rjmp	.+402    	; 0xfce6 <gcode_G80()+0x254>
    fb54:	83 30       	cpi	r24, 0x03	; 3
    fb56:	29 f0       	breq	.+10     	; 0xfb62 <gcode_G80()+0xd0>
      nMeasPoints = value;

    // 7x7 region MBL needs tighter thresholds for triggering a Z realignment. This is because you want to have as little of a misalignment as possible between
    // the "inner" MBL region and "outer" MBL region which is interpolated from Z calibration values.
    const float Z_CALIBRATION_THRESHOLD = (nMeasPoints == 3) ? Z_CALIBRATION_THRESHOLD_RELAXED : Z_CALIBRATION_THRESHOLD_TIGHT;
    fb58:	13 30       	cpi	r17, 0x03	; 3
    fb5a:	09 f0       	breq	.+2      	; 0xfb5e <gcode_G80()+0xcc>
    fb5c:	c3 c0       	rjmp	.+390    	; 0xfce4 <gcode_G80()+0x252>
    fb5e:	63 e0       	ldi	r22, 0x03	; 3
    fb60:	6e 83       	std	Y+6, r22	; 0x06
    fb62:	80 e0       	ldi	r24, 0x00	; 0
    fb64:	90 e0       	ldi	r25, 0x00	; 0
    fb66:	a0 e8       	ldi	r26, 0x80	; 128
    fb68:	bf e3       	ldi	r27, 0x3F	; 63
    fb6a:	8a 83       	std	Y+2, r24	; 0x02
    fb6c:	9b 83       	std	Y+3, r25	; 0x03
    fb6e:	ac 83       	std	Y+4, r26	; 0x04
    fb70:	bd 83       	std	Y+5, r27	; 0x05

    uint8_t nProbeRetryCount = eeprom_read_byte((uint8_t*)EEPROM_MBL_PROBE_NR);
    fb72:	8a ea       	ldi	r24, 0xAA	; 170
    fb74:	9d e0       	ldi	r25, 0x0D	; 13
    fb76:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
    fb7a:	88 8f       	std	Y+24, r24	; 0x18
    if (uint8_t codeSeen = code_seen('C'), value = code_value_uint8(); codeSeen && value >= 1 && value <= 10)
    fb7c:	83 e4       	ldi	r24, 0x43	; 67
    fb7e:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
    fb82:	18 2f       	mov	r17, r24
    fb84:	0e 94 0a 56 	call	0xac14	; 0xac14 <code_value_uint8()>
    fb88:	11 23       	and	r17, r17
    fb8a:	29 f0       	breq	.+10     	; 0xfb96 <gcode_G80()+0x104>
    fb8c:	88 23       	and	r24, r24
    fb8e:	19 f0       	breq	.+6      	; 0xfb96 <gcode_G80()+0x104>
    fb90:	8b 30       	cpi	r24, 0x0B	; 11
    fb92:	08 f4       	brcc	.+2      	; 0xfb96 <gcode_G80()+0x104>
    fb94:	88 8f       	std	Y+24, r24	; 0x18
      nProbeRetryCount = value;

    const float area_min_x = code_seen('X') ? code_value() - x_mesh_density - X_PROBE_OFFSET_FROM_EXTRUDER : -INFINITY;
    fb96:	88 e5       	ldi	r24, 0x58	; 88
    fb98:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
    fb9c:	88 23       	and	r24, r24
    fb9e:	09 f4       	brne	.+2      	; 0xfba2 <gcode_G80()+0x110>
    fba0:	ab c0       	rjmp	.+342    	; 0xfcf8 <gcode_G80()+0x266>
    fba2:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
    fba6:	20 e0       	ldi	r18, 0x00	; 0
    fba8:	30 e0       	ldi	r19, 0x00	; 0
    fbaa:	48 e0       	ldi	r20, 0x08	; 8
    fbac:	52 e4       	ldi	r21, 0x42	; 66
    fbae:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    fbb2:	20 e0       	ldi	r18, 0x00	; 0
    fbb4:	30 e0       	ldi	r19, 0x00	; 0
    fbb6:	48 eb       	ldi	r20, 0xB8	; 184
    fbb8:	51 e4       	ldi	r21, 0x41	; 65
    fbba:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    fbbe:	6a 87       	std	Y+10, r22	; 0x0a
    fbc0:	7b 87       	std	Y+11, r23	; 0x0b
    fbc2:	8c 87       	std	Y+12, r24	; 0x0c
    fbc4:	9d 87       	std	Y+13, r25	; 0x0d
    const float area_min_y = code_seen('Y') ? code_value() - y_mesh_density - Y_PROBE_OFFSET_FROM_EXTRUDER : -INFINITY;
    fbc6:	89 e5       	ldi	r24, 0x59	; 89
    fbc8:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
    fbcc:	88 23       	and	r24, r24
    fbce:	09 f4       	brne	.+2      	; 0xfbd2 <gcode_G80()+0x140>
    fbd0:	9c c0       	rjmp	.+312    	; 0xfd0a <gcode_G80()+0x278>
    fbd2:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
    fbd6:	20 e0       	ldi	r18, 0x00	; 0
    fbd8:	30 e0       	ldi	r19, 0x00	; 0
    fbda:	48 e0       	ldi	r20, 0x08	; 8
    fbdc:	52 e4       	ldi	r21, 0x42	; 66
    fbde:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    fbe2:	20 e0       	ldi	r18, 0x00	; 0
    fbe4:	30 e0       	ldi	r19, 0x00	; 0
    fbe6:	40 ea       	ldi	r20, 0xA0	; 160
    fbe8:	50 e4       	ldi	r21, 0x40	; 64
    fbea:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
    fbee:	6c 8b       	std	Y+20, r22	; 0x14
    fbf0:	7d 8b       	std	Y+21, r23	; 0x15
    fbf2:	8e 8b       	std	Y+22, r24	; 0x16
    fbf4:	9f 8b       	std	Y+23, r25	; 0x17
    const float area_max_x = code_seen('W') ? area_min_x + code_value() + 2 * x_mesh_density : INFINITY;
    fbf6:	87 e5       	ldi	r24, 0x57	; 87
    fbf8:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
    fbfc:	88 23       	and	r24, r24
    fbfe:	09 f4       	brne	.+2      	; 0xfc02 <gcode_G80()+0x170>
    fc00:	89 c0       	rjmp	.+274    	; 0xfd14 <gcode_G80()+0x282>
    fc02:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
    fc06:	2a 85       	ldd	r18, Y+10	; 0x0a
    fc08:	3b 85       	ldd	r19, Y+11	; 0x0b
    fc0a:	4c 85       	ldd	r20, Y+12	; 0x0c
    fc0c:	5d 85       	ldd	r21, Y+13	; 0x0d
    fc0e:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    fc12:	20 e0       	ldi	r18, 0x00	; 0
    fc14:	30 e0       	ldi	r19, 0x00	; 0
    fc16:	48 e8       	ldi	r20, 0x88	; 136
    fc18:	52 e4       	ldi	r21, 0x42	; 66
    fc1a:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    fc1e:	69 8f       	std	Y+25, r22	; 0x19
    fc20:	7a 8f       	std	Y+26, r23	; 0x1a
    fc22:	8b 8f       	std	Y+27, r24	; 0x1b
    fc24:	9c 8f       	std	Y+28, r25	; 0x1c
    const float area_max_y = code_seen('H') ? area_min_y + code_value() + 2 * y_mesh_density : INFINITY;
    fc26:	88 e4       	ldi	r24, 0x48	; 72
    fc28:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
    fc2c:	88 23       	and	r24, r24
    fc2e:	09 f4       	brne	.+2      	; 0xfc32 <gcode_G80()+0x1a0>
    fc30:	7a c0       	rjmp	.+244    	; 0xfd26 <gcode_G80()+0x294>
    fc32:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
    fc36:	2c 89       	ldd	r18, Y+20	; 0x14
    fc38:	3d 89       	ldd	r19, Y+21	; 0x15
    fc3a:	4e 89       	ldd	r20, Y+22	; 0x16
    fc3c:	5f 89       	ldd	r21, Y+23	; 0x17
    fc3e:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    fc42:	20 e0       	ldi	r18, 0x00	; 0
    fc44:	30 e0       	ldi	r19, 0x00	; 0
    fc46:	48 e8       	ldi	r20, 0x88	; 136
    fc48:	52 e4       	ldi	r21, 0x42	; 66
    fc4a:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    fc4e:	6d 8f       	std	Y+29, r22	; 0x1d
    fc50:	7e 8f       	std	Y+30, r23	; 0x1e
    fc52:	8f 8f       	std	Y+31, r24	; 0x1f
    fc54:	98 a3       	std	Y+32, r25	; 0x20

    mbl.reset(); //reset mesh bed leveling
    fc56:	0f 94 e3 7b 	call	0x2f7c6	; 0x2f7c6 <mesh_bed_leveling::reset() [clone .constprop.87]>
    mbl.z_values[0][0] = min_pos[Z_AXIS];
    fc5a:	80 91 2c 02 	lds	r24, 0x022C	; 0x80022c <min_pos+0x8>
    fc5e:	90 91 2d 02 	lds	r25, 0x022D	; 0x80022d <min_pos+0x9>
    fc62:	a0 91 2e 02 	lds	r26, 0x022E	; 0x80022e <min_pos+0xa>
    fc66:	b0 91 2f 02 	lds	r27, 0x022F	; 0x80022f <min_pos+0xb>
    fc6a:	80 93 0a 13 	sts	0x130A, r24	; 0x80130a <mbl+0x1>
    fc6e:	90 93 0b 13 	sts	0x130B, r25	; 0x80130b <mbl+0x2>
    fc72:	a0 93 0c 13 	sts	0x130C, r26	; 0x80130c <mbl+0x3>
    fc76:	b0 93 0d 13 	sts	0x130D, r27	; 0x80130d <mbl+0x4>

    // Reset baby stepping to zero, if the babystepping has already been loaded before.
    babystep_undo();
    fc7a:	0f 94 aa 54 	call	0x2a954	; 0x2a954 <babystep_undo()>
    fc7e:	05 ec       	ldi	r16, 0xC5	; 197
    fc80:	1f e0       	ldi	r17, 0x0F	; 15
bool is_bed_z_jitter_data_valid()
// offsets of the Z heiths of the calibration points from the first point are saved as 16bit signed int, scaled to tenths of microns
// if at least one 16bit integer has different value then -1 (0x0FFFF), data are considered valid and function returns true, otherwise it returns false
{
	for (int8_t i = 0; i < 8; ++i) {
		if (eeprom_read_word((uint16_t*)(EEPROM_BED_CALIBRATION_Z_JITTER + i * 2)) != 0x0FFFF)
    fc82:	c8 01       	movw	r24, r16
    fc84:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
    fc88:	01 96       	adiw	r24, 0x01	; 1
    fc8a:	09 f0       	breq	.+2      	; 0xfc8e <gcode_G80()+0x1fc>
    fc8c:	51 c0       	rjmp	.+162    	; 0xfd30 <gcode_G80()+0x29e>
    fc8e:	0e 5f       	subi	r16, 0xFE	; 254
    fc90:	1f 4f       	sbci	r17, 0xFF	; 255

bool is_bed_z_jitter_data_valid()
// offsets of the Z heiths of the calibration points from the first point are saved as 16bit signed int, scaled to tenths of microns
// if at least one 16bit integer has different value then -1 (0x0FFFF), data are considered valid and function returns true, otherwise it returns false
{
	for (int8_t i = 0; i < 8; ++i) {
    fc92:	05 3d       	cpi	r16, 0xD5	; 213
    fc94:	8f e0       	ldi	r24, 0x0F	; 15
    fc96:	18 07       	cpc	r17, r24
    fc98:	a1 f7       	brne	.-24     	; 0xfc82 <gcode_G80()+0x1f0>
		if (eeprom_read_word((uint16_t*)(EEPROM_BED_CALIBRATION_Z_JITTER + i * 2)) != 0x0FFFF)
            return true;
	}
    return false;
    fc9a:	21 2c       	mov	r2, r1
    fc9c:	a9 e0       	ldi	r26, 0x09	; 9
    fc9e:	b3 e1       	ldi	r27, 0x13	; 19
    fca0:	ba a3       	std	Y+34, r27	; 0x22
    fca2:	a9 a3       	std	Y+33, r26	; 0x21
// offsets of the Z heiths of the calibration points from the first point are saved as 16bit signed int, scaled to tenths of microns
// if at least one 16bit integer has different value then -1 (0x0FFFF), data are considered valid and function returns true, otherwise it returns false
{
	for (int8_t i = 0; i < 8; ++i) {
		if (eeprom_read_word((uint16_t*)(EEPROM_BED_CALIBRATION_Z_JITTER + i * 2)) != 0x0FFFF)
            return true;
    fca4:	b9 87       	std	Y+9, r27	; 0x09
    fca6:	a8 87       	std	Y+8, r26	; 0x08
    fca8:	51 2c       	mov	r5, r1
    fcaa:	41 2c       	mov	r4, r1

    // Initialize the default mesh from eeprom and calculate how many points are to be probed
    bool has_z = is_bed_z_jitter_data_valid(); //checks if we have data from Z calibration (offsets of the Z heiths of the 8 calibration points from the first point)
    uint8_t meshPointsToProbe = 0;
    fcac:	31 2c       	mov	r3, r1
    fcae:	04 2d       	mov	r16, r4
    for (uint8_t row = 0; row < MESH_NUM_Y_POINTS; row++) {
        for (uint8_t col = 0; col < MESH_NUM_X_POINTS; col++) {
            bool isOn3x3Mesh = ((row % 3 == 0) && (col % 3 == 0));
    fcb0:	84 2d       	mov	r24, r4
    fcb2:	63 e0       	ldi	r22, 0x03	; 3
    fcb4:	0f 94 8f a4 	call	0x3491e	; 0x3491e <__udivmodqi4>
    fcb8:	98 8b       	std	Y+16, r25	; 0x10
    fcba:	68 84       	ldd	r6, Y+8	; 0x08
    fcbc:	79 84       	ldd	r7, Y+9	; 0x09

    // Initialize the default mesh from eeprom and calculate how many points are to be probed
    bool has_z = is_bed_z_jitter_data_valid(); //checks if we have data from Z calibration (offsets of the Z heiths of the 8 calibration points from the first point)
    uint8_t meshPointsToProbe = 0;
    for (uint8_t row = 0; row < MESH_NUM_Y_POINTS; row++) {
        for (uint8_t col = 0; col < MESH_NUM_X_POINTS; col++) {
    fcbe:	10 e0       	ldi	r17, 0x00	; 0
            bool isOn3x3Mesh = ((row % 3 == 0) && (col % 3 == 0));
    fcc0:	f8 89       	ldd	r31, Y+16	; 0x10
    fcc2:	f1 11       	cpse	r31, r1
    fcc4:	37 c0       	rjmp	.+110    	; 0xfd34 <gcode_G80()+0x2a2>
    fcc6:	81 2f       	mov	r24, r17
    fcc8:	63 e0       	ldi	r22, 0x03	; 3
    fcca:	0f 94 8f a4 	call	0x3491e	; 0x3491e <__udivmodqi4>
    fcce:	91 11       	cpse	r25, r1
    fcd0:	31 c0       	rjmp	.+98     	; 0xfd34 <gcode_G80()+0x2a2>
            if (isOn3x3Mesh) {
                if (has_z && (row || col)) {
    fcd2:	21 10       	cpse	r2, r1
    fcd4:	3f c1       	rjmp	.+638    	; 0xff54 <gcode_G80()+0x4c2>
            } else {
                mbl.set_z(col, row, NAN);
            }

            // check for points that are skipped
            if (nMeasPoints == 3) {
    fcd6:	7e 81       	ldd	r23, Y+6	; 0x06
    fcd8:	73 30       	cpi	r23, 0x03	; 3
    fcda:	09 f4       	brne	.+2      	; 0xfcde <gcode_G80()+0x24c>
    fcdc:	70 c0       	rjmp	.+224    	; 0xfdbe <gcode_G80()+0x32c>
    fcde:	8f 81       	ldd	r24, Y+7	; 0x07
    fce0:	8e 87       	std	Y+14, r24	; 0x0e
    fce2:	37 c0       	rjmp	.+110    	; 0xfd52 <gcode_G80()+0x2c0>
    if (uint8_t codeSeen = code_seen('N'), value = code_value_uint8(); codeSeen && (value == 7 || value == 3))
      nMeasPoints = value;

    // 7x7 region MBL needs tighter thresholds for triggering a Z realignment. This is because you want to have as little of a misalignment as possible between
    // the "inner" MBL region and "outer" MBL region which is interpolated from Z calibration values.
    const float Z_CALIBRATION_THRESHOLD = (nMeasPoints == 3) ? Z_CALIBRATION_THRESHOLD_RELAXED : Z_CALIBRATION_THRESHOLD_TIGHT;
    fce4:	1e 83       	std	Y+6, r17	; 0x06
    fce6:	6a e9       	ldi	r22, 0x9A	; 154
    fce8:	79 e9       	ldi	r23, 0x99	; 153
    fcea:	89 e1       	ldi	r24, 0x19	; 25
    fcec:	9f e3       	ldi	r25, 0x3F	; 63
    fcee:	6a 83       	std	Y+2, r22	; 0x02
    fcf0:	7b 83       	std	Y+3, r23	; 0x03
    fcf2:	8c 83       	std	Y+4, r24	; 0x04
    fcf4:	9d 83       	std	Y+5, r25	; 0x05
    fcf6:	3d cf       	rjmp	.-390    	; 0xfb72 <gcode_G80()+0xe0>

    uint8_t nProbeRetryCount = eeprom_read_byte((uint8_t*)EEPROM_MBL_PROBE_NR);
    if (uint8_t codeSeen = code_seen('C'), value = code_value_uint8(); codeSeen && value >= 1 && value <= 10)
      nProbeRetryCount = value;

    const float area_min_x = code_seen('X') ? code_value() - x_mesh_density - X_PROBE_OFFSET_FROM_EXTRUDER : -INFINITY;
    fcf8:	80 e0       	ldi	r24, 0x00	; 0
    fcfa:	90 e0       	ldi	r25, 0x00	; 0
    fcfc:	a0 e8       	ldi	r26, 0x80	; 128
    fcfe:	bf ef       	ldi	r27, 0xFF	; 255
    fd00:	8a 87       	std	Y+10, r24	; 0x0a
    fd02:	9b 87       	std	Y+11, r25	; 0x0b
    fd04:	ac 87       	std	Y+12, r26	; 0x0c
    fd06:	bd 87       	std	Y+13, r27	; 0x0d
    fd08:	5e cf       	rjmp	.-324    	; 0xfbc6 <gcode_G80()+0x134>
    const float area_min_y = code_seen('Y') ? code_value() - y_mesh_density - Y_PROBE_OFFSET_FROM_EXTRUDER : -INFINITY;
    fd0a:	60 e0       	ldi	r22, 0x00	; 0
    fd0c:	70 e0       	ldi	r23, 0x00	; 0
    fd0e:	80 e8       	ldi	r24, 0x80	; 128
    fd10:	9f ef       	ldi	r25, 0xFF	; 255
    fd12:	6d cf       	rjmp	.-294    	; 0xfbee <gcode_G80()+0x15c>
    const float area_max_x = code_seen('W') ? area_min_x + code_value() + 2 * x_mesh_density : INFINITY;
    fd14:	80 e0       	ldi	r24, 0x00	; 0
    fd16:	90 e0       	ldi	r25, 0x00	; 0
    fd18:	a0 e8       	ldi	r26, 0x80	; 128
    fd1a:	bf e7       	ldi	r27, 0x7F	; 127
    fd1c:	89 8f       	std	Y+25, r24	; 0x19
    fd1e:	9a 8f       	std	Y+26, r25	; 0x1a
    fd20:	ab 8f       	std	Y+27, r26	; 0x1b
    fd22:	bc 8f       	std	Y+28, r27	; 0x1c
    fd24:	80 cf       	rjmp	.-256    	; 0xfc26 <gcode_G80()+0x194>
    const float area_max_y = code_seen('H') ? area_min_y + code_value() + 2 * y_mesh_density : INFINITY;
    fd26:	60 e0       	ldi	r22, 0x00	; 0
    fd28:	70 e0       	ldi	r23, 0x00	; 0
    fd2a:	80 e8       	ldi	r24, 0x80	; 128
    fd2c:	9f e7       	ldi	r25, 0x7F	; 127
    fd2e:	8f cf       	rjmp	.-226    	; 0xfc4e <gcode_G80()+0x1bc>
    fd30:	2f 80       	ldd	r2, Y+7	; 0x07
    fd32:	b4 cf       	rjmp	.-152    	; 0xfc9c <gcode_G80()+0x20a>
    void reset();

    static float get_x(int i) { return BED_X(i) + X_PROBE_OFFSET_FROM_EXTRUDER; }
    static float get_y(int i) { return BED_Y(i) + Y_PROBE_OFFSET_FROM_EXTRUDER; }
    float get_z(float x, float y);
    void set_z(uint8_t ix, uint8_t iy, float z) { z_values[iy][ix] = z; }
    fd34:	60 e0       	ldi	r22, 0x00	; 0
    fd36:	70 e0       	ldi	r23, 0x00	; 0
    fd38:	80 ec       	ldi	r24, 0xC0	; 192
    fd3a:	9f e7       	ldi	r25, 0x7F	; 127
    fd3c:	d3 01       	movw	r26, r6
    fd3e:	11 96       	adiw	r26, 0x01	; 1
    fd40:	6d 93       	st	X+, r22
    fd42:	7d 93       	st	X+, r23
    fd44:	8d 93       	st	X+, r24
    fd46:	9c 93       	st	X, r25
    fd48:	14 97       	sbiw	r26, 0x04	; 4
            } else {
                mbl.set_z(col, row, NAN);
            }

            // check for points that are skipped
            if (nMeasPoints == 3) {
    fd4a:	be 81       	ldd	r27, Y+6	; 0x06
    fd4c:	b3 30       	cpi	r27, 0x03	; 3
    fd4e:	c1 f1       	breq	.+112    	; 0xfdc0 <gcode_G80()+0x32e>
    fd50:	1e 86       	std	Y+14, r1	; 0x0e
                if (!isOn3x3Mesh)
                    continue;
            } else {
                const float x_pos = BED_X(col);
    fd52:	81 2f       	mov	r24, r17
    fd54:	0e 94 e0 5e 	call	0xbdc0	; 0xbdc0 <BED_X(unsigned char)>
    fd58:	4b 01       	movw	r8, r22
    fd5a:	5c 01       	movw	r10, r24
                const float y_pos = BED_Y(row);
    fd5c:	80 2f       	mov	r24, r16
    fd5e:	0e 94 e0 5e 	call	0xbdc0	; 0xbdc0 <BED_X(unsigned char)>
    fd62:	6b 01       	movw	r12, r22
    fd64:	7c 01       	movw	r14, r24
                if ((x_pos < area_min_x || x_pos > area_max_x || y_pos < area_min_y || y_pos > area_max_y) && (!isOn3x3Mesh || has_z)) {
    fd66:	a5 01       	movw	r20, r10
    fd68:	94 01       	movw	r18, r8
    fd6a:	6a 85       	ldd	r22, Y+10	; 0x0a
    fd6c:	7b 85       	ldd	r23, Y+11	; 0x0b
    fd6e:	8c 85       	ldd	r24, Y+12	; 0x0c
    fd70:	9d 85       	ldd	r25, Y+13	; 0x0d
    fd72:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
    fd76:	18 16       	cp	r1, r24
    fd78:	0c f4       	brge	.+2      	; 0xfd7c <gcode_G80()+0x2ea>
    fd7a:	1c c1       	rjmp	.+568    	; 0xffb4 <gcode_G80()+0x522>
    fd7c:	29 8d       	ldd	r18, Y+25	; 0x19
    fd7e:	3a 8d       	ldd	r19, Y+26	; 0x1a
    fd80:	4b 8d       	ldd	r20, Y+27	; 0x1b
    fd82:	5c 8d       	ldd	r21, Y+28	; 0x1c
    fd84:	c5 01       	movw	r24, r10
    fd86:	b4 01       	movw	r22, r8
    fd88:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
    fd8c:	18 16       	cp	r1, r24
    fd8e:	0c f4       	brge	.+2      	; 0xfd92 <gcode_G80()+0x300>
    fd90:	11 c1       	rjmp	.+546    	; 0xffb4 <gcode_G80()+0x522>
    fd92:	a7 01       	movw	r20, r14
    fd94:	96 01       	movw	r18, r12
    fd96:	6c 89       	ldd	r22, Y+20	; 0x14
    fd98:	7d 89       	ldd	r23, Y+21	; 0x15
    fd9a:	8e 89       	ldd	r24, Y+22	; 0x16
    fd9c:	9f 89       	ldd	r25, Y+23	; 0x17
    fd9e:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
    fda2:	18 16       	cp	r1, r24
    fda4:	0c f4       	brge	.+2      	; 0xfda8 <gcode_G80()+0x316>
    fda6:	06 c1       	rjmp	.+524    	; 0xffb4 <gcode_G80()+0x522>
    fda8:	2d 8d       	ldd	r18, Y+29	; 0x1d
    fdaa:	3e 8d       	ldd	r19, Y+30	; 0x1e
    fdac:	4f 8d       	ldd	r20, Y+31	; 0x1f
    fdae:	58 a1       	ldd	r21, Y+32	; 0x20
    fdb0:	c7 01       	movw	r24, r14
    fdb2:	b6 01       	movw	r22, r12
    fdb4:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
    fdb8:	18 16       	cp	r1, r24
    fdba:	0c f4       	brge	.+2      	; 0xfdbe <gcode_G80()+0x32c>
    fdbc:	fb c0       	rjmp	.+502    	; 0xffb4 <gcode_G80()+0x522>
                    continue;
                }
            }

            // increment the total point counter if the points are not skipped
            meshPointsToProbe++;
    fdbe:	33 94       	inc	r3

    // Initialize the default mesh from eeprom and calculate how many points are to be probed
    bool has_z = is_bed_z_jitter_data_valid(); //checks if we have data from Z calibration (offsets of the Z heiths of the 8 calibration points from the first point)
    uint8_t meshPointsToProbe = 0;
    for (uint8_t row = 0; row < MESH_NUM_Y_POINTS; row++) {
        for (uint8_t col = 0; col < MESH_NUM_X_POINTS; col++) {
    fdc0:	1f 5f       	subi	r17, 0xFF	; 255
    fdc2:	24 e0       	ldi	r18, 0x04	; 4
    fdc4:	62 0e       	add	r6, r18
    fdc6:	71 1c       	adc	r7, r1
    fdc8:	17 30       	cpi	r17, 0x07	; 7
    fdca:	09 f0       	breq	.+2      	; 0xfdce <gcode_G80()+0x33c>
    fdcc:	79 cf       	rjmp	.-270    	; 0xfcc0 <gcode_G80()+0x22e>
    fdce:	6f ef       	ldi	r22, 0xFF	; 255
    fdd0:	46 1a       	sub	r4, r22
    fdd2:	56 0a       	sbc	r5, r22
    fdd4:	88 85       	ldd	r24, Y+8	; 0x08
    fdd6:	99 85       	ldd	r25, Y+9	; 0x09
    fdd8:	4c 96       	adiw	r24, 0x1c	; 28
    fdda:	99 87       	std	Y+9, r25	; 0x09
    fddc:	88 87       	std	Y+8, r24	; 0x08
    babystep_undo();

    // Initialize the default mesh from eeprom and calculate how many points are to be probed
    bool has_z = is_bed_z_jitter_data_valid(); //checks if we have data from Z calibration (offsets of the Z heiths of the 8 calibration points from the first point)
    uint8_t meshPointsToProbe = 0;
    for (uint8_t row = 0; row < MESH_NUM_Y_POINTS; row++) {
    fdde:	97 e0       	ldi	r25, 0x07	; 7
    fde0:	49 16       	cp	r4, r25
    fde2:	51 04       	cpc	r5, r1
    fde4:	09 f0       	breq	.+2      	; 0xfde8 <gcode_G80()+0x356>
    fde6:	63 cf       	rjmp	.-314    	; 0xfcae <gcode_G80()+0x21c>

            // increment the total point counter if the points are not skipped
            meshPointsToProbe++;
        }
    }
    mbl.upsample_3x3(); //upsample the default mesh
    fde8:	0f 94 bd 92 	call	0x3257a	; 0x3257a <mesh_bed_leveling::upsample_3x3() [clone .constprop.52]>

    // Save custom message state, set a new custom message state to display: Calibrating point 9.
    CustomMsg custom_message_type_old = custom_message_type;
    fdec:	a0 91 5d 06 	lds	r26, 0x065D	; 0x80065d <custom_message_type>
    fdf0:	af 83       	std	Y+7, r26	; 0x07
    uint8_t custom_message_state_old = custom_message_state;
    fdf2:	b0 91 de 03 	lds	r27, 0x03DE	; 0x8003de <custom_message_state>
    fdf6:	b8 87       	std	Y+8, r27	; 0x08
    custom_message_type = CustomMsg::MeshBedLeveling;
    fdf8:	81 e0       	ldi	r24, 0x01	; 1
    fdfa:	80 93 5d 06 	sts	0x065D, r24	; 0x80065d <custom_message_type>
    custom_message_state = meshPointsToProbe + 10;
    fdfe:	8a e0       	ldi	r24, 0x0A	; 10
    fe00:	83 0d       	add	r24, r3
    fe02:	80 93 de 03 	sts	0x03DE, r24	; 0x8003de <custom_message_state>
    lcd_update(1);
    fe06:	81 e0       	ldi	r24, 0x01	; 1
    fe08:	0e 94 f9 6e 	call	0xddf2	; 0xddf2 <lcd_update(unsigned char)>

    // Lift Z to a safe position before probing the first point
    current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
    fe0c:	80 e0       	ldi	r24, 0x00	; 0
    fe0e:	90 e0       	ldi	r25, 0x00	; 0
    fe10:	a0 ea       	ldi	r26, 0xA0	; 160
    fe12:	b0 e4       	ldi	r27, 0x40	; 64
    fe14:	80 93 69 12 	sts	0x1269, r24	; 0x801269 <current_position+0x8>
    fe18:	90 93 6a 12 	sts	0x126A, r25	; 0x80126a <current_position+0x9>
    fe1c:	a0 93 6b 12 	sts	0x126B, r26	; 0x80126b <current_position+0xa>
    fe20:	b0 93 6c 12 	sts	0x126C, r27	; 0x80126c <current_position+0xb>
    plan_buffer_line_curposXYZE(Z_LIFT_FEEDRATE);
    fe24:	65 e5       	ldi	r22, 0x55	; 85
    fe26:	75 e5       	ldi	r23, 0x55	; 85
    fe28:	85 e5       	ldi	r24, 0x55	; 85
    fe2a:	91 e4       	ldi	r25, 0x41	; 65
    fe2c:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>

    // Cycle through all points and probe them
    int l_feedmultiply = setup_for_endstop_move(false); //save feedrate and feedmultiply, sets feedmultiply to 100
    fe30:	80 e0       	ldi	r24, 0x00	; 0
    fe32:	0e 94 66 65 	call	0xcacc	; 0xcacc <setup_for_endstop_move(bool) [clone .lto_priv.381]>
    fe36:	9c a3       	std	Y+36, r25	; 0x24
    fe38:	8b a3       	std	Y+35, r24	; 0x23
    fe3a:	31 2c       	mov	r3, r1
    uint8_t mesh_point = 0; //index number of calibration point
    while (mesh_point != MESH_NUM_X_POINTS * MESH_NUM_Y_POINTS) {
        // Get coords of a measuring point.
        uint8_t ix = mesh_point % MESH_NUM_X_POINTS; // from 0 to MESH_NUM_X_POINTS - 1
    fe3c:	83 2d       	mov	r24, r3
    fe3e:	67 e0       	ldi	r22, 0x07	; 7
    fe40:	0f 94 8f a4 	call	0x3491e	; 0x3491e <__udivmodqi4>
    fe44:	f8 2e       	mov	r15, r24
    fe46:	09 2f       	mov	r16, r25
        uint8_t iy = mesh_point / MESH_NUM_X_POINTS;
        if (iy & 1) ix = (MESH_NUM_X_POINTS - 1) - ix; // Zig zag
    fe48:	68 2f       	mov	r22, r24
    fe4a:	70 e0       	ldi	r23, 0x00	; 0
    fe4c:	7f 87       	std	Y+15, r23	; 0x0f
    fe4e:	6e 87       	std	Y+14, r22	; 0x0e
    fe50:	80 ff       	sbrs	r24, 0
    fe52:	03 c0       	rjmp	.+6      	; 0xfe5a <gcode_G80()+0x3c8>
    fe54:	76 e0       	ldi	r23, 0x06	; 6
    fe56:	79 1b       	sub	r23, r25
    fe58:	07 2f       	mov	r16, r23
        bool isOn3x3Mesh = ((ix % 3 == 0) && (iy % 3 == 0));
    fe5a:	80 2f       	mov	r24, r16
    fe5c:	63 e0       	ldi	r22, 0x03	; 3
    fe5e:	0f 94 8f a4 	call	0x3491e	; 0x3491e <__udivmodqi4>
    fe62:	91 11       	cpse	r25, r1
    fe64:	05 c0       	rjmp	.+10     	; 0xfe70 <gcode_G80()+0x3de>
    fe66:	8f 2d       	mov	r24, r15
    fe68:	0f 94 8f a4 	call	0x3491e	; 0x3491e <__udivmodqi4>
    fe6c:	11 e0       	ldi	r17, 0x01	; 1
    fe6e:	91 11       	cpse	r25, r1
    fe70:	10 e0       	ldi	r17, 0x00	; 0
        float x_pos = BED_X(ix);
    fe72:	80 2f       	mov	r24, r16
    fe74:	0e 94 e0 5e 	call	0xbdc0	; 0xbdc0 <BED_X(unsigned char)>
    fe78:	68 8b       	std	Y+16, r22	; 0x10
    fe7a:	79 8b       	std	Y+17, r23	; 0x11
    fe7c:	8a 8b       	std	Y+18, r24	; 0x12
    fe7e:	9b 8b       	std	Y+19, r25	; 0x13
        float y_pos = BED_Y(iy);
    fe80:	8f 2d       	mov	r24, r15
    fe82:	0e 94 e0 5e 	call	0xbdc0	; 0xbdc0 <BED_X(unsigned char)>
    fe86:	4b 01       	movw	r8, r22
    fe88:	5c 01       	movw	r10, r24

        if (nMeasPoints == 3) {
    fe8a:	8e 81       	ldd	r24, Y+6	; 0x06
    fe8c:	83 30       	cpi	r24, 0x03	; 3
    fe8e:	09 f0       	breq	.+2      	; 0xfe92 <gcode_G80()+0x400>
    fe90:	99 c0       	rjmp	.+306    	; 0xffc4 <gcode_G80()+0x532>
            if (!isOn3x3Mesh) {
    fe92:	11 11       	cpse	r17, r1
    fe94:	c8 c0       	rjmp	.+400    	; 0x10026 <gcode_G80()+0x594>
    fe96:	27 e0       	ldi	r18, 0x07	; 7
    fe98:	ae 85       	ldd	r26, Y+14	; 0x0e
    fe9a:	bf 85       	ldd	r27, Y+15	; 0x0f
    fe9c:	2a 9f       	mul	r18, r26
    fe9e:	f0 01       	movw	r30, r0
    fea0:	2b 9f       	mul	r18, r27
    fea2:	f0 0d       	add	r31, r0
    fea4:	11 24       	eor	r1, r1
    fea6:	e0 0f       	add	r30, r16
    fea8:	f1 1d       	adc	r31, r1
    feaa:	ee 0f       	add	r30, r30
    feac:	ff 1f       	adc	r31, r31
    feae:	ee 0f       	add	r30, r30
    feb0:	ff 1f       	adc	r31, r31
    feb2:	e7 5f       	subi	r30, 0xF7	; 247
    feb4:	fc 4e       	sbci	r31, 0xEC	; 236
    feb6:	60 e0       	ldi	r22, 0x00	; 0
    feb8:	70 e0       	ldi	r23, 0x00	; 0
    feba:	80 ec       	ldi	r24, 0xC0	; 192
    febc:	9f e7       	ldi	r25, 0x7F	; 127
    febe:	61 83       	std	Z+1, r22	; 0x01
    fec0:	72 83       	std	Z+2, r23	; 0x02
    fec2:	83 83       	std	Z+3, r24	; 0x03
    fec4:	94 83       	std	Z+4, r25	; 0x04
    fec6:	33 94       	inc	r3
    plan_buffer_line_curposXYZE(Z_LIFT_FEEDRATE);

    // Cycle through all points and probe them
    int l_feedmultiply = setup_for_endstop_move(false); //save feedrate and feedmultiply, sets feedmultiply to 100
    uint8_t mesh_point = 0; //index number of calibration point
    while (mesh_point != MESH_NUM_X_POINTS * MESH_NUM_Y_POINTS) {
    fec8:	e1 e3       	ldi	r30, 0x31	; 49
    feca:	3e 12       	cpse	r3, r30
    fecc:	b7 cf       	rjmp	.-146    	; 0xfe3c <gcode_G80()+0x3aa>

        custom_message_state--;
        mesh_point++;
        lcd_update(1);
    }
    current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
    fece:	80 e0       	ldi	r24, 0x00	; 0
    fed0:	90 e0       	ldi	r25, 0x00	; 0
    fed2:	a0 ea       	ldi	r26, 0xA0	; 160
    fed4:	b0 e4       	ldi	r27, 0x40	; 64
    fed6:	80 93 69 12 	sts	0x1269, r24	; 0x801269 <current_position+0x8>
    feda:	90 93 6a 12 	sts	0x126A, r25	; 0x80126a <current_position+0x9>
    fede:	a0 93 6b 12 	sts	0x126B, r26	; 0x80126b <current_position+0xa>
    fee2:	b0 93 6c 12 	sts	0x126C, r27	; 0x80126c <current_position+0xb>
    plan_buffer_line_curposXYZE(Z_LIFT_FEEDRATE);
    fee6:	65 e5       	ldi	r22, 0x55	; 85
    fee8:	75 e5       	ldi	r23, 0x55	; 85
    feea:	85 e5       	ldi	r24, 0x55	; 85
    feec:	91 e4       	ldi	r25, 0x41	; 65
    feee:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
    st_synchronize();
    fef2:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
    static uint8_t g80_fail_cnt = 0;
    if (mesh_point != MESH_NUM_X_POINTS * MESH_NUM_Y_POINTS) {
    fef6:	b1 e3       	ldi	r27, 0x31	; 49
    fef8:	3b 16       	cp	r3, r27
    fefa:	09 f4       	brne	.+2      	; 0xfefe <gcode_G80()+0x46c>
    fefc:	3c c2       	rjmp	.+1144   	; 0x10376 <gcode_G80()+0x8e4>
        if (g80_fail_cnt++ >= 1) {
    fefe:	80 91 3d 03 	lds	r24, 0x033D	; 0x80033d <gcode_G80()::g80_fail_cnt>
    ff02:	91 e0       	ldi	r25, 0x01	; 1
    ff04:	98 0f       	add	r25, r24
    ff06:	90 93 3d 03 	sts	0x033D, r25	; 0x80033d <gcode_G80()::g80_fail_cnt>
    ff0a:	88 23       	and	r24, r24
    ff0c:	09 f4       	brne	.+2      	; 0xff10 <gcode_G80()+0x47e>
    ff0e:	d3 c1       	rjmp	.+934    	; 0x102b6 <gcode_G80()+0x824>
            print_stop();
    ff10:	60 e0       	ldi	r22, 0x00	; 0
    ff12:	80 e0       	ldi	r24, 0x00	; 0
    ff14:	0e 94 f9 de 	call	0x1bdf2	; 0x1bdf2 <print_stop(bool, bool)>
            lcd_show_fullscreen_message_and_wait_P(_T(MSG_MBL_FAILED));
    ff18:	84 e3       	ldi	r24, 0x34	; 52
    ff1a:	96 e3       	ldi	r25, 0x36	; 54
    ff1c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
    ff20:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
            lcd_z_calibration_prompt(false);
    ff24:	80 e0       	ldi	r24, 0x00	; 0
    ff26:	0e 94 f2 e9 	call	0x1d3e4	; 0x1d3e4 <lcd_z_calibration_prompt(bool)>
        current_position[E_AXIS] += default_retraction;
        plan_buffer_line_curposXYZE(400);
    }
#endif // !PINDA_THERMISTOR
exit:
    KEEPALIVE_STATE(NOT_BUSY);
    ff2a:	81 e0       	ldi	r24, 0x01	; 1
    ff2c:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
    // Restore custom message state
    lcd_setstatuspgm(MSG_WELCOME);
    ff30:	86 ee       	ldi	r24, 0xE6	; 230
    ff32:	9b e6       	ldi	r25, 0x6B	; 107
    ff34:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
    custom_message_type = custom_message_type_old;
    ff38:	2f 81       	ldd	r18, Y+7	; 0x07
    ff3a:	20 93 5d 06 	sts	0x065D, r18	; 0x80065d <custom_message_type>
    custom_message_state = custom_message_state_old;
    ff3e:	68 85       	ldd	r22, Y+8	; 0x08
    ff40:	60 93 de 03 	sts	0x03DE, r22	; 0x8003de <custom_message_state>
    lcd_update(2);
    ff44:	82 e0       	ldi	r24, 0x02	; 2
    ff46:	0e 94 f9 6e 	call	0xddf2	; 0xddf2 <lcd_update(unsigned char)>

    st_synchronize();
    ff4a:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
    mesh_bed_leveling_flag = false;
    ff4e:	10 92 72 12 	sts	0x1272, r1	; 0x801272 <mesh_bed_leveling_flag>
    ff52:	d6 cd       	rjmp	.-1108   	; 0xfb00 <gcode_G80()+0x6e>
    uint8_t meshPointsToProbe = 0;
    for (uint8_t row = 0; row < MESH_NUM_Y_POINTS; row++) {
        for (uint8_t col = 0; col < MESH_NUM_X_POINTS; col++) {
            bool isOn3x3Mesh = ((row % 3 == 0) && (col % 3 == 0));
            if (isOn3x3Mesh) {
                if (has_z && (row || col)) {
    ff54:	01 11       	cpse	r16, r1
    ff56:	03 c0       	rjmp	.+6      	; 0xff5e <gcode_G80()+0x4cc>
    ff58:	11 23       	and	r17, r17
    ff5a:	09 f4       	brne	.+2      	; 0xff5e <gcode_G80()+0x4cc>
    ff5c:	bc ce       	rjmp	.-648    	; 0xfcd6 <gcode_G80()+0x244>
                    // Reconstruct the mesh saved in eeprom
                    uint16_t z_offset_u = eeprom_read_word((uint16_t*)(EEPROM_BED_CALIBRATION_Z_JITTER + 2 * ((col/3) + row - 1)));
    ff5e:	81 2f       	mov	r24, r17
    ff60:	63 e0       	ldi	r22, 0x03	; 3
    ff62:	0f 94 9b a4 	call	0x34936	; 0x34936 <__divmodqi4>
    ff66:	84 0d       	add	r24, r4
    ff68:	95 2d       	mov	r25, r5
    ff6a:	91 1d       	adc	r25, r1
    ff6c:	88 0f       	add	r24, r24
    ff6e:	99 1f       	adc	r25, r25
    ff70:	8d 53       	subi	r24, 0x3D	; 61
    ff72:	90 4f       	sbci	r25, 0xF0	; 240
    ff74:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
                    const float z0 = mbl.z_values[0][0] + *reinterpret_cast<int16_t*>(&z_offset_u) * 0.01;
    ff78:	bc 01       	movw	r22, r24
    ff7a:	99 0f       	add	r25, r25
    ff7c:	88 0b       	sbc	r24, r24
    ff7e:	99 0b       	sbc	r25, r25
    ff80:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
    ff84:	2a e0       	ldi	r18, 0x0A	; 10
    ff86:	37 ed       	ldi	r19, 0xD7	; 215
    ff88:	43 e2       	ldi	r20, 0x23	; 35
    ff8a:	5c e3       	ldi	r21, 0x3C	; 60
    ff8c:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    ff90:	9b 01       	movw	r18, r22
    ff92:	ac 01       	movw	r20, r24
    ff94:	60 91 0a 13 	lds	r22, 0x130A	; 0x80130a <mbl+0x1>
    ff98:	70 91 0b 13 	lds	r23, 0x130B	; 0x80130b <mbl+0x2>
    ff9c:	80 91 0c 13 	lds	r24, 0x130C	; 0x80130c <mbl+0x3>
    ffa0:	90 91 0d 13 	lds	r25, 0x130D	; 0x80130d <mbl+0x4>
    ffa4:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    ffa8:	f3 01       	movw	r30, r6
    ffaa:	61 83       	std	Z+1, r22	; 0x01
    ffac:	72 83       	std	Z+2, r23	; 0x02
    ffae:	83 83       	std	Z+3, r24	; 0x03
    ffb0:	94 83       	std	Z+4, r25	; 0x04
    ffb2:	91 ce       	rjmp	.-734    	; 0xfcd6 <gcode_G80()+0x244>
                if (!isOn3x3Mesh)
                    continue;
            } else {
                const float x_pos = BED_X(col);
                const float y_pos = BED_Y(row);
                if ((x_pos < area_min_x || x_pos > area_max_x || y_pos < area_min_y || y_pos > area_max_y) && (!isOn3x3Mesh || has_z)) {
    ffb4:	fe 85       	ldd	r31, Y+14	; 0x0e
    ffb6:	ff 23       	and	r31, r31
    ffb8:	09 f4       	brne	.+2      	; 0xffbc <gcode_G80()+0x52a>
    ffba:	02 cf       	rjmp	.-508    	; 0xfdc0 <gcode_G80()+0x32e>
    ffbc:	22 20       	and	r2, r2
    ffbe:	09 f4       	brne	.+2      	; 0xffc2 <gcode_G80()+0x530>
    ffc0:	fe ce       	rjmp	.-516    	; 0xfdbe <gcode_G80()+0x32c>
    ffc2:	fe ce       	rjmp	.-516    	; 0xfdc0 <gcode_G80()+0x32e>
            if (!isOn3x3Mesh) {
                mesh_point++;
                mbl.set_z(ix, iy, NAN);
                continue; //skip
            }
        } else if ((x_pos < area_min_x || x_pos > area_max_x || y_pos < area_min_y || y_pos > area_max_y) && (!isOn3x3Mesh || has_z)) {
    ffc4:	28 89       	ldd	r18, Y+16	; 0x10
    ffc6:	39 89       	ldd	r19, Y+17	; 0x11
    ffc8:	4a 89       	ldd	r20, Y+18	; 0x12
    ffca:	5b 89       	ldd	r21, Y+19	; 0x13
    ffcc:	6a 85       	ldd	r22, Y+10	; 0x0a
    ffce:	7b 85       	ldd	r23, Y+11	; 0x0b
    ffd0:	8c 85       	ldd	r24, Y+12	; 0x0c
    ffd2:	9d 85       	ldd	r25, Y+13	; 0x0d
    ffd4:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
    ffd8:	18 16       	cp	r1, r24
    ffda:	04 f1       	brlt	.+64     	; 0x1001c <gcode_G80()+0x58a>
    ffdc:	28 89       	ldd	r18, Y+16	; 0x10
    ffde:	39 89       	ldd	r19, Y+17	; 0x11
    ffe0:	4a 89       	ldd	r20, Y+18	; 0x12
    ffe2:	5b 89       	ldd	r21, Y+19	; 0x13
    ffe4:	69 8d       	ldd	r22, Y+25	; 0x19
    ffe6:	7a 8d       	ldd	r23, Y+26	; 0x1a
    ffe8:	8b 8d       	ldd	r24, Y+27	; 0x1b
    ffea:	9c 8d       	ldd	r25, Y+28	; 0x1c
    ffec:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
    fff0:	87 fd       	sbrc	r24, 7
    fff2:	14 c0       	rjmp	.+40     	; 0x1001c <gcode_G80()+0x58a>
    fff4:	a5 01       	movw	r20, r10
    fff6:	94 01       	movw	r18, r8
    fff8:	6c 89       	ldd	r22, Y+20	; 0x14
    fffa:	7d 89       	ldd	r23, Y+21	; 0x15
    fffc:	8e 89       	ldd	r24, Y+22	; 0x16
    fffe:	9f 89       	ldd	r25, Y+23	; 0x17
   10000:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   10004:	18 16       	cp	r1, r24
   10006:	54 f0       	brlt	.+20     	; 0x1001c <gcode_G80()+0x58a>
   10008:	a5 01       	movw	r20, r10
   1000a:	94 01       	movw	r18, r8
   1000c:	6d 8d       	ldd	r22, Y+29	; 0x1d
   1000e:	7e 8d       	ldd	r23, Y+30	; 0x1e
   10010:	8f 8d       	ldd	r24, Y+31	; 0x1f
   10012:	98 a1       	ldd	r25, Y+32	; 0x20
   10014:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   10018:	87 ff       	sbrs	r24, 7
   1001a:	05 c0       	rjmp	.+10     	; 0x10026 <gcode_G80()+0x594>
   1001c:	11 23       	and	r17, r17
   1001e:	09 f4       	brne	.+2      	; 0x10022 <gcode_G80()+0x590>
   10020:	52 cf       	rjmp	.-348    	; 0xfec6 <gcode_G80()+0x434>
   10022:	21 10       	cpse	r2, r1
   10024:	50 cf       	rjmp	.-352    	; 0xfec6 <gcode_G80()+0x434>
            mesh_point++;
            continue; //skip
        }

        // Move Z up to the probe height of the current Z point.
        const float z0 = mbl.z_values[iy][ix];
   10026:	10 e0       	ldi	r17, 0x00	; 0
   10028:	a7 e0       	ldi	r26, 0x07	; 7
   1002a:	8e 85       	ldd	r24, Y+14	; 0x0e
   1002c:	9f 85       	ldd	r25, Y+15	; 0x0f
   1002e:	a8 9f       	mul	r26, r24
   10030:	f0 01       	movw	r30, r0
   10032:	a9 9f       	mul	r26, r25
   10034:	f0 0d       	add	r31, r0
   10036:	11 24       	eor	r1, r1
   10038:	e0 0f       	add	r30, r16
   1003a:	f1 1f       	adc	r31, r17
   1003c:	ee 0f       	add	r30, r30
   1003e:	ff 1f       	adc	r31, r31
   10040:	ee 0f       	add	r30, r30
   10042:	ff 1f       	adc	r31, r31
   10044:	e7 5f       	subi	r30, 0xF7	; 247
   10046:	fc 4e       	sbci	r31, 0xEC	; 236
   10048:	41 80       	ldd	r4, Z+1	; 0x01
   1004a:	52 80       	ldd	r5, Z+2	; 0x02
   1004c:	63 80       	ldd	r6, Z+3	; 0x03
   1004e:	74 80       	ldd	r7, Z+4	; 0x04
        const float init_z_bckp = !has_z ? MESH_HOME_Z_SEARCH : z0 + MESH_HOME_Z_SEARCH_FAST;
   10050:	c1 2c       	mov	r12, r1
   10052:	d1 2c       	mov	r13, r1
   10054:	e0 ea       	ldi	r30, 0xA0	; 160
   10056:	ee 2e       	mov	r14, r30
   10058:	e0 e4       	ldi	r30, 0x40	; 64
   1005a:	fe 2e       	mov	r15, r30
   1005c:	22 20       	and	r2, r2
   1005e:	51 f0       	breq	.+20     	; 0x10074 <gcode_G80()+0x5e2>
   10060:	23 e3       	ldi	r18, 0x33	; 51
   10062:	33 e3       	ldi	r19, 0x33	; 51
   10064:	43 eb       	ldi	r20, 0xB3	; 179
   10066:	5e e3       	ldi	r21, 0x3E	; 62
   10068:	c3 01       	movw	r24, r6
   1006a:	b2 01       	movw	r22, r4
   1006c:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   10070:	6b 01       	movw	r12, r22
   10072:	7c 01       	movw	r14, r24
        if (init_z_bckp > current_position[Z_AXIS]) {
   10074:	a7 01       	movw	r20, r14
   10076:	96 01       	movw	r18, r12
   10078:	60 91 69 12 	lds	r22, 0x1269	; 0x801269 <current_position+0x8>
   1007c:	70 91 6a 12 	lds	r23, 0x126A	; 0x80126a <current_position+0x9>
   10080:	80 91 6b 12 	lds	r24, 0x126B	; 0x80126b <current_position+0xa>
   10084:	90 91 6c 12 	lds	r25, 0x126C	; 0x80126c <current_position+0xb>
   10088:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   1008c:	87 ff       	sbrs	r24, 7
   1008e:	10 c0       	rjmp	.+32     	; 0x100b0 <gcode_G80()+0x61e>
            current_position[Z_AXIS] = init_z_bckp;
   10090:	c0 92 69 12 	sts	0x1269, r12	; 0x801269 <current_position+0x8>
   10094:	d0 92 6a 12 	sts	0x126A, r13	; 0x80126a <current_position+0x9>
   10098:	e0 92 6b 12 	sts	0x126B, r14	; 0x80126b <current_position+0xa>
   1009c:	f0 92 6c 12 	sts	0x126C, r15	; 0x80126c <current_position+0xb>
            plan_buffer_line_curposXYZE(Z_LIFT_FEEDRATE);
   100a0:	65 e5       	ldi	r22, 0x55	; 85
   100a2:	75 e5       	ldi	r23, 0x55	; 85
   100a4:	85 e5       	ldi	r24, 0x55	; 85
   100a6:	91 e4       	ldi	r25, 0x41	; 65
   100a8:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
            st_synchronize();
   100ac:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
        }

        // Move to XY position of the sensor point.
        current_position[X_AXIS] = x_pos;
   100b0:	68 89       	ldd	r22, Y+16	; 0x10
   100b2:	79 89       	ldd	r23, Y+17	; 0x11
   100b4:	8a 89       	ldd	r24, Y+18	; 0x12
   100b6:	9b 89       	ldd	r25, Y+19	; 0x13
   100b8:	60 93 61 12 	sts	0x1261, r22	; 0x801261 <current_position>
   100bc:	70 93 62 12 	sts	0x1262, r23	; 0x801262 <current_position+0x1>
   100c0:	80 93 63 12 	sts	0x1263, r24	; 0x801263 <current_position+0x2>
   100c4:	90 93 64 12 	sts	0x1264, r25	; 0x801264 <current_position+0x3>
        current_position[Y_AXIS] = y_pos;
   100c8:	80 92 65 12 	sts	0x1265, r8	; 0x801265 <current_position+0x4>
   100cc:	90 92 66 12 	sts	0x1266, r9	; 0x801266 <current_position+0x5>
   100d0:	a0 92 67 12 	sts	0x1267, r10	; 0x801267 <current_position+0x6>
   100d4:	b0 92 68 12 	sts	0x1268, r11	; 0x801268 <current_position+0x7>

        world2machine_clamp(current_position[X_AXIS], current_position[Y_AXIS]);
   100d8:	65 e6       	ldi	r22, 0x65	; 101
   100da:	72 e1       	ldi	r23, 0x12	; 18
   100dc:	81 e6       	ldi	r24, 0x61	; 97
   100de:	92 e1       	ldi	r25, 0x12	; 18
   100e0:	0e 94 1e 69 	call	0xd23c	; 0xd23c <world2machine_clamp(float&, float&)>

        plan_buffer_line_curposXYZE(XY_AXIS_FEEDRATE);
   100e4:	60 e0       	ldi	r22, 0x00	; 0
   100e6:	70 e0       	ldi	r23, 0x00	; 0
   100e8:	86 e1       	ldi	r24, 0x16	; 22
   100ea:	93 e4       	ldi	r25, 0x43	; 67
   100ec:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
        st_synchronize();
   100f0:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
        if (planner_aborted)
   100f4:	80 91 42 0d 	lds	r24, 0x0D42	; 0x800d42 <planner_aborted>
   100f8:	88 23       	and	r24, r24
   100fa:	39 f0       	breq	.+14     	; 0x1010a <gcode_G80()+0x678>
        {
            custom_message_type = custom_message_type_old;
   100fc:	7f 81       	ldd	r23, Y+7	; 0x07
   100fe:	70 93 5d 06 	sts	0x065D, r23	; 0x80065d <custom_message_type>
            custom_message_state = custom_message_state_old;
   10102:	88 85       	ldd	r24, Y+8	; 0x08
   10104:	80 93 de 03 	sts	0x03DE, r24	; 0x8003de <custom_message_state>
   10108:	fb cc       	rjmp	.-1546   	; 0xfb00 <gcode_G80()+0x6e>
            return;
        }

        // Go down until endstop is hit
        if (!find_bed_induction_sensor_point_z(has_z ? z0 - Z_CALIBRATION_THRESHOLD : -10.f, nProbeRetryCount)) { //if we have data from z calibration max allowed difference is 1mm for each point, if we dont have data max difference is 10mm from initial point
   1010a:	81 2c       	mov	r8, r1
   1010c:	91 2c       	mov	r9, r1
   1010e:	70 e2       	ldi	r23, 0x20	; 32
   10110:	a7 2e       	mov	r10, r23
   10112:	71 ec       	ldi	r23, 0xC1	; 193
   10114:	b7 2e       	mov	r11, r23
   10116:	22 20       	and	r2, r2
   10118:	51 f0       	breq	.+20     	; 0x1012e <gcode_G80()+0x69c>
   1011a:	2a 81       	ldd	r18, Y+2	; 0x02
   1011c:	3b 81       	ldd	r19, Y+3	; 0x03
   1011e:	4c 81       	ldd	r20, Y+4	; 0x04
   10120:	5d 81       	ldd	r21, Y+5	; 0x05
   10122:	c3 01       	movw	r24, r6
   10124:	b2 01       	movw	r22, r4
   10126:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   1012a:	4b 01       	movw	r8, r22
   1012c:	5c 01       	movw	r10, r24
   1012e:	48 8d       	ldd	r20, Y+24	; 0x18
   10130:	c5 01       	movw	r24, r10
   10132:	b4 01       	movw	r22, r8
   10134:	0f 94 ed 7b 	call	0x2f7da	; 0x2f7da <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.86]>
   10138:	81 11       	cpse	r24, r1
   1013a:	0b c0       	rjmp	.+22     	; 0x10152 <gcode_G80()+0x6c0>
            current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
            plan_buffer_line_curposXYZE(Z_LIFT_FEEDRATE);
            st_synchronize();

            if (!find_bed_induction_sensor_point_z(has_z ? z0 - Z_CALIBRATION_THRESHOLD : -10.f, nProbeRetryCount)) { //if we have data from z calibration max allowed difference is 1mm for each point, if we dont have data max difference is 10mm from initial point
                printf_P(_T(MSG_BED_LEVELING_FAILED_POINT_LOW));
   1013c:	8e ef       	ldi	r24, 0xFE	; 254
   1013e:	99 e3       	ldi	r25, 0x39	; 57
   10140:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   10144:	9f 93       	push	r25
   10146:	8f 93       	push	r24
   10148:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   1014c:	0f 90       	pop	r0
   1014e:	0f 90       	pop	r0
   10150:	be ce       	rjmp	.-644    	; 0xfece <gcode_G80()+0x43c>
        // Go down until endstop is hit
        if (!find_bed_induction_sensor_point_z(has_z ? z0 - Z_CALIBRATION_THRESHOLD : -10.f, nProbeRetryCount)) { //if we have data from z calibration max allowed difference is 1mm for each point, if we dont have data max difference is 10mm from initial point
            printf_P(_T(MSG_BED_LEVELING_FAILED_POINT_LOW));
            break;
        }
        if (init_z_bckp - current_position[Z_AXIS] < 0.f) { //broken cable or initial Z coordinate too low. Go to MESH_HOME_Z_SEARCH and repeat last step (z-probe) again to distinguish between these two cases.
   10152:	20 91 69 12 	lds	r18, 0x1269	; 0x801269 <current_position+0x8>
   10156:	30 91 6a 12 	lds	r19, 0x126A	; 0x80126a <current_position+0x9>
   1015a:	40 91 6b 12 	lds	r20, 0x126B	; 0x80126b <current_position+0xa>
   1015e:	50 91 6c 12 	lds	r21, 0x126C	; 0x80126c <current_position+0xb>
   10162:	c7 01       	movw	r24, r14
   10164:	b6 01       	movw	r22, r12
   10166:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   1016a:	20 e0       	ldi	r18, 0x00	; 0
   1016c:	30 e0       	ldi	r19, 0x00	; 0
   1016e:	a9 01       	movw	r20, r18
   10170:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   10174:	87 ff       	sbrs	r24, 7
   10176:	36 c0       	rjmp	.+108    	; 0x101e4 <gcode_G80()+0x752>
            current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
   10178:	60 e0       	ldi	r22, 0x00	; 0
   1017a:	70 e0       	ldi	r23, 0x00	; 0
   1017c:	80 ea       	ldi	r24, 0xA0	; 160
   1017e:	90 e4       	ldi	r25, 0x40	; 64
   10180:	60 93 69 12 	sts	0x1269, r22	; 0x801269 <current_position+0x8>
   10184:	70 93 6a 12 	sts	0x126A, r23	; 0x80126a <current_position+0x9>
   10188:	80 93 6b 12 	sts	0x126B, r24	; 0x80126b <current_position+0xa>
   1018c:	90 93 6c 12 	sts	0x126C, r25	; 0x80126c <current_position+0xb>
            plan_buffer_line_curposXYZE(Z_LIFT_FEEDRATE);
   10190:	65 e5       	ldi	r22, 0x55	; 85
   10192:	75 e5       	ldi	r23, 0x55	; 85
   10194:	85 e5       	ldi	r24, 0x55	; 85
   10196:	91 e4       	ldi	r25, 0x41	; 65
   10198:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
            st_synchronize();
   1019c:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>

            if (!find_bed_induction_sensor_point_z(has_z ? z0 - Z_CALIBRATION_THRESHOLD : -10.f, nProbeRetryCount)) { //if we have data from z calibration max allowed difference is 1mm for each point, if we dont have data max difference is 10mm from initial point
   101a0:	48 8d       	ldd	r20, Y+24	; 0x18
   101a2:	c5 01       	movw	r24, r10
   101a4:	b4 01       	movw	r22, r8
   101a6:	0f 94 ed 7b 	call	0x2f7da	; 0x2f7da <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.86]>
   101aa:	88 23       	and	r24, r24
   101ac:	39 f2       	breq	.-114    	; 0x1013c <gcode_G80()+0x6aa>
                printf_P(_T(MSG_BED_LEVELING_FAILED_POINT_LOW));
                break;
            }
            if (MESH_HOME_Z_SEARCH - current_position[Z_AXIS] < 0.1f) {
   101ae:	20 91 69 12 	lds	r18, 0x1269	; 0x801269 <current_position+0x8>
   101b2:	30 91 6a 12 	lds	r19, 0x126A	; 0x80126a <current_position+0x9>
   101b6:	40 91 6b 12 	lds	r20, 0x126B	; 0x80126b <current_position+0xa>
   101ba:	50 91 6c 12 	lds	r21, 0x126C	; 0x80126c <current_position+0xb>
   101be:	60 e0       	ldi	r22, 0x00	; 0
   101c0:	70 e0       	ldi	r23, 0x00	; 0
   101c2:	80 ea       	ldi	r24, 0xA0	; 160
   101c4:	90 e4       	ldi	r25, 0x40	; 64
   101c6:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   101ca:	2d ec       	ldi	r18, 0xCD	; 205
   101cc:	3c ec       	ldi	r19, 0xCC	; 204
   101ce:	4c ec       	ldi	r20, 0xCC	; 204
   101d0:	5d e3       	ldi	r21, 0x3D	; 61
   101d2:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   101d6:	87 ff       	sbrs	r24, 7
   101d8:	05 c0       	rjmp	.+10     	; 0x101e4 <gcode_G80()+0x752>
                puts_P(PSTR("Bed leveling failed. Sensor triggered too soon"));
   101da:	87 e3       	ldi	r24, 0x37	; 55
   101dc:	97 e7       	ldi	r25, 0x77	; 119
                break;
            }
        }
        if (has_z && fabs(z0 - current_position[Z_AXIS]) > Z_CALIBRATION_THRESHOLD) { //if we have data from z calibration, max. allowed difference is 1mm for each point
            puts_P(PSTR("Bed leveling failed. Too much variation from eeprom mesh"));
   101de:	0f 94 c9 a2 	call	0x34592	; 0x34592 <puts_P>
   101e2:	75 ce       	rjmp	.-790    	; 0xfece <gcode_G80()+0x43c>
   101e4:	c0 90 69 12 	lds	r12, 0x1269	; 0x801269 <current_position+0x8>
   101e8:	d0 90 6a 12 	lds	r13, 0x126A	; 0x80126a <current_position+0x9>
   101ec:	e0 90 6b 12 	lds	r14, 0x126B	; 0x80126b <current_position+0xa>
   101f0:	f0 90 6c 12 	lds	r15, 0x126C	; 0x80126c <current_position+0xb>
            if (MESH_HOME_Z_SEARCH - current_position[Z_AXIS] < 0.1f) {
                puts_P(PSTR("Bed leveling failed. Sensor triggered too soon"));
                break;
            }
        }
        if (has_z && fabs(z0 - current_position[Z_AXIS]) > Z_CALIBRATION_THRESHOLD) { //if we have data from z calibration, max. allowed difference is 1mm for each point
   101f4:	22 20       	and	r2, r2
   101f6:	a1 f0       	breq	.+40     	; 0x10220 <gcode_G80()+0x78e>
   101f8:	a7 01       	movw	r20, r14
   101fa:	96 01       	movw	r18, r12
   101fc:	c3 01       	movw	r24, r6
   101fe:	b2 01       	movw	r22, r4
   10200:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   10204:	9b 01       	movw	r18, r22
   10206:	ac 01       	movw	r20, r24
   10208:	5f 77       	andi	r21, 0x7F	; 127
   1020a:	6a 81       	ldd	r22, Y+2	; 0x02
   1020c:	7b 81       	ldd	r23, Y+3	; 0x03
   1020e:	8c 81       	ldd	r24, Y+4	; 0x04
   10210:	9d 81       	ldd	r25, Y+5	; 0x05
   10212:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   10216:	87 ff       	sbrs	r24, 7
   10218:	03 c0       	rjmp	.+6      	; 0x10220 <gcode_G80()+0x78e>
            puts_P(PSTR("Bed leveling failed. Too much variation from eeprom mesh"));
   1021a:	8e ef       	ldi	r24, 0xFE	; 254
   1021c:	96 e7       	ldi	r25, 0x76	; 118
   1021e:	df cf       	rjmp	.-66     	; 0x101de <gcode_G80()+0x74c>
}

#ifdef PINDA_THERMISTOR
float temp_compensation_pinda_thermistor_offset(float temperature_pinda)
{
	if (!eeprom_read_byte((unsigned char *)EEPROM_TEMP_CAL_ACTIVE)) return 0;
   10220:	8f ea       	ldi	r24, 0xAF	; 175
   10222:	9f e0       	ldi	r25, 0x0F	; 15
   10224:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   10228:	88 23       	and	r24, r24
   1022a:	09 f4       	brne	.+2      	; 0x1022e <gcode_G80()+0x79c>
   1022c:	40 c0       	rjmp	.+128    	; 0x102ae <gcode_G80()+0x81c>
bool calibration_status_get(CalibrationStatus components);
void calibration_status_set(CalibrationStatus components);
void calibration_status_clear(CalibrationStatus components);

// PINDA has an independent calibration flag
inline bool calibration_status_pinda() { return eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_PINDA); }
   1022e:	86 ea       	ldi	r24, 0xA6	; 166
   10230:	9f e0       	ldi	r25, 0x0F	; 15
   10232:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
	if (!calibration_status_pinda()) return 0;
   10236:	88 23       	and	r24, r24
   10238:	d1 f1       	breq	.+116    	; 0x102ae <gcode_G80()+0x81c>
	return temp_comp_interpolation(temperature_pinda) / cs.axis_steps_per_mm[Z_AXIS];
   1023a:	60 91 85 03 	lds	r22, 0x0385	; 0x800385 <current_temperature_pinda>
   1023e:	70 91 86 03 	lds	r23, 0x0386	; 0x800386 <current_temperature_pinda+0x1>
   10242:	80 91 87 03 	lds	r24, 0x0387	; 0x800387 <current_temperature_pinda+0x2>
   10246:	90 91 88 03 	lds	r25, 0x0388	; 0x800388 <current_temperature_pinda+0x3>
   1024a:	0e 94 86 56 	call	0xad0c	; 0xad0c <temp_comp_interpolation(float)>
   1024e:	20 91 73 0d 	lds	r18, 0x0D73	; 0x800d73 <cs+0xc>
   10252:	30 91 74 0d 	lds	r19, 0x0D74	; 0x800d74 <cs+0xd>
   10256:	40 91 75 0d 	lds	r20, 0x0D75	; 0x800d75 <cs+0xe>
   1025a:	50 91 76 0d 	lds	r21, 0x0D76	; 0x800d76 <cs+0xf>
   1025e:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   10262:	9b 01       	movw	r18, r22
   10264:	ac 01       	movw	r20, r24
   10266:	e7 e0       	ldi	r30, 0x07	; 7
   10268:	ae 85       	ldd	r26, Y+14	; 0x0e
   1026a:	bf 85       	ldd	r27, Y+15	; 0x0f
   1026c:	ea 9f       	mul	r30, r26
   1026e:	c0 01       	movw	r24, r0
   10270:	eb 9f       	mul	r30, r27
   10272:	90 0d       	add	r25, r0
   10274:	11 24       	eor	r1, r1
   10276:	08 0f       	add	r16, r24
   10278:	19 1f       	adc	r17, r25
   1027a:	00 0f       	add	r16, r16
   1027c:	11 1f       	adc	r17, r17
   1027e:	00 0f       	add	r16, r16
   10280:	11 1f       	adc	r17, r17
   10282:	07 5f       	subi	r16, 0xF7	; 247
   10284:	1c 4e       	sbci	r17, 0xEC	; 236
            break;
        }

#ifdef PINDA_THERMISTOR
        float offset_z = temp_compensation_pinda_thermistor_offset(current_temperature_pinda);
        mbl.set_z(ix, iy, current_position[Z_AXIS] - offset_z); //store measured z values z_values[iy][ix] = z - offset_z;
   10286:	c7 01       	movw	r24, r14
   10288:	b6 01       	movw	r22, r12
   1028a:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   1028e:	d8 01       	movw	r26, r16
   10290:	11 96       	adiw	r26, 0x01	; 1
   10292:	6d 93       	st	X+, r22
   10294:	7d 93       	st	X+, r23
   10296:	8d 93       	st	X+, r24
   10298:	9c 93       	st	X, r25
   1029a:	14 97       	sbiw	r26, 0x04	; 4
#else
        mbl.set_z(ix, iy, current_position[Z_AXIS]); //store measured z values z_values[iy][ix] = z;
#endif //PINDA_THERMISTOR

        custom_message_state--;
   1029c:	80 91 de 03 	lds	r24, 0x03DE	; 0x8003de <custom_message_state>
   102a0:	81 50       	subi	r24, 0x01	; 1
   102a2:	80 93 de 03 	sts	0x03DE, r24	; 0x8003de <custom_message_state>
        mesh_point++;
        lcd_update(1);
   102a6:	81 e0       	ldi	r24, 0x01	; 1
   102a8:	0e 94 f9 6e 	call	0xddf2	; 0xddf2 <lcd_update(unsigned char)>
   102ac:	0c ce       	rjmp	.-1000   	; 0xfec6 <gcode_G80()+0x434>
}

#ifdef PINDA_THERMISTOR
float temp_compensation_pinda_thermistor_offset(float temperature_pinda)
{
	if (!eeprom_read_byte((unsigned char *)EEPROM_TEMP_CAL_ACTIVE)) return 0;
   102ae:	20 e0       	ldi	r18, 0x00	; 0
   102b0:	30 e0       	ldi	r19, 0x00	; 0
   102b2:	a9 01       	movw	r20, r18
   102b4:	d8 cf       	rjmp	.-80     	; 0x10266 <gcode_G80()+0x7d4>
            print_stop();
            lcd_show_fullscreen_message_and_wait_P(_T(MSG_MBL_FAILED));
            lcd_z_calibration_prompt(false);
            goto exit;
        }
        Sound_MakeSound(e_SOUND_TYPE_StandardAlert);
   102b6:	85 e0       	ldi	r24, 0x05	; 5
   102b8:	0f 94 ad 25 	call	0x24b5a	; 0x24b5a <Sound_MakeSound(eSOUND_TYPE)>
            raise_z(-1);
            enable_z_endstop(true);
#ifdef TMC2130
            tmc2130_home_enter(Z_AXIS_MASK);
#endif // TMC2130
            current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
   102bc:	c1 2c       	mov	r12, r1
   102be:	d1 2c       	mov	r13, r1
   102c0:	90 ea       	ldi	r25, 0xA0	; 160
   102c2:	e9 2e       	mov	r14, r25
   102c4:	90 e4       	ldi	r25, 0x40	; 64
   102c6:	f9 2e       	mov	r15, r25
            goto exit;
        }
        Sound_MakeSound(e_SOUND_TYPE_StandardAlert);
        bool bState;
        do   {                             // repeat until Z-leveling o.k.
            lcd_display_message_fullscreen_P(_T(MSG_ZLEVELING_ENFORCED));
   102c8:	80 e0       	ldi	r24, 0x00	; 0
   102ca:	96 e3       	ldi	r25, 0x36	; 54
   102cc:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   102d0:	0e 94 a9 e0 	call	0x1c152	; 0x1c152 <lcd_display_message_fullscreen_P(char const*)>
#ifdef TMC2130
            lcd_wait_for_click_delay(MSG_BED_LEVELING_FAILED_TIMEOUT);
            calibrate_z_auto();           // Z-leveling (X-assembly stay up!!!)
#else // TMC2130
            lcd_wait_for_click_delay(0);  // ~ no timeout
   102d4:	90 e0       	ldi	r25, 0x00	; 0
   102d6:	80 e0       	ldi	r24, 0x00	; 0
   102d8:	0e 94 c2 df 	call	0x1bf84	; 0x1bf84 <lcd_wait_for_click_delay(unsigned int)>
            lcd_calibrate_z_end_stop_manual(true); // Z-leveling (X-assembly stay up!!!)
   102dc:	81 e0       	ldi	r24, 0x01	; 1
   102de:	0e 94 11 fc 	call	0x1f822	; 0x1f822 <lcd_calibrate_z_end_stop_manual(bool)>
#endif // TMC2130
            // ~ Z-homing (can not be used "G28", because X & Y-homing would have been done before (Z-homing))
            bState=enable_z_endstop(false);
   102e2:	80 e0       	ldi	r24, 0x00	; 0
   102e4:	0f 94 88 25 	call	0x24b10	; 0x24b10 <enable_z_endstop(bool)>
   102e8:	18 2f       	mov	r17, r24
            raise_z(-1);
   102ea:	60 e0       	ldi	r22, 0x00	; 0
   102ec:	70 e0       	ldi	r23, 0x00	; 0
   102ee:	80 e8       	ldi	r24, 0x80	; 128
   102f0:	9f eb       	ldi	r25, 0xBF	; 191
   102f2:	0e 94 94 6c 	call	0xd928	; 0xd928 <raise_z(float)>
            enable_z_endstop(true);
   102f6:	81 e0       	ldi	r24, 0x01	; 1
   102f8:	0f 94 88 25 	call	0x24b10	; 0x24b10 <enable_z_endstop(bool)>
#ifdef TMC2130
            tmc2130_home_enter(Z_AXIS_MASK);
#endif // TMC2130
            current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
   102fc:	c0 92 69 12 	sts	0x1269, r12	; 0x801269 <current_position+0x8>
   10300:	d0 92 6a 12 	sts	0x126A, r13	; 0x80126a <current_position+0x9>
   10304:	e0 92 6b 12 	sts	0x126B, r14	; 0x80126b <current_position+0xa>
   10308:	f0 92 6c 12 	sts	0x126C, r15	; 0x80126c <current_position+0xb>
            plan_buffer_line_curposXYZE(Z_LIFT_FEEDRATE);
   1030c:	65 e5       	ldi	r22, 0x55	; 85
   1030e:	75 e5       	ldi	r23, 0x55	; 85
   10310:	85 e5       	ldi	r24, 0x55	; 85
   10312:	91 e4       	ldi	r25, 0x41	; 65
   10314:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
            st_synchronize();
   10318:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
#ifdef TMC2130
            tmc2130_home_exit();
#endif // TMC2130
            enable_z_endstop(bState);
   1031c:	81 2f       	mov	r24, r17
   1031e:	0f 94 88 25 	call	0x24b10	; 0x24b10 <enable_z_endstop(bool)>
        } while (st_get_position_mm(Z_AXIS) > MESH_HOME_Z_SEARCH); // i.e. Z-leveling not o.k.
   10322:	82 e0       	ldi	r24, 0x02	; 2
   10324:	0f 94 e7 1a 	call	0x235ce	; 0x235ce <st_get_position_mm(unsigned char)>
   10328:	20 e0       	ldi	r18, 0x00	; 0
   1032a:	30 e0       	ldi	r19, 0x00	; 0
   1032c:	40 ea       	ldi	r20, 0xA0	; 160
   1032e:	50 e4       	ldi	r21, 0x40	; 64
   10330:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   10334:	18 16       	cp	r1, r24
   10336:	44 f2       	brlt	.-112    	; 0x102c8 <gcode_G80()+0x836>

        custom_message_type = custom_message_type_old;
   10338:	ef 81       	ldd	r30, Y+7	; 0x07
   1033a:	e0 93 5d 06 	sts	0x065D, r30	; 0x80065d <custom_message_type>
        custom_message_state = custom_message_state_old;
   1033e:	f8 85       	ldd	r31, Y+8	; 0x08
   10340:	f0 93 de 03 	sts	0x03DE, r31	; 0x8003de <custom_message_state>
        lcd_update_enable(true);           // display / status-line recovery
   10344:	81 e0       	ldi	r24, 0x01	; 1
   10346:	0e 94 38 70 	call	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>
static void gcode_G28(bool home_x_axis, bool home_y_axis, bool home_z_axis)
{
#ifdef TMC2130
    gcode_G28(home_x_axis, 0, home_y_axis, 0, home_z_axis, 0, false, true);
#else
    gcode_G28(home_x_axis, 0, home_y_axis, 0, home_z_axis, 0, true);
   1034a:	dd 24       	eor	r13, r13
   1034c:	d3 94       	inc	r13
   1034e:	df 92       	push	r13
   10350:	81 2c       	mov	r8, r1
   10352:	91 2c       	mov	r9, r1
   10354:	54 01       	movw	r10, r8
   10356:	cc 24       	eor	r12, r12
   10358:	c3 94       	inc	r12
   1035a:	e1 2c       	mov	r14, r1
   1035c:	f1 2c       	mov	r15, r1
   1035e:	87 01       	movw	r16, r14
   10360:	21 e0       	ldi	r18, 0x01	; 1
   10362:	40 e0       	ldi	r20, 0x00	; 0
   10364:	50 e0       	ldi	r21, 0x00	; 0
   10366:	ba 01       	movw	r22, r20
   10368:	81 e0       	ldi	r24, 0x01	; 1
   1036a:	0e 94 2a 6d 	call	0xda54	; 0xda54 <gcode_G28(bool, long, bool, long, bool, long, bool)>
   1036e:	d0 92 53 12 	sts	0x1253, r13	; 0x801253 <cmdbuffer_front_already_processed>
   10372:	0f 90       	pop	r0
   10374:	c5 cb       	rjmp	.-2166   	; 0xfb00 <gcode_G80()+0x6e>
        lcd_update_enable(true);           // display / status-line recovery
        gcode_G28(true, true, true);       // X & Y & Z-homing (must be after individual Z-homing (problem with spool-holder)!)
        repeatcommand_front();             // re-run (i.e. of "G80")
        return;
    }
    g80_fail_cnt = 0; // no fail was detected. Reset the error counter.
   10376:	10 92 3d 03 	sts	0x033D, r1	; 0x80033d <gcode_G80()::g80_fail_cnt>

    clean_up_after_endstop_move(l_feedmultiply);
   1037a:	8b a1       	ldd	r24, Y+35	; 0x23
   1037c:	9c a1       	ldd	r25, Y+36	; 0x24
   1037e:	0e 94 4c 65 	call	0xca98	; 0xca98 <clean_up_after_endstop_move(int) [clone .lto_priv.382]>
// Number of baby steps applied
static int babystepLoadZ = 0;

void babystep_load()
{
	babystepLoadZ = 0;
   10382:	10 92 27 06 	sts	0x0627, r1	; 0x800627 <_ZL13babystepLoadZ.lto_priv.452+0x1>
   10386:	10 92 26 06 	sts	0x0626, r1	; 0x800626 <_ZL13babystepLoadZ.lto_priv.452>
    // Apply Z height correction aka baby stepping before mesh bed leveling gets activated.
    if (calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST))
   1038a:	80 e1       	ldi	r24, 0x10	; 16
   1038c:	0e 94 5b d7 	call	0x1aeb6	; 0x1aeb6 <calibration_status_get(unsigned char)>
   10390:	88 23       	and	r24, r24
   10392:	91 f0       	breq	.+36     	; 0x103b8 <gcode_G80()+0x926>
    {
        check_babystep(); //checking if babystep is in allowed range, otherwise setting babystep to 0
   10394:	0e 94 1c 7d 	call	0xfa38	; 0xfa38 <check_babystep()>

        // End of G80: Apply the baby stepping value.
        babystepLoadZ = eeprom_read_word(reinterpret_cast<uint16_t *>(&(EEPROM_Sheets_base->
                    s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)));
   10398:	81 ea       	ldi	r24, 0xA1	; 161
   1039a:	9d e0       	ldi	r25, 0x0D	; 13
   1039c:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
    if (calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST))
    {
        check_babystep(); //checking if babystep is in allowed range, otherwise setting babystep to 0

        // End of G80: Apply the baby stepping value.
        babystepLoadZ = eeprom_read_word(reinterpret_cast<uint16_t *>(&(EEPROM_Sheets_base->
   103a0:	2b e0       	ldi	r18, 0x0B	; 11
   103a2:	82 9f       	mul	r24, r18
   103a4:	c0 01       	movw	r24, r0
   103a6:	11 24       	eor	r1, r1
   103a8:	80 5b       	subi	r24, 0xB0	; 176
   103aa:	92 4f       	sbci	r25, 0xF2	; 242
   103ac:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
   103b0:	90 93 27 06 	sts	0x0627, r25	; 0x800627 <_ZL13babystepLoadZ.lto_priv.452+0x1>
   103b4:	80 93 26 06 	sts	0x0626, r24	; 0x800626 <_ZL13babystepLoadZ.lto_priv.452>
}

void babystep_apply()
{
    babystep_load();
    shift_z(- float(babystepLoadZ) / float(cs.axis_steps_per_mm[Z_AXIS]));
   103b8:	60 91 26 06 	lds	r22, 0x0626	; 0x800626 <_ZL13babystepLoadZ.lto_priv.452>
   103bc:	70 91 27 06 	lds	r23, 0x0627	; 0x800627 <_ZL13babystepLoadZ.lto_priv.452+0x1>
   103c0:	07 2e       	mov	r0, r23
   103c2:	00 0c       	add	r0, r0
   103c4:	88 0b       	sbc	r24, r24
   103c6:	99 0b       	sbc	r25, r25
   103c8:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   103cc:	90 58       	subi	r25, 0x80	; 128
   103ce:	20 91 73 0d 	lds	r18, 0x0D73	; 0x800d73 <cs+0xc>
   103d2:	30 91 74 0d 	lds	r19, 0x0D74	; 0x800d74 <cs+0xd>
   103d6:	40 91 75 0d 	lds	r20, 0x0D75	; 0x800d75 <cs+0xe>
   103da:	50 91 76 0d 	lds	r21, 0x0D76	; 0x800d76 <cs+0xf>
   103de:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   103e2:	0e 94 a6 5e 	call	0xbd4c	; 0xbd4c <shift_z(float) [clone .lto_priv.488]>
    if(eeprom_read_byte((uint8_t *)EEPROM_TEMP_CAL_ACTIVE) && calibration_status_pinda() == true) temp_compensation_apply(); //apply PINDA temperature compensation
#endif
    babystep_apply(); // Apply Z height correction aka baby stepping before mesh bed leveing gets activated.

    { // Apply the bed level correction to the mesh
        bool eeprom_bed_correction_valid = eeprom_read_byte((unsigned char*)EEPROM_BED_CORRECTION_VALID) == 1;
   103e6:	80 ec       	ldi	r24, 0xC0	; 192
   103e8:	9f e0       	ldi	r25, 0x0F	; 15
   103ea:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   103ee:	91 e0       	ldi	r25, 0x01	; 1
   103f0:	81 30       	cpi	r24, 0x01	; 1
   103f2:	09 f0       	breq	.+2      	; 0x103f6 <gcode_G80()+0x964>
   103f4:	90 e0       	ldi	r25, 0x00	; 0
                }
            } else if (eeprom_bed_correction_valid) {
                return (int8_t)eeprom_read_byte(eep_address);
            }
            return 0;
        };
   103f6:	99 83       	std	Y+1, r25	; 0x01
        const int8_t correction[4] = {
            bedCorrectHelper('L', (uint8_t*)EEPROM_BED_CORRECTION_LEFT),
   103f8:	4f eb       	ldi	r20, 0xBF	; 191
   103fa:	5f e0       	ldi	r21, 0x0F	; 15
   103fc:	6c e4       	ldi	r22, 0x4C	; 76
   103fe:	ce 01       	movw	r24, r28
   10400:	01 96       	adiw	r24, 0x01	; 1
   10402:	0e 94 24 56 	call	0xac48	; 0xac48 <gcode_G80()::{lambda(char, unsigned char*)#1}::operator()(char, unsigned char*) const>
   10406:	f8 2e       	mov	r15, r24
            bedCorrectHelper('R', (uint8_t*)EEPROM_BED_CORRECTION_RIGHT),
   10408:	4e eb       	ldi	r20, 0xBE	; 190
   1040a:	5f e0       	ldi	r21, 0x0F	; 15
   1040c:	62 e5       	ldi	r22, 0x52	; 82
   1040e:	ce 01       	movw	r24, r28
   10410:	01 96       	adiw	r24, 0x01	; 1
   10412:	0e 94 24 56 	call	0xac48	; 0xac48 <gcode_G80()::{lambda(char, unsigned char*)#1}::operator()(char, unsigned char*) const>
   10416:	08 2f       	mov	r16, r24
            bedCorrectHelper('F', (uint8_t*)EEPROM_BED_CORRECTION_FRONT),
   10418:	4d eb       	ldi	r20, 0xBD	; 189
   1041a:	5f e0       	ldi	r21, 0x0F	; 15
   1041c:	66 e4       	ldi	r22, 0x46	; 70
   1041e:	ce 01       	movw	r24, r28
   10420:	01 96       	adiw	r24, 0x01	; 1
   10422:	0e 94 24 56 	call	0xac48	; 0xac48 <gcode_G80()::{lambda(char, unsigned char*)#1}::operator()(char, unsigned char*) const>
   10426:	18 2f       	mov	r17, r24
            bedCorrectHelper('B', (uint8_t*)EEPROM_BED_CORRECTION_REAR),
   10428:	4c eb       	ldi	r20, 0xBC	; 188
   1042a:	5f e0       	ldi	r21, 0x0F	; 15
   1042c:	62 e4       	ldi	r22, 0x42	; 66
   1042e:	ce 01       	movw	r24, r28
   10430:	01 96       	adiw	r24, 0x01	; 1
   10432:	0e 94 24 56 	call	0xac48	; 0xac48 <gcode_G80()::{lambda(char, unsigned char*)#1}::operator()(char, unsigned char*) const>
   10436:	21 2f       	mov	r18, r17
   10438:	11 0f       	add	r17, r17
   1043a:	33 0b       	sbc	r19, r19
   1043c:	08 2e       	mov	r0, r24
   1043e:	00 0c       	add	r0, r0
   10440:	99 0b       	sbc	r25, r25
   10442:	5c 01       	movw	r10, r24
   10444:	a2 1a       	sub	r10, r18
   10446:	b3 0a       	sbc	r11, r19
   10448:	8f 2d       	mov	r24, r15
   1044a:	ff 0c       	add	r15, r15
   1044c:	99 0b       	sbc	r25, r25
   1044e:	28 0f       	add	r18, r24
   10450:	39 1f       	adc	r19, r25
   10452:	46 e0       	ldi	r20, 0x06	; 6
   10454:	42 9f       	mul	r20, r18
   10456:	60 01       	movw	r12, r0
   10458:	43 9f       	mul	r20, r19
   1045a:	d0 0c       	add	r13, r0
   1045c:	11 24       	eor	r1, r1
   1045e:	f1 2c       	mov	r15, r1
   10460:	e1 2c       	mov	r14, r1
   10462:	00 2e       	mov	r0, r16
   10464:	00 0c       	add	r0, r0
   10466:	11 0b       	sbc	r17, r17
   10468:	08 1b       	sub	r16, r24
   1046a:	19 0b       	sbc	r17, r25
   1046c:	b7 01       	movw	r22, r14
   1046e:	66 5f       	subi	r22, 0xF6	; 246
   10470:	7c 4e       	sbci	r23, 0xEC	; 236
   10472:	3b 01       	movw	r6, r22
   10474:	46 01       	movw	r8, r12
   10476:	77 e0       	ldi	r23, 0x07	; 7
   10478:	7a 83       	std	Y+2, r23	; 0x02
        };
        for (uint8_t row = 0; row < MESH_NUM_Y_POINTS; row++) {
            for (uint8_t col = 0; col < MESH_NUM_X_POINTS; col++) {
                constexpr float scaler = 0.001f / (MESH_NUM_X_POINTS - 1);
                mbl.z_values[row][col] += scaler * (
   1047a:	d3 01       	movw	r26, r6
   1047c:	2d 90       	ld	r2, X+
   1047e:	3d 90       	ld	r3, X+
   10480:	4d 90       	ld	r4, X+
   10482:	5d 90       	ld	r5, X+
   10484:	3d 01       	movw	r6, r26
   10486:	fd 01       	movw	r30, r26
   10488:	34 97       	sbiw	r30, 0x04	; 4
   1048a:	fb 87       	std	Y+11, r31	; 0x0b
   1048c:	ea 87       	std	Y+10, r30	; 0x0a
   1048e:	b4 01       	movw	r22, r8
   10490:	09 2c       	mov	r0, r9
   10492:	00 0c       	add	r0, r0
   10494:	88 0b       	sbc	r24, r24
   10496:	99 0b       	sbc	r25, r25
   10498:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   1049c:	2f e3       	ldi	r18, 0x3F	; 63
   1049e:	33 ec       	ldi	r19, 0xC3	; 195
   104a0:	4e e2       	ldi	r20, 0x2E	; 46
   104a2:	59 e3       	ldi	r21, 0x39	; 57
   104a4:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   104a8:	a2 01       	movw	r20, r4
   104aa:	91 01       	movw	r18, r2
   104ac:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   104b0:	aa 85       	ldd	r26, Y+10	; 0x0a
   104b2:	bb 85       	ldd	r27, Y+11	; 0x0b
   104b4:	6d 93       	st	X+, r22
   104b6:	7d 93       	st	X+, r23
   104b8:	8d 93       	st	X+, r24
   104ba:	9c 93       	st	X, r25
   104bc:	13 97       	sbiw	r26, 0x03	; 3
   104be:	ba 81       	ldd	r27, Y+2	; 0x02
   104c0:	b1 50       	subi	r27, 0x01	; 1
   104c2:	ba 83       	std	Y+2, r27	; 0x02
   104c4:	80 0e       	add	r8, r16
   104c6:	91 1e       	adc	r9, r17
            bedCorrectHelper('R', (uint8_t*)EEPROM_BED_CORRECTION_RIGHT),
            bedCorrectHelper('F', (uint8_t*)EEPROM_BED_CORRECTION_FRONT),
            bedCorrectHelper('B', (uint8_t*)EEPROM_BED_CORRECTION_REAR),
        };
        for (uint8_t row = 0; row < MESH_NUM_Y_POINTS; row++) {
            for (uint8_t col = 0; col < MESH_NUM_X_POINTS; col++) {
   104c8:	b1 11       	cpse	r27, r1
   104ca:	d7 cf       	rjmp	.-82     	; 0x1047a <gcode_G80()+0x9e8>
   104cc:	ca 0c       	add	r12, r10
   104ce:	db 1c       	adc	r13, r11
   104d0:	ec e1       	ldi	r30, 0x1C	; 28
   104d2:	ee 0e       	add	r14, r30
   104d4:	f1 1c       	adc	r15, r1
            bedCorrectHelper('L', (uint8_t*)EEPROM_BED_CORRECTION_LEFT),
            bedCorrectHelper('R', (uint8_t*)EEPROM_BED_CORRECTION_RIGHT),
            bedCorrectHelper('F', (uint8_t*)EEPROM_BED_CORRECTION_FRONT),
            bedCorrectHelper('B', (uint8_t*)EEPROM_BED_CORRECTION_REAR),
        };
        for (uint8_t row = 0; row < MESH_NUM_Y_POINTS; row++) {
   104d6:	f4 ec       	ldi	r31, 0xC4	; 196
   104d8:	ef 16       	cp	r14, r31
   104da:	f1 04       	cpc	r15, r1
   104dc:	39 f6       	brne	.-114    	; 0x1046c <gcode_G80()+0x9da>
                + correction[3] * row);
            }
        }
    }

    mbl.upsample_3x3(); //interpolation from 3x3 to 7x7 points using largrangian polynomials while using the same array z_values[iy][ix] for storing (just coppying measured data to new destination and interpolating between them)
   104de:	0f 94 bd 92 	call	0x3257a	; 0x3257a <mesh_bed_leveling::upsample_3x3() [clone .constprop.52]>

    { // apply magnet compensation
        uint8_t useMagnetCompensation = code_seen('M') ? code_value_uint8() : eeprom_read_byte((uint8_t*)EEPROM_MBL_MAGNET_ELIMINATION);
   104e2:	8d e4       	ldi	r24, 0x4D	; 77
   104e4:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   104e8:	88 23       	and	r24, r24
   104ea:	09 f4       	brne	.+2      	; 0x104ee <gcode_G80()+0xa5c>
   104ec:	84 c0       	rjmp	.+264    	; 0x105f6 <gcode_G80()+0xb64>
   104ee:	0e 94 0a 56 	call	0xac14	; 0xac14 <code_value_uint8()>
        if (nMeasPoints == 7 && useMagnetCompensation) {
   104f2:	2e 81       	ldd	r18, Y+6	; 0x06
   104f4:	27 30       	cpi	r18, 0x07	; 7
   104f6:	09 f0       	breq	.+2      	; 0x104fa <gcode_G80()+0xa68>
   104f8:	94 c0       	rjmp	.+296    	; 0x10622 <gcode_G80()+0xb90>
   104fa:	88 23       	and	r24, r24
   104fc:	09 f4       	brne	.+2      	; 0x10500 <gcode_G80()+0xa6e>
   104fe:	91 c0       	rjmp	.+290    	; 0x10622 <gcode_G80()+0xb90>
   10500:	bb 24       	eor	r11, r11
   10502:	b3 94       	inc	r11
   10504:	aa 24       	eor	r10, r10
   10506:	aa 94       	dec	r10
   10508:	ab 0c       	add	r10, r11
   1050a:	09 a1       	ldd	r16, Y+33	; 0x21
   1050c:	1a a1       	ldd	r17, Y+34	; 0x22
		//printf_P(PSTR("result: Z = %f \n\n"), mbl.z_values[y][x]);
}

void mbl_magnet_elimination() {
    for (uint8_t y = 0; y < MESH_NUM_Y_POINTS; y++) {
		for (uint8_t x = 0; x < MESH_NUM_X_POINTS; x++) {
   1050e:	61 2c       	mov	r6, r1
void mbl_single_point_interpolation(uint8_t x, uint8_t y) {
	//printf_P(PSTR("x = %d; y = %d \n"), x, y);
		uint8_t count = 0;
		float z = 0;
		if (mbl_point_measurement_valid(x, y + 1)) { z += mbl.z_values[y + 1][x]; /*printf_P(PSTR("x; y+1: Z = %f \n"), mbl.z_values[y + 1][x]);*/ count++; }
		if (mbl_point_measurement_valid(x, y - 1)) { z += mbl.z_values[y - 1][x]; /*printf_P(PSTR("x; y-1: Z = %f \n"), mbl.z_values[y - 1][x]);*/ count++; }
   10510:	8e ef       	ldi	r24, 0xFE	; 254
   10512:	88 2e       	mov	r8, r24
   10514:	8b 0c       	add	r8, r11
}

void mbl_magnet_elimination() {
    for (uint8_t y = 0; y < MESH_NUM_Y_POINTS; y++) {
		for (uint8_t x = 0; x < MESH_NUM_X_POINTS; x++) {
			if (!mbl_point_measurement_valid(x, y)) {
   10516:	6a 2d       	mov	r22, r10
   10518:	86 2d       	mov	r24, r6
   1051a:	0f 94 75 54 	call	0x2a8ea	; 0x2a8ea <mbl_point_measurement_valid(unsigned char, unsigned char)>
   1051e:	99 24       	eor	r9, r9
   10520:	93 94       	inc	r9
   10522:	96 0c       	add	r9, r6
   10524:	81 11       	cpse	r24, r1
   10526:	6e c0       	rjmp	.+220    	; 0x10604 <gcode_G80()+0xb72>

void mbl_single_point_interpolation(uint8_t x, uint8_t y) {
	//printf_P(PSTR("x = %d; y = %d \n"), x, y);
		uint8_t count = 0;
		float z = 0;
		if (mbl_point_measurement_valid(x, y + 1)) { z += mbl.z_values[y + 1][x]; /*printf_P(PSTR("x; y+1: Z = %f \n"), mbl.z_values[y + 1][x]);*/ count++; }
   10528:	6b 2d       	mov	r22, r11
   1052a:	86 2d       	mov	r24, r6
   1052c:	0f 94 75 54 	call	0x2a8ea	; 0x2a8ea <mbl_point_measurement_valid(unsigned char, unsigned char)>
}

void mbl_single_point_interpolation(uint8_t x, uint8_t y) {
	//printf_P(PSTR("x = %d; y = %d \n"), x, y);
		uint8_t count = 0;
		float z = 0;
   10530:	c1 2c       	mov	r12, r1
   10532:	d1 2c       	mov	r13, r1
   10534:	76 01       	movw	r14, r12
        return (valid_points_mask[6 - iy] & (1 << (6 - ix)));
}

void mbl_single_point_interpolation(uint8_t x, uint8_t y) {
	//printf_P(PSTR("x = %d; y = %d \n"), x, y);
		uint8_t count = 0;
   10536:	71 2c       	mov	r7, r1
		float z = 0;
		if (mbl_point_measurement_valid(x, y + 1)) { z += mbl.z_values[y + 1][x]; /*printf_P(PSTR("x; y+1: Z = %f \n"), mbl.z_values[y + 1][x]);*/ count++; }
   10538:	88 23       	and	r24, r24
   1053a:	81 f0       	breq	.+32     	; 0x1055c <gcode_G80()+0xaca>
   1053c:	20 e0       	ldi	r18, 0x00	; 0
   1053e:	30 e0       	ldi	r19, 0x00	; 0
   10540:	a9 01       	movw	r20, r18
   10542:	d8 01       	movw	r26, r16
   10544:	5d 96       	adiw	r26, 0x1d	; 29
   10546:	6d 91       	ld	r22, X+
   10548:	7d 91       	ld	r23, X+
   1054a:	8d 91       	ld	r24, X+
   1054c:	9c 91       	ld	r25, X
   1054e:	90 97       	sbiw	r26, 0x20	; 32
   10550:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   10554:	6b 01       	movw	r12, r22
   10556:	7c 01       	movw	r14, r24
   10558:	77 24       	eor	r7, r7
   1055a:	73 94       	inc	r7
		if (mbl_point_measurement_valid(x, y - 1)) { z += mbl.z_values[y - 1][x]; /*printf_P(PSTR("x; y-1: Z = %f \n"), mbl.z_values[y - 1][x]);*/ count++; }
   1055c:	68 2d       	mov	r22, r8
   1055e:	86 2d       	mov	r24, r6
   10560:	0f 94 75 54 	call	0x2a8ea	; 0x2a8ea <mbl_point_measurement_valid(unsigned char, unsigned char)>
   10564:	88 23       	and	r24, r24
   10566:	69 f0       	breq	.+26     	; 0x10582 <gcode_G80()+0xaf0>
   10568:	f8 01       	movw	r30, r16
   1056a:	7b 97       	sbiw	r30, 0x1b	; 27
   1056c:	20 81       	ld	r18, Z
   1056e:	31 81       	ldd	r19, Z+1	; 0x01
   10570:	42 81       	ldd	r20, Z+2	; 0x02
   10572:	53 81       	ldd	r21, Z+3	; 0x03
   10574:	c7 01       	movw	r24, r14
   10576:	b6 01       	movw	r22, r12
   10578:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   1057c:	6b 01       	movw	r12, r22
   1057e:	7c 01       	movw	r14, r24
   10580:	73 94       	inc	r7
		if (mbl_point_measurement_valid(x + 1, y)) { z += mbl.z_values[y][x + 1]; /*printf_P(PSTR("x+1; y: Z = %f \n"), mbl.z_values[y][x + 1]);*/ count++; }
   10582:	6a 2d       	mov	r22, r10
   10584:	89 2d       	mov	r24, r9
   10586:	0f 94 75 54 	call	0x2a8ea	; 0x2a8ea <mbl_point_measurement_valid(unsigned char, unsigned char)>
   1058a:	88 23       	and	r24, r24
   1058c:	61 f0       	breq	.+24     	; 0x105a6 <gcode_G80()+0xb14>
   1058e:	f8 01       	movw	r30, r16
   10590:	25 81       	ldd	r18, Z+5	; 0x05
   10592:	36 81       	ldd	r19, Z+6	; 0x06
   10594:	47 81       	ldd	r20, Z+7	; 0x07
   10596:	50 85       	ldd	r21, Z+8	; 0x08
   10598:	c7 01       	movw	r24, r14
   1059a:	b6 01       	movw	r22, r12
   1059c:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   105a0:	6b 01       	movw	r12, r22
   105a2:	7c 01       	movw	r14, r24
   105a4:	73 94       	inc	r7
		if (mbl_point_measurement_valid(x - 1, y)) { z += mbl.z_values[y][x - 1]; /*printf_P(PSTR("x-1; y: Z = %f \n"), mbl.z_values[y][x - 1]);*/ count++; }
   105a6:	6a 2d       	mov	r22, r10
   105a8:	8f ef       	ldi	r24, 0xFF	; 255
   105aa:	86 0d       	add	r24, r6
   105ac:	0f 94 75 54 	call	0x2a8ea	; 0x2a8ea <mbl_point_measurement_valid(unsigned char, unsigned char)>
   105b0:	88 23       	and	r24, r24
   105b2:	31 f1       	breq	.+76     	; 0x10600 <gcode_G80()+0xb6e>
   105b4:	f8 01       	movw	r30, r16
   105b6:	33 97       	sbiw	r30, 0x03	; 3
   105b8:	20 81       	ld	r18, Z
   105ba:	31 81       	ldd	r19, Z+1	; 0x01
   105bc:	42 81       	ldd	r20, Z+2	; 0x02
   105be:	53 81       	ldd	r21, Z+3	; 0x03
   105c0:	c7 01       	movw	r24, r14
   105c2:	b6 01       	movw	r22, r12
   105c4:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   105c8:	6b 01       	movw	r12, r22
   105ca:	7c 01       	movw	r14, r24
   105cc:	73 94       	inc	r7
		if(count != 0) mbl.z_values[y][x] = z / count; //if we have at least one valid point in surrounding area use average value, otherwise use inaccurately measured Z-coordinate
   105ce:	67 2d       	mov	r22, r7
   105d0:	70 e0       	ldi	r23, 0x00	; 0
   105d2:	90 e0       	ldi	r25, 0x00	; 0
   105d4:	80 e0       	ldi	r24, 0x00	; 0
   105d6:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   105da:	9b 01       	movw	r18, r22
   105dc:	ac 01       	movw	r20, r24
   105de:	c7 01       	movw	r24, r14
   105e0:	b6 01       	movw	r22, r12
   105e2:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   105e6:	d8 01       	movw	r26, r16
   105e8:	11 96       	adiw	r26, 0x01	; 1
   105ea:	6d 93       	st	X+, r22
   105ec:	7d 93       	st	X+, r23
   105ee:	8d 93       	st	X+, r24
   105f0:	9c 93       	st	X, r25
   105f2:	14 97       	sbiw	r26, 0x04	; 4
   105f4:	07 c0       	rjmp	.+14     	; 0x10604 <gcode_G80()+0xb72>
    }

    mbl.upsample_3x3(); //interpolation from 3x3 to 7x7 points using largrangian polynomials while using the same array z_values[iy][ix] for storing (just coppying measured data to new destination and interpolating between them)

    { // apply magnet compensation
        uint8_t useMagnetCompensation = code_seen('M') ? code_value_uint8() : eeprom_read_byte((uint8_t*)EEPROM_MBL_MAGNET_ELIMINATION);
   105f6:	8c ea       	ldi	r24, 0xAC	; 172
   105f8:	9d e0       	ldi	r25, 0x0D	; 13
   105fa:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   105fe:	79 cf       	rjmp	.-270    	; 0x104f2 <gcode_G80()+0xa60>
   10600:	71 10       	cpse	r7, r1
   10602:	e5 cf       	rjmp	.-54     	; 0x105ce <gcode_G80()+0xb3c>
		//printf_P(PSTR("result: Z = %f \n\n"), mbl.z_values[y][x]);
}

void mbl_magnet_elimination() {
    for (uint8_t y = 0; y < MESH_NUM_Y_POINTS; y++) {
		for (uint8_t x = 0; x < MESH_NUM_X_POINTS; x++) {
   10604:	69 2c       	mov	r6, r9
   10606:	0c 5f       	subi	r16, 0xFC	; 252
   10608:	1f 4f       	sbci	r17, 0xFF	; 255
   1060a:	b7 e0       	ldi	r27, 0x07	; 7
   1060c:	9b 12       	cpse	r9, r27
   1060e:	83 cf       	rjmp	.-250    	; 0x10516 <gcode_G80()+0xa84>
   10610:	b3 94       	inc	r11
   10612:	e9 a1       	ldd	r30, Y+33	; 0x21
   10614:	fa a1       	ldd	r31, Y+34	; 0x22
   10616:	7c 96       	adiw	r30, 0x1c	; 28
   10618:	fa a3       	std	Y+34, r31	; 0x22
   1061a:	e9 a3       	std	Y+33, r30	; 0x21
		if(count != 0) mbl.z_values[y][x] = z / count; //if we have at least one valid point in surrounding area use average value, otherwise use inaccurately measured Z-coordinate
		//printf_P(PSTR("result: Z = %f \n\n"), mbl.z_values[y][x]);
}

void mbl_magnet_elimination() {
    for (uint8_t y = 0; y < MESH_NUM_Y_POINTS; y++) {
   1061c:	f8 e0       	ldi	r31, 0x08	; 8
   1061e:	bf 12       	cpse	r11, r31
   10620:	71 cf       	rjmp	.-286    	; 0x10504 <gcode_G80()+0xa72>
        if (nMeasPoints == 7 && useMagnetCompensation) {
            mbl_magnet_elimination();
        }
    }

    mbl.active = 1; //activate mesh bed leveling
   10622:	81 e0       	ldi	r24, 0x01	; 1
   10624:	80 93 09 13 	sts	0x1309, r24	; 0x801309 <mbl>

    if (code_seen('O') && !code_value_uint8()) {
   10628:	8f e4       	ldi	r24, 0x4F	; 79
   1062a:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   1062e:	81 11       	cpse	r24, r1
   10630:	03 c0       	rjmp	.+6      	; 0x10638 <gcode_G80()+0xba6>
        // Don't let the manage_inactivity() function remove power from the motors.
        refresh_cmd_timeout();
    } else {
        go_home_with_z_lift();
   10632:	0e 94 3d 6a 	call	0xd47a	; 0xd47a <go_home_with_z_lift()>
   10636:	79 cc       	rjmp	.-1806   	; 0xff2a <gcode_G80()+0x498>
        }
    }

    mbl.active = 1; //activate mesh bed leveling

    if (code_seen('O') && !code_value_uint8()) {
   10638:	0e 94 0a 56 	call	0xac14	; 0xac14 <code_value_uint8()>
   1063c:	81 11       	cpse	r24, r1
   1063e:	f9 cf       	rjmp	.-14     	; 0x10632 <gcode_G80()+0xba0>
        // Don't let the manage_inactivity() function remove power from the motors.
        refresh_cmd_timeout();
   10640:	0e 94 41 65 	call	0xca82	; 0xca82 <refresh_cmd_timeout()>
   10644:	72 cc       	rjmp	.-1820   	; 0xff2a <gcode_G80()+0x498>

00010646 <kill(char const*)>:
#endif //AUTO_REPORT
  host_keepalive();
  M79_timer_update_status();
}

void kill(const char *full_screen_message) {
   10646:	ec 01       	movw	r28, r24
    cli(); // Stop interrupts
   10648:	f8 94       	cli
    disable_heater();
   1064a:	0f 94 05 11 	call	0x2220a	; 0x2220a <disable_heater()>

    disable_x();
   1064e:	17 9a       	sbi	0x02, 7	; 2
   10650:	10 92 39 06 	sts	0x0639, r1	; 0x800639 <axis_known_position>
    disable_y();
   10654:	16 9a       	sbi	0x02, 6	; 2
   10656:	10 92 3a 06 	sts	0x063A, r1	; 0x80063a <axis_known_position+0x1>
    poweroff_z();
    disable_e0();
   1065a:	14 9a       	sbi	0x02, 4	; 2

    SERIAL_ERROR_START;
   1065c:	81 eb       	ldi	r24, 0xB1	; 177
   1065e:	91 ea       	ldi	r25, 0xA1	; 161
   10660:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    SERIAL_ERRORLNRPGM(PSTR("Printer halted. kill() called!"));
   10664:	86 e0       	ldi	r24, 0x06	; 6
   10666:	98 e7       	ldi	r25, 0x78	; 120
   10668:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>

    if (full_screen_message != NULL) {
   1066c:	20 97       	sbiw	r28, 0x00	; 0
   1066e:	79 f0       	breq	.+30     	; 0x1068e <kill(char const*)+0x48>
        SERIAL_ERRORLNRPGM(full_screen_message);
   10670:	ce 01       	movw	r24, r28
   10672:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   10676:	be 01       	movw	r22, r28
   10678:	85 e9       	ldi	r24, 0x95	; 149
   1067a:	9c e0       	ldi	r25, 0x0C	; 12
   1067c:	0f 94 3e a4 	call	0x3487c	; 0x3487c <eeprom_write_word>
    if (active) {
        uint8_t previous_value = eeprom_read_byte(dst);
        eeprom_byte_notify(dst, previous_value, value, true);
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_write_byte(dst, value);
   10680:	62 e4       	ldi	r22, 0x42	; 66
   10682:	84 e9       	ldi	r24, 0x94	; 148
   10684:	9c e0       	ldi	r25, 0x0C	; 12
   10686:	0f 94 28 a4 	call	0x34850	; 0x34850 <eeprom_write_byte>

    // update eeprom with the correct kill message to be shown on startup
    eeprom_write_word_notify((uint16_t*)EEPROM_KILL_MESSAGE, (uint16_t)full_screen_message);
    eeprom_write_byte_notify((uint8_t*)EEPROM_KILL_PENDING_FLAG, KILL_PENDING_FLAG);

    softReset();
   1068a:	0e 94 1f 66 	call	0xcc3e	; 0xcc3e <softReset>
    SERIAL_ERRORLNRPGM(PSTR("Printer halted. kill() called!"));

    if (full_screen_message != NULL) {
        SERIAL_ERRORLNRPGM(full_screen_message);
    } else {
        full_screen_message = PSTR("KILLED.");
   1068e:	ce ef       	ldi	r28, 0xFE	; 254
   10690:	d7 e7       	ldi	r29, 0x77	; 119
   10692:	f1 cf       	rjmp	.-30     	; 0x10676 <kill(char const*)+0x30>

00010694 <sample_mesh_and_store_reference()>:
// Sample the 9 points of the bed and store them into the EEPROM as a reference.
// When calling this function, the X, Y, Z axes should be already homed,
// and the world2machine correction matrix should be active.
// Returns false if the reference values are more than 3mm far away.
bool sample_mesh_and_store_reference()
{
   10694:	2f 92       	push	r2
   10696:	3f 92       	push	r3
   10698:	4f 92       	push	r4
   1069a:	5f 92       	push	r5
   1069c:	6f 92       	push	r6
   1069e:	7f 92       	push	r7
   106a0:	8f 92       	push	r8
   106a2:	9f 92       	push	r9
   106a4:	af 92       	push	r10
   106a6:	bf 92       	push	r11
   106a8:	cf 92       	push	r12
   106aa:	df 92       	push	r13
   106ac:	ef 92       	push	r14
   106ae:	ff 92       	push	r15
   106b0:	0f 93       	push	r16
   106b2:	1f 93       	push	r17
   106b4:	cf 93       	push	r28
   106b6:	df 93       	push	r29
   106b8:	00 d0       	rcall	.+0      	; 0x106ba <sample_mesh_and_store_reference()+0x26>
   106ba:	00 d0       	rcall	.+0      	; 0x106bc <sample_mesh_and_store_reference()+0x28>
   106bc:	cd b7       	in	r28, 0x3d	; 61
   106be:	de b7       	in	r29, 0x3e	; 62
  return hit;
}

bool enable_endstops(bool check)
{
  bool old = check_endstops;
   106c0:	80 91 77 02 	lds	r24, 0x0277	; 0x800277 <_ZL14check_endstops.lto_priv.387>
   106c4:	8c 83       	std	Y+4, r24	; 0x04
  check_endstops = check;
   106c6:	10 92 77 02 	sts	0x0277, r1	; 0x800277 <_ZL14check_endstops.lto_priv.387>
    bool result = false;
#ifdef TMC2130
    tmc2130_home_enter(Z_AXIS_MASK);
#endif
    bool endstops_enabled  = enable_endstops(false);
    bool endstop_z_enabled = enable_z_endstop(false);
   106ca:	80 e0       	ldi	r24, 0x00	; 0
   106cc:	0f 94 88 25 	call	0x24b10	; 0x24b10 <enable_z_endstop(bool)>
   106d0:	8b 83       	std	Y+3, r24	; 0x03

    // Don't let the manage_inactivity() function remove power from the motors.
    refresh_cmd_timeout();
   106d2:	0e 94 41 65 	call	0xca82	; 0xca82 <refresh_cmd_timeout()>

#ifdef MESH_BED_CALIBRATION_SHOW_LCD
    lcd_display_message_fullscreen_P(_T(MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1));
   106d6:	83 e5       	ldi	r24, 0x53	; 83
   106d8:	91 e6       	ldi	r25, 0x61	; 97
   106da:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   106de:	0e 94 a9 e0 	call	0x1c152	; 0x1c152 <lcd_display_message_fullscreen_P(char const*)>
    // display "point xx of yy"
    lcd_puts_at_P(0,3,_n("1/9"));
   106e2:	4d e4       	ldi	r20, 0x4D	; 77
   106e4:	57 e6       	ldi	r21, 0x67	; 103
   106e6:	63 e0       	ldi	r22, 0x03	; 3
   106e8:	80 e0       	ldi	r24, 0x00	; 0
   106ea:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
   106ee:	81 e0       	ldi	r24, 0x01	; 1
   106f0:	80 93 77 02 	sts	0x0277, r24	; 0x800277 <_ZL14check_endstops.lto_priv.387>
    // Sample Z heights for the mesh bed leveling.
    // In addition, store the results into an eeprom, to be used later for verification of the bed leveling process.
    {
        // Lower Z to the mesh search height with stall detection
        enable_endstops(true);
        current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
   106f4:	80 e0       	ldi	r24, 0x00	; 0
   106f6:	90 e0       	ldi	r25, 0x00	; 0
   106f8:	a0 ea       	ldi	r26, 0xA0	; 160
   106fa:	b0 e4       	ldi	r27, 0x40	; 64
   106fc:	80 93 69 12 	sts	0x1269, r24	; 0x801269 <current_position+0x8>
   10700:	90 93 6a 12 	sts	0x126A, r25	; 0x80126a <current_position+0x9>
   10704:	a0 93 6b 12 	sts	0x126B, r26	; 0x80126b <current_position+0xa>
   10708:	b0 93 6c 12 	sts	0x126C, r27	; 0x80126c <current_position+0xb>
        go_to_current(homing_feedrate[Z_AXIS]/60);
   1070c:	65 e5       	ldi	r22, 0x55	; 85
   1070e:	75 e5       	ldi	r23, 0x55	; 85
   10710:	85 e5       	ldi	r24, 0x55	; 85
   10712:	91 e4       	ldi	r25, 0x41	; 65
   10714:	0f 94 f6 50 	call	0x2a1ec	; 0x2a1ec <go_to_current(float) [clone .lto_priv.377]>
   10718:	10 92 77 02 	sts	0x0277, r1	; 0x800277 <_ZL14check_endstops.lto_priv.387>
        check_Z_crash();
#endif
        enable_endstops(false);

        // Move XY to first point
        current_position[X_AXIS] = BED_X0;
   1071c:	80 e0       	ldi	r24, 0x00	; 0
   1071e:	90 e0       	ldi	r25, 0x00	; 0
   10720:	a0 e8       	ldi	r26, 0x80	; 128
   10722:	bf e3       	ldi	r27, 0x3F	; 63
   10724:	80 93 61 12 	sts	0x1261, r24	; 0x801261 <current_position>
   10728:	90 93 62 12 	sts	0x1262, r25	; 0x801262 <current_position+0x1>
   1072c:	a0 93 63 12 	sts	0x1263, r26	; 0x801263 <current_position+0x2>
   10730:	b0 93 64 12 	sts	0x1264, r27	; 0x801264 <current_position+0x3>
        current_position[Y_AXIS] = BED_Y0;
   10734:	80 93 65 12 	sts	0x1265, r24	; 0x801265 <current_position+0x4>
   10738:	90 93 66 12 	sts	0x1266, r25	; 0x801266 <current_position+0x5>
   1073c:	a0 93 67 12 	sts	0x1267, r26	; 0x801267 <current_position+0x6>
   10740:	b0 93 68 12 	sts	0x1268, r27	; 0x801268 <current_position+0x7>
        world2machine_clamp(current_position[X_AXIS], current_position[Y_AXIS]);
   10744:	65 e6       	ldi	r22, 0x65	; 101
   10746:	72 e1       	ldi	r23, 0x12	; 18
   10748:	81 e6       	ldi	r24, 0x61	; 97
   1074a:	92 e1       	ldi	r25, 0x12	; 18
   1074c:	0e 94 1e 69 	call	0xd23c	; 0xd23c <world2machine_clamp(float&, float&)>
        go_to_current(homing_feedrate[X_AXIS]/60);
   10750:	60 e0       	ldi	r22, 0x00	; 0
   10752:	70 e0       	ldi	r23, 0x00	; 0
   10754:	88 e4       	ldi	r24, 0x48	; 72
   10756:	92 e4       	ldi	r25, 0x42	; 66
   10758:	0f 94 f6 50 	call	0x2a1ec	; 0x2a1ec <go_to_current(float) [clone .lto_priv.377]>
        set_destination_to_current();
   1075c:	0e 94 ae 66 	call	0xcd5c	; 0xcd5c <set_destination_to_current()>
        homeaxis(Z_AXIS);
   10760:	82 e0       	ldi	r24, 0x02	; 2
   10762:	0f 94 ae 79 	call	0x2f35c	; 0x2f35c <homeaxis(unsigned char, unsigned char) [clone .constprop.88]>
		if (!find_bed_induction_sensor_point_z()) //Z crash or deviation > 50um
   10766:	43 e0       	ldi	r20, 0x03	; 3
   10768:	60 e0       	ldi	r22, 0x00	; 0
   1076a:	70 e0       	ldi	r23, 0x00	; 0
   1076c:	80 e2       	ldi	r24, 0x20	; 32
   1076e:	91 ec       	ldi	r25, 0xC1	; 193
   10770:	0f 94 ed 7b 	call	0x2f7da	; 0x2f7da <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.86]>
   10774:	81 11       	cpse	r24, r1
   10776:	06 c0       	rjmp	.+12     	; 0x10784 <sample_mesh_and_store_reference()+0xf0>
		lcd_set_cursor(0, 3);
        lcd_printf_P(PSTR("%d/9"),mesh_point+1);
#endif /* MESH_BED_CALIBRATION_SHOW_LCD */
		if (!find_bed_induction_sensor_point_z()) //Z crash or deviation > 50um
		{
			kill(_T(MSG_BED_LEVELING_FAILED_POINT_LOW));
   10778:	8e ef       	ldi	r24, 0xFE	; 254
   1077a:	99 e3       	ldi	r25, 0x39	; 57
   1077c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   10780:	0e 94 23 83 	call	0x10646	; 0x10646 <kill(char const*)>
   10784:	80 91 69 12 	lds	r24, 0x1269	; 0x801269 <current_position+0x8>
   10788:	90 91 6a 12 	lds	r25, 0x126A	; 0x80126a <current_position+0x9>
   1078c:	a0 91 6b 12 	lds	r26, 0x126B	; 0x80126b <current_position+0xa>
   10790:	b0 91 6c 12 	lds	r27, 0x126C	; 0x80126c <current_position+0xb>
   10794:	80 93 0a 13 	sts	0x130A, r24	; 0x80130a <mbl+0x1>
   10798:	90 93 0b 13 	sts	0x130B, r25	; 0x80130b <mbl+0x2>
   1079c:	a0 93 0c 13 	sts	0x130C, r26	; 0x80130c <mbl+0x3>
   107a0:	b0 93 0d 13 	sts	0x130D, r27	; 0x80130d <mbl+0x4>
   107a4:	e2 e0       	ldi	r30, 0x02	; 2
   107a6:	f0 e0       	ldi	r31, 0x00	; 0
   107a8:	fa 83       	std	Y+2, r31	; 0x02
   107aa:	e9 83       	std	Y+1, r30	; 0x01
    static_assert(MESH_MEAS_NUM_X_POINTS * MESH_MEAS_NUM_Y_POINTS <= 255, "overflow.....");
    for (uint8_t mesh_point = 1; mesh_point != MESH_MEAS_NUM_X_POINTS * MESH_MEAS_NUM_Y_POINTS; ++ mesh_point) {
        // Don't let the manage_inactivity() function remove power from the motors.
        refresh_cmd_timeout();
        // Print the decrasing ID of the measurement point.
        current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
   107ac:	c1 2c       	mov	r12, r1
   107ae:	d1 2c       	mov	r13, r1
   107b0:	30 ea       	ldi	r19, 0xA0	; 160
   107b2:	e3 2e       	mov	r14, r19
   107b4:	30 e4       	ldi	r19, 0x40	; 64
   107b6:	f3 2e       	mov	r15, r19
        go_to_current(homing_feedrate[Z_AXIS]/60);
		uint8_t ix = mesh_point % MESH_MEAS_NUM_X_POINTS;
   107b8:	43 e0       	ldi	r20, 0x03	; 3
   107ba:	b4 2e       	mov	r11, r20
		uint8_t iy = mesh_point / MESH_MEAS_NUM_X_POINTS;
		if (iy & 1) ix = (MESH_MEAS_NUM_X_POINTS - 1) - ix; // Zig zag
   107bc:	52 e0       	ldi	r21, 0x02	; 2
   107be:	95 2e       	mov	r9, r21
        world2machine_clamp(current_position[X_AXIS], current_position[Y_AXIS]);
        go_to_current(homing_feedrate[X_AXIS]/60);
#ifdef MESH_BED_CALIBRATION_SHOW_LCD
        // display "point xx of yy"
		lcd_set_cursor(0, 3);
        lcd_printf_P(PSTR("%d/9"),mesh_point+1);
   107c0:	04 e8       	ldi	r16, 0x84	; 132
   107c2:	11 e8       	ldi	r17, 0x81	; 129
   107c4:	67 e0       	ldi	r22, 0x07	; 7
   107c6:	a6 2e       	mov	r10, r22
        mbl.set_z(0, 0, current_position[Z_AXIS]);
    }
    static_assert(MESH_MEAS_NUM_X_POINTS * MESH_MEAS_NUM_Y_POINTS <= 255, "overflow.....");
    for (uint8_t mesh_point = 1; mesh_point != MESH_MEAS_NUM_X_POINTS * MESH_MEAS_NUM_Y_POINTS; ++ mesh_point) {
        // Don't let the manage_inactivity() function remove power from the motors.
        refresh_cmd_timeout();
   107c8:	0e 94 41 65 	call	0xca82	; 0xca82 <refresh_cmd_timeout()>
        // Print the decrasing ID of the measurement point.
        current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
   107cc:	c0 92 69 12 	sts	0x1269, r12	; 0x801269 <current_position+0x8>
   107d0:	d0 92 6a 12 	sts	0x126A, r13	; 0x80126a <current_position+0x9>
   107d4:	e0 92 6b 12 	sts	0x126B, r14	; 0x80126b <current_position+0xa>
   107d8:	f0 92 6c 12 	sts	0x126C, r15	; 0x80126c <current_position+0xb>
        go_to_current(homing_feedrate[Z_AXIS]/60);
   107dc:	65 e5       	ldi	r22, 0x55	; 85
   107de:	75 e5       	ldi	r23, 0x55	; 85
   107e0:	85 e5       	ldi	r24, 0x55	; 85
   107e2:	91 e4       	ldi	r25, 0x41	; 65
   107e4:	0f 94 f6 50 	call	0x2a1ec	; 0x2a1ec <go_to_current(float) [clone .lto_priv.377]>
		uint8_t ix = mesh_point % MESH_MEAS_NUM_X_POINTS;
   107e8:	29 81       	ldd	r18, Y+1	; 0x01
   107ea:	21 50       	subi	r18, 0x01	; 1
   107ec:	82 2f       	mov	r24, r18
   107ee:	6b 2d       	mov	r22, r11
   107f0:	0f 94 8f a4 	call	0x3491e	; 0x3491e <__udivmodqi4>
   107f4:	89 2e       	mov	r8, r25
		uint8_t iy = mesh_point / MESH_MEAS_NUM_X_POINTS;
   107f6:	82 2f       	mov	r24, r18
   107f8:	0f 94 9b a4 	call	0x34936	; 0x34936 <__divmodqi4>
   107fc:	78 2e       	mov	r7, r24
		if (iy & 1) ix = (MESH_MEAS_NUM_X_POINTS - 1) - ix; // Zig zag
   107fe:	80 ff       	sbrs	r24, 0
   10800:	03 c0       	rjmp	.+6      	; 0x10808 <sample_mesh_and_store_reference()+0x174>
   10802:	f9 2d       	mov	r31, r9
   10804:	f8 19       	sub	r31, r8
   10806:	8f 2e       	mov	r8, r31
		current_position[X_AXIS] = BED_X(ix * 3);
   10808:	88 2d       	mov	r24, r8
   1080a:	88 0f       	add	r24, r24
   1080c:	88 0d       	add	r24, r8
   1080e:	0e 94 e0 5e 	call	0xbdc0	; 0xbdc0 <BED_X(unsigned char)>
   10812:	60 93 61 12 	sts	0x1261, r22	; 0x801261 <current_position>
   10816:	70 93 62 12 	sts	0x1262, r23	; 0x801262 <current_position+0x1>
   1081a:	80 93 63 12 	sts	0x1263, r24	; 0x801263 <current_position+0x2>
   1081e:	90 93 64 12 	sts	0x1264, r25	; 0x801264 <current_position+0x3>
		current_position[Y_AXIS] = BED_Y(iy * 3);
   10822:	87 2d       	mov	r24, r7
   10824:	88 0f       	add	r24, r24
   10826:	87 0d       	add	r24, r7
   10828:	0e 94 e0 5e 	call	0xbdc0	; 0xbdc0 <BED_X(unsigned char)>
   1082c:	60 93 65 12 	sts	0x1265, r22	; 0x801265 <current_position+0x4>
   10830:	70 93 66 12 	sts	0x1266, r23	; 0x801266 <current_position+0x5>
   10834:	80 93 67 12 	sts	0x1267, r24	; 0x801267 <current_position+0x6>
   10838:	90 93 68 12 	sts	0x1268, r25	; 0x801268 <current_position+0x7>
        world2machine_clamp(current_position[X_AXIS], current_position[Y_AXIS]);
   1083c:	65 e6       	ldi	r22, 0x65	; 101
   1083e:	72 e1       	ldi	r23, 0x12	; 18
   10840:	81 e6       	ldi	r24, 0x61	; 97
   10842:	92 e1       	ldi	r25, 0x12	; 18
   10844:	0e 94 1e 69 	call	0xd23c	; 0xd23c <world2machine_clamp(float&, float&)>
        go_to_current(homing_feedrate[X_AXIS]/60);
   10848:	60 e0       	ldi	r22, 0x00	; 0
   1084a:	70 e0       	ldi	r23, 0x00	; 0
   1084c:	88 e4       	ldi	r24, 0x48	; 72
   1084e:	92 e4       	ldi	r25, 0x42	; 66
   10850:	0f 94 f6 50 	call	0x2a1ec	; 0x2a1ec <go_to_current(float) [clone .lto_priv.377]>
#ifdef MESH_BED_CALIBRATION_SHOW_LCD
        // display "point xx of yy"
		lcd_set_cursor(0, 3);
   10854:	63 e0       	ldi	r22, 0x03	; 3
   10856:	80 e0       	ldi	r24, 0x00	; 0
   10858:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
        lcd_printf_P(PSTR("%d/9"),mesh_point+1);
   1085c:	8a 81       	ldd	r24, Y+2	; 0x02
   1085e:	8f 93       	push	r24
   10860:	99 81       	ldd	r25, Y+1	; 0x01
   10862:	9f 93       	push	r25
   10864:	1f 93       	push	r17
   10866:	0f 93       	push	r16
   10868:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
#endif /* MESH_BED_CALIBRATION_SHOW_LCD */
		if (!find_bed_induction_sensor_point_z()) //Z crash or deviation > 50um
   1086c:	43 e0       	ldi	r20, 0x03	; 3
   1086e:	60 e0       	ldi	r22, 0x00	; 0
   10870:	70 e0       	ldi	r23, 0x00	; 0
   10872:	80 e2       	ldi	r24, 0x20	; 32
   10874:	91 ec       	ldi	r25, 0xC1	; 193
   10876:	0f 94 ed 7b 	call	0x2f7da	; 0x2f7da <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.86]>
   1087a:	58 2e       	mov	r5, r24
   1087c:	0f 90       	pop	r0
   1087e:	0f 90       	pop	r0
   10880:	0f 90       	pop	r0
   10882:	0f 90       	pop	r0
   10884:	88 23       	and	r24, r24
   10886:	09 f4       	brne	.+2      	; 0x1088a <sample_mesh_and_store_reference()+0x1f6>
   10888:	77 cf       	rjmp	.-274    	; 0x10778 <sample_mesh_and_store_reference()+0xe4>
   1088a:	a7 9c       	mul	r10, r7
   1088c:	f0 01       	movw	r30, r0
   1088e:	11 24       	eor	r1, r1
   10890:	e8 0d       	add	r30, r8
   10892:	f1 1d       	adc	r31, r1
   10894:	ee 0f       	add	r30, r30
   10896:	ff 1f       	adc	r31, r31
   10898:	ee 0f       	add	r30, r30
   1089a:	ff 1f       	adc	r31, r31
   1089c:	e7 5f       	subi	r30, 0xF7	; 247
   1089e:	fc 4e       	sbci	r31, 0xEC	; 236
   108a0:	80 91 69 12 	lds	r24, 0x1269	; 0x801269 <current_position+0x8>
   108a4:	90 91 6a 12 	lds	r25, 0x126A	; 0x80126a <current_position+0x9>
   108a8:	a0 91 6b 12 	lds	r26, 0x126B	; 0x80126b <current_position+0xa>
   108ac:	b0 91 6c 12 	lds	r27, 0x126C	; 0x80126c <current_position+0xb>
   108b0:	81 83       	std	Z+1, r24	; 0x01
   108b2:	92 83       	std	Z+2, r25	; 0x02
   108b4:	a3 83       	std	Z+3, r26	; 0x03
   108b6:	b4 83       	std	Z+4, r27	; 0x04
   108b8:	e9 81       	ldd	r30, Y+1	; 0x01
   108ba:	fa 81       	ldd	r31, Y+2	; 0x02
   108bc:	31 96       	adiw	r30, 0x01	; 1
   108be:	fa 83       	std	Y+2, r31	; 0x02
   108c0:	e9 83       	std	Y+1, r30	; 0x01
			kill(_T(MSG_BED_LEVELING_FAILED_POINT_LOW));
		}
        mbl.set_z(0, 0, current_position[Z_AXIS]);
    }
    static_assert(MESH_MEAS_NUM_X_POINTS * MESH_MEAS_NUM_Y_POINTS <= 255, "overflow.....");
    for (uint8_t mesh_point = 1; mesh_point != MESH_MEAS_NUM_X_POINTS * MESH_MEAS_NUM_Y_POINTS; ++ mesh_point) {
   108c2:	3a 97       	sbiw	r30, 0x0a	; 10
   108c4:	09 f0       	breq	.+2      	; 0x108c8 <sample_mesh_and_store_reference()+0x234>
   108c6:	80 cf       	rjmp	.-256    	; 0x107c8 <sample_mesh_and_store_reference()+0x134>

        mbl.set_z(ix, iy, current_position[Z_AXIS]);
    }
    {
        // Verify the span of the Z values.
        float zmin = mbl.z_values[0][0];
   108c8:	60 90 0a 13 	lds	r6, 0x130A	; 0x80130a <mbl+0x1>
   108cc:	70 90 0b 13 	lds	r7, 0x130B	; 0x80130b <mbl+0x2>
   108d0:	80 90 0c 13 	lds	r8, 0x130C	; 0x80130c <mbl+0x3>
   108d4:	90 90 0d 13 	lds	r9, 0x130D	; 0x80130d <mbl+0x4>
        float zmax = zmin;
   108d8:	46 2c       	mov	r4, r6
   108da:	a7 2c       	mov	r10, r7
   108dc:	b8 2c       	mov	r11, r8
   108de:	29 2c       	mov	r2, r9

        mbl.set_z(ix, iy, current_position[Z_AXIS]);
    }
    {
        // Verify the span of the Z values.
        float zmin = mbl.z_values[0][0];
   108e0:	1e 82       	std	Y+6, r1	; 0x06
   108e2:	1d 82       	std	Y+5, r1	; 0x05
   108e4:	09 e0       	ldi	r16, 0x09	; 9
   108e6:	13 e1       	ldi	r17, 0x13	; 19
   108e8:	8d 81       	ldd	r24, Y+5	; 0x05
   108ea:	9e 81       	ldd	r25, Y+6	; 0x06
   108ec:	86 5f       	subi	r24, 0xF6	; 246
   108ee:	9c 4e       	sbci	r25, 0xEC	; 236
   108f0:	9a 83       	std	Y+2, r25	; 0x02
   108f2:	89 83       	std	Y+1, r24	; 0x01
   108f4:	93 e0       	ldi	r25, 0x03	; 3
   108f6:	39 2e       	mov	r3, r25
        float zmax = zmin;
        for (int8_t j = 0; j < 3; ++ j)
           for (int8_t i = 0; i < 3; ++ i) {
                zmin = min(zmin, mbl.z_values[j][i]);
   108f8:	e9 81       	ldd	r30, Y+1	; 0x01
   108fa:	fa 81       	ldd	r31, Y+2	; 0x02
   108fc:	c1 90       	ld	r12, Z+
   108fe:	d1 90       	ld	r13, Z+
   10900:	e1 90       	ld	r14, Z+
   10902:	f1 90       	ld	r15, Z+
   10904:	fa 83       	std	Y+2, r31	; 0x02
   10906:	e9 83       	std	Y+1, r30	; 0x01
   10908:	93 01       	movw	r18, r6
   1090a:	a4 01       	movw	r20, r8
   1090c:	c7 01       	movw	r24, r14
   1090e:	b6 01       	movw	r22, r12
   10910:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   10914:	18 16       	cp	r1, r24
   10916:	14 f0       	brlt	.+4      	; 0x1091c <sample_mesh_and_store_reference()+0x288>
   10918:	36 01       	movw	r6, r12
   1091a:	47 01       	movw	r8, r14
                zmax = max(zmax, mbl.z_values[j][i]);
   1091c:	24 2d       	mov	r18, r4
   1091e:	3a 2d       	mov	r19, r10
   10920:	4b 2d       	mov	r20, r11
   10922:	52 2d       	mov	r21, r2
   10924:	c7 01       	movw	r24, r14
   10926:	b6 01       	movw	r22, r12
   10928:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   1092c:	87 fd       	sbrc	r24, 7
   1092e:	04 c0       	rjmp	.+8      	; 0x10938 <sample_mesh_and_store_reference()+0x2a4>
   10930:	4c 2c       	mov	r4, r12
   10932:	ad 2c       	mov	r10, r13
   10934:	be 2c       	mov	r11, r14
   10936:	2f 2c       	mov	r2, r15
   10938:	3a 94       	dec	r3
    {
        // Verify the span of the Z values.
        float zmin = mbl.z_values[0][0];
        float zmax = zmin;
        for (int8_t j = 0; j < 3; ++ j)
           for (int8_t i = 0; i < 3; ++ i) {
   1093a:	31 10       	cpse	r3, r1
   1093c:	dd cf       	rjmp	.-70     	; 0x108f8 <sample_mesh_and_store_reference()+0x264>
   1093e:	8d 81       	ldd	r24, Y+5	; 0x05
   10940:	9e 81       	ldd	r25, Y+6	; 0x06
   10942:	4c 96       	adiw	r24, 0x1c	; 28
   10944:	9e 83       	std	Y+6, r25	; 0x06
   10946:	8d 83       	std	Y+5, r24	; 0x05
    }
    {
        // Verify the span of the Z values.
        float zmin = mbl.z_values[0][0];
        float zmax = zmin;
        for (int8_t j = 0; j < 3; ++ j)
   10948:	84 35       	cpi	r24, 0x54	; 84
   1094a:	91 05       	cpc	r25, r1
   1094c:	59 f6       	brne	.-106    	; 0x108e4 <sample_mesh_and_store_reference()+0x250>
           for (int8_t i = 0; i < 3; ++ i) {
                zmin = min(zmin, mbl.z_values[j][i]);
                zmax = max(zmax, mbl.z_values[j][i]);
           }
        if (zmax - zmin > 3.f) {
   1094e:	93 01       	movw	r18, r6
   10950:	a4 01       	movw	r20, r8
   10952:	64 2d       	mov	r22, r4
   10954:	7a 2d       	mov	r23, r10
   10956:	8b 2d       	mov	r24, r11
   10958:	92 2d       	mov	r25, r2
   1095a:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   1095e:	20 e0       	ldi	r18, 0x00	; 0
   10960:	30 e0       	ldi	r19, 0x00	; 0
   10962:	40 e4       	ldi	r20, 0x40	; 64
   10964:	50 e4       	ldi	r21, 0x40	; 64
   10966:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   1096a:	18 16       	cp	r1, r24
   1096c:	2c f5       	brge	.+74     	; 0x109b8 <sample_mesh_and_store_reference()+0x324>
            // The span of the Z offsets is extreme. Give up.
            // Homing failed on some of the points.
            SERIAL_PROTOCOLLNPGM("Exreme span of the Z values!");
   1096e:	87 e6       	ldi	r24, 0x67	; 103
   10970:	91 e8       	ldi	r25, 0x81	; 129
   10972:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
// When calling this function, the X, Y, Z axes should be already homed,
// and the world2machine correction matrix should be active.
// Returns false if the reference values are more than 3mm far away.
bool sample_mesh_and_store_reference()
{
    bool result = false;
   10976:	51 2c       	mov	r5, r1
   10978:	fc 81       	ldd	r31, Y+4	; 0x04
   1097a:	f0 93 77 02 	sts	0x0277, r31	; 0x800277 <_ZL14check_endstops.lto_priv.387>
    go_home_with_z_lift();

    result = true;
end:
    enable_endstops(endstops_enabled);
    enable_z_endstop(endstop_z_enabled);
   1097e:	8b 81       	ldd	r24, Y+3	; 0x03
   10980:	0f 94 88 25 	call	0x24b10	; 0x24b10 <enable_z_endstop(bool)>
#ifdef TMC2130
    tmc2130_home_exit();
#endif
    return result;
}
   10984:	85 2d       	mov	r24, r5
   10986:	26 96       	adiw	r28, 0x06	; 6
   10988:	0f b6       	in	r0, 0x3f	; 63
   1098a:	f8 94       	cli
   1098c:	de bf       	out	0x3e, r29	; 62
   1098e:	0f be       	out	0x3f, r0	; 63
   10990:	cd bf       	out	0x3d, r28	; 61
   10992:	df 91       	pop	r29
   10994:	cf 91       	pop	r28
   10996:	1f 91       	pop	r17
   10998:	0f 91       	pop	r16
   1099a:	ff 90       	pop	r15
   1099c:	ef 90       	pop	r14
   1099e:	df 90       	pop	r13
   109a0:	cf 90       	pop	r12
   109a2:	bf 90       	pop	r11
   109a4:	af 90       	pop	r10
   109a6:	9f 90       	pop	r9
   109a8:	8f 90       	pop	r8
   109aa:	7f 90       	pop	r7
   109ac:	6f 90       	pop	r6
   109ae:	5f 90       	pop	r5
   109b0:	4f 90       	pop	r4
   109b2:	3f 90       	pop	r3
   109b4:	2f 90       	pop	r2
   109b6:	08 95       	ret
    // Store the correction values to EEPROM.
    // Offsets of the Z heiths of the calibration points from the first point.
    // The offsets are saved as 16bit signed int, scaled to tenths of microns.
    {
        uint16_t addr = EEPROM_BED_CALIBRATION_Z_JITTER;
        for (int8_t j = 0; j < 3; ++ j)
   109b8:	19 82       	std	Y+1, r1	; 0x01

    // Store the correction values to EEPROM.
    // Offsets of the Z heiths of the calibration points from the first point.
    // The offsets are saved as 16bit signed int, scaled to tenths of microns.
    {
        uint16_t addr = EEPROM_BED_CALIBRATION_Z_JITTER;
   109ba:	85 ec       	ldi	r24, 0xC5	; 197
   109bc:	e8 2e       	mov	r14, r24
   109be:	8f e0       	ldi	r24, 0x0F	; 15
   109c0:	f8 2e       	mov	r15, r24
   109c2:	68 01       	movw	r12, r16
        for (int8_t j = 0; j < 3; ++ j)
            for (int8_t i = 0; i < 3; ++ i) {
   109c4:	1d 82       	std	Y+5, r1	; 0x05
                if (i == 0 && j == 0)
   109c6:	9d 81       	ldd	r25, Y+5	; 0x05
   109c8:	91 11       	cpse	r25, r1
   109ca:	03 c0       	rjmp	.+6      	; 0x109d2 <sample_mesh_and_store_reference()+0x33e>
   109cc:	e9 81       	ldd	r30, Y+1	; 0x01
   109ce:	ee 23       	and	r30, r30
   109d0:	29 f1       	breq	.+74     	; 0x10a1c <sample_mesh_and_store_reference()+0x388>
                    continue;
                float dif = mbl.z_values[j][i] - mbl.z_values[0][0];
   109d2:	20 91 0a 13 	lds	r18, 0x130A	; 0x80130a <mbl+0x1>
   109d6:	30 91 0b 13 	lds	r19, 0x130B	; 0x80130b <mbl+0x2>
   109da:	40 91 0c 13 	lds	r20, 0x130C	; 0x80130c <mbl+0x3>
   109de:	50 91 0d 13 	lds	r21, 0x130D	; 0x80130d <mbl+0x4>
   109e2:	f6 01       	movw	r30, r12
   109e4:	61 81       	ldd	r22, Z+1	; 0x01
   109e6:	72 81       	ldd	r23, Z+2	; 0x02
   109e8:	83 81       	ldd	r24, Z+3	; 0x03
   109ea:	94 81       	ldd	r25, Z+4	; 0x04
   109ec:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
                int16_t dif_quantized = int16_t(floor(dif * 100.f + 0.5f));
   109f0:	20 e0       	ldi	r18, 0x00	; 0
   109f2:	30 e0       	ldi	r19, 0x00	; 0
   109f4:	48 ec       	ldi	r20, 0xC8	; 200
   109f6:	52 e4       	ldi	r21, 0x42	; 66
   109f8:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   109fc:	20 e0       	ldi	r18, 0x00	; 0
   109fe:	30 e0       	ldi	r19, 0x00	; 0
   10a00:	40 e0       	ldi	r20, 0x00	; 0
   10a02:	5f e3       	ldi	r21, 0x3F	; 63
   10a04:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   10a08:	0f 94 af a6 	call	0x34d5e	; 0x34d5e <floor>
   10a0c:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
        if (previous_value != value) {
            eeprom_word_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_word(dst, value);
   10a10:	c7 01       	movw	r24, r14
   10a12:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>
                    SERIAL_ECHOPGM(", read: ");
                    MYSERIAL.print(dif2, 5);
                    SERIAL_ECHOLNPGM("");
                }
                #endif
                addr += 2;
   10a16:	f2 e0       	ldi	r31, 0x02	; 2
   10a18:	ef 0e       	add	r14, r31
   10a1a:	f1 1c       	adc	r15, r1
   10a1c:	84 e0       	ldi	r24, 0x04	; 4
   10a1e:	c8 0e       	add	r12, r24
   10a20:	d1 1c       	adc	r13, r1
   10a22:	9d 81       	ldd	r25, Y+5	; 0x05
   10a24:	9f 5f       	subi	r25, 0xFF	; 255
   10a26:	9d 83       	std	Y+5, r25	; 0x05
    // Offsets of the Z heiths of the calibration points from the first point.
    // The offsets are saved as 16bit signed int, scaled to tenths of microns.
    {
        uint16_t addr = EEPROM_BED_CALIBRATION_Z_JITTER;
        for (int8_t j = 0; j < 3; ++ j)
            for (int8_t i = 0; i < 3; ++ i) {
   10a28:	93 30       	cpi	r25, 0x03	; 3
   10a2a:	69 f6       	brne	.-102    	; 0x109c6 <sample_mesh_and_store_reference()+0x332>
   10a2c:	04 5e       	subi	r16, 0xE4	; 228
   10a2e:	1f 4f       	sbci	r17, 0xFF	; 255
   10a30:	e9 81       	ldd	r30, Y+1	; 0x01
   10a32:	ef 5f       	subi	r30, 0xFF	; 255
   10a34:	e9 83       	std	Y+1, r30	; 0x01
    // Store the correction values to EEPROM.
    // Offsets of the Z heiths of the calibration points from the first point.
    // The offsets are saved as 16bit signed int, scaled to tenths of microns.
    {
        uint16_t addr = EEPROM_BED_CALIBRATION_Z_JITTER;
        for (int8_t j = 0; j < 3; ++ j)
   10a36:	e3 30       	cpi	r30, 0x03	; 3
   10a38:	21 f6       	brne	.-120    	; 0x109c2 <sample_mesh_and_store_reference()+0x32e>
                #endif
                addr += 2;
            }
    }

    mbl.reset();
   10a3a:	0f 94 e3 7b 	call	0x2f7c6	; 0x2f7c6 <mesh_bed_leveling::reset() [clone .constprop.87]>

    go_home_with_z_lift();
   10a3e:	0e 94 3d 6a 	call	0xd47a	; 0xd47a <go_home_with_z_lift()>
   10a42:	9a cf       	rjmp	.-204    	; 0x10978 <sample_mesh_and_store_reference()+0x2e4>

00010a44 <ClearToSend()>:

// Confirm the execution of a command, if sent from a serial line.
// Execution of a command from a SD card will not be confirmed.
void ClearToSend()
{
	previous_millis_cmd.start();
   10a44:	88 e4       	ldi	r24, 0x48	; 72
   10a46:	93 e0       	ldi	r25, 0x03	; 3
   10a48:	0f 94 47 10 	call	0x2208e	; 0x2208e <Timer<unsigned long>::start()>
	if (buflen && ((CMDBUFFER_CURRENT_TYPE == CMDBUFFER_CURRENT_TYPE_USB) || (CMDBUFFER_CURRENT_TYPE == CMDBUFFER_CURRENT_TYPE_USB_WITH_LINENR)))
   10a4c:	80 91 3c 12 	lds	r24, 0x123C	; 0x80123c <buflen>
   10a50:	90 91 3d 12 	lds	r25, 0x123D	; 0x80123d <buflen+0x1>
   10a54:	89 2b       	or	r24, r25
   10a56:	79 f0       	breq	.+30     	; 0x10a76 <ClearToSend()+0x32>
   10a58:	e0 91 38 12 	lds	r30, 0x1238	; 0x801238 <bufindr>
   10a5c:	f0 91 39 12 	lds	r31, 0x1239	; 0x801239 <bufindr+0x1>
   10a60:	e5 5b       	subi	r30, 0xB5	; 181
   10a62:	ff 4e       	sbci	r31, 0xEF	; 239
   10a64:	80 81       	ld	r24, Z
   10a66:	81 30       	cpi	r24, 0x01	; 1
   10a68:	11 f0       	breq	.+4      	; 0x10a6e <ClearToSend()+0x2a>
   10a6a:	86 30       	cpi	r24, 0x06	; 6
   10a6c:	21 f4       	brne	.+8      	; 0x10a76 <ClearToSend()+0x32>
		SERIAL_PROTOCOLLNRPGM(MSG_OK);
   10a6e:	80 ef       	ldi	r24, 0xF0	; 240
   10a70:	99 e6       	ldi	r25, 0x69	; 105
   10a72:	0c 94 bd 7c 	jmp	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
}
   10a76:	08 95       	ret

00010a78 <cmdqueue_reset()>:
    return false;
}

void cmdqueue_reset()
{
	while (buflen)
   10a78:	80 91 3c 12 	lds	r24, 0x123C	; 0x80123c <buflen>
   10a7c:	90 91 3d 12 	lds	r25, 0x123D	; 0x80123d <buflen+0x1>
   10a80:	89 2b       	or	r24, r25
   10a82:	29 f0       	breq	.+10     	; 0x10a8e <cmdqueue_reset()+0x16>
	{
		// printf_P(PSTR("dumping: \"%s\" of type %u\n"), cmdbuffer+bufindr+CMDHDRSIZE, CMDBUFFER_CURRENT_TYPE);
		ClearToSend();
   10a84:	0e 94 22 85 	call	0x10a44	; 0x10a44 <ClearToSend()>
		cmdqueue_pop_front();
   10a88:	0e 94 43 79 	call	0xf286	; 0xf286 <cmdqueue_pop_front()>
   10a8c:	f5 cf       	rjmp	.-22     	; 0x10a78 <cmdqueue_reset()>
	}
	bufindr = 0;
   10a8e:	10 92 39 12 	sts	0x1239, r1	; 0x801239 <bufindr+0x1>
   10a92:	10 92 38 12 	sts	0x1238, r1	; 0x801238 <bufindr>
	bufindw = 0;
   10a96:	10 92 4a 10 	sts	0x104A, r1	; 0x80104a <_ZL7bufindw.lto_priv.514+0x1>
   10a9a:	10 92 49 10 	sts	0x1049, r1	; 0x801049 <_ZL7bufindw.lto_priv.514>

	//commands are removed from command queue after process_command() function is finished
	//reseting command queue and enqueing new commands during some (usually long running) command processing would cause that new commands are immediately removed from queue (or damaged)
	//this will ensure that all new commands which are enqueued after cmdqueue reset, will be always executed
	cmdbuffer_front_already_processed = true;
   10a9e:	81 e0       	ldi	r24, 0x01	; 1
   10aa0:	80 93 53 12 	sts	0x1253, r24	; 0x801253 <cmdbuffer_front_already_processed>
}
   10aa4:	08 95       	ret

00010aa6 <gcode_G81_M420()>:
}

// G81_M420 Mesh bed leveling status

static void gcode_G81_M420()
{
   10aa6:	ef 92       	push	r14
   10aa8:	ff 92       	push	r15
   10aaa:	0f 93       	push	r16
   10aac:	1f 93       	push	r17
   10aae:	cf 93       	push	r28
   10ab0:	df 93       	push	r29
    if (mbl.active) {
   10ab2:	80 91 09 13 	lds	r24, 0x1309	; 0x801309 <mbl>
   10ab6:	88 23       	and	r24, r24
   10ab8:	89 f1       	breq	.+98     	; 0x10b1c <gcode_G81_M420()+0x76>
        }
    }
}

void mesh_bed_leveling::print() {
    SERIAL_PROTOCOLLNPGM("Num X,Y: " STRINGIFY(MESH_NUM_X_POINTS) "," STRINGIFY(MESH_NUM_Y_POINTS));
   10aba:	80 e9       	ldi	r24, 0x90	; 144
   10abc:	97 e7       	ldi	r25, 0x77	; 119
   10abe:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
    SERIAL_PROTOCOLLNPGM("Z search height: " STRINGIFY(MESH_HOME_Z_SEARCH));
   10ac2:	8a e7       	ldi	r24, 0x7A	; 122
   10ac4:	97 e7       	ldi	r25, 0x77	; 119
   10ac6:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
    SERIAL_PROTOCOLLNPGM("Measured points:");
   10aca:	89 e6       	ldi	r24, 0x69	; 105
   10acc:	97 e7       	ldi	r25, 0x77	; 119
   10ace:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
    for (uint8_t y = MESH_NUM_Y_POINTS; y-- > 0;) {
   10ad2:	c7 e0       	ldi	r28, 0x07	; 7
   10ad4:	dc e1       	ldi	r29, 0x1C	; 28
   10ad6:	c1 50       	subi	r28, 0x01	; 1
   10ad8:	58 f1       	brcs	.+86     	; 0x10b30 <gcode_G81_M420()+0x8a>
   10ada:	cd 9f       	mul	r28, r29
   10adc:	70 01       	movw	r14, r0
   10ade:	11 24       	eor	r1, r1
   10ae0:	01 e0       	ldi	r16, 0x01	; 1
   10ae2:	10 e0       	ldi	r17, 0x00	; 0
        for (uint8_t x = 0; x < MESH_NUM_X_POINTS; x++) {
            SERIAL_PROTOCOLPGM("  ");
   10ae4:	86 e6       	ldi	r24, 0x66	; 102
   10ae6:	97 e7       	ldi	r25, 0x77	; 119
   10ae8:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
            SERIAL_PROTOCOL_F(z_values[y][x], 5);
   10aec:	f8 01       	movw	r30, r16
   10aee:	ee 0f       	add	r30, r30
   10af0:	ff 1f       	adc	r31, r31
   10af2:	ee 0f       	add	r30, r30
   10af4:	ff 1f       	adc	r31, r31
   10af6:	ee 0d       	add	r30, r14
   10af8:	ff 1d       	adc	r31, r15
   10afa:	ea 5f       	subi	r30, 0xFA	; 250
   10afc:	fc 4e       	sbci	r31, 0xEC	; 236
   10afe:	60 81       	ld	r22, Z
   10b00:	71 81       	ldd	r23, Z+1	; 0x01
   10b02:	82 81       	ldd	r24, Z+2	; 0x02
   10b04:	93 81       	ldd	r25, Z+3	; 0x03
   10b06:	45 e0       	ldi	r20, 0x05	; 5
   10b08:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
   10b0c:	0f 5f       	subi	r16, 0xFF	; 255
   10b0e:	1f 4f       	sbci	r17, 0xFF	; 255
void mesh_bed_leveling::print() {
    SERIAL_PROTOCOLLNPGM("Num X,Y: " STRINGIFY(MESH_NUM_X_POINTS) "," STRINGIFY(MESH_NUM_Y_POINTS));
    SERIAL_PROTOCOLLNPGM("Z search height: " STRINGIFY(MESH_HOME_Z_SEARCH));
    SERIAL_PROTOCOLLNPGM("Measured points:");
    for (uint8_t y = MESH_NUM_Y_POINTS; y-- > 0;) {
        for (uint8_t x = 0; x < MESH_NUM_X_POINTS; x++) {
   10b10:	08 30       	cpi	r16, 0x08	; 8
   10b12:	11 05       	cpc	r17, r1
   10b14:	39 f7       	brne	.-50     	; 0x10ae4 <gcode_G81_M420()+0x3e>
            SERIAL_PROTOCOLPGM("  ");
            SERIAL_PROTOCOL_F(z_values[y][x], 5);
        }
        SERIAL_PROTOCOLLN();
   10b16:	0e 94 bc 7a 	call	0xf578	; 0xf578 <MarlinSerial::println()>
   10b1a:	dd cf       	rjmp	.-70     	; 0x10ad6 <gcode_G81_M420()+0x30>
        mbl.print();
        } else SERIAL_PROTOCOLLNPGM("Mesh bed leveling not active.");
   10b1c:	8d e9       	ldi	r24, 0x9D	; 157
   10b1e:	97 e7       	ldi	r25, 0x77	; 119
    return;
}
   10b20:	df 91       	pop	r29
   10b22:	cf 91       	pop	r28
   10b24:	1f 91       	pop	r17
   10b26:	0f 91       	pop	r16
   10b28:	ff 90       	pop	r15
   10b2a:	ef 90       	pop	r14

static void gcode_G81_M420()
{
    if (mbl.active) {
        mbl.print();
        } else SERIAL_PROTOCOLLNPGM("Mesh bed leveling not active.");
   10b2c:	0c 94 bd 7c 	jmp	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
    return;
}
   10b30:	df 91       	pop	r29
   10b32:	cf 91       	pop	r28
   10b34:	1f 91       	pop	r17
   10b36:	0f 91       	pop	r16
   10b38:	ff 90       	pop	r15
   10b3a:	ef 90       	pop	r14
   10b3c:	08 95       	ret

00010b3e <la10c_jerk(float)>:
        return (k >= 0? la10c_convert(k): -1);
}


float la10c_jerk(float j)
{
   10b3e:	cf 92       	push	r12
   10b40:	df 92       	push	r13
   10b42:	ef 92       	push	r14
   10b44:	ff 92       	push	r15
   10b46:	6b 01       	movw	r12, r22
   10b48:	7c 01       	movw	r14, r24
    la10c_orig_jerk = j;
   10b4a:	c0 92 27 03 	sts	0x0327, r12	; 0x800327 <la10c_orig_jerk>
   10b4e:	d0 92 28 03 	sts	0x0328, r13	; 0x800328 <la10c_orig_jerk+0x1>
   10b52:	e0 92 29 03 	sts	0x0329, r14	; 0x800329 <la10c_orig_jerk+0x2>
   10b56:	f0 92 2a 03 	sts	0x032A, r15	; 0x80032a <la10c_orig_jerk+0x3>

    if(la10c_mode != LA10C_LA10)
   10b5a:	80 91 43 03 	lds	r24, 0x0343	; 0x800343 <la10c_mode>
   10b5e:	82 30       	cpi	r24, 0x02	; 2
   10b60:	b1 f4       	brne	.+44     	; 0x10b8e <la10c_jerk(float)+0x50>
        return j;

    // check for a compatible range of values prior to convert (be sure that
    // a higher E-jerk would still be compatible wrt the E accell range)
    if(j < 4.5 && cs.max_acceleration_mm_per_s2_normal[E_AXIS] < 2000)
   10b62:	20 e0       	ldi	r18, 0x00	; 0
   10b64:	30 e0       	ldi	r19, 0x00	; 0
   10b66:	40 e9       	ldi	r20, 0x90	; 144
   10b68:	50 e4       	ldi	r21, 0x40	; 64
   10b6a:	c7 01       	movw	r24, r14
   10b6c:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   10b70:	87 ff       	sbrs	r24, 7
   10b72:	14 c0       	rjmp	.+40     	; 0x10b9c <la10c_jerk(float)+0x5e>
   10b74:	80 91 97 0d 	lds	r24, 0x0D97	; 0x800d97 <cs+0x30>
   10b78:	90 91 98 0d 	lds	r25, 0x0D98	; 0x800d98 <cs+0x31>
   10b7c:	a0 91 99 0d 	lds	r26, 0x0D99	; 0x800d99 <cs+0x32>
   10b80:	b0 91 9a 0d 	lds	r27, 0x0D9A	; 0x800d9a <cs+0x33>
   10b84:	80 3d       	cpi	r24, 0xD0	; 208
   10b86:	97 40       	sbci	r25, 0x07	; 7
   10b88:	a1 05       	cpc	r26, r1
   10b8a:	b1 05       	cpc	r27, r1
   10b8c:	20 f5       	brcc	.+72     	; 0x10bd6 <la10c_jerk(float)+0x98>
        j;

    SERIAL_ECHOPGM("LA10C: Adjusted E-Jerk: ");
    SERIAL_ECHOLN(j);
    return j;
}
   10b8e:	c7 01       	movw	r24, r14
   10b90:	b6 01       	movw	r22, r12
   10b92:	ff 90       	pop	r15
   10b94:	ef 90       	pop	r14
   10b96:	df 90       	pop	r13
   10b98:	cf 90       	pop	r12
   10b9a:	08 95       	ret

    // bring low E-jerk values into equivalent LA 1.5 values by
    // flattening the response in the (0.3-4.5) range using a piecewise
    // function. Is it truly worth to preserve the difference between
    // 1.5/2.5 E-jerk for LA1.0? Probably not, but we try nonetheless.
    j = j < 0.3? j * 11.5:
   10b9c:	2a e9       	ldi	r18, 0x9A	; 154
   10b9e:	39 e9       	ldi	r19, 0x99	; 153
   10ba0:	49 e9       	ldi	r20, 0x99	; 153
   10ba2:	5e e3       	ldi	r21, 0x3E	; 62
   10ba4:	c7 01       	movw	r24, r14
   10ba6:	b6 01       	movw	r22, r12
   10ba8:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   10bac:	87 ff       	sbrs	r24, 7
   10bae:	0a c0       	rjmp	.+20     	; 0x10bc4 <la10c_jerk(float)+0x86>
   10bb0:	20 e0       	ldi	r18, 0x00	; 0
   10bb2:	30 e0       	ldi	r19, 0x00	; 0
   10bb4:	48 e3       	ldi	r20, 0x38	; 56
   10bb6:	51 e4       	ldi	r21, 0x41	; 65
   10bb8:	c7 01       	movw	r24, r14
   10bba:	b6 01       	movw	r22, r12
   10bbc:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   10bc0:	6b 01       	movw	r12, r22
   10bc2:	7c 01       	movw	r14, r24
        j < 4.5? j * 0.25 + 3.375:
        j;

    SERIAL_ECHOPGM("LA10C: Adjusted E-Jerk: ");
   10bc4:	84 e7       	ldi	r24, 0x74	; 116
   10bc6:	94 e7       	ldi	r25, 0x74	; 116
   10bc8:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    SERIAL_ECHOLN(j);
   10bcc:	c7 01       	movw	r24, r14
   10bce:	b6 01       	movw	r22, r12
   10bd0:	0f 94 a2 65 	call	0x2cb44	; 0x2cb44 <MarlinSerial::println(double, int) [clone .constprop.354]>
   10bd4:	dc cf       	rjmp	.-72     	; 0x10b8e <la10c_jerk(float)+0x50>

    // bring low E-jerk values into equivalent LA 1.5 values by
    // flattening the response in the (0.3-4.5) range using a piecewise
    // function. Is it truly worth to preserve the difference between
    // 1.5/2.5 E-jerk for LA1.0? Probably not, but we try nonetheless.
    j = j < 0.3? j * 11.5:
   10bd6:	2a e9       	ldi	r18, 0x9A	; 154
   10bd8:	39 e9       	ldi	r19, 0x99	; 153
   10bda:	49 e9       	ldi	r20, 0x99	; 153
   10bdc:	5e e3       	ldi	r21, 0x3E	; 62
   10bde:	c7 01       	movw	r24, r14
   10be0:	b6 01       	movw	r22, r12
   10be2:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   10be6:	87 fd       	sbrc	r24, 7
   10be8:	e3 cf       	rjmp	.-58     	; 0x10bb0 <la10c_jerk(float)+0x72>
        j < 4.5? j * 0.25 + 3.375:
   10bea:	20 e0       	ldi	r18, 0x00	; 0
   10bec:	30 e0       	ldi	r19, 0x00	; 0
   10bee:	40 e8       	ldi	r20, 0x80	; 128
   10bf0:	5e e3       	ldi	r21, 0x3E	; 62
   10bf2:	c7 01       	movw	r24, r14
   10bf4:	b6 01       	movw	r22, r12
   10bf6:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>

    // bring low E-jerk values into equivalent LA 1.5 values by
    // flattening the response in the (0.3-4.5) range using a piecewise
    // function. Is it truly worth to preserve the difference between
    // 1.5/2.5 E-jerk for LA1.0? Probably not, but we try nonetheless.
    j = j < 0.3? j * 11.5:
   10bfa:	20 e0       	ldi	r18, 0x00	; 0
   10bfc:	30 e0       	ldi	r19, 0x00	; 0
   10bfe:	48 e5       	ldi	r20, 0x58	; 88
   10c00:	50 e4       	ldi	r21, 0x40	; 64
   10c02:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   10c06:	dc cf       	rjmp	.-72     	; 0x10bc0 <la10c_jerk(float)+0x82>

00010c08 <la10c_mode_change(LA10C_MODE)>:
    return la10c_mode;
}


void la10c_mode_change(LA10C_MODE mode)
{
   10c08:	cf 92       	push	r12
   10c0a:	df 92       	push	r13
   10c0c:	ef 92       	push	r14
   10c0e:	ff 92       	push	r15
   10c10:	cf 93       	push	r28
    if(mode == la10c_mode) return;
   10c12:	90 91 43 03 	lds	r25, 0x0343	; 0x800343 <la10c_mode>
   10c16:	98 17       	cp	r25, r24
   10c18:	b9 f1       	breq	.+110    	; 0x10c88 <la10c_mode_change(LA10C_MODE)+0x80>
   10c1a:	c8 2f       	mov	r28, r24

    // always restore to the last unadjusted E-jerk value
    if(la10c_orig_jerk)
   10c1c:	c0 90 27 03 	lds	r12, 0x0327	; 0x800327 <la10c_orig_jerk>
   10c20:	d0 90 28 03 	lds	r13, 0x0328	; 0x800328 <la10c_orig_jerk+0x1>
   10c24:	e0 90 29 03 	lds	r14, 0x0329	; 0x800329 <la10c_orig_jerk+0x2>
   10c28:	f0 90 2a 03 	lds	r15, 0x032A	; 0x80032a <la10c_orig_jerk+0x3>
   10c2c:	20 e0       	ldi	r18, 0x00	; 0
   10c2e:	30 e0       	ldi	r19, 0x00	; 0
   10c30:	a9 01       	movw	r20, r18
   10c32:	c7 01       	movw	r24, r14
   10c34:	b6 01       	movw	r22, r12
   10c36:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   10c3a:	88 23       	and	r24, r24
   10c3c:	41 f0       	breq	.+16     	; 0x10c4e <la10c_mode_change(LA10C_MODE)+0x46>
        cs.max_jerk[E_AXIS] = la10c_orig_jerk;
   10c3e:	c0 92 bb 0d 	sts	0x0DBB, r12	; 0x800dbb <cs+0x54>
   10c42:	d0 92 bc 0d 	sts	0x0DBC, r13	; 0x800dbc <cs+0x55>
   10c46:	e0 92 bd 0d 	sts	0x0DBD, r14	; 0x800dbd <cs+0x56>
   10c4a:	f0 92 be 0d 	sts	0x0DBE, r15	; 0x800dbe <cs+0x57>

    SERIAL_ECHOPGM("LA10C: Linear Advance mode: ");
   10c4e:	87 e5       	ldi	r24, 0x57	; 87
   10c50:	94 e7       	ldi	r25, 0x74	; 116
   10c52:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    switch(mode)
   10c56:	c1 30       	cpi	r28, 0x01	; 1
   10c58:	11 f1       	breq	.+68     	; 0x10c9e <la10c_mode_change(LA10C_MODE)+0x96>
   10c5a:	e0 f0       	brcs	.+56     	; 0x10c94 <la10c_mode_change(LA10C_MODE)+0x8c>
   10c5c:	c2 30       	cpi	r28, 0x02	; 2
   10c5e:	11 f1       	breq	.+68     	; 0x10ca4 <la10c_mode_change(LA10C_MODE)+0x9c>
    {
    case LA10C_UNKNOWN: SERIAL_ECHOLNPGM("UNKNOWN"); break;
    case LA10C_LA15:    SERIAL_ECHOLNPGM("1.5"); break;
    case LA10C_LA10:    SERIAL_ECHOLNPGM("1.0"); break;
    }
    la10c_mode = mode;
   10c60:	c0 93 43 03 	sts	0x0343, r28	; 0x800343 <la10c_mode>

    // adjust the E-jerk if needed
    cs.max_jerk[E_AXIS] = la10c_jerk(cs.max_jerk[E_AXIS]);
   10c64:	60 91 bb 0d 	lds	r22, 0x0DBB	; 0x800dbb <cs+0x54>
   10c68:	70 91 bc 0d 	lds	r23, 0x0DBC	; 0x800dbc <cs+0x55>
   10c6c:	80 91 bd 0d 	lds	r24, 0x0DBD	; 0x800dbd <cs+0x56>
   10c70:	90 91 be 0d 	lds	r25, 0x0DBE	; 0x800dbe <cs+0x57>
   10c74:	0e 94 9f 85 	call	0x10b3e	; 0x10b3e <la10c_jerk(float)>
   10c78:	60 93 bb 0d 	sts	0x0DBB, r22	; 0x800dbb <cs+0x54>
   10c7c:	70 93 bc 0d 	sts	0x0DBC, r23	; 0x800dbc <cs+0x55>
   10c80:	80 93 bd 0d 	sts	0x0DBD, r24	; 0x800dbd <cs+0x56>
   10c84:	90 93 be 0d 	sts	0x0DBE, r25	; 0x800dbe <cs+0x57>
}
   10c88:	cf 91       	pop	r28
   10c8a:	ff 90       	pop	r15
   10c8c:	ef 90       	pop	r14
   10c8e:	df 90       	pop	r13
   10c90:	cf 90       	pop	r12
   10c92:	08 95       	ret
        cs.max_jerk[E_AXIS] = la10c_orig_jerk;

    SERIAL_ECHOPGM("LA10C: Linear Advance mode: ");
    switch(mode)
    {
    case LA10C_UNKNOWN: SERIAL_ECHOLNPGM("UNKNOWN"); break;
   10c94:	8f e4       	ldi	r24, 0x4F	; 79
   10c96:	94 e7       	ldi	r25, 0x74	; 116
    case LA10C_LA15:    SERIAL_ECHOLNPGM("1.5"); break;
    case LA10C_LA10:    SERIAL_ECHOLNPGM("1.0"); break;
   10c98:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   10c9c:	e1 cf       	rjmp	.-62     	; 0x10c60 <la10c_mode_change(LA10C_MODE)+0x58>

    SERIAL_ECHOPGM("LA10C: Linear Advance mode: ");
    switch(mode)
    {
    case LA10C_UNKNOWN: SERIAL_ECHOLNPGM("UNKNOWN"); break;
    case LA10C_LA15:    SERIAL_ECHOLNPGM("1.5"); break;
   10c9e:	8b e4       	ldi	r24, 0x4B	; 75
   10ca0:	94 e7       	ldi	r25, 0x74	; 116
   10ca2:	fa cf       	rjmp	.-12     	; 0x10c98 <la10c_mode_change(LA10C_MODE)+0x90>
    case LA10C_LA10:    SERIAL_ECHOLNPGM("1.0"); break;
   10ca4:	87 e4       	ldi	r24, 0x47	; 71
   10ca6:	94 e7       	ldi	r25, 0x74	; 116
   10ca8:	f7 cf       	rjmp	.-18     	; 0x10c98 <la10c_mode_change(LA10C_MODE)+0x90>

00010caa <finishAndDisableSteppers()>:

bool IsStopped() { return Stopped; };

void finishAndDisableSteppers()
{
  st_synchronize();
   10caa:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
  disable_x();
   10cae:	17 9a       	sbi	0x02, 7	; 2
   10cb0:	e9 e3       	ldi	r30, 0x39	; 57
   10cb2:	f6 e0       	ldi	r31, 0x06	; 6
   10cb4:	10 82       	st	Z, r1
  disable_y();
   10cb6:	16 9a       	sbi	0x02, 6	; 2
   10cb8:	11 82       	std	Z+1, r1	; 0x01
  disable_z();
  disable_e0();
   10cba:	14 9a       	sbi	0x02, 4	; 2
};

// Explicitly set/get/reset the interpretation mode for la10c_value()
void la10c_mode_change(LA10C_MODE mode);
LA10C_MODE la10c_mode_get();
static inline void la10c_reset() { la10c_mode_change(LA10C_UNKNOWN); }
   10cbc:	80 e0       	ldi	r24, 0x00	; 0
   10cbe:	0e 94 04 86 	call	0x10c08	; 0x10c08 <la10c_mode_change(LA10C_MODE)>
    return percent_done;
}

static void print_time_remaining_init()
{
    print_time_remaining_normal = PRINT_TIME_REMAINING_INIT;
   10cc2:	8f ef       	ldi	r24, 0xFF	; 255
   10cc4:	9f ef       	ldi	r25, 0xFF	; 255
   10cc6:	90 93 73 02 	sts	0x0273, r25	; 0x800273 <print_time_remaining_normal+0x1>
   10cca:	80 93 72 02 	sts	0x0272, r24	; 0x800272 <print_time_remaining_normal>
    print_percent_done_normal = PRINT_PERCENT_DONE_INIT;
   10cce:	2f ef       	ldi	r18, 0xFF	; 255
   10cd0:	20 93 6f 02 	sts	0x026F, r18	; 0x80026f <print_percent_done_normal>
    print_time_remaining_silent = PRINT_TIME_REMAINING_INIT;
   10cd4:	90 93 3e 02 	sts	0x023E, r25	; 0x80023e <print_time_remaining_silent+0x1>
   10cd8:	80 93 3d 02 	sts	0x023D, r24	; 0x80023d <print_time_remaining_silent>
    print_percent_done_silent = PRINT_PERCENT_DONE_INIT;
   10cdc:	20 93 3f 02 	sts	0x023F, r18	; 0x80023f <print_percent_done_silent>
    print_time_to_change_normal = PRINT_TIME_REMAINING_INIT;
   10ce0:	90 93 71 02 	sts	0x0271, r25	; 0x800271 <print_time_to_change_normal+0x1>
   10ce4:	80 93 70 02 	sts	0x0270, r24	; 0x800270 <print_time_to_change_normal>
    print_time_to_change_silent = PRINT_TIME_REMAINING_INIT;
   10ce8:	90 93 3c 02 	sts	0x023C, r25	; 0x80023c <print_time_to_change_silent+0x1>
   10cec:	80 93 3b 02 	sts	0x023B, r24	; 0x80023b <print_time_to_change_silent>
  la10c_reset();
#endif

  //in the end of print set estimated time to end of print and extruders used during print to default values for next print
  print_time_remaining_init();
}
   10cf0:	08 95       	ret

00010cf2 <serial_dump_and_reset(dump_crash_reason)>:
        SERIAL_ECHOLNRPGM(emergency_serial_dump? _N("enabled"): _N("disabled"));
    }
}

void __attribute__((noinline)) serial_dump_and_reset(dump_crash_reason reason)
{
   10cf2:	18 2f       	mov	r17, r24
    uint16_t sp;
    uint32_t pc;

    // we're being called from a live state, so shut off interrupts ...
    cli();
   10cf4:	f8 94       	cli

    // sample SP/PC
    sp = SP;
   10cf6:	cd b7       	in	r28, 0x3d	; 61
   10cf8:	de b7       	in	r29, 0x3e	; 62
      "rcall .\n"
      "pop %A0\n"
      "pop %B0\n"
      "pop %C0\n"
      : "=&r" (ret)
  );
   10cfa:	00 d0       	rcall	.+0      	; 0x10cfc <serial_dump_and_reset(dump_crash_reason)+0xa>
   10cfc:	cf 90       	pop	r12
   10cfe:	df 90       	pop	r13
   10d00:	ef 90       	pop	r14
   10d02:	88 e1       	ldi	r24, 0x18	; 24
   10d04:	99 e2       	ldi	r25, 0x29	; 41
   10d06:	0f b6       	in	r0, 0x3f	; 63
   10d08:	f8 94       	cli
   10d0a:	a8 95       	wdr
   10d0c:	80 93 60 00 	sts	0x0060, r24	; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060>
   10d10:	0f be       	out	0x3f, r0	; 63
   10d12:	90 93 60 00 	sts	0x0060, r25	; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060>

    // extend WDT long enough to allow writing the entire stream
    wdt_enable(WDTO_8S);

    // ... and heaters
    WRITE(FAN_PIN, HIGH);
   10d16:	9f b7       	in	r25, 0x3f	; 63
   10d18:	f8 94       	cli
   10d1a:	e2 e0       	ldi	r30, 0x02	; 2
   10d1c:	f1 e0       	ldi	r31, 0x01	; 1
   10d1e:	80 81       	ld	r24, Z
   10d20:	88 60       	ori	r24, 0x08	; 8
   10d22:	80 83       	st	Z, r24
   10d24:	9f bf       	out	0x3f, r25	; 63
    disable_heater();
   10d26:	0f 94 05 11 	call	0x2220a	; 0x2220a <disable_heater()>

    // this function can also be called from within a corrupted state, so not use
    // printf family of functions that use the heap or grow the stack.
    SERIAL_ECHOLNPGM("D23 - emergency serial dump");
   10d2a:	86 e0       	ldi	r24, 0x06	; 6
   10d2c:	94 e7       	ldi	r25, 0x74	; 116
   10d2e:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
    SERIAL_ECHOPGM("error: ");
   10d32:	8e ef       	ldi	r24, 0xFE	; 254
   10d34:	93 e7       	ldi	r25, 0x73	; 115
   10d36:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
  print((long) c, base);
}

void MarlinSerial::print(unsigned char b, int base)
{
  print((unsigned long) b, base);
   10d3a:	61 2f       	mov	r22, r17
   10d3c:	70 e0       	ldi	r23, 0x00	; 0
   10d3e:	90 e0       	ldi	r25, 0x00	; 0
   10d40:	80 e0       	ldi	r24, 0x00	; 0
}

void MarlinSerial::print(unsigned long n, int base)
{
  if (base == 0) write(n);
  else printNumber(n, base);
   10d42:	4a e0       	ldi	r20, 0x0A	; 10
   10d44:	0e 94 c5 79 	call	0xf38a	; 0xf38a <MarlinSerial::printNumber(unsigned long, unsigned char)>
    MYSERIAL.print((uint8_t)reason, DEC);
    SERIAL_ECHOPGM(" 0x");
   10d48:	8a ef       	ldi	r24, 0xFA	; 250
   10d4a:	93 e7       	ldi	r25, 0x73	; 115
   10d4c:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    // we're being called from a live state, so shut off interrupts ...
    cli();

    // sample SP/PC
    sp = SP;
    pc = GETPC();
   10d50:	8e 2d       	mov	r24, r14
   10d52:	b6 01       	movw	r22, r12
   10d54:	90 e0       	ldi	r25, 0x00	; 0
   10d56:	40 e1       	ldi	r20, 0x10	; 16
   10d58:	0e 94 c5 79 	call	0xf38a	; 0xf38a <MarlinSerial::printNumber(unsigned long, unsigned char)>
    SERIAL_ECHOLNPGM("D23 - emergency serial dump");
    SERIAL_ECHOPGM("error: ");
    MYSERIAL.print((uint8_t)reason, DEC);
    SERIAL_ECHOPGM(" 0x");
    MYSERIAL.print(pc, HEX);
    SERIAL_ECHOPGM(" 0x");
   10d5c:	86 ef       	ldi	r24, 0xF6	; 246
   10d5e:	93 e7       	ldi	r25, 0x73	; 115
   10d60:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
  print((long) n, base);
}

void MarlinSerial::print(unsigned int n, int base)
{
  print((unsigned long) n, base);
   10d64:	be 01       	movw	r22, r28
   10d66:	90 e0       	ldi	r25, 0x00	; 0
   10d68:	80 e0       	ldi	r24, 0x00	; 0
}

void MarlinSerial::print(unsigned long n, int base)
{
  if (base == 0) write(n);
  else printNumber(n, base);
   10d6a:	40 e1       	ldi	r20, 0x10	; 16
   10d6c:	0e 94 c5 79 	call	0xf38a	; 0xf38a <MarlinSerial::printNumber(unsigned long, unsigned char)>
}

void MarlinSerial::println(unsigned int n, int base)
{
  print(n, base);
  println();
   10d70:	0e 94 bc 7a 	call	0xf578	; 0xf578 <MarlinSerial::println()>
    MYSERIAL.println(sp, HEX);

    print_mem(0, RAMEND+1, dcode_mem_t::sram);
   10d74:	40 e0       	ldi	r20, 0x00	; 0
   10d76:	60 e0       	ldi	r22, 0x00	; 0
   10d78:	72 e2       	ldi	r23, 0x22	; 34
   10d7a:	90 e0       	ldi	r25, 0x00	; 0
   10d7c:	80 e0       	ldi	r24, 0x00	; 0
   10d7e:	0f 94 d2 78 	call	0x2f1a4	; 0x2f1a4 <print_mem(unsigned int, unsigned int, dcode_mem_t, unsigned char) [clone .constprop.143]>
    SERIAL_ECHOLNRPGM(MSG_OK);
   10d82:	80 ef       	ldi	r24, 0xF0	; 240
   10d84:	99 e6       	ldi	r25, 0x69	; 105
   10d86:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>

    // reset soon
    softReset();
   10d8a:	0e 94 1f 66 	call	0xcc3e	; 0xcc3e <softReset>

00010d8e <crash_and_burn(dump_crash_reason) [clone .lto_priv.485]>:
#endif //EMERGENCY_HANDLERS
#endif //WATCHDOG
}

static inline void crash_and_burn(dump_crash_reason reason)
{
   10d8e:	c8 2f       	mov	r28, r24
    WRITE(BEEPER, HIGH);
   10d90:	9f b7       	in	r25, 0x3f	; 63
   10d92:	f8 94       	cli
   10d94:	80 91 02 01 	lds	r24, 0x0102	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   10d98:	84 60       	ori	r24, 0x04	; 4
   10d9a:	80 93 02 01 	sts	0x0102, r24	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   10d9e:	9f bf       	out	0x3f, r25	; 63
        if (previous_value != value) {
            eeprom_byte_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_byte(dst, value);
   10da0:	6c 2f       	mov	r22, r28
   10da2:	83 e0       	ldi	r24, 0x03	; 3
   10da4:	9d e0       	ldi	r25, 0x0D	; 13
   10da6:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
    eeprom_update_byte_notify((uint8_t*)EEPROM_FW_CRASH_FLAG, (uint8_t)reason);
#ifdef EMERGENCY_DUMP
    xfdump_full_dump_and_reset(reason);
#elif defined(EMERGENCY_SERIAL_DUMP)
    if(emergency_serial_dump)
   10daa:	80 91 0f 06 	lds	r24, 0x060F	; 0x80060f <emergency_serial_dump>
   10dae:	88 23       	and	r24, r24
   10db0:	19 f0       	breq	.+6      	; 0x10db8 <crash_and_burn(dump_crash_reason) [clone .lto_priv.485]+0x2a>
        serial_dump_and_reset(reason);
   10db2:	8c 2f       	mov	r24, r28
   10db4:	0e 94 79 86 	call	0x10cf2	; 0x10cf2 <serial_dump_and_reset(dump_crash_reason)>
#endif
    softReset();
   10db8:	0e 94 1f 66 	call	0xcc3e	; 0xcc3e <softReset>

00010dbc <__vector_default>:
    crash_and_burn(dump_crash_reason::watchdog);
}
#endif

ISR(BADISR_vect)
{
   10dbc:	1f 92       	push	r1
   10dbe:	0f 92       	push	r0
   10dc0:	0f b6       	in	r0, 0x3f	; 63
   10dc2:	0f 92       	push	r0
   10dc4:	11 24       	eor	r1, r1
    crash_and_burn(dump_crash_reason::bad_isr);
   10dc6:	83 e0       	ldi	r24, 0x03	; 3
   10dc8:	0e 94 c7 86 	call	0x10d8e	; 0x10d8e <crash_and_burn(dump_crash_reason) [clone .lto_priv.485]>

00010dcc <__vector_12>:
}

#ifdef EMERGENCY_HANDLERS
#ifdef WATCHDOG
ISR(WDT_vect)
{
   10dcc:	1f 92       	push	r1
   10dce:	0f 92       	push	r0
   10dd0:	0f b6       	in	r0, 0x3f	; 63
   10dd2:	0f 92       	push	r0
   10dd4:	11 24       	eor	r1, r1
    crash_and_burn(dump_crash_reason::watchdog);
   10dd6:	82 e0       	ldi	r24, 0x02	; 2
   10dd8:	0e 94 c7 86 	call	0x10d8e	; 0x10d8e <crash_and_burn(dump_crash_reason) [clone .lto_priv.485]>

00010ddc <Config_ResetDefault()>:
}
#endif

void Config_ResetDefault()
{
    memcpy_P(&cs,&default_conf, sizeof(cs));
   10ddc:	41 ed       	ldi	r20, 0xD1	; 209
   10dde:	50 e0       	ldi	r21, 0x00	; 0
   10de0:	65 e2       	ldi	r22, 0x25	; 37
   10de2:	73 e7       	ldi	r23, 0x73	; 115
   10de4:	87 e6       	ldi	r24, 0x67	; 103
   10de6:	9d e0       	ldi	r25, 0x0D	; 13
   10de8:	0f 94 7a a1 	call	0x342f4	; 0x342f4 <memcpy_P>

  // steps per sq second need to be updated to agree with the units per sq second
    reset_acceleration_rates();
   10dec:	0f 94 a6 3c 	call	0x2794c	; 0x2794c <reset_acceleration_rates()>

#ifdef PIDTEMP
    updatePID();
   10df0:	0f 94 40 17 	call	0x22e80	; 0x22e80 <updatePID()>
#endif//PIDTEMP
#ifdef THERMAL_MODEL
    thermal_model_reset_settings();
#endif

  calculate_extruder_multipliers();
   10df4:	0e 94 4a 64 	call	0xc894	; 0xc894 <calculate_extruder_multipliers()>

SERIAL_ECHO_START;
   10df8:	8e ec       	ldi	r24, 0xCE	; 206
   10dfa:	91 ea       	ldi	r25, 0xA1	; 161
   10dfc:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
SERIAL_ECHOLNPGM("Hardcoded Default Settings Loaded");
   10e00:	83 e0       	ldi	r24, 0x03	; 3
   10e02:	93 e7       	ldi	r25, 0x73	; 115
   10e04:	0c 94 bd 7c 	jmp	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>

00010e08 <Config_RetrieveSettings()>:
//! @brief Read M500 configuration
//! @retval true Succeeded. Stored settings retrieved or default settings retrieved in case EEPROM cs was empty.
//! @retval false Failed. Default settings has been retrieved, because of version mismatch
bool Config_RetrieveSettings()
{
    eeprom_read_block(reinterpret_cast<uint8_t*>(cs.version), reinterpret_cast<uint8_t*>(EEPROM_M500_base->version), sizeof(cs.version));
   10e08:	44 e0       	ldi	r20, 0x04	; 4
   10e0a:	50 e0       	ldi	r21, 0x00	; 0
   10e0c:	64 e1       	ldi	r22, 0x14	; 20
   10e0e:	70 e0       	ldi	r23, 0x00	; 0
   10e10:	87 e6       	ldi	r24, 0x67	; 103
   10e12:	9d e0       	ldi	r25, 0x0D	; 13
   10e14:	0f 94 d0 a3 	call	0x347a0	; 0x347a0 <eeprom_read_block>
    //  SERIAL_ECHOLN("Version: [" << ver << "] Stored version: [" << cs.version << "]");
    if (strncmp_P(cs.version, default_conf.version, sizeof(EEPROM_VERSION)) == 0)  // version number match
   10e18:	43 e0       	ldi	r20, 0x03	; 3
   10e1a:	50 e0       	ldi	r21, 0x00	; 0
   10e1c:	65 e2       	ldi	r22, 0x25	; 37
   10e1e:	73 e7       	ldi	r23, 0x73	; 115
   10e20:	87 e6       	ldi	r24, 0x67	; 103
   10e22:	9d e0       	ldi	r25, 0x0D	; 13
   10e24:	0f 94 bf a1 	call	0x3437e	; 0x3437e <strncmp_P>
   10e28:	89 2b       	or	r24, r25
   10e2a:	09 f0       	breq	.+2      	; 0x10e2e <Config_RetrieveSettings()+0x26>
   10e2c:	5d c0       	rjmp	.+186    	; 0x10ee8 <Config_RetrieveSettings()+0xe0>
    {
        // Initialize arc interpolation settings in eeprom if they are not already
        eeprom_init_default_float(&EEPROM_M500_base->mm_per_arc_segment, pgm_read_float(&default_conf.mm_per_arc_segment));
   10e2e:	e9 ee       	ldi	r30, 0xE9	; 233
   10e30:	f3 e7       	ldi	r31, 0x73	; 115
   10e32:	45 91       	lpm	r20, Z+
   10e34:	55 91       	lpm	r21, Z+
   10e36:	65 91       	lpm	r22, Z+
   10e38:	74 91       	lpm	r23, Z
   10e3a:	88 ed       	ldi	r24, 0xD8	; 216
   10e3c:	90 e0       	ldi	r25, 0x00	; 0
   10e3e:	0e 94 9a 5d 	call	0xbb34	; 0xbb34 <eeprom_init_default_float(float*, float)>
        eeprom_init_default_float(&EEPROM_M500_base->min_mm_per_arc_segment, pgm_read_float(&default_conf.min_mm_per_arc_segment));
   10e42:	ed ee       	ldi	r30, 0xED	; 237
   10e44:	f3 e7       	ldi	r31, 0x73	; 115
   10e46:	45 91       	lpm	r20, Z+
   10e48:	55 91       	lpm	r21, Z+
   10e4a:	65 91       	lpm	r22, Z+
   10e4c:	74 91       	lpm	r23, Z
   10e4e:	8c ed       	ldi	r24, 0xDC	; 220
   10e50:	90 e0       	ldi	r25, 0x00	; 0
   10e52:	0e 94 9a 5d 	call	0xbb34	; 0xbb34 <eeprom_init_default_float(float*, float)>
        eeprom_init_default_byte(&EEPROM_M500_base->n_arc_correction, pgm_read_byte(&default_conf.n_arc_correction));
   10e56:	e1 ef       	ldi	r30, 0xF1	; 241
   10e58:	f3 e7       	ldi	r31, 0x73	; 115
   10e5a:	64 91       	lpm	r22, Z
   10e5c:	80 ee       	ldi	r24, 0xE0	; 224
   10e5e:	90 e0       	ldi	r25, 0x00	; 0
   10e60:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
        eeprom_init_default_word(&EEPROM_M500_base->min_arc_segments, pgm_read_word(&default_conf.min_arc_segments));
   10e64:	e2 ef       	ldi	r30, 0xF2	; 242
   10e66:	f3 e7       	ldi	r31, 0x73	; 115
   10e68:	65 91       	lpm	r22, Z+
   10e6a:	74 91       	lpm	r23, Z
   10e6c:	81 ee       	ldi	r24, 0xE1	; 225
   10e6e:	90 e0       	ldi	r25, 0x00	; 0
   10e70:	0e 94 45 78 	call	0xf08a	; 0xf08a <eeprom_init_default_word(unsigned int*, unsigned int)>
        eeprom_init_default_word(&EEPROM_M500_base->arc_segments_per_sec, pgm_read_word(&default_conf.arc_segments_per_sec));
   10e74:	e4 ef       	ldi	r30, 0xF4	; 244
   10e76:	f3 e7       	ldi	r31, 0x73	; 115
   10e78:	65 91       	lpm	r22, Z+
   10e7a:	74 91       	lpm	r23, Z
   10e7c:	83 ee       	ldi	r24, 0xE3	; 227
   10e7e:	90 e0       	ldi	r25, 0x00	; 0
   10e80:	0e 94 45 78 	call	0xf08a	; 0xf08a <eeprom_init_default_word(unsigned int*, unsigned int)>

        // Initialize the travel_acceleration in eeprom if not already
        eeprom_init_default_float(&EEPROM_M500_base->travel_acceleration, pgm_read_float(&default_conf.travel_acceleration));
   10e84:	e5 ee       	ldi	r30, 0xE5	; 229
   10e86:	f3 e7       	ldi	r31, 0x73	; 115
   10e88:	45 91       	lpm	r20, Z+
   10e8a:	55 91       	lpm	r21, Z+
   10e8c:	65 91       	lpm	r22, Z+
   10e8e:	74 91       	lpm	r23, Z
   10e90:	84 ed       	ldi	r24, 0xD4	; 212
   10e92:	90 e0       	ldi	r25, 0x00	; 0
   10e94:	0e 94 9a 5d 	call	0xbb34	; 0xbb34 <eeprom_init_default_float(float*, float)>

        // Initialize the max_feedrate_silent and max_acceleration_mm_per_s2_silent in eeprom if not already
        eeprom_init_default_block(&EEPROM_M500_base->max_feedrate_silent, sizeof(EEPROM_M500_base->max_feedrate_silent), default_conf.max_feedrate_silent);
   10e98:	41 ec       	ldi	r20, 0xC1	; 193
   10e9a:	53 e7       	ldi	r21, 0x73	; 115
   10e9c:	60 e1       	ldi	r22, 0x10	; 16
   10e9e:	70 e0       	ldi	r23, 0x00	; 0
   10ea0:	80 eb       	ldi	r24, 0xB0	; 176
   10ea2:	90 e0       	ldi	r25, 0x00	; 0
   10ea4:	0e 94 26 78 	call	0xf04c	; 0xf04c <eeprom_init_default_block(void*, unsigned int, void const*)>
        eeprom_init_default_block(&EEPROM_M500_base->max_acceleration_mm_per_s2_silent, sizeof(EEPROM_M500_base->max_acceleration_mm_per_s2_silent), default_conf.max_acceleration_mm_per_s2_silent);
   10ea8:	41 ed       	ldi	r20, 0xD1	; 209
   10eaa:	53 e7       	ldi	r21, 0x73	; 115
   10eac:	60 e1       	ldi	r22, 0x10	; 16
   10eae:	70 e0       	ldi	r23, 0x00	; 0
   10eb0:	80 ec       	ldi	r24, 0xC0	; 192
   10eb2:	90 e0       	ldi	r25, 0x00	; 0
   10eb4:	0e 94 26 78 	call	0xf04c	; 0xf04c <eeprom_init_default_block(void*, unsigned int, void const*)>
#ifdef TMC2130
        eeprom_init_default_block(&EEPROM_M500_base->axis_ustep_resolution, sizeof(EEPROM_M500_base->axis_ustep_resolution), default_conf.axis_ustep_resolution);
#endif // TMC2130

        // load the CS to RAM
        eeprom_read_block(reinterpret_cast<uint8_t*>(&cs), reinterpret_cast<uint8_t*>(EEPROM_M500_base), sizeof(cs));
   10eb8:	41 ed       	ldi	r20, 0xD1	; 209
   10eba:	50 e0       	ldi	r21, 0x00	; 0
   10ebc:	64 e1       	ldi	r22, 0x14	; 20
   10ebe:	70 e0       	ldi	r23, 0x00	; 0
   10ec0:	87 e6       	ldi	r24, 0x67	; 103
   10ec2:	9d e0       	ldi	r25, 0x0D	; 13
   10ec4:	0f 94 d0 a3 	call	0x347a0	; 0x347a0 <eeprom_read_block>
        calculate_extruder_multipliers();
   10ec8:	0e 94 4a 64 	call	0xc894	; 0xc894 <calculate_extruder_multipliers()>
    tmc2130_set_res(Y_AXIS, cs.axis_ustep_resolution[Y_AXIS]);
    tmc2130_set_res(Z_AXIS, cs.axis_ustep_resolution[Z_AXIS]);
    tmc2130_set_res(E_AXIS, cs.axis_ustep_resolution[E_AXIS]);
#endif //TMC2130

		reset_acceleration_rates();
   10ecc:	0f 94 a6 3c 	call	0x2794c	; 0x2794c <reset_acceleration_rates()>

    // Call updatePID (similar to when we have processed M301)
    updatePID();
   10ed0:	0f 94 40 17 	call	0x22e80	; 0x22e80 <updatePID()>
#ifdef THERMAL_MODEL
    thermal_model_load_settings();
#endif

        SERIAL_ECHO_START;
   10ed4:	8e ec       	ldi	r24, 0xCE	; 206
   10ed6:	91 ea       	ldi	r25, 0xA1	; 161
   10ed8:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        SERIAL_ECHOLNPGM("Stored settings retrieved");
   10edc:	89 ee       	ldi	r24, 0xE9	; 233
   10ede:	92 e7       	ldi	r25, 0x72	; 114
   10ee0:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   10ee4:	81 e0       	ldi	r24, 0x01	; 1
   10ee6:	08 95       	ret
    }
    else
    {
        Config_ResetDefault();
   10ee8:	0e 94 ee 86 	call	0x10ddc	; 0x10ddc <Config_ResetDefault()>
        //Return false to inform user that eeprom version was changed and firmware is using default hardcoded settings now.
        //In case that storing to eeprom was not used yet, do not inform user that hardcoded settings are used.
        if (eeprom_is_initialized_block(EEPROM_M500_base->version, sizeof(EEPROM_M500_base->version))) {
   10eec:	64 e0       	ldi	r22, 0x04	; 4
   10eee:	70 e0       	ldi	r23, 0x00	; 0
   10ef0:	84 e1       	ldi	r24, 0x14	; 20
   10ef2:	90 e0       	ldi	r25, 0x00	; 0
   10ef4:	0e 94 da 55 	call	0xabb4	; 0xabb4 <eeprom_is_initialized_block(void const*, unsigned int)>
   10ef8:	91 e0       	ldi	r25, 0x01	; 1
   10efa:	89 27       	eor	r24, r25
            return false;
        }
    }
    return true;
}
   10efc:	08 95       	ret

00010efe <Config_StoreSettings()>:
};


void Config_StoreSettings()
{
  strcpy_P(cs.version, default_conf.version);
   10efe:	65 e2       	ldi	r22, 0x25	; 37
   10f00:	73 e7       	ldi	r23, 0x73	; 115
   10f02:	87 e6       	ldi	r24, 0x67	; 103
   10f04:	9d e0       	ldi	r25, 0x0D	; 13
   10f06:	0f 94 97 a1 	call	0x3432e	; 0x3432e <strcpy_P>
#endif //DEBUG_EEPROM_CHANGES
}

#ifndef DEBUG_EEPROM_CHANGES
void eeprom_update_block_notify(const void *__src, void *__dst, size_t __n){
    eeprom_update_block(__src, __dst, __n);
   10f0a:	41 ed       	ldi	r20, 0xD1	; 209
   10f0c:	50 e0       	ldi	r21, 0x00	; 0
   10f0e:	64 e1       	ldi	r22, 0x14	; 20
   10f10:	70 e0       	ldi	r23, 0x00	; 0
   10f12:	87 e6       	ldi	r24, 0x67	; 103
   10f14:	9d e0       	ldi	r25, 0x0D	; 13
   10f16:	0f 94 f4 a3 	call	0x347e8	; 0x347e8 <eeprom_update_block>
  eeprom_update_block_notify(reinterpret_cast<uint8_t*>(&cs), reinterpret_cast<uint8_t*>(EEPROM_M500_base), sizeof(cs));
#ifdef THERMAL_MODEL
  thermal_model_save_settings();
#endif

  SERIAL_ECHO_START;
   10f1a:	8e ec       	ldi	r24, 0xCE	; 206
   10f1c:	91 ea       	ldi	r25, 0xA1	; 161
   10f1e:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
  SERIAL_ECHOLNPGM("Settings Stored");
   10f22:	89 ed       	ldi	r24, 0xD9	; 217
   10f24:	92 e7       	ldi	r25, 0x72	; 114
   10f26:	0c 94 bd 7c 	jmp	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>

00010f2a <MarlinSerial::write(char const*)>:
    static void printFloat(double, uint8_t);


  public:

    static /*FORCE_INLINE*/ void write(const char *str)
   10f2a:	cf 93       	push	r28
   10f2c:	df 93       	push	r29
   10f2e:	ec 01       	movw	r28, r24
    {
      while (*str)
   10f30:	89 91       	ld	r24, Y+
   10f32:	88 23       	and	r24, r24
   10f34:	19 f0       	breq	.+6      	; 0x10f3c <MarlinSerial::write(char const*)+0x12>
        write(*str++);
   10f36:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
   10f3a:	fa cf       	rjmp	.-12     	; 0x10f30 <MarlinSerial::write(char const*)+0x6>
    }
   10f3c:	df 91       	pop	r29
   10f3e:	cf 91       	pop	r28
   10f40:	08 95       	ret

00010f42 <MarlinSerial::println(char const*)>:
      }
    }*/

    static FORCE_INLINE void print(const char *str)
    {
      write(str);
   10f42:	0e 94 95 87 	call	0x10f2a	; 0x10f2a <MarlinSerial::write(char const*)>
}*/

void MarlinSerial::println(const char c[])
{
  print(c);
  println();
   10f46:	0c 94 bc 7a 	jmp	0xf578	; 0xf578 <MarlinSerial::println()>

00010f4a <get_command()>:
{
    cmdbuffer_front_already_processed = true;
}

void get_command()
{
   10f4a:	2f 92       	push	r2
   10f4c:	3f 92       	push	r3
   10f4e:	4f 92       	push	r4
   10f50:	5f 92       	push	r5
   10f52:	6f 92       	push	r6
   10f54:	7f 92       	push	r7
   10f56:	8f 92       	push	r8
   10f58:	9f 92       	push	r9
   10f5a:	af 92       	push	r10
   10f5c:	bf 92       	push	r11
   10f5e:	cf 92       	push	r12
   10f60:	df 92       	push	r13
   10f62:	ef 92       	push	r14
   10f64:	ff 92       	push	r15
   10f66:	0f 93       	push	r16
   10f68:	1f 93       	push	r17
   10f6a:	cf 93       	push	r28
   10f6c:	df 93       	push	r29
   10f6e:	cd b7       	in	r28, 0x3d	; 61
   10f70:	de b7       	in	r29, 0x3e	; 62
   10f72:	a0 97       	sbiw	r28, 0x20	; 32
   10f74:	0f b6       	in	r0, 0x3f	; 63
   10f76:	f8 94       	cli
   10f78:	de bf       	out	0x3e, r29	; 62
   10f7a:	0f be       	out	0x3f, r0	; 63
   10f7c:	cd bf       	out	0x3d, r28	; 61
    // Test and reserve space for the new command string.
    if (! cmdqueue_could_enqueue_back(MAX_CMD_SIZE - 1))
   10f7e:	8f e5       	ldi	r24, 0x5F	; 95
   10f80:	90 e0       	ldi	r25, 0x00	; 0
   10f82:	0e 94 64 55 	call	0xaac8	; 0xaac8 <cmdqueue_could_enqueue_back(unsigned int)>
   10f86:	88 23       	and	r24, r24
   10f88:	09 f4       	brne	.+2      	; 0x10f8c <get_command()+0x42>
   10f8a:	a1 c0       	rjmp	.+322    	; 0x110ce <get_command()+0x184>
      return;

	if (MYSERIAL.available() == RX_BUFFER_SIZE - 1) { //compare number of chars buffered in rx buffer with rx buffer size
   10f8c:	0e 94 fc 54 	call	0xa9f8	; 0xa9f8 <MarlinSerial::available()>
   10f90:	8f 37       	cpi	r24, 0x7F	; 127
   10f92:	91 05       	cpc	r25, r1
   10f94:	61 f4       	brne	.+24     	; 0x10fae <get_command()+0x64>
  // don't reverse this or there may be problems if the RX interrupt
  // occurs after reading the value of rx_buffer_head but before writing
  // the value to rx_buffer_tail; the previous value of rx_buffer_head
  // may be written to rx_buffer_tail, making it appear as if the buffer
  // were full, not empty.
  rx_buffer.head = rx_buffer.tail;
   10f96:	80 91 44 05 	lds	r24, 0x0544	; 0x800544 <rx_buffer+0x82>
   10f9a:	90 91 45 05 	lds	r25, 0x0545	; 0x800545 <rx_buffer+0x83>
   10f9e:	90 93 43 05 	sts	0x0543, r25	; 0x800543 <rx_buffer+0x81>
   10fa2:	80 93 42 05 	sts	0x0542, r24	; 0x800542 <rx_buffer+0x80>
		MYSERIAL.flush();
		SERIAL_ECHOLNPGM("Full RX Buffer");   //if buffer was full, there is danger that reading of last gcode will not be completed
   10fa6:	8a ec       	ldi	r24, 0xCA	; 202
   10fa8:	92 e7       	ldi	r25, 0x72	; 114
   10faa:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   10fae:	6e 01       	movw	r12, r28
   10fb0:	4f e1       	ldi	r20, 0x1F	; 31
   10fb2:	c4 0e       	add	r12, r20
   10fb4:	d1 1c       	adc	r13, r1
        }

        // Command is complete: store the current line into buffer, move to the next line.

		// Store type of entry
        cmdbuffer[bufindw] = gcode_N >= 0 ? CMDBUFFER_CURRENT_TYPE_USB_WITH_LINENR : CMDBUFFER_CURRENT_TYPE_USB;
   10fb6:	99 24       	eor	r9, r9
   10fb8:	93 94       	inc	r9
		MYSERIAL.flush();
		SERIAL_ECHOLNPGM("Full RX Buffer");   //if buffer was full, there is danger that reading of last gcode will not be completed
	}

  // start of serial line processing loop
  while (((MYSERIAL.available() > 0 && !saved_printing) || (MYSERIAL.available() > 0 && printingIsPaused())) && !cmdqueue_serial_disabled) {  //is print is saved (crash detection or filament detection), dont process data from serial line
   10fba:	0e 94 fc 54 	call	0xa9f8	; 0xa9f8 <MarlinSerial::available()>
   10fbe:	18 16       	cp	r1, r24
   10fc0:	19 06       	cpc	r1, r25
   10fc2:	0c f0       	brlt	.+2      	; 0x10fc6 <get_command()+0x7c>
   10fc4:	78 c0       	rjmp	.+240    	; 0x110b6 <get_command()+0x16c>
   10fc6:	80 91 73 12 	lds	r24, 0x1273	; 0x801273 <saved_printing>
   10fca:	88 23       	and	r24, r24
   10fcc:	29 f0       	breq	.+10     	; 0x10fd8 <get_command()+0x8e>
   10fce:	0e 94 35 66 	call	0xcc6a	; 0xcc6a <printingIsPaused()>
   10fd2:	88 23       	and	r24, r24
   10fd4:	09 f4       	brne	.+2      	; 0x10fd8 <get_command()+0x8e>
   10fd6:	6f c0       	rjmp	.+222    	; 0x110b6 <get_command()+0x16c>
   10fd8:	80 91 93 03 	lds	r24, 0x0393	; 0x800393 <cmdqueue_serial_disabled>
   10fdc:	81 11       	cpse	r24, r1
   10fde:	6b c0       	rjmp	.+214    	; 0x110b6 <get_command()+0x16c>
}

int MarlinSerial::read(void)
{
  // if the head isn't ahead of the tail, we don't have any characters
  if (rx_buffer.head == rx_buffer.tail) {
   10fe0:	20 91 44 05 	lds	r18, 0x0544	; 0x800544 <rx_buffer+0x82>
   10fe4:	30 91 45 05 	lds	r19, 0x0545	; 0x800545 <rx_buffer+0x83>
   10fe8:	80 91 42 05 	lds	r24, 0x0542	; 0x800542 <rx_buffer+0x80>
   10fec:	90 91 43 05 	lds	r25, 0x0543	; 0x800543 <rx_buffer+0x81>
   10ff0:	82 17       	cp	r24, r18
   10ff2:	93 07       	cpc	r25, r19
   10ff4:	11 f3       	breq	.-60     	; 0x10fba <get_command()+0x70>
    return -1;
  } else {
    unsigned char c = rx_buffer.buffer[rx_buffer.tail];
   10ff6:	f9 01       	movw	r30, r18
   10ff8:	ee 53       	subi	r30, 0x3E	; 62
   10ffa:	fb 4f       	sbci	r31, 0xFB	; 251
   10ffc:	80 81       	ld	r24, Z
    rx_buffer.tail = (unsigned int)(rx_buffer.tail + 1) % RX_BUFFER_SIZE;
   10ffe:	2f 5f       	subi	r18, 0xFF	; 255
   11000:	3f 4f       	sbci	r19, 0xFF	; 255
   11002:	2f 77       	andi	r18, 0x7F	; 127
   11004:	33 27       	eor	r19, r19
   11006:	30 93 45 05 	sts	0x0545, r19	; 0x800545 <rx_buffer+0x83>
   1100a:	20 93 44 05 	sts	0x0544, r18	; 0x800544 <rx_buffer+0x82>
//==========================================================================
void mp_handle_rx_char(const uint8_t c) {

    // Check for commit complete
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    if (c == (uint8_t)(MeatPack_CommandByte)) {
   1100e:	8f 3f       	cpi	r24, 0xFF	; 255
   11010:	09 f0       	breq	.+2      	; 0x11014 <get_command()+0xca>
   11012:	79 c0       	rjmp	.+242    	; 0x11106 <get_command()+0x1bc>
        if (mp_cmd_count > 0) {
   11014:	80 91 19 03 	lds	r24, 0x0319	; 0x800319 <mp_cmd_count>
   11018:	88 23       	and	r24, r24
   1101a:	09 f4       	brne	.+2      	; 0x1101e <get_command()+0xd4>
   1101c:	71 c0       	rjmp	.+226    	; 0x11100 <get_command()+0x1b6>
            mp_cmd_active = 1;
   1101e:	90 92 18 03 	sts	0x0318, r9	; 0x800318 <mp_cmd_active>
            mp_cmd_count = 0;
   11022:	10 92 19 03 	sts	0x0319, r1	; 0x800319 <mp_cmd_count>
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      const int rec = MYSERIAL.read();
      if (rec < 0) continue;

      mp_handle_rx_char((uint8_t)rec);
      char c_res[2] = {0, 0};
   11026:	1f 8e       	std	Y+31, r1	; 0x1f
   11028:	18 a2       	std	Y+32, r1	; 0x20
    mp_handle_rx_char_inner(c);
}

//==========================================================================
uint8_t mp_get_result_char(char* const __restrict out) {
    if (mp_char_out_count > 0) {
   1102a:	80 90 1c 03 	lds	r8, 0x031C	; 0x80031c <mp_char_out_count>
   1102e:	88 20       	and	r8, r8
   11030:	21 f2       	breq	.-120    	; 0x10fba <get_command()+0x70>
        const uint8_t res = mp_char_out_count;
        for (uint8_t i = 0; i < mp_char_out_count; ++i)
            out[i] = (char)mp_char_out_buf[i];
   11032:	80 91 1a 03 	lds	r24, 0x031A	; 0x80031a <mp_char_out_buf>
   11036:	8f 8f       	std	Y+31, r24	; 0x1f

//==========================================================================
uint8_t mp_get_result_char(char* const __restrict out) {
    if (mp_char_out_count > 0) {
        const uint8_t res = mp_char_out_count;
        for (uint8_t i = 0; i < mp_char_out_count; ++i)
   11038:	f1 e0       	ldi	r31, 0x01	; 1
   1103a:	f8 15       	cp	r31, r8
   1103c:	18 f4       	brcc	.+6      	; 0x11044 <get_command()+0xfa>
            out[i] = (char)mp_char_out_buf[i];
   1103e:	80 91 1b 03 	lds	r24, 0x031B	; 0x80031b <mp_char_out_buf+0x1>
   11042:	88 a3       	std	Y+32, r24	; 0x20
        mp_char_out_count = 0;
   11044:	10 92 1c 03 	sts	0x031C, r1	; 0x80031c <mp_char_out_count>
   11048:	16 01       	movw	r2, r12
      const uint8_t char_count = mp_get_result_char(c_res);
      // Note -- Paired bracket in preproc switch below
      for (uint8_t i = 0; i < char_count; ++i) { char serial_char = c_res[i];
   1104a:	82 2d       	mov	r24, r2
   1104c:	8c 19       	sub	r24, r12
   1104e:	88 15       	cp	r24, r8
   11050:	08 f0       	brcs	.+2      	; 0x11054 <get_command()+0x10a>
   11052:	b3 cf       	rjmp	.-154    	; 0x10fba <get_command()+0x70>
   11054:	f1 01       	movw	r30, r2
   11056:	11 91       	ld	r17, Z+
   11058:	1f 01       	movw	r2, r30
#else
    char serial_char = MYSERIAL.read();
#endif

    serialTimeoutTimer.start();
   1105a:	8f e1       	ldi	r24, 0x1F	; 31
   1105c:	93 e0       	ldi	r25, 0x03	; 3
   1105e:	0f 94 4e 0e 	call	0x21c9c	; 0x21c9c <Timer<unsigned short>::start()>

    if (serial_char < 0)
   11062:	17 fd       	sbrc	r17, 7
   11064:	f2 cf       	rjmp	.-28     	; 0x1104a <get_command()+0x100>
   11066:	80 91 47 10 	lds	r24, 0x1047	; 0x801047 <serial_count>
   1106a:	90 91 48 10 	lds	r25, 0x1048	; 0x801048 <serial_count+0x1>
        // Ignore extended ASCII characters. These characters have no meaning in the G-code apart from the file names
        // and Marlin does not support such file names anyway.
        // Serial characters with a highest bit set to 1 are generated when the USB cable is unplugged, leading
        // to a hang-up of the print process from an SD card.
        continue;
    if(serial_char == '\n' ||
   1106e:	1a 30       	cpi	r17, 0x0A	; 10
   11070:	09 f4       	brne	.+2      	; 0x11074 <get_command()+0x12a>
   11072:	4b c1       	rjmp	.+662    	; 0x1130a <get_command()+0x3c0>
   11074:	1d 30       	cpi	r17, 0x0D	; 13
   11076:	09 f4       	brne	.+2      	; 0x1107a <get_command()+0x130>
   11078:	48 c1       	rjmp	.+656    	; 0x1130a <get_command()+0x3c0>
       serial_char == '\r' ||
   1107a:	8f 35       	cpi	r24, 0x5F	; 95
   1107c:	91 05       	cpc	r25, r1
   1107e:	0c f0       	brlt	.+2      	; 0x11082 <get_command()+0x138>
   11080:	49 c1       	rjmp	.+658    	; 0x11314 <get_command()+0x3ca>
      if (MYSERIAL.available() == 0 || ! cmdqueue_could_enqueue_back(MAX_CMD_SIZE-1))
          return;
    } // end of "end of line" processing
    else {
      // Not an "end of line" symbol. Store the new character into a buffer.
      if(serial_char == ';') comment_mode = true;
   11082:	1b 33       	cpi	r17, 0x3B	; 59
   11084:	11 f4       	brne	.+4      	; 0x1108a <get_command()+0x140>
   11086:	90 92 1e 03 	sts	0x031E, r9	; 0x80031e <comment_mode>
      if(!comment_mode) cmdbuffer[bufindw+CMDHDRSIZE+serial_count++] = serial_char;
   1108a:	20 91 1e 03 	lds	r18, 0x031E	; 0x80031e <comment_mode>
   1108e:	21 11       	cpse	r18, r1
   11090:	dc cf       	rjmp	.-72     	; 0x1104a <get_command()+0x100>
   11092:	9c 01       	movw	r18, r24
   11094:	2f 5f       	subi	r18, 0xFF	; 255
   11096:	3f 4f       	sbci	r19, 0xFF	; 255
   11098:	30 93 48 10 	sts	0x1048, r19	; 0x801048 <serial_count+0x1>
   1109c:	20 93 47 10 	sts	0x1047, r18	; 0x801047 <serial_count>
   110a0:	20 91 49 10 	lds	r18, 0x1049	; 0x801049 <_ZL7bufindw.lto_priv.514>
   110a4:	30 91 4a 10 	lds	r19, 0x104A	; 0x80104a <_ZL7bufindw.lto_priv.514+0x1>
   110a8:	25 5b       	subi	r18, 0xB5	; 181
   110aa:	3f 4e       	sbci	r19, 0xEF	; 239
   110ac:	82 0f       	add	r24, r18
   110ae:	93 1f       	adc	r25, r19
   110b0:	fc 01       	movw	r30, r24
   110b2:	13 83       	std	Z+3, r17	; 0x03
   110b4:	ca cf       	rjmp	.-108    	; 0x1104a <get_command()+0x100>
    #ifdef ENABLE_MEATPACK
     }
    #endif
  } // end of serial line processing loop

    if (serial_count > 0 && serialTimeoutTimer.expired(farm_mode ? 800 : 2000)) {
   110b6:	80 91 47 10 	lds	r24, 0x1047	; 0x801047 <serial_count>
   110ba:	90 91 48 10 	lds	r25, 0x1048	; 0x801048 <serial_count+0x1>
   110be:	18 16       	cp	r1, r24
   110c0:	19 06       	cpc	r1, r25
   110c2:	0c f4       	brge	.+2      	; 0x110c6 <get_command()+0x17c>
   110c4:	51 c2       	rjmp	.+1186   	; 0x11568 <get_command()+0x61e>
        SERIAL_ECHOLNPGM("RX timeout");
        return;
    }

  #ifdef SDSUPPORT
  if(!card.sdprinting || !card.isFileOpen() || serial_count!=0){
   110c6:	80 91 d7 13 	lds	r24, 0x13D7	; 0x8013d7 <card+0x2>
   110ca:	81 11       	cpse	r24, r1
   110cc:	67 c2       	rjmp	.+1230   	; 0x1159c <get_command()+0x652>
            prusa_statistics(6);
      }
  }

  #endif //SDSUPPORT
}
   110ce:	a0 96       	adiw	r28, 0x20	; 32
   110d0:	0f b6       	in	r0, 0x3f	; 63
   110d2:	f8 94       	cli
   110d4:	de bf       	out	0x3e, r29	; 62
   110d6:	0f be       	out	0x3f, r0	; 63
   110d8:	cd bf       	out	0x3d, r28	; 61
   110da:	df 91       	pop	r29
   110dc:	cf 91       	pop	r28
   110de:	1f 91       	pop	r17
   110e0:	0f 91       	pop	r16
   110e2:	ff 90       	pop	r15
   110e4:	ef 90       	pop	r14
   110e6:	df 90       	pop	r13
   110e8:	cf 90       	pop	r12
   110ea:	bf 90       	pop	r11
   110ec:	af 90       	pop	r10
   110ee:	9f 90       	pop	r9
   110f0:	8f 90       	pop	r8
   110f2:	7f 90       	pop	r7
   110f4:	6f 90       	pop	r6
   110f6:	5f 90       	pop	r5
   110f8:	4f 90       	pop	r4
   110fa:	3f 90       	pop	r3
   110fc:	2f 90       	pop	r2
   110fe:	08 95       	ret
        if (mp_cmd_count > 0) {
            mp_cmd_active = 1;
            mp_cmd_count = 0;
        }
        else
            ++mp_cmd_count;
   11100:	90 92 19 03 	sts	0x0319, r9	; 0x800319 <mp_cmd_count>
   11104:	90 cf       	rjmp	.-224    	; 0x11026 <get_command()+0xdc>
        return;
    }

    if (mp_cmd_active > 0) {
   11106:	90 91 18 03 	lds	r25, 0x0318	; 0x800318 <mp_cmd_active>
   1110a:	99 23       	and	r25, r25
   1110c:	09 f4       	brne	.+2      	; 0x11110 <get_command()+0x1c6>
   1110e:	58 c0       	rjmp	.+176    	; 0x111c0 <get_command()+0x276>

}

//==========================================================================
void FORCE_INLINE mp_handle_cmd(const MeatPack_Command c) {
    switch (c) {
   11110:	89 3f       	cpi	r24, 0xF9	; 249
   11112:	e9 f1       	breq	.+122    	; 0x1118e <get_command()+0x244>
   11114:	70 f5       	brcc	.+92     	; 0x11172 <get_command()+0x228>
   11116:	86 3f       	cpi	r24, 0xF6	; 246
   11118:	09 f4       	brne	.+2      	; 0x1111c <get_command()+0x1d2>
   1111a:	4a c0       	rjmp	.+148    	; 0x111b0 <get_command()+0x266>
   1111c:	87 3f       	cpi	r24, 0xF7	; 247
   1111e:	09 f4       	brne	.+2      	; 0x11122 <get_command()+0x1d8>
   11120:	43 c0       	rjmp	.+134    	; 0x111a8 <get_command()+0x25e>
        mp_handle_output_char(c);
}

//==========================================================================
void FORCE_INLINE mp_echo_config_state() {
    SERIAL_ECHOPGM(" [MP] "); // Add space at idx 0 just in case first character is dropped due to timing/sync issues.
   11122:	85 e9       	ldi	r24, 0x95	; 149
   11124:	92 e7       	ldi	r25, 0x72	; 114
   11126:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>

    // NOTE: if any configuration vars are added below, the outgoing sync text for host plugin
    // should not contain the "PV' substring, as this is used to indicate protocol version
    SERIAL_ECHOPGM(MeatPack_ProtocolVersion);
   1112a:	80 e9       	ldi	r24, 0x90	; 144
   1112c:	92 e7       	ldi	r25, 0x72	; 114
   1112e:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>

    // Echo current state
    if (mp_config & MPConfig_Active)
   11132:	10 91 17 03 	lds	r17, 0x0317	; 0x800317 <mp_config>
        SERIAL_ECHOPGM(" ON");
   11136:	8c e8       	ldi	r24, 0x8C	; 140
   11138:	92 e7       	ldi	r25, 0x72	; 114
    // NOTE: if any configuration vars are added below, the outgoing sync text for host plugin
    // should not contain the "PV' substring, as this is used to indicate protocol version
    SERIAL_ECHOPGM(MeatPack_ProtocolVersion);

    // Echo current state
    if (mp_config & MPConfig_Active)
   1113a:	10 fd       	sbrc	r17, 0
   1113c:	02 c0       	rjmp	.+4      	; 0x11142 <get_command()+0x1f8>
        SERIAL_ECHOPGM(" ON");
    else
        SERIAL_ECHOPGM(" OFF");
   1113e:	87 e8       	ldi	r24, 0x87	; 135
   11140:	92 e7       	ldi	r25, 0x72	; 114
   11142:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>

    if (mp_config & MPConfig_NoSpaces)
   11146:	01 2f       	mov	r16, r17
   11148:	02 70       	andi	r16, 0x02	; 2
        SERIAL_ECHOPGM(" NSP"); // [N]o [SP]aces
   1114a:	82 e8       	ldi	r24, 0x82	; 130
   1114c:	92 e7       	ldi	r25, 0x72	; 114
    if (mp_config & MPConfig_Active)
        SERIAL_ECHOPGM(" ON");
    else
        SERIAL_ECHOPGM(" OFF");

    if (mp_config & MPConfig_NoSpaces)
   1114e:	11 fd       	sbrc	r17, 1
   11150:	02 c0       	rjmp	.+4      	; 0x11156 <get_command()+0x20c>
        SERIAL_ECHOPGM(" NSP"); // [N]o [SP]aces
    else
        SERIAL_ECHOPGM(" ESP"); // [E]nabled [SP]aces
   11152:	8d e7       	ldi	r24, 0x7D	; 125
   11154:	92 e7       	ldi	r25, 0x72	; 114
   11156:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>

    SERIAL_ECHOLNPGM("");
   1115a:	8c e7       	ldi	r24, 0x7C	; 124
   1115c:	92 e7       	ldi	r25, 0x72	; 114
   1115e:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>

    // Validate config vars
#ifdef USE_LOOKUP_TABLE
    if (mp_config & MPConfig_NoSpaces)
   11162:	00 23       	and	r16, r16
   11164:	49 f1       	breq	.+82     	; 0x111b8 <get_command()+0x26e>
        MeatPackLookupTbl[MeatPack_SpaceCharIdx] = (uint8_t)(MeatPack_SpaceCharReplace);
   11166:	85 e4       	ldi	r24, 0x45	; 69
   11168:	80 93 0b 02 	sts	0x020B, r24	; 0x80020b <__DATA_REGION_ORIGIN__+0xb>
        return;
    }

    if (mp_cmd_active > 0) {
        mp_handle_cmd((MeatPack_Command)c);
        mp_cmd_active = 0;
   1116c:	10 92 18 03 	sts	0x0318, r1	; 0x800318 <mp_cmd_active>
   11170:	5a cf       	rjmp	.-332    	; 0x11026 <get_command()+0xdc>

}

//==========================================================================
void FORCE_INLINE mp_handle_cmd(const MeatPack_Command c) {
    switch (c) {
   11172:	8a 3f       	cpi	r24, 0xFA	; 250
   11174:	41 f0       	breq	.+16     	; 0x11186 <get_command()+0x23c>
   11176:	8b 3f       	cpi	r24, 0xFB	; 251
   11178:	a1 f6       	brne	.-88     	; 0x11122 <get_command()+0x1d8>
    case MPCommand_EnablePacking: {
        mp_config |= MPConfig_Active;
   1117a:	80 91 17 03 	lds	r24, 0x0317	; 0x800317 <mp_config>
   1117e:	81 60       	ori	r24, 0x01	; 1
#ifdef MP_DEBUG
        SERIAL_ECHOLNPGM("[MPDBG] ENABL NSP");
#endif
    } break;
    case MPCommand_DisableNoSpaces: {
        mp_config &= ~(MPConfig_NoSpaces);
   11180:	80 93 17 03 	sts	0x0317, r24	; 0x800317 <mp_config>
   11184:	ce cf       	rjmp	.-100    	; 0x11122 <get_command()+0x1d8>
#ifdef MP_DEBUG
        SERIAL_ECHOLNPGM("[MPDBG] ENABL REC");
#endif
    } break;
    case MPCommand_DisablePacking: {
        mp_config &= ~(MPConfig_Active);
   11186:	80 91 17 03 	lds	r24, 0x0317	; 0x800317 <mp_config>
   1118a:	8e 7f       	andi	r24, 0xFE	; 254
   1118c:	f9 cf       	rjmp	.-14     	; 0x11180 <get_command()+0x236>
    return out;
}

//==============================================================================
void FORCE_INLINE mp_reset_state() {
    mp_char_out_count = 0;
   1118e:	10 92 1c 03 	sts	0x031C, r1	; 0x80031c <mp_char_out_count>
    mp_cmd_active = MPCommand_None;
   11192:	10 92 18 03 	sts	0x0318, r1	; 0x800318 <mp_cmd_active>
    mp_config = MPConfig_None;
   11196:	10 92 17 03 	sts	0x0317, r1	; 0x800317 <mp_config>
    mp_char_buf = 0;
   1119a:	10 92 16 03 	sts	0x0316, r1	; 0x800316 <mp_char_buf>
    mp_cmd_count = 0;
   1119e:	10 92 19 03 	sts	0x0319, r1	; 0x800319 <mp_cmd_count>
    mp_cmd_active = 0;
    mp_full_char_queue = 0;
   111a2:	10 92 15 03 	sts	0x0315, r1	; 0x800315 <mp_full_char_queue>
   111a6:	bd cf       	rjmp	.-134    	; 0x11122 <get_command()+0x1d8>
#ifdef MP_DEBUG
        SERIAL_ECHOLNPGM("[MPDBG] RESET REC");
#endif
    } break;
    case MPCommand_EnableNoSpaces: {
        mp_config |= MPConfig_NoSpaces;
   111a8:	80 91 17 03 	lds	r24, 0x0317	; 0x800317 <mp_config>
   111ac:	82 60       	ori	r24, 0x02	; 2
   111ae:	e8 cf       	rjmp	.-48     	; 0x11180 <get_command()+0x236>
#ifdef MP_DEBUG
        SERIAL_ECHOLNPGM("[MPDBG] ENABL NSP");
#endif
    } break;
    case MPCommand_DisableNoSpaces: {
        mp_config &= ~(MPConfig_NoSpaces);
   111b0:	80 91 17 03 	lds	r24, 0x0317	; 0x800317 <mp_config>
   111b4:	8d 7f       	andi	r24, 0xFD	; 253
   111b6:	e4 cf       	rjmp	.-56     	; 0x11180 <get_command()+0x236>
    // Validate config vars
#ifdef USE_LOOKUP_TABLE
    if (mp_config & MPConfig_NoSpaces)
        MeatPackLookupTbl[MeatPack_SpaceCharIdx] = (uint8_t)(MeatPack_SpaceCharReplace);
    else
        MeatPackLookupTbl[MeatPack_SpaceCharIdx] = ' ';
   111b8:	90 e2       	ldi	r25, 0x20	; 32
   111ba:	90 93 0b 02 	sts	0x020B, r25	; 0x80020b <__DATA_REGION_ORIGIN__+0xb>
   111be:	d6 cf       	rjmp	.-84     	; 0x1116c <get_command()+0x222>
        mp_handle_cmd((MeatPack_Command)c);
        mp_cmd_active = 0;
        return;
    }

    if (mp_cmd_count > 0) {
   111c0:	90 91 19 03 	lds	r25, 0x0319	; 0x800319 <mp_cmd_count>
   111c4:	30 91 17 03 	lds	r19, 0x0317	; 0x800317 <mp_config>
   111c8:	99 23       	and	r25, r25
   111ca:	31 f1       	breq	.+76     	; 0x11218 <get_command()+0x2ce>
   111cc:	e0 91 1c 03 	lds	r30, 0x031C	; 0x80031c <mp_char_out_count>
//==========================================================================
void FORCE_INLINE mp_handle_rx_char_inner(const uint8_t c) {

    // Packing enabled, handle character and re-arrange them appropriately.
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    if (mp_config & MPConfig_Active) {
   111d0:	30 ff       	sbrs	r19, 0
   111d2:	49 c0       	rjmp	.+146    	; 0x11266 <get_command()+0x31c>
        if (mp_full_char_queue > 0) {
   111d4:	20 91 15 03 	lds	r18, 0x0315	; 0x800315 <mp_full_char_queue>
   111d8:	22 23       	and	r18, r18
   111da:	09 f4       	brne	.+2      	; 0x111de <get_command()+0x294>
   111dc:	40 c0       	rjmp	.+128    	; 0x1125e <get_command()+0x314>
#ifdef MP_DEBUG
uint32_t mp_chars_decoded = 0;
#endif

void FORCE_INLINE mp_handle_output_char(const uint8_t c) {
    mp_char_out_buf[mp_char_out_count++] = c;
   111de:	91 e0       	ldi	r25, 0x01	; 1
   111e0:	9e 0f       	add	r25, r30
   111e2:	90 93 1c 03 	sts	0x031C, r25	; 0x80031c <mp_char_out_count>
   111e6:	ae 2f       	mov	r26, r30
   111e8:	b0 e0       	ldi	r27, 0x00	; 0
   111ea:	a6 5e       	subi	r26, 0xE6	; 230
   111ec:	bc 4f       	sbci	r27, 0xFC	; 252
   111ee:	ff ef       	ldi	r31, 0xFF	; 255
   111f0:	fc 93       	st	X, r31
    // Packing enabled, handle character and re-arrange them appropriately.
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    if (mp_config & MPConfig_Active) {
        if (mp_full_char_queue > 0) {
            mp_handle_output_char(c);
                if (mp_char_buf > 0) {
   111f2:	40 91 16 03 	lds	r20, 0x0316	; 0x800316 <mp_char_buf>
   111f6:	44 23       	and	r20, r20
   111f8:	51 f0       	breq	.+20     	; 0x1120e <get_command()+0x2c4>
#ifdef MP_DEBUG
uint32_t mp_chars_decoded = 0;
#endif

void FORCE_INLINE mp_handle_output_char(const uint8_t c) {
    mp_char_out_buf[mp_char_out_count++] = c;
   111fa:	ee 5f       	subi	r30, 0xFE	; 254
   111fc:	e0 93 1c 03 	sts	0x031C, r30	; 0x80031c <mp_char_out_count>
   11200:	e9 2f       	mov	r30, r25
   11202:	f0 e0       	ldi	r31, 0x00	; 0
   11204:	e6 5e       	subi	r30, 0xE6	; 230
   11206:	fc 4f       	sbci	r31, 0xFC	; 252
   11208:	40 83       	st	Z, r20
    if (mp_config & MPConfig_Active) {
        if (mp_full_char_queue > 0) {
            mp_handle_output_char(c);
                if (mp_char_buf > 0) {
                    mp_handle_output_char(mp_char_buf);
                        mp_char_buf = 0;
   1120a:	10 92 16 03 	sts	0x0316, r1	; 0x800316 <mp_char_buf>
                }
            --mp_full_char_queue;
   1120e:	21 50       	subi	r18, 0x01	; 1
   11210:	20 93 15 03 	sts	0x0315, r18	; 0x800315 <mp_full_char_queue>
        return;
    }

    if (mp_cmd_count > 0) {
        mp_handle_rx_char_inner((uint8_t)(MeatPack_CommandByte));
        mp_cmd_count = 0;
   11214:	10 92 19 03 	sts	0x0319, r1	; 0x800319 <mp_cmd_count>
   11218:	e0 91 1c 03 	lds	r30, 0x031C	; 0x80031c <mp_char_out_count>
//==========================================================================
void FORCE_INLINE mp_handle_rx_char_inner(const uint8_t c) {

    // Packing enabled, handle character and re-arrange them appropriately.
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    if (mp_config & MPConfig_Active) {
   1121c:	30 ff       	sbrs	r19, 0
   1121e:	6c c0       	rjmp	.+216    	; 0x112f8 <get_command()+0x3ae>
        if (mp_full_char_queue > 0) {
   11220:	90 91 15 03 	lds	r25, 0x0315	; 0x800315 <mp_full_char_queue>
   11224:	99 23       	and	r25, r25
   11226:	49 f1       	breq	.+82     	; 0x1127a <get_command()+0x330>
#ifdef MP_DEBUG
uint32_t mp_chars_decoded = 0;
#endif

void FORCE_INLINE mp_handle_output_char(const uint8_t c) {
    mp_char_out_buf[mp_char_out_count++] = c;
   11228:	21 e0       	ldi	r18, 0x01	; 1
   1122a:	2e 0f       	add	r18, r30
   1122c:	20 93 1c 03 	sts	0x031C, r18	; 0x80031c <mp_char_out_count>
   11230:	ae 2f       	mov	r26, r30
   11232:	b0 e0       	ldi	r27, 0x00	; 0
   11234:	a6 5e       	subi	r26, 0xE6	; 230
   11236:	bc 4f       	sbci	r27, 0xFC	; 252
   11238:	8c 93       	st	X, r24
    // Packing enabled, handle character and re-arrange them appropriately.
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    if (mp_config & MPConfig_Active) {
        if (mp_full_char_queue > 0) {
            mp_handle_output_char(c);
                if (mp_char_buf > 0) {
   1123a:	80 91 16 03 	lds	r24, 0x0316	; 0x800316 <mp_char_buf>
   1123e:	88 23       	and	r24, r24
   11240:	51 f0       	breq	.+20     	; 0x11256 <get_command()+0x30c>
#ifdef MP_DEBUG
uint32_t mp_chars_decoded = 0;
#endif

void FORCE_INLINE mp_handle_output_char(const uint8_t c) {
    mp_char_out_buf[mp_char_out_count++] = c;
   11242:	ee 5f       	subi	r30, 0xFE	; 254
   11244:	e0 93 1c 03 	sts	0x031C, r30	; 0x80031c <mp_char_out_count>
   11248:	e2 2f       	mov	r30, r18
   1124a:	f0 e0       	ldi	r31, 0x00	; 0
   1124c:	e6 5e       	subi	r30, 0xE6	; 230
   1124e:	fc 4f       	sbci	r31, 0xFC	; 252
   11250:	80 83       	st	Z, r24
    if (mp_config & MPConfig_Active) {
        if (mp_full_char_queue > 0) {
            mp_handle_output_char(c);
                if (mp_char_buf > 0) {
                    mp_handle_output_char(mp_char_buf);
                        mp_char_buf = 0;
   11252:	10 92 16 03 	sts	0x0316, r1	; 0x800316 <mp_char_buf>
                }
            --mp_full_char_queue;
   11256:	91 50       	subi	r25, 0x01	; 1
   11258:	90 93 15 03 	sts	0x0315, r25	; 0x800315 <mp_full_char_queue>
   1125c:	e4 ce       	rjmp	.-568    	; 0x11026 <get_command()+0xdc>
            uint8_t buf[2] = { 0,0 };
            const uint8_t res = mp_unpack_chars(c, buf);

            if (res & MeatPack_NextPackedFirst) {
                ++mp_full_char_queue;
                if (res & MeatPack_NextPackedSecond) ++mp_full_char_queue;
   1125e:	42 e0       	ldi	r20, 0x02	; 2
   11260:	40 93 15 03 	sts	0x0315, r20	; 0x800315 <mp_full_char_queue>
   11264:	d7 cf       	rjmp	.-82     	; 0x11214 <get_command()+0x2ca>
#ifdef MP_DEBUG
uint32_t mp_chars_decoded = 0;
#endif

void FORCE_INLINE mp_handle_output_char(const uint8_t c) {
    mp_char_out_buf[mp_char_out_count++] = c;
   11266:	91 e0       	ldi	r25, 0x01	; 1
   11268:	9e 0f       	add	r25, r30
   1126a:	90 93 1c 03 	sts	0x031C, r25	; 0x80031c <mp_char_out_count>
   1126e:	f0 e0       	ldi	r31, 0x00	; 0
   11270:	e6 5e       	subi	r30, 0xE6	; 230
   11272:	fc 4f       	sbci	r31, 0xFC	; 252
   11274:	9f ef       	ldi	r25, 0xFF	; 255
   11276:	90 83       	st	Z, r25
   11278:	cd cf       	rjmp	.-102    	; 0x11214 <get_command()+0x2ca>
   1127a:	a8 2f       	mov	r26, r24
   1127c:	af 70       	andi	r26, 0x0F	; 15
                        mp_char_buf = 0;
                }
            --mp_full_char_queue;
        }
        else {
            uint8_t buf[2] = { 0,0 };
   1127e:	30 e0       	ldi	r19, 0x00	; 0
uint8_t FORCE_INLINE mp_unpack_chars(const uint8_t pk, uint8_t* __restrict const chars_out) {
    uint8_t out = 0;

#ifdef USE_LOOKUP_TABLE
    // If lower 4 bytes is 0b1111, the higher 4 are unused, and next char is full.
    if ((pk & MeatPack_FirstNotPacked) == MeatPack_FirstNotPacked) out |= MeatPack_NextPackedFirst;
   11280:	21 e0       	ldi	r18, 0x01	; 1
   11282:	af 30       	cpi	r26, 0x0F	; 15
   11284:	29 f0       	breq	.+10     	; 0x11290 <get_command()+0x346>
   11286:	b0 e0       	ldi	r27, 0x00	; 0
    else chars_out[0] = MeatPackLookupTbl[(pk & 0xF)]; // Assign lower char
   11288:	a0 50       	subi	r26, 0x00	; 0
   1128a:	be 4f       	sbci	r27, 0xFE	; 254
   1128c:	3c 91       	ld	r19, X
// low = (packed >> 4) & 0xF;
// high = (packed & 0xF);

//==========================================================================
uint8_t FORCE_INLINE mp_unpack_chars(const uint8_t pk, uint8_t* __restrict const chars_out) {
    uint8_t out = 0;
   1128e:	20 e0       	ldi	r18, 0x00	; 0
    // If lower 4 bytes is 0b1111, the higher 4 are unused, and next char is full.
    if ((pk & MeatPack_FirstNotPacked) == MeatPack_FirstNotPacked) out |= MeatPack_NextPackedFirst;
    else chars_out[0] = MeatPackLookupTbl[(pk & 0xF)]; // Assign lower char

    // Check if upper 4 bytes is 0b1111... if so, we don't need the second char.
    if ((pk & MeatPack_SecondNotPacked) == MeatPack_SecondNotPacked) out |= MeatPack_NextPackedSecond;
   11290:	48 2f       	mov	r20, r24
   11292:	40 7f       	andi	r20, 0xF0	; 240
   11294:	40 3f       	cpi	r20, 0xF0	; 240
   11296:	59 f4       	brne	.+22     	; 0x112ae <get_command()+0x364>
   11298:	22 60       	ori	r18, 0x02	; 2
        }
        else {
            uint8_t buf[2] = { 0,0 };
            const uint8_t res = mp_unpack_chars(c, buf);

            if (res & MeatPack_NextPackedFirst) {
   1129a:	20 ff       	sbrs	r18, 0
   1129c:	13 c0       	rjmp	.+38     	; 0x112c4 <get_command()+0x37a>
                ++mp_full_char_queue;
   1129e:	90 92 15 03 	sts	0x0315, r9	; 0x800315 <mp_full_char_queue>
                if (res & MeatPack_NextPackedSecond) ++mp_full_char_queue;
   112a2:	21 ff       	sbrs	r18, 1
   112a4:	0c c0       	rjmp	.+24     	; 0x112be <get_command()+0x374>
   112a6:	e2 e0       	ldi	r30, 0x02	; 2
   112a8:	e0 93 15 03 	sts	0x0315, r30	; 0x800315 <mp_full_char_queue>
   112ac:	bc ce       	rjmp	.-648    	; 0x11026 <get_command()+0xdc>
    if ((pk & MeatPack_FirstNotPacked) == MeatPack_FirstNotPacked) out |= MeatPack_NextPackedFirst;
    else chars_out[0] = MeatPackLookupTbl[(pk & 0xF)]; // Assign lower char

    // Check if upper 4 bytes is 0b1111... if so, we don't need the second char.
    if ((pk & MeatPack_SecondNotPacked) == MeatPack_SecondNotPacked) out |= MeatPack_NextPackedSecond;
    else chars_out[1] = MeatPackLookupTbl[((pk >> 4) & 0xf)]; // Assign upper char
   112ae:	82 95       	swap	r24
   112b0:	8f 70       	andi	r24, 0x0F	; 15
   112b2:	a8 2f       	mov	r26, r24
   112b4:	b0 e0       	ldi	r27, 0x00	; 0
   112b6:	a0 50       	subi	r26, 0x00	; 0
   112b8:	be 4f       	sbci	r27, 0xFE	; 254
   112ba:	9c 91       	ld	r25, X
   112bc:	ee cf       	rjmp	.-36     	; 0x1129a <get_command()+0x350>
            const uint8_t res = mp_unpack_chars(c, buf);

            if (res & MeatPack_NextPackedFirst) {
                ++mp_full_char_queue;
                if (res & MeatPack_NextPackedSecond) ++mp_full_char_queue;
                else mp_char_buf = buf[1];
   112be:	90 93 16 03 	sts	0x0316, r25	; 0x800316 <mp_char_buf>
   112c2:	b1 ce       	rjmp	.-670    	; 0x11026 <get_command()+0xdc>
#ifdef MP_DEBUG
uint32_t mp_chars_decoded = 0;
#endif

void FORCE_INLINE mp_handle_output_char(const uint8_t c) {
    mp_char_out_buf[mp_char_out_count++] = c;
   112c4:	81 e0       	ldi	r24, 0x01	; 1
   112c6:	8e 0f       	add	r24, r30
   112c8:	80 93 1c 03 	sts	0x031C, r24	; 0x80031c <mp_char_out_count>
   112cc:	ae 2f       	mov	r26, r30
   112ce:	b0 e0       	ldi	r27, 0x00	; 0
   112d0:	a6 5e       	subi	r26, 0xE6	; 230
   112d2:	bc 4f       	sbci	r27, 0xFC	; 252
   112d4:	3c 93       	st	X, r19
                if (res & MeatPack_NextPackedSecond) ++mp_full_char_queue;
                else mp_char_buf = buf[1];
            }
            else {
                mp_handle_output_char(buf[0]);
                if (buf[0] != '\n') {
   112d6:	3a 30       	cpi	r19, 0x0A	; 10
   112d8:	09 f4       	brne	.+2      	; 0x112dc <get_command()+0x392>
   112da:	a5 ce       	rjmp	.-694    	; 0x11026 <get_command()+0xdc>
                    if (res & MeatPack_NextPackedSecond) ++mp_full_char_queue;
   112dc:	21 ff       	sbrs	r18, 1
   112de:	03 c0       	rjmp	.+6      	; 0x112e6 <get_command()+0x39c>
   112e0:	90 92 15 03 	sts	0x0315, r9	; 0x800315 <mp_full_char_queue>
   112e4:	a0 ce       	rjmp	.-704    	; 0x11026 <get_command()+0xdc>
#ifdef MP_DEBUG
uint32_t mp_chars_decoded = 0;
#endif

void FORCE_INLINE mp_handle_output_char(const uint8_t c) {
    mp_char_out_buf[mp_char_out_count++] = c;
   112e6:	ee 5f       	subi	r30, 0xFE	; 254
   112e8:	e0 93 1c 03 	sts	0x031C, r30	; 0x80031c <mp_char_out_count>
   112ec:	e8 2f       	mov	r30, r24
   112ee:	f0 e0       	ldi	r31, 0x00	; 0
   112f0:	e6 5e       	subi	r30, 0xE6	; 230
   112f2:	fc 4f       	sbci	r31, 0xFC	; 252
   112f4:	90 83       	st	Z, r25
   112f6:	97 ce       	rjmp	.-722    	; 0x11026 <get_command()+0xdc>
   112f8:	91 e0       	ldi	r25, 0x01	; 1
   112fa:	9e 0f       	add	r25, r30
   112fc:	90 93 1c 03 	sts	0x031C, r25	; 0x80031c <mp_char_out_count>
   11300:	f0 e0       	ldi	r31, 0x00	; 0
   11302:	e6 5e       	subi	r30, 0xE6	; 230
   11304:	fc 4f       	sbci	r31, 0xFC	; 252
   11306:	80 83       	st	Z, r24
   11308:	8e ce       	rjmp	.-740    	; 0x11026 <get_command()+0xdc>
        continue;
    if(serial_char == '\n' ||
       serial_char == '\r' ||
       serial_count >= (MAX_CMD_SIZE - 1) )
    {
      if(!serial_count) { //if empty line
   1130a:	00 97       	sbiw	r24, 0x00	; 0
   1130c:	19 f4       	brne	.+6      	; 0x11314 <get_command()+0x3ca>
        comment_mode = false; //for new command
   1130e:	10 92 1e 03 	sts	0x031E, r1	; 0x80031e <comment_mode>
   11312:	dd ce       	rjmp	.-582    	; 0x110ce <get_command()+0x184>
   11314:	00 91 49 10 	lds	r16, 0x1049	; 0x801049 <_ZL7bufindw.lto_priv.514>
   11318:	10 91 4a 10 	lds	r17, 0x104A	; 0x80104a <_ZL7bufindw.lto_priv.514+0x1>
        return;
      }
      cmdbuffer[bufindw+serial_count+CMDHDRSIZE] = 0; // terminate string
   1131c:	02 5b       	subi	r16, 0xB2	; 178
   1131e:	1f 4e       	sbci	r17, 0xEF	; 239
   11320:	80 0f       	add	r24, r16
   11322:	91 1f       	adc	r25, r17
   11324:	fc 01       	movw	r30, r24
   11326:	10 82       	st	Z, r1
      char* cmd_head = cmdbuffer+bufindw+CMDHDRSIZE; // current command pointer
      char* cmd_start = cmd_head; // pointer past the line number (if any)
   11328:	1a 83       	std	Y+2, r17	; 0x02
   1132a:	09 83       	std	Y+1, r16	; 0x01

      if(!comment_mode){
   1132c:	80 91 1e 03 	lds	r24, 0x031E	; 0x80031e <comment_mode>
   11330:	81 11       	cpse	r24, r1
   11332:	fd c0       	rjmp	.+506    	; 0x1152e <get_command()+0x5e4>
		  long gcode_N = -1; // seen line number

		  // Line numbers must be first in buffer
		  if (*cmd_head == 'N') {
   11334:	f8 01       	movw	r30, r16
   11336:	80 81       	ld	r24, Z
   11338:	8e 34       	cpi	r24, 0x4E	; 78
   1133a:	09 f0       	breq	.+2      	; 0x1133e <get_command()+0x3f4>
   1133c:	84 c0       	rjmp	.+264    	; 0x11446 <get_command()+0x4fc>

			  // Line number met: decode the number, then move cmd_start past all spaces.
			  gcode_N = (strtol(cmd_head+1, &cmd_start, 10));
   1133e:	4a e0       	ldi	r20, 0x0A	; 10
   11340:	50 e0       	ldi	r21, 0x00	; 0
   11342:	be 01       	movw	r22, r28
   11344:	6f 5f       	subi	r22, 0xFF	; 255
   11346:	7f 4f       	sbci	r23, 0xFF	; 255
   11348:	c8 01       	movw	r24, r16
   1134a:	01 96       	adiw	r24, 0x01	; 1
   1134c:	0f 94 6b 9f 	call	0x33ed6	; 0x33ed6 <strtol>
   11350:	2b 01       	movw	r4, r22
   11352:	3c 01       	movw	r6, r24
			  while (*cmd_start == ' ') ++cmd_start;
   11354:	e9 80       	ldd	r14, Y+1	; 0x01
   11356:	fa 80       	ldd	r15, Y+2	; 0x02
   11358:	f7 01       	movw	r30, r14
   1135a:	80 81       	ld	r24, Z
   1135c:	80 32       	cpi	r24, 0x20	; 32
   1135e:	31 f4       	brne	.+12     	; 0x1136c <get_command()+0x422>
   11360:	ff ef       	ldi	r31, 0xFF	; 255
   11362:	ef 1a       	sub	r14, r31
   11364:	ff 0a       	sbc	r15, r31
   11366:	fa 82       	std	Y+2, r15	; 0x02
   11368:	e9 82       	std	Y+1, r14	; 0x01
   1136a:	f4 cf       	rjmp	.-24     	; 0x11354 <get_command()+0x40a>

			  // Test whether the successive lines are stamped with an increasing line number ID.
			  if(gcode_N != gcode_LastN+1 && strncmp_P(cmd_start, PSTR("M110"), 4)) {
   1136c:	80 91 3e 12 	lds	r24, 0x123E	; 0x80123e <gcode_LastN>
   11370:	90 91 3f 12 	lds	r25, 0x123F	; 0x80123f <gcode_LastN+0x1>
   11374:	a0 91 40 12 	lds	r26, 0x1240	; 0x801240 <gcode_LastN+0x2>
   11378:	b0 91 41 12 	lds	r27, 0x1241	; 0x801241 <gcode_LastN+0x3>
   1137c:	01 96       	adiw	r24, 0x01	; 1
   1137e:	a1 1d       	adc	r26, r1
   11380:	b1 1d       	adc	r27, r1
   11382:	84 15       	cp	r24, r4
   11384:	95 05       	cpc	r25, r5
   11386:	a6 05       	cpc	r26, r6
   11388:	b7 05       	cpc	r27, r7
   1138a:	49 f0       	breq	.+18     	; 0x1139e <get_command()+0x454>
   1138c:	44 e0       	ldi	r20, 0x04	; 4
   1138e:	50 e0       	ldi	r21, 0x00	; 0
   11390:	65 ec       	ldi	r22, 0xC5	; 197
   11392:	72 e7       	ldi	r23, 0x72	; 114
   11394:	c7 01       	movw	r24, r14
   11396:	0f 94 bf a1 	call	0x3437e	; 0x3437e <strncmp_P>
   1139a:	89 2b       	or	r24, r25
   1139c:	a1 f4       	brne	.+40     	; 0x113c6 <get_command()+0x47c>
				  FlushSerialRequestResend();
				  serial_count = 0;
				  return;
			  }

			  if((strchr_pointer = strchr(cmd_start, '*')) != NULL)
   1139e:	6a e2       	ldi	r22, 0x2A	; 42
   113a0:	70 e0       	ldi	r23, 0x00	; 0
   113a2:	c7 01       	movw	r24, r14
   113a4:	0f 94 37 aa 	call	0x3546e	; 0x3546e <strchr>
   113a8:	90 93 bc 04 	sts	0x04BC, r25	; 0x8004bc <strchr_pointer+0x1>
   113ac:	80 93 bb 04 	sts	0x04BB, r24	; 0x8004bb <strchr_pointer>
   113b0:	00 97       	sbiw	r24, 0x00	; 0
   113b2:	09 f4       	brne	.+2      	; 0x113b6 <get_command()+0x46c>
   113b4:	41 c0       	rjmp	.+130    	; 0x11438 <get_command()+0x4ee>
   113b6:	f8 01       	movw	r30, r16
			  {
				  byte checksum = 0;
   113b8:	f1 2c       	mov	r15, r1
				  char *p = cmd_head;
				  while (p != strchr_pointer)
   113ba:	8e 17       	cp	r24, r30
   113bc:	9f 07       	cpc	r25, r31
   113be:	f1 f0       	breq	.+60     	; 0x113fc <get_command()+0x4b2>
					  checksum = checksum^(*p++);
   113c0:	21 91       	ld	r18, Z+
   113c2:	f2 26       	eor	r15, r18
   113c4:	fa cf       	rjmp	.-12     	; 0x113ba <get_command()+0x470>
			  while (*cmd_start == ' ') ++cmd_start;

			  // Test whether the successive lines are stamped with an increasing line number ID.
			  if(gcode_N != gcode_LastN+1 && strncmp_P(cmd_start, PSTR("M110"), 4)) {
				  // Line numbers not sent in succession and M110 not seen.
				  SERIAL_ERROR_START;
   113c6:	81 eb       	ldi	r24, 0xB1	; 177
   113c8:	91 ea       	ldi	r25, 0xA1	; 161
   113ca:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
				  SERIAL_ERRORRPGM(_n("Line Number is not Last Line Number+1, Last Line: "));////MSG_ERR_LINE_NO
   113ce:	80 e3       	ldi	r24, 0x30	; 48
   113d0:	93 e6       	ldi	r25, 0x63	; 99
				  char *p = cmd_head;
				  while (p != strchr_pointer)
					  checksum = checksum^(*p++);
				  if (code_value_short() != (int16_t)checksum) {
					  SERIAL_ERROR_START;
					  SERIAL_ERRORRPGM(_n("checksum mismatch, Last Line: "));////MSG_ERR_CHECKSUM_MISMATCH
   113d2:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   113d6:	60 91 3e 12 	lds	r22, 0x123E	; 0x80123e <gcode_LastN>
   113da:	70 91 3f 12 	lds	r23, 0x123F	; 0x80123f <gcode_LastN+0x1>
   113de:	80 91 40 12 	lds	r24, 0x1240	; 0x801240 <gcode_LastN+0x2>
   113e2:	90 91 41 12 	lds	r25, 0x1241	; 0x801241 <gcode_LastN+0x3>
   113e6:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
}

void MarlinSerial::println(long n, int base)
{
  print(n, base);
  println();
   113ea:	0e 94 bc 7a 	call	0xf578	; 0xf578 <MarlinSerial::println()>
					  SERIAL_ERRORLN(gcode_LastN);
					  FlushSerialRequestResend();
   113ee:	0e 94 ac 55 	call	0xab58	; 0xab58 <FlushSerialRequestResend()>
					  serial_count = 0;
   113f2:	10 92 48 10 	sts	0x1048, r1	; 0x801048 <serial_count+0x1>
   113f6:	10 92 47 10 	sts	0x1047, r1	; 0x801047 <serial_count>
   113fa:	69 ce       	rjmp	.-814    	; 0x110ce <get_command()+0x184>
			  {
				  byte checksum = 0;
				  char *p = cmd_head;
				  while (p != strchr_pointer)
					  checksum = checksum^(*p++);
				  if (code_value_short() != (int16_t)checksum) {
   113fc:	0e 94 17 56 	call	0xac2e	; 0xac2e <code_value_short() [clone .lto_priv.505]>
   11400:	f8 16       	cp	r15, r24
   11402:	19 06       	cpc	r1, r25
   11404:	39 f0       	breq	.+14     	; 0x11414 <get_command()+0x4ca>
					  SERIAL_ERROR_START;
   11406:	81 eb       	ldi	r24, 0xB1	; 177
   11408:	91 ea       	ldi	r25, 0xA1	; 161
   1140a:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
					  SERIAL_ERRORRPGM(_n("checksum mismatch, Last Line: "));////MSG_ERR_CHECKSUM_MISMATCH
   1140e:	81 e1       	ldi	r24, 0x11	; 17
   11410:	93 e6       	ldi	r25, 0x63	; 99
   11412:	df cf       	rjmp	.-66     	; 0x113d2 <get_command()+0x488>
					  FlushSerialRequestResend();
					  serial_count = 0;
					  return;
				  }
				  // If no errors, remove the checksum and continue parsing.
				  *strchr_pointer = 0;
   11414:	e0 91 bb 04 	lds	r30, 0x04BB	; 0x8004bb <strchr_pointer>
   11418:	f0 91 bc 04 	lds	r31, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
   1141c:	10 82       	st	Z, r1
                return;
            }
        }

        // Handle KILL early, even when Stopped
        if(strcmp_P(cmd_start, PSTR("M112")) == 0)
   1141e:	e9 80       	ldd	r14, Y+1	; 0x01
   11420:	fa 80       	ldd	r15, Y+2	; 0x02
   11422:	60 ec       	ldi	r22, 0xC0	; 192
   11424:	72 e7       	ldi	r23, 0x72	; 114
   11426:	c7 01       	movw	r24, r14
   11428:	0f 94 8e a1 	call	0x3431c	; 0x3431c <strcmp_P>
   1142c:	89 2b       	or	r24, r25
   1142e:	39 f5       	brne	.+78     	; 0x1147e <get_command()+0x534>
          kill(MSG_M112_KILL);
   11430:	87 e7       	ldi	r24, 0x77	; 119
   11432:	95 e6       	ldi	r25, 0x65	; 101
   11434:	0e 94 23 83 	call	0x10646	; 0x10646 <kill(char const*)>
				  // If no errors, remove the checksum and continue parsing.
				  *strchr_pointer = 0;
			  }
			  else
			  {
				  SERIAL_ERROR_START;
   11438:	81 eb       	ldi	r24, 0xB1	; 177
   1143a:	91 ea       	ldi	r25, 0xA1	; 161
   1143c:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
				  SERIAL_ERRORRPGM(_n("No Checksum with line number, Last Line: "));////MSG_ERR_NO_CHECKSUM
   11440:	87 ee       	ldi	r24, 0xE7	; 231
   11442:	92 e6       	ldi	r25, 0x62	; 98
   11444:	c6 cf       	rjmp	.-116    	; 0x113d2 <get_command()+0x488>
			  }
		}
        else
        {
            // move cmd_start past all spaces
            while (*cmd_start == ' ') ++cmd_start;
   11446:	89 81       	ldd	r24, Y+1	; 0x01
   11448:	9a 81       	ldd	r25, Y+2	; 0x02
   1144a:	fc 01       	movw	r30, r24
   1144c:	20 81       	ld	r18, Z
   1144e:	20 32       	cpi	r18, 0x20	; 32
   11450:	21 f4       	brne	.+8      	; 0x1145a <get_command()+0x510>
   11452:	01 96       	adiw	r24, 0x01	; 1
   11454:	9a 83       	std	Y+2, r25	; 0x02
   11456:	89 83       	std	Y+1, r24	; 0x01
   11458:	f6 cf       	rjmp	.-20     	; 0x11446 <get_command()+0x4fc>

            // if we didn't receive 'N' but still see '*'
            if (strchr(cmd_start, '*') != NULL)
   1145a:	6a e2       	ldi	r22, 0x2A	; 42
   1145c:	70 e0       	ldi	r23, 0x00	; 0
   1145e:	0f 94 37 aa 	call	0x3546e	; 0x3546e <strchr>
   11462:	89 2b       	or	r24, r25
   11464:	39 f0       	breq	.+14     	; 0x11474 <get_command()+0x52a>
            {
                SERIAL_ERROR_START;
   11466:	81 eb       	ldi	r24, 0xB1	; 177
   11468:	91 ea       	ldi	r25, 0xA1	; 161
   1146a:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
                SERIAL_ERRORRPGM(_n("No Line Number with checksum, Last Line: "));////MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM
   1146e:	8d eb       	ldi	r24, 0xBD	; 189
   11470:	92 e6       	ldi	r25, 0x62	; 98
   11472:	af cf       	rjmp	.-162    	; 0x113d2 <get_command()+0x488>
      cmdbuffer[bufindw+serial_count+CMDHDRSIZE] = 0; // terminate string
      char* cmd_head = cmdbuffer+bufindw+CMDHDRSIZE; // current command pointer
      char* cmd_start = cmd_head; // pointer past the line number (if any)

      if(!comment_mode){
		  long gcode_N = -1; // seen line number
   11474:	44 24       	eor	r4, r4
   11476:	4a 94       	dec	r4
   11478:	54 2c       	mov	r5, r4
   1147a:	32 01       	movw	r6, r4
   1147c:	d0 cf       	rjmp	.-96     	; 0x1141e <get_command()+0x4d4>
        if(strcmp_P(cmd_start, PSTR("M112")) == 0)
          kill(MSG_M112_KILL);

        // Bypass Stopped for some commands
        bool allow_when_stopped = false;
        if(strncmp_P(cmd_start, PSTR("M310"), 4) == 0)
   1147e:	44 e0       	ldi	r20, 0x04	; 4
   11480:	50 e0       	ldi	r21, 0x00	; 0
   11482:	6b eb       	ldi	r22, 0xBB	; 187
   11484:	72 e7       	ldi	r23, 0x72	; 114
   11486:	c7 01       	movw	r24, r14
   11488:	0f 94 bf a1 	call	0x3437e	; 0x3437e <strncmp_P>
   1148c:	5c 01       	movw	r10, r24
            allow_when_stopped = true;

        // Handle the USB timer
        if ((*cmd_start == 'G') && (GetPrinterState() != PrinterState::IsSDPrinting)) {
   1148e:	f7 01       	movw	r30, r14
   11490:	80 81       	ld	r24, Z
   11492:	87 34       	cpi	r24, 0x47	; 71
   11494:	81 f4       	brne	.+32     	; 0x114b6 <get_command()+0x56c>
   11496:	80 91 61 0d 	lds	r24, 0x0D61	; 0x800d61 <_ZL13printer_state.lto_priv.386>
   1149a:	85 30       	cpi	r24, 0x05	; 5
   1149c:	61 f0       	breq	.+24     	; 0x114b6 <get_command()+0x56c>
            usb_timer.start();
   1149e:	82 e4       	ldi	r24, 0x42	; 66
   114a0:	92 e1       	ldi	r25, 0x12	; 18
   114a2:	0f 94 4e 0e 	call	0x21c9c	; 0x21c9c <Timer<unsigned short>::start()>
PrinterState GetPrinterState() {
    return printer_state;
}

PrinterState SetPrinterState(PrinterState status) {
    return printer_state = status;
   114a6:	f6 e0       	ldi	r31, 0x06	; 6
   114a8:	f0 93 61 0d 	sts	0x0D61, r31	; 0x800d61 <_ZL13printer_state.lto_priv.386>
        if (previous_value != value) {
            eeprom_byte_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_byte(dst, value);
   114ac:	60 e0       	ldi	r22, 0x00	; 0
   114ae:	85 ea       	ldi	r24, 0xA5	; 165
   114b0:	9f e0       	ldi	r25, 0x0F	; 15
   114b2:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
            SetPrinterState(PrinterState::IsHostPrinting); //set printer state busy printing to hide LCD menu while USB printing
            eeprom_update_byte_notify((uint8_t*)EEPROM_UVLO, PowerPanic::NO_PENDING_RECOVERY);
        }
        if (allow_when_stopped == false && Stopped == true) {
   114b6:	ab 28       	or	r10, r11
   114b8:	21 f0       	breq	.+8      	; 0x114c2 <get_command()+0x578>
   114ba:	80 91 3b 12 	lds	r24, 0x123B	; 0x80123b <Stopped>
   114be:	81 11       	cpse	r24, r1
   114c0:	98 cf       	rjmp	.-208    	; 0x113f2 <get_command()+0x4a8>
        }

        // Command is complete: store the current line into buffer, move to the next line.

		// Store type of entry
        cmdbuffer[bufindw] = gcode_N >= 0 ? CMDBUFFER_CURRENT_TYPE_USB_WITH_LINENR : CMDBUFFER_CURRENT_TYPE_USB;
   114c2:	26 e0       	ldi	r18, 0x06	; 6
   114c4:	77 fc       	sbrc	r7, 7
   114c6:	21 e0       	ldi	r18, 0x01	; 1
   114c8:	80 91 49 10 	lds	r24, 0x1049	; 0x801049 <_ZL7bufindw.lto_priv.514>
   114cc:	90 91 4a 10 	lds	r25, 0x104A	; 0x80104a <_ZL7bufindw.lto_priv.514+0x1>
   114d0:	fc 01       	movw	r30, r24
   114d2:	e5 5b       	subi	r30, 0xB5	; 181
   114d4:	ff 4e       	sbci	r31, 0xEF	; 239
   114d6:	20 83       	st	Z, r18
        SERIAL_ECHOLNPGM("");
#endif /* CMDBUFFER_DEBUG */

        // Store the command itself (without line number or checksum)
        size_t cmd_len;
        if (cmd_head == cmd_start)
   114d8:	49 81       	ldd	r20, Y+1	; 0x01
   114da:	5a 81       	ldd	r21, Y+2	; 0x02
            cmd_len = strlen(cmd_start) + 1;
   114dc:	f8 01       	movw	r30, r16
        SERIAL_ECHOLNPGM("");
#endif /* CMDBUFFER_DEBUG */

        // Store the command itself (without line number or checksum)
        size_t cmd_len;
        if (cmd_head == cmd_start)
   114de:	da 01       	movw	r26, r20
   114e0:	40 17       	cp	r20, r16
   114e2:	51 07       	cpc	r21, r17
   114e4:	a1 f5       	brne	.+104    	; 0x1154e <get_command()+0x604>
            cmd_len = strlen(cmd_start) + 1;
   114e6:	01 90       	ld	r0, Z+
   114e8:	00 20       	and	r0, r0
   114ea:	e9 f7       	brne	.-6      	; 0x114e6 <get_command()+0x59c>
   114ec:	9f 01       	movw	r18, r30
   114ee:	20 1b       	sub	r18, r16
   114f0:	31 0b       	sbc	r19, r17
            // strip the line number
            cmd_len = 0;
            do { cmd_head[cmd_len] = cmd_start[cmd_len]; }
            while (cmd_head[cmd_len++]);
        }
        bufindw += cmd_len + CMDHDRSIZE;
   114f2:	03 96       	adiw	r24, 0x03	; 3
   114f4:	28 0f       	add	r18, r24
   114f6:	39 1f       	adc	r19, r25
        if (bufindw == sizeof(cmdbuffer))
   114f8:	2d 3e       	cpi	r18, 0xED	; 237
   114fa:	f1 e0       	ldi	r31, 0x01	; 1
   114fc:	3f 07       	cpc	r19, r31
   114fe:	79 f1       	breq	.+94     	; 0x1155e <get_command()+0x614>
            // strip the line number
            cmd_len = 0;
            do { cmd_head[cmd_len] = cmd_start[cmd_len]; }
            while (cmd_head[cmd_len++]);
        }
        bufindw += cmd_len + CMDHDRSIZE;
   11500:	30 93 4a 10 	sts	0x104A, r19	; 0x80104a <_ZL7bufindw.lto_priv.514+0x1>
   11504:	20 93 49 10 	sts	0x1049, r18	; 0x801049 <_ZL7bufindw.lto_priv.514>
        if (bufindw == sizeof(cmdbuffer))
            bufindw = 0;
        ++ buflen;
   11508:	80 91 3c 12 	lds	r24, 0x123C	; 0x80123c <buflen>
   1150c:	90 91 3d 12 	lds	r25, 0x123D	; 0x80123d <buflen+0x1>
   11510:	01 96       	adiw	r24, 0x01	; 1
   11512:	90 93 3d 12 	sts	0x123D, r25	; 0x80123d <buflen+0x1>
   11516:	80 93 3c 12 	sts	0x123C, r24	; 0x80123c <buflen>

        // Update the processed gcode line
        if (gcode_N >= 0)
   1151a:	77 fc       	sbrc	r7, 7
   1151c:	08 c0       	rjmp	.+16     	; 0x1152e <get_command()+0x5e4>
            gcode_LastN = gcode_N;
   1151e:	40 92 3e 12 	sts	0x123E, r4	; 0x80123e <gcode_LastN>
   11522:	50 92 3f 12 	sts	0x123F, r5	; 0x80123f <gcode_LastN+0x1>
   11526:	60 92 40 12 	sts	0x1240, r6	; 0x801240 <gcode_LastN+0x2>
   1152a:	70 92 41 12 	sts	0x1241, r7	; 0x801241 <gcode_LastN+0x3>
        SERIAL_ECHOPGM("Number of commands in the buffer: ");
        SERIAL_ECHO(buflen);
        SERIAL_ECHOLNPGM("");
#endif /* CMDBUFFER_DEBUG */
      } // end of 'not comment mode'
      serial_count = 0; //clear buffer
   1152e:	10 92 48 10 	sts	0x1048, r1	; 0x801048 <serial_count+0x1>
   11532:	10 92 47 10 	sts	0x1047, r1	; 0x801047 <serial_count>
      // Don't call cmdqueue_could_enqueue_back if there are no characters waiting
      // in the queue, as this function will reserve the memory.
      if (MYSERIAL.available() == 0 || ! cmdqueue_could_enqueue_back(MAX_CMD_SIZE-1))
   11536:	0e 94 fc 54 	call	0xa9f8	; 0xa9f8 <MarlinSerial::available()>
   1153a:	89 2b       	or	r24, r25
   1153c:	09 f4       	brne	.+2      	; 0x11540 <get_command()+0x5f6>
   1153e:	c7 cd       	rjmp	.-1138   	; 0x110ce <get_command()+0x184>
   11540:	8f e5       	ldi	r24, 0x5F	; 95
   11542:	90 e0       	ldi	r25, 0x00	; 0
   11544:	0e 94 64 55 	call	0xaac8	; 0xaac8 <cmdqueue_could_enqueue_back(unsigned int)>
   11548:	81 11       	cpse	r24, r1
   1154a:	7f cd       	rjmp	.-1282   	; 0x1104a <get_command()+0x100>
   1154c:	c0 cd       	rjmp	.-1152   	; 0x110ce <get_command()+0x184>
        if (cmd_head == cmd_start)
            cmd_len = strlen(cmd_start) + 1;
        else {
            // strip the line number
            cmd_len = 0;
            do { cmd_head[cmd_len] = cmd_start[cmd_len]; }
   1154e:	6d 91       	ld	r22, X+
   11550:	61 93       	st	Z+, r22
   11552:	9d 01       	movw	r18, r26
   11554:	24 1b       	sub	r18, r20
   11556:	35 0b       	sbc	r19, r21
            while (cmd_head[cmd_len++]);
   11558:	61 11       	cpse	r22, r1
   1155a:	f9 cf       	rjmp	.-14     	; 0x1154e <get_command()+0x604>
   1155c:	ca cf       	rjmp	.-108    	; 0x114f2 <get_command()+0x5a8>
        }
        bufindw += cmd_len + CMDHDRSIZE;
        if (bufindw == sizeof(cmdbuffer))
            bufindw = 0;
   1155e:	10 92 4a 10 	sts	0x104A, r1	; 0x80104a <_ZL7bufindw.lto_priv.514+0x1>
   11562:	10 92 49 10 	sts	0x1049, r1	; 0x801049 <_ZL7bufindw.lto_priv.514>
   11566:	d0 cf       	rjmp	.-96     	; 0x11508 <get_command()+0x5be>
    #ifdef ENABLE_MEATPACK
     }
    #endif
  } // end of serial line processing loop

    if (serial_count > 0 && serialTimeoutTimer.expired(farm_mode ? 800 : 2000)) {
   11568:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   1156c:	60 e2       	ldi	r22, 0x20	; 32
   1156e:	73 e0       	ldi	r23, 0x03	; 3
   11570:	81 11       	cpse	r24, r1
   11572:	02 c0       	rjmp	.+4      	; 0x11578 <get_command()+0x62e>
   11574:	60 ed       	ldi	r22, 0xD0	; 208
   11576:	77 e0       	ldi	r23, 0x07	; 7
   11578:	8f e1       	ldi	r24, 0x1F	; 31
   1157a:	93 e0       	ldi	r25, 0x03	; 3
   1157c:	0f 94 1f 0e 	call	0x21c3e	; 0x21c3e <Timer<unsigned short>::expired(unsigned short)>
   11580:	88 23       	and	r24, r24
   11582:	09 f4       	brne	.+2      	; 0x11586 <get_command()+0x63c>
   11584:	a0 cd       	rjmp	.-1216   	; 0x110c6 <get_command()+0x17c>
        comment_mode = false;
   11586:	10 92 1e 03 	sts	0x031E, r1	; 0x80031e <comment_mode>
        serial_count = 0;
   1158a:	10 92 48 10 	sts	0x1048, r1	; 0x801048 <serial_count+0x1>
   1158e:	10 92 47 10 	sts	0x1047, r1	; 0x801047 <serial_count>
        SERIAL_ECHOLNPGM("RX timeout");
   11592:	80 eb       	ldi	r24, 0xB0	; 176
   11594:	92 e7       	ldi	r25, 0x72	; 114
   11596:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   1159a:	99 cd       	rjmp	.-1230   	; 0x110ce <get_command()+0x184>
        return;
    }

  #ifdef SDSUPPORT
  if(!card.sdprinting || !card.isFileOpen() || serial_count!=0){
   1159c:	80 91 6a 16 	lds	r24, 0x166A	; 0x80166a <card+0x295>
   115a0:	88 23       	and	r24, r24
   115a2:	09 f4       	brne	.+2      	; 0x115a6 <get_command()+0x65c>
   115a4:	94 cd       	rjmp	.-1240   	; 0x110ce <get_command()+0x184>
   115a6:	80 91 47 10 	lds	r24, 0x1047	; 0x801047 <serial_count>
   115aa:	90 91 48 10 	lds	r25, 0x1048	; 0x801048 <serial_count+0x1>
   115ae:	89 2b       	or	r24, r25
   115b0:	09 f0       	breq	.+2      	; 0x115b4 <get_command()+0x66a>
   115b2:	8d cd       	rjmp	.-1254   	; 0x110ce <get_command()+0x184>
  //'#' stops reading from SD to the buffer prematurely, so procedural macro calls are possible
  // if it occurs, stop_buffering is triggered and the buffer is ran dry.
  // this character _can_ occur in serial com, due to checksums. however, no checksums are used in SD printing

  static bool stop_buffering=false;
  if(buflen==0) stop_buffering=false;
   115b4:	80 91 3c 12 	lds	r24, 0x123C	; 0x80123c <buflen>
   115b8:	90 91 3d 12 	lds	r25, 0x123D	; 0x80123d <buflen+0x1>
   115bc:	89 2b       	or	r24, r25
   115be:	11 f4       	brne	.+4      	; 0x115c4 <get_command()+0x67a>
   115c0:	10 92 1d 03 	sts	0x031D, r1	; 0x80031d <get_command()::stop_buffering>
        return; // prevent cycling indefinitely - let manage_heaters do their job
      }
      // The new command buffer could be updated non-atomically, because it is not yet considered
      // to be inside the active queue.
      sd_count.value = card.get_sdpos() - sdpos_atomic;
      cmdbuffer[bufindw] = CMDBUFFER_CURRENT_TYPE_SDCARD;
   115c4:	12 e0       	ldi	r17, 0x02	; 2
     || serial_char == '#'
     || serial_count >= (MAX_CMD_SIZE - 1)
     || n==-1
    ){
      if(serial_char=='#')
        stop_buffering=true;
   115c6:	01 e0       	ldi	r16, 0x01	; 1
    } lohi;
    uint16_t value;
  } sd_count;
  sd_count.value = 0;
  // Reads whole lines from the SD card. Never leaves a half-filled line in the cmdbuffer.
  while( !card.eof() && !stop_buffering) {
   115c8:	40 91 eb 16 	lds	r20, 0x16EB	; 0x8016eb <card+0x316>
   115cc:	50 91 ec 16 	lds	r21, 0x16EC	; 0x8016ec <card+0x317>
   115d0:	60 91 ed 16 	lds	r22, 0x16ED	; 0x8016ed <card+0x318>
   115d4:	70 91 ee 16 	lds	r23, 0x16EE	; 0x8016ee <card+0x319>
   115d8:	80 91 e4 16 	lds	r24, 0x16E4	; 0x8016e4 <card+0x30f>
   115dc:	90 91 e5 16 	lds	r25, 0x16E5	; 0x8016e5 <card+0x310>
   115e0:	a0 91 e6 16 	lds	r26, 0x16E6	; 0x8016e6 <card+0x311>
   115e4:	b0 91 e7 16 	lds	r27, 0x16E7	; 0x8016e7 <card+0x312>
   115e8:	48 17       	cp	r20, r24
   115ea:	59 07       	cpc	r21, r25
   115ec:	6a 07       	cpc	r22, r26
   115ee:	7b 07       	cpc	r23, r27
   115f0:	08 f0       	brcs	.+2      	; 0x115f4 <get_command()+0x6aa>
   115f2:	c1 c0       	rjmp	.+386    	; 0x11776 <get_command()+0x82c>
   115f4:	80 91 1d 03 	lds	r24, 0x031D	; 0x80031d <get_command()::stop_buffering>
   115f8:	81 11       	cpse	r24, r1
   115fa:	bd c0       	rjmp	.+378    	; 0x11776 <get_command()+0x82c>

  FORCE_INLINE bool isFileOpen() { return file.isOpen(); }
  bool eof() { return sdpos>=filesize; }
  FORCE_INLINE int16_t getFilteredGcodeChar()
  {
      int16_t c = (int16_t)file.readFilteredGcode();
   115fc:	0f 94 ef 6c 	call	0x2d9de	; 0x2d9de <SdFile::readFilteredGcode() [clone .constprop.218]>
  bool createContiguous(SdBaseFile* dirFile,
          const char* path, uint32_t size);
  /** \return The current cluster number for a file or directory. */
  uint32_t curCluster() const {return curCluster_;}
  /** \return The current position for a file or directory. */
  uint32_t curPosition() const {return curPosition_;}
   11600:	40 91 6f 16 	lds	r20, 0x166F	; 0x80166f <card+0x29a>
   11604:	50 91 70 16 	lds	r21, 0x1670	; 0x801670 <card+0x29b>
   11608:	60 91 71 16 	lds	r22, 0x1671	; 0x801671 <card+0x29c>
   1160c:	70 91 72 16 	lds	r23, 0x1672	; 0x801672 <card+0x29d>
      sdpos = file.curPosition();
   11610:	40 93 eb 16 	sts	0x16EB, r20	; 0x8016eb <card+0x316>
   11614:	50 93 ec 16 	sts	0x16EC, r21	; 0x8016ec <card+0x317>
   11618:	60 93 ed 16 	sts	0x16ED, r22	; 0x8016ed <card+0x318>
   1161c:	70 93 ee 16 	sts	0x16EE, r23	; 0x8016ee <card+0x319>
   11620:	20 91 47 10 	lds	r18, 0x1047	; 0x801047 <serial_count>
   11624:	30 91 48 10 	lds	r19, 0x1048	; 0x801048 <serial_count+0x1>
    int16_t n=card.getFilteredGcodeChar();
    char serial_char = (char)n;
    if( serial_char == '\n'
   11628:	8a 30       	cpi	r24, 0x0A	; 10
   1162a:	61 f0       	breq	.+24     	; 0x11644 <get_command()+0x6fa>
     || serial_char == '\r'
   1162c:	8d 30       	cpi	r24, 0x0D	; 13
   1162e:	51 f0       	breq	.+20     	; 0x11644 <get_command()+0x6fa>
     || serial_char == '#'
   11630:	83 32       	cpi	r24, 0x23	; 35
   11632:	09 f4       	brne	.+2      	; 0x11636 <get_command()+0x6ec>
   11634:	87 c0       	rjmp	.+270    	; 0x11744 <get_command()+0x7fa>
     || serial_count >= (MAX_CMD_SIZE - 1)
   11636:	2f 35       	cpi	r18, 0x5F	; 95
   11638:	31 05       	cpc	r19, r1
   1163a:	24 f4       	brge	.+8      	; 0x11644 <get_command()+0x6fa>
     || n==-1
   1163c:	8f 3f       	cpi	r24, 0xFF	; 255
   1163e:	98 07       	cpc	r25, r24
   11640:	09 f0       	breq	.+2      	; 0x11644 <get_command()+0x6fa>
   11642:	87 c0       	rjmp	.+270    	; 0x11752 <get_command()+0x808>
    ){
      if(serial_char=='#')
        stop_buffering=true;

      if(!serial_count)
   11644:	21 15       	cp	r18, r1
   11646:	31 05       	cpc	r19, r1
   11648:	09 f4       	brne	.+2      	; 0x1164c <get_command()+0x702>
   1164a:	41 cd       	rjmp	.-1406   	; 0x110ce <get_command()+0x184>
      return c;
  };
  void setIndex(long index) {sdpos = index;file.seekSetFilteredGcode(index);};
  FORCE_INLINE uint8_t percentDone(){if(!isFileOpen()) return 0; if(filesize) return sdpos/((filesize+99)/100); else return 0;};
  FORCE_INLINE char* getWorkDirName(){workDir.getFilename(filename);return filename;};
  FORCE_INLINE uint32_t get_sdpos() { if (!isFileOpen()) return 0; else return(sdpos); };
   1164c:	80 91 6a 16 	lds	r24, 0x166A	; 0x80166a <card+0x295>
   11650:	81 11       	cpse	r24, r1
   11652:	03 c0       	rjmp	.+6      	; 0x1165a <get_command()+0x710>
   11654:	40 e0       	ldi	r20, 0x00	; 0
   11656:	50 e0       	ldi	r21, 0x00	; 0
   11658:	ba 01       	movw	r22, r20
        // to the following non-empty line.
        return; // prevent cycling indefinitely - let manage_heaters do their job
      }
      // The new command buffer could be updated non-atomically, because it is not yet considered
      // to be inside the active queue.
      sd_count.value = card.get_sdpos() - sdpos_atomic;
   1165a:	80 91 49 12 	lds	r24, 0x1249	; 0x801249 <sdpos_atomic>
   1165e:	90 91 4a 12 	lds	r25, 0x124A	; 0x80124a <sdpos_atomic+0x1>
   11662:	48 1b       	sub	r20, r24
   11664:	59 0b       	sbc	r21, r25
      cmdbuffer[bufindw] = CMDBUFFER_CURRENT_TYPE_SDCARD;
   11666:	a0 91 49 10 	lds	r26, 0x1049	; 0x801049 <_ZL7bufindw.lto_priv.514>
   1166a:	b0 91 4a 10 	lds	r27, 0x104A	; 0x80104a <_ZL7bufindw.lto_priv.514+0x1>
   1166e:	fd 01       	movw	r30, r26
   11670:	e5 5b       	subi	r30, 0xB5	; 181
   11672:	ff 4e       	sbci	r31, 0xEF	; 239
   11674:	10 83       	st	Z, r17
      cmdbuffer[bufindw+1] = sd_count.lohi.lo;
   11676:	41 83       	std	Z+1, r20	; 0x01
      cmdbuffer[bufindw+2] = sd_count.lohi.hi;
   11678:	52 83       	std	Z+2, r21	; 0x02
   1167a:	13 96       	adiw	r26, 0x03	; 3
      cmdbuffer[bufindw+serial_count+CMDHDRSIZE] = 0; //terminate string
   1167c:	25 5b       	subi	r18, 0xB5	; 181
   1167e:	3f 4e       	sbci	r19, 0xEF	; 239
   11680:	f9 01       	movw	r30, r18
   11682:	ea 0f       	add	r30, r26
   11684:	fb 1f       	adc	r31, r27
   11686:	10 82       	st	Z, r1
      // Calculate the length before disabling the interrupts.
      uint8_t len = strlen(cmdbuffer+bufindw+CMDHDRSIZE) + (1 + CMDHDRSIZE);
   11688:	a5 5b       	subi	r26, 0xB5	; 181
   1168a:	bf 4e       	sbci	r27, 0xEF	; 239
   1168c:	fd 01       	movw	r30, r26
   1168e:	01 90       	ld	r0, Z+
   11690:	00 20       	and	r0, r0
   11692:	e9 f7       	brne	.-6      	; 0x1168e <get_command()+0x744>
   11694:	31 97       	sbiw	r30, 0x01	; 1
   11696:	ea 1b       	sub	r30, r26
   11698:	fb 0b       	sbc	r31, r27
//      MYSERIAL.print(cmdbuffer);
//      SERIAL_ECHOPGM("buflen:");
//      MYSERIAL.print(buflen+1);
      sd_count.value = 0;

      cli();
   1169a:	f8 94       	cli
      // This block locks the interrupts globally for 3.56 us,
      // which corresponds to a maximum repeat frequency of 280.70 kHz.
      // This blocking is safe in the context of a 10kHz stepper driver interrupt
      // or a 115200 Bd serial line receive interrupt, which will not trigger faster than 12kHz.
      ++ buflen;
   1169c:	80 91 3c 12 	lds	r24, 0x123C	; 0x80123c <buflen>
   116a0:	90 91 3d 12 	lds	r25, 0x123D	; 0x80123d <buflen+0x1>
   116a4:	01 96       	adiw	r24, 0x01	; 1
   116a6:	90 93 3d 12 	sts	0x123D, r25	; 0x80123d <buflen+0x1>
   116aa:	80 93 3c 12 	sts	0x123C, r24	; 0x80123c <buflen>
      cmdbuffer[bufindw] = CMDBUFFER_CURRENT_TYPE_SDCARD;
      cmdbuffer[bufindw+1] = sd_count.lohi.lo;
      cmdbuffer[bufindw+2] = sd_count.lohi.hi;
      cmdbuffer[bufindw+serial_count+CMDHDRSIZE] = 0; //terminate string
      // Calculate the length before disabling the interrupts.
      uint8_t len = strlen(cmdbuffer+bufindw+CMDHDRSIZE) + (1 + CMDHDRSIZE);
   116ae:	ec 5f       	subi	r30, 0xFC	; 252
      // This block locks the interrupts globally for 3.56 us,
      // which corresponds to a maximum repeat frequency of 280.70 kHz.
      // This blocking is safe in the context of a 10kHz stepper driver interrupt
      // or a 115200 Bd serial line receive interrupt, which will not trigger faster than 12kHz.
      ++ buflen;
      bufindw += len;
   116b0:	80 91 49 10 	lds	r24, 0x1049	; 0x801049 <_ZL7bufindw.lto_priv.514>
   116b4:	90 91 4a 10 	lds	r25, 0x104A	; 0x80104a <_ZL7bufindw.lto_priv.514+0x1>
   116b8:	e8 0f       	add	r30, r24
   116ba:	f9 2f       	mov	r31, r25
   116bc:	f1 1d       	adc	r31, r1
   116be:	f0 93 4a 10 	sts	0x104A, r31	; 0x80104a <_ZL7bufindw.lto_priv.514+0x1>
   116c2:	e0 93 49 10 	sts	0x1049, r30	; 0x801049 <_ZL7bufindw.lto_priv.514>
   116c6:	80 91 6a 16 	lds	r24, 0x166A	; 0x80166a <card+0x295>
   116ca:	88 23       	and	r24, r24
   116cc:	09 f4       	brne	.+2      	; 0x116d0 <get_command()+0x786>
   116ce:	3d c0       	rjmp	.+122    	; 0x1174a <get_command()+0x800>
   116d0:	80 91 eb 16 	lds	r24, 0x16EB	; 0x8016eb <card+0x316>
   116d4:	90 91 ec 16 	lds	r25, 0x16EC	; 0x8016ec <card+0x317>
   116d8:	a0 91 ed 16 	lds	r26, 0x16ED	; 0x8016ed <card+0x318>
   116dc:	b0 91 ee 16 	lds	r27, 0x16EE	; 0x8016ee <card+0x319>
      sdpos_atomic = card.get_sdpos();
   116e0:	80 93 49 12 	sts	0x1249, r24	; 0x801249 <sdpos_atomic>
   116e4:	90 93 4a 12 	sts	0x124A, r25	; 0x80124a <sdpos_atomic+0x1>
   116e8:	a0 93 4b 12 	sts	0x124B, r26	; 0x80124b <sdpos_atomic+0x2>
   116ec:	b0 93 4c 12 	sts	0x124C, r27	; 0x80124c <sdpos_atomic+0x3>
      if (bufindw == sizeof(cmdbuffer))
   116f0:	ed 3e       	cpi	r30, 0xED	; 237
   116f2:	f1 40       	sbci	r31, 0x01	; 1
   116f4:	21 f4       	brne	.+8      	; 0x116fe <get_command()+0x7b4>
          bufindw = 0;
   116f6:	10 92 4a 10 	sts	0x104A, r1	; 0x80104a <_ZL7bufindw.lto_priv.514+0x1>
   116fa:	10 92 49 10 	sts	0x1049, r1	; 0x801049 <_ZL7bufindw.lto_priv.514>
      sei();
   116fe:	78 94       	sei

      comment_mode = false; //for new command
   11700:	10 92 1e 03 	sts	0x031E, r1	; 0x80031e <comment_mode>
      serial_count = 0; //clear buffer
   11704:	10 92 48 10 	sts	0x1048, r1	; 0x801048 <serial_count+0x1>
   11708:	10 92 47 10 	sts	0x1047, r1	; 0x801047 <serial_count>

      if(card.eof()) break;
   1170c:	40 91 eb 16 	lds	r20, 0x16EB	; 0x8016eb <card+0x316>
   11710:	50 91 ec 16 	lds	r21, 0x16EC	; 0x8016ec <card+0x317>
   11714:	60 91 ed 16 	lds	r22, 0x16ED	; 0x8016ed <card+0x318>
   11718:	70 91 ee 16 	lds	r23, 0x16EE	; 0x8016ee <card+0x319>
   1171c:	80 91 e4 16 	lds	r24, 0x16E4	; 0x8016e4 <card+0x30f>
   11720:	90 91 e5 16 	lds	r25, 0x16E5	; 0x8016e5 <card+0x310>
   11724:	a0 91 e6 16 	lds	r26, 0x16E6	; 0x8016e6 <card+0x311>
   11728:	b0 91 e7 16 	lds	r27, 0x16E7	; 0x8016e7 <card+0x312>
   1172c:	48 17       	cp	r20, r24
   1172e:	59 07       	cpc	r21, r25
   11730:	6a 07       	cpc	r22, r26
   11732:	7b 07       	cpc	r23, r27
   11734:	00 f5       	brcc	.+64     	; 0x11776 <get_command()+0x82c>

      // The following line will reserve buffer space if available.
      if (! cmdqueue_could_enqueue_back(MAX_CMD_SIZE-1))
   11736:	8f e5       	ldi	r24, 0x5F	; 95
   11738:	90 e0       	ldi	r25, 0x00	; 0
   1173a:	0e 94 64 55 	call	0xaac8	; 0xaac8 <cmdqueue_could_enqueue_back(unsigned int)>
   1173e:	81 11       	cpse	r24, r1
   11740:	43 cf       	rjmp	.-378    	; 0x115c8 <get_command()+0x67e>
   11742:	c5 cc       	rjmp	.-1654   	; 0x110ce <get_command()+0x184>
     || serial_char == '#'
     || serial_count >= (MAX_CMD_SIZE - 1)
     || n==-1
    ){
      if(serial_char=='#')
        stop_buffering=true;
   11744:	00 93 1d 03 	sts	0x031D, r16	; 0x80031d <get_command()::stop_buffering>
   11748:	7d cf       	rjmp	.-262    	; 0x11644 <get_command()+0x6fa>
   1174a:	80 e0       	ldi	r24, 0x00	; 0
   1174c:	90 e0       	ldi	r25, 0x00	; 0
   1174e:	dc 01       	movw	r26, r24
   11750:	c7 cf       	rjmp	.-114    	; 0x116e0 <get_command()+0x796>
          return;
    }
    else
    {
        // there are no comments coming from the filtered file
        cmdbuffer[bufindw+CMDHDRSIZE+serial_count++] = serial_char;
   11752:	a9 01       	movw	r20, r18
   11754:	4f 5f       	subi	r20, 0xFF	; 255
   11756:	5f 4f       	sbci	r21, 0xFF	; 255
   11758:	50 93 48 10 	sts	0x1048, r21	; 0x801048 <serial_count+0x1>
   1175c:	40 93 47 10 	sts	0x1047, r20	; 0x801047 <serial_count>
   11760:	40 91 49 10 	lds	r20, 0x1049	; 0x801049 <_ZL7bufindw.lto_priv.514>
   11764:	50 91 4a 10 	lds	r21, 0x104A	; 0x80104a <_ZL7bufindw.lto_priv.514+0x1>
   11768:	45 5b       	subi	r20, 0xB5	; 181
   1176a:	5f 4e       	sbci	r21, 0xEF	; 239
   1176c:	24 0f       	add	r18, r20
   1176e:	35 1f       	adc	r19, r21
   11770:	f9 01       	movw	r30, r18
   11772:	83 83       	std	Z+3, r24	; 0x03
   11774:	29 cf       	rjmp	.-430    	; 0x115c8 <get_command()+0x67e>
    }
  }
  if(card.eof())
   11776:	40 91 eb 16 	lds	r20, 0x16EB	; 0x8016eb <card+0x316>
   1177a:	50 91 ec 16 	lds	r21, 0x16EC	; 0x8016ec <card+0x317>
   1177e:	60 91 ed 16 	lds	r22, 0x16ED	; 0x8016ed <card+0x318>
   11782:	70 91 ee 16 	lds	r23, 0x16EE	; 0x8016ee <card+0x319>
   11786:	80 91 e4 16 	lds	r24, 0x16E4	; 0x8016e4 <card+0x30f>
   1178a:	90 91 e5 16 	lds	r25, 0x16E5	; 0x8016e5 <card+0x310>
   1178e:	a0 91 e6 16 	lds	r26, 0x16E6	; 0x8016e6 <card+0x311>
   11792:	b0 91 e7 16 	lds	r27, 0x16E7	; 0x8016e7 <card+0x312>
   11796:	48 17       	cp	r20, r24
   11798:	59 07       	cpc	r21, r25
   1179a:	6a 07       	cpc	r22, r26
   1179c:	7b 07       	cpc	r23, r27
   1179e:	08 f4       	brcc	.+2      	; 0x117a2 <get_command()+0x858>
   117a0:	96 cc       	rjmp	.-1748   	; 0x110ce <get_command()+0x184>
  {
      // file was fully buffered, but commands might still need to be planned!
      // do *not* clear sdprinting until all SD commands are consumed to ensure
      // SD state can be resumed from a saved printing state. sdprinting is only
      // cleared by printingHasFinished after peforming all remaining moves.
      if(!cmdqueue_calc_sd_length())
   117a2:	0e 94 03 79 	call	0xf206	; 0xf206 <cmdqueue_calc_sd_length()>
   117a6:	89 2b       	or	r24, r25
   117a8:	09 f0       	breq	.+2      	; 0x117ac <get_command()+0x862>
   117aa:	91 cc       	rjmp	.-1758   	; 0x110ce <get_command()+0x184>
      {
          // queue is complete, but before we process EOF commands prevent
          // re-entry by disabling SD processing from any st_synchronize call
          card.closefile();
   117ac:	0f 94 f9 65 	call	0x2cbf2	; 0x2cbf2 <CardReader::closefile(bool) [clone .constprop.307]>

          SERIAL_PROTOCOLLNRPGM(_n("Done printing file"));////MSG_FILE_PRINTED
   117b0:	8a ea       	ldi	r24, 0xAA	; 170
   117b2:	92 e6       	ldi	r25, 0x62	; 98
   117b4:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
          char time[30];
          uint32_t t = print_job_timer.duration() / 60;
   117b8:	0f 94 6d 17 	call	0x22eda	; 0x22eda <Stopwatch::duration()>
   117bc:	6b 01       	movw	r12, r22
   117be:	7c 01       	movw	r14, r24
          int hours, minutes;
          minutes = t % 60;
          hours = t / 60;
          save_statistics();
   117c0:	0e 94 b0 64 	call	0xc960	; 0xc960 <save_statistics()>
          // re-entry by disabling SD processing from any st_synchronize call
          card.closefile();

          SERIAL_PROTOCOLLNRPGM(_n("Done printing file"));////MSG_FILE_PRINTED
          char time[30];
          uint32_t t = print_job_timer.duration() / 60;
   117c4:	8c e3       	ldi	r24, 0x3C	; 60
   117c6:	88 2e       	mov	r8, r24
   117c8:	91 2c       	mov	r9, r1
   117ca:	a1 2c       	mov	r10, r1
   117cc:	b1 2c       	mov	r11, r1
   117ce:	c7 01       	movw	r24, r14
   117d0:	b6 01       	movw	r22, r12
   117d2:	a5 01       	movw	r20, r10
   117d4:	94 01       	movw	r18, r8
   117d6:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
          int hours, minutes;
          minutes = t % 60;
   117da:	ca 01       	movw	r24, r20
   117dc:	b9 01       	movw	r22, r18
   117de:	a5 01       	movw	r20, r10
   117e0:	94 01       	movw	r18, r8
   117e2:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
          hours = t / 60;
          save_statistics();
          sprintf_P(time, PSTR("%i hours %i minutes"),hours, minutes);
   117e6:	7f 93       	push	r23
   117e8:	6f 93       	push	r22
          SERIAL_PROTOCOLLNRPGM(_n("Done printing file"));////MSG_FILE_PRINTED
          char time[30];
          uint32_t t = print_job_timer.duration() / 60;
          int hours, minutes;
          minutes = t % 60;
          hours = t / 60;
   117ea:	c7 01       	movw	r24, r14
   117ec:	b6 01       	movw	r22, r12
   117ee:	20 e1       	ldi	r18, 0x10	; 16
   117f0:	3e e0       	ldi	r19, 0x0E	; 14
   117f2:	40 e0       	ldi	r20, 0x00	; 0
   117f4:	50 e0       	ldi	r21, 0x00	; 0
   117f6:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
          save_statistics();
          sprintf_P(time, PSTR("%i hours %i minutes"),hours, minutes);
   117fa:	3f 93       	push	r19
   117fc:	2f 93       	push	r18
   117fe:	8c e9       	ldi	r24, 0x9C	; 156
   11800:	92 e7       	ldi	r25, 0x72	; 114
   11802:	9f 93       	push	r25
   11804:	8f 93       	push	r24
   11806:	8e 01       	movw	r16, r28
   11808:	0f 5f       	subi	r16, 0xFF	; 255
   1180a:	1f 4f       	sbci	r17, 0xFF	; 255
   1180c:	1f 93       	push	r17
   1180e:	0f 93       	push	r16
   11810:	0f 94 f7 a2 	call	0x345ee	; 0x345ee <sprintf_P>
          SERIAL_ECHO_START;
   11814:	8e ec       	ldi	r24, 0xCE	; 206
   11816:	91 ea       	ldi	r25, 0xA1	; 161
   11818:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
          SERIAL_ECHOLN(time);
   1181c:	c8 01       	movw	r24, r16
   1181e:	0e 94 a1 87 	call	0x10f42	; 0x10f42 <MarlinSerial::println(char const*)>
#ifndef SHOW_FILENAME_AFTER_FINISH
          lcd_setstatus(time);
   11822:	c8 01       	movw	r24, r16
   11824:	0e 94 e8 de 	call	0x1bdd0	; 0x1bdd0 <lcd_setstatus(char const*)>
#endif //SHOW_FILENAME_AFTER_FINISH
          card.printingHasFinished();
   11828:	0f 94 2b 73 	call	0x2e656	; 0x2e656 <CardReader::printingHasFinished() [clone .constprop.196]>
    if(!autostart_stilltocheck)
      return;
    if(autostart_atmillis.expired(5000))
      return;
  }
  autostart_stilltocheck = false;
   1182c:	10 92 56 02 	sts	0x0256, r1	; 0x800256 <_ZZN10CardReader14checkautostartEbE22autostart_stilltocheck.lto_priv.515>
  if(!mounted)
   11830:	0f b6       	in	r0, 0x3f	; 63
   11832:	f8 94       	cli
   11834:	de bf       	out	0x3e, r29	; 62
   11836:	0f be       	out	0x3f, r0	; 63
   11838:	cd bf       	out	0x3d, r28	; 61
   1183a:	80 91 d8 13 	lds	r24, 0x13D8	; 0x8013d8 <card+0x3>
   1183e:	88 23       	and	r24, r24
   11840:	59 f0       	breq	.+22     	; 0x11858 <get_command()+0x90e>
   11842:	0f 94 32 68 	call	0x2d064	; 0x2d064 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.242]>
          card.checkautostart(true);

          if (farm_mode)
   11846:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   1184a:	88 23       	and	r24, r24
   1184c:	09 f4       	brne	.+2      	; 0x11850 <get_command()+0x906>
   1184e:	3f cc       	rjmp	.-1922   	; 0x110ce <get_command()+0x184>
            prusa_statistics(6);
   11850:	86 e0       	ldi	r24, 0x06	; 6
   11852:	0f 94 79 32 	call	0x264f2	; 0x264f2 <prusa_statistics(unsigned char)>
   11856:	3b cc       	rjmp	.-1930   	; 0x110ce <get_command()+0x184>
  {
    mount();
   11858:	81 e0       	ldi	r24, 0x01	; 1
   1185a:	0f 94 6a 73 	call	0x2e6d4	; 0x2e6d4 <CardReader::mount(bool) [clone .constprop.192]>
    if(!mounted) //fail
   1185e:	80 91 d8 13 	lds	r24, 0x13D8	; 0x8013d8 <card+0x3>
   11862:	81 11       	cpse	r24, r1
   11864:	ee cf       	rjmp	.-36     	; 0x11842 <get_command()+0x8f8>
   11866:	ef cf       	rjmp	.-34     	; 0x11846 <get_command()+0x8fc>

00011868 <manage_inactivity(bool)>:
    }
}
#endif //SAFETYTIMER

void manage_inactivity(bool ignore_stepper_queue/*=false*/) //default argument set in Marlin.h
{
   11868:	0f 93       	push	r16
   1186a:	1f 93       	push	r17
   1186c:	cf 93       	push	r28
   1186e:	df 93       	push	r29
   11870:	c8 2f       	mov	r28, r24
    state = State::disabled;
    filter = 0;
}

bool PAT9125_sensor::update() {
    switch (state) {
   11872:	80 91 f1 16 	lds	r24, 0x16F1	; 0x8016f1 <fsensor>
   11876:	81 30       	cpi	r24, 0x01	; 1
   11878:	09 f4       	brne	.+2      	; 0x1187c <manage_inactivity(bool)+0x14>
   1187a:	49 c0       	rjmp	.+146    	; 0x1190e <manage_inactivity(bool)+0xa6>
   1187c:	82 30       	cpi	r24, 0x02	; 2
   1187e:	09 f4       	brne	.+2      	; 0x11882 <manage_inactivity(bool)+0x1a>
   11880:	5f c0       	rjmp	.+190    	; 0x11940 <manage_inactivity(bool)+0xd8>
 *
 * If safetytimer_inactive_time is zero, feature is disabled (heating is never turned off because of inactivity)
 */
static void handleSafetyTimer()
{
    if (printer_active() || !(CHECK_ALL_HEATERS) || !safetytimer_inactive_time)
   11882:	0e 94 91 66 	call	0xcd22	; 0xcd22 <printer_active()>
   11886:	81 11       	cpse	r24, r1
   11888:	ff c0       	rjmp	.+510    	; 0x11a88 <manage_inactivity(bool)+0x220>
   1188a:	80 91 5d 12 	lds	r24, 0x125D	; 0x80125d <target_temperature>
   1188e:	90 91 5e 12 	lds	r25, 0x125E	; 0x80125e <target_temperature+0x1>
   11892:	00 97       	sbiw	r24, 0x00	; 0
   11894:	39 f4       	brne	.+14     	; 0x118a4 <manage_inactivity(bool)+0x3c>
   11896:	20 91 59 12 	lds	r18, 0x1259	; 0x801259 <target_temperature_bed>
   1189a:	30 91 5a 12 	lds	r19, 0x125A	; 0x80125a <target_temperature_bed+0x1>
   1189e:	23 2b       	or	r18, r19
   118a0:	09 f4       	brne	.+2      	; 0x118a4 <manage_inactivity(bool)+0x3c>
   118a2:	f2 c0       	rjmp	.+484    	; 0x11a88 <manage_inactivity(bool)+0x220>
   118a4:	40 91 33 02 	lds	r20, 0x0233	; 0x800233 <safetytimer_inactive_time>
   118a8:	50 91 34 02 	lds	r21, 0x0234	; 0x800234 <safetytimer_inactive_time+0x1>
   118ac:	60 91 35 02 	lds	r22, 0x0235	; 0x800235 <safetytimer_inactive_time+0x2>
   118b0:	70 91 36 02 	lds	r23, 0x0236	; 0x800236 <safetytimer_inactive_time+0x3>
   118b4:	41 15       	cp	r20, r1
   118b6:	51 05       	cpc	r21, r1
   118b8:	61 05       	cpc	r22, r1
   118ba:	71 05       	cpc	r23, r1
   118bc:	09 f4       	brne	.+2      	; 0x118c0 <manage_inactivity(bool)+0x58>
   118be:	e4 c0       	rjmp	.+456    	; 0x11a88 <manage_inactivity(bool)+0x220>
    {
        safetyTimer.stop();
    }
    else if ((CHECK_ALL_HEATERS) && !safetyTimer.running())
   118c0:	89 2b       	or	r24, r25
   118c2:	31 f4       	brne	.+12     	; 0x118d0 <manage_inactivity(bool)+0x68>
   118c4:	80 91 59 12 	lds	r24, 0x1259	; 0x801259 <target_temperature_bed>
   118c8:	90 91 5a 12 	lds	r25, 0x125A	; 0x80125a <target_temperature_bed+0x1>
   118cc:	89 2b       	or	r24, r25
   118ce:	29 f0       	breq	.+10     	; 0x118da <manage_inactivity(bool)+0x72>
   118d0:	80 91 ad 05 	lds	r24, 0x05AD	; 0x8005ad <safetyTimer>
   118d4:	88 23       	and	r24, r24
   118d6:	09 f4       	brne	.+2      	; 0x118da <manage_inactivity(bool)+0x72>
   118d8:	3f c1       	rjmp	.+638    	; 0x11b58 <manage_inactivity(bool)+0x2f0>
    {
        safetyTimer.start();
    }
    else if (safetyTimer.expired(farm_mode?FARM_DEFAULT_SAFETYTIMER_TIME_ms:safetytimer_inactive_time))
   118da:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   118de:	88 23       	and	r24, r24
   118e0:	21 f0       	breq	.+8      	; 0x118ea <manage_inactivity(bool)+0x82>
   118e2:	40 ee       	ldi	r20, 0xE0	; 224
   118e4:	52 e3       	ldi	r21, 0x32	; 50
   118e6:	69 e2       	ldi	r22, 0x29	; 41
   118e8:	70 e0       	ldi	r23, 0x00	; 0
   118ea:	8d ea       	ldi	r24, 0xAD	; 173
   118ec:	95 e0       	ldi	r25, 0x05	; 5
   118ee:	0f 94 88 0e 	call	0x21d10	; 0x21d10 <Timer<unsigned long>::expired(unsigned long)>
   118f2:	88 23       	and	r24, r24
   118f4:	09 f4       	brne	.+2      	; 0x118f8 <manage_inactivity(bool)+0x90>
   118f6:	ca c0       	rjmp	.+404    	; 0x11a8c <manage_inactivity(bool)+0x224>
    {
        disable_heater();
   118f8:	0f 94 05 11 	call	0x2220a	; 0x2220a <disable_heater()>
        lcd_show_fullscreen_message_and_wait_P(_T(MSG_BED_HEATING_SAFETY_DISABLED));
   118fc:	80 e6       	ldi	r24, 0x60	; 96
   118fe:	96 e3       	ldi	r25, 0x36	; 54
   11900:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   11904:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
        lcd_return_to_status();
   11908:	0f 94 d5 07 	call	0x20faa	; 0x20faa <lcd_return_to_status()>
   1190c:	bf c0       	rjmp	.+382    	; 0x11a8c <manage_inactivity(bool)+0x224>
    case State::initializing:
        if (!updatePAT9125()) {
   1190e:	0f 94 8a 6e 	call	0x2dd14	; 0x2dd14 <PAT9125_sensor::updatePAT9125() [clone .constprop.202]>
   11912:	88 23       	and	r24, r24
   11914:	09 f4       	brne	.+2      	; 0x11918 <manage_inactivity(bool)+0xb0>
   11916:	b5 cf       	rjmp	.-150    	; 0x11882 <manage_inactivity(bool)+0x1a>
class PAT9125_sensor: public Filament_sensor {
public:
    void init();
    void deinit();
    bool update();
    bool getFilamentPresent() const { return filterFilPresent; }
   11918:	81 e0       	ldi	r24, 0x01	; 1
   1191a:	90 91 fe 16 	lds	r25, 0x16FE	; 0x8016fe <fsensor+0xd>
   1191e:	91 11       	cpse	r25, r1
   11920:	01 c0       	rjmp	.+2      	; 0x11924 <manage_inactivity(bool)+0xbc>
   11922:	80 e0       	ldi	r24, 0x00	; 0
            break; // still not stable. Stay in the initialization state.
        }
        oldFilamentPresent =
   11924:	80 93 f4 16 	sts	0x16F4, r24	; 0x8016f4 <fsensor+0x3>
            getFilamentPresent(); // initialize the current filament state so that we don't create a switching event right after the sensor is ready.
        oldPos = pat9125_y;
   11928:	80 91 38 0e 	lds	r24, 0x0E38	; 0x800e38 <pat9125_y>
   1192c:	90 91 39 0e 	lds	r25, 0x0E39	; 0x800e39 <pat9125_y+0x1>
   11930:	90 93 01 17 	sts	0x1701, r25	; 0x801701 <fsensor+0x10>
   11934:	80 93 00 17 	sts	0x1700, r24	; 0x801700 <fsensor+0xf>
        state = State::ready;
   11938:	82 e0       	ldi	r24, 0x02	; 2
   1193a:	80 93 f1 16 	sts	0x16F1, r24	; 0x8016f1 <fsensor>
   1193e:	a1 cf       	rjmp	.-190    	; 0x11882 <manage_inactivity(bool)+0x1a>
        break;
    case State::ready: {
        updatePAT9125();
   11940:	0f 94 8a 6e 	call	0x2dd14	; 0x2dd14 <PAT9125_sensor::updatePAT9125() [clone .constprop.202]>
        postponedLoadEvent = false;
   11944:	10 92 f5 16 	sts	0x16F5, r1	; 0x8016f5 <fsensor+0x4>
        sensorActionOnError = SensorActionOnError::_Continue;
    }
}

bool Filament_sensor::checkFilamentEvents() {
    if (state != State::ready)
   11948:	80 91 f1 16 	lds	r24, 0x16F1	; 0x8016f1 <fsensor>
   1194c:	82 30       	cpi	r24, 0x02	; 2
   1194e:	09 f0       	breq	.+2      	; 0x11952 <manage_inactivity(bool)+0xea>
   11950:	98 cf       	rjmp	.-208    	; 0x11882 <manage_inactivity(bool)+0x1a>
        return false;
    if (eventBlankingTimer.running() && !eventBlankingTimer.expired(100)) { // event blanking for 100ms
   11952:	80 91 f6 16 	lds	r24, 0x16F6	; 0x8016f6 <fsensor+0x5>
   11956:	81 11       	cpse	r24, r1
   11958:	40 c0       	rjmp	.+128    	; 0x119da <manage_inactivity(bool)+0x172>
   1195a:	d0 91 fe 16 	lds	r29, 0x16FE	; 0x8016fe <fsensor+0xd>
   1195e:	81 e0       	ldi	r24, 0x01	; 1
   11960:	d1 11       	cpse	r29, r1
   11962:	01 c0       	rjmp	.+2      	; 0x11966 <manage_inactivity(bool)+0xfe>
   11964:	80 e0       	ldi	r24, 0x00	; 0
        return false;
    }

    bool newFilamentPresent = fsensor.getFilamentPresent();
    if (oldFilamentPresent != newFilamentPresent) {
   11966:	90 91 f4 16 	lds	r25, 0x16F4	; 0x8016f4 <fsensor+0x3>
   1196a:	89 17       	cp	r24, r25
   1196c:	09 f4       	brne	.+2      	; 0x11970 <manage_inactivity(bool)+0x108>
   1196e:	89 cf       	rjmp	.-238    	; 0x11882 <manage_inactivity(bool)+0x1a>
        oldFilamentPresent = newFilamentPresent;
   11970:	80 93 f4 16 	sts	0x16F4, r24	; 0x8016f4 <fsensor+0x3>
        eventBlankingTimer.start();
   11974:	86 ef       	ldi	r24, 0xF6	; 246
   11976:	96 e1       	ldi	r25, 0x16	; 22
   11978:	0f 94 4e 0e 	call	0x21c9c	; 0x21c9c <Timer<unsigned short>::start()>
        if (newFilamentPresent) { // filament insertion
   1197c:	dd 23       	and	r29, r29
   1197e:	b1 f1       	breq	.+108    	; 0x119ec <manage_inactivity(bool)+0x184>
}

void Filament_sensor::triggerFilamentInserted() {
    if (autoLoadEnabled
        && (eFilamentAction == FilamentAction::None)
        && !(
   11980:	80 91 f2 16 	lds	r24, 0x16F2	; 0x8016f2 <fsensor+0x1>
   11984:	88 23       	and	r24, r24
   11986:	11 f1       	breq	.+68     	; 0x119cc <manage_inactivity(bool)+0x164>
    return false;
}

void Filament_sensor::triggerFilamentInserted() {
    if (autoLoadEnabled
        && (eFilamentAction == FilamentAction::None)
   11988:	80 91 94 03 	lds	r24, 0x0394	; 0x800394 <eFilamentAction>
   1198c:	81 11       	cpse	r24, r1
   1198e:	1e c0       	rjmp	.+60     	; 0x119cc <manage_inactivity(bool)+0x164>
        && !(
   11990:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   11994:	81 30       	cpi	r24, 0x01	; 1
   11996:	d1 f0       	breq	.+52     	; 0x119cc <manage_inactivity(bool)+0x164>
	return (block_buffer_head != block_buffer_tail);
}

//return the nr of buffered moves
FORCE_INLINE uint8_t moves_planned() {
    return (block_buffer_head + BLOCK_BUFFER_SIZE - block_buffer_tail) & (BLOCK_BUFFER_SIZE - 1);
   11998:	80 91 3e 0d 	lds	r24, 0x0D3E	; 0x800d3e <block_buffer_head>
   1199c:	90 91 3f 0d 	lds	r25, 0x0D3F	; 0x800d3f <block_buffer_tail>
   119a0:	89 1b       	sub	r24, r25
   119a2:	8f 70       	andi	r24, 0x0F	; 15
            MMU2::mmu2.Enabled() // quick and dirty hack to prevent spurious runouts while the MMU is in charge
            || moves_planned() != 0
   119a4:	99 f4       	brne	.+38     	; 0x119cc <manage_inactivity(bool)+0x164>
            || printJobOngoing()
   119a6:	0e 94 40 66 	call	0xcc80	; 0xcc80 <printJobOngoing()>
   119aa:	81 11       	cpse	r24, r1
   119ac:	0f c0       	rjmp	.+30     	; 0x119cc <manage_inactivity(bool)+0x164>
            || (lcd_commands_type == LcdCommands::Layer1Cal)
   119ae:	80 91 5e 0d 	lds	r24, 0x0D5E	; 0x800d5e <lcd_commands_type>
   119b2:	84 30       	cpi	r24, 0x04	; 4
   119b4:	59 f0       	breq	.+22     	; 0x119cc <manage_inactivity(bool)+0x164>
            || eeprom_read_byte((uint8_t *)EEPROM_WIZARD_ACTIVE)
   119b6:	8f e5       	ldi	r24, 0x5F	; 95
   119b8:	9f e0       	ldi	r25, 0x0F	; 15
   119ba:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
}

void Filament_sensor::triggerFilamentInserted() {
    if (autoLoadEnabled
        && (eFilamentAction == FilamentAction::None)
        && !(
   119be:	81 11       	cpse	r24, r1
   119c0:	05 c0       	rjmp	.+10     	; 0x119cc <manage_inactivity(bool)+0x164>
            || printJobOngoing()
            || (lcd_commands_type == LcdCommands::Layer1Cal)
            || eeprom_read_byte((uint8_t *)EEPROM_WIZARD_ACTIVE)
            )
        ) {
        menu_submenu(lcd_AutoLoadFilament, true);
   119c2:	61 e0       	ldi	r22, 0x01	; 1
   119c4:	80 e3       	ldi	r24, 0x30	; 48
   119c6:	98 e3       	ldi	r25, 0x38	; 56
   119c8:	0e 94 dd 62 	call	0xc5ba	; 0xc5ba <menu_submenu(void (*)(), bool)>
        oldFilamentPresent = newFilamentPresent;
        eventBlankingTimer.start();
        if (newFilamentPresent) { // filament insertion
//            puts_P(PSTR("filament inserted"));
            triggerFilamentInserted();
            postponedLoadEvent = true;
   119cc:	81 e0       	ldi	r24, 0x01	; 1
   119ce:	80 93 f5 16 	sts	0x16F5, r24	; 0x8016f5 <fsensor+0x4>

void manage_inactivity(bool ignore_stepper_queue/*=false*/) //default argument set in Marlin.h
{
#ifdef FILAMENT_SENSOR
    if (fsensor.update()) {
        lcd_draw_update = 1; //cause lcd update so that fsensor event polling can be done from the lcd draw routine.
   119d2:	81 e0       	ldi	r24, 0x01	; 1
   119d4:	80 93 59 02 	sts	0x0259, r24	; 0x800259 <lcd_draw_update>
   119d8:	54 cf       	rjmp	.-344    	; 0x11882 <manage_inactivity(bool)+0x1a>
}

bool Filament_sensor::checkFilamentEvents() {
    if (state != State::ready)
        return false;
    if (eventBlankingTimer.running() && !eventBlankingTimer.expired(100)) { // event blanking for 100ms
   119da:	64 e6       	ldi	r22, 0x64	; 100
   119dc:	70 e0       	ldi	r23, 0x00	; 0
   119de:	86 ef       	ldi	r24, 0xF6	; 246
   119e0:	96 e1       	ldi	r25, 0x16	; 22
   119e2:	0f 94 1f 0e 	call	0x21c3e	; 0x21c3e <Timer<unsigned short>::expired(unsigned short)>
   119e6:	81 11       	cpse	r24, r1
   119e8:	b8 cf       	rjmp	.-144    	; 0x1195a <manage_inactivity(bool)+0xf2>
   119ea:	4b cf       	rjmp	.-362    	; 0x11882 <manage_inactivity(bool)+0x1a>
        && (eFilamentAction == FilamentAction::None)
        && (
            moves_planned() != 0
            || printJobOngoing()
        )
        && !(
   119ec:	80 91 f3 16 	lds	r24, 0x16F3	; 0x8016f3 <fsensor+0x2>
   119f0:	88 23       	and	r24, r24
   119f2:	79 f3       	breq	.-34     	; 0x119d2 <manage_inactivity(bool)+0x16a>
}

void Filament_sensor::triggerFilamentRemoved() {
//    SERIAL_ECHOLNPGM("triggerFilamentRemoved");
    if (runoutEnabled
        && (eFilamentAction == FilamentAction::None)
   119f4:	80 91 94 03 	lds	r24, 0x0394	; 0x800394 <eFilamentAction>
   119f8:	81 11       	cpse	r24, r1
   119fa:	eb cf       	rjmp	.-42     	; 0x119d2 <manage_inactivity(bool)+0x16a>
   119fc:	80 91 3e 0d 	lds	r24, 0x0D3E	; 0x800d3e <block_buffer_head>
   11a00:	90 91 3f 0d 	lds	r25, 0x0D3F	; 0x800d3f <block_buffer_tail>
   11a04:	89 1b       	sub	r24, r25
   11a06:	8f 70       	andi	r24, 0x0F	; 15
        && (
   11a08:	21 f4       	brne	.+8      	; 0x11a12 <manage_inactivity(bool)+0x1aa>
            moves_planned() != 0
            || printJobOngoing()
   11a0a:	0e 94 40 66 	call	0xcc80	; 0xcc80 <printJobOngoing()>
   11a0e:	88 23       	and	r24, r24
   11a10:	01 f3       	breq	.-64     	; 0x119d2 <manage_inactivity(bool)+0x16a>
        )
        && !(
   11a12:	80 91 73 12 	lds	r24, 0x1273	; 0x801273 <saved_printing>
   11a16:	81 11       	cpse	r24, r1
   11a18:	dc cf       	rjmp	.-72     	; 0x119d2 <manage_inactivity(bool)+0x16a>
            saved_printing
            || MMU2::mmu2.Enabled() // quick and dirty hack to prevent spurious runouts just before the toolchange
   11a1a:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   11a1e:	81 30       	cpi	r24, 0x01	; 1
   11a20:	c1 f2       	breq	.-80     	; 0x119d2 <manage_inactivity(bool)+0x16a>
            || (lcd_commands_type == LcdCommands::Layer1Cal)
   11a22:	80 91 5e 0d 	lds	r24, 0x0D5E	; 0x800d5e <lcd_commands_type>
   11a26:	84 30       	cpi	r24, 0x04	; 4
   11a28:	a1 f2       	breq	.-88     	; 0x119d2 <manage_inactivity(bool)+0x16a>
            || eeprom_read_byte((uint8_t *)EEPROM_WIZARD_ACTIVE)
   11a2a:	8f e5       	ldi	r24, 0x5F	; 95
   11a2c:	9f e0       	ldi	r25, 0x0F	; 15
   11a2e:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
        && (eFilamentAction == FilamentAction::None)
        && (
            moves_planned() != 0
            || printJobOngoing()
        )
        && !(
   11a32:	81 11       	cpse	r24, r1
   11a34:	ce cf       	rjmp	.-100    	; 0x119d2 <manage_inactivity(bool)+0x16a>
}

//! @brief Send a notification to the host. Param 'message' must reside in program memory!
void sendHostNotification_P(const char* message)
{
    printf_P(MSG_HOST_ACTION_NOTIFICATION, message);
   11a36:	88 e7       	ldi	r24, 0x78	; 120
   11a38:	94 e6       	ldi	r25, 0x64	; 100
   11a3a:	9f 93       	push	r25
   11a3c:	8f 93       	push	r24
   11a3e:	8e e5       	ldi	r24, 0x5E	; 94
   11a40:	94 e6       	ldi	r25, 0x64	; 100
   11a42:	9f 93       	push	r25
   11a44:	8f 93       	push	r24
   11a46:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>


void Filament_sensor::filRunout() {
//    SERIAL_ECHOLNPGM("filRunout");
    sendHostNotification_P(MSG_FILAMENT_RUNOUT_DETECTED);
    runoutEnabled = false;
   11a4a:	10 92 f3 16 	sts	0x16F3, r1	; 0x8016f3 <fsensor+0x2>
    autoLoadEnabled = false;
   11a4e:	10 92 f2 16 	sts	0x16F2, r1	; 0x8016f2 <fsensor+0x1>
    stop_and_save_print_to_ram(0, 0);
   11a52:	60 e0       	ldi	r22, 0x00	; 0
   11a54:	70 e0       	ldi	r23, 0x00	; 0
   11a56:	cb 01       	movw	r24, r22
   11a58:	0f 94 06 66 	call	0x2cc0c	; 0x2cc0c <stop_and_save_print_to_ram(float, float) [clone .constprop.303]>
    restore_print_from_ram_and_continue(0);
   11a5c:	60 e0       	ldi	r22, 0x00	; 0
   11a5e:	70 e0       	ldi	r23, 0x00	; 0
   11a60:	cb 01       	movw	r24, r22
   11a62:	0e 94 b8 66 	call	0xcd70	; 0xcd70 <restore_print_from_ram_and_continue(float)>
    eeprom_increment_byte((uint8_t *)EEPROM_FERROR_COUNT);
   11a66:	85 e6       	ldi	r24, 0x65	; 101
   11a68:	9f e0       	ldi	r25, 0x0F	; 15
   11a6a:	0e 94 7c 78 	call	0xf0f8	; 0xf0f8 <eeprom_increment_byte(unsigned char*)>
    eeprom_increment_word((uint16_t *)EEPROM_FERROR_COUNT_TOT);
   11a6e:	81 e0       	ldi	r24, 0x01	; 1
   11a70:	9f e0       	ldi	r25, 0x0F	; 15
   11a72:	0e 94 6f 78 	call	0xf0de	; 0xf0de <eeprom_increment_word(unsigned int*)>
    enquecommand_front_P(MSG_M600);
   11a76:	8e e5       	ldi	r24, 0x5E	; 94
   11a78:	9c e6       	ldi	r25, 0x6C	; 108
   11a7a:	0f 94 78 67 	call	0x2cef0	; 0x2cef0 <enquecommand_front(char const*, bool) [clone .constprop.294]>
   11a7e:	0f 90       	pop	r0
   11a80:	0f 90       	pop	r0
   11a82:	0f 90       	pop	r0
   11a84:	0f 90       	pop	r0
   11a86:	a5 cf       	rjmp	.-182    	; 0x119d2 <manage_inactivity(bool)+0x16a>
    inline constexpr Timer()
    : m_isRunning(false)
    , m_started(0) {};

    void start();
    void stop(){m_isRunning = false;}
   11a88:	10 92 ad 05 	sts	0x05AD, r1	; 0x8005ad <safetyTimer>
#if defined(KILL_PIN) && KILL_PIN > -1
	static int killCount = 0;   // make the inactivity button a bit less responsive
   const int KILL_DELAY = 10000;
#endif

    if(buflen < (BUFSIZE-1)){
   11a8c:	80 91 3c 12 	lds	r24, 0x123C	; 0x80123c <buflen>
   11a90:	90 91 3d 12 	lds	r25, 0x123D	; 0x80123d <buflen+0x1>
   11a94:	03 97       	sbiw	r24, 0x03	; 3
   11a96:	14 f4       	brge	.+4      	; 0x11a9c <manage_inactivity(bool)+0x234>
        get_command();
   11a98:	0e 94 a5 87 	call	0x10f4a	; 0x10f4a <get_command()>
  return(block);
}

// Returns true if the buffer has a queued block, false otherwise
FORCE_INLINE bool blocks_queued() {
	return (block_buffer_head != block_buffer_tail);
   11a9c:	90 91 3e 0d 	lds	r25, 0x0D3E	; 0x800d3e <block_buffer_head>
   11aa0:	80 91 3f 0d 	lds	r24, 0x0D3F	; 0x800d3f <block_buffer_tail>
    }

    if (blocks_queued() && GetPrinterState() == PrinterState::IsHostPrinting && usb_timer.expired((USB_TIMER_TIMEOUT) / 2))
   11aa4:	98 17       	cp	r25, r24
   11aa6:	81 f0       	breq	.+32     	; 0x11ac8 <manage_inactivity(bool)+0x260>
   11aa8:	80 91 61 0d 	lds	r24, 0x0D61	; 0x800d61 <_ZL13printer_state.lto_priv.386>
   11aac:	86 30       	cpi	r24, 0x06	; 6
   11aae:	61 f4       	brne	.+24     	; 0x11ac8 <manage_inactivity(bool)+0x260>
   11ab0:	68 e8       	ldi	r22, 0x88	; 136
   11ab2:	73 e1       	ldi	r23, 0x13	; 19
   11ab4:	82 e4       	ldi	r24, 0x42	; 66
   11ab6:	92 e1       	ldi	r25, 0x12	; 18
   11ab8:	0f 94 1f 0e 	call	0x21c3e	; 0x21c3e <Timer<unsigned short>::expired(unsigned short)>
   11abc:	88 23       	and	r24, r24
   11abe:	21 f0       	breq	.+8      	; 0x11ac8 <manage_inactivity(bool)+0x260>
    {
        // Handle the case where planned moves may take a longer time to execute than the USB timer period.
        // An example is the toolchange unload sequence generated by PrusaSlicer with default settings.
        usb_timer.start();
   11ac0:	82 e4       	ldi	r24, 0x42	; 66
   11ac2:	92 e1       	ldi	r25, 0x12	; 18
   11ac4:	0f 94 4e 0e 	call	0x21c9c	; 0x21c9c <Timer<unsigned short>::start()>
    }

  if(max_inactive_time && previous_millis_cmd.expired(max_inactive_time))
   11ac8:	40 91 44 03 	lds	r20, 0x0344	; 0x800344 <max_inactive_time>
   11acc:	50 91 45 03 	lds	r21, 0x0345	; 0x800345 <max_inactive_time+0x1>
   11ad0:	60 91 46 03 	lds	r22, 0x0346	; 0x800346 <max_inactive_time+0x2>
   11ad4:	70 91 47 03 	lds	r23, 0x0347	; 0x800347 <max_inactive_time+0x3>
   11ad8:	41 15       	cp	r20, r1
   11ada:	51 05       	cpc	r21, r1
   11adc:	61 05       	cpc	r22, r1
   11ade:	71 05       	cpc	r23, r1
   11ae0:	09 f0       	breq	.+2      	; 0x11ae4 <manage_inactivity(bool)+0x27c>
   11ae2:	3f c0       	rjmp	.+126    	; 0x11b62 <manage_inactivity(bool)+0x2fa>
    kill(PSTR("Inactivity Shutdown"));
  if(stepper_inactive_time && previous_millis_cmd.expired(stepper_inactive_time)) {
   11ae4:	40 91 37 02 	lds	r20, 0x0237	; 0x800237 <stepper_inactive_time>
   11ae8:	50 91 38 02 	lds	r21, 0x0238	; 0x800238 <stepper_inactive_time+0x1>
   11aec:	60 91 39 02 	lds	r22, 0x0239	; 0x800239 <stepper_inactive_time+0x2>
   11af0:	70 91 3a 02 	lds	r23, 0x023A	; 0x80023a <stepper_inactive_time+0x3>
   11af4:	41 15       	cp	r20, r1
   11af6:	51 05       	cpc	r21, r1
   11af8:	61 05       	cpc	r22, r1
   11afa:	71 05       	cpc	r23, r1
   11afc:	a9 f0       	breq	.+42     	; 0x11b28 <manage_inactivity(bool)+0x2c0>
   11afe:	88 e4       	ldi	r24, 0x48	; 72
   11b00:	93 e0       	ldi	r25, 0x03	; 3
   11b02:	0f 94 88 0e 	call	0x21d10	; 0x21d10 <Timer<unsigned long>::expired(unsigned long)>
   11b06:	88 23       	and	r24, r24
   11b08:	79 f0       	breq	.+30     	; 0x11b28 <manage_inactivity(bool)+0x2c0>
   11b0a:	90 91 3e 0d 	lds	r25, 0x0D3E	; 0x800d3e <block_buffer_head>
   11b0e:	80 91 3f 0d 	lds	r24, 0x0D3F	; 0x800d3f <block_buffer_tail>
    if(blocks_queued() == false && ignore_stepper_queue == false) {
   11b12:	98 13       	cpse	r25, r24
   11b14:	09 c0       	rjmp	.+18     	; 0x11b28 <manage_inactivity(bool)+0x2c0>
   11b16:	c1 11       	cpse	r28, r1
   11b18:	07 c0       	rjmp	.+14     	; 0x11b28 <manage_inactivity(bool)+0x2c0>
      disable_x();
   11b1a:	17 9a       	sbi	0x02, 7	; 2
   11b1c:	10 92 39 06 	sts	0x0639, r1	; 0x800639 <axis_known_position>
      disable_y();
   11b20:	16 9a       	sbi	0x02, 6	; 2
   11b22:	10 92 3a 06 	sts	0x063A, r1	; 0x80063a <axis_known_position+0x1>
      disable_z();
      disable_e0();
   11b26:	14 9a       	sbi	0x02, 4	; 2
{
  uint8_t x_active = 0;
  uint8_t y_active = 0;
  uint8_t z_active = 0;
  uint8_t e_active = 0;
  uint8_t tail_fan_speed = fanSpeed;
   11b28:	c0 91 55 12 	lds	r28, 0x1255	; 0x801255 <fanSpeed>
  block_t *block;

  if(block_buffer_tail != block_buffer_head)
   11b2c:	90 91 3f 0d 	lds	r25, 0x0D3F	; 0x800d3f <block_buffer_tail>
   11b30:	80 91 3e 0d 	lds	r24, 0x0D3E	; 0x800d3e <block_buffer_head>
   11b34:	98 17       	cp	r25, r24
   11b36:	01 f1       	breq	.+64     	; 0x11b78 <manage_inactivity(bool)+0x310>
  {
    uint8_t block_index = block_buffer_tail;
   11b38:	80 91 3f 0d 	lds	r24, 0x0D3F	; 0x800d3f <block_buffer_tail>
    tail_fan_speed = block_buffer[block_index].fan_speed;
   11b3c:	9e e6       	ldi	r25, 0x6E	; 110
   11b3e:	89 9f       	mul	r24, r25
   11b40:	f0 01       	movw	r30, r0
   11b42:	11 24       	eor	r1, r1
   11b44:	ec 55       	subi	r30, 0x5C	; 92
   11b46:	f9 4f       	sbci	r31, 0xF9	; 249
   11b48:	c0 81       	ld	r28, Z
    while(block_index != block_buffer_head)
   11b4a:	90 91 3e 0d 	lds	r25, 0x0D3E	; 0x800d3e <block_buffer_head>
   11b4e:	98 17       	cp	r25, r24
   11b50:	99 f0       	breq	.+38     	; 0x11b78 <manage_inactivity(bool)+0x310>
      block = &block_buffer[block_index];
      if(block->steps[X_AXIS].wide != 0) x_active++;
      if(block->steps[Y_AXIS].wide != 0) y_active++;
      if(block->steps[Z_AXIS].wide != 0) z_active++;
      if(block->steps[E_AXIS].wide != 0) e_active++;
      block_index = (block_index+1) & (BLOCK_BUFFER_SIZE - 1);
   11b52:	8f 5f       	subi	r24, 0xFF	; 255
   11b54:	8f 70       	andi	r24, 0x0F	; 15
   11b56:	f9 cf       	rjmp	.-14     	; 0x11b4a <manage_inactivity(bool)+0x2e2>
    {
        safetyTimer.stop();
    }
    else if ((CHECK_ALL_HEATERS) && !safetyTimer.running())
    {
        safetyTimer.start();
   11b58:	8d ea       	ldi	r24, 0xAD	; 173
   11b5a:	95 e0       	ldi	r25, 0x05	; 5
   11b5c:	0f 94 47 10 	call	0x2208e	; 0x2208e <Timer<unsigned long>::start()>
   11b60:	95 cf       	rjmp	.-214    	; 0x11a8c <manage_inactivity(bool)+0x224>
        // Handle the case where planned moves may take a longer time to execute than the USB timer period.
        // An example is the toolchange unload sequence generated by PrusaSlicer with default settings.
        usb_timer.start();
    }

  if(max_inactive_time && previous_millis_cmd.expired(max_inactive_time))
   11b62:	88 e4       	ldi	r24, 0x48	; 72
   11b64:	93 e0       	ldi	r25, 0x03	; 3
   11b66:	0f 94 88 0e 	call	0x21d10	; 0x21d10 <Timer<unsigned long>::expired(unsigned long)>
   11b6a:	88 23       	and	r24, r24
   11b6c:	09 f4       	brne	.+2      	; 0x11b70 <manage_inactivity(bool)+0x308>
   11b6e:	ba cf       	rjmp	.-140    	; 0x11ae4 <manage_inactivity(bool)+0x27c>
    kill(PSTR("Inactivity Shutdown"));
   11b70:	8a ee       	ldi	r24, 0xEA	; 234
   11b72:	97 e7       	ldi	r25, 0x77	; 119
   11b74:	0e 94 23 83 	call	0x10646	; 0x10646 <kill(char const*)>
  if((DISABLE_Z) && (z_active == 0)) disable_z();
  if((DISABLE_E) && (e_active == 0)) disable_e0();
#if defined(FAN_PIN) && FAN_PIN > -1
  #ifdef FAN_KICKSTART_TIME
    static unsigned long fan_kick_end;
    if (tail_fan_speed) {
   11b78:	cc 23       	and	r28, r28
   11b7a:	09 f4       	brne	.+2      	; 0x11b7e <manage_inactivity(bool)+0x316>
   11b7c:	be c0       	rjmp	.+380    	; 0x11cfa <manage_inactivity(bool)+0x492>
      if (fan_kick_end == 0) {
   11b7e:	80 91 3f 03 	lds	r24, 0x033F	; 0x80033f <check_axes_activity()::fan_kick_end>
   11b82:	90 91 40 03 	lds	r25, 0x0340	; 0x800340 <check_axes_activity()::fan_kick_end+0x1>
   11b86:	a0 91 41 03 	lds	r26, 0x0341	; 0x800341 <check_axes_activity()::fan_kick_end+0x2>
   11b8a:	b0 91 42 03 	lds	r27, 0x0342	; 0x800342 <check_axes_activity()::fan_kick_end+0x3>
   11b8e:	89 2b       	or	r24, r25
   11b90:	8a 2b       	or	r24, r26
   11b92:	8b 2b       	or	r24, r27
   11b94:	81 f4       	brne	.+32     	; 0x11bb6 <manage_inactivity(bool)+0x34e>
        // Just starting up fan - run at full power.
        fan_kick_end = _millis() + FAN_KICKSTART_TIME;
   11b96:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   11b9a:	60 5e       	subi	r22, 0xE0	; 224
   11b9c:	7c 4f       	sbci	r23, 0xFC	; 252
   11b9e:	8f 4f       	sbci	r24, 0xFF	; 255
   11ba0:	9f 4f       	sbci	r25, 0xFF	; 255
   11ba2:	60 93 3f 03 	sts	0x033F, r22	; 0x80033f <check_axes_activity()::fan_kick_end>
   11ba6:	70 93 40 03 	sts	0x0340, r23	; 0x800340 <check_axes_activity()::fan_kick_end+0x1>
   11baa:	80 93 41 03 	sts	0x0341, r24	; 0x800341 <check_axes_activity()::fan_kick_end+0x2>
   11bae:	90 93 42 03 	sts	0x0342, r25	; 0x800342 <check_axes_activity()::fan_kick_end+0x3>
        tail_fan_speed = 255;
      } else if (fan_kick_end > _millis())
        // Fan still spinning up.
        tail_fan_speed = 255;
   11bb2:	cf ef       	ldi	r28, 0xFF	; 255
   11bb4:	0f c0       	rjmp	.+30     	; 0x11bd4 <manage_inactivity(bool)+0x36c>
    if (tail_fan_speed) {
      if (fan_kick_end == 0) {
        // Just starting up fan - run at full power.
        fan_kick_end = _millis() + FAN_KICKSTART_TIME;
        tail_fan_speed = 255;
      } else if (fan_kick_end > _millis())
   11bb6:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   11bba:	00 91 3f 03 	lds	r16, 0x033F	; 0x80033f <check_axes_activity()::fan_kick_end>
   11bbe:	10 91 40 03 	lds	r17, 0x0340	; 0x800340 <check_axes_activity()::fan_kick_end+0x1>
   11bc2:	20 91 41 03 	lds	r18, 0x0341	; 0x800341 <check_axes_activity()::fan_kick_end+0x2>
   11bc6:	30 91 42 03 	lds	r19, 0x0342	; 0x800342 <check_axes_activity()::fan_kick_end+0x3>
   11bca:	60 17       	cp	r22, r16
   11bcc:	71 07       	cpc	r23, r17
   11bce:	82 07       	cpc	r24, r18
   11bd0:	93 07       	cpc	r25, r19
   11bd2:	78 f3       	brcs	.-34     	; 0x11bb2 <manage_inactivity(bool)+0x34a>
    } else {
      fan_kick_end = 0;
    }
  #endif//FAN_KICKSTART_TIME
  #ifdef FAN_SOFT_PWM
	if (fan_measuring) { //if measurement is currently in process, fanSpeedSoftPwm must remain set to 255, but we must update fanSpeedBckp value
   11bd4:	80 91 b6 03 	lds	r24, 0x03B6	; 0x8003b6 <fan_measuring>
   11bd8:	88 23       	and	r24, r24
   11bda:	09 f4       	brne	.+2      	; 0x11bde <manage_inactivity(bool)+0x376>
   11bdc:	97 c0       	rjmp	.+302    	; 0x11d0c <manage_inactivity(bool)+0x4a4>
		fanSpeedBckp = tail_fan_speed;
   11bde:	c0 93 65 02 	sts	0x0265, r28	; 0x800265 <fanSpeedBckp>
void MMU2::mmu_loop() {
    // We only leave this method if the current command was successfully completed - that's the Marlin's way of blocking operation
    // Atomic compare_exchange would have been the most appropriate solution here, but this gets called only in Marlin's task,
    // so thread safety should be kept
    static bool avoidRecursion = false;
    if (avoidRecursion) {
   11be2:	80 91 5f 04 	lds	r24, 0x045F	; 0x80045f <_ZZN4MMU24MMU28mmu_loopEvE14avoidRecursion.lto_priv.503>
   11be6:	81 11       	cpse	r24, r1
   11be8:	07 c0       	rjmp	.+14     	; 0x11bf8 <manage_inactivity(bool)+0x390>
        return;
    }
    avoidRecursion = true;
   11bea:	81 e0       	ldi	r24, 0x01	; 1
   11bec:	80 93 5f 04 	sts	0x045F, r24	; 0x80045f <_ZZN4MMU24MMU28mmu_loopEvE14avoidRecursion.lto_priv.503>
    mmu_loop_inner(true);
   11bf0:	0f 94 38 97 	call	0x32e70	; 0x32e70 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]>
    avoidRecursion = false;
   11bf4:	10 92 5f 04 	sts	0x045F, r1	; 0x80045f <_ZZN4MMU24MMU28mmu_loopEvE14avoidRecursion.lto_priv.503>
  lcd_draw_update = 2;
  lcd_beeper_quick_feedback();
}

void lcd_knob_update() {
	if (lcd_backlight_wake_trigger) {
   11bf8:	80 91 a6 05 	lds	r24, 0x05A6	; 0x8005a6 <_ZL26lcd_backlight_wake_trigger.lto_priv.501>
   11bfc:	88 23       	and	r24, r24
   11bfe:	c9 f1       	breq	.+114    	; 0x11c72 <manage_inactivity(bool)+0x40a>
		lcd_backlight_wake_trigger = false;
   11c00:	10 92 a6 05 	sts	0x05A6, r1	; 0x8005a6 <_ZL26lcd_backlight_wake_trigger.lto_priv.501>
		backlight_wake();
		bool did_rotate = false;
		ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
   11c04:	4f b7       	in	r20, 0x3f	; 63
    return 1;
}

static __inline__ uint8_t __iCliRetVal(void)
{
    cli();
   11c06:	f8 94       	cli
			if (abs(lcd_encoder_diff) >= ENCODER_PULSES_PER_STEP) {
   11c08:	80 91 a4 05 	lds	r24, 0x05A4	; 0x8005a4 <_ZL16lcd_encoder_diff.lto_priv.502>
   11c0c:	28 2f       	mov	r18, r24
   11c0e:	08 2e       	mov	r0, r24
   11c10:	00 0c       	add	r0, r0
   11c12:	33 0b       	sbc	r19, r19
   11c14:	37 ff       	sbrs	r19, 7
   11c16:	03 c0       	rjmp	.+6      	; 0x11c1e <manage_inactivity(bool)+0x3b6>
   11c18:	31 95       	neg	r19
   11c1a:	21 95       	neg	r18
   11c1c:	31 09       	sbc	r19, r1
   11c1e:	24 30       	cpi	r18, 0x04	; 4
   11c20:	31 05       	cpc	r19, r1
   11c22:	0c f4       	brge	.+2      	; 0x11c26 <manage_inactivity(bool)+0x3be>
   11c24:	76 c0       	rjmp	.+236    	; 0x11d12 <manage_inactivity(bool)+0x4aa>
				lcd_encoder += lcd_encoder_diff / ENCODER_PULSES_PER_STEP;
   11c26:	98 2f       	mov	r25, r24
   11c28:	87 ff       	sbrs	r24, 7
   11c2a:	02 c0       	rjmp	.+4      	; 0x11c30 <manage_inactivity(bool)+0x3c8>
   11c2c:	93 e0       	ldi	r25, 0x03	; 3
   11c2e:	98 0f       	add	r25, r24
   11c30:	95 95       	asr	r25
   11c32:	95 95       	asr	r25
   11c34:	20 91 1e 06 	lds	r18, 0x061E	; 0x80061e <lcd_encoder>
   11c38:	30 91 1f 06 	lds	r19, 0x061F	; 0x80061f <lcd_encoder+0x1>
   11c3c:	29 0f       	add	r18, r25
   11c3e:	31 1d       	adc	r19, r1
   11c40:	97 fd       	sbrc	r25, 7
   11c42:	3a 95       	dec	r19
   11c44:	30 93 1f 06 	sts	0x061F, r19	; 0x80061f <lcd_encoder+0x1>
   11c48:	20 93 1e 06 	sts	0x061E, r18	; 0x80061e <lcd_encoder>
				lcd_encoder_diff %= ENCODER_PULSES_PER_STEP;
   11c4c:	83 78       	andi	r24, 0x83	; 131
   11c4e:	87 ff       	sbrs	r24, 7
   11c50:	03 c0       	rjmp	.+6      	; 0x11c58 <manage_inactivity(bool)+0x3f0>
   11c52:	81 50       	subi	r24, 0x01	; 1
   11c54:	8c 6f       	ori	r24, 0xFC	; 252
   11c56:	8f 5f       	subi	r24, 0xFF	; 255
   11c58:	80 93 a4 05 	sts	0x05A4, r24	; 0x8005a4 <_ZL16lcd_encoder_diff.lto_priv.502>
    (void)__s;
}

static __inline__ void __iRestore(const  uint8_t *__s)
{
    SREG = *__s;
   11c5c:	4f bf       	out	0x3f, r20	; 63
				// Get lcd_encoder_diff in sync with the encoder hard steps.
				// We assume that a click happens only when the knob is rotated into a stable position
				lcd_encoder_diff = 0;
			}
		}
		Sound_MakeSound(did_rotate ? e_SOUND_TYPE_EncoderMove : e_SOUND_TYPE_ButtonEcho);
   11c5e:	86 e0       	ldi	r24, 0x06	; 6
   11c60:	0f 94 ad 25 	call	0x24b5a	; 0x24b5a <Sound_MakeSound(eSOUND_TYPE)>

		if (lcd_draw_update == 0) {
   11c64:	80 91 59 02 	lds	r24, 0x0259	; 0x800259 <lcd_draw_update>
   11c68:	81 11       	cpse	r24, r1
   11c6a:	03 c0       	rjmp	.+6      	; 0x11c72 <manage_inactivity(bool)+0x40a>
			// Update LCD rendering at minimum
			lcd_draw_update = 1;
   11c6c:	81 e0       	ldi	r24, 0x01	; 1
   11c6e:	80 93 59 02 	sts	0x0259, r24	; 0x800259 <lcd_draw_update>

  lcd_knob_update();
  backlight_update();

  // handle longpress
  if(lcd_longpress_trigger)
   11c72:	80 91 a7 05 	lds	r24, 0x05A7	; 0x8005a7 <lcd_longpress_trigger>
   11c76:	88 23       	and	r24, r24
   11c78:	61 f0       	breq	.+24     	; 0x11c92 <manage_inactivity(bool)+0x42a>
  {
      lcd_consume_click(); // Reset trigger to prevent recursion
   11c7a:	0e 94 70 73 	call	0xe6e0	; 0xe6e0 <lcd_consume_click()>
      // long press is not possible in modal mode, wait until ready
      if (lcd_longpress_func && lcd_update_enabled)
   11c7e:	e0 91 06 04 	lds	r30, 0x0406	; 0x800406 <lcd_longpress_func>
   11c82:	f0 91 07 04 	lds	r31, 0x0407	; 0x800407 <lcd_longpress_func+0x1>
   11c86:	30 97       	sbiw	r30, 0x00	; 0
   11c88:	21 f0       	breq	.+8      	; 0x11c92 <manage_inactivity(bool)+0x42a>
   11c8a:	80 91 5a 02 	lds	r24, 0x025A	; 0x80025a <lcd_update_enabled>
   11c8e:	81 11       	cpse	r24, r1
      {
          lcd_longpress_func();
   11c90:	19 95       	eicall
        }
    }

    inline void TimerStart() { auto_report_timer.start(); }
    inline bool TimerRunning()const { return auto_report_timer.running(); }
    inline bool TimerExpired() { return auto_report_timer.expired(auto_report_period * 1000ul); }
   11c92:	20 91 cf 13 	lds	r18, 0x13CF	; 0x8013cf <autoReportFeatures+0x1>
   11c96:	30 e0       	ldi	r19, 0x00	; 0
   11c98:	a8 ee       	ldi	r26, 0xE8	; 232
   11c9a:	b3 e0       	ldi	r27, 0x03	; 3
   11c9c:	0f 94 80 a4 	call	0x34900	; 0x34900 <__umulhisi3>
   11ca0:	ab 01       	movw	r20, r22
   11ca2:	bc 01       	movw	r22, r24
   11ca4:	80 ed       	ldi	r24, 0xD0	; 208
   11ca6:	93 e1       	ldi	r25, 0x13	; 19
   11ca8:	0f 94 88 0e 	call	0x21d10	; 0x21d10 <Timer<unsigned long>::expired(unsigned long)>
 * Output autoreport values according to features requested in M155
 */
#if defined(AUTO_REPORT)
void host_autoreport()
{
    if (autoReportFeatures.TimerExpired())
   11cac:	88 23       	and	r24, r24
   11cae:	99 f0       	breq	.+38     	; 0x11cd6 <manage_inactivity(bool)+0x46e>
   11cb0:	80 91 ce 13 	lds	r24, 0x13CE	; 0x8013ce <autoReportFeatures>
    {
        if(autoReportFeatures.Temp()){
   11cb4:	80 fd       	sbrc	r24, 0
            gcode_M105();
   11cb6:	0e 94 36 7c 	call	0xf86c	; 0xf86c <gcode_M105()>
   11cba:	80 91 ce 13 	lds	r24, 0x13CE	; 0x8013ce <autoReportFeatures>
        }
        if(autoReportFeatures.Pos()){
   11cbe:	82 fd       	sbrc	r24, 2
            gcode_M114();
   11cc0:	0e 94 bb 7b 	call	0xf776	; 0xf776 <gcode_M114()>
   11cc4:	80 91 ce 13 	lds	r24, 0x13CE	; 0x8013ce <autoReportFeatures>
        }
#if defined(AUTO_REPORT) && (defined(FANCHECK) && (((defined(TACH_0) && (TACH_0 >-1)) || (defined(TACH_1) && (TACH_1 > -1)))))
        if(autoReportFeatures.Fans()){
   11cc8:	81 fd       	sbrc	r24, 1
            gcode_M123();
   11cca:	0e 94 15 65 	call	0xca2a	; 0xca2a <gcode_M123()>
        } else{
          auto_report_timer.stop();
        }
    }

    inline void TimerStart() { auto_report_timer.start(); }
   11cce:	80 ed       	ldi	r24, 0xD0	; 208
   11cd0:	93 e1       	ldi	r25, 0x13	; 19
   11cd2:	0f 94 47 10 	call	0x2208e	; 0x2208e <Timer<unsigned long>::start()>
*/
void host_keepalive() {
#ifndef HOST_KEEPALIVE_FEATURE
  return;
#endif //HOST_KEEPALIVE_FEATURE
  if (farm_mode) return;
   11cd6:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   11cda:	81 11       	cpse	r24, r1
   11cdc:	02 c0       	rjmp	.+4      	; 0x11ce2 <manage_inactivity(bool)+0x47a>
   11cde:	0e 94 c1 7c 	call	0xf982	; 0xf982 <host_keepalive() [clone .part.30]>
bool M79_timer_get_status() {
    return M79_timer.running();
}

void M79_timer_update_status() {
    M79_timer.expired(M79_TIMEOUT);
   11ce2:	40 e3       	ldi	r20, 0x30	; 48
   11ce4:	55 e7       	ldi	r21, 0x75	; 117
   11ce6:	60 e0       	ldi	r22, 0x00	; 0
   11ce8:	70 e0       	ldi	r23, 0x00	; 0
   11cea:	8c e8       	ldi	r24, 0x8C	; 140
   11cec:	93 e0       	ldi	r25, 0x03	; 3
#if defined(AUTO_REPORT)
  host_autoreport();
#endif //AUTO_REPORT
  host_keepalive();
  M79_timer_update_status();
}
   11cee:	df 91       	pop	r29
   11cf0:	cf 91       	pop	r28
   11cf2:	1f 91       	pop	r17
   11cf4:	0f 91       	pop	r16
   11cf6:	0d 94 88 0e 	jmp	0x21d10	; 0x21d10 <Timer<unsigned long>::expired(unsigned long)>
        tail_fan_speed = 255;
      } else if (fan_kick_end > _millis())
        // Fan still spinning up.
        tail_fan_speed = 255;
    } else {
      fan_kick_end = 0;
   11cfa:	10 92 3f 03 	sts	0x033F, r1	; 0x80033f <check_axes_activity()::fan_kick_end>
   11cfe:	10 92 40 03 	sts	0x0340, r1	; 0x800340 <check_axes_activity()::fan_kick_end+0x1>
   11d02:	10 92 41 03 	sts	0x0341, r1	; 0x800341 <check_axes_activity()::fan_kick_end+0x2>
   11d06:	10 92 42 03 	sts	0x0342, r1	; 0x800342 <check_axes_activity()::fan_kick_end+0x3>
   11d0a:	64 cf       	rjmp	.-312    	; 0x11bd4 <manage_inactivity(bool)+0x36c>
  #ifdef FAN_SOFT_PWM
	if (fan_measuring) { //if measurement is currently in process, fanSpeedSoftPwm must remain set to 255, but we must update fanSpeedBckp value
		fanSpeedBckp = tail_fan_speed;
	}
	else {
		fanSpeedSoftPwm = tail_fan_speed;
   11d0c:	c0 93 1d 06 	sts	0x061D, r28	; 0x80061d <fanSpeedSoftPwm>
   11d10:	68 cf       	rjmp	.-304    	; 0x11be2 <manage_inactivity(bool)+0x37a>
				did_rotate = true;
			}
			else {
				// Get lcd_encoder_diff in sync with the encoder hard steps.
				// We assume that a click happens only when the knob is rotated into a stable position
				lcd_encoder_diff = 0;
   11d12:	10 92 a4 05 	sts	0x05A4, r1	; 0x8005a4 <_ZL16lcd_encoder_diff.lto_priv.502>
   11d16:	4f bf       	out	0x3f, r20	; 63
			}
		}
		Sound_MakeSound(did_rotate ? e_SOUND_TYPE_EncoderMove : e_SOUND_TYPE_ButtonEcho);
   11d18:	80 e0       	ldi	r24, 0x00	; 0
   11d1a:	a2 cf       	rjmp	.-188    	; 0x11c60 <manage_inactivity(bool)+0x3f8>

00011d1c <delay_keep_alive(unsigned int)>:
#endif
#endif
}

void delay_keep_alive(unsigned int ms)
{
   11d1c:	cf 93       	push	r28
   11d1e:	df 93       	push	r29
   11d20:	ec 01       	movw	r28, r24
    for (;;) {
        manage_heater();
   11d22:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
        // Manage inactivity, but don't disable steppers on timeout.
        manage_inactivity(true);
   11d26:	81 e0       	ldi	r24, 0x01	; 1
   11d28:	0e 94 34 8c 	call	0x11868	; 0x11868 <manage_inactivity(bool)>
        lcd_update(0);
   11d2c:	80 e0       	ldi	r24, 0x00	; 0
   11d2e:	0e 94 f9 6e 	call	0xddf2	; 0xddf2 <lcd_update(unsigned char)>
        if (ms == 0)
   11d32:	20 97       	sbiw	r28, 0x00	; 0
   11d34:	99 f0       	breq	.+38     	; 0x11d5c <delay_keep_alive(unsigned int)+0x40>
            break;
        else if (ms >= 50) {
   11d36:	c2 33       	cpi	r28, 0x32	; 50
   11d38:	d1 05       	cpc	r29, r1
   11d3a:	40 f0       	brcs	.+16     	; 0x11d4c <delay_keep_alive(unsigned int)+0x30>
            _delay(50);
   11d3c:	62 e3       	ldi	r22, 0x32	; 50
   11d3e:	70 e0       	ldi	r23, 0x00	; 0
   11d40:	80 e0       	ldi	r24, 0x00	; 0
   11d42:	90 e0       	ldi	r25, 0x00	; 0
   11d44:	0f 94 bd 0d 	call	0x21b7a	; 0x21b7a <delay2>
            ms -= 50;
   11d48:	e2 97       	sbiw	r28, 0x32	; 50
   11d4a:	eb cf       	rjmp	.-42     	; 0x11d22 <delay_keep_alive(unsigned int)+0x6>
        } else {
			_delay(ms);
   11d4c:	be 01       	movw	r22, r28
   11d4e:	90 e0       	ldi	r25, 0x00	; 0
   11d50:	80 e0       	ldi	r24, 0x00	; 0
   11d52:	0f 94 bd 0d 	call	0x21b7a	; 0x21b7a <delay2>
            ms = 0;
   11d56:	d0 e0       	ldi	r29, 0x00	; 0
   11d58:	c0 e0       	ldi	r28, 0x00	; 0
   11d5a:	e3 cf       	rjmp	.-58     	; 0x11d22 <delay_keep_alive(unsigned int)+0x6>
        }
    }
}
   11d5c:	df 91       	pop	r29
   11d5e:	cf 91       	pop	r28
   11d60:	08 95       	ret

00011d62 <mmu_M600_filament_change_screen(unsigned char)>:
/// @brief Re-use the MMU error screen UI to present choices for filament change
/// There are two button actions, Load and Eject
/// Load will exit the screen and continue as normally by asking the user which slot to load from
/// Eject will eject the depleted filament, very useful after FINDA runout events.
/// @param eject_slot the MMU slot to eject if the user selects the Eject button choice
static void mmu_M600_filament_change_screen(uint8_t eject_slot) {
   11d62:	cf 93       	push	r28
   11d64:	df 93       	push	r29
   11d66:	c8 2f       	mov	r28, r24
    inline Buttons GetPrinterButtonOperation() {
        return printerButtonOperation;
    }

    inline void ClearPrinterButtonOperation() {
        printerButtonOperation = Buttons::NoButton;
   11d68:	df ef       	ldi	r29, 0xFF	; 255
    MMU2::Buttons btn;
    for(;;)
    {
        manage_heater();
   11d6a:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
        manage_inactivity(true);
   11d6e:	81 e0       	ldi	r24, 0x01	; 1
   11d70:	0e 94 34 8c 	call	0x11868	; 0x11868 <manage_inactivity(bool)>
   11d74:	80 91 ff 12 	lds	r24, 0x12FF	; 0x8012ff <MMU2::mmu2+0x6d>

        btn = MMU2::mmu2.GetPrinterButtonOperation();
        if (btn != MMU2::Buttons::NoButton)
   11d78:	8f 3f       	cpi	r24, 0xFF	; 255
   11d7a:	d9 f4       	brne	.+54     	; 0x11db2 <mmu_M600_filament_change_screen(unsigned char)+0x50>
    // special handling of explicit printer errors
    return IsPrinterError() ? StepStatus::PrinterError : currentStatus;
}

uint8_t ProtocolLogic::CommandInProgress() const {
    if (currentScope != Scope::Command) {
   11d7c:	80 91 94 12 	lds	r24, 0x1294	; 0x801294 <MMU2::mmu2+0x2>
   11d80:	84 30       	cpi	r24, 0x04	; 4
   11d82:	21 f4       	brne	.+8      	; 0x11d8c <mmu_M600_filament_change_screen(unsigned char)+0x2a>
    };
    inline void InvokeErrorScreen(ErrorCode ec) {
        // The printer may not raise an error when the MMU is busy
        if (!logic.CommandInProgress() // MMU must not be busy
            && MMUCurrentErrorCode() == ErrorCode::OK // The protocol must not be in error state
            && lastErrorCode != ec) // The error code is not a duplicate
   11d84:	80 91 97 12 	lds	r24, 0x1297	; 0x801297 <MMU2::mmu2+0x5>
   11d88:	81 11       	cpse	r24, r1
   11d8a:	ef cf       	rjmp	.-34     	; 0x11d6a <mmu_M600_filament_change_screen(unsigned char)+0x8>
        return lastReadRegisterValue;
    };
    inline void InvokeErrorScreen(ErrorCode ec) {
        // The printer may not raise an error when the MMU is busy
        if (!logic.CommandInProgress() // MMU must not be busy
            && MMUCurrentErrorCode() == ErrorCode::OK // The protocol must not be in error state
   11d8c:	80 91 d2 12 	lds	r24, 0x12D2	; 0x8012d2 <MMU2::mmu2+0x40>
   11d90:	90 91 d3 12 	lds	r25, 0x12D3	; 0x8012d3 <MMU2::mmu2+0x41>
   11d94:	01 97       	sbiw	r24, 0x01	; 1
   11d96:	49 f7       	brne	.-46     	; 0x11d6a <mmu_M600_filament_change_screen(unsigned char)+0x8>
            && lastErrorCode != ec) // The error code is not a duplicate
   11d98:	80 91 f9 12 	lds	r24, 0x12F9	; 0x8012f9 <MMU2::mmu2+0x67>
   11d9c:	90 91 fa 12 	lds	r25, 0x12FA	; 0x8012fa <MMU2::mmu2+0x68>
   11da0:	89 32       	cpi	r24, 0x29	; 41
   11da2:	90 48       	sbci	r25, 0x80	; 128
   11da4:	11 f3       	breq	.-60     	; 0x11d6a <mmu_M600_filament_change_screen(unsigned char)+0x8>
        {
            ReportError(ec, ErrorSource::ErrorSourcePrinter);
   11da6:	60 e0       	ldi	r22, 0x00	; 0
   11da8:	89 e2       	ldi	r24, 0x29	; 41
   11daa:	90 e8       	ldi	r25, 0x80	; 128
   11dac:	0f 94 97 75 	call	0x2eb2e	; 0x2eb2e <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.174]>
   11db0:	dc cf       	rjmp	.-72     	; 0x11d6a <mmu_M600_filament_change_screen(unsigned char)+0x8>
    inline Buttons GetPrinterButtonOperation() {
        return printerButtonOperation;
    }

    inline void ClearPrinterButtonOperation() {
        printerButtonOperation = Buttons::NoButton;
   11db2:	d0 93 ff 12 	sts	0x12FF, r29	; 0x8012ff <MMU2::mmu2+0x6d>
        {
            MMU2::mmu2.ClearPrinterButtonOperation();

            if (btn == MMU2::Buttons::Eject) {
   11db6:	85 30       	cpi	r24, 0x05	; 5
   11db8:	39 f4       	brne	.+14     	; 0x11dc8 <mmu_M600_filament_change_screen(unsigned char)+0x66>
                if (eject_slot != (uint8_t)MMU2::FILAMENT_UNKNOWN) {
   11dba:	cf 3f       	cpi	r28, 0xFF	; 255
   11dbc:	f9 f2       	breq	.-66     	; 0x11d7c <mmu_M600_filament_change_screen(unsigned char)+0x1a>
                    MMU2::mmu2.eject_filament(eject_slot, true);
   11dbe:	61 e0       	ldi	r22, 0x01	; 1
   11dc0:	8c 2f       	mov	r24, r28
   11dc2:	0f 94 cc 9d 	call	0x33b98	; 0x33b98 <MMU2::MMU2::eject_filament(unsigned char, bool) [clone .constprop.99]>
   11dc6:	d1 cf       	rjmp	.-94     	; 0x11d6a <mmu_M600_filament_change_screen(unsigned char)+0x8>
                    // the operation is done. We must be careful to not raise FILAMENT_CHANGE
                    // screen too quickly
                    continue;
                }
            }
            else if (btn == MMU2::Buttons::Load)
   11dc8:	84 30       	cpi	r24, 0x04	; 4
   11dca:	c1 f6       	brne	.-80     	; 0x11d7c <mmu_M600_filament_change_screen(unsigned char)+0x1a>
            }
        }

        MMU2::mmu2.InvokeErrorScreen(ErrorCode::FILAMENT_CHANGE);
    }
}
   11dcc:	df 91       	pop	r29
   11dce:	cf 91       	pop	r28
   11dd0:	08 95       	ret

00011dd2 <enquecommand(char const*, bool)>:
//adds an command to the main command buffer
//thats really done in a non-safe way.
//needs overworking someday
// Currently the maximum length of a command piped through this function is around 20 characters
void enquecommand(const char *cmd, bool from_progmem)
{
   11dd2:	ff 92       	push	r15
   11dd4:	0f 93       	push	r16
   11dd6:	1f 93       	push	r17
   11dd8:	cf 93       	push	r28
   11dda:	df 93       	push	r29
   11ddc:	ec 01       	movw	r28, r24
   11dde:	f6 2e       	mov	r15, r22
    size_t len = from_progmem ? strlen_P(cmd) : strlen(cmd);
   11de0:	66 23       	and	r22, r22
   11de2:	09 f4       	brne	.+2      	; 0x11de6 <enquecommand(char const*, bool)+0x14>
   11de4:	4b c0       	rjmp	.+150    	; 0x11e7c <enquecommand(char const*, bool)+0xaa>
   11de6:	0f 94 9e a1 	call	0x3433c	; 0x3433c <__strlen_P>
   11dea:	8c 01       	movw	r16, r24
    // Does cmd fit the queue while leaving sufficient space at the front for the chained commands?
    // If it fits, it may move bufindw, so it points to a contiguous buffer, which fits cmd.
    if (cmdqueue_could_enqueue_back(len)) {
   11dec:	c8 01       	movw	r24, r16
   11dee:	0e 94 64 55 	call	0xaac8	; 0xaac8 <cmdqueue_could_enqueue_back(unsigned int)>
   11df2:	88 23       	and	r24, r24
   11df4:	09 f4       	brne	.+2      	; 0x11df8 <enquecommand(char const*, bool)+0x26>
   11df6:	53 c0       	rjmp	.+166    	; 0x11e9e <enquecommand(char const*, bool)+0xcc>
        // This is dangerous if a mixing of serial and this happens
        // This may easily be tested: If serial_count > 0, we have a problem.
        cmdbuffer[bufindw] = CMDBUFFER_CURRENT_TYPE_UI;
   11df8:	80 91 49 10 	lds	r24, 0x1049	; 0x801049 <_ZL7bufindw.lto_priv.514>
   11dfc:	90 91 4a 10 	lds	r25, 0x104A	; 0x80104a <_ZL7bufindw.lto_priv.514+0x1>
   11e00:	fc 01       	movw	r30, r24
   11e02:	e5 5b       	subi	r30, 0xB5	; 181
   11e04:	ff 4e       	sbci	r31, 0xEF	; 239
   11e06:	23 e0       	ldi	r18, 0x03	; 3
   11e08:	20 83       	st	Z, r18
   11e0a:	82 5b       	subi	r24, 0xB2	; 178
   11e0c:	9f 4e       	sbci	r25, 0xEF	; 239
        if (from_progmem)
            strcpy_P(cmdbuffer + bufindw + CMDHDRSIZE, cmd);
   11e0e:	be 01       	movw	r22, r28
    // If it fits, it may move bufindw, so it points to a contiguous buffer, which fits cmd.
    if (cmdqueue_could_enqueue_back(len)) {
        // This is dangerous if a mixing of serial and this happens
        // This may easily be tested: If serial_count > 0, we have a problem.
        cmdbuffer[bufindw] = CMDBUFFER_CURRENT_TYPE_UI;
        if (from_progmem)
   11e10:	ff 20       	and	r15, r15
   11e12:	e9 f1       	breq	.+122    	; 0x11e8e <enquecommand(char const*, bool)+0xbc>
            strcpy_P(cmdbuffer + bufindw + CMDHDRSIZE, cmd);
   11e14:	0f 94 97 a1 	call	0x3432e	; 0x3432e <strcpy_P>
        else
            strcpy(cmdbuffer + bufindw + CMDHDRSIZE, cmd);
        SERIAL_ECHO_START;
   11e18:	8e ec       	ldi	r24, 0xCE	; 206
   11e1a:	91 ea       	ldi	r25, 0xA1	; 161
   11e1c:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        SERIAL_ECHORPGM(MSG_Enqueing);
   11e20:	8f e9       	ldi	r24, 0x9F	; 159
   11e22:	92 e6       	ldi	r25, 0x62	; 98
   11e24:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        SERIAL_ECHO(cmdbuffer + bufindw + CMDHDRSIZE);
   11e28:	80 91 49 10 	lds	r24, 0x1049	; 0x801049 <_ZL7bufindw.lto_priv.514>
   11e2c:	90 91 4a 10 	lds	r25, 0x104A	; 0x80104a <_ZL7bufindw.lto_priv.514+0x1>
   11e30:	82 5b       	subi	r24, 0xB2	; 178
   11e32:	9f 4e       	sbci	r25, 0xEF	; 239
   11e34:	0e 94 95 87 	call	0x10f2a	; 0x10f2a <MarlinSerial::write(char const*)>
        SERIAL_ECHOLNPGM("\"");
   11e38:	8a e7       	ldi	r24, 0x7A	; 122
   11e3a:	92 e7       	ldi	r25, 0x72	; 114
   11e3c:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
        bufindw += len + (CMDHDRSIZE + 1);
   11e40:	80 91 49 10 	lds	r24, 0x1049	; 0x801049 <_ZL7bufindw.lto_priv.514>
   11e44:	90 91 4a 10 	lds	r25, 0x104A	; 0x80104a <_ZL7bufindw.lto_priv.514+0x1>
   11e48:	04 96       	adiw	r24, 0x04	; 4
   11e4a:	08 0f       	add	r16, r24
   11e4c:	19 1f       	adc	r17, r25
        if (bufindw == sizeof(cmdbuffer))
   11e4e:	0d 3e       	cpi	r16, 0xED	; 237
   11e50:	81 e0       	ldi	r24, 0x01	; 1
   11e52:	18 07       	cpc	r17, r24
   11e54:	f9 f0       	breq	.+62     	; 0x11e94 <enquecommand(char const*, bool)+0xc2>
            strcpy(cmdbuffer + bufindw + CMDHDRSIZE, cmd);
        SERIAL_ECHO_START;
        SERIAL_ECHORPGM(MSG_Enqueing);
        SERIAL_ECHO(cmdbuffer + bufindw + CMDHDRSIZE);
        SERIAL_ECHOLNPGM("\"");
        bufindw += len + (CMDHDRSIZE + 1);
   11e56:	10 93 4a 10 	sts	0x104A, r17	; 0x80104a <_ZL7bufindw.lto_priv.514+0x1>
   11e5a:	00 93 49 10 	sts	0x1049, r16	; 0x801049 <_ZL7bufindw.lto_priv.514>
        if (bufindw == sizeof(cmdbuffer))
            bufindw = 0;
        ++ buflen;
   11e5e:	80 91 3c 12 	lds	r24, 0x123C	; 0x80123c <buflen>
   11e62:	90 91 3d 12 	lds	r25, 0x123D	; 0x80123d <buflen+0x1>
   11e66:	01 96       	adiw	r24, 0x01	; 1
   11e68:	90 93 3d 12 	sts	0x123D, r25	; 0x80123d <buflen+0x1>
   11e6c:	80 93 3c 12 	sts	0x123C, r24	; 0x80123c <buflen>
        SERIAL_ECHOLNRPGM(bufferFull);
#ifdef CMDBUFFER_DEBUG
        cmdqueue_dump_to_serial();
#endif /* CMDBUFFER_DEBUG */
    }
}
   11e70:	df 91       	pop	r29
   11e72:	cf 91       	pop	r28
   11e74:	1f 91       	pop	r17
   11e76:	0f 91       	pop	r16
   11e78:	ff 90       	pop	r15
   11e7a:	08 95       	ret
//thats really done in a non-safe way.
//needs overworking someday
// Currently the maximum length of a command piped through this function is around 20 characters
void enquecommand(const char *cmd, bool from_progmem)
{
    size_t len = from_progmem ? strlen_P(cmd) : strlen(cmd);
   11e7c:	fc 01       	movw	r30, r24
   11e7e:	01 90       	ld	r0, Z+
   11e80:	00 20       	and	r0, r0
   11e82:	e9 f7       	brne	.-6      	; 0x11e7e <enquecommand(char const*, bool)+0xac>
   11e84:	31 97       	sbiw	r30, 0x01	; 1
   11e86:	8f 01       	movw	r16, r30
   11e88:	08 1b       	sub	r16, r24
   11e8a:	19 0b       	sbc	r17, r25
   11e8c:	af cf       	rjmp	.-162    	; 0x11dec <enquecommand(char const*, bool)+0x1a>
        // This may easily be tested: If serial_count > 0, we have a problem.
        cmdbuffer[bufindw] = CMDBUFFER_CURRENT_TYPE_UI;
        if (from_progmem)
            strcpy_P(cmdbuffer + bufindw + CMDHDRSIZE, cmd);
        else
            strcpy(cmdbuffer + bufindw + CMDHDRSIZE, cmd);
   11e8e:	0f 94 4b aa 	call	0x35496	; 0x35496 <strcpy>
   11e92:	c2 cf       	rjmp	.-124    	; 0x11e18 <enquecommand(char const*, bool)+0x46>
        SERIAL_ECHORPGM(MSG_Enqueing);
        SERIAL_ECHO(cmdbuffer + bufindw + CMDHDRSIZE);
        SERIAL_ECHOLNPGM("\"");
        bufindw += len + (CMDHDRSIZE + 1);
        if (bufindw == sizeof(cmdbuffer))
            bufindw = 0;
   11e94:	10 92 4a 10 	sts	0x104A, r1	; 0x80104a <_ZL7bufindw.lto_priv.514+0x1>
   11e98:	10 92 49 10 	sts	0x1049, r1	; 0x801049 <_ZL7bufindw.lto_priv.514>
   11e9c:	e0 cf       	rjmp	.-64     	; 0x11e5e <enquecommand(char const*, bool)+0x8c>
        ++ buflen;
#ifdef CMDBUFFER_DEBUG
        cmdqueue_dump_to_serial();
#endif /* CMDBUFFER_DEBUG */
    } else {
        SERIAL_ERROR_START;
   11e9e:	81 eb       	ldi	r24, 0xB1	; 177
   11ea0:	91 ea       	ldi	r25, 0xA1	; 161
   11ea2:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        SERIAL_ECHORPGM(MSG_Enqueing);
   11ea6:	8f e9       	ldi	r24, 0x9F	; 159
   11ea8:	92 e6       	ldi	r25, 0x62	; 98
   11eaa:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        if (from_progmem)
            SERIAL_PROTOCOLRPGM(cmd);
   11eae:	ce 01       	movw	r24, r28
        cmdqueue_dump_to_serial();
#endif /* CMDBUFFER_DEBUG */
    } else {
        SERIAL_ERROR_START;
        SERIAL_ECHORPGM(MSG_Enqueing);
        if (from_progmem)
   11eb0:	ff 20       	and	r15, r15
   11eb2:	59 f0       	breq	.+22     	; 0x11eca <enquecommand(char const*, bool)+0xf8>
            SERIAL_PROTOCOLRPGM(cmd);
   11eb4:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        else
            SERIAL_ECHO(cmd);
        SERIAL_ECHOLNRPGM(bufferFull);
   11eb8:	8f e7       	ldi	r24, 0x7F	; 127
   11eba:	91 ea       	ldi	r25, 0xA1	; 161
#ifdef CMDBUFFER_DEBUG
        cmdqueue_dump_to_serial();
#endif /* CMDBUFFER_DEBUG */
    }
}
   11ebc:	df 91       	pop	r29
   11ebe:	cf 91       	pop	r28
   11ec0:	1f 91       	pop	r17
   11ec2:	0f 91       	pop	r16
   11ec4:	ff 90       	pop	r15
        SERIAL_ECHORPGM(MSG_Enqueing);
        if (from_progmem)
            SERIAL_PROTOCOLRPGM(cmd);
        else
            SERIAL_ECHO(cmd);
        SERIAL_ECHOLNRPGM(bufferFull);
   11ec6:	0c 94 bd 7c 	jmp	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   11eca:	0e 94 95 87 	call	0x10f2a	; 0x10f2a <MarlinSerial::write(char const*)>
   11ece:	f4 cf       	rjmp	.-24     	; 0x11eb8 <enquecommand(char const*, bool)+0xe6>

00011ed0 <menu_item_gcode_P(char const*, char const*)>:
	}
	menu_item++;
}

void menu_item_gcode_P(const char* str, const char* str_gcode)
{
   11ed0:	cf 93       	push	r28
   11ed2:	df 93       	push	r29
	if (menu_item == menu_line)
   11ed4:	30 91 63 04 	lds	r19, 0x0463	; 0x800463 <menu_item>
   11ed8:	20 91 62 04 	lds	r18, 0x0462	; 0x800462 <menu_line>
   11edc:	32 13       	cpse	r19, r18
   11ede:	20 c0       	rjmp	.+64     	; 0x11f20 <menu_item_gcode_P(char const*, char const*)+0x50>
   11ee0:	eb 01       	movw	r28, r22
   11ee2:	bc 01       	movw	r22, r24
	{
		if (lcd_draw_update) menu_draw_item_puts_P(' ', str);
   11ee4:	80 91 59 02 	lds	r24, 0x0259	; 0x800259 <lcd_draw_update>
   11ee8:	88 23       	and	r24, r24
   11eea:	19 f0       	breq	.+6      	; 0x11ef2 <menu_item_gcode_P(char const*, char const*)+0x22>
   11eec:	80 e2       	ldi	r24, 0x20	; 32
   11eee:	0e 94 86 72 	call	0xe50c	; 0xe50c <menu_draw_item_puts_P(char, char const*)>
		if (menu_clicked && (lcd_encoder == menu_item))
   11ef2:	80 91 61 04 	lds	r24, 0x0461	; 0x800461 <menu_clicked>
   11ef6:	88 23       	and	r24, r24
   11ef8:	99 f0       	breq	.+38     	; 0x11f20 <menu_item_gcode_P(char const*, char const*)+0x50>
   11efa:	20 91 63 04 	lds	r18, 0x0463	; 0x800463 <menu_item>
   11efe:	80 91 1e 06 	lds	r24, 0x061E	; 0x80061e <lcd_encoder>
   11f02:	90 91 1f 06 	lds	r25, 0x061F	; 0x80061f <lcd_encoder+0x1>
   11f06:	28 17       	cp	r18, r24
   11f08:	19 06       	cpc	r1, r25
   11f0a:	51 f4       	brne	.+20     	; 0x11f20 <menu_item_gcode_P(char const*, char const*)+0x50>
		{
			if (str_gcode) enquecommand_P(str_gcode);
   11f0c:	20 97       	sbiw	r28, 0x00	; 0
   11f0e:	21 f0       	breq	.+8      	; 0x11f18 <menu_item_gcode_P(char const*, char const*)+0x48>
   11f10:	61 e0       	ldi	r22, 0x01	; 1
   11f12:	ce 01       	movw	r24, r28
   11f14:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
			menu_item_ret();
			return;
		}
	}
	menu_item++;
}
   11f18:	df 91       	pop	r29
   11f1a:	cf 91       	pop	r28
	{
		if (lcd_draw_update) menu_draw_item_puts_P(' ', str);
		if (menu_clicked && (lcd_encoder == menu_item))
		{
			if (str_gcode) enquecommand_P(str_gcode);
			menu_item_ret();
   11f1c:	0c 94 73 62 	jmp	0xc4e6	; 0xc4e6 <menu_item_ret()>
			return;
		}
	}
	menu_item++;
   11f20:	80 91 63 04 	lds	r24, 0x0463	; 0x800463 <menu_item>
   11f24:	8f 5f       	subi	r24, 0xFF	; 255
   11f26:	80 93 63 04 	sts	0x0463, r24	; 0x800463 <menu_item>
}
   11f2a:	df 91       	pop	r29
   11f2c:	cf 91       	pop	r28
   11f2e:	08 95       	ret

00011f30 <lay1cal_common_enqueue_loop(char const* const*, unsigned char) [clone .lto_priv.407]>:
{
    return extrusion_width - layer_height * (overlap_factor - M_PI/4);
}

// Common code extracted into one function to reduce code size
static void lay1cal_common_enqueue_loop(const char * const * cmd_sequence, const uint8_t steps) {
   11f30:	0f 93       	push	r16
   11f32:	1f 93       	push	r17
   11f34:	cf 93       	push	r28
   11f36:	df 93       	push	r29
   11f38:	d6 2f       	mov	r29, r22
   11f3a:	8c 01       	movw	r16, r24
    for (uint8_t i = 0; i < steps; ++i)
   11f3c:	c0 e0       	ldi	r28, 0x00	; 0
    {
        void * const pgm_ptr = pgm_read_ptr(cmd_sequence + i);
   11f3e:	f8 01       	movw	r30, r16
   11f40:	85 91       	lpm	r24, Z+
   11f42:	94 91       	lpm	r25, Z

        // M702 is currently only used with MMU enabled
        if (pgm_ptr == MSG_M702 && !MMU2::mmu2.Enabled()) {
   11f44:	28 e6       	ldi	r18, 0x68	; 104
   11f46:	8c 3c       	cpi	r24, 0xCC	; 204
   11f48:	92 07       	cpc	r25, r18
   11f4a:	21 f4       	brne	.+8      	; 0x11f54 <lay1cal_common_enqueue_loop(char const* const*, unsigned char) [clone .lto_priv.407]+0x24>
   11f4c:	20 91 01 13 	lds	r18, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   11f50:	21 30       	cpi	r18, 0x01	; 1
   11f52:	19 f4       	brne	.+6      	; 0x11f5a <lay1cal_common_enqueue_loop(char const* const*, unsigned char) [clone .lto_priv.407]+0x2a>
            continue;
        }

        enquecommand_P(static_cast<char*>(pgm_ptr));
   11f54:	61 e0       	ldi	r22, 0x01	; 1
   11f56:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
    return extrusion_width - layer_height * (overlap_factor - M_PI/4);
}

// Common code extracted into one function to reduce code size
static void lay1cal_common_enqueue_loop(const char * const * cmd_sequence, const uint8_t steps) {
    for (uint8_t i = 0; i < steps; ++i)
   11f5a:	cf 5f       	subi	r28, 0xFF	; 255
   11f5c:	0e 5f       	subi	r16, 0xFE	; 254
   11f5e:	1f 4f       	sbci	r17, 0xFF	; 255
   11f60:	dc 13       	cpse	r29, r28
   11f62:	ed cf       	rjmp	.-38     	; 0x11f3e <lay1cal_common_enqueue_loop(char const* const*, unsigned char) [clone .lto_priv.407]+0xe>
            continue;
        }

        enquecommand_P(static_cast<char*>(pgm_ptr));
    }
}
   11f64:	df 91       	pop	r29
   11f66:	cf 91       	pop	r28
   11f68:	1f 91       	pop	r17
   11f6a:	0f 91       	pop	r16
   11f6c:	08 95       	ret

00011f6e <enquecommandf_P(char const*, ...)>:
static const char bufferFull[] PROGMEM = "\" failed: Buffer full!";
static const char enqueingFront[] PROGMEM = "Enqueing to the front: \"";


void enquecommandf_P(const char *fmt, ...)
{
   11f6e:	cf 93       	push	r28
   11f70:	df 93       	push	r29
   11f72:	cd b7       	in	r28, 0x3d	; 61
   11f74:	de b7       	in	r29, 0x3e	; 62
   11f76:	6e 97       	sbiw	r28, 0x1e	; 30
   11f78:	0f b6       	in	r0, 0x3f	; 63
   11f7a:	f8 94       	cli
   11f7c:	de bf       	out	0x3e, r29	; 62
   11f7e:	0f be       	out	0x3f, r0	; 63
   11f80:	cd bf       	out	0x3d, r28	; 61
   11f82:	9e 01       	movw	r18, r28
   11f84:	2c 5d       	subi	r18, 0xDC	; 220
   11f86:	3f 4f       	sbci	r19, 0xFF	; 255
   11f88:	f9 01       	movw	r30, r18
   11f8a:	41 91       	ld	r20, Z+
   11f8c:	51 91       	ld	r21, Z+
   11f8e:	9f 01       	movw	r18, r30
    // MAX_CMD_SIZE is 96, but for formatting
    // string we usually don't need more than 30 bytes
    char cmd_buffer[30];
    va_list ap;
    va_start(ap, fmt);
    vsnprintf_P(cmd_buffer, sizeof(cmd_buffer), fmt, ap);
   11f90:	6e e1       	ldi	r22, 0x1E	; 30
   11f92:	70 e0       	ldi	r23, 0x00	; 0
   11f94:	ce 01       	movw	r24, r28
   11f96:	01 96       	adiw	r24, 0x01	; 1
   11f98:	0f 94 36 a3 	call	0x3466c	; 0x3466c <vsnprintf_P>
    va_end(ap);

    enquecommand(cmd_buffer, false);
   11f9c:	60 e0       	ldi	r22, 0x00	; 0
   11f9e:	ce 01       	movw	r24, r28
   11fa0:	01 96       	adiw	r24, 0x01	; 1
   11fa2:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
}
   11fa6:	6e 96       	adiw	r28, 0x1e	; 30
   11fa8:	0f b6       	in	r0, 0x3f	; 63
   11faa:	f8 94       	cli
   11fac:	de bf       	out	0x3e, r29	; 62
   11fae:	0f be       	out	0x3f, r0	; 63
   11fb0:	cd bf       	out	0x3d, r28	; 61
   11fb2:	df 91       	pop	r29
   11fb4:	cf 91       	pop	r28
   11fb6:	08 95       	ret

00011fb8 <process_commands() [clone .part.46]>:
They are shown in order of appearance in the code.
There are reasons why some G Codes aren't in numerical order.
*/


void process_commands()
   11fb8:	2f 92       	push	r2
   11fba:	3f 92       	push	r3
   11fbc:	4f 92       	push	r4
   11fbe:	5f 92       	push	r5
   11fc0:	6f 92       	push	r6
   11fc2:	7f 92       	push	r7
   11fc4:	8f 92       	push	r8
   11fc6:	9f 92       	push	r9
   11fc8:	af 92       	push	r10
   11fca:	bf 92       	push	r11
   11fcc:	cf 92       	push	r12
   11fce:	df 92       	push	r13
   11fd0:	ef 92       	push	r14
   11fd2:	ff 92       	push	r15
   11fd4:	0f 93       	push	r16
   11fd6:	1f 93       	push	r17
   11fd8:	cf 93       	push	r28
   11fda:	df 93       	push	r29
   11fdc:	cd b7       	in	r28, 0x3d	; 61
   11fde:	de b7       	in	r29, 0x3e	; 62
   11fe0:	c3 56       	subi	r28, 0x63	; 99
   11fe2:	d1 09       	sbc	r29, r1
   11fe4:	0f b6       	in	r0, 0x3f	; 63
   11fe6:	f8 94       	cli
   11fe8:	de bf       	out	0x3e, r29	; 62
   11fea:	0f be       	out	0x3f, r0	; 63
   11fec:	cd bf       	out	0x3d, r28	; 61
#endif /* CMDBUFFER_DEBUG */

  unsigned long codenum; //throw away variable

  // PRUSA GCODES
  KEEPALIVE_STATE(IN_HANDLER);
   11fee:	82 e0       	ldi	r24, 0x02	; 2
   11ff0:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
		st_backlash_y = bl;
		printf_P(_N("st_backlash_y = %d\n"), st_backlash_y);
	}
#endif //BACKLASH_Y
#endif //TMC2130
  else if(strncmp_P(CMDBUFFER_CURRENT_STRING, PSTR("PRUSA"), 5) == 0) {
   11ff4:	00 91 38 12 	lds	r16, 0x1238	; 0x801238 <bufindr>
   11ff8:	10 91 39 12 	lds	r17, 0x1239	; 0x801239 <bufindr+0x1>
   11ffc:	02 5b       	subi	r16, 0xB2	; 178
   11ffe:	1f 4e       	sbci	r17, 0xEF	; 239
   12000:	45 e0       	ldi	r20, 0x05	; 5
   12002:	50 e0       	ldi	r21, 0x00	; 0
   12004:	66 e5       	ldi	r22, 0x56	; 86
   12006:	71 e8       	ldi	r23, 0x81	; 129
   12008:	c8 01       	movw	r24, r16
   1200a:	0f 94 bf a1 	call	0x3437e	; 0x3437e <strncmp_P>
   1200e:	89 2b       	or	r24, r25
   12010:	09 f0       	breq	.+2      	; 0x12014 <process_commands() [clone .part.46]+0x5c>
   12012:	9b c1       	rjmp	.+822    	; 0x1234a <process_commands() [clone .part.46]+0x392>
        eeprom_update_byte_notify((uint8_t*)EEPROM_FAN_CHECK_ENABLED, true);
    }
}

bool farm_prusa_code_seen() {
    if (!farm_mode)
   12014:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   12018:	88 23       	and	r24, r24
   1201a:	09 f4       	brne	.+2      	; 0x1201e <process_commands() [clone .part.46]+0x66>
   1201c:	4d c0       	rjmp	.+154    	; 0x120b8 <process_commands() [clone .part.46]+0x100>
        return false;

    if (code_seen_P(PSTR("PRN"))) { // PRUSA PRN
   1201e:	85 e6       	ldi	r24, 0x65	; 101
   12020:	9e e7       	ldi	r25, 0x7E	; 126
   12022:	0f 94 62 3c 	call	0x278c4	; 0x278c4 <code_seen_P(char const*) [clone .lto_priv.409]>
   12026:	88 23       	and	r24, r24
   12028:	79 f0       	breq	.+30     	; 0x12048 <process_commands() [clone .part.46]+0x90>
        printf_P(_N("%u"), status_number);
   1202a:	80 91 bd 04 	lds	r24, 0x04BD	; 0x8004bd <_ZL13status_number.lto_priv.492>
   1202e:	1f 92       	push	r1
   12030:	8f 93       	push	r24
   12032:	82 e0       	ldi	r24, 0x02	; 2
   12034:	95 e6       	ldi	r25, 0x65	; 101
	  int index;
	  for (index = 1; *(strchr_pointer + index) == ' ' || *(strchr_pointer + index) == '\t'; index++);

	 /*for (++strchr_pointer; *strchr_pointer == ' ' || *strchr_pointer == '\t'; ++strchr_pointer);*/
	  if (*(strchr_pointer+index) < '0' || *(strchr_pointer+index) > '9') {
		  printf_P(PSTR("Invalid M code: %s\n"), cmdbuffer + bufindr + CMDHDRSIZE);
   12036:	9f 93       	push	r25
   12038:	8f 93       	push	r24
   1203a:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   1203e:	0f 90       	pop	r0
   12040:	0f 90       	pop	r0
   12042:	0f 90       	pop	r0
   12044:	0f 90       	pop	r0
   12046:	08 c0       	rjmp	.+16     	; 0x12058 <process_commands() [clone .part.46]+0xa0>
    }
    else if (code_seen_P(PSTR("thx"))) { // PRUSA thx
   12048:	81 e6       	ldi	r24, 0x61	; 97
   1204a:	9e e7       	ldi	r25, 0x7E	; 126
   1204c:	0f 94 62 3c 	call	0x278c4	; 0x278c4 <code_seen_P(char const*) [clone .lto_priv.409]>
   12050:	88 23       	and	r24, r24
   12052:	41 f0       	breq	.+16     	; 0x12064 <process_commands() [clone .part.46]+0xac>
        no_response = false;
   12054:	10 92 08 04 	sts	0x0408, r1	; 0x800408 <_ZL11no_response.lto_priv.493>
    SERIAL_ECHO_START;
    SERIAL_ECHORPGM(MSG_UNKNOWN_COMMAND);
    SERIAL_ECHO(CMDBUFFER_CURRENT_STRING);
    SERIAL_ECHOLNPGM("\"(2)");
  }
  KEEPALIVE_STATE(NOT_BUSY);
   12058:	81 e0       	ldi	r24, 0x01	; 1
   1205a:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
  ClearToSend();
   1205e:	0e 94 22 85 	call	0x10a44	; 0x10a44 <ClearToSend()>
   12062:	3a c2       	rjmp	.+1140   	; 0x124d8 <process_commands() [clone .part.46]+0x520>
        trace();
        prusa_sd_card_upload = true;
        card.openFileWrite(strchr_pointer+4);
    }
#endif //PRUSA_M28
    else if (code_seen_P(PSTR("fv"))) { // PRUSA fv
   12064:	8e e5       	ldi	r24, 0x5E	; 94
   12066:	9e e7       	ldi	r25, 0x7E	; 126
   12068:	0f 94 62 3c 	call	0x278c4	; 0x278c4 <code_seen_P(char const*) [clone .lto_priv.409]>
   1206c:	88 23       	and	r24, r24
   1206e:	21 f1       	breq	.+72     	; 0x120b8 <process_commands() [clone .part.46]+0x100>
        // get file version
#ifdef SDSUPPORT
        card.openFileReadFilteredGcode(strchr_pointer + 3, true);
   12070:	80 91 bb 04 	lds	r24, 0x04BB	; 0x8004bb <strchr_pointer>
   12074:	90 91 bc 04 	lds	r25, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
   12078:	61 e0       	ldi	r22, 0x01	; 1
   1207a:	03 96       	adiw	r24, 0x03	; 3
   1207c:	0f 94 f3 71 	call	0x2e3e6	; 0x2e3e6 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]>

  FORCE_INLINE bool isFileOpen() { return file.isOpen(); }
  bool eof() { return sdpos>=filesize; }
  FORCE_INLINE int16_t getFilteredGcodeChar()
  {
      int16_t c = (int16_t)file.readFilteredGcode();
   12080:	0f 94 ef 6c 	call	0x2d9de	; 0x2d9de <SdFile::readFilteredGcode() [clone .constprop.218]>
   12084:	8c 01       	movw	r16, r24
      sdpos = file.curPosition();
   12086:	80 91 6f 16 	lds	r24, 0x166F	; 0x80166f <card+0x29a>
   1208a:	90 91 70 16 	lds	r25, 0x1670	; 0x801670 <card+0x29b>
   1208e:	a0 91 71 16 	lds	r26, 0x1671	; 0x801671 <card+0x29c>
   12092:	b0 91 72 16 	lds	r27, 0x1672	; 0x801672 <card+0x29d>
   12096:	80 93 eb 16 	sts	0x16EB, r24	; 0x8016eb <card+0x316>
   1209a:	90 93 ec 16 	sts	0x16EC, r25	; 0x8016ec <card+0x317>
   1209e:	a0 93 ed 16 	sts	0x16ED, r26	; 0x8016ed <card+0x318>
   120a2:	b0 93 ee 16 	sts	0x16EE, r27	; 0x8016ee <card+0x319>
        while (true) {
            uint16_t readByte = card.getFilteredGcodeChar();
            MYSERIAL.write(readByte);
   120a6:	80 2f       	mov	r24, r16
   120a8:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
            if (readByte == '\n') {
   120ac:	0a 30       	cpi	r16, 0x0A	; 10
   120ae:	11 05       	cpc	r17, r1
   120b0:	39 f7       	brne	.-50     	; 0x12080 <process_commands() [clone .part.46]+0xc8>
                break;
            }
        }
        card.closefile();
   120b2:	0f 94 f9 65 	call	0x2cbf2	; 0x2cbf2 <CardReader::closefile(bool) [clone .constprop.307]>
   120b6:	d0 cf       	rjmp	.-96     	; 0x12058 <process_commands() [clone .part.46]+0xa0>
      - `nozzle D<diameter>` - check the nozzle diameter (farm mode only), works like M862.1 P, e.g. `PRUSA nozzle D0.4`
      - `nozzle` - prints nozzle diameter (farm mode only), works like M862.1 P, e.g. `PRUSA nozzle`
    */

        if (farm_prusa_code_seen()) {}
        else if(code_seen_P(PSTR("FANPINTST"))) {
   120b8:	8c e4       	ldi	r24, 0x4C	; 76
   120ba:	91 e8       	ldi	r25, 0x81	; 129
   120bc:	0f 94 62 3c 	call	0x278c4	; 0x278c4 <code_seen_P(char const*) [clone .lto_priv.409]>
   120c0:	81 11       	cpse	r24, r1
   120c2:	ca cf       	rjmp	.-108    	; 0x12058 <process_commands() [clone .part.46]+0xa0>
            gcode_PRUSA_BadRAMBoFanTest();
        } else if (code_seen_P(PSTR("FAN"))) { // PRUSA FAN
   120c4:	88 e4       	ldi	r24, 0x48	; 72
   120c6:	91 e8       	ldi	r25, 0x81	; 129
   120c8:	0f 94 62 3c 	call	0x278c4	; 0x278c4 <code_seen_P(char const*) [clone .lto_priv.409]>
   120cc:	88 23       	and	r24, r24
   120ce:	21 f1       	breq	.+72     	; 0x12118 <process_commands() [clone .part.46]+0x160>
            printf_P(_N("E0:%d RPM\nPRN0:%d RPM\n"), 60*fan_speed[0], 60*fan_speed[1]);
   120d0:	40 91 b9 03 	lds	r20, 0x03B9	; 0x8003b9 <fan_speed+0x2>
   120d4:	50 91 ba 03 	lds	r21, 0x03BA	; 0x8003ba <fan_speed+0x3>
   120d8:	2c e3       	ldi	r18, 0x3C	; 60
   120da:	24 9f       	mul	r18, r20
   120dc:	c0 01       	movw	r24, r0
   120de:	25 9f       	mul	r18, r21
   120e0:	90 0d       	add	r25, r0
   120e2:	11 24       	eor	r1, r1
   120e4:	9f 93       	push	r25
   120e6:	8f 93       	push	r24
   120e8:	40 91 b7 03 	lds	r20, 0x03B7	; 0x8003b7 <fan_speed>
   120ec:	50 91 b8 03 	lds	r21, 0x03B8	; 0x8003b8 <fan_speed+0x1>
   120f0:	24 9f       	mul	r18, r20
   120f2:	c0 01       	movw	r24, r0
   120f4:	25 9f       	mul	r18, r21
   120f6:	90 0d       	add	r25, r0
   120f8:	11 24       	eor	r1, r1
   120fa:	9f 93       	push	r25
   120fc:	8f 93       	push	r24
   120fe:	86 e3       	ldi	r24, 0x36	; 54
   12100:	97 e6       	ldi	r25, 0x67	; 103
#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)

#endif //DEBUG_DCODES

    default:
        printf_P(MSG_UNKNOWN_CODE, 'D', cmdbuffer + bufindr + CMDHDRSIZE);
   12102:	9f 93       	push	r25
   12104:	8f 93       	push	r24
   12106:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   1210a:	0f 90       	pop	r0
   1210c:	0f 90       	pop	r0
   1210e:	0f 90       	pop	r0
   12110:	0f 90       	pop	r0
   12112:	0f 90       	pop	r0
   12114:	0f 90       	pop	r0
   12116:	a0 cf       	rjmp	.-192    	; 0x12058 <process_commands() [clone .part.46]+0xa0>
        if (farm_prusa_code_seen()) {}
        else if(code_seen_P(PSTR("FANPINTST"))) {
            gcode_PRUSA_BadRAMBoFanTest();
        } else if (code_seen_P(PSTR("FAN"))) { // PRUSA FAN
            printf_P(_N("E0:%d RPM\nPRN0:%d RPM\n"), 60*fan_speed[0], 60*fan_speed[1]);
        } else if (code_seen_P(PSTR("uvlo"))) { // PRUSA uvlo
   12118:	83 e4       	ldi	r24, 0x43	; 67
   1211a:	91 e8       	ldi	r25, 0x81	; 129
   1211c:	0f 94 62 3c 	call	0x278c4	; 0x278c4 <code_seen_P(char const*) [clone .lto_priv.409]>
   12120:	88 23       	and	r24, r24
   12122:	11 f1       	breq	.+68     	; 0x12168 <process_commands() [clone .part.46]+0x1b0>
            if (eeprom_read_byte((uint8_t*)EEPROM_UVLO_PRINT_TYPE) == PowerPanic::PRINT_TYPE_SD) {
   12124:	8c e8       	ldi	r24, 0x8C	; 140
   12126:	9f e0       	ldi	r25, 0x0F	; 15
   12128:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1212c:	81 11       	cpse	r24, r1
   1212e:	10 c0       	rjmp	.+32     	; 0x12150 <process_commands() [clone .part.46]+0x198>
                // M24 - Start SD print
                enquecommand_P(MSG_M24);
   12130:	61 e0       	ldi	r22, 0x01	; 1
   12132:	83 e6       	ldi	r24, 0x63	; 99
   12134:	9c e6       	ldi	r25, 0x6C	; 108
   12136:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
   1213a:	60 e0       	ldi	r22, 0x00	; 0
   1213c:	85 ea       	ldi	r24, 0xA5	; 165
   1213e:	9f e0       	ldi	r25, 0x0F	; 15
   12140:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
   12144:	60 e0       	ldi	r22, 0x00	; 0
   12146:	8f e7       	ldi	r24, 0x7F	; 127
   12148:	9c e0       	ldi	r25, 0x0C	; 12
   1214a:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
   1214e:	84 cf       	rjmp	.-248    	; 0x12058 <process_commands() [clone .part.46]+0xa0>

                // Print is recovered, clear the recovery flag
                eeprom_update_byte_notify((uint8_t*)EEPROM_UVLO, PowerPanic::NO_PENDING_RECOVERY);
                eeprom_update_byte_notify((uint8_t*)EEPROM_UVLO_Z_LIFTED, 0);
            } else if (eeprom_read_byte((uint8_t*)EEPROM_UVLO_PRINT_TYPE) == PowerPanic::PRINT_TYPE_HOST) {
   12150:	81 30       	cpi	r24, 0x01	; 1
   12152:	09 f0       	breq	.+2      	; 0x12156 <process_commands() [clone .part.46]+0x19e>
   12154:	81 cf       	rjmp	.-254    	; 0x12058 <process_commands() [clone .part.46]+0xa0>
                // For Host prints we need to start the timer so that the pause has any effect
                // this will allow g-codes to be processed while in the paused state
                // For SD prints, M24 starts the timer
                print_job_timer.start();
   12156:	0f 94 25 19 	call	0x2324a	; 0x2324a <Stopwatch::start()>
                usb_timer.start();
   1215a:	82 e4       	ldi	r24, 0x42	; 66
   1215c:	92 e1       	ldi	r25, 0x12	; 18
   1215e:	0f 94 4e 0e 	call	0x21c9c	; 0x21c9c <Timer<unsigned short>::start()>

                // Park the extruder to the side and don't resume the print
                // we must assume that the host as not fully booted up at this point
                lcd_pause_print();
   12162:	0f 94 fc 0d 	call	0x21bf8	; 0x21bf8 <lcd_pause_print()>
   12166:	78 cf       	rjmp	.-272    	; 0x12058 <process_commands() [clone .part.46]+0xa0>
            }
        } else if (code_seen_P(PSTR("MMURES"))) { // PRUSA MMURES
   12168:	8c e3       	ldi	r24, 0x3C	; 60
   1216a:	91 e8       	ldi	r25, 0x81	; 129
   1216c:	0f 94 62 3c 	call	0x278c4	; 0x278c4 <code_seen_P(char const*) [clone .lto_priv.409]>
   12170:	88 23       	and	r24, r24
   12172:	21 f0       	breq	.+8      	; 0x1217c <process_commands() [clone .part.46]+0x1c4>
        break;
    }
}

void MMU2::ResetX0() {
    logic.ResetMMU(); // Send soft reset
   12174:	80 e0       	ldi	r24, 0x00	; 0
   12176:	0f 94 43 95 	call	0x32a86	; 0x32a86 <MMU2::ProtocolLogic::ResetMMU(unsigned char) [clone .constprop.326]>
   1217a:	6e cf       	rjmp	.-292    	; 0x12058 <process_commands() [clone .part.46]+0xa0>
            MMU2::mmu2.Reset(MMU2::MMU2::Software);
        } else if (code_seen_P(PSTR("RESET"))) { // PRUSA RESET
   1217c:	86 e3       	ldi	r24, 0x36	; 54
   1217e:	91 e8       	ldi	r25, 0x81	; 129
   12180:	0f 94 62 3c 	call	0x278c4	; 0x278c4 <code_seen_P(char const*) [clone .lto_priv.409]>
   12184:	81 11       	cpse	r24, r1
#if defined(XFLASH) && defined(BOOTAPP)
            boot_app_magic = 0;
#endif //defined(XFLASH) && defined(BOOTAPP)
            softReset();
   12186:	0e 94 1f 66 	call	0xcc3e	; 0xcc3e <softReset>
        } else if (code_seen_P(PSTR("SN"))) { // PRUSA SN
   1218a:	83 e3       	ldi	r24, 0x33	; 51
   1218c:	91 e8       	ldi	r25, 0x81	; 129
   1218e:	0f 94 62 3c 	call	0x278c4	; 0x278c4 <code_seen_P(char const*) [clone .lto_priv.409]>
   12192:	88 23       	and	r24, r24
   12194:	a9 f0       	breq	.+42     	; 0x121c0 <process_commands() [clone .part.46]+0x208>
            char SN[20];
            eeprom_read_block(SN, (uint8_t*)EEPROM_PRUSA_SN, 20);
   12196:	44 e1       	ldi	r20, 0x14	; 20
   12198:	50 e0       	ldi	r21, 0x00	; 0
   1219a:	65 e1       	ldi	r22, 0x15	; 21
   1219c:	7d e0       	ldi	r23, 0x0D	; 13
   1219e:	ce 01       	movw	r24, r28
   121a0:	01 96       	adiw	r24, 0x01	; 1
   121a2:	0f 94 d0 a3 	call	0x347a0	; 0x347a0 <eeprom_read_block>
            if (SN[19])
   121a6:	8c 89       	ldd	r24, Y+20	; 0x14
   121a8:	88 23       	and	r24, r24
   121aa:	29 f0       	breq	.+10     	; 0x121b6 <process_commands() [clone .part.46]+0x1fe>
                puts_P(PSTR("SN invalid"));
   121ac:	88 e2       	ldi	r24, 0x28	; 40
   121ae:	91 e8       	ldi	r25, 0x81	; 129
   121b0:	0f 94 c9 a2 	call	0x34592	; 0x34592 <puts_P>
   121b4:	51 cf       	rjmp	.-350    	; 0x12058 <process_commands() [clone .part.46]+0xa0>
            else
                puts(SN);
   121b6:	ce 01       	movw	r24, r28
   121b8:	01 96       	adiw	r24, 0x01	; 1
   121ba:	0f 94 6f aa 	call	0x354de	; 0x354de <puts>
   121be:	4c cf       	rjmp	.-360    	; 0x12058 <process_commands() [clone .part.46]+0xa0>
        } else if(code_seen_P(PSTR("Fir"))){ // PRUSA Fir
   121c0:	84 e2       	ldi	r24, 0x24	; 36
   121c2:	91 e8       	ldi	r25, 0x81	; 129
   121c4:	0f 94 62 3c 	call	0x278c4	; 0x278c4 <code_seen_P(char const*) [clone .lto_priv.409]>
   121c8:	88 23       	and	r24, r24
   121ca:	29 f0       	breq	.+10     	; 0x121d6 <process_commands() [clone .part.46]+0x21e>

            SERIAL_PROTOCOLLNPGM(FW_VERSION_FULL);
   121cc:	88 e1       	ldi	r24, 0x18	; 24
   121ce:	91 e8       	ldi	r25, 0x81	; 129
  else
  {
    SERIAL_ECHO_START;
    SERIAL_ECHORPGM(MSG_UNKNOWN_COMMAND);
    SERIAL_ECHO(CMDBUFFER_CURRENT_STRING);
    SERIAL_ECHOLNPGM("\"(2)");
   121d0:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   121d4:	41 cf       	rjmp	.-382    	; 0x12058 <process_commands() [clone .part.46]+0xa0>
                puts(SN);
        } else if(code_seen_P(PSTR("Fir"))){ // PRUSA Fir

            SERIAL_PROTOCOLLNPGM(FW_VERSION_FULL);

    } else if(code_seen_P(PSTR("Rev"))){ // PRUSA Rev
   121d6:	84 e1       	ldi	r24, 0x14	; 20
   121d8:	91 e8       	ldi	r25, 0x81	; 129
   121da:	0f 94 62 3c 	call	0x278c4	; 0x278c4 <code_seen_P(char const*) [clone .lto_priv.409]>
   121de:	88 23       	and	r24, r24
   121e0:	19 f0       	breq	.+6      	; 0x121e8 <process_commands() [clone .part.46]+0x230>

      SERIAL_PROTOCOLLNPGM(FILAMENT_SIZE "-" ELECTRONICS "-" NOZZLE_TYPE );
   121e2:	85 ef       	ldi	r24, 0xF5	; 245
   121e4:	90 e8       	ldi	r25, 0x80	; 128
   121e6:	f4 cf       	rjmp	.-24     	; 0x121d0 <process_commands() [clone .part.46]+0x218>

    } else if(code_seen_P(PSTR("Lang"))) { // PRUSA Lang
   121e8:	80 ef       	ldi	r24, 0xF0	; 240
   121ea:	90 e8       	ldi	r25, 0x80	; 128
   121ec:	0f 94 62 3c 	call	0x278c4	; 0x278c4 <code_seen_P(char const*) [clone .lto_priv.409]>
   121f0:	88 23       	and	r24, r24
   121f2:	19 f0       	breq	.+6      	; 0x121fa <process_commands() [clone .part.46]+0x242>
	lcd_clear();
	Sound_MakeCustom(100,0,false);
	switch (level) {

	case 0: // Level 0: Language reset
		lang_reset();
   121f4:	0e 94 3d 74 	call	0xe87a	; 0xe87a <lang_reset>
   121f8:	2f cf       	rjmp	.-418    	; 0x12058 <process_commands() [clone .part.46]+0xa0>
      SERIAL_PROTOCOLLNPGM(FILAMENT_SIZE "-" ELECTRONICS "-" NOZZLE_TYPE );

    } else if(code_seen_P(PSTR("Lang"))) { // PRUSA Lang
        lang_reset();

    } else if(code_seen_P(PSTR("Lz"))) { // PRUSA Lz
   121fa:	8d ee       	ldi	r24, 0xED	; 237
   121fc:	90 e8       	ldi	r25, 0x80	; 128
   121fe:	0f 94 62 3c 	call	0x278c4	; 0x278c4 <code_seen_P(char const*) [clone .lto_priv.409]>
   12202:	88 23       	and	r24, r24
   12204:	79 f0       	breq	.+30     	; 0x12224 <process_commands() [clone .part.46]+0x26c>
      eeprom_update_word_notify(reinterpret_cast<uint16_t *>(&(EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)),0);
   12206:	81 ea       	ldi	r24, 0xA1	; 161
   12208:	9d e0       	ldi	r25, 0x0D	; 13
   1220a:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1220e:	2b e0       	ldi	r18, 0x0B	; 11
   12210:	82 9f       	mul	r24, r18
   12212:	c0 01       	movw	r24, r0
   12214:	11 24       	eor	r1, r1
        if (previous_value != value) {
            eeprom_word_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_word(dst, value);
   12216:	70 e0       	ldi	r23, 0x00	; 0
   12218:	60 e0       	ldi	r22, 0x00	; 0
   1221a:	80 5b       	subi	r24, 0xB0	; 176
   1221c:	92 4f       	sbci	r25, 0xF2	; 242
   1221e:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>
   12222:	1a cf       	rjmp	.-460    	; 0x12058 <process_commands() [clone .part.46]+0xa0>

    } else if(code_seen_P(PSTR("FR"))) { // PRUSA FR
   12224:	8a ee       	ldi	r24, 0xEA	; 234
   12226:	90 e8       	ldi	r25, 0x80	; 128
   12228:	0f 94 62 3c 	call	0x278c4	; 0x278c4 <code_seen_P(char const*) [clone .lto_priv.409]>
   1222c:	88 23       	and	r24, r24
   1222e:	51 f0       	breq	.+20     	; 0x12244 <process_commands() [clone .part.46]+0x28c>
// Factory reset function
// This function is used to erase parts or whole EEPROM memory which is used for storing calibration and and so on.
// Level input parameter sets depth of reset
static void factory_reset(char level)
{
	lcd_clear();
   12230:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
	Sound_MakeCustom(100,0,false);
   12234:	40 e0       	ldi	r20, 0x00	; 0
   12236:	70 e0       	ldi	r23, 0x00	; 0
   12238:	60 e0       	ldi	r22, 0x00	; 0
   1223a:	84 e6       	ldi	r24, 0x64	; 100
   1223c:	90 e0       	ldi	r25, 0x00	; 0
   1223e:	0f 94 be 27 	call	0x24f7c	; 0x24f7c <Sound_MakeCustom(unsigned int, unsigned int, bool)>
   12242:	d8 cf       	rjmp	.-80     	; 0x121f4 <process_commands() [clone .part.46]+0x23c>
      eeprom_update_word_notify(reinterpret_cast<uint16_t *>(&(EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)),0);

    } else if(code_seen_P(PSTR("FR"))) { // PRUSA FR
        // Factory full reset
        factory_reset(0);
    } else if(code_seen_P(PSTR("MBL"))) { // PRUSA MBL
   12244:	86 ee       	ldi	r24, 0xE6	; 230
   12246:	90 e8       	ldi	r25, 0x80	; 128
   12248:	0f 94 62 3c 	call	0x278c4	; 0x278c4 <code_seen_P(char const*) [clone .lto_priv.409]>
   1224c:	88 23       	and	r24, r24
   1224e:	e1 f0       	breq	.+56     	; 0x12288 <process_commands() [clone .part.46]+0x2d0>
        // Change the MBL status without changing the logical Z position.
        if(code_seen('V')) {
   12250:	86 e5       	ldi	r24, 0x56	; 86
   12252:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   12256:	88 23       	and	r24, r24
   12258:	09 f4       	brne	.+2      	; 0x1225c <process_commands() [clone .part.46]+0x2a4>
   1225a:	fe ce       	rjmp	.-516    	; 0x12058 <process_commands() [clone .part.46]+0xa0>
            bool value = code_value_short();
   1225c:	0e 94 17 56 	call	0xac2e	; 0xac2e <code_value_short() [clone .lto_priv.505]>
   12260:	11 e0       	ldi	r17, 0x01	; 1
   12262:	89 2b       	or	r24, r25
   12264:	09 f4       	brne	.+2      	; 0x12268 <process_commands() [clone .part.46]+0x2b0>
   12266:	10 e0       	ldi	r17, 0x00	; 0
            st_synchronize();
   12268:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
            if(value != mbl.active) {
   1226c:	80 91 09 13 	lds	r24, 0x1309	; 0x801309 <mbl>
   12270:	90 e0       	ldi	r25, 0x00	; 0
   12272:	18 17       	cp	r17, r24
   12274:	19 06       	cpc	r1, r25
   12276:	09 f4       	brne	.+2      	; 0x1227a <process_commands() [clone .part.46]+0x2c2>
   12278:	ef ce       	rjmp	.-546    	; 0x12058 <process_commands() [clone .part.46]+0xa0>
                mbl.active = value;
   1227a:	10 93 09 13 	sts	0x1309, r17	; 0x801309 <mbl>
                // Use plan_set_z_position to reset the physical values
                plan_set_z_position(current_position[Z_AXIS]);
   1227e:	89 e6       	ldi	r24, 0x69	; 105
   12280:	92 e1       	ldi	r25, 0x12	; 18
   12282:	0f 94 0c 3d 	call	0x27a18	; 0x27a18 <plan_set_z_position(float const&)>
   12286:	e8 ce       	rjmp	.-560    	; 0x12058 <process_commands() [clone .part.46]+0xa0>
            }
        }
    } else if (code_seen_P(PSTR("nozzle"))) { // PRUSA nozzle
   12288:	8f ed       	ldi	r24, 0xDF	; 223
   1228a:	90 e8       	ldi	r25, 0x80	; 128
   1228c:	0f 94 62 3c 	call	0x278c4	; 0x278c4 <code_seen_P(char const*) [clone .lto_priv.409]>
   12290:	88 23       	and	r24, r24
   12292:	09 f4       	brne	.+2      	; 0x12296 <process_commands() [clone .part.46]+0x2de>
   12294:	e1 ce       	rjmp	.-574    	; 0x12058 <process_commands() [clone .part.46]+0xa0>
            uint16_t nDiameter;
            if(code_seen('D')) {
   12296:	84 e4       	ldi	r24, 0x44	; 68
   12298:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   1229c:	88 23       	and	r24, r24
   1229e:	a1 f0       	breq	.+40     	; 0x122c8 <process_commands() [clone .part.46]+0x310>
                nDiameter=(uint16_t)(code_value()*1000.0+0.5); // [,um]
   122a0:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   122a4:	20 e0       	ldi	r18, 0x00	; 0
   122a6:	30 e0       	ldi	r19, 0x00	; 0
   122a8:	4a e7       	ldi	r20, 0x7A	; 122
   122aa:	54 e4       	ldi	r21, 0x44	; 68
   122ac:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   122b0:	20 e0       	ldi	r18, 0x00	; 0
   122b2:	30 e0       	ldi	r19, 0x00	; 0
   122b4:	40 e0       	ldi	r20, 0x00	; 0
   122b6:	5f e3       	ldi	r21, 0x3F	; 63
   122b8:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   122bc:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
                nozzle_diameter_check(nDiameter);
   122c0:	cb 01       	movw	r24, r22
   122c2:	0e 94 1e eb 	call	0x1d63c	; 0x1d63c <nozzle_diameter_check(unsigned int)>
   122c6:	c8 ce       	rjmp	.-624    	; 0x12058 <process_commands() [clone .part.46]+0xa0>
            } else if(code_seen_P(PSTR("set")) && farm_mode) {
   122c8:	8b ed       	ldi	r24, 0xDB	; 219
   122ca:	90 e8       	ldi	r25, 0x80	; 128
   122cc:	0f 94 62 3c 	call	0x278c4	; 0x278c4 <code_seen_P(char const*) [clone .lto_priv.409]>
   122d0:	88 23       	and	r24, r24
   122d2:	49 f1       	breq	.+82     	; 0x12326 <process_commands() [clone .part.46]+0x36e>
   122d4:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   122d8:	88 23       	and	r24, r24
   122da:	29 f1       	breq	.+74     	; 0x12326 <process_commands() [clone .part.46]+0x36e>
                strchr_pointer++;                  // skip 1st char (~ 's')
                strchr_pointer++;                  // skip 2nd char (~ 'e')
   122dc:	80 91 bb 04 	lds	r24, 0x04BB	; 0x8004bb <strchr_pointer>
   122e0:	90 91 bc 04 	lds	r25, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
   122e4:	02 96       	adiw	r24, 0x02	; 2
   122e6:	90 93 bc 04 	sts	0x04BC, r25	; 0x8004bc <strchr_pointer+0x1>
   122ea:	80 93 bb 04 	sts	0x04BB, r24	; 0x8004bb <strchr_pointer>
                nDiameter=(uint16_t)(code_value()*1000.0+0.5); // [,um]
   122ee:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   122f2:	6b 01       	movw	r12, r22
   122f4:	7c 01       	movw	r14, r24
        if (previous_value != value) {
            eeprom_byte_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_byte(dst, value);
   122f6:	6f ef       	ldi	r22, 0xFF	; 255
   122f8:	87 ea       	ldi	r24, 0xA7	; 167
   122fa:	9d e0       	ldi	r25, 0x0D	; 13
   122fc:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
   12300:	20 e0       	ldi	r18, 0x00	; 0
   12302:	30 e0       	ldi	r19, 0x00	; 0
   12304:	4a e7       	ldi	r20, 0x7A	; 122
   12306:	54 e4       	ldi	r21, 0x44	; 68
   12308:	c7 01       	movw	r24, r14
   1230a:	b6 01       	movw	r22, r12
   1230c:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   12310:	20 e0       	ldi	r18, 0x00	; 0
   12312:	30 e0       	ldi	r19, 0x00	; 0
   12314:	40 e0       	ldi	r20, 0x00	; 0
   12316:	5f e3       	ldi	r21, 0x3F	; 63
   12318:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   1231c:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
        if (previous_value != value) {
            eeprom_word_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_word(dst, value);
   12320:	85 ea       	ldi	r24, 0xA5	; 165
   12322:	9d e0       	ldi	r25, 0x0D	; 13
   12324:	7c cf       	rjmp	.-264    	; 0x1221e <process_commands() [clone .part.46]+0x266>
                eeprom_update_byte_notify((uint8_t*)EEPROM_NOZZLE_DIAMETER,(uint8_t)ClNozzleDiameter::_Diameter_Undef); // for correct synchronization after farm-mode exiting
                eeprom_update_word_notify((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM,nDiameter);
            } else SERIAL_PROTOCOLLN((float)eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM)/1000.0);
   12326:	85 ea       	ldi	r24, 0xA5	; 165
   12328:	9d e0       	ldi	r25, 0x0D	; 13
   1232a:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
   1232e:	bc 01       	movw	r22, r24
   12330:	90 e0       	ldi	r25, 0x00	; 0
   12332:	80 e0       	ldi	r24, 0x00	; 0
   12334:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   12338:	20 e0       	ldi	r18, 0x00	; 0
   1233a:	30 e0       	ldi	r19, 0x00	; 0
   1233c:	4a e7       	ldi	r20, 0x7A	; 122
   1233e:	54 e4       	ldi	r21, 0x44	; 68
   12340:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   12344:	0f 94 a2 65 	call	0x2cb44	; 0x2cb44 <MarlinSerial::println(double, int) [clone .constprop.354]>
   12348:	87 ce       	rjmp	.-754    	; 0x12058 <process_commands() [clone .part.46]+0xa0>
    }
  }
  else if(*CMDBUFFER_CURRENT_STRING == 'G')
   1234a:	d8 01       	movw	r26, r16
   1234c:	8c 91       	ld	r24, X
   1234e:	87 34       	cpi	r24, 0x47	; 71
   12350:	11 f0       	breq	.+4      	; 0x12356 <process_commands() [clone .part.46]+0x39e>
   12352:	0c 94 d0 9c 	jmp	0x139a0	; 0x139a0 <process_commands() [clone .part.46]+0x19e8>
  {
	strchr_pointer = CMDBUFFER_CURRENT_STRING;
   12356:	10 93 bc 04 	sts	0x04BC, r17	; 0x8004bc <strchr_pointer+0x1>
   1235a:	00 93 bb 04 	sts	0x04BB, r16	; 0x8004bb <strchr_pointer>
	gcode_in_progress = code_value_short();
   1235e:	0e 94 17 56 	call	0xac2e	; 0xac2e <code_value_short() [clone .lto_priv.505]>
   12362:	90 93 56 03 	sts	0x0356, r25	; 0x800356 <gcode_in_progress+0x1>
   12366:	80 93 55 03 	sts	0x0355, r24	; 0x800355 <gcode_in_progress>
//	printf_P(_N("BEGIN G-CODE=%u\n"), gcode_in_progress);
    switch (gcode_in_progress)
   1236a:	8b 34       	cpi	r24, 0x4B	; 75
   1236c:	91 05       	cpc	r25, r1
   1236e:	09 f4       	brne	.+2      	; 0x12372 <process_commands() [clone .part.46]+0x3ba>
   12370:	45 c6       	rjmp	.+3210   	; 0x12ffc <process_commands() [clone .part.46]+0x1044>
   12372:	0c f0       	brlt	.+2      	; 0x12376 <process_commands() [clone .part.46]+0x3be>
   12374:	4b c1       	rjmp	.+662    	; 0x1260c <process_commands() [clone .part.46]+0x654>
   12376:	84 30       	cpi	r24, 0x04	; 4
   12378:	91 05       	cpc	r25, r1
   1237a:	09 f4       	brne	.+2      	; 0x1237e <process_commands() [clone .part.46]+0x3c6>
   1237c:	aa c5       	rjmp	.+2900   	; 0x12ed2 <process_commands() [clone .part.46]+0xf1a>
   1237e:	0c f0       	brlt	.+2      	; 0x12382 <process_commands() [clone .part.46]+0x3ca>
   12380:	c5 c0       	rjmp	.+394    	; 0x1250c <process_commands() [clone .part.46]+0x554>
   12382:	97 fd       	sbrc	r25, 7
   12384:	cf c0       	rjmp	.+414    	; 0x12524 <process_commands() [clone .part.46]+0x56c>
   12386:	02 97       	sbiw	r24, 0x02	; 2
   12388:	0c f0       	brlt	.+2      	; 0x1238c <process_commands() [clone .part.46]+0x3d4>
   1238a:	a2 c1       	rjmp	.+836    	; 0x126d0 <process_commands() [clone .part.46]+0x718>

    */
    case 0: // G0 -> G1
    case 1: // G1
        {
        uint16_t start_segment_idx = restore_interrupted_gcode();
   1238c:	0e 94 b1 54 	call	0xa962	; 0xa962 <restore_interrupted_gcode()>
   12390:	8c 01       	movw	r16, r24
        get_coordinates(); // For X Y Z E F
   12392:	0e 94 ac 5b 	call	0xb758	; 0xb758 <get_coordinates()>

		if (total_filament_used > ((current_position[E_AXIS] - destination[E_AXIS]) * 100)) { //protection against total_filament_used overflow
   12396:	60 91 17 06 	lds	r22, 0x0617	; 0x800617 <total_filament_used>
   1239a:	70 91 18 06 	lds	r23, 0x0618	; 0x800618 <total_filament_used+0x1>
   1239e:	80 91 19 06 	lds	r24, 0x0619	; 0x800619 <total_filament_used+0x2>
   123a2:	90 91 1a 06 	lds	r25, 0x061A	; 0x80061a <total_filament_used+0x3>
   123a6:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   123aa:	6b 01       	movw	r12, r22
   123ac:	7c 01       	movw	r14, r24
   123ae:	40 90 6d 12 	lds	r4, 0x126D	; 0x80126d <current_position+0xc>
   123b2:	50 90 6e 12 	lds	r5, 0x126E	; 0x80126e <current_position+0xd>
   123b6:	60 90 6f 12 	lds	r6, 0x126F	; 0x80126f <current_position+0xe>
   123ba:	70 90 70 12 	lds	r7, 0x1270	; 0x801270 <current_position+0xf>
   123be:	80 90 35 06 	lds	r8, 0x0635	; 0x800635 <destination+0xc>
   123c2:	90 90 36 06 	lds	r9, 0x0636	; 0x800636 <destination+0xd>
   123c6:	a0 90 37 06 	lds	r10, 0x0637	; 0x800637 <destination+0xe>
   123ca:	b0 90 38 06 	lds	r11, 0x0638	; 0x800638 <destination+0xf>
   123ce:	a5 01       	movw	r20, r10
   123d0:	94 01       	movw	r18, r8
   123d2:	c3 01       	movw	r24, r6
   123d4:	b2 01       	movw	r22, r4
   123d6:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   123da:	20 e0       	ldi	r18, 0x00	; 0
   123dc:	30 e0       	ldi	r19, 0x00	; 0
   123de:	48 ec       	ldi	r20, 0xC8	; 200
   123e0:	52 e4       	ldi	r21, 0x42	; 66
   123e2:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   123e6:	9b 01       	movw	r18, r22
   123e8:	ac 01       	movw	r20, r24
   123ea:	c7 01       	movw	r24, r14
   123ec:	b6 01       	movw	r22, r12
   123ee:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   123f2:	18 16       	cp	r1, r24
   123f4:	d4 f4       	brge	.+52     	; 0x1242a <process_commands() [clone .part.46]+0x472>
			total_filament_used = total_filament_used + ((destination[E_AXIS] - current_position[E_AXIS]) * 100);
   123f6:	a3 01       	movw	r20, r6
   123f8:	92 01       	movw	r18, r4
   123fa:	c5 01       	movw	r24, r10
   123fc:	b4 01       	movw	r22, r8
   123fe:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   12402:	20 e0       	ldi	r18, 0x00	; 0
   12404:	30 e0       	ldi	r19, 0x00	; 0
   12406:	48 ec       	ldi	r20, 0xC8	; 200
   12408:	52 e4       	ldi	r21, 0x42	; 66
   1240a:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   1240e:	a7 01       	movw	r20, r14
   12410:	96 01       	movw	r18, r12
   12412:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   12416:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   1241a:	60 93 17 06 	sts	0x0617, r22	; 0x800617 <total_filament_used>
   1241e:	70 93 18 06 	sts	0x0618, r23	; 0x800618 <total_filament_used+0x1>
   12422:	80 93 19 06 	sts	0x0619, r24	; 0x800619 <total_filament_used+0x2>
   12426:	90 93 1a 06 	sts	0x061A, r25	; 0x80061a <total_filament_used+0x3>
		}

#ifdef FWRETRACT
        if(cs.autoretract_enabled) {
   1242a:	80 91 e9 0d 	lds	r24, 0x0DE9	; 0x800de9 <cs+0x82>
   1242e:	88 23       	and	r24, r24
   12430:	09 f4       	brne	.+2      	; 0x12434 <process_commands() [clone .part.46]+0x47c>
   12432:	46 c1       	rjmp	.+652    	; 0x126c0 <process_commands() [clone .part.46]+0x708>
            if( !(code_seen('X') || code_seen('Y') || code_seen('Z')) && code_seen('E')) {
   12434:	88 e5       	ldi	r24, 0x58	; 88
   12436:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   1243a:	81 11       	cpse	r24, r1
   1243c:	41 c1       	rjmp	.+642    	; 0x126c0 <process_commands() [clone .part.46]+0x708>
   1243e:	89 e5       	ldi	r24, 0x59	; 89
   12440:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   12444:	81 11       	cpse	r24, r1
   12446:	3c c1       	rjmp	.+632    	; 0x126c0 <process_commands() [clone .part.46]+0x708>
   12448:	8a e5       	ldi	r24, 0x5A	; 90
   1244a:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   1244e:	81 11       	cpse	r24, r1
   12450:	37 c1       	rjmp	.+622    	; 0x126c0 <process_commands() [clone .part.46]+0x708>
   12452:	85 e4       	ldi	r24, 0x45	; 69
   12454:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   12458:	88 23       	and	r24, r24
   1245a:	09 f4       	brne	.+2      	; 0x1245e <process_commands() [clone .part.46]+0x4a6>
   1245c:	31 c1       	rjmp	.+610    	; 0x126c0 <process_commands() [clone .part.46]+0x708>
                float echange=destination[E_AXIS]-current_position[E_AXIS];
   1245e:	20 91 6d 12 	lds	r18, 0x126D	; 0x80126d <current_position+0xc>
   12462:	30 91 6e 12 	lds	r19, 0x126E	; 0x80126e <current_position+0xd>
   12466:	40 91 6f 12 	lds	r20, 0x126F	; 0x80126f <current_position+0xe>
   1246a:	50 91 70 12 	lds	r21, 0x1270	; 0x801270 <current_position+0xf>
   1246e:	60 91 35 06 	lds	r22, 0x0635	; 0x800635 <destination+0xc>
   12472:	70 91 36 06 	lds	r23, 0x0636	; 0x800636 <destination+0xd>
   12476:	80 91 37 06 	lds	r24, 0x0637	; 0x800637 <destination+0xe>
   1247a:	90 91 38 06 	lds	r25, 0x0638	; 0x800638 <destination+0xf>
   1247e:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   12482:	6b 01       	movw	r12, r22
   12484:	7c 01       	movw	r14, r24
                if((echange<-MIN_RETRACT && !retracted[active_extruder]) || (echange>MIN_RETRACT && retracted[active_extruder])) { //move appears to be an attempt to retract or recover
   12486:	2d ec       	ldi	r18, 0xCD	; 205
   12488:	3c ec       	ldi	r19, 0xCC	; 204
   1248a:	4c ec       	ldi	r20, 0xCC	; 204
   1248c:	5d eb       	ldi	r21, 0xBD	; 189
   1248e:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   12492:	87 ff       	sbrs	r24, 7
   12494:	07 c1       	rjmp	.+526    	; 0x126a4 <process_commands() [clone .part.46]+0x6ec>
   12496:	80 91 1b 06 	lds	r24, 0x061B	; 0x80061b <retracted>
   1249a:	81 11       	cpse	r24, r1
   1249c:	0c 94 0d bc 	jmp	0x1781a	; 0x1781a <process_commands() [clone .part.46]+0x5862>
                    st_synchronize();
   124a0:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
                    current_position[E_AXIS] = destination[E_AXIS]; //hide the slicer-generated retract/recover from calculations
   124a4:	80 91 35 06 	lds	r24, 0x0635	; 0x800635 <destination+0xc>
   124a8:	90 91 36 06 	lds	r25, 0x0636	; 0x800636 <destination+0xd>
   124ac:	a0 91 37 06 	lds	r26, 0x0637	; 0x800637 <destination+0xe>
   124b0:	b0 91 38 06 	lds	r27, 0x0638	; 0x800638 <destination+0xf>
   124b4:	80 93 6d 12 	sts	0x126D, r24	; 0x80126d <current_position+0xc>
   124b8:	90 93 6e 12 	sts	0x126E, r25	; 0x80126e <current_position+0xd>
   124bc:	a0 93 6f 12 	sts	0x126F, r26	; 0x80126f <current_position+0xe>
   124c0:	b0 93 70 12 	sts	0x1270, r27	; 0x801270 <current_position+0xf>
                    plan_set_e_position(current_position[E_AXIS]); //AND from the planner
   124c4:	8d e6       	ldi	r24, 0x6D	; 109
   124c6:	92 e1       	ldi	r25, 0x12	; 18
   124c8:	0f 94 d9 3c 	call	0x279b2	; 0x279b2 <plan_set_e_position(float const&)>
                    retract(!retracted[active_extruder]);
   124cc:	90 91 1b 06 	lds	r25, 0x061B	; 0x80061b <retracted>
   124d0:	81 e0       	ldi	r24, 0x01	; 1
   124d2:	89 27       	eor	r24, r25
   124d4:	0f 94 2c 90 	call	0x32058	; 0x32058 <retract(bool, bool) [clone .constprop.54]>
    SERIAL_ECHO(CMDBUFFER_CURRENT_STRING);
    SERIAL_ECHOLNPGM("\"(2)");
  }
  KEEPALIVE_STATE(NOT_BUSY);
  ClearToSend();
}
   124d8:	cd 59       	subi	r28, 0x9D	; 157
   124da:	df 4f       	sbci	r29, 0xFF	; 255
   124dc:	0f b6       	in	r0, 0x3f	; 63
   124de:	f8 94       	cli
   124e0:	de bf       	out	0x3e, r29	; 62
   124e2:	0f be       	out	0x3f, r0	; 63
   124e4:	cd bf       	out	0x3d, r28	; 61
   124e6:	df 91       	pop	r29
   124e8:	cf 91       	pop	r28
   124ea:	1f 91       	pop	r17
   124ec:	0f 91       	pop	r16
   124ee:	ff 90       	pop	r15
   124f0:	ef 90       	pop	r14
   124f2:	df 90       	pop	r13
   124f4:	cf 90       	pop	r12
   124f6:	bf 90       	pop	r11
   124f8:	af 90       	pop	r10
   124fa:	9f 90       	pop	r9
   124fc:	8f 90       	pop	r8
   124fe:	7f 90       	pop	r7
   12500:	6f 90       	pop	r6
   12502:	5f 90       	pop	r5
   12504:	4f 90       	pop	r4
   12506:	3f 90       	pop	r3
   12508:	2f 90       	pop	r2
   1250a:	08 95       	ret
  else if(*CMDBUFFER_CURRENT_STRING == 'G')
  {
	strchr_pointer = CMDBUFFER_CURRENT_STRING;
	gcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN G-CODE=%u\n"), gcode_in_progress);
    switch (gcode_in_progress)
   1250c:	85 31       	cpi	r24, 0x15	; 21
   1250e:	91 05       	cpc	r25, r1
   12510:	09 f4       	brne	.+2      	; 0x12514 <process_commands() [clone .part.46]+0x55c>
   12512:	d9 c0       	rjmp	.+434    	; 0x126c6 <process_commands() [clone .part.46]+0x70e>
   12514:	fc f4       	brge	.+62     	; 0x12554 <process_commands() [clone .part.46]+0x59c>
   12516:	8a 30       	cpi	r24, 0x0A	; 10
   12518:	91 05       	cpc	r25, r1
   1251a:	09 f4       	brne	.+2      	; 0x1251e <process_commands() [clone .part.46]+0x566>
   1251c:	23 c5       	rjmp	.+2630   	; 0x12f64 <process_commands() [clone .part.46]+0xfac>
   1251e:	0b 97       	sbiw	r24, 0x0b	; 11
   12520:	09 f4       	brne	.+2      	; 0x12524 <process_commands() [clone .part.46]+0x56c>
   12522:	24 c5       	rjmp	.+2632   	; 0x12f6c <process_commands() [clone .part.46]+0xfb4>
    case 99:
        farm_gcode_g99();
        break;
#endif //PRUSA_FARM
	default:
		printf_P(MSG_UNKNOWN_CODE, 'G', cmdbuffer + bufindr + CMDHDRSIZE);
   12524:	80 91 38 12 	lds	r24, 0x1238	; 0x801238 <bufindr>
   12528:	90 91 39 12 	lds	r25, 0x1239	; 0x801239 <bufindr+0x1>
   1252c:	82 5b       	subi	r24, 0xB2	; 178
   1252e:	9f 4e       	sbci	r25, 0xEF	; 239
   12530:	9f 93       	push	r25
   12532:	8f 93       	push	r24
   12534:	1f 92       	push	r1
   12536:	87 e4       	ldi	r24, 0x47	; 71
   12538:	8f 93       	push	r24
   1253a:	88 e5       	ldi	r24, 0x58	; 88
   1253c:	96 e6       	ldi	r25, 0x66	; 102
   1253e:	9f 93       	push	r25
   12540:	8f 93       	push	r24
   12542:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   12546:	0f 90       	pop	r0
   12548:	0f 90       	pop	r0
   1254a:	0f 90       	pop	r0
   1254c:	0f 90       	pop	r0
   1254e:	0f 90       	pop	r0
   12550:	0f 90       	pop	r0
   12552:	b9 c0       	rjmp	.+370    	; 0x126c6 <process_commands() [clone .part.46]+0x70e>
  else if(*CMDBUFFER_CURRENT_STRING == 'G')
  {
	strchr_pointer = CMDBUFFER_CURRENT_STRING;
	gcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN G-CODE=%u\n"), gcode_in_progress);
    switch (gcode_in_progress)
   12554:	8c 31       	cpi	r24, 0x1C	; 28
   12556:	91 05       	cpc	r25, r1
   12558:	09 f4       	brne	.+2      	; 0x1255c <process_commands() [clone .part.46]+0x5a4>
   1255a:	0a c5       	rjmp	.+2580   	; 0x12f70 <process_commands() [clone .part.46]+0xfb8>
   1255c:	4e 97       	sbiw	r24, 0x1e	; 30
   1255e:	11 f7       	brne	.-60     	; 0x12524 <process_commands() [clone .part.46]+0x56c>
    Sensor must be over the bed.
    The maximum travel distance before an error is triggered is 10mm.
    */
    case 30:
        {
            st_synchronize();
   12560:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
            homing_flag = true;
   12564:	81 e0       	ldi	r24, 0x01	; 1
   12566:	80 93 71 12 	sts	0x1271, r24	; 0x801271 <homing_flag>

            // TODO: make sure the bed_level_rotation_matrix is identity or the planner will get set incorectly
            int l_feedmultiply = setup_for_endstop_move();
   1256a:	0e 94 66 65 	call	0xcacc	; 0xcacc <setup_for_endstop_move(bool) [clone .lto_priv.381]>
   1256e:	8c 01       	movw	r16, r24

            feedrate = homing_feedrate[Z_AXIS];
   12570:	80 e0       	ldi	r24, 0x00	; 0
   12572:	90 e0       	ldi	r25, 0x00	; 0
   12574:	a8 e4       	ldi	r26, 0x48	; 72
   12576:	b4 e4       	ldi	r27, 0x44	; 68
   12578:	80 93 7a 02 	sts	0x027A, r24	; 0x80027a <feedrate>
   1257c:	90 93 7b 02 	sts	0x027B, r25	; 0x80027b <feedrate+0x1>
   12580:	a0 93 7c 02 	sts	0x027C, r26	; 0x80027c <feedrate+0x2>
   12584:	b0 93 7d 02 	sts	0x027D, r27	; 0x80027d <feedrate+0x3>

            find_bed_induction_sensor_point_z(-10.f, 3);
   12588:	43 e0       	ldi	r20, 0x03	; 3
   1258a:	60 e0       	ldi	r22, 0x00	; 0
   1258c:	70 e0       	ldi	r23, 0x00	; 0
   1258e:	80 e2       	ldi	r24, 0x20	; 32
   12590:	91 ec       	ldi	r25, 0xC1	; 193
   12592:	0f 94 ed 7b 	call	0x2f7da	; 0x2f7da <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.86]>

			printf_P(_N("%S X: %.5f Y: %.5f Z: %.5f\n"), _T(MSG_BED), _x, _y, _z);
   12596:	70 90 69 12 	lds	r7, 0x1269	; 0x801269 <current_position+0x8>
   1259a:	60 90 6a 12 	lds	r6, 0x126A	; 0x80126a <current_position+0x9>
   1259e:	50 90 6b 12 	lds	r5, 0x126B	; 0x80126b <current_position+0xa>
   125a2:	40 90 6c 12 	lds	r4, 0x126C	; 0x80126c <current_position+0xb>
   125a6:	b0 90 65 12 	lds	r11, 0x1265	; 0x801265 <current_position+0x4>
   125aa:	a0 90 66 12 	lds	r10, 0x1266	; 0x801266 <current_position+0x5>
   125ae:	90 90 67 12 	lds	r9, 0x1267	; 0x801267 <current_position+0x6>
   125b2:	80 90 68 12 	lds	r8, 0x1268	; 0x801268 <current_position+0x7>
   125b6:	f0 90 61 12 	lds	r15, 0x1261	; 0x801261 <current_position>
   125ba:	e0 90 62 12 	lds	r14, 0x1262	; 0x801262 <current_position+0x1>
   125be:	d0 90 63 12 	lds	r13, 0x1263	; 0x801263 <current_position+0x2>
   125c2:	c0 90 64 12 	lds	r12, 0x1264	; 0x801264 <current_position+0x3>
   125c6:	81 ec       	ldi	r24, 0xC1	; 193
   125c8:	94 e4       	ldi	r25, 0x44	; 68
   125ca:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   125ce:	4f 92       	push	r4
   125d0:	5f 92       	push	r5
   125d2:	6f 92       	push	r6
   125d4:	7f 92       	push	r7
   125d6:	8f 92       	push	r8
   125d8:	9f 92       	push	r9
   125da:	af 92       	push	r10
   125dc:	bf 92       	push	r11
   125de:	cf 92       	push	r12
   125e0:	df 92       	push	r13
   125e2:	ef 92       	push	r14
   125e4:	ff 92       	push	r15
   125e6:	9f 93       	push	r25
   125e8:	8f 93       	push	r24
   125ea:	81 e1       	ldi	r24, 0x11	; 17
   125ec:	97 e6       	ldi	r25, 0x67	; 103
   125ee:	9f 93       	push	r25
   125f0:	8f 93       	push	r24
   125f2:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>

            clean_up_after_endstop_move(l_feedmultiply);
   125f6:	c8 01       	movw	r24, r16
   125f8:	0e 94 4c 65 	call	0xca98	; 0xca98 <clean_up_after_endstop_move(int) [clone .lto_priv.382]>
            homing_flag = false;
   125fc:	10 92 71 12 	sts	0x1271, r1	; 0x801271 <homing_flag>
   12600:	0f b6       	in	r0, 0x3f	; 63
   12602:	f8 94       	cli
   12604:	de bf       	out	0x3e, r29	; 62
   12606:	0f be       	out	0x3f, r0	; 63
   12608:	cd bf       	out	0x3d, r28	; 61
   1260a:	5d c0       	rjmp	.+186    	; 0x126c6 <process_commands() [clone .part.46]+0x70e>
  else if(*CMDBUFFER_CURRENT_STRING == 'G')
  {
	strchr_pointer = CMDBUFFER_CURRENT_STRING;
	gcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN G-CODE=%u\n"), gcode_in_progress);
    switch (gcode_in_progress)
   1260c:	88 35       	cpi	r24, 0x58	; 88
   1260e:	91 05       	cpc	r25, r1
   12610:	09 f4       	brne	.+2      	; 0x12614 <process_commands() [clone .part.46]+0x65c>
   12612:	59 c0       	rjmp	.+178    	; 0x126c6 <process_commands() [clone .part.46]+0x70e>
   12614:	f4 f4       	brge	.+60     	; 0x12652 <process_commands() [clone .part.46]+0x69a>
   12616:	81 35       	cpi	r24, 0x51	; 81
   12618:	91 05       	cpc	r25, r1
   1261a:	11 f4       	brne	.+4      	; 0x12620 <process_commands() [clone .part.46]+0x668>
   1261c:	0c 94 16 9c 	jmp	0x1382c	; 0x1382c <process_commands() [clone .part.46]+0x1874>
   12620:	5c f4       	brge	.+22     	; 0x12638 <process_commands() [clone .part.46]+0x680>
   12622:	8c 34       	cpi	r24, 0x4C	; 76
   12624:	91 05       	cpc	r25, r1
   12626:	09 f4       	brne	.+2      	; 0x1262a <process_commands() [clone .part.46]+0x672>
   12628:	0c c5       	rjmp	.+2584   	; 0x13042 <process_commands() [clone .part.46]+0x108a>
   1262a:	80 35       	cpi	r24, 0x50	; 80
   1262c:	91 05       	cpc	r25, r1
   1262e:	09 f0       	breq	.+2      	; 0x12632 <process_commands() [clone .part.46]+0x67a>
   12630:	79 cf       	rjmp	.-270    	; 0x12524 <process_commands() [clone .part.46]+0x56c>
      - `W` - area width (on X axis)
      - `H` - area height (on Y axis)
    */

	case 80: {
        gcode_G80();
   12632:	0e 94 49 7d 	call	0xfa92	; 0xfa92 <gcode_G80()>
   12636:	47 c0       	rjmp	.+142    	; 0x126c6 <process_commands() [clone .part.46]+0x70e>
  else if(*CMDBUFFER_CURRENT_STRING == 'G')
  {
	strchr_pointer = CMDBUFFER_CURRENT_STRING;
	gcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN G-CODE=%u\n"), gcode_in_progress);
    switch (gcode_in_progress)
   12638:	86 35       	cpi	r24, 0x56	; 86
   1263a:	91 05       	cpc	r25, r1
   1263c:	11 f4       	brne	.+4      	; 0x12642 <process_commands() [clone .part.46]+0x68a>
   1263e:	0c 94 1a 9c 	jmp	0x13834	; 0x13834 <process_commands() [clone .part.46]+0x187c>
   12642:	87 35       	cpi	r24, 0x57	; 87
   12644:	91 05       	cpc	r25, r1
   12646:	09 f0       	breq	.+2      	; 0x1264a <process_commands() [clone .part.46]+0x692>
   12648:	6d cf       	rjmp	.-294    	; 0x12524 <process_commands() [clone .part.46]+0x56c>

        This G-code will be performed at the end of a calibration script.
        (Prusa3D specific)
        */
        case 87:
            calibration_status_set(CALIBRATION_STATUS_LIVE_ADJUST);
   1264a:	80 e1       	ldi	r24, 0x10	; 16
   1264c:	0e 94 4e d7 	call	0x1ae9c	; 0x1ae9c <calibration_status_set(unsigned char)>
   12650:	3a c0       	rjmp	.+116    	; 0x126c6 <process_commands() [clone .part.46]+0x70e>
  else if(*CMDBUFFER_CURRENT_STRING == 'G')
  {
	strchr_pointer = CMDBUFFER_CURRENT_STRING;
	gcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN G-CODE=%u\n"), gcode_in_progress);
    switch (gcode_in_progress)
   12652:	8c 35       	cpi	r24, 0x5C	; 92
   12654:	91 05       	cpc	r25, r1
   12656:	11 f4       	brne	.+4      	; 0x1265c <process_commands() [clone .part.46]+0x6a4>
   12658:	0c 94 26 9c 	jmp	0x1384c	; 0x1384c <process_commands() [clone .part.46]+0x1894>
   1265c:	74 f4       	brge	.+28     	; 0x1267a <process_commands() [clone .part.46]+0x6c2>
   1265e:	8a 35       	cpi	r24, 0x5A	; 90
   12660:	91 05       	cpc	r25, r1
   12662:	11 f4       	brne	.+4      	; 0x12668 <process_commands() [clone .part.46]+0x6b0>
   12664:	0c 94 1f 9c 	jmp	0x1383e	; 0x1383e <process_commands() [clone .part.46]+0x1886>
   12668:	8b 35       	cpi	r24, 0x5B	; 91
   1266a:	91 05       	cpc	r25, r1
   1266c:	09 f0       	breq	.+2      	; 0x12670 <process_commands() [clone .part.46]+0x6b8>
   1266e:	5a cf       	rjmp	.-332    	; 0x12524 <process_commands() [clone .part.46]+0x56c>
    /*!
    ### G91 - Switch on relative mode <a href="https://reprap.org/wiki/G-code#G91:_Set_to_Relative_Positioning">G91: Set to Relative Positioning</a>
    All coordinates from now on are relative to the last position. E axis is left intact.
    */
    case 91: {
		axis_relative_modes |= X_AXIS_MASK | Y_AXIS_MASK | Z_AXIS_MASK;
   12670:	80 91 57 12 	lds	r24, 0x1257	; 0x801257 <axis_relative_modes>
   12674:	87 60       	ori	r24, 0x07	; 7
   12676:	0c 94 22 9c 	jmp	0x13844	; 0x13844 <process_commands() [clone .part.46]+0x188c>
  else if(*CMDBUFFER_CURRENT_STRING == 'G')
  {
	strchr_pointer = CMDBUFFER_CURRENT_STRING;
	gcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN G-CODE=%u\n"), gcode_in_progress);
    switch (gcode_in_progress)
   1267a:	82 36       	cpi	r24, 0x62	; 98
   1267c:	91 05       	cpc	r25, r1
   1267e:	11 f4       	brne	.+4      	; 0x12684 <process_commands() [clone .part.46]+0x6cc>
   12680:	0c 94 bd 9c 	jmp	0x1397a	; 0x1397a <process_commands() [clone .part.46]+0x19c2>
   12684:	83 36       	cpi	r24, 0x63	; 99
   12686:	91 05       	cpc	r25, r1
   12688:	09 f0       	breq	.+2      	; 0x1268c <process_commands() [clone .part.46]+0x6d4>
   1268a:	4c cf       	rjmp	.-360    	; 0x12524 <process_commands() [clone .part.46]+0x56c>
    lcd_update(2);
    fCheckModeInit(); // alternatively invoke printer reset
}

void farm_disable() {
    farm_mode = false;
   1268c:	10 92 60 0d 	sts	0x0D60, r1	; 0x800d60 <farm_mode>
        if (previous_value != value) {
            eeprom_byte_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_byte(dst, value);
   12690:	60 e0       	ldi	r22, 0x00	; 0
   12692:	84 ec       	ldi	r24, 0xC4	; 196
   12694:	9f e0       	ldi	r25, 0x0F	; 15
   12696:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
    fCheckModeInit(); // alternatively invoke printer reset
}

void farm_gcode_g99() {
    farm_disable();
    lcd_update(2);
   1269a:	82 e0       	ldi	r24, 0x02	; 2
   1269c:	0e 94 f9 6e 	call	0xddf2	; 0xddf2 <lcd_update(unsigned char)>
   126a0:	0c 94 cc 9c 	jmp	0x13998	; 0x13998 <process_commands() [clone .part.46]+0x19e0>

#ifdef FWRETRACT
        if(cs.autoretract_enabled) {
            if( !(code_seen('X') || code_seen('Y') || code_seen('Z')) && code_seen('E')) {
                float echange=destination[E_AXIS]-current_position[E_AXIS];
                if((echange<-MIN_RETRACT && !retracted[active_extruder]) || (echange>MIN_RETRACT && retracted[active_extruder])) { //move appears to be an attempt to retract or recover
   126a4:	2d ec       	ldi	r18, 0xCD	; 205
   126a6:	3c ec       	ldi	r19, 0xCC	; 204
   126a8:	4c ec       	ldi	r20, 0xCC	; 204
   126aa:	5d e3       	ldi	r21, 0x3D	; 61
   126ac:	c7 01       	movw	r24, r14
   126ae:	b6 01       	movw	r22, r12
   126b0:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   126b4:	18 16       	cp	r1, r24
   126b6:	24 f4       	brge	.+8      	; 0x126c0 <process_commands() [clone .part.46]+0x708>
   126b8:	80 91 1b 06 	lds	r24, 0x061B	; 0x80061b <retracted>
   126bc:	81 11       	cpse	r24, r1
   126be:	f0 ce       	rjmp	.-544    	; 0x124a0 <process_commands() [clone .part.46]+0x4e8>
                }
            }
        }
#endif //FWRETRACT

        prepare_move(start_segment_idx);
   126c0:	c8 01       	movw	r24, r16
   126c2:	0e 94 bb 6a 	call	0xd576	; 0xd576 <prepare_move(unsigned int)>
#endif //PRUSA_FARM
	default:
		printf_P(MSG_UNKNOWN_CODE, 'G', cmdbuffer + bufindr + CMDHDRSIZE);
    }
//	printf_P(_N("END G-CODE=%u\n"), gcode_in_progress);
	gcode_in_progress = 0;
   126c6:	10 92 56 03 	sts	0x0356, r1	; 0x800356 <gcode_in_progress+0x1>
   126ca:	10 92 55 03 	sts	0x0355, r1	; 0x800355 <gcode_in_progress>
   126ce:	c4 cc       	rjmp	.-1656   	; 0x12058 <process_commands() [clone .part.46]+0xa0>

    */
    case 2:
    case 3:
    {
        uint16_t start_segment_idx = restore_interrupted_gcode();
   126d0:	0e 94 b1 54 	call	0xa962	; 0xa962 <restore_interrupted_gcode()>
   126d4:	2e 96       	adiw	r28, 0x0e	; 14
   126d6:	9f af       	std	Y+63, r25	; 0x3f
   126d8:	8e af       	std	Y+62, r24	; 0x3e
   126da:	2e 97       	sbiw	r28, 0x0e	; 14
#ifdef SF_ARC_FIX
        bool relative_mode_backup = relative_mode;
        relative_mode = true;
#endif
        get_coordinates(); // For X Y Z E F
   126dc:	0e 94 ac 5b 	call	0xb758	; 0xb758 <get_coordinates()>
#ifdef SF_ARC_FIX
        relative_mode=relative_mode_backup;
#endif

        offset[0] = code_seen('I') ? code_value() : 0.f;
   126e0:	89 e4       	ldi	r24, 0x49	; 73
   126e2:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   126e6:	88 23       	and	r24, r24
   126e8:	09 f4       	brne	.+2      	; 0x126ec <process_commands() [clone .part.46]+0x734>
   126ea:	a0 c3       	rjmp	.+1856   	; 0x12e2c <process_commands() [clone .part.46]+0xe74>
   126ec:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   126f0:	60 93 4d 03 	sts	0x034D, r22	; 0x80034d <offset>
   126f4:	70 93 4e 03 	sts	0x034E, r23	; 0x80034e <offset+0x1>
   126f8:	80 93 4f 03 	sts	0x034F, r24	; 0x80034f <offset+0x2>
   126fc:	90 93 50 03 	sts	0x0350, r25	; 0x800350 <offset+0x3>
        offset[1] = code_seen('J') ? code_value() : 0.f;
   12700:	8a e4       	ldi	r24, 0x4A	; 74
   12702:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   12706:	c1 2c       	mov	r12, r1
   12708:	d1 2c       	mov	r13, r1
   1270a:	76 01       	movw	r14, r12
   1270c:	88 23       	and	r24, r24
   1270e:	21 f0       	breq	.+8      	; 0x12718 <process_commands() [clone .part.46]+0x760>
   12710:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   12714:	6b 01       	movw	r12, r22
   12716:	7c 01       	movw	r14, r24
   12718:	c0 92 51 03 	sts	0x0351, r12	; 0x800351 <offset+0x4>
   1271c:	d0 92 52 03 	sts	0x0352, r13	; 0x800352 <offset+0x5>
   12720:	e0 92 53 03 	sts	0x0353, r14	; 0x800353 <offset+0x6>
   12724:	f0 92 54 03 	sts	0x0354, r15	; 0x800354 <offset+0x7>

        prepare_arc_move((gcode_in_progress == 2), start_segment_idx);
   12728:	e0 91 55 03 	lds	r30, 0x0355	; 0x800355 <gcode_in_progress>
   1272c:	f0 91 56 03 	lds	r31, 0x0356	; 0x800356 <gcode_in_progress+0x1>
   12730:	a4 96       	adiw	r28, 0x24	; 36
   12732:	ff af       	std	Y+63, r31	; 0x3f
   12734:	ee af       	std	Y+62, r30	; 0x3e
   12736:	a4 97       	sbiw	r28, 0x24	; 36

  set_current_to_destination();
}

void prepare_arc_move(bool isclockwise, uint16_t start_segment_idx) {
    float r = hypot(offset[X_AXIS], offset[Y_AXIS]); // Compute arc radius for mc_arc
   12738:	80 90 4d 03 	lds	r8, 0x034D	; 0x80034d <offset>
   1273c:	90 90 4e 03 	lds	r9, 0x034E	; 0x80034e <offset+0x1>
   12740:	a0 90 4f 03 	lds	r10, 0x034F	; 0x80034f <offset+0x2>
   12744:	b0 90 50 03 	lds	r11, 0x0350	; 0x800350 <offset+0x3>
   12748:	a7 01       	movw	r20, r14
   1274a:	96 01       	movw	r18, r12
   1274c:	c5 01       	movw	r24, r10
   1274e:	b4 01       	movw	r22, r8
   12750:	0f 94 a4 a7 	call	0x34f48	; 0x34f48 <hypot>
   12754:	24 96       	adiw	r28, 0x04	; 4
   12756:	6c af       	std	Y+60, r22	; 0x3c
   12758:	7d af       	std	Y+61, r23	; 0x3d
   1275a:	8e af       	std	Y+62, r24	; 0x3e
   1275c:	9f af       	std	Y+63, r25	; 0x3f
   1275e:	24 97       	sbiw	r28, 0x04	; 4
    // Trace the arc
    mc_arc(current_position, destination, offset, (feedrate * feedmultiply) * (1.f / 6000.f), r, isclockwise, start_segment_idx);
   12760:	60 91 8e 02 	lds	r22, 0x028E	; 0x80028e <feedmultiply>
   12764:	70 91 8f 02 	lds	r23, 0x028F	; 0x80028f <feedmultiply+0x1>
   12768:	07 2e       	mov	r0, r23
   1276a:	00 0c       	add	r0, r0
   1276c:	88 0b       	sbc	r24, r24
   1276e:	99 0b       	sbc	r25, r25
   12770:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   12774:	20 91 7a 02 	lds	r18, 0x027A	; 0x80027a <feedrate>
   12778:	30 91 7b 02 	lds	r19, 0x027B	; 0x80027b <feedrate+0x1>
   1277c:	40 91 7c 02 	lds	r20, 0x027C	; 0x80027c <feedrate+0x2>
   12780:	50 91 7d 02 	lds	r21, 0x027D	; 0x80027d <feedrate+0x3>
   12784:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   12788:	2e e3       	ldi	r18, 0x3E	; 62
   1278a:	33 ec       	ldi	r19, 0xC3	; 195
   1278c:	4e e2       	ldi	r20, 0x2E	; 46
   1278e:	59 e3       	ldi	r21, 0x39	; 57
   12790:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   12794:	68 af       	std	Y+56, r22	; 0x38
   12796:	79 af       	std	Y+57, r23	; 0x39
   12798:	8a af       	std	Y+58, r24	; 0x3a
   1279a:	9b af       	std	Y+59, r25	; 0x3b
// The arc is approximated by generating a huge number of tiny, linear segments. The length of each
// segment is configured in settings.mm_per_arc_segment.
void mc_arc(const float* position, float* target, const float* offset, float feed_rate, float radius, bool isclockwise, uint16_t start_segment_idx)
{
    float start_position[4];
    memcpy(start_position, position, sizeof(start_position));
   1279c:	80 e1       	ldi	r24, 0x10	; 16
   1279e:	e1 e6       	ldi	r30, 0x61	; 97
   127a0:	f2 e1       	ldi	r31, 0x12	; 18
   127a2:	de 01       	movw	r26, r28
   127a4:	11 96       	adiw	r26, 0x01	; 1
   127a6:	01 90       	ld	r0, Z+
   127a8:	0d 92       	st	X+, r0
   127aa:	8a 95       	dec	r24
   127ac:	e1 f7       	brne	.-8      	; 0x127a6 <process_commands() [clone .part.46]+0x7ee>

    float r_axis_x = -offset[X_AXIS];  // Radius vector from center to current location
   127ae:	a5 01       	movw	r20, r10
   127b0:	94 01       	movw	r18, r8
   127b2:	50 58       	subi	r21, 0x80	; 128
   127b4:	28 a7       	std	Y+40, r18	; 0x28
   127b6:	39 a7       	std	Y+41, r19	; 0x29
   127b8:	4a a7       	std	Y+42, r20	; 0x2a
   127ba:	5b a7       	std	Y+43, r21	; 0x2b
    float r_axis_y = -offset[Y_AXIS];
   127bc:	d7 01       	movw	r26, r14
   127be:	c6 01       	movw	r24, r12
   127c0:	b0 58       	subi	r27, 0x80	; 128
   127c2:	8c a7       	std	Y+44, r24	; 0x2c
   127c4:	9d a7       	std	Y+45, r25	; 0x2d
   127c6:	ae a7       	std	Y+46, r26	; 0x2e
   127c8:	bf a7       	std	Y+47, r27	; 0x2f
    float center_axis_x = start_position[X_AXIS] - r_axis_x;
   127ca:	29 81       	ldd	r18, Y+1	; 0x01
   127cc:	3a 81       	ldd	r19, Y+2	; 0x02
   127ce:	4b 81       	ldd	r20, Y+3	; 0x03
   127d0:	5c 81       	ldd	r21, Y+4	; 0x04
   127d2:	28 96       	adiw	r28, 0x08	; 8
   127d4:	2c af       	std	Y+60, r18	; 0x3c
   127d6:	3d af       	std	Y+61, r19	; 0x3d
   127d8:	4e af       	std	Y+62, r20	; 0x3e
   127da:	5f af       	std	Y+63, r21	; 0x3f
   127dc:	28 97       	sbiw	r28, 0x08	; 8
   127de:	c5 01       	movw	r24, r10
   127e0:	b4 01       	movw	r22, r8
   127e2:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   127e6:	62 96       	adiw	r28, 0x12	; 18
   127e8:	6c af       	std	Y+60, r22	; 0x3c
   127ea:	7d af       	std	Y+61, r23	; 0x3d
   127ec:	8e af       	std	Y+62, r24	; 0x3e
   127ee:	9f af       	std	Y+63, r25	; 0x3f
   127f0:	62 97       	sbiw	r28, 0x12	; 18
    float center_axis_y = start_position[Y_AXIS] - r_axis_y;
   127f2:	8d 81       	ldd	r24, Y+5	; 0x05
   127f4:	9e 81       	ldd	r25, Y+6	; 0x06
   127f6:	af 81       	ldd	r26, Y+7	; 0x07
   127f8:	b8 85       	ldd	r27, Y+8	; 0x08
   127fa:	2c 96       	adiw	r28, 0x0c	; 12
   127fc:	8c af       	std	Y+60, r24	; 0x3c
   127fe:	9d af       	std	Y+61, r25	; 0x3d
   12800:	ae af       	std	Y+62, r26	; 0x3e
   12802:	bf af       	std	Y+63, r27	; 0x3f
   12804:	2c 97       	sbiw	r28, 0x0c	; 12
   12806:	9c 01       	movw	r18, r24
   12808:	ad 01       	movw	r20, r26
   1280a:	c7 01       	movw	r24, r14
   1280c:	b6 01       	movw	r22, r12
   1280e:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   12812:	66 96       	adiw	r28, 0x16	; 22
   12814:	6c af       	std	Y+60, r22	; 0x3c
   12816:	7d af       	std	Y+61, r23	; 0x3d
   12818:	8e af       	std	Y+62, r24	; 0x3e
   1281a:	9f af       	std	Y+63, r25	; 0x3f
   1281c:	66 97       	sbiw	r28, 0x16	; 22
    float travel_z = target[Z_AXIS] - start_position[Z_AXIS];
   1281e:	29 85       	ldd	r18, Y+9	; 0x09
   12820:	3a 85       	ldd	r19, Y+10	; 0x0a
   12822:	4b 85       	ldd	r20, Y+11	; 0x0b
   12824:	5c 85       	ldd	r21, Y+12	; 0x0c
   12826:	60 91 31 06 	lds	r22, 0x0631	; 0x800631 <destination+0x8>
   1282a:	70 91 32 06 	lds	r23, 0x0632	; 0x800632 <destination+0x9>
   1282e:	80 91 33 06 	lds	r24, 0x0633	; 0x800633 <destination+0xa>
   12832:	90 91 34 06 	lds	r25, 0x0634	; 0x800634 <destination+0xb>
   12836:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   1283a:	6a 96       	adiw	r28, 0x1a	; 26
   1283c:	6c af       	std	Y+60, r22	; 0x3c
   1283e:	7d af       	std	Y+61, r23	; 0x3d
   12840:	8e af       	std	Y+62, r24	; 0x3e
   12842:	9f af       	std	Y+63, r25	; 0x3f
   12844:	6a 97       	sbiw	r28, 0x1a	; 26
    float rt_x = target[X_AXIS] - center_axis_x;
   12846:	20 91 29 06 	lds	r18, 0x0629	; 0x800629 <destination>
   1284a:	30 91 2a 06 	lds	r19, 0x062A	; 0x80062a <destination+0x1>
   1284e:	40 91 2b 06 	lds	r20, 0x062B	; 0x80062b <destination+0x2>
   12852:	50 91 2c 06 	lds	r21, 0x062C	; 0x80062c <destination+0x3>
   12856:	6e 96       	adiw	r28, 0x1e	; 30
   12858:	2c af       	std	Y+60, r18	; 0x3c
   1285a:	3d af       	std	Y+61, r19	; 0x3d
   1285c:	4e af       	std	Y+62, r20	; 0x3e
   1285e:	5f af       	std	Y+63, r21	; 0x3f
   12860:	6e 97       	sbiw	r28, 0x1e	; 30
   12862:	62 96       	adiw	r28, 0x12	; 18
   12864:	2c ad       	ldd	r18, Y+60	; 0x3c
   12866:	3d ad       	ldd	r19, Y+61	; 0x3d
   12868:	4e ad       	ldd	r20, Y+62	; 0x3e
   1286a:	5f ad       	ldd	r21, Y+63	; 0x3f
   1286c:	62 97       	sbiw	r28, 0x12	; 18
   1286e:	6e 96       	adiw	r28, 0x1e	; 30
   12870:	6c ad       	ldd	r22, Y+60	; 0x3c
   12872:	7d ad       	ldd	r23, Y+61	; 0x3d
   12874:	8e ad       	ldd	r24, Y+62	; 0x3e
   12876:	9f ad       	ldd	r25, Y+63	; 0x3f
   12878:	6e 97       	sbiw	r28, 0x1e	; 30
   1287a:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   1287e:	6b 01       	movw	r12, r22
   12880:	7c 01       	movw	r14, r24
    float rt_y = target[Y_AXIS] - center_axis_y;
   12882:	80 91 2d 06 	lds	r24, 0x062D	; 0x80062d <destination+0x4>
   12886:	90 91 2e 06 	lds	r25, 0x062E	; 0x80062e <destination+0x5>
   1288a:	a0 91 2f 06 	lds	r26, 0x062F	; 0x80062f <destination+0x6>
   1288e:	b0 91 30 06 	lds	r27, 0x0630	; 0x800630 <destination+0x7>
   12892:	a2 96       	adiw	r28, 0x22	; 34
   12894:	8c af       	std	Y+60, r24	; 0x3c
   12896:	9d af       	std	Y+61, r25	; 0x3d
   12898:	ae af       	std	Y+62, r26	; 0x3e
   1289a:	bf af       	std	Y+63, r27	; 0x3f
   1289c:	a2 97       	sbiw	r28, 0x22	; 34
   1289e:	66 96       	adiw	r28, 0x16	; 22
   128a0:	2c ad       	ldd	r18, Y+60	; 0x3c
   128a2:	3d ad       	ldd	r19, Y+61	; 0x3d
   128a4:	4e ad       	ldd	r20, Y+62	; 0x3e
   128a6:	5f ad       	ldd	r21, Y+63	; 0x3f
   128a8:	66 97       	sbiw	r28, 0x16	; 22
   128aa:	bc 01       	movw	r22, r24
   128ac:	cd 01       	movw	r24, r26
   128ae:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   128b2:	4b 01       	movw	r8, r22
   128b4:	5c 01       	movw	r10, r24
    // 20200419 - Add a variable that will be used to hold the arc segment length
    float mm_per_arc_segment = cs.mm_per_arc_segment;
   128b6:	30 90 2b 0e 	lds	r3, 0x0E2B	; 0x800e2b <cs+0xc4>
   128ba:	20 90 2c 0e 	lds	r2, 0x0E2C	; 0x800e2c <cs+0xc5>
   128be:	90 91 2d 0e 	lds	r25, 0x0E2D	; 0x800e2d <cs+0xc6>
   128c2:	9c ab       	std	Y+52, r25	; 0x34
   128c4:	a0 91 2e 0e 	lds	r26, 0x0E2E	; 0x800e2e <cs+0xc7>
   128c8:	ac af       	std	Y+60, r26	; 0x3c
    // 20210109 - Add a variable to hold the n_arc_correction value
    unsigned char n_arc_correction = cs.n_arc_correction;
   128ca:	b0 91 33 0e 	lds	r27, 0x0E33	; 0x800e33 <cs+0xcc>
   128ce:	b8 ab       	std	Y+48, r27	; 0x30

    // CCW angle between start_position and target from circle center. Only one atan2() trig computation required.
    float angular_travel_total = atan2(r_axis_x * rt_y - r_axis_y * rt_x, r_axis_x * rt_x + r_axis_y * rt_y);
   128d0:	a7 01       	movw	r20, r14
   128d2:	96 01       	movw	r18, r12
   128d4:	68 a5       	ldd	r22, Y+40	; 0x28
   128d6:	79 a5       	ldd	r23, Y+41	; 0x29
   128d8:	8a a5       	ldd	r24, Y+42	; 0x2a
   128da:	9b a5       	ldd	r25, Y+43	; 0x2b
   128dc:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   128e0:	2b 01       	movw	r4, r22
   128e2:	3c 01       	movw	r6, r24
   128e4:	a5 01       	movw	r20, r10
   128e6:	94 01       	movw	r18, r8
   128e8:	6c a5       	ldd	r22, Y+44	; 0x2c
   128ea:	7d a5       	ldd	r23, Y+45	; 0x2d
   128ec:	8e a5       	ldd	r24, Y+46	; 0x2e
   128ee:	9f a5       	ldd	r25, Y+47	; 0x2f
   128f0:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   128f4:	9b 01       	movw	r18, r22
   128f6:	ac 01       	movw	r20, r24
   128f8:	c3 01       	movw	r24, r6
   128fa:	b2 01       	movw	r22, r4
   128fc:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   12900:	2b 01       	movw	r4, r22
   12902:	3c 01       	movw	r6, r24
   12904:	a5 01       	movw	r20, r10
   12906:	94 01       	movw	r18, r8
   12908:	68 a5       	ldd	r22, Y+40	; 0x28
   1290a:	79 a5       	ldd	r23, Y+41	; 0x29
   1290c:	8a a5       	ldd	r24, Y+42	; 0x2a
   1290e:	9b a5       	ldd	r25, Y+43	; 0x2b
   12910:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   12914:	4b 01       	movw	r8, r22
   12916:	5c 01       	movw	r10, r24
   12918:	a7 01       	movw	r20, r14
   1291a:	96 01       	movw	r18, r12
   1291c:	6c a5       	ldd	r22, Y+44	; 0x2c
   1291e:	7d a5       	ldd	r23, Y+45	; 0x2d
   12920:	8e a5       	ldd	r24, Y+46	; 0x2e
   12922:	9f a5       	ldd	r25, Y+47	; 0x2f
   12924:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   12928:	9b 01       	movw	r18, r22
   1292a:	ac 01       	movw	r20, r24
   1292c:	c5 01       	movw	r24, r10
   1292e:	b4 01       	movw	r22, r8
   12930:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   12934:	a3 01       	movw	r20, r6
   12936:	92 01       	movw	r18, r4
   12938:	0f 94 87 a5 	call	0x34b0e	; 0x34b0e <atan2>
   1293c:	6b 01       	movw	r12, r22
   1293e:	7c 01       	movw	r14, r24
    if (angular_travel_total < 0) { angular_travel_total += 2 * M_PI; }
   12940:	20 e0       	ldi	r18, 0x00	; 0
   12942:	30 e0       	ldi	r19, 0x00	; 0
   12944:	a9 01       	movw	r20, r18
   12946:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   1294a:	87 ff       	sbrs	r24, 7
   1294c:	0a c0       	rjmp	.+20     	; 0x12962 <process_commands() [clone .part.46]+0x9aa>
   1294e:	2b ed       	ldi	r18, 0xDB	; 219
   12950:	3f e0       	ldi	r19, 0x0F	; 15
   12952:	49 ec       	ldi	r20, 0xC9	; 201
   12954:	50 e4       	ldi	r21, 0x40	; 64
   12956:	c7 01       	movw	r24, r14
   12958:	b6 01       	movw	r22, r12
   1295a:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   1295e:	6b 01       	movw	r12, r22
   12960:	7c 01       	movw	r14, r24

    if (cs.min_arc_segments > 0)
   12962:	60 91 34 0e 	lds	r22, 0x0E34	; 0x800e34 <cs+0xcd>
   12966:	70 91 35 0e 	lds	r23, 0x0E35	; 0x800e35 <cs+0xce>
   1296a:	61 15       	cp	r22, r1
   1296c:	71 05       	cpc	r23, r1
   1296e:	09 f4       	brne	.+2      	; 0x12972 <process_commands() [clone .part.46]+0x9ba>
   12970:	61 c2       	rjmp	.+1218   	; 0x12e34 <process_commands() [clone .part.46]+0xe7c>
    {
        // 20200417 - FormerLurker - Implement MIN_ARC_SEGMENTS if it is defined - from Marlin 2.0 implementation
        // Do this before converting the angular travel for clockwise rotation
        mm_per_arc_segment = radius * ((2.0f * M_PI) / cs.min_arc_segments);
   12972:	90 e0       	ldi	r25, 0x00	; 0
   12974:	80 e0       	ldi	r24, 0x00	; 0
   12976:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   1297a:	9b 01       	movw	r18, r22
   1297c:	ac 01       	movw	r20, r24
   1297e:	6b ed       	ldi	r22, 0xDB	; 219
   12980:	7f e0       	ldi	r23, 0x0F	; 15
   12982:	89 ec       	ldi	r24, 0xC9	; 201
   12984:	90 e4       	ldi	r25, 0x40	; 64
   12986:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   1298a:	24 96       	adiw	r28, 0x04	; 4
   1298c:	2c ad       	ldd	r18, Y+60	; 0x3c
   1298e:	3d ad       	ldd	r19, Y+61	; 0x3d
   12990:	4e ad       	ldd	r20, Y+62	; 0x3e
   12992:	5f ad       	ldd	r21, Y+63	; 0x3f
   12994:	24 97       	sbiw	r28, 0x04	; 4
   12996:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   1299a:	5b 01       	movw	r10, r22
   1299c:	8c 01       	movw	r16, r24
    }
    if (cs.arc_segments_per_sec > 0)
   1299e:	60 91 36 0e 	lds	r22, 0x0E36	; 0x800e36 <cs+0xcf>
   129a2:	70 91 37 0e 	lds	r23, 0x0E37	; 0x800e37 <cs+0xd0>
   129a6:	61 15       	cp	r22, r1
   129a8:	71 05       	cpc	r23, r1
   129aa:	e1 f0       	breq	.+56     	; 0x129e4 <process_commands() [clone .part.46]+0xa2c>
    {
        // 20200417 - FormerLurker - Implement MIN_ARC_SEGMENTS if it is defined - from Marlin 2.0 implementation
        float mm_per_arc_segment_sec = feed_rate / (60.f * float(cs.arc_segments_per_sec));
   129ac:	90 e0       	ldi	r25, 0x00	; 0
   129ae:	80 e0       	ldi	r24, 0x00	; 0
   129b0:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   129b4:	20 e0       	ldi	r18, 0x00	; 0
   129b6:	30 e0       	ldi	r19, 0x00	; 0
   129b8:	40 e7       	ldi	r20, 0x70	; 112
   129ba:	52 e4       	ldi	r21, 0x42	; 66
   129bc:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   129c0:	9b 01       	movw	r18, r22
   129c2:	ac 01       	movw	r20, r24
   129c4:	68 ad       	ldd	r22, Y+56	; 0x38
   129c6:	79 ad       	ldd	r23, Y+57	; 0x39
   129c8:	8a ad       	ldd	r24, Y+58	; 0x3a
   129ca:	9b ad       	ldd	r25, Y+59	; 0x3b
   129cc:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   129d0:	3b 01       	movw	r6, r22
   129d2:	4c 01       	movw	r8, r24
        if (mm_per_arc_segment_sec < mm_per_arc_segment)
   129d4:	95 01       	movw	r18, r10
   129d6:	a8 01       	movw	r20, r16
   129d8:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   129dc:	87 ff       	sbrs	r24, 7
   129de:	02 c0       	rjmp	.+4      	; 0x129e4 <process_commands() [clone .part.46]+0xa2c>
            mm_per_arc_segment = mm_per_arc_segment_sec;
   129e0:	53 01       	movw	r10, r6
   129e2:	84 01       	movw	r16, r8
    }

    // Note:  no need to check to see if min_mm_per_arc_segment is enabled or not (i.e. = 0), since mm_per_arc_segment can never be below 0.
    if (mm_per_arc_segment < cs.min_mm_per_arc_segment)
   129e4:	40 90 2f 0e 	lds	r4, 0x0E2F	; 0x800e2f <cs+0xc8>
   129e8:	50 90 30 0e 	lds	r5, 0x0E30	; 0x800e30 <cs+0xc9>
   129ec:	60 90 31 0e 	lds	r6, 0x0E31	; 0x800e31 <cs+0xca>
   129f0:	70 90 32 0e 	lds	r7, 0x0E32	; 0x800e32 <cs+0xcb>
   129f4:	95 01       	movw	r18, r10
   129f6:	a8 01       	movw	r20, r16
   129f8:	b2 01       	movw	r22, r4
   129fa:	c3 01       	movw	r24, r6
   129fc:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   12a00:	18 16       	cp	r1, r24
   12a02:	84 f0       	brlt	.+32     	; 0x12a24 <process_commands() [clone .part.46]+0xa6c>
    {
        // 20200417 - FormerLurker - Implement MIN_MM_PER_ARC_SEGMENT if it is defined
        // This prevents a very high number of segments from being generated for curves of a short radius
        mm_per_arc_segment = cs.min_mm_per_arc_segment;
    }
    else if (mm_per_arc_segment > cs.mm_per_arc_segment) {
   12a04:	95 01       	movw	r18, r10
   12a06:	a8 01       	movw	r20, r16
   12a08:	63 2d       	mov	r22, r3
   12a0a:	72 2d       	mov	r23, r2
   12a0c:	8c a9       	ldd	r24, Y+52	; 0x34
   12a0e:	9c ad       	ldd	r25, Y+60	; 0x3c
   12a10:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   12a14:	25 01       	movw	r4, r10
   12a16:	38 01       	movw	r6, r16
   12a18:	87 ff       	sbrs	r24, 7
   12a1a:	04 c0       	rjmp	.+8      	; 0x12a24 <process_commands() [clone .part.46]+0xa6c>
        // 20210113 - This can be implemented in an else if since  we can't be below the min AND above the max at the same time.
        // 20200417 - FormerLurker - Implement MIN_MM_PER_ARC_SEGMENT if it is defined
        mm_per_arc_segment = cs.mm_per_arc_segment;
   12a1c:	43 2c       	mov	r4, r3
   12a1e:	52 2c       	mov	r5, r2
   12a20:	6c a8       	ldd	r6, Y+52	; 0x34
   12a22:	7c ac       	ldd	r7, Y+60	; 0x3c
    }

    // Adjust the angular travel if the direction is clockwise
    if (isclockwise) { angular_travel_total -= 2 * M_PI; }
   12a24:	a4 96       	adiw	r28, 0x24	; 36
   12a26:	ee ad       	ldd	r30, Y+62	; 0x3e
   12a28:	ff ad       	ldd	r31, Y+63	; 0x3f
   12a2a:	a4 97       	sbiw	r28, 0x24	; 36
   12a2c:	32 97       	sbiw	r30, 0x02	; 2
   12a2e:	51 f4       	brne	.+20     	; 0x12a44 <process_commands() [clone .part.46]+0xa8c>
   12a30:	2b ed       	ldi	r18, 0xDB	; 219
   12a32:	3f e0       	ldi	r19, 0x0F	; 15
   12a34:	49 ec       	ldi	r20, 0xC9	; 201
   12a36:	50 e4       	ldi	r21, 0x40	; 64
   12a38:	c7 01       	movw	r24, r14
   12a3a:	b6 01       	movw	r22, r12
   12a3c:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   12a40:	6b 01       	movw	r12, r22
   12a42:	7c 01       	movw	r14, r24

    //20141002:full circle for G03 did not work, e.g. G03 X80 Y80 I20 J0 F2000 is giving an Angle of zero so head is not moving
    //to compensate when start pos = target pos && angle is zero -> angle = 2Pi
    if (start_position[X_AXIS] == target[X_AXIS] && start_position[Y_AXIS] == target[Y_AXIS] && angular_travel_total == 0)
   12a44:	6e 96       	adiw	r28, 0x1e	; 30
   12a46:	2c ad       	ldd	r18, Y+60	; 0x3c
   12a48:	3d ad       	ldd	r19, Y+61	; 0x3d
   12a4a:	4e ad       	ldd	r20, Y+62	; 0x3e
   12a4c:	5f ad       	ldd	r21, Y+63	; 0x3f
   12a4e:	6e 97       	sbiw	r28, 0x1e	; 30
   12a50:	28 96       	adiw	r28, 0x08	; 8
   12a52:	6c ad       	ldd	r22, Y+60	; 0x3c
   12a54:	7d ad       	ldd	r23, Y+61	; 0x3d
   12a56:	8e ad       	ldd	r24, Y+62	; 0x3e
   12a58:	9f ad       	ldd	r25, Y+63	; 0x3f
   12a5a:	28 97       	sbiw	r28, 0x08	; 8
   12a5c:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   12a60:	81 11       	cpse	r24, r1
   12a62:	23 c0       	rjmp	.+70     	; 0x12aaa <process_commands() [clone .part.46]+0xaf2>
   12a64:	a2 96       	adiw	r28, 0x22	; 34
   12a66:	2c ad       	ldd	r18, Y+60	; 0x3c
   12a68:	3d ad       	ldd	r19, Y+61	; 0x3d
   12a6a:	4e ad       	ldd	r20, Y+62	; 0x3e
   12a6c:	5f ad       	ldd	r21, Y+63	; 0x3f
   12a6e:	a2 97       	sbiw	r28, 0x22	; 34
   12a70:	2c 96       	adiw	r28, 0x0c	; 12
   12a72:	6c ad       	ldd	r22, Y+60	; 0x3c
   12a74:	7d ad       	ldd	r23, Y+61	; 0x3d
   12a76:	8e ad       	ldd	r24, Y+62	; 0x3e
   12a78:	9f ad       	ldd	r25, Y+63	; 0x3f
   12a7a:	2c 97       	sbiw	r28, 0x0c	; 12
   12a7c:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   12a80:	81 11       	cpse	r24, r1
   12a82:	13 c0       	rjmp	.+38     	; 0x12aaa <process_commands() [clone .part.46]+0xaf2>
   12a84:	20 e0       	ldi	r18, 0x00	; 0
   12a86:	30 e0       	ldi	r19, 0x00	; 0
   12a88:	a9 01       	movw	r20, r18
   12a8a:	c7 01       	movw	r24, r14
   12a8c:	b6 01       	movw	r22, r12
   12a8e:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   12a92:	81 11       	cpse	r24, r1
   12a94:	0a c0       	rjmp	.+20     	; 0x12aaa <process_commands() [clone .part.46]+0xaf2>
    {
        angular_travel_total += 2 * M_PI;
   12a96:	2b ed       	ldi	r18, 0xDB	; 219
   12a98:	3f e0       	ldi	r19, 0x0F	; 15
   12a9a:	49 ec       	ldi	r20, 0xC9	; 201
   12a9c:	50 e4       	ldi	r21, 0x40	; 64
   12a9e:	c7 01       	movw	r24, r14
   12aa0:	b6 01       	movw	r22, r12
   12aa2:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   12aa6:	6b 01       	movw	r12, r22
   12aa8:	7c 01       	movw	r14, r24
    }
    //end fix G03

    // 20200417 - FormerLurker - rename millimeters_of_travel to millimeters_of_travel_arc to better describe what we are
    // calculating here
    const float millimeters_of_travel_arc = hypot(angular_travel_total * radius, fabs(travel_z));
   12aaa:	a7 01       	movw	r20, r14
   12aac:	96 01       	movw	r18, r12
   12aae:	24 96       	adiw	r28, 0x04	; 4
   12ab0:	6c ad       	ldd	r22, Y+60	; 0x3c
   12ab2:	7d ad       	ldd	r23, Y+61	; 0x3d
   12ab4:	8e ad       	ldd	r24, Y+62	; 0x3e
   12ab6:	9f ad       	ldd	r25, Y+63	; 0x3f
   12ab8:	24 97       	sbiw	r28, 0x04	; 4
   12aba:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   12abe:	6a 96       	adiw	r28, 0x1a	; 26
   12ac0:	2c ad       	ldd	r18, Y+60	; 0x3c
   12ac2:	3d ad       	ldd	r19, Y+61	; 0x3d
   12ac4:	4e ad       	ldd	r20, Y+62	; 0x3e
   12ac6:	5f ad       	ldd	r21, Y+63	; 0x3f
   12ac8:	6a 97       	sbiw	r28, 0x1a	; 26
   12aca:	0f 94 a4 a7 	call	0x34f48	; 0x34f48 <hypot>
   12ace:	4b 01       	movw	r8, r22
   12ad0:	5c 01       	movw	r10, r24
    if (millimeters_of_travel_arc < 0.001) { return; }
   12ad2:	2f e6       	ldi	r18, 0x6F	; 111
   12ad4:	32 e1       	ldi	r19, 0x12	; 18
   12ad6:	43 e8       	ldi	r20, 0x83	; 131
   12ad8:	5a e3       	ldi	r21, 0x3A	; 58
   12ada:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   12ade:	87 fd       	sbrc	r24, 7
   12ae0:	9e c1       	rjmp	.+828    	; 0x12e1e <process_commands() [clone .part.46]+0xe66>

    // Calculate the number of arc segments
    unsigned short segments = static_cast<unsigned short>(ceil(millimeters_of_travel_arc / mm_per_arc_segment));
   12ae2:	92 01       	movw	r18, r4
   12ae4:	a3 01       	movw	r20, r6
   12ae6:	c5 01       	movw	r24, r10
   12ae8:	b4 01       	movw	r22, r8
   12aea:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   12aee:	0f 94 e6 a5 	call	0x34bcc	; 0x34bcc <ceil>
   12af2:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   12af6:	7d ab       	std	Y+53, r23	; 0x35
   12af8:	6c ab       	std	Y+52, r22	; 0x34
       Finding a faster way to approximate sin, knowing that there can be substantial deviations from the true
       arc when using the previous approximation, would be beneficial.
    */

    // If there is only one segment, no need to do a bunch of work since this is a straight line!
    if (segments > 1 && start_segment_idx)
   12afa:	62 30       	cpi	r22, 0x02	; 2
   12afc:	71 05       	cpc	r23, r1
   12afe:	08 f4       	brcc	.+2      	; 0x12b02 <process_commands() [clone .part.46]+0xb4a>
   12b00:	5e c1       	rjmp	.+700    	; 0x12dbe <process_commands() [clone .part.46]+0xe06>
   12b02:	2e 96       	adiw	r28, 0x0e	; 14
   12b04:	4e ad       	ldd	r20, Y+62	; 0x3e
   12b06:	5f ad       	ldd	r21, Y+63	; 0x3f
   12b08:	2e 97       	sbiw	r28, 0x0e	; 14
   12b0a:	45 2b       	or	r20, r21
   12b0c:	09 f4       	brne	.+2      	; 0x12b10 <process_commands() [clone .part.46]+0xb58>
   12b0e:	57 c1       	rjmp	.+686    	; 0x12dbe <process_commands() [clone .part.46]+0xe06>
    {
        // Calculate theta per segments, and linear (z) travel per segment, e travel per segment
        // as well as the small angle approximation for sin and cos.
        const float theta_per_segment = angular_travel_total / segments,
   12b10:	90 e0       	ldi	r25, 0x00	; 0
   12b12:	80 e0       	ldi	r24, 0x00	; 0
   12b14:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   12b18:	4b 01       	movw	r8, r22
   12b1a:	5c 01       	movw	r10, r24
   12b1c:	ac 01       	movw	r20, r24
   12b1e:	9b 01       	movw	r18, r22
   12b20:	c7 01       	movw	r24, r14
   12b22:	b6 01       	movw	r22, r12
   12b24:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   12b28:	2b 01       	movw	r4, r22
   12b2a:	3c 01       	movw	r6, r24
            linear_per_segment = travel_z / (segments),
   12b2c:	a5 01       	movw	r20, r10
   12b2e:	94 01       	movw	r18, r8
   12b30:	6a 96       	adiw	r28, 0x1a	; 26
   12b32:	6c ad       	ldd	r22, Y+60	; 0x3c
   12b34:	7d ad       	ldd	r23, Y+61	; 0x3d
   12b36:	8e ad       	ldd	r24, Y+62	; 0x3e
   12b38:	9f ad       	ldd	r25, Y+63	; 0x3f
   12b3a:	6a 97       	sbiw	r28, 0x1a	; 26
   12b3c:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   12b40:	28 96       	adiw	r28, 0x08	; 8
   12b42:	6c af       	std	Y+60, r22	; 0x3c
   12b44:	7d af       	std	Y+61, r23	; 0x3d
   12b46:	8e af       	std	Y+62, r24	; 0x3e
   12b48:	9f af       	std	Y+63, r25	; 0x3f
   12b4a:	28 97       	sbiw	r28, 0x08	; 8
            segment_extruder_travel = (target[E_AXIS] - start_position[E_AXIS]) / (segments),
   12b4c:	2d 85       	ldd	r18, Y+13	; 0x0d
   12b4e:	3e 85       	ldd	r19, Y+14	; 0x0e
   12b50:	4f 85       	ldd	r20, Y+15	; 0x0f
   12b52:	58 89       	ldd	r21, Y+16	; 0x10
   12b54:	60 91 35 06 	lds	r22, 0x0635	; 0x800635 <destination+0xc>
   12b58:	70 91 36 06 	lds	r23, 0x0636	; 0x800636 <destination+0xd>
   12b5c:	80 91 37 06 	lds	r24, 0x0637	; 0x800637 <destination+0xe>
   12b60:	90 91 38 06 	lds	r25, 0x0638	; 0x800638 <destination+0xf>
   12b64:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   12b68:	a5 01       	movw	r20, r10
   12b6a:	94 01       	movw	r18, r8
   12b6c:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   12b70:	2c 96       	adiw	r28, 0x0c	; 12
   12b72:	6c af       	std	Y+60, r22	; 0x3c
   12b74:	7d af       	std	Y+61, r23	; 0x3d
   12b76:	8e af       	std	Y+62, r24	; 0x3e
   12b78:	9f af       	std	Y+63, r25	; 0x3f
   12b7a:	2c 97       	sbiw	r28, 0x0c	; 12
            sq_theta_per_segment = theta_per_segment * theta_per_segment,
   12b7c:	a3 01       	movw	r20, r6
   12b7e:	92 01       	movw	r18, r4
   12b80:	c3 01       	movw	r24, r6
   12b82:	b2 01       	movw	r22, r4
   12b84:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   12b88:	6b 01       	movw	r12, r22
   12b8a:	7c 01       	movw	r14, r24
            sin_T = theta_per_segment - sq_theta_per_segment * theta_per_segment / 6,
   12b8c:	ac 01       	movw	r20, r24
   12b8e:	9b 01       	movw	r18, r22
   12b90:	c3 01       	movw	r24, r6
   12b92:	b2 01       	movw	r22, r4
   12b94:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   12b98:	20 e0       	ldi	r18, 0x00	; 0
   12b9a:	30 e0       	ldi	r19, 0x00	; 0
   12b9c:	40 ec       	ldi	r20, 0xC0	; 192
   12b9e:	50 e4       	ldi	r21, 0x40	; 64
   12ba0:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   12ba4:	9b 01       	movw	r18, r22
   12ba6:	ac 01       	movw	r20, r24
   12ba8:	c3 01       	movw	r24, r6
   12baa:	b2 01       	movw	r22, r4
   12bac:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   12bb0:	6c af       	std	Y+60, r22	; 0x3c
   12bb2:	7d af       	std	Y+61, r23	; 0x3d
   12bb4:	8e af       	std	Y+62, r24	; 0x3e
   12bb6:	9f af       	std	Y+63, r25	; 0x3f
            cos_T = 1 - 0.5f * sq_theta_per_segment;
   12bb8:	20 e0       	ldi	r18, 0x00	; 0
   12bba:	30 e0       	ldi	r19, 0x00	; 0
   12bbc:	40 e0       	ldi	r20, 0x00	; 0
   12bbe:	5f e3       	ldi	r21, 0x3F	; 63
   12bc0:	c7 01       	movw	r24, r14
   12bc2:	b6 01       	movw	r22, r12
   12bc4:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   12bc8:	9b 01       	movw	r18, r22
   12bca:	ac 01       	movw	r20, r24
   12bcc:	60 e0       	ldi	r22, 0x00	; 0
   12bce:	70 e0       	ldi	r23, 0x00	; 0
   12bd0:	80 e8       	ldi	r24, 0x80	; 128
   12bd2:	9f e3       	ldi	r25, 0x3F	; 63
   12bd4:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   12bd8:	24 96       	adiw	r28, 0x04	; 4
   12bda:	6c af       	std	Y+60, r22	; 0x3c
   12bdc:	7d af       	std	Y+61, r23	; 0x3d
   12bde:	8e af       	std	Y+62, r24	; 0x3e
   12be0:	9f af       	std	Y+63, r25	; 0x3f
   12be2:	24 97       	sbiw	r28, 0x04	; 4
        // Loop through all but one of the segments.  The last one can be done simply
        // by moving to the target.
        for (uint16_t i = 1; i < segments; i++) {
   12be4:	22 24       	eor	r2, r2
   12be6:	23 94       	inc	r2
   12be8:	31 2c       	mov	r3, r1
            if (n_arc_correction-- == 0) {
   12bea:	d8 a8       	ldd	r13, Y+48	; 0x30
   12bec:	da 94       	dec	r13
   12bee:	58 a9       	ldd	r21, Y+48	; 0x30
   12bf0:	51 11       	cpse	r21, r1
   12bf2:	25 c1       	rjmp	.+586    	; 0x12e3e <process_commands() [clone .part.46]+0xe86>
                // Calculate the actual position for r_axis_x and r_axis_y
                const float cos_Ti = cos(i * theta_per_segment), sin_Ti = sin(i * theta_per_segment);
   12bf4:	b1 01       	movw	r22, r2
   12bf6:	90 e0       	ldi	r25, 0x00	; 0
   12bf8:	80 e0       	ldi	r24, 0x00	; 0
   12bfa:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   12bfe:	a3 01       	movw	r20, r6
   12c00:	92 01       	movw	r18, r4
   12c02:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   12c06:	6b 01       	movw	r12, r22
   12c08:	7c 01       	movw	r14, r24
   12c0a:	0f 94 02 a6 	call	0x34c04	; 0x34c04 <cos>
   12c0e:	6c a7       	std	Y+44, r22	; 0x2c
   12c10:	7d a7       	std	Y+45, r23	; 0x2d
   12c12:	8e a7       	std	Y+46, r24	; 0x2e
   12c14:	9f a7       	std	Y+47, r25	; 0x2f
   12c16:	c7 01       	movw	r24, r14
   12c18:	b6 01       	movw	r22, r12
   12c1a:	0f 94 c8 a8 	call	0x35190	; 0x35190 <sin>
   12c1e:	4b 01       	movw	r8, r22
   12c20:	5c 01       	movw	r10, r24
                r_axis_x = -offset[X_AXIS] * cos_Ti + offset[Y_AXIS] * sin_Ti;
   12c22:	c0 90 4d 03 	lds	r12, 0x034D	; 0x80034d <offset>
   12c26:	d0 90 4e 03 	lds	r13, 0x034E	; 0x80034e <offset+0x1>
   12c2a:	e0 90 4f 03 	lds	r14, 0x034F	; 0x80034f <offset+0x2>
   12c2e:	f0 90 50 03 	lds	r15, 0x0350	; 0x800350 <offset+0x3>
   12c32:	f7 fa       	bst	r15, 7
   12c34:	f0 94       	com	r15
   12c36:	f7 f8       	bld	r15, 7
   12c38:	f0 94       	com	r15
   12c3a:	80 91 51 03 	lds	r24, 0x0351	; 0x800351 <offset+0x4>
   12c3e:	90 91 52 03 	lds	r25, 0x0352	; 0x800352 <offset+0x5>
   12c42:	a0 91 53 03 	lds	r26, 0x0353	; 0x800353 <offset+0x6>
   12c46:	b0 91 54 03 	lds	r27, 0x0354	; 0x800354 <offset+0x7>
   12c4a:	88 ab       	std	Y+48, r24	; 0x30
   12c4c:	99 ab       	std	Y+49, r25	; 0x31
   12c4e:	aa ab       	std	Y+50, r26	; 0x32
   12c50:	bb ab       	std	Y+51, r27	; 0x33
   12c52:	a7 01       	movw	r20, r14
   12c54:	96 01       	movw	r18, r12
   12c56:	6c a5       	ldd	r22, Y+44	; 0x2c
   12c58:	7d a5       	ldd	r23, Y+45	; 0x2d
   12c5a:	8e a5       	ldd	r24, Y+46	; 0x2e
   12c5c:	9f a5       	ldd	r25, Y+47	; 0x2f
   12c5e:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   12c62:	68 a7       	std	Y+40, r22	; 0x28
   12c64:	79 a7       	std	Y+41, r23	; 0x29
   12c66:	8a a7       	std	Y+42, r24	; 0x2a
   12c68:	9b a7       	std	Y+43, r25	; 0x2b
   12c6a:	28 a9       	ldd	r18, Y+48	; 0x30
   12c6c:	39 a9       	ldd	r19, Y+49	; 0x31
   12c6e:	4a a9       	ldd	r20, Y+50	; 0x32
   12c70:	5b a9       	ldd	r21, Y+51	; 0x33
   12c72:	c5 01       	movw	r24, r10
   12c74:	b4 01       	movw	r22, r8
   12c76:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   12c7a:	9b 01       	movw	r18, r22
   12c7c:	ac 01       	movw	r20, r24
   12c7e:	68 a5       	ldd	r22, Y+40	; 0x28
   12c80:	79 a5       	ldd	r23, Y+41	; 0x29
   12c82:	8a a5       	ldd	r24, Y+42	; 0x2a
   12c84:	9b a5       	ldd	r25, Y+43	; 0x2b
   12c86:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   12c8a:	68 a7       	std	Y+40, r22	; 0x28
   12c8c:	79 a7       	std	Y+41, r23	; 0x29
   12c8e:	8a a7       	std	Y+42, r24	; 0x2a
   12c90:	9b a7       	std	Y+43, r25	; 0x2b
                r_axis_y = -offset[X_AXIS] * sin_Ti - offset[Y_AXIS] * cos_Ti;
   12c92:	a7 01       	movw	r20, r14
   12c94:	96 01       	movw	r18, r12
   12c96:	c5 01       	movw	r24, r10
   12c98:	b4 01       	movw	r22, r8
   12c9a:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   12c9e:	6b 01       	movw	r12, r22
   12ca0:	7c 01       	movw	r14, r24
   12ca2:	28 a9       	ldd	r18, Y+48	; 0x30
   12ca4:	39 a9       	ldd	r19, Y+49	; 0x31
   12ca6:	4a a9       	ldd	r20, Y+50	; 0x32
   12ca8:	5b a9       	ldd	r21, Y+51	; 0x33
   12caa:	6c a5       	ldd	r22, Y+44	; 0x2c
   12cac:	7d a5       	ldd	r23, Y+45	; 0x2d
   12cae:	8e a5       	ldd	r24, Y+46	; 0x2e
   12cb0:	9f a5       	ldd	r25, Y+47	; 0x2f
   12cb2:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   12cb6:	9b 01       	movw	r18, r22
   12cb8:	ac 01       	movw	r20, r24
   12cba:	c7 01       	movw	r24, r14
   12cbc:	b6 01       	movw	r22, r12
   12cbe:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   12cc2:	6c a7       	std	Y+44, r22	; 0x2c
   12cc4:	7d a7       	std	Y+45, r23	; 0x2d
   12cc6:	8e a7       	std	Y+46, r24	; 0x2e
   12cc8:	9f a7       	std	Y+47, r25	; 0x2f
                // reset n_arc_correction
                n_arc_correction = cs.n_arc_correction;
   12cca:	90 91 33 0e 	lds	r25, 0x0E33	; 0x800e33 <cs+0xcc>
   12cce:	98 ab       	std	Y+48, r25	; 0x30
                r_axis_x = r_axis_x * cos_T - r_axis_y * sin_T;
                r_axis_y = r_axisi;
            }

            // Update Position
            start_position[X_AXIS] = center_axis_x + r_axis_x;
   12cd0:	28 a5       	ldd	r18, Y+40	; 0x28
   12cd2:	39 a5       	ldd	r19, Y+41	; 0x29
   12cd4:	4a a5       	ldd	r20, Y+42	; 0x2a
   12cd6:	5b a5       	ldd	r21, Y+43	; 0x2b
   12cd8:	62 96       	adiw	r28, 0x12	; 18
   12cda:	6c ad       	ldd	r22, Y+60	; 0x3c
   12cdc:	7d ad       	ldd	r23, Y+61	; 0x3d
   12cde:	8e ad       	ldd	r24, Y+62	; 0x3e
   12ce0:	9f ad       	ldd	r25, Y+63	; 0x3f
   12ce2:	62 97       	sbiw	r28, 0x12	; 18
   12ce4:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   12ce8:	69 83       	std	Y+1, r22	; 0x01
   12cea:	7a 83       	std	Y+2, r23	; 0x02
   12cec:	8b 83       	std	Y+3, r24	; 0x03
   12cee:	9c 83       	std	Y+4, r25	; 0x04
            start_position[Y_AXIS] = center_axis_y + r_axis_y;
   12cf0:	2c a5       	ldd	r18, Y+44	; 0x2c
   12cf2:	3d a5       	ldd	r19, Y+45	; 0x2d
   12cf4:	4e a5       	ldd	r20, Y+46	; 0x2e
   12cf6:	5f a5       	ldd	r21, Y+47	; 0x2f
   12cf8:	66 96       	adiw	r28, 0x16	; 22
   12cfa:	6c ad       	ldd	r22, Y+60	; 0x3c
   12cfc:	7d ad       	ldd	r23, Y+61	; 0x3d
   12cfe:	8e ad       	ldd	r24, Y+62	; 0x3e
   12d00:	9f ad       	ldd	r25, Y+63	; 0x3f
   12d02:	66 97       	sbiw	r28, 0x16	; 22
   12d04:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   12d08:	6d 83       	std	Y+5, r22	; 0x05
   12d0a:	7e 83       	std	Y+6, r23	; 0x06
   12d0c:	8f 83       	std	Y+7, r24	; 0x07
   12d0e:	98 87       	std	Y+8, r25	; 0x08
            start_position[Z_AXIS] += linear_per_segment;
   12d10:	28 96       	adiw	r28, 0x08	; 8
   12d12:	2c ad       	ldd	r18, Y+60	; 0x3c
   12d14:	3d ad       	ldd	r19, Y+61	; 0x3d
   12d16:	4e ad       	ldd	r20, Y+62	; 0x3e
   12d18:	5f ad       	ldd	r21, Y+63	; 0x3f
   12d1a:	28 97       	sbiw	r28, 0x08	; 8
   12d1c:	69 85       	ldd	r22, Y+9	; 0x09
   12d1e:	7a 85       	ldd	r23, Y+10	; 0x0a
   12d20:	8b 85       	ldd	r24, Y+11	; 0x0b
   12d22:	9c 85       	ldd	r25, Y+12	; 0x0c
   12d24:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   12d28:	69 87       	std	Y+9, r22	; 0x09
   12d2a:	7a 87       	std	Y+10, r23	; 0x0a
   12d2c:	8b 87       	std	Y+11, r24	; 0x0b
   12d2e:	9c 87       	std	Y+12, r25	; 0x0c
            start_position[E_AXIS] += segment_extruder_travel;
   12d30:	2c 96       	adiw	r28, 0x0c	; 12
   12d32:	2c ad       	ldd	r18, Y+60	; 0x3c
   12d34:	3d ad       	ldd	r19, Y+61	; 0x3d
   12d36:	4e ad       	ldd	r20, Y+62	; 0x3e
   12d38:	5f ad       	ldd	r21, Y+63	; 0x3f
   12d3a:	2c 97       	sbiw	r28, 0x0c	; 12
   12d3c:	6d 85       	ldd	r22, Y+13	; 0x0d
   12d3e:	7e 85       	ldd	r23, Y+14	; 0x0e
   12d40:	8f 85       	ldd	r24, Y+15	; 0x0f
   12d42:	98 89       	ldd	r25, Y+16	; 0x10
   12d44:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   12d48:	6d 87       	std	Y+13, r22	; 0x0d
   12d4a:	7e 87       	std	Y+14, r23	; 0x0e
   12d4c:	8f 87       	std	Y+15, r24	; 0x0f
   12d4e:	98 8b       	std	Y+16, r25	; 0x10
            // Clamp to the calculated position.
            clamp_to_software_endstops(start_position);
   12d50:	ce 01       	movw	r24, r28
   12d52:	01 96       	adiw	r24, 0x01	; 1
   12d54:	0e 94 7c 6a 	call	0xd4f8	; 0xd4f8 <clamp_to_software_endstops(float*)>
            // Insert the segment into the buffer
            if (i >= start_segment_idx)
   12d58:	2e 96       	adiw	r28, 0x0e	; 14
   12d5a:	ae ad       	ldd	r26, Y+62	; 0x3e
   12d5c:	bf ad       	ldd	r27, Y+63	; 0x3f
   12d5e:	2e 97       	sbiw	r28, 0x0e	; 14
   12d60:	2a 16       	cp	r2, r26
   12d62:	3b 06       	cpc	r3, r27
   12d64:	f8 f0       	brcs	.+62     	; 0x12da4 <process_commands() [clone .part.46]+0xdec>
                plan_buffer_line(start_position[X_AXIS], start_position[Y_AXIS], start_position[Z_AXIS], start_position[E_AXIS], feed_rate, position, i);
   12d66:	e9 84       	ldd	r14, Y+9	; 0x09
   12d68:	fa 84       	ldd	r15, Y+10	; 0x0a
   12d6a:	0b 85       	ldd	r16, Y+11	; 0x0b
   12d6c:	1c 85       	ldd	r17, Y+12	; 0x0c
   12d6e:	2d 81       	ldd	r18, Y+5	; 0x05
   12d70:	3e 81       	ldd	r19, Y+6	; 0x06
   12d72:	4f 81       	ldd	r20, Y+7	; 0x07
   12d74:	58 85       	ldd	r21, Y+8	; 0x08
   12d76:	69 81       	ldd	r22, Y+1	; 0x01
   12d78:	7a 81       	ldd	r23, Y+2	; 0x02
   12d7a:	8b 81       	ldd	r24, Y+3	; 0x03
   12d7c:	9c 81       	ldd	r25, Y+4	; 0x04
   12d7e:	3f 92       	push	r3
   12d80:	2f 92       	push	r2
   12d82:	e1 e6       	ldi	r30, 0x61	; 97
   12d84:	f2 e1       	ldi	r31, 0x12	; 18
   12d86:	ff 93       	push	r31
   12d88:	ef 93       	push	r30
   12d8a:	88 ac       	ldd	r8, Y+56	; 0x38
   12d8c:	99 ac       	ldd	r9, Y+57	; 0x39
   12d8e:	aa ac       	ldd	r10, Y+58	; 0x3a
   12d90:	bb ac       	ldd	r11, Y+59	; 0x3b
   12d92:	fe 01       	movw	r30, r28
   12d94:	3d 96       	adiw	r30, 0x0d	; 13
   12d96:	6f 01       	movw	r12, r30
   12d98:	0f 94 33 3d 	call	0x27a66	; 0x27a66 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)>
   12d9c:	0f 90       	pop	r0
   12d9e:	0f 90       	pop	r0
   12da0:	0f 90       	pop	r0
   12da2:	0f 90       	pop	r0
            // Handle the situation where the planner is aborted hard.
            if (planner_aborted)
   12da4:	80 91 42 0d 	lds	r24, 0x0D42	; 0x800d42 <planner_aborted>
   12da8:	81 11       	cpse	r24, r1
   12daa:	39 c0       	rjmp	.+114    	; 0x12e1e <process_commands() [clone .part.46]+0xe66>
            sq_theta_per_segment = theta_per_segment * theta_per_segment,
            sin_T = theta_per_segment - sq_theta_per_segment * theta_per_segment / 6,
            cos_T = 1 - 0.5f * sq_theta_per_segment;
        // Loop through all but one of the segments.  The last one can be done simply
        // by moving to the target.
        for (uint16_t i = 1; i < segments; i++) {
   12dac:	ff ef       	ldi	r31, 0xFF	; 255
   12dae:	2f 1a       	sub	r2, r31
   12db0:	3f 0a       	sbc	r3, r31
   12db2:	2c a9       	ldd	r18, Y+52	; 0x34
   12db4:	3d a9       	ldd	r19, Y+53	; 0x35
   12db6:	22 15       	cp	r18, r2
   12db8:	33 05       	cpc	r19, r3
   12dba:	09 f0       	breq	.+2      	; 0x12dbe <process_commands() [clone .part.46]+0xe06>
   12dbc:	16 cf       	rjmp	.-468    	; 0x12bea <process_commands() [clone .part.46]+0xc32>
            if (planner_aborted)
                return;
        }
    }
    // Clamp to the target position.
    clamp_to_software_endstops(target);
   12dbe:	89 e2       	ldi	r24, 0x29	; 41
   12dc0:	96 e0       	ldi	r25, 0x06	; 6
   12dc2:	0e 94 7c 6a 	call	0xd4f8	; 0xd4f8 <clamp_to_software_endstops(float*)>
    // Ensure last segment arrives at target location.
    plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feed_rate, position, 0);
   12dc6:	e0 90 31 06 	lds	r14, 0x0631	; 0x800631 <destination+0x8>
   12dca:	f0 90 32 06 	lds	r15, 0x0632	; 0x800632 <destination+0x9>
   12dce:	00 91 33 06 	lds	r16, 0x0633	; 0x800633 <destination+0xa>
   12dd2:	10 91 34 06 	lds	r17, 0x0634	; 0x800634 <destination+0xb>
   12dd6:	20 91 2d 06 	lds	r18, 0x062D	; 0x80062d <destination+0x4>
   12dda:	30 91 2e 06 	lds	r19, 0x062E	; 0x80062e <destination+0x5>
   12dde:	40 91 2f 06 	lds	r20, 0x062F	; 0x80062f <destination+0x6>
   12de2:	50 91 30 06 	lds	r21, 0x0630	; 0x800630 <destination+0x7>
   12de6:	60 91 29 06 	lds	r22, 0x0629	; 0x800629 <destination>
   12dea:	70 91 2a 06 	lds	r23, 0x062A	; 0x80062a <destination+0x1>
   12dee:	80 91 2b 06 	lds	r24, 0x062B	; 0x80062b <destination+0x2>
   12df2:	90 91 2c 06 	lds	r25, 0x062C	; 0x80062c <destination+0x3>
   12df6:	1f 92       	push	r1
   12df8:	1f 92       	push	r1
   12dfa:	e1 e6       	ldi	r30, 0x61	; 97
   12dfc:	f2 e1       	ldi	r31, 0x12	; 18
   12dfe:	ff 93       	push	r31
   12e00:	ef 93       	push	r30
   12e02:	88 ac       	ldd	r8, Y+56	; 0x38
   12e04:	99 ac       	ldd	r9, Y+57	; 0x39
   12e06:	aa ac       	ldd	r10, Y+58	; 0x3a
   12e08:	bb ac       	ldd	r11, Y+59	; 0x3b
   12e0a:	a5 e3       	ldi	r26, 0x35	; 53
   12e0c:	ca 2e       	mov	r12, r26
   12e0e:	a6 e0       	ldi	r26, 0x06	; 6
   12e10:	da 2e       	mov	r13, r26
   12e12:	0f 94 33 3d 	call	0x27a66	; 0x27a66 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)>
   12e16:	0f 90       	pop	r0
   12e18:	0f 90       	pop	r0
   12e1a:	0f 90       	pop	r0
   12e1c:	0f 90       	pop	r0
    // As far as the parser is concerned, the position is now == target. In reality the
    // motion control system might still be processing the action and the real tool position
    // in any intermediate location.
    set_current_to_destination();
   12e1e:	0e 94 e8 54 	call	0xa9d0	; 0xa9d0 <set_current_to_destination()>
    previous_millis_cmd.start();
   12e22:	88 e4       	ldi	r24, 0x48	; 72
   12e24:	93 e0       	ldi	r25, 0x03	; 3
   12e26:	0f 94 47 10 	call	0x2208e	; 0x2208e <Timer<unsigned long>::start()>
   12e2a:	4d cc       	rjmp	.-1894   	; 0x126c6 <process_commands() [clone .part.46]+0x70e>
        get_coordinates(); // For X Y Z E F
#ifdef SF_ARC_FIX
        relative_mode=relative_mode_backup;
#endif

        offset[0] = code_seen('I') ? code_value() : 0.f;
   12e2c:	60 e0       	ldi	r22, 0x00	; 0
   12e2e:	70 e0       	ldi	r23, 0x00	; 0
   12e30:	cb 01       	movw	r24, r22
   12e32:	5e cc       	rjmp	.-1860   	; 0x126f0 <process_commands() [clone .part.46]+0x738>
    float center_axis_y = start_position[Y_AXIS] - r_axis_y;
    float travel_z = target[Z_AXIS] - start_position[Z_AXIS];
    float rt_x = target[X_AXIS] - center_axis_x;
    float rt_y = target[Y_AXIS] - center_axis_y;
    // 20200419 - Add a variable that will be used to hold the arc segment length
    float mm_per_arc_segment = cs.mm_per_arc_segment;
   12e34:	a3 2c       	mov	r10, r3
   12e36:	b2 2c       	mov	r11, r2
   12e38:	0c a9       	ldd	r16, Y+52	; 0x34
   12e3a:	1c ad       	ldd	r17, Y+60	; 0x3c
   12e3c:	b0 cd       	rjmp	.-1184   	; 0x1299e <process_commands() [clone .part.46]+0x9e6>
                // reset n_arc_correction
                n_arc_correction = cs.n_arc_correction;
            }
            else {
                // Calculate X and Y using the small angle approximation
                const float r_axisi = r_axis_x * sin_T + r_axis_y * cos_T;
   12e3e:	28 a5       	ldd	r18, Y+40	; 0x28
   12e40:	39 a5       	ldd	r19, Y+41	; 0x29
   12e42:	4a a5       	ldd	r20, Y+42	; 0x2a
   12e44:	5b a5       	ldd	r21, Y+43	; 0x2b
   12e46:	6c ad       	ldd	r22, Y+60	; 0x3c
   12e48:	7d ad       	ldd	r23, Y+61	; 0x3d
   12e4a:	8e ad       	ldd	r24, Y+62	; 0x3e
   12e4c:	9f ad       	ldd	r25, Y+63	; 0x3f
   12e4e:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   12e52:	4b 01       	movw	r8, r22
   12e54:	5c 01       	movw	r10, r24
   12e56:	2c a5       	ldd	r18, Y+44	; 0x2c
   12e58:	3d a5       	ldd	r19, Y+45	; 0x2d
   12e5a:	4e a5       	ldd	r20, Y+46	; 0x2e
   12e5c:	5f a5       	ldd	r21, Y+47	; 0x2f
   12e5e:	24 96       	adiw	r28, 0x04	; 4
   12e60:	6c ad       	ldd	r22, Y+60	; 0x3c
   12e62:	7d ad       	ldd	r23, Y+61	; 0x3d
   12e64:	8e ad       	ldd	r24, Y+62	; 0x3e
   12e66:	9f ad       	ldd	r25, Y+63	; 0x3f
   12e68:	24 97       	sbiw	r28, 0x04	; 4
   12e6a:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   12e6e:	9b 01       	movw	r18, r22
   12e70:	ac 01       	movw	r20, r24
   12e72:	c5 01       	movw	r24, r10
   12e74:	b4 01       	movw	r22, r8
   12e76:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   12e7a:	7b 01       	movw	r14, r22
   12e7c:	8c 01       	movw	r16, r24
                r_axis_x = r_axis_x * cos_T - r_axis_y * sin_T;
   12e7e:	28 a5       	ldd	r18, Y+40	; 0x28
   12e80:	39 a5       	ldd	r19, Y+41	; 0x29
   12e82:	4a a5       	ldd	r20, Y+42	; 0x2a
   12e84:	5b a5       	ldd	r21, Y+43	; 0x2b
   12e86:	24 96       	adiw	r28, 0x04	; 4
   12e88:	6c ad       	ldd	r22, Y+60	; 0x3c
   12e8a:	7d ad       	ldd	r23, Y+61	; 0x3d
   12e8c:	8e ad       	ldd	r24, Y+62	; 0x3e
   12e8e:	9f ad       	ldd	r25, Y+63	; 0x3f
   12e90:	24 97       	sbiw	r28, 0x04	; 4
   12e92:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   12e96:	4b 01       	movw	r8, r22
   12e98:	5c 01       	movw	r10, r24
   12e9a:	2c a5       	ldd	r18, Y+44	; 0x2c
   12e9c:	3d a5       	ldd	r19, Y+45	; 0x2d
   12e9e:	4e a5       	ldd	r20, Y+46	; 0x2e
   12ea0:	5f a5       	ldd	r21, Y+47	; 0x2f
   12ea2:	6c ad       	ldd	r22, Y+60	; 0x3c
   12ea4:	7d ad       	ldd	r23, Y+61	; 0x3d
   12ea6:	8e ad       	ldd	r24, Y+62	; 0x3e
   12ea8:	9f ad       	ldd	r25, Y+63	; 0x3f
   12eaa:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   12eae:	9b 01       	movw	r18, r22
   12eb0:	ac 01       	movw	r20, r24
   12eb2:	c5 01       	movw	r24, r10
   12eb4:	b4 01       	movw	r22, r8
   12eb6:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   12eba:	68 a7       	std	Y+40, r22	; 0x28
   12ebc:	79 a7       	std	Y+41, r23	; 0x29
   12ebe:	8a a7       	std	Y+42, r24	; 0x2a
   12ec0:	9b a7       	std	Y+43, r25	; 0x2b
   12ec2:	d8 aa       	std	Y+48, r13	; 0x30
                r_axis_y = r_axisi;
   12ec4:	c7 01       	movw	r24, r14
   12ec6:	d8 01       	movw	r26, r16
   12ec8:	8c a7       	std	Y+44, r24	; 0x2c
   12eca:	9d a7       	std	Y+45, r25	; 0x2d
   12ecc:	ae a7       	std	Y+46, r26	; 0x2e
   12ece:	bf a7       	std	Y+47, r27	; 0x2f
   12ed0:	ff ce       	rjmp	.-514    	; 0x12cd0 <process_commands() [clone .part.46]+0xd18>
      - `S` - Time to wait, in seconds

    */
    case 4:
      codenum = 0;
      if(code_seen('P')) codenum = code_value(); // milliseconds to wait
   12ed2:	80 e5       	ldi	r24, 0x50	; 80
   12ed4:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
      - `P` - Time to wait, in milliseconds
      - `S` - Time to wait, in seconds

    */
    case 4:
      codenum = 0;
   12ed8:	c1 2c       	mov	r12, r1
   12eda:	d1 2c       	mov	r13, r1
   12edc:	76 01       	movw	r14, r12
      if(code_seen('P')) codenum = code_value(); // milliseconds to wait
   12ede:	88 23       	and	r24, r24
   12ee0:	31 f0       	breq	.+12     	; 0x12eee <process_commands() [clone .part.46]+0xf36>
   12ee2:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   12ee6:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   12eea:	6b 01       	movw	r12, r22
   12eec:	7c 01       	movw	r14, r24
      if(code_seen('S')) codenum = code_value() * 1000; // seconds to wait
   12eee:	83 e5       	ldi	r24, 0x53	; 83
   12ef0:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   12ef4:	88 23       	and	r24, r24
   12ef6:	61 f0       	breq	.+24     	; 0x12f10 <process_commands() [clone .part.46]+0xf58>
   12ef8:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   12efc:	20 e0       	ldi	r18, 0x00	; 0
   12efe:	30 e0       	ldi	r19, 0x00	; 0
   12f00:	4a e7       	ldi	r20, 0x7A	; 122
   12f02:	54 e4       	ldi	r21, 0x44	; 68
   12f04:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   12f08:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   12f0c:	6b 01       	movw	r12, r22
   12f0e:	7c 01       	movw	r14, r24
      if(codenum != 0)
   12f10:	c1 14       	cp	r12, r1
   12f12:	d1 04       	cpc	r13, r1
   12f14:	e1 04       	cpc	r14, r1
   12f16:	f1 04       	cpc	r15, r1
   12f18:	41 f0       	breq	.+16     	; 0x12f2a <process_commands() [clone .part.46]+0xf72>
      {
        if(custom_message_type != CustomMsg::M117)
   12f1a:	80 91 5d 06 	lds	r24, 0x065D	; 0x80065d <custom_message_type>
   12f1e:	87 30       	cpi	r24, 0x07	; 7
   12f20:	21 f0       	breq	.+8      	; 0x12f2a <process_commands() [clone .part.46]+0xf72>
        {
          LCD_MESSAGERPGM(_n("Sleep..."));////MSG_DWELL
   12f22:	8d e2       	ldi	r24, 0x2D	; 45
   12f24:	97 e6       	ldi	r25, 0x67	; 103
   12f26:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
        }
      }
      st_synchronize();
   12f2a:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
      codenum += _millis();  // keep track of when we started waiting
   12f2e:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   12f32:	c6 0e       	add	r12, r22
   12f34:	d7 1e       	adc	r13, r23
   12f36:	e8 1e       	adc	r14, r24
   12f38:	f9 1e       	adc	r15, r25
      previous_millis_cmd.start();
   12f3a:	88 e4       	ldi	r24, 0x48	; 72
   12f3c:	93 e0       	ldi	r25, 0x03	; 3
   12f3e:	0f 94 47 10 	call	0x2208e	; 0x2208e <Timer<unsigned long>::start()>
      while(_millis() < codenum) {
   12f42:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   12f46:	6c 15       	cp	r22, r12
   12f48:	7d 05       	cpc	r23, r13
   12f4a:	8e 05       	cpc	r24, r14
   12f4c:	9f 05       	cpc	r25, r15
   12f4e:	08 f0       	brcs	.+2      	; 0x12f52 <process_commands() [clone .part.46]+0xf9a>
   12f50:	ba cb       	rjmp	.-2188   	; 0x126c6 <process_commands() [clone .part.46]+0x70e>
        manage_heater();
   12f52:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
        manage_inactivity();
   12f56:	80 e0       	ldi	r24, 0x00	; 0
   12f58:	0e 94 34 8c 	call	0x11868	; 0x11868 <manage_inactivity(bool)>
        lcd_update(0);
   12f5c:	80 e0       	ldi	r24, 0x00	; 0
   12f5e:	0e 94 f9 6e 	call	0xddf2	; 0xddf2 <lcd_update(unsigned char)>
   12f62:	ef cf       	rjmp	.-34     	; 0x12f42 <process_commands() [clone .part.46]+0xf8a>
    case 10:
       #if EXTRUDERS > 1
        retracted_swap[active_extruder]=(code_seen('S') && code_value_long() == 1); // checks for swap retract argument
        retract(true,retracted_swap[active_extruder]);
       #else
        retract(true);
   12f64:	81 e0       	ldi	r24, 0x01	; 1
    */
    case 11:
       #if EXTRUDERS > 1
        retract(false,retracted_swap[active_extruder]);
       #else
        retract(false);
   12f66:	0f 94 2c 90 	call	0x32058	; 0x32058 <retract(bool, bool) [clone .constprop.54]>
   12f6a:	ad cb       	rjmp	.-2214   	; 0x126c6 <process_commands() [clone .part.46]+0x70e>
   12f6c:	80 e0       	ldi	r24, 0x00	; 0
   12f6e:	fb cf       	rjmp	.-10     	; 0x12f66 <process_commands() [clone .part.46]+0xfae>
    {
      long home_x_value = 0;
      long home_y_value = 0;
      long home_z_value = 0;
      // Which axes should be homed?
      bool home_x = code_seen(axis_codes[X_AXIS]);
   12f70:	88 e5       	ldi	r24, 0x58	; 88
   12f72:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   12f76:	38 2e       	mov	r3, r24
     - `W` - Suppress mesh bed leveling if `X`, `Y` or `Z` are not provided
     - `C` - Calibrate X and Y origin (home) - Only on MK3/s
    */
    case 28:
    {
      long home_x_value = 0;
   12f78:	41 2c       	mov	r4, r1
   12f7a:	51 2c       	mov	r5, r1
   12f7c:	32 01       	movw	r6, r4
      long home_y_value = 0;
      long home_z_value = 0;
      // Which axes should be homed?
      bool home_x = code_seen(axis_codes[X_AXIS]);
      if (home_x) home_x_value = code_value_long();
   12f7e:	88 23       	and	r24, r24
   12f80:	21 f0       	breq	.+8      	; 0x12f8a <process_commands() [clone .part.46]+0xfd2>
   12f82:	0e 94 5d 56 	call	0xacba	; 0xacba <code_value_long() [clone .lto_priv.507]>
   12f86:	2b 01       	movw	r4, r22
   12f88:	3c 01       	movw	r6, r24
      bool home_y = code_seen(axis_codes[Y_AXIS]);
   12f8a:	89 e5       	ldi	r24, 0x59	; 89
   12f8c:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   12f90:	28 2e       	mov	r2, r24
      if (home_y) home_y_value = code_value_long();
   12f92:	88 23       	and	r24, r24
   12f94:	71 f1       	breq	.+92     	; 0x12ff2 <process_commands() [clone .part.46]+0x103a>
   12f96:	0e 94 5d 56 	call	0xacba	; 0xacba <code_value_long() [clone .lto_priv.507]>
   12f9a:	6c a7       	std	Y+44, r22	; 0x2c
   12f9c:	7d a7       	std	Y+45, r23	; 0x2d
   12f9e:	8e a7       	std	Y+46, r24	; 0x2e
   12fa0:	9f a7       	std	Y+47, r25	; 0x2f
      bool home_z = code_seen(axis_codes[Z_AXIS]);
   12fa2:	8a e5       	ldi	r24, 0x5A	; 90
   12fa4:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   12fa8:	d8 2e       	mov	r13, r24
    */
    case 28:
    {
      long home_x_value = 0;
      long home_y_value = 0;
      long home_z_value = 0;
   12faa:	81 2c       	mov	r8, r1
   12fac:	91 2c       	mov	r9, r1
   12fae:	54 01       	movw	r10, r8
      bool home_x = code_seen(axis_codes[X_AXIS]);
      if (home_x) home_x_value = code_value_long();
      bool home_y = code_seen(axis_codes[Y_AXIS]);
      if (home_y) home_y_value = code_value_long();
      bool home_z = code_seen(axis_codes[Z_AXIS]);
      if (home_z) home_z_value = code_value_long();
   12fb0:	88 23       	and	r24, r24
   12fb2:	21 f0       	breq	.+8      	; 0x12fbc <process_commands() [clone .part.46]+0x1004>
   12fb4:	0e 94 5d 56 	call	0xacba	; 0xacba <code_value_long() [clone .lto_priv.507]>
   12fb8:	4b 01       	movw	r8, r22
   12fba:	5c 01       	movw	r10, r24
      bool without_mbl = code_seen('W');
   12fbc:	87 e5       	ldi	r24, 0x57	; 87
   12fbe:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   12fc2:	88 a7       	std	Y+40, r24	; 0x28
      // calibrate?
#ifdef TMC2130
      bool calib = code_seen('C');
      gcode_G28(home_x, home_x_value, home_y, home_y_value, home_z, home_z_value, calib, without_mbl);
#else
      gcode_G28(home_x, home_x_value, home_y, home_y_value, home_z, home_z_value, without_mbl);
   12fc4:	8f 93       	push	r24
   12fc6:	cd 2c       	mov	r12, r13
   12fc8:	ec a4       	ldd	r14, Y+44	; 0x2c
   12fca:	fd a4       	ldd	r15, Y+45	; 0x2d
   12fcc:	0e a5       	ldd	r16, Y+46	; 0x2e
   12fce:	1f a5       	ldd	r17, Y+47	; 0x2f
   12fd0:	22 2d       	mov	r18, r2
   12fd2:	b3 01       	movw	r22, r6
   12fd4:	a2 01       	movw	r20, r4
   12fd6:	83 2d       	mov	r24, r3
   12fd8:	0e 94 2a 6d 	call	0xda54	; 0xda54 <gcode_G28(bool, long, bool, long, bool, long, bool)>
#endif //TMC2130
      if ((home_x || home_y || without_mbl || home_z) == false) {
   12fdc:	0f 90       	pop	r0
   12fde:	31 10       	cpse	r3, r1
   12fe0:	72 cb       	rjmp	.-2332   	; 0x126c6 <process_commands() [clone .part.46]+0x70e>
   12fe2:	21 10       	cpse	r2, r1
   12fe4:	70 cb       	rjmp	.-2336   	; 0x126c6 <process_commands() [clone .part.46]+0x70e>
   12fe6:	38 a5       	ldd	r19, Y+40	; 0x28
   12fe8:	31 11       	cpse	r19, r1
   12fea:	6d cb       	rjmp	.-2342   	; 0x126c6 <process_commands() [clone .part.46]+0x70e>
   12fec:	d1 10       	cpse	r13, r1
   12fee:	6b cb       	rjmp	.-2346   	; 0x126c6 <process_commands() [clone .part.46]+0x70e>
   12ff0:	20 cb       	rjmp	.-2496   	; 0x12632 <process_commands() [clone .part.46]+0x67a>
     - `C` - Calibrate X and Y origin (home) - Only on MK3/s
    */
    case 28:
    {
      long home_x_value = 0;
      long home_y_value = 0;
   12ff2:	1c a6       	std	Y+44, r1	; 0x2c
   12ff4:	1d a6       	std	Y+45, r1	; 0x2d
   12ff6:	1e a6       	std	Y+46, r1	; 0x2e
   12ff8:	1f a6       	std	Y+47, r1	; 0x2f
   12ffa:	d3 cf       	rjmp	.-90     	; 0x12fa2 <process_commands() [clone .part.46]+0xfea>
  else if(*CMDBUFFER_CURRENT_STRING == 'G')
  {
	strchr_pointer = CMDBUFFER_CURRENT_STRING;
	gcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN G-CODE=%u\n"), gcode_in_progress);
    switch (gcode_in_progress)
   12ffc:	08 e2       	ldi	r16, 0x28	; 40
   12ffe:	10 e0       	ldi	r17, 0x00	; 0
  Show/print PINDA temperature interpolating.
  */
	case 75:
	{
		for (uint8_t i = 40; i <= 110; i++)
			printf_P(_N("%d  %.2f"), i, temp_comp_interpolation(i));
   13000:	f8 e0       	ldi	r31, 0x08	; 8
   13002:	ef 2e       	mov	r14, r31
   13004:	f7 e6       	ldi	r31, 0x67	; 103
   13006:	ff 2e       	mov	r15, r31
   13008:	60 2f       	mov	r22, r16
   1300a:	70 e0       	ldi	r23, 0x00	; 0
   1300c:	90 e0       	ldi	r25, 0x00	; 0
   1300e:	80 e0       	ldi	r24, 0x00	; 0
   13010:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   13014:	0e 94 86 56 	call	0xad0c	; 0xad0c <temp_comp_interpolation(float)>
   13018:	9f 93       	push	r25
   1301a:	8f 93       	push	r24
   1301c:	7f 93       	push	r23
   1301e:	6f 93       	push	r22
   13020:	1f 93       	push	r17
   13022:	0f 93       	push	r16
   13024:	ff 92       	push	r15
   13026:	ef 92       	push	r14
   13028:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   1302c:	0f 5f       	subi	r16, 0xFF	; 255
   1302e:	1f 4f       	sbci	r17, 0xFF	; 255
  ### G75 - Print temperature interpolation <a href="https://reprap.org/wiki/G-code#G75:_Print_temperature_interpolation">G75: Print temperature interpolation</a>
  Show/print PINDA temperature interpolating.
  */
	case 75:
	{
		for (uint8_t i = 40; i <= 110; i++)
   13030:	0f b6       	in	r0, 0x3f	; 63
   13032:	f8 94       	cli
   13034:	de bf       	out	0x3e, r29	; 62
   13036:	0f be       	out	0x3f, r0	; 63
   13038:	cd bf       	out	0x3d, r28	; 61
   1303a:	0f 36       	cpi	r16, 0x6F	; 111
   1303c:	11 05       	cpc	r17, r1
   1303e:	21 f7       	brne	.-56     	; 0x13008 <process_commands() [clone .part.46]+0x1050>
   13040:	42 cb       	rjmp	.-2428   	; 0x126c6 <process_commands() [clone .part.46]+0x70e>
  ```
  */
  case 76:
	{
#ifdef PINDA_THERMISTOR
        if (!has_temperature_compensation())
   13042:	0f 94 58 13 	call	0x226b0	; 0x226b0 <has_temperature_compensation()>
   13046:	81 11       	cpse	r24, r1
   13048:	05 c0       	rjmp	.+10     	; 0x13054 <process_commands() [clone .part.46]+0x109c>
        {
            SERIAL_ECHOLNPGM("No PINDA thermistor");
   1304a:	87 ec       	ldi	r24, 0xC7	; 199
   1304c:	90 e8       	ldi	r25, 0x80	; 128
   1304e:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   13052:	39 cb       	rjmp	.-2446   	; 0x126c6 <process_commands() [clone .part.46]+0x70e>
            break;
        }

        if (!calibration_status_get(CALIBRATION_STATUS_XYZ)) {
   13054:	82 e0       	ldi	r24, 0x02	; 2
   13056:	0e 94 5b d7 	call	0x1aeb6	; 0x1aeb6 <calibration_status_get(unsigned char)>
   1305a:	81 11       	cpse	r24, r1
   1305c:	07 c0       	rjmp	.+14     	; 0x1306c <process_commands() [clone .part.46]+0x10b4>
            //we need to know accurate position of first calibration point
            //if xyz calibration was not performed yet, interrupt temperature calibration and inform user that xyz cal. is needed
            lcd_show_fullscreen_message_and_wait_P(_T(MSG_RUN_XYZ));
   1305e:	8a ed       	ldi	r24, 0xDA	; 218
   13060:	99 e3       	ldi	r25, 0x39	; 57
   13062:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   13066:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
   1306a:	2d cb       	rjmp	.-2470   	; 0x126c6 <process_commands() [clone .part.46]+0x70e>
            break;
        }

        if (!(axis_known_position[X_AXIS] && axis_known_position[Y_AXIS] && axis_known_position[Z_AXIS]))
   1306c:	80 91 39 06 	lds	r24, 0x0639	; 0x800639 <axis_known_position>
   13070:	88 23       	and	r24, r24
   13072:	41 f0       	breq	.+16     	; 0x13084 <process_commands() [clone .part.46]+0x10cc>
   13074:	80 91 3a 06 	lds	r24, 0x063A	; 0x80063a <axis_known_position+0x1>
   13078:	88 23       	and	r24, r24
   1307a:	21 f0       	breq	.+8      	; 0x13084 <process_commands() [clone .part.46]+0x10cc>
   1307c:	d0 90 3b 06 	lds	r13, 0x063B	; 0x80063b <axis_known_position+0x2>
   13080:	d1 10       	cpse	r13, r1
   13082:	08 c0       	rjmp	.+16     	; 0x13094 <process_commands() [clone .part.46]+0x10dc>

// Mark the command at the top of the command queue as new.
// Therefore it will not be removed from the queue.
void repeatcommand_front()
{
    cmdbuffer_front_already_processed = true;
   13084:	81 e0       	ldi	r24, 0x01	; 1
   13086:	80 93 53 12 	sts	0x1253, r24	; 0x801253 <cmdbuffer_front_already_processed>
        {
            // We don't know where we are! HOME!
            // Push the commands to the front of the message queue in the reverse order!
            // There shall be always enough space reserved for these commands.
            repeatcommand_front(); // repeat G76 with all its parameters
            enquecommand_front_P(G28W);
   1308a:	81 ed       	ldi	r24, 0xD1	; 209
   1308c:	98 e6       	ldi	r25, 0x68	; 104
   1308e:	0f 94 78 67 	call	0x2cef0	; 0x2cef0 <enquecommand_front(char const*, bool) [clone .constprop.294]>
   13092:	19 cb       	rjmp	.-2510   	; 0x126c6 <process_commands() [clone .part.46]+0x70e>
            break;
        }
        lcd_show_fullscreen_message_and_wait_P(_T(MSG_TEMP_CAL_WARNING));
   13094:	81 e9       	ldi	r24, 0x91	; 145
   13096:	99 e3       	ldi	r25, 0x39	; 57
   13098:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1309c:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
        uint8_t result = lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_STEEL_SHEET_CHECK), false);
   130a0:	8d e1       	ldi	r24, 0x1D	; 29
   130a2:	90 e4       	ldi	r25, 0x40	; 64
   130a4:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   130a8:	41 e0       	ldi	r20, 0x01	; 1
   130aa:	60 e0       	ldi	r22, 0x00	; 0
   130ac:	0e 94 b2 e8 	call	0x1d164	; 0x1d164 <lcd_show_multiscreen_message_yes_no_and_wait_P(char const*, bool, unsigned char)>

        if (result == LCD_LEFT_BUTTON_CHOICE)
   130b0:	81 11       	cpse	r24, r1
   130b2:	6e c0       	rjmp	.+220    	; 0x13190 <process_commands() [clone .part.46]+0x11d8>
        {
            current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
   130b4:	80 e0       	ldi	r24, 0x00	; 0
   130b6:	90 e0       	ldi	r25, 0x00	; 0
   130b8:	a0 ea       	ldi	r26, 0xA0	; 160
   130ba:	b0 e4       	ldi	r27, 0x40	; 64
   130bc:	80 93 69 12 	sts	0x1269, r24	; 0x801269 <current_position+0x8>
   130c0:	90 93 6a 12 	sts	0x126A, r25	; 0x80126a <current_position+0x9>
   130c4:	a0 93 6b 12 	sts	0x126B, r26	; 0x80126b <current_position+0xa>
   130c8:	b0 93 6c 12 	sts	0x126C, r27	; 0x80126c <current_position+0xb>
            plan_buffer_line_curposXYZE(3000 / 60);
   130cc:	60 e0       	ldi	r22, 0x00	; 0
   130ce:	70 e0       	ldi	r23, 0x00	; 0
   130d0:	88 e4       	ldi	r24, 0x48	; 72
   130d2:	92 e4       	ldi	r25, 0x42	; 66
   130d4:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
            current_position[Z_AXIS] = 50;
   130d8:	80 e0       	ldi	r24, 0x00	; 0
   130da:	90 e0       	ldi	r25, 0x00	; 0
   130dc:	a8 e4       	ldi	r26, 0x48	; 72
   130de:	b2 e4       	ldi	r27, 0x42	; 66
   130e0:	80 93 69 12 	sts	0x1269, r24	; 0x801269 <current_position+0x8>
   130e4:	90 93 6a 12 	sts	0x126A, r25	; 0x80126a <current_position+0x9>
   130e8:	a0 93 6b 12 	sts	0x126B, r26	; 0x80126b <current_position+0xa>
   130ec:	b0 93 6c 12 	sts	0x126C, r27	; 0x80126c <current_position+0xb>
            current_position[Y_AXIS] = 180;
   130f0:	80 e0       	ldi	r24, 0x00	; 0
   130f2:	90 e0       	ldi	r25, 0x00	; 0
   130f4:	a4 e3       	ldi	r26, 0x34	; 52
   130f6:	b3 e4       	ldi	r27, 0x43	; 67
   130f8:	80 93 65 12 	sts	0x1265, r24	; 0x801265 <current_position+0x4>
   130fc:	90 93 66 12 	sts	0x1266, r25	; 0x801266 <current_position+0x5>
   13100:	a0 93 67 12 	sts	0x1267, r26	; 0x801267 <current_position+0x6>
   13104:	b0 93 68 12 	sts	0x1268, r27	; 0x801268 <current_position+0x7>
            plan_buffer_line_curposXYZE(3000 / 60);
   13108:	60 e0       	ldi	r22, 0x00	; 0
   1310a:	70 e0       	ldi	r23, 0x00	; 0
   1310c:	88 e4       	ldi	r24, 0x48	; 72
   1310e:	92 e4       	ldi	r25, 0x42	; 66
   13110:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
            st_synchronize();
   13114:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
            lcd_show_fullscreen_message_and_wait_P(_T(MSG_REMOVE_STEEL_SHEET));
   13118:	83 ef       	ldi	r24, 0xF3	; 243
   1311a:	9f e3       	ldi	r25, 0x3F	; 63
   1311c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   13120:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
            current_position[Y_AXIS] = pgm_read_float(bed_ref_points_4 + 1);
   13124:	e4 e0       	ldi	r30, 0x04	; 4
   13126:	fc e9       	ldi	r31, 0x9C	; 156
   13128:	85 91       	lpm	r24, Z+
   1312a:	95 91       	lpm	r25, Z+
   1312c:	a5 91       	lpm	r26, Z+
   1312e:	b4 91       	lpm	r27, Z
   13130:	80 93 65 12 	sts	0x1265, r24	; 0x801265 <current_position+0x4>
   13134:	90 93 66 12 	sts	0x1266, r25	; 0x801266 <current_position+0x5>
   13138:	a0 93 67 12 	sts	0x1267, r26	; 0x801267 <current_position+0x6>
   1313c:	b0 93 68 12 	sts	0x1268, r27	; 0x801268 <current_position+0x7>
            current_position[X_AXIS] = pgm_read_float(bed_ref_points_4);
   13140:	e0 e0       	ldi	r30, 0x00	; 0
   13142:	fc e9       	ldi	r31, 0x9C	; 156
   13144:	85 91       	lpm	r24, Z+
   13146:	95 91       	lpm	r25, Z+
   13148:	a5 91       	lpm	r26, Z+
   1314a:	b4 91       	lpm	r27, Z
   1314c:	80 93 61 12 	sts	0x1261, r24	; 0x801261 <current_position>
   13150:	90 93 62 12 	sts	0x1262, r25	; 0x801262 <current_position+0x1>
   13154:	a0 93 63 12 	sts	0x1263, r26	; 0x801263 <current_position+0x2>
   13158:	b0 93 64 12 	sts	0x1264, r27	; 0x801264 <current_position+0x3>
            plan_buffer_line_curposXYZE(3000 / 60);
   1315c:	60 e0       	ldi	r22, 0x00	; 0
   1315e:	70 e0       	ldi	r23, 0x00	; 0
   13160:	88 e4       	ldi	r24, 0x48	; 72
   13162:	92 e4       	ldi	r25, 0x42	; 66
   13164:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
            st_synchronize();
   13168:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
static void gcode_G28(bool home_x_axis, bool home_y_axis, bool home_z_axis)
{
#ifdef TMC2130
    gcode_G28(home_x_axis, 0, home_y_axis, 0, home_z_axis, 0, false, true);
#else
    gcode_G28(home_x_axis, 0, home_y_axis, 0, home_z_axis, 0, true);
   1316c:	81 e0       	ldi	r24, 0x01	; 1
   1316e:	8f 93       	push	r24
   13170:	81 2c       	mov	r8, r1
   13172:	91 2c       	mov	r9, r1
   13174:	54 01       	movw	r10, r8
   13176:	cc 24       	eor	r12, r12
   13178:	c3 94       	inc	r12
   1317a:	e1 2c       	mov	r14, r1
   1317c:	f1 2c       	mov	r15, r1
   1317e:	87 01       	movw	r16, r14
   13180:	20 e0       	ldi	r18, 0x00	; 0
   13182:	40 e0       	ldi	r20, 0x00	; 0
   13184:	50 e0       	ldi	r21, 0x00	; 0
   13186:	ba 01       	movw	r22, r20
   13188:	80 e0       	ldi	r24, 0x00	; 0
   1318a:	0e 94 2a 6d 	call	0xda54	; 0xda54 <gcode_G28(bool, long, bool, long, bool, long, bool)>
   1318e:	0f 90       	pop	r0
            plan_buffer_line_curposXYZE(3000 / 60);
            st_synchronize();
            gcode_G28(false, false, true);

        }
        if ((current_temperature_pinda > 35) && (farm_mode == false)) {
   13190:	20 e0       	ldi	r18, 0x00	; 0
   13192:	30 e0       	ldi	r19, 0x00	; 0
   13194:	4c e0       	ldi	r20, 0x0C	; 12
   13196:	52 e4       	ldi	r21, 0x42	; 66
   13198:	60 91 85 03 	lds	r22, 0x0385	; 0x800385 <current_temperature_pinda>
   1319c:	70 91 86 03 	lds	r23, 0x0386	; 0x800386 <current_temperature_pinda+0x1>
   131a0:	80 91 87 03 	lds	r24, 0x0387	; 0x800387 <current_temperature_pinda+0x2>
   131a4:	90 91 88 03 	lds	r25, 0x0388	; 0x800388 <current_temperature_pinda+0x3>
   131a8:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   131ac:	18 16       	cp	r1, r24
   131ae:	0c f0       	brlt	.+2      	; 0x131b2 <process_commands() [clone .part.46]+0x11fa>
   131b0:	76 c0       	rjmp	.+236    	; 0x1329e <process_commands() [clone .part.46]+0x12e6>
   131b2:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   131b6:	81 11       	cpse	r24, r1
   131b8:	72 c0       	rjmp	.+228    	; 0x1329e <process_commands() [clone .part.46]+0x12e6>
            //waiting for PIDNA probe to cool down in case that we are not in farm mode
            current_position[Z_AXIS] = 100;
   131ba:	80 e0       	ldi	r24, 0x00	; 0
   131bc:	90 e0       	ldi	r25, 0x00	; 0
   131be:	a8 ec       	ldi	r26, 0xC8	; 200
   131c0:	b2 e4       	ldi	r27, 0x42	; 66
   131c2:	80 93 69 12 	sts	0x1269, r24	; 0x801269 <current_position+0x8>
   131c6:	90 93 6a 12 	sts	0x126A, r25	; 0x80126a <current_position+0x9>
   131ca:	a0 93 6b 12 	sts	0x126B, r26	; 0x80126b <current_position+0xa>
   131ce:	b0 93 6c 12 	sts	0x126C, r27	; 0x80126c <current_position+0xb>
            plan_buffer_line_curposXYZE(3000 / 60);
   131d2:	60 e0       	ldi	r22, 0x00	; 0
   131d4:	70 e0       	ldi	r23, 0x00	; 0
   131d6:	88 e4       	ldi	r24, 0x48	; 72
   131d8:	92 e4       	ldi	r25, 0x42	; 66
   131da:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>

}

#ifdef PINDA_THERMISTOR
bool lcd_wait_for_pinda(float temp) {
	disable_heater();
   131de:	0f 94 05 11 	call	0x2220a	; 0x2220a <disable_heater()>
	LongTimer pinda_timeout;
   131e2:	19 82       	std	Y+1, r1	; 0x01
   131e4:	1a 82       	std	Y+2, r1	; 0x02
   131e6:	1b 82       	std	Y+3, r1	; 0x03
   131e8:	1c 82       	std	Y+4, r1	; 0x04
   131ea:	1d 82       	std	Y+5, r1	; 0x05
	pinda_timeout.start();
   131ec:	ce 01       	movw	r24, r28
   131ee:	01 96       	adiw	r24, 0x01	; 1
   131f0:	0f 94 47 10 	call	0x2208e	; 0x2208e <Timer<unsigned long>::start()>

	while (current_temperature_pinda > temp){
		lcd_display_message_fullscreen_P(_T(MSG_WAITING_TEMP_PINDA));

		lcd_putc_at(0, 4, LCD_STR_THERMOMETER[0]);
		lcd_printf_P(PSTR("%3d/%3d"), (int16_t)current_temperature_pinda, (int16_t) temp);
   131f4:	e3 e2       	ldi	r30, 0x23	; 35
   131f6:	fe 2e       	mov	r15, r30
   131f8:	06 e5       	ldi	r16, 0x56	; 86
   131fa:	1e e7       	ldi	r17, 0x7E	; 126
	disable_heater();
	LongTimer pinda_timeout;
	pinda_timeout.start();
	bool target_temp_reached = true;

	while (current_temperature_pinda > temp){
   131fc:	20 e0       	ldi	r18, 0x00	; 0
   131fe:	30 e0       	ldi	r19, 0x00	; 0
   13200:	4c e0       	ldi	r20, 0x0C	; 12
   13202:	52 e4       	ldi	r21, 0x42	; 66
   13204:	60 91 85 03 	lds	r22, 0x0385	; 0x800385 <current_temperature_pinda>
   13208:	70 91 86 03 	lds	r23, 0x0386	; 0x800386 <current_temperature_pinda+0x1>
   1320c:	80 91 87 03 	lds	r24, 0x0387	; 0x800387 <current_temperature_pinda+0x2>
   13210:	90 91 88 03 	lds	r25, 0x0388	; 0x800388 <current_temperature_pinda+0x3>
   13214:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   13218:	18 16       	cp	r1, r24
   1321a:	c4 f5       	brge	.+112    	; 0x1328c <process_commands() [clone .part.46]+0x12d4>
		lcd_display_message_fullscreen_P(_T(MSG_WAITING_TEMP_PINDA));
   1321c:	83 e4       	ldi	r24, 0x43	; 67
   1321e:	99 e3       	ldi	r25, 0x39	; 57
   13220:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   13224:	0e 94 a9 e0 	call	0x1c152	; 0x1c152 <lcd_display_message_fullscreen_P(char const*)>

		lcd_putc_at(0, 4, LCD_STR_THERMOMETER[0]);
   13228:	42 e8       	ldi	r20, 0x82	; 130
   1322a:	64 e0       	ldi	r22, 0x04	; 4
   1322c:	80 e0       	ldi	r24, 0x00	; 0
   1322e:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
		lcd_printf_P(PSTR("%3d/%3d"), (int16_t)current_temperature_pinda, (int16_t) temp);
   13232:	1f 92       	push	r1
   13234:	ff 92       	push	r15
   13236:	60 91 85 03 	lds	r22, 0x0385	; 0x800385 <current_temperature_pinda>
   1323a:	70 91 86 03 	lds	r23, 0x0386	; 0x800386 <current_temperature_pinda+0x1>
   1323e:	80 91 87 03 	lds	r24, 0x0387	; 0x800387 <current_temperature_pinda+0x2>
   13242:	90 91 88 03 	lds	r25, 0x0388	; 0x800388 <current_temperature_pinda+0x3>
   13246:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   1324a:	7f 93       	push	r23
   1324c:	6f 93       	push	r22
   1324e:	1f 93       	push	r17
   13250:	0f 93       	push	r16
   13252:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
		lcd_putc(LCD_STR_DEGREE[0]);
   13256:	81 e8       	ldi	r24, 0x81	; 129
   13258:	0e 94 21 6f 	call	0xde42	; 0xde42 <lcd_putc(char)>
		delay_keep_alive(1000);
   1325c:	88 ee       	ldi	r24, 0xE8	; 232
   1325e:	93 e0       	ldi	r25, 0x03	; 3
   13260:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
		serialecho_temperatures();
   13264:	0e 94 d2 7a 	call	0xf5a4	; 0xf5a4 <serialecho_temperatures()>
		if (pinda_timeout.expired(8 * 60 * 1000ul)) { //PINDA cooling from 60 C to 35 C takes about 7 minutes
   13268:	40 e0       	ldi	r20, 0x00	; 0
   1326a:	53 e5       	ldi	r21, 0x53	; 83
   1326c:	67 e0       	ldi	r22, 0x07	; 7
   1326e:	70 e0       	ldi	r23, 0x00	; 0
   13270:	ce 01       	movw	r24, r28
   13272:	01 96       	adiw	r24, 0x01	; 1
   13274:	0f 94 88 0e 	call	0x21d10	; 0x21d10 <Timer<unsigned long>::expired(unsigned long)>
   13278:	0f 90       	pop	r0
   1327a:	0f 90       	pop	r0
   1327c:	0f 90       	pop	r0
   1327e:	0f 90       	pop	r0
   13280:	0f 90       	pop	r0
   13282:	0f 90       	pop	r0
   13284:	88 23       	and	r24, r24
   13286:	09 f4       	brne	.+2      	; 0x1328a <process_commands() [clone .part.46]+0x12d2>
   13288:	b9 cf       	rjmp	.-142    	; 0x131fc <process_commands() [clone .part.46]+0x1244>
			target_temp_reached = false;
   1328a:	d1 2c       	mov	r13, r1
			break;
		}
	}
	lcd_update_enable(true);
   1328c:	81 e0       	ldi	r24, 0x01	; 1
   1328e:	0e 94 38 70 	call	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>
            if (lcd_wait_for_pinda(35) == false) { //waiting for PINDA probe to cool, if this takes more then time expected, temp. cal. fails
   13292:	d1 10       	cpse	r13, r1
   13294:	04 c0       	rjmp	.+8      	; 0x1329e <process_commands() [clone .part.46]+0x12e6>
                lcd_temp_cal_show_result(false);
   13296:	80 e0       	ldi	r24, 0x00	; 0
   13298:	0e 94 de fb 	call	0x1f7bc	; 0x1f7bc <lcd_temp_cal_show_result(bool)>
   1329c:	14 ca       	rjmp	.-3032   	; 0x126c6 <process_commands() [clone .part.46]+0x70e>
                break;
            }
        }

        st_synchronize();
   1329e:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
        homing_flag = true; // keep homing on to avoid babystepping while the LCD is enabled
   132a2:	81 e0       	ldi	r24, 0x01	; 1
   132a4:	80 93 71 12 	sts	0x1271, r24	; 0x801271 <homing_flag>

        lcd_update_enable(true);
   132a8:	0e 94 38 70 	call	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>
        SERIAL_ECHOLNPGM("PINDA probe calibration start");
   132ac:	89 ea       	ldi	r24, 0xA9	; 169
   132ae:	90 e8       	ldi	r25, 0x80	; 128
   132b0:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>

        float zero_z;
        int z_shift = 0; //unit: steps
        float start_temp = 5 * (int)(current_temperature_pinda / 5);
   132b4:	80 90 85 03 	lds	r8, 0x0385	; 0x800385 <current_temperature_pinda>
   132b8:	90 90 86 03 	lds	r9, 0x0386	; 0x800386 <current_temperature_pinda+0x1>
   132bc:	a0 90 87 03 	lds	r10, 0x0387	; 0x800387 <current_temperature_pinda+0x2>
   132c0:	b0 90 88 03 	lds	r11, 0x0388	; 0x800388 <current_temperature_pinda+0x3>
   132c4:	20 e0       	ldi	r18, 0x00	; 0
   132c6:	30 e0       	ldi	r19, 0x00	; 0
   132c8:	40 ea       	ldi	r20, 0xA0	; 160
   132ca:	50 e4       	ldi	r21, 0x40	; 64
   132cc:	c5 01       	movw	r24, r10
   132ce:	b4 01       	movw	r22, r8
   132d0:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   132d4:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   132d8:	25 e0       	ldi	r18, 0x05	; 5
   132da:	26 9f       	mul	r18, r22
   132dc:	a0 01       	movw	r20, r0
   132de:	27 9f       	mul	r18, r23
   132e0:	50 0d       	add	r21, r0
   132e2:	11 24       	eor	r1, r1
   132e4:	ba 01       	movw	r22, r20
   132e6:	55 0f       	add	r21, r21
   132e8:	88 0b       	sbc	r24, r24
   132ea:	99 0b       	sbc	r25, r25
   132ec:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   132f0:	1b 01       	movw	r2, r22
   132f2:	7c 01       	movw	r14, r24
        if (start_temp < 35) start_temp = 35;
   132f4:	20 e0       	ldi	r18, 0x00	; 0
   132f6:	30 e0       	ldi	r19, 0x00	; 0
   132f8:	4c e0       	ldi	r20, 0x0C	; 12
   132fa:	52 e4       	ldi	r21, 0x42	; 66
   132fc:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   13300:	87 ff       	sbrs	r24, 7
   13302:	06 c0       	rjmp	.+12     	; 0x13310 <process_commands() [clone .part.46]+0x1358>
   13304:	21 2c       	mov	r2, r1
   13306:	31 2c       	mov	r3, r1
   13308:	6c e0       	ldi	r22, 0x0C	; 12
   1330a:	e6 2e       	mov	r14, r22
   1330c:	72 e4       	ldi	r23, 0x42	; 66
   1330e:	f7 2e       	mov	r15, r23
        if (start_temp < current_temperature_pinda) start_temp += 5;
   13310:	22 2d       	mov	r18, r2
   13312:	33 2d       	mov	r19, r3
   13314:	4e 2d       	mov	r20, r14
   13316:	5f 2d       	mov	r21, r15
   13318:	c5 01       	movw	r24, r10
   1331a:	b4 01       	movw	r22, r8
   1331c:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   13320:	18 16       	cp	r1, r24
   13322:	64 f4       	brge	.+24     	; 0x1333c <process_commands() [clone .part.46]+0x1384>
   13324:	20 e0       	ldi	r18, 0x00	; 0
   13326:	30 e0       	ldi	r19, 0x00	; 0
   13328:	40 ea       	ldi	r20, 0xA0	; 160
   1332a:	50 e4       	ldi	r21, 0x40	; 64
   1332c:	62 2d       	mov	r22, r2
   1332e:	73 2d       	mov	r23, r3
   13330:	8e 2d       	mov	r24, r14
   13332:	9f 2d       	mov	r25, r15
   13334:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   13338:	1b 01       	movw	r2, r22
   1333a:	7c 01       	movw	r14, r24
        printf_P(_N("start temperature: %.1f\n"), start_temp);
   1333c:	ff 92       	push	r15
   1333e:	ef 92       	push	r14
   13340:	3f 92       	push	r3
   13342:	2f 92       	push	r2
   13344:	8f ee       	ldi	r24, 0xEF	; 239
   13346:	96 e6       	ldi	r25, 0x66	; 102
   13348:	9f 93       	push	r25
   1334a:	8f 93       	push	r24
   1334c:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>

        setTargetBed(70 + (start_temp - 30));
   13350:	20 e0       	ldi	r18, 0x00	; 0
   13352:	30 e0       	ldi	r19, 0x00	; 0
   13354:	40 ef       	ldi	r20, 0xF0	; 240
   13356:	51 e4       	ldi	r21, 0x41	; 65
   13358:	62 2d       	mov	r22, r2
   1335a:	73 2d       	mov	r23, r3
   1335c:	8e 2d       	mov	r24, r14
   1335e:	9f 2d       	mov	r25, r15
   13360:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   13364:	20 e0       	ldi	r18, 0x00	; 0
   13366:	30 e0       	ldi	r19, 0x00	; 0
   13368:	4c e8       	ldi	r20, 0x8C	; 140
   1336a:	52 e4       	ldi	r21, 0x42	; 66
   1336c:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
  target_temperature[0] = celsius;
  resetPID(0);
};

FORCE_INLINE void setTargetBed(const float &celsius) {
  target_temperature_bed = celsius;
   13370:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   13374:	70 93 5a 12 	sts	0x125A, r23	; 0x80125a <target_temperature_bed+0x1>
   13378:	60 93 59 12 	sts	0x1259, r22	; 0x801259 <target_temperature_bed>

        custom_message_type = CustomMsg::TempCal;
   1337c:	84 e0       	ldi	r24, 0x04	; 4
   1337e:	80 93 5d 06 	sts	0x065D, r24	; 0x80065d <custom_message_type>
        custom_message_state = 1;
   13382:	81 e0       	ldi	r24, 0x01	; 1
   13384:	80 93 de 03 	sts	0x03DE, r24	; 0x8003de <custom_message_state>
        lcd_setstatuspgm(_T(MSG_PINDA_CALIBRATION));
   13388:	8c ec       	ldi	r24, 0xCC	; 204
   1338a:	95 e4       	ldi	r25, 0x45	; 69
   1338c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   13390:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
        current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
   13394:	80 e0       	ldi	r24, 0x00	; 0
   13396:	90 e0       	ldi	r25, 0x00	; 0
   13398:	a0 ea       	ldi	r26, 0xA0	; 160
   1339a:	b0 e4       	ldi	r27, 0x40	; 64
   1339c:	80 93 69 12 	sts	0x1269, r24	; 0x801269 <current_position+0x8>
   133a0:	90 93 6a 12 	sts	0x126A, r25	; 0x80126a <current_position+0x9>
   133a4:	a0 93 6b 12 	sts	0x126B, r26	; 0x80126b <current_position+0xa>
   133a8:	b0 93 6c 12 	sts	0x126C, r27	; 0x80126c <current_position+0xb>
        plan_buffer_line_curposXYZE(3000 / 60);
   133ac:	60 e0       	ldi	r22, 0x00	; 0
   133ae:	70 e0       	ldi	r23, 0x00	; 0
   133b0:	88 e4       	ldi	r24, 0x48	; 72
   133b2:	92 e4       	ldi	r25, 0x42	; 66
   133b4:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
        current_position[X_AXIS] = PINDA_PREHEAT_X;
   133b8:	80 e0       	ldi	r24, 0x00	; 0
   133ba:	90 e0       	ldi	r25, 0x00	; 0
   133bc:	a0 ea       	ldi	r26, 0xA0	; 160
   133be:	b1 e4       	ldi	r27, 0x41	; 65
   133c0:	80 93 61 12 	sts	0x1261, r24	; 0x801261 <current_position>
   133c4:	90 93 62 12 	sts	0x1262, r25	; 0x801262 <current_position+0x1>
   133c8:	a0 93 63 12 	sts	0x1263, r26	; 0x801263 <current_position+0x2>
   133cc:	b0 93 64 12 	sts	0x1264, r27	; 0x801264 <current_position+0x3>
        current_position[Y_AXIS] = PINDA_PREHEAT_Y;
   133d0:	80 e0       	ldi	r24, 0x00	; 0
   133d2:	90 e0       	ldi	r25, 0x00	; 0
   133d4:	a0 e7       	ldi	r26, 0x70	; 112
   133d6:	b2 e4       	ldi	r27, 0x42	; 66
   133d8:	80 93 65 12 	sts	0x1265, r24	; 0x801265 <current_position+0x4>
   133dc:	90 93 66 12 	sts	0x1266, r25	; 0x801266 <current_position+0x5>
   133e0:	a0 93 67 12 	sts	0x1267, r26	; 0x801267 <current_position+0x6>
   133e4:	b0 93 68 12 	sts	0x1268, r27	; 0x801268 <current_position+0x7>
        plan_buffer_line_curposXYZE(3000 / 60);
   133e8:	60 e0       	ldi	r22, 0x00	; 0
   133ea:	70 e0       	ldi	r23, 0x00	; 0
   133ec:	88 e4       	ldi	r24, 0x48	; 72
   133ee:	92 e4       	ldi	r25, 0x42	; 66
   133f0:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
        current_position[Z_AXIS] = PINDA_PREHEAT_Z;
   133f4:	8a e9       	ldi	r24, 0x9A	; 154
   133f6:	99 e9       	ldi	r25, 0x99	; 153
   133f8:	a9 e1       	ldi	r26, 0x19	; 25
   133fa:	be e3       	ldi	r27, 0x3E	; 62
   133fc:	80 93 69 12 	sts	0x1269, r24	; 0x801269 <current_position+0x8>
   13400:	90 93 6a 12 	sts	0x126A, r25	; 0x80126a <current_position+0x9>
   13404:	a0 93 6b 12 	sts	0x126B, r26	; 0x80126b <current_position+0xa>
   13408:	b0 93 6c 12 	sts	0x126C, r27	; 0x80126c <current_position+0xb>
        plan_buffer_line_curposXYZE(3000 / 60);
   1340c:	60 e0       	ldi	r22, 0x00	; 0
   1340e:	70 e0       	ldi	r23, 0x00	; 0
   13410:	88 e4       	ldi	r24, 0x48	; 72
   13412:	92 e4       	ldi	r25, 0x42	; 66
   13414:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
        st_synchronize();
   13418:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
   1341c:	0f 90       	pop	r0
   1341e:	0f 90       	pop	r0
   13420:	0f 90       	pop	r0
   13422:	0f 90       	pop	r0
   13424:	0f 90       	pop	r0
   13426:	0f 90       	pop	r0

        while (current_temperature_pinda < start_temp)
   13428:	20 91 85 03 	lds	r18, 0x0385	; 0x800385 <current_temperature_pinda>
   1342c:	30 91 86 03 	lds	r19, 0x0386	; 0x800386 <current_temperature_pinda+0x1>
   13430:	40 91 87 03 	lds	r20, 0x0387	; 0x800387 <current_temperature_pinda+0x2>
   13434:	50 91 88 03 	lds	r21, 0x0388	; 0x800388 <current_temperature_pinda+0x3>
   13438:	62 2d       	mov	r22, r2
   1343a:	73 2d       	mov	r23, r3
   1343c:	8e 2d       	mov	r24, r14
   1343e:	9f 2d       	mov	r25, r15
   13440:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   13444:	18 16       	cp	r1, r24
   13446:	3c f4       	brge	.+14     	; 0x13456 <process_commands() [clone .part.46]+0x149e>
        {
            delay_keep_alive(1000);
   13448:	88 ee       	ldi	r24, 0xE8	; 232
   1344a:	93 e0       	ldi	r25, 0x03	; 3
   1344c:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
            serialecho_temperatures();
   13450:	0e 94 d2 7a 	call	0xf5a4	; 0xf5a4 <serialecho_temperatures()>
   13454:	e9 cf       	rjmp	.-46     	; 0x13428 <process_commands() [clone .part.46]+0x1470>
   13456:	60 e0       	ldi	r22, 0x00	; 0
   13458:	86 ea       	ldi	r24, 0xA6	; 166
   1345a:	9f e0       	ldi	r25, 0x0F	; 15
   1345c:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
        }

        eeprom_update_byte_notify((uint8_t*)EEPROM_CALIBRATION_STATUS_PINDA, 0); //invalidate temp. calibration in case that in will be aborted during the calibration process

        current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
   13460:	80 e0       	ldi	r24, 0x00	; 0
   13462:	90 e0       	ldi	r25, 0x00	; 0
   13464:	a0 ea       	ldi	r26, 0xA0	; 160
   13466:	b0 e4       	ldi	r27, 0x40	; 64
   13468:	80 93 69 12 	sts	0x1269, r24	; 0x801269 <current_position+0x8>
   1346c:	90 93 6a 12 	sts	0x126A, r25	; 0x80126a <current_position+0x9>
   13470:	a0 93 6b 12 	sts	0x126B, r26	; 0x80126b <current_position+0xa>
   13474:	b0 93 6c 12 	sts	0x126C, r27	; 0x80126c <current_position+0xb>
        plan_buffer_line_curposXYZE(3000 / 60);
   13478:	60 e0       	ldi	r22, 0x00	; 0
   1347a:	70 e0       	ldi	r23, 0x00	; 0
   1347c:	88 e4       	ldi	r24, 0x48	; 72
   1347e:	92 e4       	ldi	r25, 0x42	; 66
   13480:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
        current_position[X_AXIS] = pgm_read_float(bed_ref_points_4);
   13484:	e0 e0       	ldi	r30, 0x00	; 0
   13486:	fc e9       	ldi	r31, 0x9C	; 156
   13488:	85 91       	lpm	r24, Z+
   1348a:	95 91       	lpm	r25, Z+
   1348c:	a5 91       	lpm	r26, Z+
   1348e:	b4 91       	lpm	r27, Z
   13490:	80 93 61 12 	sts	0x1261, r24	; 0x801261 <current_position>
   13494:	90 93 62 12 	sts	0x1262, r25	; 0x801262 <current_position+0x1>
   13498:	a0 93 63 12 	sts	0x1263, r26	; 0x801263 <current_position+0x2>
   1349c:	b0 93 64 12 	sts	0x1264, r27	; 0x801264 <current_position+0x3>
        current_position[Y_AXIS] = pgm_read_float(bed_ref_points_4 + 1);
   134a0:	e4 e0       	ldi	r30, 0x04	; 4
   134a2:	fc e9       	ldi	r31, 0x9C	; 156
   134a4:	85 91       	lpm	r24, Z+
   134a6:	95 91       	lpm	r25, Z+
   134a8:	a5 91       	lpm	r26, Z+
   134aa:	b4 91       	lpm	r27, Z
   134ac:	80 93 65 12 	sts	0x1265, r24	; 0x801265 <current_position+0x4>
   134b0:	90 93 66 12 	sts	0x1266, r25	; 0x801266 <current_position+0x5>
   134b4:	a0 93 67 12 	sts	0x1267, r26	; 0x801267 <current_position+0x6>
   134b8:	b0 93 68 12 	sts	0x1268, r27	; 0x801268 <current_position+0x7>
        plan_buffer_line_curposXYZE(3000 / 60);
   134bc:	60 e0       	ldi	r22, 0x00	; 0
   134be:	70 e0       	ldi	r23, 0x00	; 0
   134c0:	88 e4       	ldi	r24, 0x48	; 72
   134c2:	92 e4       	ldi	r25, 0x42	; 66
   134c4:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
        st_synchronize();
   134c8:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>

        bool find_z_result = find_bed_induction_sensor_point_z(-1.f);
   134cc:	43 e0       	ldi	r20, 0x03	; 3
   134ce:	60 e0       	ldi	r22, 0x00	; 0
   134d0:	70 e0       	ldi	r23, 0x00	; 0
   134d2:	80 e8       	ldi	r24, 0x80	; 128
   134d4:	9f eb       	ldi	r25, 0xBF	; 191
   134d6:	0f 94 ed 7b 	call	0x2f7da	; 0x2f7da <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.86]>
        if (find_z_result == false) {
   134da:	81 11       	cpse	r24, r1
   134dc:	05 c0       	rjmp	.+10     	; 0x134e8 <process_commands() [clone .part.46]+0x1530>

            printf_P(_N("\nPINDA temperature: %.1f Z shift (mm): %.3f"), current_temperature_pinda, current_position[Z_AXIS] - zero_z);

            eeprom_update_word_notify((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + i, z_shift);
        }
        lcd_temp_cal_show_result(true);
   134de:	0e 94 de fb 	call	0x1f7bc	; 0x1f7bc <lcd_temp_cal_show_result(bool)>
        homing_flag = false;
   134e2:	10 92 71 12 	sts	0x1271, r1	; 0x801271 <homing_flag>
   134e6:	ef c8       	rjmp	.-3618   	; 0x126c6 <process_commands() [clone .part.46]+0x70e>
        if (find_z_result == false) {
            lcd_temp_cal_show_result(find_z_result);
            homing_flag = false;
            break;
        }
        zero_z = current_position[Z_AXIS];
   134e8:	90 91 69 12 	lds	r25, 0x1269	; 0x801269 <current_position+0x8>
   134ec:	98 a7       	std	Y+40, r25	; 0x28
   134ee:	a0 91 6a 12 	lds	r26, 0x126A	; 0x80126a <current_position+0x9>
   134f2:	ac a7       	std	Y+44, r26	; 0x2c
   134f4:	b0 91 6b 12 	lds	r27, 0x126B	; 0x80126b <current_position+0xa>
   134f8:	b8 ab       	std	Y+48, r27	; 0x30
   134fa:	e0 91 6c 12 	lds	r30, 0x126C	; 0x80126c <current_position+0xb>
   134fe:	e8 af       	std	Y+56, r30	; 0x38

        printf_P(_N("\nZERO: %.3f\n"), current_position[Z_AXIS]);
   13500:	ef 93       	push	r30
   13502:	bf 93       	push	r27
   13504:	af 93       	push	r26
   13506:	9f 93       	push	r25
   13508:	82 ee       	ldi	r24, 0xE2	; 226
   1350a:	96 e6       	ldi	r25, 0x66	; 102
   1350c:	9f 93       	push	r25
   1350e:	8f 93       	push	r24
   13510:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   13514:	0f 90       	pop	r0
   13516:	0f 90       	pop	r0
   13518:	0f 90       	pop	r0
   1351a:	0f 90       	pop	r0
   1351c:	0f 90       	pop	r0
   1351e:	0f 90       	pop	r0
   13520:	4e ea       	ldi	r20, 0xAE	; 174
   13522:	84 2e       	mov	r8, r20
   13524:	4f e0       	ldi	r20, 0x0F	; 15
   13526:	94 2e       	mov	r9, r20
   13528:	53 e2       	ldi	r21, 0x23	; 35
   1352a:	c5 2e       	mov	r12, r21
   1352c:	d1 2c       	mov	r13, r1

        int i = -1; for (; i < 5; i++)
   1352e:	0f ef       	ldi	r16, 0xFF	; 255
   13530:	1f ef       	ldi	r17, 0xFF	; 255
        {
            float temp = (40 + i * 5);
   13532:	b6 01       	movw	r22, r12
   13534:	0d 2c       	mov	r0, r13
   13536:	00 0c       	add	r0, r0
   13538:	88 0b       	sbc	r24, r24
   1353a:	99 0b       	sbc	r25, r25
   1353c:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   13540:	2b 01       	movw	r4, r22
   13542:	3c 01       	movw	r6, r24
            printf_P(_N("\nStep: %d/6 (skipped)\nPINDA temperature: %d Z shift (mm):0\n"), i + 2, (40 + i*5));
   13544:	df 92       	push	r13
   13546:	cf 92       	push	r12
   13548:	c8 01       	movw	r24, r16
   1354a:	02 96       	adiw	r24, 0x02	; 2
   1354c:	9f 93       	push	r25
   1354e:	8f 93       	push	r24
   13550:	26 ea       	ldi	r18, 0xA6	; 166
   13552:	36 e6       	ldi	r19, 0x66	; 102
   13554:	3f 93       	push	r19
   13556:	2f 93       	push	r18
   13558:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   1355c:	58 01       	movw	r10, r16
   1355e:	5f ef       	ldi	r21, 0xFF	; 255
   13560:	a5 1a       	sub	r10, r21
   13562:	b5 0a       	sbc	r11, r21
            if (i >= 0) {
   13564:	0f 90       	pop	r0
   13566:	0f 90       	pop	r0
   13568:	0f 90       	pop	r0
   1356a:	0f 90       	pop	r0
   1356c:	0f 90       	pop	r0
   1356e:	0f 90       	pop	r0
   13570:	11 f4       	brne	.+4      	; 0x13576 <process_commands() [clone .part.46]+0x15be>
   13572:	0c 94 1b bc 	jmp	0x17836	; 0x17836 <process_commands() [clone .part.46]+0x587e>
        if (previous_value != value) {
            eeprom_word_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_word(dst, value);
   13576:	70 e0       	ldi	r23, 0x00	; 0
   13578:	60 e0       	ldi	r22, 0x00	; 0
   1357a:	c4 01       	movw	r24, r8
   1357c:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>
                eeprom_update_word_notify((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + i, z_shift);
            }
            if (start_temp <= temp) break;
   13580:	a3 01       	movw	r20, r6
   13582:	92 01       	movw	r18, r4
   13584:	62 2d       	mov	r22, r2
   13586:	73 2d       	mov	r23, r3
   13588:	8e 2d       	mov	r24, r14
   1358a:	9f 2d       	mov	r25, r15
   1358c:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   13590:	18 16       	cp	r1, r24
   13592:	44 f4       	brge	.+16     	; 0x135a4 <process_commands() [clone .part.46]+0x15ec>
        }
        zero_z = current_position[Z_AXIS];

        printf_P(_N("\nZERO: %.3f\n"), current_position[Z_AXIS]);

        int i = -1; for (; i < 5; i++)
   13594:	85 e0       	ldi	r24, 0x05	; 5
   13596:	a8 16       	cp	r10, r24
   13598:	b1 04       	cpc	r11, r1
   1359a:	11 f0       	breq	.+4      	; 0x135a0 <process_commands() [clone .part.46]+0x15e8>
   1359c:	0c 94 27 bc 	jmp	0x1784e	; 0x1784e <process_commands() [clone .part.46]+0x5896>
   135a0:	05 e0       	ldi	r16, 0x05	; 5
   135a2:	10 e0       	ldi	r17, 0x00	; 0
   135a4:	58 01       	movw	r10, r16
   135a6:	97 e2       	ldi	r25, 0x27	; 39
   135a8:	a9 1a       	sub	r10, r25
   135aa:	98 ef       	ldi	r25, 0xF8	; 248
   135ac:	b9 0a       	sbc	r11, r25
   135ae:	aa 0c       	add	r10, r10
   135b0:	bb 1c       	adc	r11, r11
   135b2:	85 e0       	ldi	r24, 0x05	; 5
   135b4:	80 9f       	mul	r24, r16
   135b6:	10 01       	movw	r2, r0
   135b8:	81 9f       	mul	r24, r17
   135ba:	30 0c       	add	r3, r0
   135bc:	11 24       	eor	r1, r1
   135be:	0d 5f       	subi	r16, 0xFD	; 253
   135c0:	1f 4f       	sbci	r17, 0xFF	; 255
            current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
            plan_buffer_line_curposXYZE(3000 / 60);
            current_position[X_AXIS] = PINDA_PREHEAT_X;
            current_position[Y_AXIS] = PINDA_PREHEAT_Y;
            plan_buffer_line_curposXYZE(3000 / 60);
            current_position[Z_AXIS] = PINDA_PREHEAT_Z;
   135c2:	2a e9       	ldi	r18, 0x9A	; 154
   135c4:	42 2e       	mov	r4, r18
   135c6:	29 e9       	ldi	r18, 0x99	; 153
   135c8:	52 2e       	mov	r5, r18
   135ca:	29 e1       	ldi	r18, 0x19	; 25
   135cc:	62 2e       	mov	r6, r18
   135ce:	2e e3       	ldi	r18, 0x3E	; 62
   135d0:	72 2e       	mov	r7, r18
                lcd_temp_cal_show_result(find_z_result);
                break;
            }
            z_shift = (int)((current_position[Z_AXIS] - zero_z)*cs.axis_steps_per_mm[Z_AXIS]);

            printf_P(_N("\nPINDA temperature: %.1f Z shift (mm): %.3f"), current_temperature_pinda, current_position[Z_AXIS] - zero_z);
   135d2:	3d e6       	ldi	r19, 0x6D	; 109
   135d4:	83 2e       	mov	r8, r19
   135d6:	36 e6       	ldi	r19, 0x66	; 102
   135d8:	93 2e       	mov	r9, r19
                eeprom_update_word_notify((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + i, z_shift);
            }
            if (start_temp <= temp) break;
        }

        for (i++; i < 5; i++)
   135da:	c8 01       	movw	r24, r16
   135dc:	02 97       	sbiw	r24, 0x02	; 2
   135de:	05 97       	sbiw	r24, 0x05	; 5
   135e0:	0c f0       	brlt	.+2      	; 0x135e4 <process_commands() [clone .part.46]+0x162c>
   135e2:	d4 c0       	rjmp	.+424    	; 0x1378c <process_commands() [clone .part.46]+0x17d4>
        {
            float temp = (40 + i * 5);
   135e4:	b1 01       	movw	r22, r2
   135e6:	63 5d       	subi	r22, 0xD3	; 211
   135e8:	7f 4f       	sbci	r23, 0xFF	; 255
   135ea:	07 2e       	mov	r0, r23
   135ec:	00 0c       	add	r0, r0
   135ee:	88 0b       	sbc	r24, r24
   135f0:	99 0b       	sbc	r25, r25
   135f2:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   135f6:	6b 01       	movw	r12, r22
   135f8:	7c 01       	movw	r14, r24
            printf_P(_N("\nStep: %d/6\n"), i + 2);
   135fa:	1f 93       	push	r17
   135fc:	0f 93       	push	r16
   135fe:	a9 e9       	ldi	r26, 0x99	; 153
   13600:	b6 e6       	ldi	r27, 0x66	; 102
   13602:	bf 93       	push	r27
   13604:	af 93       	push	r26
   13606:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
            custom_message_state = i + 2;
   1360a:	00 93 de 03 	sts	0x03DE, r16	; 0x8003de <custom_message_state>
            setTargetBed(50 + 10 * (temp - 30) / 5);
   1360e:	20 e0       	ldi	r18, 0x00	; 0
   13610:	30 e0       	ldi	r19, 0x00	; 0
   13612:	40 ef       	ldi	r20, 0xF0	; 240
   13614:	51 e4       	ldi	r21, 0x41	; 65
   13616:	c7 01       	movw	r24, r14
   13618:	b6 01       	movw	r22, r12
   1361a:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   1361e:	20 e0       	ldi	r18, 0x00	; 0
   13620:	30 e0       	ldi	r19, 0x00	; 0
   13622:	40 e2       	ldi	r20, 0x20	; 32
   13624:	51 e4       	ldi	r21, 0x41	; 65
   13626:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   1362a:	20 e0       	ldi	r18, 0x00	; 0
   1362c:	30 e0       	ldi	r19, 0x00	; 0
   1362e:	40 ea       	ldi	r20, 0xA0	; 160
   13630:	50 e4       	ldi	r21, 0x40	; 64
   13632:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   13636:	20 e0       	ldi	r18, 0x00	; 0
   13638:	30 e0       	ldi	r19, 0x00	; 0
   1363a:	48 e4       	ldi	r20, 0x48	; 72
   1363c:	52 e4       	ldi	r21, 0x42	; 66
   1363e:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   13642:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   13646:	70 93 5a 12 	sts	0x125A, r23	; 0x80125a <target_temperature_bed+0x1>
   1364a:	60 93 59 12 	sts	0x1259, r22	; 0x801259 <target_temperature_bed>
            current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
   1364e:	80 e0       	ldi	r24, 0x00	; 0
   13650:	90 e0       	ldi	r25, 0x00	; 0
   13652:	a0 ea       	ldi	r26, 0xA0	; 160
   13654:	b0 e4       	ldi	r27, 0x40	; 64
   13656:	80 93 69 12 	sts	0x1269, r24	; 0x801269 <current_position+0x8>
   1365a:	90 93 6a 12 	sts	0x126A, r25	; 0x80126a <current_position+0x9>
   1365e:	a0 93 6b 12 	sts	0x126B, r26	; 0x80126b <current_position+0xa>
   13662:	b0 93 6c 12 	sts	0x126C, r27	; 0x80126c <current_position+0xb>
            plan_buffer_line_curposXYZE(3000 / 60);
   13666:	60 e0       	ldi	r22, 0x00	; 0
   13668:	70 e0       	ldi	r23, 0x00	; 0
   1366a:	88 e4       	ldi	r24, 0x48	; 72
   1366c:	92 e4       	ldi	r25, 0x42	; 66
   1366e:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
            current_position[X_AXIS] = PINDA_PREHEAT_X;
   13672:	20 e0       	ldi	r18, 0x00	; 0
   13674:	30 e0       	ldi	r19, 0x00	; 0
   13676:	40 ea       	ldi	r20, 0xA0	; 160
   13678:	51 e4       	ldi	r21, 0x41	; 65
   1367a:	20 93 61 12 	sts	0x1261, r18	; 0x801261 <current_position>
   1367e:	30 93 62 12 	sts	0x1262, r19	; 0x801262 <current_position+0x1>
   13682:	40 93 63 12 	sts	0x1263, r20	; 0x801263 <current_position+0x2>
   13686:	50 93 64 12 	sts	0x1264, r21	; 0x801264 <current_position+0x3>
            current_position[Y_AXIS] = PINDA_PREHEAT_Y;
   1368a:	80 e0       	ldi	r24, 0x00	; 0
   1368c:	90 e0       	ldi	r25, 0x00	; 0
   1368e:	a0 e7       	ldi	r26, 0x70	; 112
   13690:	b2 e4       	ldi	r27, 0x42	; 66
   13692:	80 93 65 12 	sts	0x1265, r24	; 0x801265 <current_position+0x4>
   13696:	90 93 66 12 	sts	0x1266, r25	; 0x801266 <current_position+0x5>
   1369a:	a0 93 67 12 	sts	0x1267, r26	; 0x801267 <current_position+0x6>
   1369e:	b0 93 68 12 	sts	0x1268, r27	; 0x801268 <current_position+0x7>
            plan_buffer_line_curposXYZE(3000 / 60);
   136a2:	60 e0       	ldi	r22, 0x00	; 0
   136a4:	70 e0       	ldi	r23, 0x00	; 0
   136a6:	88 e4       	ldi	r24, 0x48	; 72
   136a8:	92 e4       	ldi	r25, 0x42	; 66
   136aa:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
            current_position[Z_AXIS] = PINDA_PREHEAT_Z;
   136ae:	40 92 69 12 	sts	0x1269, r4	; 0x801269 <current_position+0x8>
   136b2:	50 92 6a 12 	sts	0x126A, r5	; 0x80126a <current_position+0x9>
   136b6:	60 92 6b 12 	sts	0x126B, r6	; 0x80126b <current_position+0xa>
   136ba:	70 92 6c 12 	sts	0x126C, r7	; 0x80126c <current_position+0xb>
            plan_buffer_line_curposXYZE(3000 / 60);
   136be:	60 e0       	ldi	r22, 0x00	; 0
   136c0:	70 e0       	ldi	r23, 0x00	; 0
   136c2:	88 e4       	ldi	r24, 0x48	; 72
   136c4:	92 e4       	ldi	r25, 0x42	; 66
   136c6:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
            st_synchronize();
   136ca:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
   136ce:	0f 90       	pop	r0
   136d0:	0f 90       	pop	r0
   136d2:	0f 90       	pop	r0
   136d4:	0f 90       	pop	r0
            while (current_temperature_pinda < temp)
   136d6:	20 91 85 03 	lds	r18, 0x0385	; 0x800385 <current_temperature_pinda>
   136da:	30 91 86 03 	lds	r19, 0x0386	; 0x800386 <current_temperature_pinda+0x1>
   136de:	40 91 87 03 	lds	r20, 0x0387	; 0x800387 <current_temperature_pinda+0x2>
   136e2:	50 91 88 03 	lds	r21, 0x0388	; 0x800388 <current_temperature_pinda+0x3>
   136e6:	c7 01       	movw	r24, r14
   136e8:	b6 01       	movw	r22, r12
   136ea:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   136ee:	18 16       	cp	r1, r24
   136f0:	3c f4       	brge	.+14     	; 0x13700 <process_commands() [clone .part.46]+0x1748>
            {
                delay_keep_alive(1000);
   136f2:	88 ee       	ldi	r24, 0xE8	; 232
   136f4:	93 e0       	ldi	r25, 0x03	; 3
   136f6:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
                serialecho_temperatures();
   136fa:	0e 94 d2 7a 	call	0xf5a4	; 0xf5a4 <serialecho_temperatures()>
   136fe:	eb cf       	rjmp	.-42     	; 0x136d6 <process_commands() [clone .part.46]+0x171e>
            }
            current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
   13700:	80 e0       	ldi	r24, 0x00	; 0
   13702:	90 e0       	ldi	r25, 0x00	; 0
   13704:	a0 ea       	ldi	r26, 0xA0	; 160
   13706:	b0 e4       	ldi	r27, 0x40	; 64
   13708:	80 93 69 12 	sts	0x1269, r24	; 0x801269 <current_position+0x8>
   1370c:	90 93 6a 12 	sts	0x126A, r25	; 0x80126a <current_position+0x9>
   13710:	a0 93 6b 12 	sts	0x126B, r26	; 0x80126b <current_position+0xa>
   13714:	b0 93 6c 12 	sts	0x126C, r27	; 0x80126c <current_position+0xb>
            plan_buffer_line_curposXYZE(3000 / 60);
   13718:	60 e0       	ldi	r22, 0x00	; 0
   1371a:	70 e0       	ldi	r23, 0x00	; 0
   1371c:	88 e4       	ldi	r24, 0x48	; 72
   1371e:	92 e4       	ldi	r25, 0x42	; 66
   13720:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
            current_position[X_AXIS] = pgm_read_float(bed_ref_points_4);
   13724:	e0 e0       	ldi	r30, 0x00	; 0
   13726:	fc e9       	ldi	r31, 0x9C	; 156
   13728:	85 91       	lpm	r24, Z+
   1372a:	95 91       	lpm	r25, Z+
   1372c:	a5 91       	lpm	r26, Z+
   1372e:	b4 91       	lpm	r27, Z
   13730:	80 93 61 12 	sts	0x1261, r24	; 0x801261 <current_position>
   13734:	90 93 62 12 	sts	0x1262, r25	; 0x801262 <current_position+0x1>
   13738:	a0 93 63 12 	sts	0x1263, r26	; 0x801263 <current_position+0x2>
   1373c:	b0 93 64 12 	sts	0x1264, r27	; 0x801264 <current_position+0x3>
            current_position[Y_AXIS] = pgm_read_float(bed_ref_points_4 + 1);
   13740:	e4 e0       	ldi	r30, 0x04	; 4
   13742:	fc e9       	ldi	r31, 0x9C	; 156
   13744:	85 91       	lpm	r24, Z+
   13746:	95 91       	lpm	r25, Z+
   13748:	a5 91       	lpm	r26, Z+
   1374a:	b4 91       	lpm	r27, Z
   1374c:	80 93 65 12 	sts	0x1265, r24	; 0x801265 <current_position+0x4>
   13750:	90 93 66 12 	sts	0x1266, r25	; 0x801266 <current_position+0x5>
   13754:	a0 93 67 12 	sts	0x1267, r26	; 0x801267 <current_position+0x6>
   13758:	b0 93 68 12 	sts	0x1268, r27	; 0x801268 <current_position+0x7>
            plan_buffer_line_curposXYZE(3000 / 60);
   1375c:	60 e0       	ldi	r22, 0x00	; 0
   1375e:	70 e0       	ldi	r23, 0x00	; 0
   13760:	88 e4       	ldi	r24, 0x48	; 72
   13762:	92 e4       	ldi	r25, 0x42	; 66
   13764:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
            st_synchronize();
   13768:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
            find_z_result = find_bed_induction_sensor_point_z(-1.f);
   1376c:	43 e0       	ldi	r20, 0x03	; 3
   1376e:	60 e0       	ldi	r22, 0x00	; 0
   13770:	70 e0       	ldi	r23, 0x00	; 0
   13772:	80 e8       	ldi	r24, 0x80	; 128
   13774:	9f eb       	ldi	r25, 0xBF	; 191
   13776:	0f 94 ed 7b 	call	0x2f7da	; 0x2f7da <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.86]>
   1377a:	95 e0       	ldi	r25, 0x05	; 5
   1377c:	29 0e       	add	r2, r25
   1377e:	31 1c       	adc	r3, r1
   13780:	0f 5f       	subi	r16, 0xFF	; 255
   13782:	1f 4f       	sbci	r17, 0xFF	; 255
            if (find_z_result == false) {
   13784:	81 11       	cpse	r24, r1
   13786:	04 c0       	rjmp	.+8      	; 0x13790 <process_commands() [clone .part.46]+0x17d8>
                lcd_temp_cal_show_result(find_z_result);
   13788:	0e 94 de fb 	call	0x1f7bc	; 0x1f7bc <lcd_temp_cal_show_result(bool)>

            printf_P(_N("\nPINDA temperature: %.1f Z shift (mm): %.3f"), current_temperature_pinda, current_position[Z_AXIS] - zero_z);

            eeprom_update_word_notify((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + i, z_shift);
        }
        lcd_temp_cal_show_result(true);
   1378c:	81 e0       	ldi	r24, 0x01	; 1
   1378e:	a7 ce       	rjmp	.-690    	; 0x134de <process_commands() [clone .part.46]+0x1526>
            find_z_result = find_bed_induction_sensor_point_z(-1.f);
            if (find_z_result == false) {
                lcd_temp_cal_show_result(find_z_result);
                break;
            }
            z_shift = (int)((current_position[Z_AXIS] - zero_z)*cs.axis_steps_per_mm[Z_AXIS]);
   13790:	78 a5       	ldd	r23, Y+40	; 0x28
   13792:	6c a5       	ldd	r22, Y+44	; 0x2c
   13794:	98 a9       	ldd	r25, Y+48	; 0x30
   13796:	88 ad       	ldd	r24, Y+56	; 0x38
   13798:	27 2f       	mov	r18, r23
   1379a:	36 2f       	mov	r19, r22
   1379c:	49 2f       	mov	r20, r25
   1379e:	58 2f       	mov	r21, r24
   137a0:	60 91 69 12 	lds	r22, 0x1269	; 0x801269 <current_position+0x8>
   137a4:	70 91 6a 12 	lds	r23, 0x126A	; 0x80126a <current_position+0x9>
   137a8:	80 91 6b 12 	lds	r24, 0x126B	; 0x80126b <current_position+0xa>
   137ac:	90 91 6c 12 	lds	r25, 0x126C	; 0x80126c <current_position+0xb>
   137b0:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   137b4:	f6 2e       	mov	r15, r22
   137b6:	e7 2e       	mov	r14, r23
   137b8:	d8 2e       	mov	r13, r24
   137ba:	c9 2e       	mov	r12, r25
   137bc:	20 91 73 0d 	lds	r18, 0x0D73	; 0x800d73 <cs+0xc>
   137c0:	30 91 74 0d 	lds	r19, 0x0D74	; 0x800d74 <cs+0xd>
   137c4:	40 91 75 0d 	lds	r20, 0x0D75	; 0x800d75 <cs+0xe>
   137c8:	50 91 76 0d 	lds	r21, 0x0D76	; 0x800d76 <cs+0xf>
   137cc:	d7 01       	movw	r26, r14
   137ce:	f6 01       	movw	r30, r12
   137d0:	6b 2f       	mov	r22, r27
   137d2:	7a 2f       	mov	r23, r26
   137d4:	8f 2f       	mov	r24, r31
   137d6:	9e 2f       	mov	r25, r30
   137d8:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   137dc:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   137e0:	6c ab       	std	Y+52, r22	; 0x34
   137e2:	7d ab       	std	Y+53, r23	; 0x35
   137e4:	8e ab       	std	Y+54, r24	; 0x36
   137e6:	9f ab       	std	Y+55, r25	; 0x37

            printf_P(_N("\nPINDA temperature: %.1f Z shift (mm): %.3f"), current_temperature_pinda, current_position[Z_AXIS] - zero_z);
   137e8:	cf 92       	push	r12
   137ea:	df 92       	push	r13
   137ec:	ef 92       	push	r14
   137ee:	ff 92       	push	r15
   137f0:	80 91 88 03 	lds	r24, 0x0388	; 0x800388 <current_temperature_pinda+0x3>
   137f4:	8f 93       	push	r24
   137f6:	80 91 87 03 	lds	r24, 0x0387	; 0x800387 <current_temperature_pinda+0x2>
   137fa:	8f 93       	push	r24
   137fc:	80 91 86 03 	lds	r24, 0x0386	; 0x800386 <current_temperature_pinda+0x1>
   13800:	8f 93       	push	r24
   13802:	80 91 85 03 	lds	r24, 0x0385	; 0x800385 <current_temperature_pinda>
   13806:	8f 93       	push	r24
   13808:	9f 92       	push	r9
   1380a:	8f 92       	push	r8
   1380c:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   13810:	6c a9       	ldd	r22, Y+52	; 0x34
   13812:	7d a9       	ldd	r23, Y+53	; 0x35
   13814:	c5 01       	movw	r24, r10
   13816:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>
   1381a:	a2 e0       	ldi	r26, 0x02	; 2
   1381c:	aa 0e       	add	r10, r26
   1381e:	b1 1c       	adc	r11, r1
   13820:	0f b6       	in	r0, 0x3f	; 63
   13822:	f8 94       	cli
   13824:	de bf       	out	0x3e, r29	; 62
   13826:	0f be       	out	0x3f, r0	; 63
   13828:	cd bf       	out	0x3d, r28	; 61
   1382a:	d7 ce       	rjmp	.-594    	; 0x135da <process_commands() [clone .part.46]+0x1622>
        /*!
        ### G81 - Mesh bed leveling status <a href="https://reprap.org/wiki/G-code#G81:_Mesh_bed_leveling_status">G81: Mesh bed leveling status</a>
        Prints mesh bed leveling status and bed profile if activated.
        */
        case 81: {
            gcode_G81_M420();
   1382c:	0e 94 53 85 	call	0x10aa6	; 0x10aa6 <gcode_G81_M420()>
   13830:	0c 94 63 93 	jmp	0x126c6	; 0x126c6 <process_commands() [clone .part.46]+0x70e>

        This G-code will be performed at the start of a calibration script.
        (Prusa3D specific)
        */
        case 86:
            calibration_status_clear(CALIBRATION_STATUS_LIVE_ADJUST);
   13834:	80 e1       	ldi	r24, 0x10	; 16
   13836:	0e 94 f9 d6 	call	0x1adf2	; 0x1adf2 <calibration_status_clear(unsigned char)>
   1383a:	0c 94 63 93 	jmp	0x126c6	; 0x126c6 <process_commands() [clone .part.46]+0x70e>
    /*!
    ### G90 - Switch off relative mode <a href="https://reprap.org/wiki/G-code#G90:_Set_to_Absolute_Positioning">G90: Set to Absolute Positioning</a>
    All coordinates from now on are absolute relative to the origin of the machine. E axis is left intact.
    */
    case 90: {
		axis_relative_modes &= ~(X_AXIS_MASK | Y_AXIS_MASK | Z_AXIS_MASK);
   1383e:	80 91 57 12 	lds	r24, 0x1257	; 0x801257 <axis_relative_modes>
   13842:	88 7f       	andi	r24, 0xF8	; 248
    /*!
    ### G91 - Switch on relative mode <a href="https://reprap.org/wiki/G-code#G91:_Set_to_Relative_Positioning">G91: Set to Relative Positioning</a>
    All coordinates from now on are relative to the last position. E axis is left intact.
    */
    case 91: {
		axis_relative_modes |= X_AXIS_MASK | Y_AXIS_MASK | Z_AXIS_MASK;
   13844:	80 93 57 12 	sts	0x1257, r24	; 0x801257 <axis_relative_modes>
   13848:	0c 94 63 93 	jmp	0x126c6	; 0x126c6 <process_commands() [clone .part.46]+0x70e>
   1384c:	b4 ec       	ldi	r27, 0xC4	; 196
   1384e:	cb 2e       	mov	r12, r27
   13850:	b2 e0       	ldi	r27, 0x02	; 2
   13852:	db 2e       	mov	r13, r27
   13854:	8e 01       	movw	r16, r28
   13856:	0c 5d       	subi	r16, 0xDC	; 220
   13858:	1f 4f       	sbci	r17, 0xFF	; 255
  else if(*CMDBUFFER_CURRENT_STRING == 'G')
  {
	strchr_pointer = CMDBUFFER_CURRENT_STRING;
	gcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN G-CODE=%u\n"), gcode_in_progress);
    switch (gcode_in_progress)
   1385a:	58 01       	movw	r10, r16
   1385c:	ee 24       	eor	r14, r14
   1385e:	e3 94       	inc	r14
   13860:	f1 2c       	mov	r15, r1
    float values[NUM_AXIS];

    // Check which axes need to be set
    for(uint8_t i = 0; i < NUM_AXIS; ++i)
    {
        codes[i] = code_seen(axis_codes[i]);
   13862:	d6 01       	movw	r26, r12
   13864:	8d 91       	ld	r24, X+
   13866:	6d 01       	movw	r12, r26
   13868:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   1386c:	f5 01       	movw	r30, r10
   1386e:	81 93       	st	Z+, r24
   13870:	5f 01       	movw	r10, r30
        if(codes[i])
   13872:	88 23       	and	r24, r24
   13874:	91 f0       	breq	.+36     	; 0x1389a <process_commands() [clone .part.46]+0x18e2>
            values[i] = code_value();
   13876:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   1387a:	f7 01       	movw	r30, r14
   1387c:	ee 0f       	add	r30, r30
   1387e:	ff 1f       	adc	r31, r31
   13880:	ee 0f       	add	r30, r30
   13882:	ff 1f       	adc	r31, r31
   13884:	34 97       	sbiw	r30, 0x04	; 4
   13886:	21 e0       	ldi	r18, 0x01	; 1
   13888:	30 e0       	ldi	r19, 0x00	; 0
   1388a:	2c 0f       	add	r18, r28
   1388c:	3d 1f       	adc	r19, r29
   1388e:	e2 0f       	add	r30, r18
   13890:	f3 1f       	adc	r31, r19
   13892:	60 83       	st	Z, r22
   13894:	71 83       	std	Z+1, r23	; 0x01
   13896:	82 83       	std	Z+2, r24	; 0x02
   13898:	93 83       	std	Z+3, r25	; 0x03
   1389a:	3f ef       	ldi	r19, 0xFF	; 255
   1389c:	e3 1a       	sub	r14, r19
   1389e:	f3 0a       	sbc	r15, r19
{
    bool codes[NUM_AXIS];
    float values[NUM_AXIS];

    // Check which axes need to be set
    for(uint8_t i = 0; i < NUM_AXIS; ++i)
   138a0:	45 e0       	ldi	r20, 0x05	; 5
   138a2:	e4 16       	cp	r14, r20
   138a4:	f1 04       	cpc	r15, r1
   138a6:	e9 f6       	brne	.-70     	; 0x13862 <process_commands() [clone .part.46]+0x18aa>
        codes[i] = code_seen(axis_codes[i]);
        if(codes[i])
            values[i] = code_value();
    }

    if((codes[E_AXIS] && values[E_AXIS] == 0) &&
   138a8:	9f a0       	ldd	r9, Y+39	; 0x27
   138aa:	fc a0       	ldd	r15, Y+36	; 0x24
   138ac:	99 20       	and	r9, r9
   138ae:	01 f1       	breq	.+64     	; 0x138f0 <process_commands() [clone .part.46]+0x1938>
   138b0:	20 e0       	ldi	r18, 0x00	; 0
   138b2:	30 e0       	ldi	r19, 0x00	; 0
   138b4:	a9 01       	movw	r20, r18
   138b6:	6d 85       	ldd	r22, Y+13	; 0x0d
   138b8:	7e 85       	ldd	r23, Y+14	; 0x0e
   138ba:	8f 85       	ldd	r24, Y+15	; 0x0f
   138bc:	98 89       	ldd	r25, Y+16	; 0x10
   138be:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   138c2:	81 11       	cpse	r24, r1
   138c4:	15 c0       	rjmp	.+42     	; 0x138f0 <process_commands() [clone .part.46]+0x1938>
   138c6:	f1 10       	cpse	r15, r1
   138c8:	13 c0       	rjmp	.+38     	; 0x138f0 <process_commands() [clone .part.46]+0x1938>
       (!codes[X_AXIS] && !codes[Y_AXIS] && !codes[Z_AXIS]))
   138ca:	8d a1       	ldd	r24, Y+37	; 0x25
   138cc:	81 11       	cpse	r24, r1
   138ce:	10 c0       	rjmp	.+32     	; 0x138f0 <process_commands() [clone .part.46]+0x1938>
   138d0:	8e a1       	ldd	r24, Y+38	; 0x26
   138d2:	81 11       	cpse	r24, r1
   138d4:	0d c0       	rjmp	.+26     	; 0x138f0 <process_commands() [clone .part.46]+0x1938>
    {
        // As a special optimization, when _just_ clearing the E position
        // we schedule a flag asynchronously along with the next block to
        // reset the starting E position instead of stopping the planner
        current_position[E_AXIS] = 0;
   138d6:	10 92 6d 12 	sts	0x126D, r1	; 0x80126d <current_position+0xc>
   138da:	10 92 6e 12 	sts	0x126E, r1	; 0x80126e <current_position+0xd>
   138de:	10 92 6f 12 	sts	0x126F, r1	; 0x80126f <current_position+0xe>
   138e2:	10 92 70 12 	sts	0x1270, r1	; 0x801270 <current_position+0xf>
  st_set_e_position(position[E_AXIS]);
}

void plan_reset_next_e()
{
    plan_reset_next_e_queue = true;
   138e6:	81 e0       	ldi	r24, 0x01	; 1
   138e8:	80 93 21 04 	sts	0x0421, r24	; 0x800421 <_ZL23plan_reset_next_e_queue.lto_priv.443>
   138ec:	0c 94 63 93 	jmp	0x126c6	; 0x126c6 <process_commands() [clone .part.46]+0x70e>
        plan_reset_next_e();
    }
    else
    {
        // In any other case we're forced to synchronize
        st_synchronize();
   138f0:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
   138f4:	ce 01       	movw	r24, r28
   138f6:	01 96       	adiw	r24, 0x01	; 1
   138f8:	5c 01       	movw	r10, r24
   138fa:	5f eb       	ldi	r21, 0xBF	; 191
   138fc:	c5 2e       	mov	r12, r21
   138fe:	5d e0       	ldi	r21, 0x0D	; 13
   13900:	d5 2e       	mov	r13, r21
   13902:	61 e6       	ldi	r22, 0x61	; 97
   13904:	e6 2e       	mov	r14, r22
   13906:	62 e1       	ldi	r22, 0x12	; 18
   13908:	f6 2e       	mov	r15, r22
   1390a:	38 01       	movw	r6, r16
   1390c:	93 e0       	ldi	r25, 0x03	; 3
   1390e:	69 0e       	add	r6, r25
   13910:	71 1c       	adc	r7, r1
        for(uint8_t i = 0; i < 3; ++i)
        {
            if(codes[i])
   13912:	d8 01       	movw	r26, r16
   13914:	8d 91       	ld	r24, X+
   13916:	8d 01       	movw	r16, r26
   13918:	88 23       	and	r24, r24
   1391a:	89 f0       	breq	.+34     	; 0x1393e <process_commands() [clone .part.46]+0x1986>
                current_position[i] = values[i] + cs.add_homing[i];
   1391c:	f6 01       	movw	r30, r12
   1391e:	20 81       	ld	r18, Z
   13920:	31 81       	ldd	r19, Z+1	; 0x01
   13922:	42 81       	ldd	r20, Z+2	; 0x02
   13924:	53 81       	ldd	r21, Z+3	; 0x03
   13926:	d5 01       	movw	r26, r10
   13928:	6d 91       	ld	r22, X+
   1392a:	7d 91       	ld	r23, X+
   1392c:	8d 91       	ld	r24, X+
   1392e:	9c 91       	ld	r25, X
   13930:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   13934:	f7 01       	movw	r30, r14
   13936:	60 83       	st	Z, r22
   13938:	71 83       	std	Z+1, r23	; 0x01
   1393a:	82 83       	std	Z+2, r24	; 0x02
   1393c:	93 83       	std	Z+3, r25	; 0x03
   1393e:	f4 e0       	ldi	r31, 0x04	; 4
   13940:	af 0e       	add	r10, r31
   13942:	b1 1c       	adc	r11, r1
   13944:	24 e0       	ldi	r18, 0x04	; 4
   13946:	c2 0e       	add	r12, r18
   13948:	d1 1c       	adc	r13, r1
   1394a:	34 e0       	ldi	r19, 0x04	; 4
   1394c:	e3 0e       	add	r14, r19
   1394e:	f1 1c       	adc	r15, r1
    }
    else
    {
        // In any other case we're forced to synchronize
        st_synchronize();
        for(uint8_t i = 0; i < 3; ++i)
   13950:	60 16       	cp	r6, r16
   13952:	71 06       	cpc	r7, r17
   13954:	f1 f6       	brne	.-68     	; 0x13912 <process_commands() [clone .part.46]+0x195a>
        {
            if(codes[i])
                current_position[i] = values[i] + cs.add_homing[i];
        }
        if(codes[E_AXIS])
   13956:	99 20       	and	r9, r9
   13958:	61 f0       	breq	.+24     	; 0x13972 <process_commands() [clone .part.46]+0x19ba>
            current_position[E_AXIS] = values[E_AXIS];
   1395a:	8d 85       	ldd	r24, Y+13	; 0x0d
   1395c:	9e 85       	ldd	r25, Y+14	; 0x0e
   1395e:	af 85       	ldd	r26, Y+15	; 0x0f
   13960:	b8 89       	ldd	r27, Y+16	; 0x10
   13962:	80 93 6d 12 	sts	0x126D, r24	; 0x80126d <current_position+0xc>
   13966:	90 93 6e 12 	sts	0x126E, r25	; 0x80126e <current_position+0xd>
   1396a:	a0 93 6f 12 	sts	0x126F, r26	; 0x80126f <current_position+0xe>
   1396e:	b0 93 70 12 	sts	0x1270, r27	; 0x801270 <current_position+0xf>

        // Set all at once
        plan_set_position_curposXYZE();
   13972:	0f 94 41 4b 	call	0x29682	; 0x29682 <plan_set_position_curposXYZE()>
   13976:	0c 94 63 93 	jmp	0x126c6	; 0x126c6 <process_commands() [clone .part.46]+0x70e>

    return true;
}

void farm_gcode_g98() {
    farm_mode = 1;
   1397a:	81 e0       	ldi	r24, 0x01	; 1
   1397c:	80 93 60 0d 	sts	0x0D60, r24	; 0x800d60 <farm_mode>
        if (previous_value != value) {
            eeprom_byte_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_byte(dst, value);
   13980:	61 e0       	ldi	r22, 0x01	; 1
   13982:	84 ec       	ldi	r24, 0xC4	; 196
   13984:	9f e0       	ldi	r25, 0x0F	; 15
   13986:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
    eeprom_update_byte_notify((unsigned char *)EEPROM_FARM_MODE, farm_mode);
    SilentModeMenu = SILENT_MODE_OFF;
   1398a:	10 92 bb 03 	sts	0x03BB, r1	; 0x8003bb <SilentModeMenu>
   1398e:	60 e0       	ldi	r22, 0x00	; 0
   13990:	8f ef       	ldi	r24, 0xFF	; 255
   13992:	9f e0       	ldi	r25, 0x0F	; 15
   13994:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
}

void farm_gcode_g99() {
    farm_disable();
    lcd_update(2);
    fCheckModeInit(); // alternatively invoke printer reset
   13998:	0e 94 5e d9 	call	0x1b2bc	; 0x1b2bc <fCheckModeInit()>
   1399c:	0c 94 63 93 	jmp	0x126c6	; 0x126c6 <process_commands() [clone .part.46]+0x70e>
  /*!
  ---------------------------------------------------------------------------------
  # M Commands
  */

  else  if(*CMDBUFFER_CURRENT_STRING == 'M')
   139a0:	8d 34       	cpi	r24, 0x4D	; 77
   139a2:	11 f0       	breq	.+4      	; 0x139a8 <process_commands() [clone .part.46]+0x19f0>
   139a4:	0c 94 1d bb 	jmp	0x1763a	; 0x1763a <process_commands() [clone .part.46]+0x5682>
  {
	  strchr_pointer = CMDBUFFER_CURRENT_STRING;
   139a8:	10 93 bc 04 	sts	0x04BC, r17	; 0x8004bc <strchr_pointer+0x1>
   139ac:	00 93 bb 04 	sts	0x04BB, r16	; 0x8004bb <strchr_pointer>
   139b0:	f8 01       	movw	r30, r16
   139b2:	31 96       	adiw	r30, 0x01	; 1

	  int index;
	  for (index = 1; *(strchr_pointer + index) == ' ' || *(strchr_pointer + index) == '\t'; index++);
   139b4:	81 91       	ld	r24, Z+
   139b6:	80 32       	cpi	r24, 0x20	; 32
   139b8:	e9 f3       	breq	.-6      	; 0x139b4 <process_commands() [clone .part.46]+0x19fc>
   139ba:	89 30       	cpi	r24, 0x09	; 9
   139bc:	d9 f3       	breq	.-10     	; 0x139b4 <process_commands() [clone .part.46]+0x19fc>

	 /*for (++strchr_pointer; *strchr_pointer == ' ' || *strchr_pointer == '\t'; ++strchr_pointer);*/
	  if (*(strchr_pointer+index) < '0' || *(strchr_pointer+index) > '9') {
   139be:	80 53       	subi	r24, 0x30	; 48
   139c0:	8a 30       	cpi	r24, 0x0A	; 10
   139c2:	30 f0       	brcs	.+12     	; 0x139d0 <process_commands() [clone .part.46]+0x1a18>
		  printf_P(PSTR("Invalid M code: %s\n"), cmdbuffer + bufindr + CMDHDRSIZE);
   139c4:	1f 93       	push	r17
   139c6:	0f 93       	push	r16
   139c8:	85 e9       	ldi	r24, 0x95	; 149
   139ca:	90 e8       	ldi	r25, 0x80	; 128
   139cc:	0c 94 1b 90 	jmp	0x12036	; 0x12036 <process_commands() [clone .part.46]+0x7e>

	  } else
	  {
	  mcode_in_progress = code_value_short();
   139d0:	0e 94 17 56 	call	0xac2e	; 0xac2e <code_value_short() [clone .lto_priv.505]>
   139d4:	90 93 41 0d 	sts	0x0D41, r25	; 0x800d41 <_ZL17mcode_in_progress.lto_priv.489+0x1>
   139d8:	80 93 40 0d 	sts	0x0D40, r24	; 0x800d40 <_ZL17mcode_in_progress.lto_priv.489>
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   139dc:	8e 3b       	cpi	r24, 0xBE	; 190
   139de:	91 05       	cpc	r25, r1
   139e0:	11 f4       	brne	.+4      	; 0x139e6 <process_commands() [clone .part.46]+0x1a2e>
   139e2:	0c 94 0e a8 	jmp	0x1501c	; 0x1501c <process_commands() [clone .part.46]+0x3064>
   139e6:	0c f0       	brlt	.+2      	; 0x139ea <process_commands() [clone .part.46]+0x1a32>
   139e8:	31 c3       	rjmp	.+1634   	; 0x1404c <process_commands() [clone .part.46]+0x2094>
   139ea:	8c 34       	cpi	r24, 0x4C	; 76
   139ec:	91 05       	cpc	r25, r1
   139ee:	11 f4       	brne	.+4      	; 0x139f4 <process_commands() [clone .part.46]+0x1a3c>
   139f0:	0c 94 f7 a6 	jmp	0x14dee	; 0x14dee <process_commands() [clone .part.46]+0x2e36>
   139f4:	0c f0       	brlt	.+2      	; 0x139f8 <process_commands() [clone .part.46]+0x1a40>
   139f6:	df c1       	rjmp	.+958    	; 0x13db6 <process_commands() [clone .part.46]+0x1dfe>
   139f8:	8c 31       	cpi	r24, 0x1C	; 28
   139fa:	91 05       	cpc	r25, r1
   139fc:	11 f4       	brne	.+4      	; 0x13a02 <process_commands() [clone .part.46]+0x1a4a>
   139fe:	0c 94 2e a5 	jmp	0x14a5c	; 0x14a5c <process_commands() [clone .part.46]+0x2aa4>
   13a02:	0c f0       	brlt	.+2      	; 0x13a06 <process_commands() [clone .part.46]+0x1a4e>
   13a04:	f4 c0       	rjmp	.+488    	; 0x13bee <process_commands() [clone .part.46]+0x1c36>
   13a06:	85 31       	cpi	r24, 0x15	; 21
   13a08:	91 05       	cpc	r25, r1
   13a0a:	09 f4       	brne	.+2      	; 0x13a0e <process_commands() [clone .part.46]+0x1a56>
   13a0c:	40 c7       	rjmp	.+3712   	; 0x1488e <process_commands() [clone .part.46]+0x28d6>
   13a0e:	0c f0       	brlt	.+2      	; 0x13a12 <process_commands() [clone .part.46]+0x1a5a>
   13a10:	5a c0       	rjmp	.+180    	; 0x13ac6 <process_commands() [clone .part.46]+0x1b0e>
   13a12:	81 31       	cpi	r24, 0x11	; 17
   13a14:	91 05       	cpc	r25, r1
   13a16:	09 f4       	brne	.+2      	; 0x13a1a <process_commands() [clone .part.46]+0x1a62>
   13a18:	2f c7       	rjmp	.+3678   	; 0x14878 <process_commands() [clone .part.46]+0x28c0>
   13a1a:	dc f4       	brge	.+54     	; 0x13a52 <process_commands() [clone .part.46]+0x1a9a>
   13a1c:	02 97       	sbiw	r24, 0x02	; 2
   13a1e:	08 f4       	brcc	.+2      	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>
   13a20:	93 c6       	rjmp	.+3366   	; 0x14748 <process_commands() [clone .part.46]+0x2790>

    /*!
    #### End of M-Commands
    */
	default:
		printf_P(MSG_UNKNOWN_CODE, 'M', cmdbuffer + bufindr + CMDHDRSIZE);
   13a22:	80 91 38 12 	lds	r24, 0x1238	; 0x801238 <bufindr>
   13a26:	90 91 39 12 	lds	r25, 0x1239	; 0x801239 <bufindr+0x1>
   13a2a:	82 5b       	subi	r24, 0xB2	; 178
   13a2c:	9f 4e       	sbci	r25, 0xEF	; 239
   13a2e:	9f 93       	push	r25
   13a30:	8f 93       	push	r24
   13a32:	1f 92       	push	r1
   13a34:	8d e4       	ldi	r24, 0x4D	; 77
   13a36:	8f 93       	push	r24
   13a38:	88 e5       	ldi	r24, 0x58	; 88
   13a3a:	96 e6       	ldi	r25, 0x66	; 102
   13a3c:	9f 93       	push	r25
   13a3e:	8f 93       	push	r24
   13a40:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   13a44:	0f 90       	pop	r0
   13a46:	0f 90       	pop	r0
   13a48:	0f 90       	pop	r0
   13a4a:	0f 90       	pop	r0
   13a4c:	0f 90       	pop	r0
   13a4e:	0f 90       	pop	r0
   13a50:	de c6       	rjmp	.+3516   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   13a52:	82 31       	cpi	r24, 0x12	; 18
   13a54:	91 05       	cpc	r25, r1
   13a56:	11 f4       	brne	.+4      	; 0x13a5c <process_commands() [clone .part.46]+0x1aa4>
   13a58:	0c 94 b9 a8 	jmp	0x15172	; 0x15172 <process_commands() [clone .part.46]+0x31ba>
   13a5c:	44 97       	sbiw	r24, 0x14	; 20
   13a5e:	09 f7       	brne	.-62     	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>
    #### Parameters
    - `T` - Report timestamps as well. The value is one uint32_t encoded as hex. Requires host software parsing (Cap:EXTENDED_M20).
    - `L` - Reports long filenames instead of just short filenames. Requires host software parsing (Cap:EXTENDED_M20).
    */
    case 20:
      KEEPALIVE_STATE(NOT_BUSY); // do not send busy messages during listing. Inhibits the output of manage_heater()
   13a60:	81 e0       	ldi	r24, 0x01	; 1
   13a62:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
      SERIAL_PROTOCOLLNRPGM(_N("Begin file list"));////MSG_BEGIN_FILE_LIST
   13a66:	88 e4       	ldi	r24, 0x48	; 72
   13a68:	96 e6       	ldi	r25, 0x66	; 102
   13a6a:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
      card.ls(CardReader::ls_param(code_seen('L'), code_seen('T')));
   13a6e:	84 e5       	ldi	r24, 0x54	; 84
   13a70:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   13a74:	18 2f       	mov	r17, r24
   13a76:	8c e4       	ldi	r24, 0x4C	; 76
   13a78:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   13a7c:	00 e0       	ldi	r16, 0x00	; 0
   13a7e:	80 fb       	bst	r24, 0
   13a80:	00 f9       	bld	r16, 0
   13a82:	10 fb       	bst	r17, 0
   13a84:	01 f9       	bld	r16, 1
		} // while readDir
}

void CardReader::ls(ls_param params)
{
  root.rewind();
   13a86:	8d e5       	ldi	r24, 0x5D	; 93
   13a88:	94 e1       	ldi	r25, 0x14	; 20
   13a8a:	0e 94 a6 79 	call	0xf34c	; 0xf34c <SdBaseFile::rewind()>
  lsDive("",root, NULL, LS_SerialPrint, params);
   13a8e:	83 e2       	ldi	r24, 0x23	; 35
   13a90:	ed e5       	ldi	r30, 0x5D	; 93
   13a92:	f4 e1       	ldi	r31, 0x14	; 20
   13a94:	de 01       	movw	r26, r28
   13a96:	11 96       	adiw	r26, 0x01	; 1
   13a98:	01 90       	ld	r0, Z+
   13a9a:	0d 92       	st	X+, r0
   13a9c:	8a 95       	dec	r24
   13a9e:	e1 f7       	brne	.-8      	; 0x13a98 <process_commands() [clone .part.46]+0x1ae0>
   13aa0:	20 e0       	ldi	r18, 0x00	; 0
   13aa2:	50 e0       	ldi	r21, 0x00	; 0
   13aa4:	40 e0       	ldi	r20, 0x00	; 0
   13aa6:	be 01       	movw	r22, r28
   13aa8:	6f 5f       	subi	r22, 0xFF	; 255
   13aaa:	7f 4f       	sbci	r23, 0xFF	; 255
   13aac:	8f ed       	ldi	r24, 0xDF	; 223
   13aae:	92 e0       	ldi	r25, 0x02	; 2
   13ab0:	0f 94 8a 69 	call	0x2d314	; 0x2d314 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]>
   13ab4:	ce 01       	movw	r24, r28
   13ab6:	01 96       	adiw	r24, 0x01	; 1
   13ab8:	0e 94 ab 79 	call	0xf356	; 0xf356 <SdBaseFile::~SdBaseFile()>
      SERIAL_PROTOCOLLNRPGM(_N("End file list"));////MSG_END_FILE_LIST
   13abc:	8a e3       	ldi	r24, 0x3A	; 58
   13abe:	96 e6       	ldi	r25, 0x66	; 102
   13ac0:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   13ac4:	a4 c6       	rjmp	.+3400   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   13ac6:	88 31       	cpi	r24, 0x18	; 24
   13ac8:	91 05       	cpc	r25, r1
   13aca:	09 f4       	brne	.+2      	; 0x13ace <process_commands() [clone .part.46]+0x1b16>
   13acc:	f1 c6       	rjmp	.+3554   	; 0x148b0 <process_commands() [clone .part.46]+0x28f8>
   13ace:	84 f4       	brge	.+32     	; 0x13af0 <process_commands() [clone .part.46]+0x1b38>
   13ad0:	86 31       	cpi	r24, 0x16	; 22
   13ad2:	91 05       	cpc	r25, r1
   13ad4:	09 f4       	brne	.+2      	; 0x13ad8 <process_commands() [clone .part.46]+0x1b20>
   13ad6:	df c6       	rjmp	.+3518   	; 0x14896 <process_commands() [clone .part.46]+0x28de>
   13ad8:	47 97       	sbiw	r24, 0x17	; 23
   13ada:	09 f0       	breq	.+2      	; 0x13ade <process_commands() [clone .part.46]+0x1b26>
   13adc:	a2 cf       	rjmp	.-188    	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>

        M23 [filename]

    */
    case 23:
      card.openFileReadFilteredGcode(strchr_pointer + 4, true);
   13ade:	80 91 bb 04 	lds	r24, 0x04BB	; 0x8004bb <strchr_pointer>
   13ae2:	90 91 bc 04 	lds	r25, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
   13ae6:	61 e0       	ldi	r22, 0x01	; 1
   13ae8:	04 96       	adiw	r24, 0x04	; 4
   13aea:	0f 94 f3 71 	call	0x2e3e6	; 0x2e3e6 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]>
   13aee:	8f c6       	rjmp	.+3358   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   13af0:	8a 31       	cpi	r24, 0x1A	; 26
   13af2:	91 05       	cpc	r25, r1
   13af4:	09 f4       	brne	.+2      	; 0x13af8 <process_commands() [clone .part.46]+0x1b40>
   13af6:	22 c7       	rjmp	.+3652   	; 0x1493c <process_commands() [clone .part.46]+0x2984>
   13af8:	0c f0       	brlt	.+2      	; 0x13afc <process_commands() [clone .part.46]+0x1b44>
   13afa:	42 c7       	rjmp	.+3716   	; 0x14980 <process_commands() [clone .part.46]+0x29c8>
   13afc:	04 ec       	ldi	r16, 0xC4	; 196
   13afe:	12 e0       	ldi	r17, 0x02	; 2
   13b00:	f2 e4       	ldi	r31, 0x42	; 66
   13b02:	af 2e       	mov	r10, r31
   13b04:	f2 e0       	ldi	r31, 0x02	; 2
   13b06:	bf 2e       	mov	r11, r31
   13b08:	a4 e2       	ldi	r26, 0x24	; 36
   13b0a:	ca 2e       	mov	r12, r26
   13b0c:	a2 e0       	ldi	r26, 0x02	; 2
   13b0e:	da 2e       	mov	r13, r26
   13b10:	b8 e1       	ldi	r27, 0x18	; 24
   13b12:	eb 2e       	mov	r14, r27
   13b14:	b2 e0       	ldi	r27, 0x02	; 2
   13b16:	fb 2e       	mov	r15, r27
   13b18:	87 ec       	ldi	r24, 0xC7	; 199
   13b1a:	88 2e       	mov	r8, r24
   13b1c:	82 e0       	ldi	r24, 0x02	; 2
   13b1e:	98 2e       	mov	r9, r24
    case 125:
    case 601:
    {
        //Set new pause position for all three axis XYZ
        for (uint8_t axis = 0; axis < E_AXIS; axis++) {
          if (code_seen(axis_codes[axis])) {
   13b20:	f8 01       	movw	r30, r16
   13b22:	81 91       	ld	r24, Z+
   13b24:	8f 01       	movw	r16, r30
   13b26:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   13b2a:	88 23       	and	r24, r24
   13b2c:	21 f1       	breq	.+72     	; 0x13b76 <process_commands() [clone .part.46]+0x1bbe>
            //Check that the positions are within hardware limits
            pause_position[axis] = constrain(code_value(), min_pos[axis], max_pos[axis]);
   13b2e:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   13b32:	d6 01       	movw	r26, r12
   13b34:	4d 90       	ld	r4, X+
   13b36:	5d 90       	ld	r5, X+
   13b38:	6d 90       	ld	r6, X+
   13b3a:	7c 90       	ld	r7, X
   13b3c:	a3 01       	movw	r20, r6
   13b3e:	92 01       	movw	r18, r4
   13b40:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   13b44:	87 fd       	sbrc	r24, 7
   13b46:	11 c0       	rjmp	.+34     	; 0x13b6a <process_commands() [clone .part.46]+0x1bb2>
   13b48:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   13b4c:	f7 01       	movw	r30, r14
   13b4e:	40 80       	ld	r4, Z
   13b50:	51 80       	ldd	r5, Z+1	; 0x01
   13b52:	62 80       	ldd	r6, Z+2	; 0x02
   13b54:	73 80       	ldd	r7, Z+3	; 0x03
   13b56:	a3 01       	movw	r20, r6
   13b58:	92 01       	movw	r18, r4
   13b5a:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   13b5e:	18 16       	cp	r1, r24
   13b60:	24 f0       	brlt	.+8      	; 0x13b6a <process_commands() [clone .part.46]+0x1bb2>
   13b62:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   13b66:	2b 01       	movw	r4, r22
   13b68:	3c 01       	movw	r6, r24
   13b6a:	d5 01       	movw	r26, r10
   13b6c:	4d 92       	st	X+, r4
   13b6e:	5d 92       	st	X+, r5
   13b70:	6d 92       	st	X+, r6
   13b72:	7c 92       	st	X, r7
   13b74:	13 97       	sbiw	r26, 0x03	; 3
   13b76:	b4 e0       	ldi	r27, 0x04	; 4
   13b78:	ab 0e       	add	r10, r27
   13b7a:	b1 1c       	adc	r11, r1
   13b7c:	e4 e0       	ldi	r30, 0x04	; 4
   13b7e:	ce 0e       	add	r12, r30
   13b80:	d1 1c       	adc	r13, r1
   13b82:	f4 e0       	ldi	r31, 0x04	; 4
   13b84:	ef 0e       	add	r14, r31
   13b86:	f1 1c       	adc	r15, r1
    case 25:
    case 125:
    case 601:
    {
        //Set new pause position for all three axis XYZ
        for (uint8_t axis = 0; axis < E_AXIS; axis++) {
   13b88:	80 16       	cp	r8, r16
   13b8a:	91 06       	cpc	r9, r17
   13b8c:	49 f6       	brne	.-110    	; 0x13b20 <process_commands() [clone .part.46]+0x1b68>
            //Check that the positions are within hardware limits
            pause_position[axis] = constrain(code_value(), min_pos[axis], max_pos[axis]);
          }
        }
        //Set default or new pause position without pausing
        if (code_seen('S')) {
   13b8e:	83 e5       	ldi	r24, 0x53	; 83
   13b90:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   13b94:	88 23       	and	r24, r24
   13b96:	11 f4       	brne	.+4      	; 0x13b9c <process_commands() [clone .part.46]+0x1be4>
   13b98:	0c 94 f8 b4 	jmp	0x169f0	; 0x169f0 <process_commands() [clone .part.46]+0x4a38>
            if ( code_value_uint8() == 0 ) {
   13b9c:	0e 94 0a 56 	call	0xac14	; 0xac14 <code_value_uint8()>
   13ba0:	81 11       	cpse	r24, r1
   13ba2:	35 c6       	rjmp	.+3178   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
                pause_position[X_AXIS] = X_PAUSE_POS;
   13ba4:	80 e0       	ldi	r24, 0x00	; 0
   13ba6:	90 e0       	ldi	r25, 0x00	; 0
   13ba8:	a8 e4       	ldi	r26, 0x48	; 72
   13baa:	b2 e4       	ldi	r27, 0x42	; 66
   13bac:	80 93 42 02 	sts	0x0242, r24	; 0x800242 <_ZL14pause_position.lto_priv.491>
   13bb0:	90 93 43 02 	sts	0x0243, r25	; 0x800243 <_ZL14pause_position.lto_priv.491+0x1>
   13bb4:	a0 93 44 02 	sts	0x0244, r26	; 0x800244 <_ZL14pause_position.lto_priv.491+0x2>
   13bb8:	b0 93 45 02 	sts	0x0245, r27	; 0x800245 <_ZL14pause_position.lto_priv.491+0x3>
                pause_position[Y_AXIS] = Y_PAUSE_POS;
   13bbc:	80 e0       	ldi	r24, 0x00	; 0
   13bbe:	90 e0       	ldi	r25, 0x00	; 0
   13bc0:	ae e3       	ldi	r26, 0x3E	; 62
   13bc2:	b3 e4       	ldi	r27, 0x43	; 67
   13bc4:	80 93 46 02 	sts	0x0246, r24	; 0x800246 <_ZL14pause_position.lto_priv.491+0x4>
   13bc8:	90 93 47 02 	sts	0x0247, r25	; 0x800247 <_ZL14pause_position.lto_priv.491+0x5>
   13bcc:	a0 93 48 02 	sts	0x0248, r26	; 0x800248 <_ZL14pause_position.lto_priv.491+0x6>
   13bd0:	b0 93 49 02 	sts	0x0249, r27	; 0x800249 <_ZL14pause_position.lto_priv.491+0x7>
                pause_position[Z_AXIS] = Z_PAUSE_LIFT;
   13bd4:	80 e0       	ldi	r24, 0x00	; 0
   13bd6:	90 e0       	ldi	r25, 0x00	; 0
   13bd8:	a0 ea       	ldi	r26, 0xA0	; 160
   13bda:	b1 e4       	ldi	r27, 0x41	; 65
   13bdc:	80 93 4a 02 	sts	0x024A, r24	; 0x80024a <_ZL14pause_position.lto_priv.491+0x8>
   13be0:	90 93 4b 02 	sts	0x024B, r25	; 0x80024b <_ZL14pause_position.lto_priv.491+0x9>
   13be4:	a0 93 4c 02 	sts	0x024C, r26	; 0x80024c <_ZL14pause_position.lto_priv.491+0xa>
   13be8:	b0 93 4d 02 	sts	0x024D, r27	; 0x80024d <_ZL14pause_position.lto_priv.491+0xb>
   13bec:	10 c6       	rjmp	.+3104   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   13bee:	8c 32       	cpi	r24, 0x2C	; 44
   13bf0:	91 05       	cpc	r25, r1
   13bf2:	11 f4       	brne	.+4      	; 0x13bf8 <process_commands() [clone .part.46]+0x1c40>
   13bf4:	0c 94 ff a5 	jmp	0x14bfe	; 0x14bfe <process_commands() [clone .part.46]+0x2c46>
   13bf8:	0c f0       	brlt	.+2      	; 0x13bfc <process_commands() [clone .part.46]+0x1c44>
   13bfa:	8f c0       	rjmp	.+286    	; 0x13d1a <process_commands() [clone .part.46]+0x1d62>
   13bfc:	8f 31       	cpi	r24, 0x1F	; 31
   13bfe:	91 05       	cpc	r25, r1
   13c00:	09 f4       	brne	.+2      	; 0x13c04 <process_commands() [clone .part.46]+0x1c4c>
   13c02:	d3 c7       	rjmp	.+4006   	; 0x14baa <process_commands() [clone .part.46]+0x2bf2>
   13c04:	0c f0       	brlt	.+2      	; 0x13c08 <process_commands() [clone .part.46]+0x1c50>
   13c06:	52 c0       	rjmp	.+164    	; 0x13cac <process_commands() [clone .part.46]+0x1cf4>
   13c08:	8d 31       	cpi	r24, 0x1D	; 29
   13c0a:	91 05       	cpc	r25, r1
   13c0c:	09 f4       	brne	.+2      	; 0x13c10 <process_commands() [clone .part.46]+0x1c58>
   13c0e:	ff c5       	rjmp	.+3070   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
   13c10:	4e 97       	sbiw	r24, 0x1e	; 30
   13c12:	09 f0       	breq	.+2      	; 0x13c16 <process_commands() [clone .part.46]+0x1c5e>
   13c14:	06 cf       	rjmp	.-500    	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>

        M30 [filename]

    */
    case 30:
      if (card.mounted){
   13c16:	80 91 d8 13 	lds	r24, 0x13D8	; 0x8013d8 <card+0x3>
   13c1a:	88 23       	and	r24, r24
   13c1c:	09 f4       	brne	.+2      	; 0x13c20 <process_commands() [clone .part.46]+0x1c68>
   13c1e:	f7 c5       	rjmp	.+3054   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        card.closefile();
   13c20:	0f 94 f9 65 	call	0x2cbf2	; 0x2cbf2 <CardReader::closefile(bool) [clone .constprop.307]>
        card.removeFile(strchr_pointer + 4);
   13c24:	00 91 bb 04 	lds	r16, 0x04BB	; 0x8004bb <strchr_pointer>
   13c28:	10 91 bc 04 	lds	r17, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
   13c2c:	0c 5f       	subi	r16, 0xFC	; 252
   13c2e:	1f 4f       	sbci	r17, 0xFF	; 255
    }
}

void CardReader::removeFile(const char* name)
{
    if(!mounted) return;
   13c30:	80 91 d8 13 	lds	r24, 0x13D8	; 0x8013d8 <card+0x3>
   13c34:	88 23       	and	r24, r24
   13c36:	09 f4       	brne	.+2      	; 0x13c3a <process_commands() [clone .part.46]+0x1c82>
   13c38:	ea c5       	rjmp	.+3028   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    file.close();
   13c3a:	87 e6       	ldi	r24, 0x67	; 103
   13c3c:	96 e1       	ldi	r25, 0x16	; 22
   13c3e:	0f 94 e9 2e 	call	0x25dd2	; 0x25dd2 <SdBaseFile::close()>
    sdprinting = false;
   13c42:	10 92 d7 13 	sts	0x13D7, r1	; 0x8013d7 <card+0x2>

    const char *fname=name;
   13c46:	1d a3       	std	Y+37, r17	; 0x25
   13c48:	0c a3       	std	Y+36, r16	; 0x24
    if (!diveSubfolder(fname))
   13c4a:	ce 01       	movw	r24, r28
   13c4c:	84 96       	adiw	r24, 0x24	; 36
   13c4e:	0f 94 6e 71 	call	0x2e2dc	; 0x2e2dc <CardReader::diveSubfolder(char const*&) [clone .constprop.198]>
   13c52:	88 23       	and	r24, r24
   13c54:	09 f4       	brne	.+2      	; 0x13c58 <process_commands() [clone .part.46]+0x1ca0>
   13c56:	db c5       	rjmp	.+2998   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
      return;

    if (file.remove(curDir, fname))
   13c58:	4c a1       	ldd	r20, Y+36	; 0x24
   13c5a:	5d a1       	ldd	r21, Y+37	; 0x25
   13c5c:	60 91 80 14 	lds	r22, 0x1480	; 0x801480 <card+0xab>
   13c60:	70 91 81 14 	lds	r23, 0x1481	; 0x801481 <card+0xac>
 * \brief Base class for SdFile with Print and C++ streams.
 */
class SdBaseFile {
 public:
  /** Create an instance. */
  SdBaseFile() : writeError(false), type_(FAT_FILE_TYPE_CLOSED) {}
   13c64:	19 82       	std	Y+1, r1	; 0x01
   13c66:	1c 82       	std	Y+4, r1	; 0x04
 * \a dirFile is not a directory, \a path is not found
 * or an I/O error occurred.
 */
bool SdBaseFile::remove(SdBaseFile* dirFile, const char* path) {
  SdBaseFile file;
  if (!file.open(dirFile, path, O_WRITE)) goto fail;
   13c68:	22 e0       	ldi	r18, 0x02	; 2
   13c6a:	ce 01       	movw	r24, r28
   13c6c:	01 96       	adiw	r24, 0x01	; 1
   13c6e:	0f 94 c5 54 	call	0x2a98a	; 0x2a98a <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)>
   13c72:	81 11       	cpse	r24, r1
   13c74:	fb c6       	rjmp	.+3574   	; 0x14a6c <process_commands() [clone .part.46]+0x2ab4>
  return file.remove();

 fail:
  // can't set iostate - static function
  return false;
   13c76:	10 e0       	ldi	r17, 0x00	; 0
 * Reasons for failure include the file is a directory, is read only,
 * \a dirFile is not a directory, \a path is not found
 * or an I/O error occurred.
 */
bool SdBaseFile::remove(SdBaseFile* dirFile, const char* path) {
  SdBaseFile file;
   13c78:	ce 01       	movw	r24, r28
   13c7a:	01 96       	adiw	r24, 0x01	; 1
   13c7c:	0e 94 ab 79 	call	0xf356	; 0xf356 <SdBaseFile::~SdBaseFile()>
   13c80:	11 23       	and	r17, r17
   13c82:	09 f4       	brne	.+2      	; 0x13c86 <process_commands() [clone .part.46]+0x1cce>
   13c84:	0a c7       	rjmp	.+3604   	; 0x14a9a <process_commands() [clone .part.46]+0x2ae2>
    {
      SERIAL_PROTOCOLPGM("File deleted:");
   13c86:	8c e1       	ldi	r24, 0x1C	; 28
   13c88:	9e e7       	ldi	r25, 0x7E	; 126
   13c8a:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
      SERIAL_PROTOCOLLN(fname);
   13c8e:	8c a1       	ldd	r24, Y+36	; 0x24
   13c90:	9d a1       	ldd	r25, Y+37	; 0x25
   13c92:	0e 94 a1 87 	call	0x10f42	; 0x10f42 <MarlinSerial::println(char const*)>
      sdpos = 0;
   13c96:	10 92 eb 16 	sts	0x16EB, r1	; 0x8016eb <card+0x316>
   13c9a:	10 92 ec 16 	sts	0x16EC, r1	; 0x8016ec <card+0x317>
   13c9e:	10 92 ed 16 	sts	0x16ED, r1	; 0x8016ed <card+0x318>
   13ca2:	10 92 ee 16 	sts	0x16EE, r1	; 0x8016ee <card+0x319>
	  #ifdef SDCARD_SORT_ALPHA
		  presort();
   13ca6:	0f 94 32 6f 	call	0x2de64	; 0x2de64 <CardReader::presort() [clone .constprop.194]>
   13caa:	b1 c5       	rjmp	.+2914   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   13cac:	80 32       	cpi	r24, 0x20	; 32
   13cae:	91 05       	cpc	r25, r1
   13cb0:	09 f4       	brne	.+2      	; 0x13cb4 <process_commands() [clone .part.46]+0x1cfc>
   13cb2:	01 c7       	rjmp	.+3586   	; 0x14ab6 <process_commands() [clone .part.46]+0x2afe>
   13cb4:	8a 97       	sbiw	r24, 0x2a	; 42
   13cb6:	09 f0       	breq	.+2      	; 0x13cba <process_commands() [clone .part.46]+0x1d02>
   13cb8:	b4 ce       	rjmp	.-664    	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>
    #### Parameters
    - `P` - Pin number.
    - `S` - Pin value. If the pin is analog, values are from 0 to 255. If the pin is digital, values are from 0 to 1.
    */
    case 42:
      if (code_seen('S'))
   13cba:	83 e5       	ldi	r24, 0x53	; 83
   13cbc:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   13cc0:	88 23       	and	r24, r24
   13cc2:	09 f4       	brne	.+2      	; 0x13cc6 <process_commands() [clone .part.46]+0x1d0e>
   13cc4:	a4 c5       	rjmp	.+2888   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
      {
        uint8_t pin_status = code_value_uint8();
   13cc6:	0e 94 0a 56 	call	0xac14	; 0xac14 <code_value_uint8()>
   13cca:	08 2f       	mov	r16, r24
        int8_t pin_number = LED_PIN;
        if (code_seen('P'))
   13ccc:	80 e5       	ldi	r24, 0x50	; 80
   13cce:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
    */
    case 42:
      if (code_seen('S'))
      {
        uint8_t pin_status = code_value_uint8();
        int8_t pin_number = LED_PIN;
   13cd2:	1d e0       	ldi	r17, 0x0D	; 13
        if (code_seen('P'))
   13cd4:	88 23       	and	r24, r24
   13cd6:	19 f0       	breq	.+6      	; 0x13cde <process_commands() [clone .part.46]+0x1d26>
          pin_number = code_value_uint8();
   13cd8:	0e 94 0a 56 	call	0xac14	; 0xac14 <code_value_uint8()>
   13cdc:	18 2f       	mov	r17, r24
   13cde:	ea e6       	ldi	r30, 0x6A	; 106
   13ce0:	f0 e8       	ldi	r31, 0x80	; 128
        for(int8_t i = 0; i < (int8_t)(sizeof(sensitive_pins)/sizeof(sensitive_pins[0])); i++)
        {
          if ((int8_t)pgm_read_byte(&sensitive_pins[i]) == pin_number)
   13ce2:	84 91       	lpm	r24, Z
   13ce4:	81 17       	cp	r24, r17
   13ce6:	09 f4       	brne	.+2      	; 0x13cea <process_commands() [clone .part.46]+0x1d32>
   13ce8:	92 c5       	rjmp	.+2852   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
   13cea:	31 96       	adiw	r30, 0x01	; 1
      {
        uint8_t pin_status = code_value_uint8();
        int8_t pin_number = LED_PIN;
        if (code_seen('P'))
          pin_number = code_value_uint8();
        for(int8_t i = 0; i < (int8_t)(sizeof(sensitive_pins)/sizeof(sensitive_pins[0])); i++)
   13cec:	30 e8       	ldi	r19, 0x80	; 128
   13cee:	e6 38       	cpi	r30, 0x86	; 134
   13cf0:	f3 07       	cpc	r31, r19
   13cf2:	b9 f7       	brne	.-18     	; 0x13ce2 <process_commands() [clone .part.46]+0x1d2a>
            pin_number = -1;
            break;
          }
        }
      #if defined(FAN_PIN) && FAN_PIN > -1
        if (pin_number == FAN_PIN)
   13cf4:	16 30       	cpi	r17, 0x06	; 6
   13cf6:	09 f0       	breq	.+2      	; 0x13cfa <process_commands() [clone .part.46]+0x1d42>
   13cf8:	7f c7       	rjmp	.+3838   	; 0x14bf8 <process_commands() [clone .part.46]+0x2c40>
          fanSpeed = pin_status;
   13cfa:	00 93 55 12 	sts	0x1255, r16	; 0x801255 <fanSpeed>
      #endif
        if (pin_number > -1)
        {
          pinMode(pin_number, OUTPUT);
   13cfe:	61 e0       	ldi	r22, 0x01	; 1
   13d00:	81 2f       	mov	r24, r17
   13d02:	0e 94 3d d3 	call	0x1a67a	; 0x1a67a <pinMode>
          digitalWrite(pin_number, pin_status);
   13d06:	60 2f       	mov	r22, r16
   13d08:	81 2f       	mov	r24, r17
   13d0a:	0e 94 0f d3 	call	0x1a61e	; 0x1a61e <digitalWrite>
          analogWrite(pin_number, pin_status);
   13d0e:	60 2f       	mov	r22, r16
   13d10:	70 e0       	ldi	r23, 0x00	; 0
   13d12:	81 2f       	mov	r24, r17
   13d14:	0e 94 6e d3 	call	0x1a6dc	; 0x1a6dc <analogWrite>
   13d18:	7a c5       	rjmp	.+2804   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   13d1a:	8f 32       	cpi	r24, 0x2F	; 47
   13d1c:	91 05       	cpc	r25, r1
   13d1e:	09 f4       	brne	.+2      	; 0x13d22 <process_commands() [clone .part.46]+0x1d6a>
   13d20:	97 c7       	rjmp	.+3886   	; 0x14c50 <process_commands() [clone .part.46]+0x2c98>
   13d22:	5c f5       	brge	.+86     	; 0x13d7a <process_commands() [clone .part.46]+0x1dc2>
   13d24:	8d 32       	cpi	r24, 0x2D	; 45
   13d26:	91 05       	cpc	r25, r1
   13d28:	09 f4       	brne	.+2      	; 0x13d2c <process_commands() [clone .part.46]+0x1d74>
   13d2a:	82 c7       	rjmp	.+3844   	; 0x14c30 <process_commands() [clone .part.46]+0x2c78>
   13d2c:	8e 97       	sbiw	r24, 0x2e	; 46
   13d2e:	09 f0       	breq	.+2      	; 0x13d32 <process_commands() [clone .part.46]+0x1d7a>
   13d30:	78 ce       	rjmp	.-784    	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>
    ### M46 - Show the assigned IP address <a href="https://reprap.org/wiki/G-code#M46:_Show_the_assigned_IP_address">M46: Show the assigned IP address.</a>
    */
    case 46:
    {
        // M46: Prusa3D: Show the assigned IP address.
        if (card.ToshibaFlashAir_isEnabled()) {
   13d32:	80 91 48 16 	lds	r24, 0x1648	; 0x801648 <card+0x273>
   13d36:	88 23       	and	r24, r24
   13d38:	09 f4       	brne	.+2      	; 0x13d3c <process_commands() [clone .part.46]+0x1d84>
   13d3a:	85 c7       	rjmp	.+3850   	; 0x14c46 <process_commands() [clone .part.46]+0x2c8e>
            uint8_t ip[4];
            if (card.ToshibaFlashAir_GetIP(ip)) {
   13d3c:	ce 01       	movw	r24, r28
   13d3e:	01 96       	adiw	r24, 0x01	; 1
   13d40:	0f 94 77 78 	call	0x2f0ee	; 0x2f0ee <CardReader::ToshibaFlashAir_GetIP(unsigned char*) [clone .constprop.147]>
   13d44:	88 23       	and	r24, r24
   13d46:	09 f4       	brne	.+2      	; 0x13d4a <process_commands() [clone .part.46]+0x1d92>
   13d48:	79 c7       	rjmp	.+3826   	; 0x14c3c <process_commands() [clone .part.46]+0x2c84>
  }
}

void MarlinSerial::print(unsigned long n, int base)
{
  if (base == 0) write(n);
   13d4a:	89 81       	ldd	r24, Y+1	; 0x01
   13d4c:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
}

void MarlinSerial::print(long n, int base)
{
  if (base == 0) {
    write(n);
   13d50:	8e e2       	ldi	r24, 0x2E	; 46
   13d52:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
  }
}

void MarlinSerial::print(unsigned long n, int base)
{
  if (base == 0) write(n);
   13d56:	8a 81       	ldd	r24, Y+2	; 0x02
   13d58:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
}

void MarlinSerial::print(long n, int base)
{
  if (base == 0) {
    write(n);
   13d5c:	8e e2       	ldi	r24, 0x2E	; 46
   13d5e:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
  }
}

void MarlinSerial::print(unsigned long n, int base)
{
  if (base == 0) write(n);
   13d62:	8b 81       	ldd	r24, Y+3	; 0x03
   13d64:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
}

void MarlinSerial::print(long n, int base)
{
  if (base == 0) {
    write(n);
   13d68:	8e e2       	ldi	r24, 0x2E	; 46
   13d6a:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
  }
}

void MarlinSerial::print(unsigned long n, int base)
{
  if (base == 0) write(n);
   13d6e:	8c 81       	ldd	r24, Y+4	; 0x04
   13d70:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
}

void MarlinSerial::println(unsigned char b, int base)
{
  print(b, base);
  println();
   13d74:	0e 94 bc 7a 	call	0xf578	; 0xf578 <MarlinSerial::println()>
   13d78:	4a c5       	rjmp	.+2708   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   13d7a:	89 34       	cpi	r24, 0x49	; 73
   13d7c:	91 05       	cpc	r25, r1
   13d7e:	09 f4       	brne	.+2      	; 0x13d82 <process_commands() [clone .part.46]+0x1dca>
   13d80:	90 c7       	rjmp	.+3872   	; 0x14ca2 <process_commands() [clone .part.46]+0x2cea>
   13d82:	8b 34       	cpi	r24, 0x4B	; 75
   13d84:	91 05       	cpc	r25, r1
   13d86:	11 f4       	brne	.+4      	; 0x13d8c <process_commands() [clone .part.46]+0x1dd4>
   13d88:	0c 94 f1 a6 	jmp	0x14de2	; 0x14de2 <process_commands() [clone .part.46]+0x2e2a>
   13d8c:	88 34       	cpi	r24, 0x48	; 72
   13d8e:	91 05       	cpc	r25, r1
   13d90:	09 f0       	breq	.+2      	; 0x13d94 <process_commands() [clone .part.46]+0x1ddc>
   13d92:	47 ce       	rjmp	.-882    	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>
    #### Parameters
        - `Snnn` - Set printer state 0 = not_ready, 1 = ready
    */
    case 72:
    {
        if(code_seen('S')){
   13d94:	83 e5       	ldi	r24, 0x53	; 83
   13d96:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   13d9a:	88 23       	and	r24, r24
   13d9c:	09 f4       	brne	.+2      	; 0x13da0 <process_commands() [clone .part.46]+0x1de8>
   13d9e:	72 c7       	rjmp	.+3812   	; 0x14c84 <process_commands() [clone .part.46]+0x2ccc>
            switch (code_value_uint8()){
   13da0:	0e 94 0a 56 	call	0xac14	; 0xac14 <code_value_uint8()>
   13da4:	88 23       	and	r24, r24
   13da6:	09 f4       	brne	.+2      	; 0x13daa <process_commands() [clone .part.46]+0x1df2>
   13da8:	6a c7       	rjmp	.+3796   	; 0x14c7e <process_commands() [clone .part.46]+0x2cc6>
   13daa:	81 30       	cpi	r24, 0x01	; 1
   13dac:	09 f0       	breq	.+2      	; 0x13db0 <process_commands() [clone .part.46]+0x1df8>
   13dae:	2f c5       	rjmp	.+2654   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
   13db0:	80 93 61 0d 	sts	0x0D61, r24	; 0x800d61 <_ZL13printer_state.lto_priv.386>
   13db4:	2c c5       	rjmp	.+2648   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   13db6:	8b 36       	cpi	r24, 0x6B	; 107
   13db8:	91 05       	cpc	r25, r1
   13dba:	11 f4       	brne	.+4      	; 0x13dc0 <process_commands() [clone .part.46]+0x1e08>
   13dbc:	0c 94 b0 a8 	jmp	0x15160	; 0x15160 <process_commands() [clone .part.46]+0x31a8>
   13dc0:	0c f0       	brlt	.+2      	; 0x13dc4 <process_commands() [clone .part.46]+0x1e0c>
   13dc2:	ab c0       	rjmp	.+342    	; 0x13f1a <process_commands() [clone .part.46]+0x1f62>
   13dc4:	84 35       	cpi	r24, 0x54	; 84
   13dc6:	91 05       	cpc	r25, r1
   13dc8:	11 f4       	brne	.+4      	; 0x13dce <process_commands() [clone .part.46]+0x1e16>
   13dca:	0c 94 b9 a8 	jmp	0x15172	; 0x15172 <process_commands() [clone .part.46]+0x31ba>
   13dce:	0c f0       	brlt	.+2      	; 0x13dd2 <process_commands() [clone .part.46]+0x1e1a>
   13dd0:	5d c0       	rjmp	.+186    	; 0x13e8c <process_commands() [clone .part.46]+0x1ed4>
   13dd2:	8f 34       	cpi	r24, 0x4F	; 79
   13dd4:	91 05       	cpc	r25, r1
   13dd6:	11 f4       	brne	.+4      	; 0x13ddc <process_commands() [clone .part.46]+0x1e24>
   13dd8:	0c 94 3f a7 	jmp	0x14e7e	; 0x14e7e <process_commands() [clone .part.46]+0x2ec6>
   13ddc:	0c f0       	brlt	.+2      	; 0x13de0 <process_commands() [clone .part.46]+0x1e28>
   13dde:	47 c0       	rjmp	.+142    	; 0x13e6e <process_commands() [clone .part.46]+0x1eb6>
   13de0:	8d 34       	cpi	r24, 0x4D	; 77
   13de2:	91 05       	cpc	r25, r1
   13de4:	11 f4       	brne	.+4      	; 0x13dea <process_commands() [clone .part.46]+0x1e32>
   13de6:	0c 94 0a a7 	jmp	0x14e14	; 0x14e14 <process_commands() [clone .part.46]+0x2e5c>
   13dea:	8e 34       	cpi	r24, 0x4E	; 78
   13dec:	91 05       	cpc	r25, r1
   13dee:	09 f0       	breq	.+2      	; 0x13df2 <process_commands() [clone .part.46]+0x1e3a>
   13df0:	18 ce       	rjmp	.-976    	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>
        const char *_m_fil;
        const char *_m_time;
        uint32_t _cm = 0;
        uint32_t _min = 0;

        if (printJobOngoing()) {
   13df2:	0e 94 40 66 	call	0xcc80	; 0xcc80 <printJobOngoing()>
   13df6:	88 23       	and	r24, r24
   13df8:	11 f4       	brne	.+4      	; 0x13dfe <process_commands() [clone .part.46]+0x1e46>
   13dfa:	0c 94 0f a7 	jmp	0x14e1e	; 0x14e1e <process_commands() [clone .part.46]+0x2e66>
          _m_fil = _O(MSG_FILAMENT_USED);
          _m_time = _O(MSG_PRINT_TIME);
          _cm = (uint32_t)total_filament_used / 1000;
   13dfe:	60 91 17 06 	lds	r22, 0x0617	; 0x800617 <total_filament_used>
   13e02:	70 91 18 06 	lds	r23, 0x0618	; 0x800618 <total_filament_used+0x1>
   13e06:	80 91 19 06 	lds	r24, 0x0619	; 0x800619 <total_filament_used+0x2>
   13e0a:	90 91 1a 06 	lds	r25, 0x061A	; 0x80061a <total_filament_used+0x3>
   13e0e:	28 ee       	ldi	r18, 0xE8	; 232
   13e10:	33 e0       	ldi	r19, 0x03	; 3
   13e12:	40 e0       	ldi	r20, 0x00	; 0
   13e14:	50 e0       	ldi	r21, 0x00	; 0
   13e16:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
   13e1a:	12 2f       	mov	r17, r18
   13e1c:	03 2f       	mov	r16, r19
   13e1e:	f4 2e       	mov	r15, r20
   13e20:	e5 2e       	mov	r14, r21
          _min = print_job_timer.duration() / 60;
   13e22:	0f 94 6d 17 	call	0x22eda	; 0x22eda <Stopwatch::duration()>
   13e26:	2c e3       	ldi	r18, 0x3C	; 60
   13e28:	30 e0       	ldi	r19, 0x00	; 0
   13e2a:	40 e0       	ldi	r20, 0x00	; 0
   13e2c:	50 e0       	ldi	r21, 0x00	; 0
   13e2e:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
   13e32:	b9 01       	movw	r22, r18
   13e34:	ca 01       	movw	r24, r20
        uint32_t _cm = 0;
        uint32_t _min = 0;

        if (printJobOngoing()) {
          _m_fil = _O(MSG_FILAMENT_USED);
          _m_time = _O(MSG_PRINT_TIME);
   13e36:	41 ed       	ldi	r20, 0xD1	; 209
   13e38:	58 e5       	ldi	r21, 0x58	; 88
        const char *_m_time;
        uint32_t _cm = 0;
        uint32_t _min = 0;

        if (printJobOngoing()) {
          _m_fil = _O(MSG_FILAMENT_USED);
   13e3a:	21 ec       	ldi	r18, 0xC1	; 193
   13e3c:	38 e5       	ldi	r19, 0x58	; 88
          _m_fil = _O(MSG_TOTAL_FILAMENT);
          _m_time = _O(MSG_TOTAL_PRINT_TIME);
          _cm = eeprom_read_dword((uint32_t *)EEPROM_FILAMENTUSED);
          _min = eeprom_read_dword((uint32_t *)EEPROM_TOTALTIME);
        }
        printf_P(_N("%S:%lu cm\n%S:%lu min\n"),_m_fil,_cm,_m_time,_min);
   13e3e:	9f 93       	push	r25
   13e40:	8f 93       	push	r24
   13e42:	7f 93       	push	r23
   13e44:	6f 93       	push	r22
   13e46:	5f 93       	push	r21
   13e48:	4f 93       	push	r20
   13e4a:	ef 92       	push	r14
   13e4c:	ff 92       	push	r15
   13e4e:	0f 93       	push	r16
   13e50:	1f 93       	push	r17
   13e52:	3f 93       	push	r19
   13e54:	2f 93       	push	r18
   13e56:	81 eb       	ldi	r24, 0xB1	; 177
   13e58:	95 e6       	ldi	r25, 0x65	; 101
   13e5a:	9f 93       	push	r25
   13e5c:	8f 93       	push	r24
   13e5e:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   13e62:	0f b6       	in	r0, 0x3f	; 63
   13e64:	f8 94       	cli
   13e66:	de bf       	out	0x3e, r29	; 62
   13e68:	0f be       	out	0x3f, r0	; 63
   13e6a:	cd bf       	out	0x3d, r28	; 61
   13e6c:	d0 c4       	rjmp	.+2464   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   13e6e:	82 35       	cpi	r24, 0x52	; 82
   13e70:	91 05       	cpc	r25, r1
   13e72:	11 f4       	brne	.+4      	; 0x13e78 <process_commands() [clone .part.46]+0x1ec0>
   13e74:	0c 94 b3 a8 	jmp	0x15166	; 0x15166 <process_commands() [clone .part.46]+0x31ae>
   13e78:	83 35       	cpi	r24, 0x53	; 83
   13e7a:	91 05       	cpc	r25, r1
   13e7c:	09 f0       	breq	.+2      	; 0x13e80 <process_commands() [clone .part.46]+0x1ec8>
   13e7e:	d1 cd       	rjmp	.-1118   	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>
    /*!
    ### M83 - Set E axis to relative mode <a href="https://reprap.org/wiki/G-code#M83:_Set_extruder_to_relative_mode">M83: Set extruder to relative mode</a>
    Makes the extruder interpret extrusion values as relative positions.
    */
    case 83:
      axis_relative_modes |= E_AXIS_MASK;
   13e80:	80 91 57 12 	lds	r24, 0x1257	; 0x801257 <axis_relative_modes>
   13e84:	88 60       	ori	r24, 0x08	; 8
   13e86:	80 93 57 12 	sts	0x1257, r24	; 0x801257 <axis_relative_modes>
   13e8a:	c1 c4       	rjmp	.+2434   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   13e8c:	8c 35       	cpi	r24, 0x5C	; 92
   13e8e:	91 05       	cpc	r25, r1
   13e90:	11 f4       	brne	.+4      	; 0x13e96 <process_commands() [clone .part.46]+0x1ede>
   13e92:	0c 94 22 a9 	jmp	0x15244	; 0x15244 <process_commands() [clone .part.46]+0x328c>
   13e96:	34 f5       	brge	.+76     	; 0x13ee4 <process_commands() [clone .part.46]+0x1f2c>
   13e98:	85 35       	cpi	r24, 0x55	; 85
   13e9a:	91 05       	cpc	r25, r1
   13e9c:	11 f4       	brne	.+4      	; 0x13ea2 <process_commands() [clone .part.46]+0x1eea>
   13e9e:	0c 94 09 a9 	jmp	0x15212	; 0x15212 <process_commands() [clone .part.46]+0x325a>
   13ea2:	86 35       	cpi	r24, 0x56	; 86
   13ea4:	91 05       	cpc	r25, r1
   13ea6:	09 f0       	breq	.+2      	; 0x13eaa <process_commands() [clone .part.46]+0x1ef2>
   13ea8:	bc cd       	rjmp	.-1160   	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>

    #### Parameters
    - `S` - specifies the time in seconds. If a value of 0 is specified, the timer is disabled.
    */
	case 86:
	  if (code_seen('S')) {
   13eaa:	83 e5       	ldi	r24, 0x53	; 83
   13eac:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   13eb0:	88 23       	and	r24, r24
   13eb2:	09 f4       	brne	.+2      	; 0x13eb6 <process_commands() [clone .part.46]+0x1efe>
   13eb4:	ac c4       	rjmp	.+2392   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	    safetytimer_inactive_time = code_value() * 1000;
   13eb6:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   13eba:	20 e0       	ldi	r18, 0x00	; 0
   13ebc:	30 e0       	ldi	r19, 0x00	; 0
   13ebe:	4a e7       	ldi	r20, 0x7A	; 122
   13ec0:	54 e4       	ldi	r21, 0x44	; 68
   13ec2:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   13ec6:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   13eca:	60 93 33 02 	sts	0x0233, r22	; 0x800233 <safetytimer_inactive_time>
   13ece:	70 93 34 02 	sts	0x0234, r23	; 0x800234 <safetytimer_inactive_time+0x1>
   13ed2:	80 93 35 02 	sts	0x0235, r24	; 0x800235 <safetytimer_inactive_time+0x2>
   13ed6:	90 93 36 02 	sts	0x0236, r25	; 0x800236 <safetytimer_inactive_time+0x3>
		safetyTimer.start();
   13eda:	8d ea       	ldi	r24, 0xAD	; 173
   13edc:	95 e0       	ldi	r25, 0x05	; 5
   13ede:	0f 94 47 10 	call	0x2208e	; 0x2208e <Timer<unsigned long>::start()>
   13ee2:	95 c4       	rjmp	.+2346   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   13ee4:	89 36       	cpi	r24, 0x69	; 105
   13ee6:	91 05       	cpc	r25, r1
   13ee8:	11 f4       	brne	.+4      	; 0x13eee <process_commands() [clone .part.46]+0x1f36>
   13eea:	0c 94 92 a7 	jmp	0x14f24	; 0x14f24 <process_commands() [clone .part.46]+0x2f6c>
   13eee:	14 f0       	brlt	.+4      	; 0x13ef4 <process_commands() [clone .part.46]+0x1f3c>
   13ef0:	0c 94 a2 a8 	jmp	0x15144	; 0x15144 <process_commands() [clone .part.46]+0x318c>
   13ef4:	88 36       	cpi	r24, 0x68	; 104
   13ef6:	91 05       	cpc	r25, r1
   13ef8:	09 f0       	breq	.+2      	; 0x13efc <process_commands() [clone .part.46]+0x1f44>
   13efa:	93 cd       	rjmp	.-1242   	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>
  #### Parameters
       - `S` - Target temperature
    */
    case 104: // M104
    {
          if (code_seen('S'))
   13efc:	83 e5       	ldi	r24, 0x53	; 83
   13efe:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   13f02:	88 23       	and	r24, r24
   13f04:	09 f4       	brne	.+2      	; 0x13f08 <process_commands() [clone .part.46]+0x1f50>
   13f06:	83 c4       	rjmp	.+2310   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
          {
              setTargetHotend(code_value());
   13f08:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
  return target_temperature_bed;
};

// Doesn't save FLASH when FORCE_INLINE removed.
FORCE_INLINE void setTargetHotend(const float &celsius) {
  target_temperature[0] = celsius;
   13f0c:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   13f10:	70 93 5e 12 	sts	0x125E, r23	; 0x80125e <target_temperature+0x1>
   13f14:	60 93 5d 12 	sts	0x125D, r22	; 0x80125d <target_temperature>
   13f18:	7a c4       	rjmp	.+2292   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   13f1a:	85 37       	cpi	r24, 0x75	; 117
   13f1c:	91 05       	cpc	r25, r1
   13f1e:	11 f4       	brne	.+4      	; 0x13f24 <process_commands() [clone .part.46]+0x1f6c>
   13f20:	0c 94 a2 aa 	jmp	0x15544	; 0x15544 <process_commands() [clone .part.46]+0x358c>
   13f24:	bc f5       	brge	.+110    	; 0x13f94 <process_commands() [clone .part.46]+0x1fdc>
   13f26:	80 37       	cpi	r24, 0x70	; 112
   13f28:	91 05       	cpc	r25, r1
   13f2a:	09 f4       	brne	.+2      	; 0x13f2e <process_commands() [clone .part.46]+0x1f76>
   13f2c:	e8 c7       	rjmp	.+4048   	; 0x14efe <process_commands() [clone .part.46]+0x2f46>
   13f2e:	d4 f4       	brge	.+52     	; 0x13f64 <process_commands() [clone .part.46]+0x1fac>
   13f30:	8d 36       	cpi	r24, 0x6D	; 109
   13f32:	91 05       	cpc	r25, r1
   13f34:	11 f4       	brne	.+4      	; 0x13f3a <process_commands() [clone .part.46]+0x1f82>
   13f36:	0c 94 be a7 	jmp	0x14f7c	; 0x14f7c <process_commands() [clone .part.46]+0x2fc4>
   13f3a:	8e 36       	cpi	r24, 0x6E	; 110
   13f3c:	91 05       	cpc	r25, r1
   13f3e:	09 f0       	breq	.+2      	; 0x13f42 <process_commands() [clone .part.46]+0x1f8a>
   13f40:	70 cd       	rjmp	.-1312   	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>

    #### Parameters
    - `N` - Line number
    */
    case 110:
      if (code_seen('N'))
   13f42:	8e e4       	ldi	r24, 0x4E	; 78
   13f44:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   13f48:	88 23       	and	r24, r24
   13f4a:	09 f4       	brne	.+2      	; 0x13f4e <process_commands() [clone .part.46]+0x1f96>
   13f4c:	60 c4       	rjmp	.+2240   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	    gcode_LastN = code_value_long();
   13f4e:	0e 94 5d 56 	call	0xacba	; 0xacba <code_value_long() [clone .lto_priv.507]>
   13f52:	60 93 3e 12 	sts	0x123E, r22	; 0x80123e <gcode_LastN>
   13f56:	70 93 3f 12 	sts	0x123F, r23	; 0x80123f <gcode_LastN+0x1>
   13f5a:	80 93 40 12 	sts	0x1240, r24	; 0x801240 <gcode_LastN+0x2>
   13f5e:	90 93 41 12 	sts	0x1241, r25	; 0x801241 <gcode_LastN+0x3>
   13f62:	55 c4       	rjmp	.+2218   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   13f64:	82 37       	cpi	r24, 0x72	; 114
   13f66:	91 05       	cpc	r25, r1
   13f68:	11 f4       	brne	.+4      	; 0x13f6e <process_commands() [clone .part.46]+0x1fb6>
   13f6a:	0c 94 9f aa 	jmp	0x1553e	; 0x1553e <process_commands() [clone .part.46]+0x3586>
   13f6e:	14 f4       	brge	.+4      	; 0x13f74 <process_commands() [clone .part.46]+0x1fbc>
   13f70:	0c 94 ac a9 	jmp	0x15358	; 0x15358 <process_commands() [clone .part.46]+0x33a0>
   13f74:	83 37       	cpi	r24, 0x73	; 115
   13f76:	91 05       	cpc	r25, r1
   13f78:	09 f0       	breq	.+2      	; 0x13f7c <process_commands() [clone .part.46]+0x1fc4>
   13f7a:	53 cd       	rjmp	.-1370   	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>
    #### Parameters
    - V - Report current installed firmware version
    - U - Firmware version provided by G-code to be compared to current one.
    */
	case 115: // M115
      if (code_seen('V')) {
   13f7c:	86 e5       	ldi	r24, 0x56	; 86
   13f7e:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   13f82:	88 23       	and	r24, r24
   13f84:	11 f4       	brne	.+4      	; 0x13f8a <process_commands() [clone .part.46]+0x1fd2>
   13f86:	0c 94 cb a9 	jmp	0x15396	; 0x15396 <process_commands() [clone .part.46]+0x33de>
          // Report the Prusa version number.
          SERIAL_PROTOCOLLNRPGM(FW_VERSION_STR_P());
   13f8a:	8c ee       	ldi	r24, 0xEC	; 236
   13f8c:	98 e8       	ldi	r25, 0x88	; 136
   13f8e:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   13f92:	3d c4       	rjmp	.+2170   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   13f94:	8b 37       	cpi	r24, 0x7B	; 123
   13f96:	91 05       	cpc	r25, r1
   13f98:	11 f4       	brne	.+4      	; 0x13f9e <process_commands() [clone .part.46]+0x1fe6>
   13f9a:	0c 94 fa aa 	jmp	0x155f4	; 0x155f4 <process_commands() [clone .part.46]+0x363c>
   13f9e:	0c f0       	brlt	.+2      	; 0x13fa2 <process_commands() [clone .part.46]+0x1fea>
   13fa0:	48 c0       	rjmp	.+144    	; 0x14032 <process_commands() [clone .part.46]+0x207a>
   13fa2:	86 37       	cpi	r24, 0x76	; 118
   13fa4:	91 05       	cpc	r25, r1
   13fa6:	11 f4       	brne	.+4      	; 0x13fac <process_commands() [clone .part.46]+0x1ff4>
   13fa8:	0c 94 b2 aa 	jmp	0x15564	; 0x15564 <process_commands() [clone .part.46]+0x35ac>
   13fac:	87 37       	cpi	r24, 0x77	; 119
   13fae:	91 05       	cpc	r25, r1
   13fb0:	09 f0       	breq	.+2      	; 0x13fb4 <process_commands() [clone .part.46]+0x1ffc>
   13fb2:	37 cd       	rjmp	.-1426   	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>
    /*!
    ### M119 - Get endstop states <a href="https://reprap.org/wiki/G-code#M119:_Get_Endstop_Status">M119: Get Endstop Status</a>
    Returns the current state of the configured X, Y, Z endstops. Takes into account any 'inverted endstop' settings, so one can confirm that the machine is interpreting the endstops correctly.
    */
    case 119:
    SERIAL_PROTOCOLRPGM(_N("Reporting endstop status"));////MSG_M119_REPORT
   13fb4:	8e e5       	ldi	r24, 0x5E	; 94
   13fb6:	95 e6       	ldi	r25, 0x65	; 101
   13fb8:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    SERIAL_PROTOCOLLN();
   13fbc:	0e 94 bc 7a 	call	0xf578	; 0xf578 <MarlinSerial::println()>
      #if defined(X_MIN_PIN) && X_MIN_PIN > -1
        SERIAL_PROTOCOLRPGM(_n("x_min: "));////MSG_X_MIN
   13fc0:	86 e5       	ldi	r24, 0x56	; 86
   13fc2:	95 e6       	ldi	r25, 0x65	; 101
   13fc4:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        if(READ(X_MIN_PIN)^X_MIN_ENDSTOP_INVERTING){
   13fc8:	1e 9b       	sbis	0x03, 6	; 3
   13fca:	02 c0       	rjmp	.+4      	; 0x13fd0 <process_commands() [clone .part.46]+0x2018>
   13fcc:	0c 94 ea aa 	jmp	0x155d4	; 0x155d4 <process_commands() [clone .part.46]+0x361c>
          SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT);
        }else{
          SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN);
   13fd0:	81 e5       	ldi	r24, 0x51	; 81
   13fd2:	95 e6       	ldi	r25, 0x65	; 101
    SERIAL_PROTOCOLRPGM(_N("Reporting endstop status"));////MSG_M119_REPORT
    SERIAL_PROTOCOLLN();
      #if defined(X_MIN_PIN) && X_MIN_PIN > -1
        SERIAL_PROTOCOLRPGM(_n("x_min: "));////MSG_X_MIN
        if(READ(X_MIN_PIN)^X_MIN_ENDSTOP_INVERTING){
          SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT);
   13fd4:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        }else{
          SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN);
        }
        SERIAL_PROTOCOLLN();
   13fd8:	0e 94 bc 7a 	call	0xf578	; 0xf578 <MarlinSerial::println()>
          SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN);
        }
        SERIAL_PROTOCOLLN();
      #endif
      #if defined(Y_MIN_PIN) && Y_MIN_PIN > -1
        SERIAL_PROTOCOLRPGM(_n("y_min: "));////MSG_Y_MIN
   13fdc:	8f e3       	ldi	r24, 0x3F	; 63
   13fde:	95 e6       	ldi	r25, 0x65	; 101
   13fe0:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        if(READ(Y_MIN_PIN)^Y_MIN_ENDSTOP_INVERTING){
   13fe4:	1d 9b       	sbis	0x03, 5	; 3
   13fe6:	02 c0       	rjmp	.+4      	; 0x13fec <process_commands() [clone .part.46]+0x2034>
   13fe8:	0c 94 ee aa 	jmp	0x155dc	; 0x155dc <process_commands() [clone .part.46]+0x3624>
          SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT);
        }else{
          SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN);
   13fec:	81 e5       	ldi	r24, 0x51	; 81
   13fee:	95 e6       	ldi	r25, 0x65	; 101
        SERIAL_PROTOCOLLN();
      #endif
      #if defined(Y_MIN_PIN) && Y_MIN_PIN > -1
        SERIAL_PROTOCOLRPGM(_n("y_min: "));////MSG_Y_MIN
        if(READ(Y_MIN_PIN)^Y_MIN_ENDSTOP_INVERTING){
          SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT);
   13ff0:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        }else{
          SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN);
        }
        SERIAL_PROTOCOLLN();
   13ff4:	0e 94 bc 7a 	call	0xf578	; 0xf578 <MarlinSerial::println()>
          SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN);
        }
        SERIAL_PROTOCOLLN();
      #endif
      #if defined(Z_MIN_PIN) && Z_MIN_PIN > -1
        SERIAL_PROTOCOLRPGM(MSG_Z_MIN);
   13ff8:	87 e3       	ldi	r24, 0x37	; 55
   13ffa:	95 e6       	ldi	r25, 0x65	; 101
   13ffc:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        if(READ(Z_MIN_PIN)^Z_MIN_ENDSTOP_INVERTING){
   14000:	1c 9b       	sbis	0x03, 4	; 3
   14002:	02 c0       	rjmp	.+4      	; 0x14008 <process_commands() [clone .part.46]+0x2050>
   14004:	0c 94 f2 aa 	jmp	0x155e4	; 0x155e4 <process_commands() [clone .part.46]+0x362c>
          SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT);
        }else{
          SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN);
   14008:	81 e5       	ldi	r24, 0x51	; 81
   1400a:	95 e6       	ldi	r25, 0x65	; 101
        SERIAL_PROTOCOLLN();
      #endif
      #if defined(Z_MIN_PIN) && Z_MIN_PIN > -1
        SERIAL_PROTOCOLRPGM(MSG_Z_MIN);
        if(READ(Z_MIN_PIN)^Z_MIN_ENDSTOP_INVERTING){
          SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT);
   1400c:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        }else{
          SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN);
        }
        SERIAL_PROTOCOLLN();
   14010:	0e 94 bc 7a 	call	0xf578	; 0xf578 <MarlinSerial::println()>
      #endif
      #if defined(Z_MAX_PIN) && Z_MAX_PIN > -1
        SERIAL_PROTOCOLRPGM(MSG_Z_MAX);
   14014:	8f e2       	ldi	r24, 0x2F	; 47
   14016:	95 e6       	ldi	r25, 0x65	; 101
   14018:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        if(READ(Z_MAX_PIN)^Z_MAX_ENDSTOP_INVERTING){
   1401c:	01 99       	sbic	0x00, 1	; 0
   1401e:	02 c0       	rjmp	.+4      	; 0x14024 <process_commands() [clone .part.46]+0x206c>
   14020:	0c 94 f6 aa 	jmp	0x155ec	; 0x155ec <process_commands() [clone .part.46]+0x3634>
          SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT);
        }else{
          SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN);
   14024:	81 e5       	ldi	r24, 0x51	; 81
   14026:	95 e6       	ldi	r25, 0x65	; 101
        SERIAL_PROTOCOLLN();
      #endif
      #if defined(Z_MAX_PIN) && Z_MAX_PIN > -1
        SERIAL_PROTOCOLRPGM(MSG_Z_MAX);
        if(READ(Z_MAX_PIN)^Z_MAX_ENDSTOP_INVERTING){
          SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT);
   14028:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        }else{
          SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_OPEN);
        }
        SERIAL_PROTOCOLLN();
   1402c:	0e 94 bc 7a 	call	0xf578	; 0xf578 <MarlinSerial::println()>
   14030:	ee c3       	rjmp	.+2012   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   14032:	8c 38       	cpi	r24, 0x8C	; 140
   14034:	91 05       	cpc	r25, r1
   14036:	09 f4       	brne	.+2      	; 0x1403a <process_commands() [clone .part.46]+0x2082>
   14038:	66 c7       	rjmp	.+3788   	; 0x14f06 <process_commands() [clone .part.46]+0x2f4e>
   1403a:	8b 39       	cpi	r24, 0x9B	; 155
   1403c:	91 05       	cpc	r25, r1
   1403e:	09 f4       	brne	.+2      	; 0x14042 <process_commands() [clone .part.46]+0x208a>
   14040:	7d c7       	rjmp	.+3834   	; 0x14f3c <process_commands() [clone .part.46]+0x2f84>
   14042:	8d 37       	cpi	r24, 0x7D	; 125
   14044:	91 05       	cpc	r25, r1
   14046:	09 f0       	breq	.+2      	; 0x1404a <process_commands() [clone .part.46]+0x2092>
   14048:	ec cc       	rjmp	.-1576   	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>
   1404a:	58 cd       	rjmp	.-1360   	; 0x13afc <process_commands() [clone .part.46]+0x1b44>
   1404c:	84 3a       	cpi	r24, 0xA4	; 164
   1404e:	41 e0       	ldi	r20, 0x01	; 1
   14050:	94 07       	cpc	r25, r20
   14052:	11 f4       	brne	.+4      	; 0x14058 <process_commands() [clone .part.46]+0x20a0>
   14054:	0c 94 1d ae 	jmp	0x15c3a	; 0x15c3a <process_commands() [clone .part.46]+0x3c82>
   14058:	0c f0       	brlt	.+2      	; 0x1405c <process_commands() [clone .part.46]+0x20a4>
   1405a:	44 c2       	rjmp	.+1160   	; 0x144e4 <process_commands() [clone .part.46]+0x252c>
   1405c:	82 3e       	cpi	r24, 0xE2	; 226
   1405e:	91 05       	cpc	r25, r1
   14060:	11 f4       	brne	.+4      	; 0x14066 <process_commands() [clone .part.46]+0x20ae>
   14062:	0c 94 a7 ac 	jmp	0x1594e	; 0x1594e <process_commands() [clone .part.46]+0x3996>
   14066:	0c f0       	brlt	.+2      	; 0x1406a <process_commands() [clone .part.46]+0x20b2>
   14068:	6b c1       	rjmp	.+726    	; 0x14340 <process_commands() [clone .part.46]+0x2388>
   1406a:	8e 3c       	cpi	r24, 0xCE	; 206
   1406c:	91 05       	cpc	r25, r1
   1406e:	11 f4       	brne	.+4      	; 0x14074 <process_commands() [clone .part.46]+0x20bc>
   14070:	0c 94 b6 ab 	jmp	0x1576c	; 0x1576c <process_commands() [clone .part.46]+0x37b4>
   14074:	0c f0       	brlt	.+2      	; 0x14078 <process_commands() [clone .part.46]+0x20c0>
   14076:	b1 c0       	rjmp	.+354    	; 0x141da <process_commands() [clone .part.46]+0x2222>
   14078:	8b 3c       	cpi	r24, 0xCB	; 203
   1407a:	91 05       	cpc	r25, r1
   1407c:	11 f4       	brne	.+4      	; 0x14082 <process_commands() [clone .part.46]+0x20ca>
   1407e:	0c 94 40 ab 	jmp	0x15680	; 0x15680 <process_commands() [clone .part.46]+0x36c8>
   14082:	5c f5       	brge	.+86     	; 0x140da <process_commands() [clone .part.46]+0x2122>
   14084:	88 3c       	cpi	r24, 0xC8	; 200
   14086:	91 05       	cpc	r25, r1
   14088:	11 f4       	brne	.+4      	; 0x1408e <process_commands() [clone .part.46]+0x20d6>
   1408a:	0c 94 fd aa 	jmp	0x155fa	; 0x155fa <process_commands() [clone .part.46]+0x3642>
   1408e:	89 3c       	cpi	r24, 0xC9	; 201
   14090:	91 05       	cpc	r25, r1
   14092:	09 f0       	breq	.+2      	; 0x14096 <process_commands() [clone .part.46]+0x20de>
   14094:	c6 cc       	rjmp	.-1652   	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>
   14096:	04 ec       	ldi	r16, 0xC4	; 196
   14098:	12 e0       	ldi	r17, 0x02	; 2
   1409a:	b7 e6       	ldi	r27, 0x67	; 103
   1409c:	eb 2e       	mov	r14, r27
   1409e:	bd e0       	ldi	r27, 0x0D	; 13
   140a0:	fb 2e       	mov	r15, r27
   140a2:	88 ec       	ldi	r24, 0xC8	; 200
   140a4:	c8 2e       	mov	r12, r24
   140a6:	82 e0       	ldi	r24, 0x02	; 2
   140a8:	d8 2e       	mov	r13, r24
    - `E` - Acceleration for the active or specified extruder in units/s^2
    */
    case 201:
		for (int8_t i = 0; i < NUM_AXIS; i++)
		{
			if (code_seen(axis_codes[i]))
   140aa:	d8 01       	movw	r26, r16
   140ac:	8d 91       	ld	r24, X+
   140ae:	8d 01       	movw	r16, r26
   140b0:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   140b4:	88 23       	and	r24, r24
   140b6:	49 f0       	breq	.+18     	; 0x140ca <process_commands() [clone .part.46]+0x2112>
			{
				unsigned long val = code_value();
   140b8:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   140bc:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   140c0:	f7 01       	movw	r30, r14
   140c2:	64 a3       	std	Z+36, r22	; 0x24
   140c4:	75 a3       	std	Z+37, r23	; 0x25
   140c6:	86 a3       	std	Z+38, r24	; 0x26
   140c8:	97 a3       	std	Z+39, r25	; 0x27
   140ca:	f4 e0       	ldi	r31, 0x04	; 4
   140cc:	ef 0e       	add	r14, r31
   140ce:	f1 1c       	adc	r15, r1
    - `Y` - Acceleration for Y axis in units/s^2
    - `Z` - Acceleration for Z axis in units/s^2
    - `E` - Acceleration for the active or specified extruder in units/s^2
    */
    case 201:
		for (int8_t i = 0; i < NUM_AXIS; i++)
   140d0:	c0 16       	cp	r12, r16
   140d2:	d1 06       	cpc	r13, r17
   140d4:	51 f7       	brne	.-44     	; 0x140aa <process_commands() [clone .part.46]+0x20f2>
   140d6:	0c 94 a1 a9 	jmp	0x15342	; 0x15342 <process_commands() [clone .part.46]+0x338a>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   140da:	8c 3c       	cpi	r24, 0xCC	; 204
   140dc:	91 05       	cpc	r25, r1
   140de:	11 f4       	brne	.+4      	; 0x140e4 <process_commands() [clone .part.46]+0x212c>
   140e0:	0c 94 5f ab 	jmp	0x156be	; 0x156be <process_commands() [clone .part.46]+0x3706>
   140e4:	8d 3c       	cpi	r24, 0xCD	; 205
   140e6:	91 05       	cpc	r25, r1
   140e8:	09 f0       	breq	.+2      	; 0x140ec <process_commands() [clone .part.46]+0x2134>
   140ea:	9b cc       	rjmp	.-1738   	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>
    - `Z` - Maximum Z jerk (units/s)
    - `E` - Maximum E jerk (units/s)
    */
    case 205:
    {
      if(code_seen('S')) cs.minimumfeedrate = code_value();
   140ec:	83 e5       	ldi	r24, 0x53	; 83
   140ee:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   140f2:	88 23       	and	r24, r24
   140f4:	51 f0       	breq	.+20     	; 0x1410a <process_commands() [clone .part.46]+0x2152>
   140f6:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   140fa:	60 93 a3 0d 	sts	0x0DA3, r22	; 0x800da3 <cs+0x3c>
   140fe:	70 93 a4 0d 	sts	0x0DA4, r23	; 0x800da4 <cs+0x3d>
   14102:	80 93 a5 0d 	sts	0x0DA5, r24	; 0x800da5 <cs+0x3e>
   14106:	90 93 a6 0d 	sts	0x0DA6, r25	; 0x800da6 <cs+0x3f>
      if(code_seen('T')) cs.mintravelfeedrate = code_value();
   1410a:	84 e5       	ldi	r24, 0x54	; 84
   1410c:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   14110:	88 23       	and	r24, r24
   14112:	51 f0       	breq	.+20     	; 0x14128 <process_commands() [clone .part.46]+0x2170>
   14114:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   14118:	60 93 a7 0d 	sts	0x0DA7, r22	; 0x800da7 <cs+0x40>
   1411c:	70 93 a8 0d 	sts	0x0DA8, r23	; 0x800da8 <cs+0x41>
   14120:	80 93 a9 0d 	sts	0x0DA9, r24	; 0x800da9 <cs+0x42>
   14124:	90 93 aa 0d 	sts	0x0DAA, r25	; 0x800daa <cs+0x43>
      if(code_seen('B')) cs.min_segment_time_us = (uint32_t)code_value();
   14128:	82 e4       	ldi	r24, 0x42	; 66
   1412a:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   1412e:	88 23       	and	r24, r24
   14130:	61 f0       	breq	.+24     	; 0x1414a <process_commands() [clone .part.46]+0x2192>
   14132:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   14136:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   1413a:	60 93 ab 0d 	sts	0x0DAB, r22	; 0x800dab <cs+0x44>
   1413e:	70 93 ac 0d 	sts	0x0DAC, r23	; 0x800dac <cs+0x45>
   14142:	80 93 ad 0d 	sts	0x0DAD, r24	; 0x800dad <cs+0x46>
   14146:	90 93 ae 0d 	sts	0x0DAE, r25	; 0x800dae <cs+0x47>
      if(code_seen('X')) cs.max_jerk[X_AXIS] = cs.max_jerk[Y_AXIS] = code_value();
   1414a:	88 e5       	ldi	r24, 0x58	; 88
   1414c:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   14150:	88 23       	and	r24, r24
   14152:	91 f0       	breq	.+36     	; 0x14178 <process_commands() [clone .part.46]+0x21c0>
   14154:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   14158:	60 93 b3 0d 	sts	0x0DB3, r22	; 0x800db3 <cs+0x4c>
   1415c:	70 93 b4 0d 	sts	0x0DB4, r23	; 0x800db4 <cs+0x4d>
   14160:	80 93 b5 0d 	sts	0x0DB5, r24	; 0x800db5 <cs+0x4e>
   14164:	90 93 b6 0d 	sts	0x0DB6, r25	; 0x800db6 <cs+0x4f>
   14168:	60 93 af 0d 	sts	0x0DAF, r22	; 0x800daf <cs+0x48>
   1416c:	70 93 b0 0d 	sts	0x0DB0, r23	; 0x800db0 <cs+0x49>
   14170:	80 93 b1 0d 	sts	0x0DB1, r24	; 0x800db1 <cs+0x4a>
   14174:	90 93 b2 0d 	sts	0x0DB2, r25	; 0x800db2 <cs+0x4b>
      if(code_seen('Y')) cs.max_jerk[Y_AXIS] = code_value();
   14178:	89 e5       	ldi	r24, 0x59	; 89
   1417a:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   1417e:	88 23       	and	r24, r24
   14180:	51 f0       	breq	.+20     	; 0x14196 <process_commands() [clone .part.46]+0x21de>
   14182:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   14186:	60 93 b3 0d 	sts	0x0DB3, r22	; 0x800db3 <cs+0x4c>
   1418a:	70 93 b4 0d 	sts	0x0DB4, r23	; 0x800db4 <cs+0x4d>
   1418e:	80 93 b5 0d 	sts	0x0DB5, r24	; 0x800db5 <cs+0x4e>
   14192:	90 93 b6 0d 	sts	0x0DB6, r25	; 0x800db6 <cs+0x4f>
      if(code_seen('Z')) cs.max_jerk[Z_AXIS] = code_value();
   14196:	8a e5       	ldi	r24, 0x5A	; 90
   14198:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   1419c:	88 23       	and	r24, r24
   1419e:	51 f0       	breq	.+20     	; 0x141b4 <process_commands() [clone .part.46]+0x21fc>
   141a0:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   141a4:	60 93 b7 0d 	sts	0x0DB7, r22	; 0x800db7 <cs+0x50>
   141a8:	70 93 b8 0d 	sts	0x0DB8, r23	; 0x800db8 <cs+0x51>
   141ac:	80 93 b9 0d 	sts	0x0DB9, r24	; 0x800db9 <cs+0x52>
   141b0:	90 93 ba 0d 	sts	0x0DBA, r25	; 0x800dba <cs+0x53>
      if(code_seen('E'))
   141b4:	85 e4       	ldi	r24, 0x45	; 69
   141b6:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   141ba:	88 23       	and	r24, r24
   141bc:	09 f4       	brne	.+2      	; 0x141c0 <process_commands() [clone .part.46]+0x2208>
   141be:	27 c3       	rjmp	.+1614   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
      {
          float e = code_value();
   141c0:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
#ifndef LA_NOCOMPAT
          e = la10c_jerk(e);
   141c4:	0e 94 9f 85 	call	0x10b3e	; 0x10b3e <la10c_jerk(float)>
#endif
          cs.max_jerk[E_AXIS] = e;
   141c8:	60 93 bb 0d 	sts	0x0DBB, r22	; 0x800dbb <cs+0x54>
   141cc:	70 93 bc 0d 	sts	0x0DBC, r23	; 0x800dbc <cs+0x55>
   141d0:	80 93 bd 0d 	sts	0x0DBD, r24	; 0x800dbd <cs+0x56>
   141d4:	90 93 be 0d 	sts	0x0DBE, r25	; 0x800dbe <cs+0x57>
   141d8:	1a c3       	rjmp	.+1588   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   141da:	81 3d       	cpi	r24, 0xD1	; 209
   141dc:	91 05       	cpc	r25, r1
   141de:	11 f4       	brne	.+4      	; 0x141e4 <process_commands() [clone .part.46]+0x222c>
   141e0:	0c 94 04 ac 	jmp	0x15808	; 0x15808 <process_commands() [clone .part.46]+0x3850>
   141e4:	5c f5       	brge	.+86     	; 0x1423c <process_commands() [clone .part.46]+0x2284>
   141e6:	8f 3c       	cpi	r24, 0xCF	; 207
   141e8:	91 05       	cpc	r25, r1
   141ea:	11 f4       	brne	.+4      	; 0x141f0 <process_commands() [clone .part.46]+0x2238>
   141ec:	0c 94 d2 ab 	jmp	0x157a4	; 0x157a4 <process_commands() [clone .part.46]+0x37ec>
   141f0:	80 3d       	cpi	r24, 0xD0	; 208
   141f2:	91 05       	cpc	r25, r1
   141f4:	09 f0       	breq	.+2      	; 0x141f8 <process_commands() [clone .part.46]+0x2240>
   141f6:	15 cc       	rjmp	.-2006   	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>
    - `S` - positive length surplus to the M207 Snnn, in mm
    - `F` - feedrate, in mm/sec
    */
    case 208: // M208 - set retract recover length S[positive mm surplus to the M207 S*] F[feedrate mm/min]
    {
      if(code_seen('S'))
   141f8:	83 e5       	ldi	r24, 0x53	; 83
   141fa:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   141fe:	88 23       	and	r24, r24
   14200:	51 f0       	breq	.+20     	; 0x14216 <process_commands() [clone .part.46]+0x225e>
      {
        cs.retract_recover_length = code_value() ;
   14202:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   14206:	60 93 f6 0d 	sts	0x0DF6, r22	; 0x800df6 <cs+0x8f>
   1420a:	70 93 f7 0d 	sts	0x0DF7, r23	; 0x800df7 <cs+0x90>
   1420e:	80 93 f8 0d 	sts	0x0DF8, r24	; 0x800df8 <cs+0x91>
   14212:	90 93 f9 0d 	sts	0x0DF9, r25	; 0x800df9 <cs+0x92>
      }
      if(code_seen('F'))
   14216:	86 e4       	ldi	r24, 0x46	; 70
   14218:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   1421c:	88 23       	and	r24, r24
   1421e:	09 f4       	brne	.+2      	; 0x14222 <process_commands() [clone .part.46]+0x226a>
   14220:	f6 c2       	rjmp	.+1516   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
      {
        cs.retract_recover_feedrate = get_feedrate_mm_s(code_value());
   14222:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   14226:	0e 94 45 65 	call	0xca8a	; 0xca8a <get_feedrate_mm_s(float)>
   1422a:	60 93 fa 0d 	sts	0x0DFA, r22	; 0x800dfa <cs+0x93>
   1422e:	70 93 fb 0d 	sts	0x0DFB, r23	; 0x800dfb <cs+0x94>
   14232:	80 93 fc 0d 	sts	0x0DFC, r24	; 0x800dfc <cs+0x95>
   14236:	90 93 fd 0d 	sts	0x0DFD, r25	; 0x800dfd <cs+0x96>
   1423a:	e9 c2       	rjmp	.+1490   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   1423c:	8c 3d       	cpi	r24, 0xDC	; 220
   1423e:	91 05       	cpc	r25, r1
   14240:	11 f4       	brne	.+4      	; 0x14246 <process_commands() [clone .part.46]+0x228e>
   14242:	0c 94 47 ac 	jmp	0x1588e	; 0x1588e <process_commands() [clone .part.46]+0x38d6>
   14246:	8d 3d       	cpi	r24, 0xDD	; 221
   14248:	91 05       	cpc	r25, r1
   1424a:	11 f4       	brne	.+4      	; 0x14250 <process_commands() [clone .part.46]+0x2298>
   1424c:	0c 94 86 ac 	jmp	0x1590c	; 0x1590c <process_commands() [clone .part.46]+0x3954>
   14250:	86 3d       	cpi	r24, 0xD6	; 214
   14252:	91 05       	cpc	r25, r1
   14254:	09 f0       	breq	.+2      	; 0x14258 <process_commands() [clone .part.46]+0x22a0>
   14256:	e5 cb       	rjmp	.-2102   	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>
            greater than or less than the minimum and maximum segment length.  Set to 0 to disable.
    */
    case 214:
    {
        // Extract all possible parameters if they appear
        float p = code_seen('P') ? code_value() : cs.mm_per_arc_segment;
   14258:	80 e5       	ldi	r24, 0x50	; 80
   1425a:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   1425e:	88 23       	and	r24, r24
   14260:	11 f4       	brne	.+4      	; 0x14266 <process_commands() [clone .part.46]+0x22ae>
   14262:	0c 94 33 ac 	jmp	0x15866	; 0x15866 <process_commands() [clone .part.46]+0x38ae>
   14266:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   1426a:	2b 01       	movw	r4, r22
   1426c:	3c 01       	movw	r6, r24
        float s = code_seen('S') ? code_value() : cs.min_mm_per_arc_segment;
   1426e:	83 e5       	ldi	r24, 0x53	; 83
   14270:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   14274:	88 23       	and	r24, r24
   14276:	11 f4       	brne	.+4      	; 0x1427c <process_commands() [clone .part.46]+0x22c4>
   14278:	0c 94 3d ac 	jmp	0x1587a	; 0x1587a <process_commands() [clone .part.46]+0x38c2>
   1427c:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   14280:	4b 01       	movw	r8, r22
   14282:	5c 01       	movw	r10, r24
        unsigned char n = code_seen('N') ? code_value() : cs.n_arc_correction;
   14284:	8e e4       	ldi	r24, 0x4E	; 78
   14286:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   1428a:	d0 90 33 0e 	lds	r13, 0x0E33	; 0x800e33 <cs+0xcc>
   1428e:	88 23       	and	r24, r24
   14290:	29 f0       	breq	.+10     	; 0x1429c <process_commands() [clone .part.46]+0x22e4>
   14292:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   14296:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   1429a:	d6 2e       	mov	r13, r22
        unsigned short r = code_seen('R') ? code_value() : cs.min_arc_segments;
   1429c:	82 e5       	ldi	r24, 0x52	; 82
   1429e:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   142a2:	e0 90 34 0e 	lds	r14, 0x0E34	; 0x800e34 <cs+0xcd>
   142a6:	f0 90 35 0e 	lds	r15, 0x0E35	; 0x800e35 <cs+0xce>
   142aa:	88 23       	and	r24, r24
   142ac:	29 f0       	breq	.+10     	; 0x142b8 <process_commands() [clone .part.46]+0x2300>
   142ae:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   142b2:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   142b6:	7b 01       	movw	r14, r22
        unsigned short f = code_seen('F') ? code_value() : cs.arc_segments_per_sec;
   142b8:	86 e4       	ldi	r24, 0x46	; 70
   142ba:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   142be:	00 91 36 0e 	lds	r16, 0x0E36	; 0x800e36 <cs+0xcf>
   142c2:	10 91 37 0e 	lds	r17, 0x0E37	; 0x800e37 <cs+0xd0>
   142c6:	88 23       	and	r24, r24
   142c8:	29 f0       	breq	.+10     	; 0x142d4 <process_commands() [clone .part.46]+0x231c>
   142ca:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   142ce:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   142d2:	8b 01       	movw	r16, r22

        // Ensure mm_per_arc_segment is greater than 0, and that min_mm_per_arc_segment is sero or greater than or equal to mm_per_arc_segment
        if (p <=0 || s < 0 || p < s)
   142d4:	20 e0       	ldi	r18, 0x00	; 0
   142d6:	30 e0       	ldi	r19, 0x00	; 0
   142d8:	a9 01       	movw	r20, r18
   142da:	c3 01       	movw	r24, r6
   142dc:	b2 01       	movw	r22, r4
   142de:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   142e2:	18 16       	cp	r1, r24
   142e4:	0c f0       	brlt	.+2      	; 0x142e8 <process_commands() [clone .part.46]+0x2330>
   142e6:	93 c2       	rjmp	.+1318   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
   142e8:	20 e0       	ldi	r18, 0x00	; 0
   142ea:	30 e0       	ldi	r19, 0x00	; 0
   142ec:	a9 01       	movw	r20, r18
   142ee:	c5 01       	movw	r24, r10
   142f0:	b4 01       	movw	r22, r8
   142f2:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   142f6:	87 fd       	sbrc	r24, 7
   142f8:	8a c2       	rjmp	.+1300   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
   142fa:	a5 01       	movw	r20, r10
   142fc:	94 01       	movw	r18, r8
   142fe:	c3 01       	movw	r24, r6
   14300:	b2 01       	movw	r22, r4
   14302:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   14306:	87 fd       	sbrc	r24, 7
   14308:	82 c2       	rjmp	.+1284   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        {
            // Should we display some error here?
            break;
        }

        cs.mm_per_arc_segment = p;
   1430a:	40 92 2b 0e 	sts	0x0E2B, r4	; 0x800e2b <cs+0xc4>
   1430e:	50 92 2c 0e 	sts	0x0E2C, r5	; 0x800e2c <cs+0xc5>
   14312:	60 92 2d 0e 	sts	0x0E2D, r6	; 0x800e2d <cs+0xc6>
   14316:	70 92 2e 0e 	sts	0x0E2E, r7	; 0x800e2e <cs+0xc7>
        cs.min_mm_per_arc_segment = s;
   1431a:	80 92 2f 0e 	sts	0x0E2F, r8	; 0x800e2f <cs+0xc8>
   1431e:	90 92 30 0e 	sts	0x0E30, r9	; 0x800e30 <cs+0xc9>
   14322:	a0 92 31 0e 	sts	0x0E31, r10	; 0x800e31 <cs+0xca>
   14326:	b0 92 32 0e 	sts	0x0E32, r11	; 0x800e32 <cs+0xcb>
        cs.n_arc_correction = n;
   1432a:	d0 92 33 0e 	sts	0x0E33, r13	; 0x800e33 <cs+0xcc>
        cs.min_arc_segments = r;
   1432e:	f0 92 35 0e 	sts	0x0E35, r15	; 0x800e35 <cs+0xce>
   14332:	e0 92 34 0e 	sts	0x0E34, r14	; 0x800e34 <cs+0xcd>
        cs.arc_segments_per_sec = f;
   14336:	10 93 37 0e 	sts	0x0E37, r17	; 0x800e37 <cs+0xd0>
   1433a:	00 93 36 0e 	sts	0x0E36, r16	; 0x800e36 <cs+0xcf>
   1433e:	67 c2       	rjmp	.+1230   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   14340:	80 33       	cpi	r24, 0x30	; 48
   14342:	a1 e0       	ldi	r26, 0x01	; 1
   14344:	9a 07       	cpc	r25, r26
   14346:	11 f4       	brne	.+4      	; 0x1434c <process_commands() [clone .part.46]+0x2394>
   14348:	0c 94 82 ad 	jmp	0x15b04	; 0x15b04 <process_commands() [clone .part.46]+0x3b4c>
   1434c:	0c f0       	brlt	.+2      	; 0x14350 <process_commands() [clone .part.46]+0x2398>
   1434e:	78 c0       	rjmp	.+240    	; 0x14440 <process_commands() [clone .part.46]+0x2488>
   14350:	8d 32       	cpi	r24, 0x2D	; 45
   14352:	e1 e0       	ldi	r30, 0x01	; 1
   14354:	9e 07       	cpc	r25, r30
   14356:	11 f4       	brne	.+4      	; 0x1435c <process_commands() [clone .part.46]+0x23a4>
   14358:	0c 94 09 ad 	jmp	0x15a12	; 0x15a12 <process_commands() [clone .part.46]+0x3a5a>
   1435c:	b4 f5       	brge	.+108    	; 0x143ca <process_commands() [clone .part.46]+0x2412>
   1435e:	80 3f       	cpi	r24, 0xF0	; 240
   14360:	91 05       	cpc	r25, r1
   14362:	09 f4       	brne	.+2      	; 0x14366 <process_commands() [clone .part.46]+0x23ae>
   14364:	54 c2       	rjmp	.+1192   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
   14366:	8c 32       	cpi	r24, 0x2C	; 44
   14368:	91 40       	sbci	r25, 0x01	; 1
   1436a:	09 f0       	breq	.+2      	; 0x1436e <process_commands() [clone .part.46]+0x23b6>
   1436c:	5a cb       	rjmp	.-2380   	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>
    - `S` - frequency in Hz. Not all firmware versions support this parameter
    - `P` - duration in milliseconds max 3500ms
    */
    case 300: // M300
    {
      uint16_t beepP = code_seen('P') ? min(code_value(), 3500) : 1000;
   1436e:	80 e5       	ldi	r24, 0x50	; 80
   14370:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   14374:	08 ee       	ldi	r16, 0xE8	; 232
   14376:	13 e0       	ldi	r17, 0x03	; 3
   14378:	88 23       	and	r24, r24
   1437a:	89 f0       	breq	.+34     	; 0x1439e <process_commands() [clone .part.46]+0x23e6>
   1437c:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   14380:	20 e0       	ldi	r18, 0x00	; 0
   14382:	30 ec       	ldi	r19, 0xC0	; 192
   14384:	4a e5       	ldi	r20, 0x5A	; 90
   14386:	55 e4       	ldi	r21, 0x45	; 69
   14388:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   1438c:	0c ea       	ldi	r16, 0xAC	; 172
   1438e:	1d e0       	ldi	r17, 0x0D	; 13
   14390:	87 ff       	sbrs	r24, 7
   14392:	05 c0       	rjmp	.+10     	; 0x1439e <process_commands() [clone .part.46]+0x23e6>
   14394:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   14398:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   1439c:	8b 01       	movw	r16, r22
      uint16_t beepS;
      if (!code_seen('S'))
   1439e:	83 e5       	ldi	r24, 0x53	; 83
   143a0:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   143a4:	88 23       	and	r24, r24
   143a6:	11 f4       	brne	.+4      	; 0x143ac <process_commands() [clone .part.46]+0x23f4>
   143a8:	0c 94 01 ad 	jmp	0x15a02	; 0x15a02 <process_commands() [clone .part.46]+0x3a4a>
          beepS = 0;
      else {
          beepS = code_value();
   143ac:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   143b0:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
          if (!beepS) {
   143b4:	61 15       	cp	r22, r1
   143b6:	71 05       	cpc	r23, r1
   143b8:	11 f0       	breq	.+4      	; 0x143be <process_commands() [clone .part.46]+0x2406>
   143ba:	0c 94 03 ad 	jmp	0x15a06	; 0x15a06 <process_commands() [clone .part.46]+0x3a4e>
              // handle S0 as a pause
              _delay(beepP);
   143be:	b8 01       	movw	r22, r16
   143c0:	90 e0       	ldi	r25, 0x00	; 0
   143c2:	80 e0       	ldi	r24, 0x00	; 0
   143c4:	0f 94 bd 0d 	call	0x21b7a	; 0x21b7a <delay2>
   143c8:	22 c2       	rjmp	.+1092   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   143ca:	8e 32       	cpi	r24, 0x2E	; 46
   143cc:	31 e0       	ldi	r19, 0x01	; 1
   143ce:	93 07       	cpc	r25, r19
   143d0:	11 f4       	brne	.+4      	; 0x143d6 <process_commands() [clone .part.46]+0x241e>
   143d2:	0c 94 fb ad 	jmp	0x15bf6	; 0x15bf6 <process_commands() [clone .part.46]+0x3c3e>
   143d6:	8f 32       	cpi	r24, 0x2F	; 47
   143d8:	91 40       	sbci	r25, 0x01	; 1
   143da:	09 f0       	breq	.+2      	; 0x143de <process_commands() [clone .part.46]+0x2426>
   143dc:	22 cb       	rjmp	.-2492   	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>
    case 303:
    {
      float temp = 150.0;
      int e = 0;
      int c = 5;
      if (code_seen('E')) e = code_value_short();
   143de:	85 e4       	ldi	r24, 0x45	; 69
   143e0:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
      - `C` - Cycles, default `5`
    */
    case 303:
    {
      float temp = 150.0;
      int e = 0;
   143e4:	10 e0       	ldi	r17, 0x00	; 0
   143e6:	00 e0       	ldi	r16, 0x00	; 0
      int c = 5;
      if (code_seen('E')) e = code_value_short();
   143e8:	88 23       	and	r24, r24
   143ea:	59 f0       	breq	.+22     	; 0x14402 <process_commands() [clone .part.46]+0x244a>
   143ec:	0e 94 17 56 	call	0xac2e	; 0xac2e <code_value_short() [clone .lto_priv.505]>
   143f0:	8c 01       	movw	r16, r24
        if (e < 0)
          temp = 70;
   143f2:	c1 2c       	mov	r12, r1
   143f4:	d1 2c       	mov	r13, r1
   143f6:	6c e8       	ldi	r22, 0x8C	; 140
   143f8:	e6 2e       	mov	r14, r22
   143fa:	62 e4       	ldi	r22, 0x42	; 66
   143fc:	f6 2e       	mov	r15, r22
    {
      float temp = 150.0;
      int e = 0;
      int c = 5;
      if (code_seen('E')) e = code_value_short();
        if (e < 0)
   143fe:	97 fd       	sbrc	r25, 7
   14400:	06 c0       	rjmp	.+12     	; 0x1440e <process_commands() [clone .part.46]+0x2456>
      - `S` - Target temperature, default `210°C` for hotend, 70 for bed
      - `C` - Cycles, default `5`
    */
    case 303:
    {
      float temp = 150.0;
   14402:	c1 2c       	mov	r12, r1
   14404:	d1 2c       	mov	r13, r1
   14406:	76 e1       	ldi	r23, 0x16	; 22
   14408:	e7 2e       	mov	r14, r23
   1440a:	73 e4       	ldi	r23, 0x43	; 67
   1440c:	f7 2e       	mov	r15, r23
      int e = 0;
      int c = 5;
      if (code_seen('E')) e = code_value_short();
        if (e < 0)
          temp = 70;
      if (code_seen('S')) temp = code_value();
   1440e:	83 e5       	ldi	r24, 0x53	; 83
   14410:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   14414:	88 23       	and	r24, r24
   14416:	21 f0       	breq	.+8      	; 0x14420 <process_commands() [clone .part.46]+0x2468>
   14418:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   1441c:	6b 01       	movw	r12, r22
   1441e:	7c 01       	movw	r14, r24
      if (code_seen('C')) c = code_value_short();
   14420:	83 e4       	ldi	r24, 0x43	; 67
   14422:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   14426:	88 23       	and	r24, r24
   14428:	11 f4       	brne	.+4      	; 0x1442e <process_commands() [clone .part.46]+0x2476>
   1442a:	0c 94 0b ae 	jmp	0x15c16	; 0x15c16 <process_commands() [clone .part.46]+0x3c5e>
   1442e:	0e 94 17 56 	call	0xac2e	; 0xac2e <code_value_short() [clone .lto_priv.505]>
      PID_autotune(temp, e, c);
   14432:	9c 01       	movw	r18, r24
   14434:	a8 01       	movw	r20, r16
   14436:	c7 01       	movw	r24, r14
   14438:	b6 01       	movw	r22, r12
   1443a:	0f 94 79 36 	call	0x26cf2	; 0x26cf2 <PID_autotune(float, int, int)>
   1443e:	e7 c1       	rjmp	.+974    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   14440:	80 39       	cpi	r24, 0x90	; 144
   14442:	51 e0       	ldi	r21, 0x01	; 1
   14444:	95 07       	cpc	r25, r21
   14446:	11 f4       	brne	.+4      	; 0x1444c <process_commands() [clone .part.46]+0x2494>
   14448:	0c 94 0f ae 	jmp	0x15c1e	; 0x15c1e <process_commands() [clone .part.46]+0x3c66>
   1444c:	04 f5       	brge	.+64     	; 0x1448e <process_commands() [clone .part.46]+0x24d6>
   1444e:	8e 35       	cpi	r24, 0x5E	; 94
   14450:	b1 e0       	ldi	r27, 0x01	; 1
   14452:	9b 07       	cpc	r25, r27
   14454:	11 f4       	brne	.+4      	; 0x1445a <process_commands() [clone .part.46]+0x24a2>
   14456:	0c 94 4e b9 	jmp	0x1729c	; 0x1729c <process_commands() [clone .part.46]+0x52e4>
   1445a:	8f 35       	cpi	r24, 0x5F	; 95
   1445c:	91 40       	sbci	r25, 0x01	; 1
   1445e:	09 f0       	breq	.+2      	; 0x14462 <process_commands() [clone .part.46]+0x24aa>
   14460:	e0 ca       	rjmp	.-2624   	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>
    - `B` - new pin value
    */
    case 351:
    {
      #if defined(X_MS1_PIN) && X_MS1_PIN > -1
      if(code_seen('S')) switch((int)code_value())
   14462:	83 e5       	ldi	r24, 0x53	; 83
   14464:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   14468:	88 23       	and	r24, r24
   1446a:	71 f0       	breq	.+28     	; 0x14488 <process_commands() [clone .part.46]+0x24d0>
   1446c:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   14470:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   14474:	61 30       	cpi	r22, 0x01	; 1
   14476:	71 05       	cpc	r23, r1
   14478:	11 f4       	brne	.+4      	; 0x1447e <process_commands() [clone .part.46]+0x24c6>
   1447a:	0c 94 84 b9 	jmp	0x17308	; 0x17308 <process_commands() [clone .part.46]+0x5350>
   1447e:	62 30       	cpi	r22, 0x02	; 2
   14480:	71 05       	cpc	r23, r1
   14482:	11 f4       	brne	.+4      	; 0x14488 <process_commands() [clone .part.46]+0x24d0>
   14484:	0c 94 a6 b9 	jmp	0x1734c	; 0x1734c <process_commands() [clone .part.46]+0x5394>
        case 2:
          for(int i=0;i<NUM_AXIS;i++) if(code_seen(axis_codes[i])) microstep_ms(i,-1,code_value());
          if(code_seen('B')) microstep_ms(4,-1,code_value());
          break;
      }
      microstep_readings();
   14488:	0f 94 6d 19 	call	0x232da	; 0x232da <microstep_readings()>
   1448c:	c0 c1       	rjmp	.+896    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   1448e:	85 39       	cpi	r24, 0x95	; 149
   14490:	f1 e0       	ldi	r31, 0x01	; 1
   14492:	9f 07       	cpc	r25, r31
   14494:	11 f4       	brne	.+4      	; 0x1449a <process_commands() [clone .part.46]+0x24e2>
   14496:	0c 94 13 ae 	jmp	0x15c26	; 0x15c26 <process_commands() [clone .part.46]+0x3c6e>
   1449a:	86 39       	cpi	r24, 0x96	; 150
   1449c:	21 e0       	ldi	r18, 0x01	; 1
   1449e:	92 07       	cpc	r25, r18
   144a0:	11 f4       	brne	.+4      	; 0x144a6 <process_commands() [clone .part.46]+0x24ee>
   144a2:	0c 94 18 ae 	jmp	0x15c30	; 0x15c30 <process_commands() [clone .part.46]+0x3c78>
   144a6:	83 39       	cpi	r24, 0x93	; 147
   144a8:	91 40       	sbci	r25, 0x01	; 1
   144aa:	09 f0       	breq	.+2      	; 0x144ae <process_commands() [clone .part.46]+0x24f6>
   144ac:	ba ca       	rjmp	.-2700   	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>
    */
    case 403:
	{
		// currently three different materials are needed (default, flex and PVA)
		// add storing this information for different load/unload profiles etc. in the future
		if (MMU2::mmu2.Enabled())
   144ae:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   144b2:	81 30       	cpi	r24, 0x01	; 1
   144b4:	09 f0       	breq	.+2      	; 0x144b8 <process_commands() [clone .part.46]+0x2500>
   144b6:	ab c1       	rjmp	.+854    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
		{
			uint8_t extruder = 255;
			uint8_t filament = FILAMENT_UNDEFINED;
			if(code_seen('E')) extruder = code_value_uint8();
   144b8:	85 e4       	ldi	r24, 0x45	; 69
   144ba:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   144be:	81 11       	cpse	r24, r1
   144c0:	0e 94 0a 56 	call	0xac14	; 0xac14 <code_value_uint8()>
			if(code_seen('F')) filament = code_value_uint8();
   144c4:	86 e4       	ldi	r24, 0x46	; 70
   144c6:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   144ca:	81 11       	cpse	r24, r1
   144cc:	0e 94 0a 56 	call	0xac14	; 0xac14 <code_value_uint8()>
    MMU2_ECHO_MSGRPGM(PSTR("MMU2tool="));
    SERIAL_ECHOLN((int)ex);
}

bool MMU2::set_filament_type(uint8_t /*slot*/, uint8_t /*type*/) {
    if (!WaitForMMUReady()) {
   144d0:	0f 94 a6 79 	call	0x2f34c	; 0x2f34c <MMU2::MMU2::WaitForMMUReady() [clone .constprop.106]>
   144d4:	88 23       	and	r24, r24
   144d6:	09 f4       	brne	.+2      	; 0x144da <process_commands() [clone .part.46]+0x2522>
   144d8:	9a c1       	rjmp	.+820    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    //    slot = slot; // @@TODO
    //    type = type; // @@TODO
    // cmd_arg = filamentType;
    // command(MMU_CMD_F0 + index);

    if (!manage_response(false, false)) {
   144da:	60 e0       	ldi	r22, 0x00	; 0
   144dc:	80 e0       	ldi	r24, 0x00	; 0
   144de:	0f 94 aa 9c 	call	0x33954	; 0x33954 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]>
   144e2:	95 c1       	rjmp	.+810    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   144e4:	80 3c       	cpi	r24, 0xC0	; 192
   144e6:	42 e0       	ldi	r20, 0x02	; 2
   144e8:	94 07       	cpc	r25, r20
   144ea:	11 f4       	brne	.+4      	; 0x144f0 <process_commands() [clone .part.46]+0x2538>
   144ec:	0c 94 90 ba 	jmp	0x17520	; 0x17520 <process_commands() [clone .part.46]+0x5568>
   144f0:	0c f0       	brlt	.+2      	; 0x144f4 <process_commands() [clone .part.46]+0x253c>
   144f2:	57 c0       	rjmp	.+174    	; 0x145a2 <process_commands() [clone .part.46]+0x25ea>
   144f4:	88 32       	cpi	r24, 0x28	; 40
   144f6:	a2 e0       	ldi	r26, 0x02	; 2
   144f8:	9a 07       	cpc	r25, r26
   144fa:	11 f4       	brne	.+4      	; 0x14500 <process_commands() [clone .part.46]+0x2548>
   144fc:	0c 94 dc b0 	jmp	0x161b8	; 0x161b8 <process_commands() [clone .part.46]+0x4200>
   14500:	4c f5       	brge	.+82     	; 0x14554 <process_commands() [clone .part.46]+0x259c>
   14502:	86 3f       	cpi	r24, 0xF6	; 246
   14504:	e1 e0       	ldi	r30, 0x01	; 1
   14506:	9e 07       	cpc	r25, r30
   14508:	11 f4       	brne	.+4      	; 0x1450e <process_commands() [clone .part.46]+0x2556>
   1450a:	0c 94 25 ae 	jmp	0x15c4a	; 0x15c4a <process_commands() [clone .part.46]+0x3c92>
   1450e:	6c f4       	brge	.+26     	; 0x1452a <process_commands() [clone .part.46]+0x2572>
   14510:	84 3f       	cpi	r24, 0xF4	; 244
   14512:	21 e0       	ldi	r18, 0x01	; 1
   14514:	92 07       	cpc	r25, r18
   14516:	11 f4       	brne	.+4      	; 0x1451c <process_commands() [clone .part.46]+0x2564>
   14518:	0c 94 21 ae 	jmp	0x15c42	; 0x15c42 <process_commands() [clone .part.46]+0x3c8a>
   1451c:	85 3f       	cpi	r24, 0xF5	; 245
   1451e:	91 40       	sbci	r25, 0x01	; 1
   14520:	09 f0       	breq	.+2      	; 0x14524 <process_commands() [clone .part.46]+0x256c>
   14522:	7f ca       	rjmp	.-2818   	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>
        M501

    */
    case 501:
    {
        Config_RetrieveSettings();
   14524:	0e 94 04 87 	call	0x10e08	; 0x10e08 <Config_RetrieveSettings()>
   14528:	72 c1       	rjmp	.+740    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   1452a:	87 3f       	cpi	r24, 0xF7	; 247
   1452c:	41 e0       	ldi	r20, 0x01	; 1
   1452e:	94 07       	cpc	r25, r20
   14530:	11 f4       	brne	.+4      	; 0x14536 <process_commands() [clone .part.46]+0x257e>
   14532:	0c 94 29 ae 	jmp	0x15c52	; 0x15c52 <process_commands() [clone .part.46]+0x3c9a>
   14536:	8d 3f       	cpi	r24, 0xFD	; 253
   14538:	91 40       	sbci	r25, 0x01	; 1
   1453a:	09 f0       	breq	.+2      	; 0x1453e <process_commands() [clone .part.46]+0x2586>
   1453c:	72 ca       	rjmp	.-2844   	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>
        M509

    */
    case 509:
    {
		lang_reset();
   1453e:	0e 94 3d 74 	call	0xe87a	; 0xe87a <lang_reset>
        SERIAL_ECHO_START;
   14542:	8e ec       	ldi	r24, 0xCE	; 206
   14544:	91 ea       	ldi	r25, 0xA1	; 161
   14546:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        SERIAL_PROTOCOLPGM("LANG SEL FORCED");
   1454a:	8e e4       	ldi	r24, 0x4E	; 78
   1454c:	9f e7       	ldi	r25, 0x7F	; 127
   1454e:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   14552:	5d c1       	rjmp	.+698    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   14554:	8a 35       	cpi	r24, 0x5A	; 90
   14556:	a2 e0       	ldi	r26, 0x02	; 2
   14558:	9a 07       	cpc	r25, r26
   1455a:	11 f4       	brne	.+4      	; 0x14560 <process_commands() [clone .part.46]+0x25a8>
   1455c:	0c 94 07 b5 	jmp	0x16a0e	; 0x16a0e <process_commands() [clone .part.46]+0x4a56>
   14560:	5c f4       	brge	.+22     	; 0x14578 <process_commands() [clone .part.46]+0x25c0>
   14562:	88 35       	cpi	r24, 0x58	; 88
   14564:	e2 e0       	ldi	r30, 0x02	; 2
   14566:	9e 07       	cpc	r25, r30
   14568:	11 f4       	brne	.+4      	; 0x1456e <process_commands() [clone .part.46]+0x25b6>
   1456a:	0c 94 11 b1 	jmp	0x16222	; 0x16222 <process_commands() [clone .part.46]+0x426a>
   1456e:	89 35       	cpi	r24, 0x59	; 89
   14570:	92 40       	sbci	r25, 0x02	; 2
   14572:	09 f4       	brne	.+2      	; 0x14576 <process_commands() [clone .part.46]+0x25be>
   14574:	c3 ca       	rjmp	.-2682   	; 0x13afc <process_commands() [clone .part.46]+0x1b44>
   14576:	55 ca       	rjmp	.-2902   	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>
   14578:	8d 3b       	cpi	r24, 0xBD	; 189
   1457a:	22 e0       	ldi	r18, 0x02	; 2
   1457c:	92 07       	cpc	r25, r18
   1457e:	11 f4       	brne	.+4      	; 0x14584 <process_commands() [clone .part.46]+0x25cc>
   14580:	0c 94 bf b9 	jmp	0x1737e	; 0x1737e <process_commands() [clone .part.46]+0x53c6>
   14584:	8e 3b       	cpi	r24, 0xBE	; 190
   14586:	32 e0       	ldi	r19, 0x02	; 2
   14588:	93 07       	cpc	r25, r19
   1458a:	11 f4       	brne	.+4      	; 0x14590 <process_commands() [clone .part.46]+0x25d8>
   1458c:	0c 94 5c ba 	jmp	0x174b8	; 0x174b8 <process_commands() [clone .part.46]+0x5500>
   14590:	8b 35       	cpi	r24, 0x5B	; 91
   14592:	92 40       	sbci	r25, 0x02	; 2
   14594:	09 f0       	breq	.+2      	; 0x14598 <process_commands() [clone .part.46]+0x25e0>
   14596:	45 ca       	rjmp	.-2934   	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>
    /*!
    ### M603 - Stop print <a href="https://reprap.org/wiki/G-code#M603:_Stop_print">M603: Stop print</a>
    */

    case 603: {
        print_stop();
   14598:	60 e0       	ldi	r22, 0x00	; 0
   1459a:	80 e0       	ldi	r24, 0x00	; 0
   1459c:	0e 94 f9 de 	call	0x1bdf2	; 0x1bdf2 <print_stop(bool, bool)>
   145a0:	36 c1       	rjmp	.+620    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   145a2:	8c 35       	cpi	r24, 0x5C	; 92
   145a4:	53 e0       	ldi	r21, 0x03	; 3
   145a6:	95 07       	cpc	r25, r21
   145a8:	11 f4       	brne	.+4      	; 0x145ae <process_commands() [clone .part.46]+0x25f6>
   145aa:	0c 94 29 b6 	jmp	0x16c52	; 0x16c52 <process_commands() [clone .part.46]+0x4c9a>
   145ae:	0c f0       	brlt	.+2      	; 0x145b2 <process_commands() [clone .part.46]+0x25fa>
   145b0:	42 c0       	rjmp	.+132    	; 0x14636 <process_commands() [clone .part.46]+0x267e>
   145b2:	83 3c       	cpi	r24, 0xC3	; 195
   145b4:	b2 e0       	ldi	r27, 0x02	; 2
   145b6:	9b 07       	cpc	r25, r27
   145b8:	11 f4       	brne	.+4      	; 0x145be <process_commands() [clone .part.46]+0x2606>
   145ba:	0c 94 9c ba 	jmp	0x17538	; 0x17538 <process_commands() [clone .part.46]+0x5580>
   145be:	7c f4       	brge	.+30     	; 0x145de <process_commands() [clone .part.46]+0x2626>
   145c0:	81 3c       	cpi	r24, 0xC1	; 193
   145c2:	f2 e0       	ldi	r31, 0x02	; 2
   145c4:	9f 07       	cpc	r25, r31
   145c6:	11 f4       	brne	.+4      	; 0x145cc <process_commands() [clone .part.46]+0x2614>
   145c8:	0c 94 96 ba 	jmp	0x1752c	; 0x1752c <process_commands() [clone .part.46]+0x5574>
   145cc:	82 3c       	cpi	r24, 0xC2	; 194
   145ce:	92 40       	sbci	r25, 0x02	; 2
   145d0:	09 f0       	breq	.+2      	; 0x145d4 <process_commands() [clone .part.46]+0x261c>
   145d2:	27 ca       	rjmp	.-2994   	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>
    #### Parameters
    - `P` - n index of slot (zero based, so 0-4 like T0 and T4)
    */
    case 706:
    {
        gcodes_M704_M705_M706(706);
   145d4:	82 ec       	ldi	r24, 0xC2	; 194
   145d6:	92 e0       	ldi	r25, 0x02	; 2
   145d8:	0e 94 4b 5a 	call	0xb496	; 0xb496 <gcodes_M704_M705_M706(unsigned int)>
   145dc:	18 c1       	rjmp	.+560    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   145de:	85 3c       	cpi	r24, 0xC5	; 197
   145e0:	32 e0       	ldi	r19, 0x02	; 2
   145e2:	93 07       	cpc	r25, r19
   145e4:	11 f4       	brne	.+4      	; 0x145ea <process_commands() [clone .part.46]+0x2632>
   145e6:	0c 94 e5 ba 	jmp	0x175ca	; 0x175ca <process_commands() [clone .part.46]+0x5612>
   145ea:	14 f4       	brge	.+4      	; 0x145f0 <process_commands() [clone .part.46]+0x2638>
   145ec:	0c 94 b9 ba 	jmp	0x17572	; 0x17572 <process_commands() [clone .part.46]+0x55ba>
   145f0:	82 35       	cpi	r24, 0x52	; 82
   145f2:	93 40       	sbci	r25, 0x03	; 3
   145f4:	09 f0       	breq	.+2      	; 0x145f8 <process_commands() [clone .part.46]+0x2640>
   145f6:	15 ca       	rjmp	.-3030   	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>
	float z_val = 0;
	char strLabel[8];
	uint8_t iBedC = 0;
	uint8_t iPindaC = 0;
	bool bIsActive=false;
	strLabel[7] = '\0'; // null terminate.
   145f8:	18 86       	std	Y+8, r1	; 0x08
	size_t max_sheets = sizeof(EEPROM_Sheets_base->s)/sizeof(EEPROM_Sheets_base->s[0]);

	if (code_seen('S')) {
   145fa:	83 e5       	ldi	r24, 0x53	; 83
   145fc:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   14600:	88 23       	and	r24, r24
   14602:	11 f4       	brne	.+4      	; 0x14608 <process_commands() [clone .part.46]+0x2650>
   14604:	0c 94 0f b5 	jmp	0x16a1e	; 0x16a1e <process_commands() [clone .part.46]+0x4a66>
		iSel = code_value_uint8();
   14608:	0e 94 0a 56 	call	0xac14	; 0xac14 <code_value_uint8()>
   1460c:	18 2f       	mov	r17, r24
		if (iSel>=max_sheets)
   1460e:	88 30       	cpi	r24, 0x08	; 8
   14610:	10 f4       	brcc	.+4      	; 0x14616 <process_commands() [clone .part.46]+0x265e>
   14612:	0c 94 14 b5 	jmp	0x16a28	; 0x16a28 <process_commands() [clone .part.46]+0x4a70>
		{
			SERIAL_PROTOCOLPGM("Invalid sheet ID. Allowed: 0..");
   14616:	8a e2       	ldi	r24, 0x2A	; 42
   14618:	9f e7       	ldi	r25, 0x7F	; 127
   1461a:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
}

void MarlinSerial::print(unsigned long n, int base)
{
  if (base == 0) write(n);
  else printNumber(n, base);
   1461e:	4a e0       	ldi	r20, 0x0A	; 10
   14620:	67 e0       	ldi	r22, 0x07	; 7
   14622:	70 e0       	ldi	r23, 0x00	; 0
   14624:	80 e0       	ldi	r24, 0x00	; 0
   14626:	90 e0       	ldi	r25, 0x00	; 0
   14628:	0e 94 c5 79 	call	0xf38a	; 0xf38a <MarlinSerial::printNumber(unsigned long, unsigned char)>
			SERIAL_PROTOCOL(max_sheets-1);
			SERIAL_PROTOCOLLN("");
   1462c:	8f ed       	ldi	r24, 0xDF	; 223
   1462e:	92 e0       	ldi	r25, 0x02	; 2
   14630:	0e 94 a1 87 	call	0x10f42	; 0x10f42 <MarlinSerial::println(char const*)>
   14634:	ec c0       	rjmp	.+472    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   14636:	84 38       	cpi	r24, 0x84	; 132
   14638:	a3 e0       	ldi	r26, 0x03	; 3
   1463a:	9a 07       	cpc	r25, r26
   1463c:	11 f4       	brne	.+4      	; 0x14642 <process_commands() [clone .part.46]+0x268a>
   1463e:	0c 94 9f b8 	jmp	0x1713e	; 0x1713e <process_commands() [clone .part.46]+0x5186>
   14642:	0c f0       	brlt	.+2      	; 0x14646 <process_commands() [clone .part.46]+0x268e>
   14644:	4d c0       	rjmp	.+154    	; 0x146e0 <process_commands() [clone .part.46]+0x2728>
   14646:	8d 35       	cpi	r24, 0x5D	; 93
   14648:	e3 e0       	ldi	r30, 0x03	; 3
   1464a:	9e 07       	cpc	r25, r30
   1464c:	11 f4       	brne	.+4      	; 0x14652 <process_commands() [clone .part.46]+0x269a>
   1464e:	0c 94 b3 b6 	jmp	0x16d66	; 0x16d66 <process_commands() [clone .part.46]+0x4dae>
   14652:	8e 35       	cpi	r24, 0x5E	; 94
   14654:	93 40       	sbci	r25, 0x03	; 3
   14656:	09 f0       	breq	.+2      	; 0x1465a <process_commands() [clone .part.46]+0x26a2>
   14658:	e4 c9       	rjmp	.-3128   	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>
    */
    case 862: // M862: print checking
    {
        // Read the decimal by multiplying the float value by 10 e.g. 862.1 becomes 8621
        // This method consumes less flash memory compared to checking the string length.
        ClPrintChecking nCommand = static_cast<ClPrintChecking>((uint16_t)(code_value()*10) - 8620u);
   1465a:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   1465e:	20 e0       	ldi	r18, 0x00	; 0
   14660:	30 e0       	ldi	r19, 0x00	; 0
   14662:	40 e2       	ldi	r20, 0x20	; 32
   14664:	51 e4       	ldi	r21, 0x41	; 65
   14666:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   1466a:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   1466e:	6c 5a       	subi	r22, 0xAC	; 172
        switch(nCommand)
   14670:	63 30       	cpi	r22, 0x03	; 3
   14672:	11 f4       	brne	.+4      	; 0x14678 <process_commands() [clone .part.46]+0x26c0>
   14674:	0c 94 b9 b7 	jmp	0x16f72	; 0x16f72 <process_commands() [clone .part.46]+0x4fba>
   14678:	10 f0       	brcs	.+4      	; 0x1467e <process_commands() [clone .part.46]+0x26c6>
   1467a:	0c 94 4b b7 	jmp	0x16e96	; 0x16e96 <process_commands() [clone .part.46]+0x4ede>
   1467e:	61 30       	cpi	r22, 0x01	; 1
   14680:	11 f4       	brne	.+4      	; 0x14686 <process_commands() [clone .part.46]+0x26ce>
   14682:	0c 94 74 b7 	jmp	0x16ee8	; 0x16ee8 <process_commands() [clone .part.46]+0x4f30>
   14686:	62 30       	cpi	r22, 0x02	; 2
   14688:	09 f0       	breq	.+2      	; 0x1468c <process_commands() [clone .part.46]+0x26d4>
   1468a:	c1 c0       	rjmp	.+386    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        ,(uint8_t)oCheckModel
    );
}

uint16_t nPrinterType(bool bMMu) {
    if (bMMu) {
   1468c:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
        return pgm_read_word(&_nPrinterMmuType);
   14690:	ee e3       	ldi	r30, 0x3E	; 62
   14692:	f9 e7       	ldi	r31, 0x79	; 121
        ,(uint8_t)oCheckModel
    );
}

uint16_t nPrinterType(bool bMMu) {
    if (bMMu) {
   14694:	81 30       	cpi	r24, 0x01	; 1
   14696:	11 f0       	breq	.+4      	; 0x1469c <process_commands() [clone .part.46]+0x26e4>
        return pgm_read_word(&_nPrinterMmuType);
    }
    else {
        return pgm_read_word(&_nPrinterType);
   14698:	e0 e4       	ldi	r30, 0x40	; 64
   1469a:	f9 e7       	ldi	r31, 0x79	; 121
   1469c:	05 91       	lpm	r16, Z+
   1469e:	14 91       	lpm	r17, Z
                    else if(code_seen('Q'))
                         SERIAL_PROTOCOLLN((float)eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM)/1000.0);
                    break;
               case ClPrintChecking::_Model: {    // ~ .2
                    uint16_t type = nPrinterType(MMU2::mmu2.Enabled());
                    if(code_seen('P'))
   146a0:	80 e5       	ldi	r24, 0x50	; 80
   146a2:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   146a6:	88 23       	and	r24, r24
   146a8:	11 f4       	brne	.+4      	; 0x146ae <process_commands() [clone .part.46]+0x26f6>
   146aa:	0c 94 a8 b7 	jmp	0x16f50	; 0x16f50 <process_commands() [clone .part.46]+0x4f98>
                         {
                         uint16_t nPrinterModel;
                         nPrinterModel=(uint16_t)code_value_long();
   146ae:	0e 94 5d 56 	call	0xacba	; 0xacba <code_value_long() [clone .lto_priv.507]>
        menu_submenu(lcd_hw_setup_menu);
    }
}

void printer_model_check(uint16_t nPrinterModel, uint16_t actualPrinterModel) {
    if (oCheckModel == ClCheckMode::_None)
   146b2:	f0 90 ea 03 	lds	r15, 0x03EA	; 0x8003ea <oCheckModel>
   146b6:	ff 20       	and	r15, r15
   146b8:	09 f4       	brne	.+2      	; 0x146bc <process_commands() [clone .part.46]+0x2704>
   146ba:	a9 c0       	rjmp	.+338    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        return;
    if (nPrinterModel == actualPrinterModel)
   146bc:	60 17       	cp	r22, r16
   146be:	71 07       	cpc	r23, r17
   146c0:	09 f4       	brne	.+2      	; 0x146c4 <process_commands() [clone .part.46]+0x270c>
   146c2:	a5 c0       	rjmp	.+330    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    // SERIAL_ECHOLNPGM("Printer model differs from the G-code ...");
    // SERIAL_ECHOPGM("actual  : ");
    // SERIAL_ECHOLN(actualPrinterModel);
    // SERIAL_ECHOPGM("expected: ");
    // SERIAL_ECHOLN(nPrinterModel);
    render_M862_warnings(
   146c4:	89 e8       	ldi	r24, 0x89	; 137
   146c6:	97 e3       	ldi	r25, 0x37	; 55
   146c8:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   146cc:	8c 01       	movw	r16, r24
   146ce:	8b e5       	ldi	r24, 0x5B	; 91
   146d0:	97 e3       	ldi	r25, 0x37	; 55
   146d2:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   146d6:	4f 2d       	mov	r20, r15
   146d8:	b8 01       	movw	r22, r16
   146da:	0e 94 df ea 	call	0x1d5be	; 0x1d5be <render_M862_warnings(char const*, char const*, unsigned char) [clone .lto_priv.521]>
   146de:	97 c0       	rjmp	.+302    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
	  } else
	  {
	  mcode_in_progress = code_value_short();
//	printf_P(_N("BEGIN M-CODE=%u\n"), mcode_in_progress);

    switch(mcode_in_progress)
   146e0:	8c 38       	cpi	r24, 0x8C	; 140
   146e2:	23 e0       	ldi	r18, 0x03	; 3
   146e4:	92 07       	cpc	r25, r18
   146e6:	09 f4       	brne	.+2      	; 0x146ea <process_commands() [clone .part.46]+0x2732>
   146e8:	92 c0       	rjmp	.+292    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
   146ea:	80 3a       	cpi	r24, 0xA0	; 160
   146ec:	33 e0       	ldi	r19, 0x03	; 3
   146ee:	93 07       	cpc	r25, r19
   146f0:	09 f4       	brne	.+2      	; 0x146f4 <process_commands() [clone .part.46]+0x273c>
   146f2:	50 c2       	rjmp	.+1184   	; 0x14b94 <process_commands() [clone .part.46]+0x2bdc>
   146f4:	8b 38       	cpi	r24, 0x8B	; 139
   146f6:	93 40       	sbci	r25, 0x03	; 3
   146f8:	09 f0       	breq	.+2      	; 0x146fc <process_commands() [clone .part.46]+0x2744>
   146fa:	93 c9       	rjmp	.-3290   	; 0x13a22 <process_commands() [clone .part.46]+0x1a6a>
        for(int i=0;i<NUM_AXIS;i++) if(code_seen(axis_codes[i])) st_current_set(i,code_value());
        if(code_seen('B')) st_current_set(4,code_value());
        if(code_seen('S')) for(int i=0;i<=4;i++) st_current_set(i,code_value());
      #endif
      #ifdef MOTOR_CURRENT_PWM_XY_PIN
        if(code_seen('X')) st_current_set(0, code_value());
   146fc:	88 e5       	ldi	r24, 0x58	; 88
   146fe:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   14702:	88 23       	and	r24, r24
   14704:	39 f0       	breq	.+14     	; 0x14714 <process_commands() [clone .part.46]+0x275c>
   14706:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   1470a:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   1470e:	80 e0       	ldi	r24, 0x00	; 0
   14710:	0f 94 5e 1a 	call	0x234bc	; 0x234bc <st_current_set(unsigned char, int)>
      #endif
      #ifdef MOTOR_CURRENT_PWM_Z_PIN
        if(code_seen('Z')) st_current_set(1, code_value());
   14714:	8a e5       	ldi	r24, 0x5A	; 90
   14716:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   1471a:	88 23       	and	r24, r24
   1471c:	39 f0       	breq	.+14     	; 0x1472c <process_commands() [clone .part.46]+0x2774>
   1471e:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   14722:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   14726:	81 e0       	ldi	r24, 0x01	; 1
   14728:	0f 94 5e 1a 	call	0x234bc	; 0x234bc <st_current_set(unsigned char, int)>
      #endif
      #ifdef MOTOR_CURRENT_PWM_E_PIN
        if(code_seen('E')) st_current_set(2, code_value());
   1472c:	85 e4       	ldi	r24, 0x45	; 69
   1472e:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   14732:	88 23       	and	r24, r24
   14734:	09 f4       	brne	.+2      	; 0x14738 <process_commands() [clone .part.46]+0x2780>
   14736:	6b c0       	rjmp	.+214    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
   14738:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   1473c:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   14740:	cb 01       	movw	r24, r22
   14742:	0f 94 5e 19 	call	0x232bc	; 0x232bc <st_current_set(unsigned char, int) [clone .part.2]>
   14746:	63 c0       	rjmp	.+198    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    - `string` - Must for M1 and optional for M0 message to display on the LCD
    */

    case 0:
    case 1: {
        const char *src = strchr_pointer + 2;
   14748:	00 91 bb 04 	lds	r16, 0x04BB	; 0x8004bb <strchr_pointer>
   1474c:	10 91 bc 04 	lds	r17, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
   14750:	0e 5f       	subi	r16, 0xFE	; 254
   14752:	1f 4f       	sbci	r17, 0xFF	; 255
        codenum = 0;
        if (code_seen('P')) codenum = code_value_long(); // milliseconds to wait
   14754:	80 e5       	ldi	r24, 0x50	; 80
   14756:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
    */

    case 0:
    case 1: {
        const char *src = strchr_pointer + 2;
        codenum = 0;
   1475a:	c1 2c       	mov	r12, r1
   1475c:	d1 2c       	mov	r13, r1
   1475e:	76 01       	movw	r14, r12
        if (code_seen('P')) codenum = code_value_long(); // milliseconds to wait
   14760:	88 23       	and	r24, r24
   14762:	21 f0       	breq	.+8      	; 0x1476c <process_commands() [clone .part.46]+0x27b4>
   14764:	0e 94 5d 56 	call	0xacba	; 0xacba <code_value_long() [clone .lto_priv.507]>
   14768:	6b 01       	movw	r12, r22
   1476a:	7c 01       	movw	r14, r24
        if (code_seen('S')) codenum = code_value_long() * 1000; // seconds to wait
   1476c:	83 e5       	ldi	r24, 0x53	; 83
   1476e:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   14772:	88 23       	and	r24, r24
   14774:	51 f0       	breq	.+20     	; 0x1478a <process_commands() [clone .part.46]+0x27d2>
   14776:	0e 94 5d 56 	call	0xacba	; 0xacba <code_value_long() [clone .lto_priv.507]>
   1477a:	9b 01       	movw	r18, r22
   1477c:	ac 01       	movw	r20, r24
   1477e:	a8 ee       	ldi	r26, 0xE8	; 232
   14780:	b3 e0       	ldi	r27, 0x03	; 3
   14782:	0f 94 75 a4 	call	0x348ea	; 0x348ea <__muluhisi3>
   14786:	6b 01       	movw	r12, r22
   14788:	7c 01       	movw	r14, r24
   1478a:	c8 01       	movw	r24, r16
   1478c:	0f 5f       	subi	r16, 0xFF	; 255
   1478e:	1f 4f       	sbci	r17, 0xFF	; 255
        bool expiration_time_set = bool(codenum);

        while (*src == ' ') ++src;
   14790:	dc 01       	movw	r26, r24
   14792:	4c 91       	ld	r20, X
   14794:	40 32       	cpi	r20, 0x20	; 32
   14796:	c9 f3       	breq	.-14     	; 0x1478a <process_commands() [clone .part.46]+0x27d2>
        custom_message_type = CustomMsg::M0Wait;
   14798:	26 e0       	ldi	r18, 0x06	; 6
   1479a:	20 93 5d 06 	sts	0x065D, r18	; 0x80065d <custom_message_type>
        if (!expiration_time_set && *src != '\0') {
   1479e:	c1 14       	cp	r12, r1
   147a0:	d1 04       	cpc	r13, r1
   147a2:	e1 04       	cpc	r14, r1
   147a4:	f1 04       	cpc	r15, r1
   147a6:	c9 f5       	brne	.+114    	; 0x1481a <process_commands() [clone .part.46]+0x2862>
   147a8:	2c 91       	ld	r18, X
   147aa:	22 23       	and	r18, r18
   147ac:	b1 f1       	breq	.+108    	; 0x1481a <process_commands() [clone .part.46]+0x2862>
            lcd_setstatus(src);
   147ae:	0e 94 e8 de 	call	0x1bdd0	; 0x1bdd0 <lcd_setstatus(char const*)>
                LCD_MESSAGERPGM(_T(MSG_USERWAIT));
            } else {
                custom_message_type = CustomMsg::Status; // let the lcd display the name of the printed G-code file in farm mode
            }
        }
        st_synchronize();
   147b2:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
        menu_set_block(MENU_BLOCK_STATUS_SCREEN_M0);
   147b6:	80 91 3a 12 	lds	r24, 0x123A	; 0x80123a <menu_block_mask>
   147ba:	84 60       	ori	r24, 0x04	; 4
   147bc:	80 93 3a 12 	sts	0x123A, r24	; 0x80123a <menu_block_mask>
        previous_millis_cmd.start();
   147c0:	88 e4       	ldi	r24, 0x48	; 72
   147c2:	93 e0       	ldi	r25, 0x03	; 3
   147c4:	0f 94 47 10 	call	0x2208e	; 0x2208e <Timer<unsigned long>::start()>
        if (expiration_time_set) {
   147c8:	c1 14       	cp	r12, r1
   147ca:	d1 04       	cpc	r13, r1
   147cc:	e1 04       	cpc	r14, r1
   147ce:	f1 04       	cpc	r15, r1
   147d0:	d9 f1       	breq	.+118    	; 0x14848 <process_commands() [clone .part.46]+0x2890>
            codenum += _millis();  // keep track of when we started waiting
   147d2:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   147d6:	c6 0e       	add	r12, r22
   147d8:	d7 1e       	adc	r13, r23
   147da:	e8 1e       	adc	r14, r24
   147dc:	f9 1e       	adc	r15, r25
            KEEPALIVE_STATE(PAUSED_FOR_USER);
   147de:	84 e0       	ldi	r24, 0x04	; 4
   147e0:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
            while(_millis() < codenum && !lcd_clicked()) {
   147e4:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   147e8:	6c 15       	cp	r22, r12
   147ea:	7d 05       	cpc	r23, r13
   147ec:	8e 05       	cpc	r24, r14
   147ee:	9f 05       	cpc	r25, r15
   147f0:	10 f1       	brcs	.+68     	; 0x14836 <process_commands() [clone .part.46]+0x287e>
                delay_keep_alive(0);
            }
            KEEPALIVE_STATE(IN_HANDLER);
   147f2:	82 e0       	ldi	r24, 0x02	; 2
   147f4:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
        } else {
            marlin_wait_for_click();
        }
        menu_unset_block(MENU_BLOCK_STATUS_SCREEN_M0);
   147f8:	80 91 3a 12 	lds	r24, 0x123A	; 0x80123a <menu_block_mask>
   147fc:	8b 7f       	andi	r24, 0xFB	; 251
   147fe:	80 93 3a 12 	sts	0x123A, r24	; 0x80123a <menu_block_mask>
        if (IS_SD_PRINTING)
   14802:	80 91 d7 13 	lds	r24, 0x13D7	; 0x8013d7 <card+0x2>
   14806:	88 23       	and	r24, r24
   14808:	91 f1       	breq	.+100    	; 0x1486e <process_commands() [clone .part.46]+0x28b6>
            custom_message_type = CustomMsg::Status;
   1480a:	10 92 5d 06 	sts	0x065D, r1	; 0x80065d <custom_message_type>
    */
	default:
		printf_P(MSG_UNKNOWN_CODE, 'M', cmdbuffer + bufindr + CMDHDRSIZE);
    }
//  printf_P(_N("END M-CODE=%u\n"), mcode_in_progress);
	mcode_in_progress = 0;
   1480e:	10 92 41 0d 	sts	0x0D41, r1	; 0x800d41 <_ZL17mcode_in_progress.lto_priv.489+0x1>
   14812:	10 92 40 0d 	sts	0x0D40, r1	; 0x800d40 <_ZL17mcode_in_progress.lto_priv.489>
   14816:	0c 94 2c 90 	jmp	0x12058	; 0x12058 <process_commands() [clone .part.46]+0xa0>
            lcd_setstatus(src);
        } else {
            // farmers want to abuse a bug from the previous firmware releases
            // - they need to see the filename on the status screen instead of "Wait for user..."
            // So we won't update the message in farm mode...
            if( ! farm_mode){
   1481a:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   1481e:	81 11       	cpse	r24, r1
   14820:	07 c0       	rjmp	.+14     	; 0x14830 <process_commands() [clone .part.46]+0x2878>
                LCD_MESSAGERPGM(_T(MSG_USERWAIT));
   14822:	8e e7       	ldi	r24, 0x7E	; 126
   14824:	99 e3       	ldi	r25, 0x39	; 57
   14826:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1482a:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
   1482e:	c1 cf       	rjmp	.-126    	; 0x147b2 <process_commands() [clone .part.46]+0x27fa>
            } else {
                custom_message_type = CustomMsg::Status; // let the lcd display the name of the printed G-code file in farm mode
   14830:	10 92 5d 06 	sts	0x065D, r1	; 0x80065d <custom_message_type>
   14834:	be cf       	rjmp	.-132    	; 0x147b2 <process_commands() [clone .part.46]+0x27fa>
        menu_set_block(MENU_BLOCK_STATUS_SCREEN_M0);
        previous_millis_cmd.start();
        if (expiration_time_set) {
            codenum += _millis();  // keep track of when we started waiting
            KEEPALIVE_STATE(PAUSED_FOR_USER);
            while(_millis() < codenum && !lcd_clicked()) {
   14836:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   1483a:	81 11       	cpse	r24, r1
   1483c:	da cf       	rjmp	.-76     	; 0x147f2 <process_commands() [clone .part.46]+0x283a>
                delay_keep_alive(0);
   1483e:	90 e0       	ldi	r25, 0x00	; 0
   14840:	80 e0       	ldi	r24, 0x00	; 0
   14842:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
   14846:	ce cf       	rjmp	.-100    	; 0x147e4 <process_commands() [clone .part.46]+0x282c>
//! @brief Wait for click
//!
//! Set
void marlin_wait_for_click()
{
    int8_t busy_state_backup = busy_state;
   14848:	10 91 78 02 	lds	r17, 0x0278	; 0x800278 <busy_state>
    KEEPALIVE_STATE(PAUSED_FOR_USER);
   1484c:	84 e0       	ldi	r24, 0x04	; 4
   1484e:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
    lcd_consume_click();
   14852:	0e 94 70 73 	call	0xe6e0	; 0xe6e0 <lcd_consume_click()>
    while(!lcd_clicked())
   14856:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   1485a:	81 11       	cpse	r24, r1
   1485c:	05 c0       	rjmp	.+10     	; 0x14868 <process_commands() [clone .part.46]+0x28b0>
    {
        delay_keep_alive(0);
   1485e:	90 e0       	ldi	r25, 0x00	; 0
   14860:	80 e0       	ldi	r24, 0x00	; 0
   14862:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
   14866:	f7 cf       	rjmp	.-18     	; 0x14856 <process_commands() [clone .part.46]+0x289e>
    }
    KEEPALIVE_STATE(busy_state_backup);
   14868:	10 93 78 02 	sts	0x0278, r17	; 0x800278 <busy_state>
   1486c:	c5 cf       	rjmp	.-118    	; 0x147f8 <process_commands() [clone .part.46]+0x2840>
        }
        menu_unset_block(MENU_BLOCK_STATUS_SCREEN_M0);
        if (IS_SD_PRINTING)
            custom_message_type = CustomMsg::Status;
        else
            LCD_MESSAGERPGM(MSG_WELCOME);
   1486e:	86 ee       	ldi	r24, 0xE6	; 230
   14870:	9b e6       	ldi	r25, 0x6B	; 107
   14872:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
   14876:	cb cf       	rjmp	.-106    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    /*!
    ### M17 - Enable all axes <a href="https://reprap.org/wiki/G-code#M17:_Enable.2FPower_all_stepper_motors">M17: Enable/Power all stepper motors</a>
    */

    case 17:
        LCD_MESSAGERPGM(_T(MSG_NO_MOVE));
   14878:	83 e7       	ldi	r24, 0x73	; 115
   1487a:	99 e3       	ldi	r25, 0x39	; 57
   1487c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   14880:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
        enable_x();
   14884:	17 98       	cbi	0x02, 7	; 2
        enable_y();
   14886:	16 98       	cbi	0x02, 6	; 2
        enable_z();
   14888:	15 98       	cbi	0x02, 5	; 2
        enable_e0();
   1488a:	14 98       	cbi	0x02, 4	; 2
   1488c:	c0 cf       	rjmp	.-128    	; 0x1480e <process_commands() [clone .part.46]+0x2856>

    /*!
    ### M21 - Init SD card <a href="https://reprap.org/wiki/G-code#M21:_Initialize_SD_card">M21: Initialize SD card</a>
    */
    case 21:
      card.mount();
   1488e:	81 e0       	ldi	r24, 0x01	; 1
   14890:	0f 94 6a 73 	call	0x2e6d4	; 0x2e6d4 <CardReader::mount(bool) [clone .constprop.192]>
   14894:	bc cf       	rjmp	.-136    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
		presort_flag = true;
#endif
}
void CardReader::release()
{
  sdprinting = false;
   14896:	10 92 d7 13 	sts	0x13D7, r1	; 0x8013d7 <card+0x2>
  mounted = false;
   1489a:	10 92 d8 13 	sts	0x13D8, r1	; 0x8013d8 <card+0x3>
  SERIAL_ECHO_START;
   1489e:	8e ec       	ldi	r24, 0xCE	; 206
   148a0:	91 ea       	ldi	r25, 0xA1	; 161
   148a2:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
  SERIAL_ECHOLNRPGM(_n("SD card released"));////MSG_SD_CARD_RELEASED
   148a6:	88 ea       	ldi	r24, 0xA8	; 168
   148a8:	98 e6       	ldi	r25, 0x68	; 104
   148aa:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   148ae:	af cf       	rjmp	.-162    	; 0x1480e <process_commands() [clone .part.46]+0x2856>

    /*!
    ### M24 - Start SD print <a href="https://reprap.org/wiki/G-code#M24:_Start.2Fresume_SD_print">M24: Start/resume SD print</a>
    */
    case 24:
    if (printingIsPaused())
   148b0:	0e 94 35 66 	call	0xcc6a	; 0xcc6a <printingIsPaused()>
   148b4:	88 23       	and	r24, r24
   148b6:	19 f0       	breq	.+6      	; 0x148be <process_commands() [clone .part.46]+0x2906>
      lcd_resume_print();
   148b8:	0e 94 b9 de 	call	0x1bd72	; 0x1bd72 <lcd_resume_print()>
   148bc:	a8 cf       	rjmp	.-176    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    else
    {
      if (!filament_presence_check()) {
   148be:	0e 94 f0 ea 	call	0x1d5e0	; 0x1d5e0 <filament_presence_check()>
   148c2:	88 23       	and	r24, r24
   148c4:	09 f4       	brne	.+2      	; 0x148c8 <process_commands() [clone .part.46]+0x2910>
   148c6:	a3 cf       	rjmp	.-186    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
      return c;
  };
  void setIndex(long index) {sdpos = index;file.seekSetFilteredGcode(index);};
  FORCE_INLINE uint8_t percentDone(){if(!isFileOpen()) return 0; if(filesize) return sdpos/((filesize+99)/100); else return 0;};
  FORCE_INLINE char* getWorkDirName(){workDir.getFilename(filename);return filename;};
  FORCE_INLINE uint32_t get_sdpos() { if (!isFileOpen()) return 0; else return(sdpos); };
   148c8:	80 91 6a 16 	lds	r24, 0x166A	; 0x80166a <card+0x295>
   148cc:	88 23       	and	r24, r24
   148ce:	61 f0       	breq	.+24     	; 0x148e8 <process_commands() [clone .part.46]+0x2930>
        // Print was aborted
        break;
      }

      if (!card.get_sdpos())
   148d0:	80 91 eb 16 	lds	r24, 0x16EB	; 0x8016eb <card+0x316>
   148d4:	90 91 ec 16 	lds	r25, 0x16EC	; 0x8016ec <card+0x317>
   148d8:	a0 91 ed 16 	lds	r26, 0x16ED	; 0x8016ed <card+0x318>
   148dc:	b0 91 ee 16 	lds	r27, 0x16EE	; 0x8016ee <card+0x319>
   148e0:	89 2b       	or	r24, r25
   148e2:	8a 2b       	or	r24, r26
   148e4:	8b 2b       	or	r24, r27
   148e6:	69 f4       	brne	.+26     	; 0x14902 <process_commands() [clone .part.46]+0x294a>
      {
              // A new print has started from scratch, reset stats
              failstats_reset_print();
   148e8:	0e 94 68 56 	call	0xacd0	; 0xacd0 <failstats_reset_print()>
              sdpos_atomic = 0;
   148ec:	10 92 49 12 	sts	0x1249, r1	; 0x801249 <sdpos_atomic>
   148f0:	10 92 4a 12 	sts	0x124A, r1	; 0x80124a <sdpos_atomic+0x1>
   148f4:	10 92 4b 12 	sts	0x124B, r1	; 0x80124b <sdpos_atomic+0x2>
   148f8:	10 92 4c 12 	sts	0x124C, r1	; 0x80124c <sdpos_atomic+0x3>
   148fc:	80 e0       	ldi	r24, 0x00	; 0
   148fe:	0e 94 04 86 	call	0x10c08	; 0x10c08 <la10c_mode_change(LA10C_MODE)>
}

void CardReader::startFileprint()
{
  if(mounted)
   14902:	80 91 d8 13 	lds	r24, 0x13D8	; 0x8013d8 <card+0x3>
   14906:	88 23       	and	r24, r24
   14908:	31 f0       	breq	.+12     	; 0x14916 <process_commands() [clone .part.46]+0x295e>
  {
    sdprinting = true;
   1490a:	81 e0       	ldi	r24, 0x01	; 1
   1490c:	80 93 d7 13 	sts	0x13D7, r24	; 0x8013d7 <card+0x2>
   14910:	85 e0       	ldi	r24, 0x05	; 5
   14912:	80 93 61 0d 	sts	0x0D61, r24	; 0x800d61 <_ZL13printer_state.lto_priv.386>
        la10c_reset();
#endif
      }

      card.startFileprint();
      print_job_timer.start();
   14916:	0f 94 25 19 	call	0x2324a	; 0x2324a <Stopwatch::start()>
      if (MMU2::mmu2.Enabled())
   1491a:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   1491e:	81 30       	cpi	r24, 0x01	; 1
   14920:	09 f0       	breq	.+2      	; 0x14924 <process_commands() [clone .part.46]+0x296c>
   14922:	75 cf       	rjmp	.-278    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
      {
        if (MMU2::mmu2.FindaDetectsFilament() && !fsensor.getFilamentPresent())
   14924:	80 91 d7 12 	lds	r24, 0x12D7	; 0x8012d7 <MMU2::mmu2+0x45>
   14928:	88 23       	and	r24, r24
   1492a:	09 f4       	brne	.+2      	; 0x1492e <process_commands() [clone .part.46]+0x2976>
   1492c:	70 cf       	rjmp	.-288    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
   1492e:	80 91 fe 16 	lds	r24, 0x16FE	; 0x8016fe <fsensor+0xd>
   14932:	81 11       	cpse	r24, r1
   14934:	6c cf       	rjmp	.-296    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        { // Filament only half way into the PTFE. Unload the filament.
          MMU2::mmu2.unload();
   14936:	0f 94 71 9d 	call	0x33ae2	; 0x33ae2 <MMU2::MMU2::unload() [clone .constprop.105]>
   1493a:	69 cf       	rjmp	.-302    	; 0x1480e <process_commands() [clone .part.46]+0x2856>

    #### Parameters
      - `S` - Index in bytes
    */
    case 26:
      if(card.mounted && code_seen('S')) {
   1493c:	80 91 d8 13 	lds	r24, 0x13D8	; 0x8013d8 <card+0x3>
   14940:	88 23       	and	r24, r24
   14942:	09 f4       	brne	.+2      	; 0x14946 <process_commands() [clone .part.46]+0x298e>
   14944:	64 cf       	rjmp	.-312    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
   14946:	83 e5       	ldi	r24, 0x53	; 83
   14948:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   1494c:	88 23       	and	r24, r24
   1494e:	09 f4       	brne	.+2      	; 0x14952 <process_commands() [clone .part.46]+0x299a>
   14950:	5e cf       	rjmp	.-324    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        long index = code_value_long();
   14952:	0e 94 5d 56 	call	0xacba	; 0xacba <code_value_long() [clone .lto_priv.507]>
   14956:	6b 01       	movw	r12, r22
   14958:	7c 01       	movw	r14, r24
  {
      int16_t c = (int16_t)file.readFilteredGcode();
      sdpos = file.curPosition();
      return c;
  };
  void setIndex(long index) {sdpos = index;file.seekSetFilteredGcode(index);};
   1495a:	c0 92 eb 16 	sts	0x16EB, r12	; 0x8016eb <card+0x316>
   1495e:	d0 92 ec 16 	sts	0x16EC, r13	; 0x8016ec <card+0x317>
   14962:	e0 92 ed 16 	sts	0x16ED, r14	; 0x8016ed <card+0x318>
   14966:	f0 92 ee 16 	sts	0x16EE, r15	; 0x8016ee <card+0x319>
   1496a:	0f 94 17 68 	call	0x2d02e	; 0x2d02e <SdFile::seekSetFilteredGcode(unsigned long) [clone .constprop.289]>
        card.setIndex(index);
        // We don't disable interrupt during update of sdpos_atomic
        // as we expect, that SD card print is not active in this moment
        sdpos_atomic = index;
   1496e:	c0 92 49 12 	sts	0x1249, r12	; 0x801249 <sdpos_atomic>
   14972:	d0 92 4a 12 	sts	0x124A, r13	; 0x80124a <sdpos_atomic+0x1>
   14976:	e0 92 4b 12 	sts	0x124B, r14	; 0x80124b <sdpos_atomic+0x2>
   1497a:	f0 92 4c 12 	sts	0x124C, r15	; 0x80124c <sdpos_atomic+0x3>
   1497e:	47 cf       	rjmp	.-370    	; 0x1480e <process_commands() [clone .part.46]+0x2856>

    #### Parameters
      - `P` - Show full SFN path instead of LFN only.
    */
    case 27:
      card.getStatus(code_seen('P'));
   14980:	80 e5       	ldi	r24, 0x50	; 80
   14982:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   14986:	18 2f       	mov	r17, r24
	return filesize;
}

void CardReader::getStatus(bool arg_P)
{
    if (printingIsPaused())
   14988:	0e 94 35 66 	call	0xcc6a	; 0xcc6a <printingIsPaused()>
   1498c:	88 23       	and	r24, r24
   1498e:	91 f0       	breq	.+36     	; 0x149b4 <process_commands() [clone .part.46]+0x29fc>
    {
        if (saved_printing && (saved_printing_type == PowerPanic::PRINT_TYPE_SD))
   14990:	80 91 73 12 	lds	r24, 0x1273	; 0x801273 <saved_printing>
   14994:	88 23       	and	r24, r24
   14996:	49 f0       	breq	.+18     	; 0x149aa <process_commands() [clone .part.46]+0x29f2>
   14998:	80 91 79 02 	lds	r24, 0x0279	; 0x800279 <saved_printing_type>
   1499c:	81 11       	cpse	r24, r1
   1499e:	05 c0       	rjmp	.+10     	; 0x149aa <process_commands() [clone .part.46]+0x29f2>
            SERIAL_PROTOCOLLNPGM("SD print paused");
   149a0:	86 e4       	ldi	r24, 0x46	; 70
   149a2:	9e e7       	ldi	r25, 0x7E	; 126
   149a4:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   149a8:	32 cf       	rjmp	.-412    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        else
            SERIAL_PROTOCOLLNPGM("Print saved");
   149aa:	8a e3       	ldi	r24, 0x3A	; 58
   149ac:	9e e7       	ldi	r25, 0x7E	; 126
   149ae:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   149b2:	2d cf       	rjmp	.-422    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    }
    else if (sdprinting)
   149b4:	80 91 d7 13 	lds	r24, 0x13D7	; 0x8013d7 <card+0x2>
   149b8:	88 23       	and	r24, r24
   149ba:	09 f4       	brne	.+2      	; 0x149be <process_commands() [clone .part.46]+0x2a06>
   149bc:	4a c0       	rjmp	.+148    	; 0x14a52 <process_commands() [clone .part.46]+0x2a9a>
    {
        if (arg_P)
   149be:	11 23       	and	r17, r17
   149c0:	e1 f1       	breq	.+120    	; 0x14a3a <process_commands() [clone .part.46]+0x2a82>
        {
            printAbsFilenameFast();
   149c2:	0f 94 9c 6c 	call	0x2d938	; 0x2d938 <CardReader::printAbsFilenameFast() [clone .constprop.226]>
            SERIAL_PROTOCOLLN();
   149c6:	0e 94 bc 7a 	call	0xf578	; 0xf578 <MarlinSerial::println()>
        }
        else
            SERIAL_PROTOCOLLN(LONGEST_FILENAME);

        SERIAL_PROTOCOLRPGM(_N("SD printing byte "));////MSG_SD_PRINTING_BYTE
   149ca:	80 ef       	ldi	r24, 0xF0	; 240
   149cc:	94 e6       	ldi	r25, 0x64	; 100
   149ce:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   149d2:	60 91 eb 16 	lds	r22, 0x16EB	; 0x8016eb <card+0x316>
   149d6:	70 91 ec 16 	lds	r23, 0x16EC	; 0x8016ec <card+0x317>
   149da:	80 91 ed 16 	lds	r24, 0x16ED	; 0x8016ed <card+0x318>
   149de:	90 91 ee 16 	lds	r25, 0x16EE	; 0x8016ee <card+0x319>
   149e2:	4a e0       	ldi	r20, 0x0A	; 10
   149e4:	0e 94 c5 79 	call	0xf38a	; 0xf38a <MarlinSerial::printNumber(unsigned long, unsigned char)>
}

void MarlinSerial::print(long n, int base)
{
  if (base == 0) {
    write(n);
   149e8:	8f e2       	ldi	r24, 0x2F	; 47
   149ea:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
}

void MarlinSerial::print(unsigned long n, int base)
{
  if (base == 0) write(n);
  else printNumber(n, base);
   149ee:	60 91 e4 16 	lds	r22, 0x16E4	; 0x8016e4 <card+0x30f>
   149f2:	70 91 e5 16 	lds	r23, 0x16E5	; 0x8016e5 <card+0x310>
   149f6:	80 91 e6 16 	lds	r24, 0x16E6	; 0x8016e6 <card+0x311>
   149fa:	90 91 e7 16 	lds	r25, 0x16E7	; 0x8016e7 <card+0x312>
   149fe:	4a e0       	ldi	r20, 0x0A	; 10
   14a00:	0e 94 c5 79 	call	0xf38a	; 0xf38a <MarlinSerial::printNumber(unsigned long, unsigned char)>
}

void MarlinSerial::println(unsigned long n, int base)
{
  print(n, base);
  println();
   14a04:	0e 94 bc 7a 	call	0xf578	; 0xf578 <MarlinSerial::println()>
        SERIAL_PROTOCOL(sdpos);
        SERIAL_PROTOCOL('/');
        SERIAL_PROTOCOLLN(filesize);
        uint16_t time = print_job_timer.duration() / 60;
   14a08:	0f 94 6d 17 	call	0x22eda	; 0x22eda <Stopwatch::duration()>
   14a0c:	2c e3       	ldi	r18, 0x3C	; 60
   14a0e:	30 e0       	ldi	r19, 0x00	; 0
   14a10:	40 e0       	ldi	r20, 0x00	; 0
   14a12:	50 e0       	ldi	r21, 0x00	; 0
   14a14:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
        SERIAL_PROTOCOL((int)(time / 60));
   14a18:	c9 01       	movw	r24, r18
   14a1a:	6c e3       	ldi	r22, 0x3C	; 60
   14a1c:	70 e0       	ldi	r23, 0x00	; 0
   14a1e:	0f 94 a9 a4 	call	0x34952	; 0x34952 <__udivmodhi4>
   14a22:	8c 01       	movw	r16, r24
  print((unsigned long) b, base);
}

void MarlinSerial::print(int n, int base)
{
  print((long) n, base);
   14a24:	90 e0       	ldi	r25, 0x00	; 0
   14a26:	80 e0       	ldi	r24, 0x00	; 0
   14a28:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
}

void MarlinSerial::print(long n, int base)
{
  if (base == 0) {
    write(n);
   14a2c:	8a e3       	ldi	r24, 0x3A	; 58
   14a2e:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
        SERIAL_PROTOCOL(':');
        SERIAL_PROTOCOLLN((int)(time % 60));
   14a32:	c8 01       	movw	r24, r16
   14a34:	0f 94 bf 65 	call	0x2cb7e	; 0x2cb7e <MarlinSerial::println(int, int) [clone .constprop.319]>
   14a38:	ea ce       	rjmp	.-556    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        {
            printAbsFilenameFast();
            SERIAL_PROTOCOLLN();
        }
        else
            SERIAL_PROTOCOLLN(LONGEST_FILENAME);
   14a3a:	80 91 ee 13 	lds	r24, 0x13EE	; 0x8013ee <card+0x19>
   14a3e:	88 23       	and	r24, r24
   14a40:	29 f0       	breq	.+10     	; 0x14a4c <process_commands() [clone .part.46]+0x2a94>
   14a42:	8e ee       	ldi	r24, 0xEE	; 238
   14a44:	93 e1       	ldi	r25, 0x13	; 19
   14a46:	0e 94 a1 87 	call	0x10f42	; 0x10f42 <MarlinSerial::println(char const*)>
   14a4a:	bf cf       	rjmp	.-130    	; 0x149ca <process_commands() [clone .part.46]+0x2a12>
   14a4c:	89 ed       	ldi	r24, 0xD9	; 217
   14a4e:	93 e1       	ldi	r25, 0x13	; 19
   14a50:	fa cf       	rjmp	.-12     	; 0x14a46 <process_commands() [clone .part.46]+0x2a8e>
        SERIAL_PROTOCOL((int)(time / 60));
        SERIAL_PROTOCOL(':');
        SERIAL_PROTOCOLLN((int)(time % 60));
    }
    else
        SERIAL_PROTOCOLLNPGM("Not SD printing");
   14a52:	8a e2       	ldi	r24, 0x2A	; 42
   14a54:	9e e7       	ldi	r25, 0x7E	; 126
   14a56:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   14a5a:	d9 ce       	rjmp	.-590    	; 0x1480e <process_commands() [clone .part.46]+0x2856>

    /*!
    ### M28 - Start SD write <a href="https://reprap.org/wiki/G-code#M28:_Begin_write_to_SD_card">M28: Begin write to SD card</a>
    */
    case 28:
      card.openFileWrite(strchr_pointer+4);
   14a5c:	80 91 bb 04 	lds	r24, 0x04BB	; 0x8004bb <strchr_pointer>
   14a60:	90 91 bc 04 	lds	r25, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
   14a64:	04 96       	adiw	r24, 0x04	; 4
   14a66:	0f 94 0f 78 	call	0x2f01e	; 0x2f01e <CardReader::openFileWrite(char const*) [clone .constprop.155]>
   14a6a:	d1 ce       	rjmp	.-606    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
 * or an I/O error occurred.
 */
bool SdBaseFile::remove() {
  dir_t* d;
  // free any clusters - will fail if read-only or directory
  if (!truncate(0)) goto fail;
   14a6c:	ce 01       	movw	r24, r28
   14a6e:	01 96       	adiw	r24, 0x01	; 1
   14a70:	0f 94 f8 68 	call	0x2d1f0	; 0x2d1f0 <SdBaseFile::truncate(unsigned long) [clone .constprop.239]>
   14a74:	88 23       	and	r24, r24
   14a76:	09 f4       	brne	.+2      	; 0x14a7a <process_commands() [clone .part.46]+0x2ac2>
   14a78:	fe c8       	rjmp	.-3588   	; 0x13c76 <process_commands() [clone .part.46]+0x1cbe>

  // cache directory entry
  d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE);
   14a7a:	61 e0       	ldi	r22, 0x01	; 1
   14a7c:	ce 01       	movw	r24, r28
   14a7e:	01 96       	adiw	r24, 0x01	; 1
   14a80:	0f 94 9a 2e 	call	0x25d34	; 0x25d34 <SdBaseFile::cacheDirEntry(unsigned char)>
  if (!d) goto fail;
   14a84:	00 97       	sbiw	r24, 0x00	; 0
   14a86:	09 f4       	brne	.+2      	; 0x14a8a <process_commands() [clone .part.46]+0x2ad2>
   14a88:	f6 c8       	rjmp	.-3604   	; 0x13c76 <process_commands() [clone .part.46]+0x1cbe>

  // mark entry deleted
  d->name[0] = DIR_NAME_DELETED;
   14a8a:	25 ee       	ldi	r18, 0xE5	; 229
   14a8c:	fc 01       	movw	r30, r24
   14a8e:	20 83       	st	Z, r18

  // set this file closed
  type_ = FAT_FILE_TYPE_CLOSED;
   14a90:	1c 82       	std	Y+4, r1	; 0x04

  // write entry to SD
  return vol_->cacheFlush();
   14a92:	0f 94 8e 29 	call	0x2531c	; 0x2531c <SdVolume::cacheFlush()>
   14a96:	18 2f       	mov	r17, r24
   14a98:	ef c8       	rjmp	.-3618   	; 0x13c78 <process_commands() [clone .part.46]+0x1cc0>
		  presort();
	  #endif
    }
    else
    {
      SERIAL_PROTOCOLPGM("Deletion failed, File: ");
   14a9a:	84 e0       	ldi	r24, 0x04	; 4
   14a9c:	9e e7       	ldi	r25, 0x7E	; 126
   14a9e:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   14aa2:	8c a1       	ldd	r24, Y+36	; 0x24
   14aa4:	9d a1       	ldd	r25, Y+37	; 0x25
   14aa6:	0e 94 95 87 	call	0x10f2a	; 0x10f2a <MarlinSerial::write(char const*)>
   14aaa:	8e e2       	ldi	r24, 0x2E	; 46
   14aac:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
}

void MarlinSerial::println(char c, int base)
{
  print(c, base);
  println();
   14ab0:	0e 94 bc 7a 	call	0xf578	; 0xf578 <MarlinSerial::println()>
   14ab4:	ac ce       	rjmp	.-680    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
      - `S` - Starting file offset

    */
    case 32:
    {
      if(card.sdprinting) {
   14ab6:	80 91 d7 13 	lds	r24, 0x13D7	; 0x8013d7 <card+0x2>
   14aba:	81 11       	cpse	r24, r1
        st_synchronize();
   14abc:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>

      }

      const char* namestartpos = (strchr(strchr_pointer + 4,'!'));   //find ! to indicate filename string start.
   14ac0:	00 91 bb 04 	lds	r16, 0x04BB	; 0x8004bb <strchr_pointer>
   14ac4:	10 91 bc 04 	lds	r17, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
   14ac8:	0c 5f       	subi	r16, 0xFC	; 252
   14aca:	1f 4f       	sbci	r17, 0xFF	; 255
   14acc:	61 e2       	ldi	r22, 0x21	; 33
   14ace:	70 e0       	ldi	r23, 0x00	; 0
   14ad0:	c8 01       	movw	r24, r16
   14ad2:	0f 94 37 aa 	call	0x3546e	; 0x3546e <strchr>
      if(namestartpos==NULL)
   14ad6:	00 97       	sbiw	r24, 0x00	; 0
   14ad8:	19 f0       	breq	.+6      	; 0x14ae0 <process_commands() [clone .part.46]+0x2b28>
      {
        namestartpos=strchr_pointer + 4; //default name position, 4 letters after the M
      }
      else
        namestartpos++; //to skip the '!'
   14ada:	8c 01       	movw	r16, r24
   14adc:	0f 5f       	subi	r16, 0xFF	; 255
   14ade:	1f 4f       	sbci	r17, 0xFF	; 255

      bool call_procedure=(code_seen('P'));
   14ae0:	80 e5       	ldi	r24, 0x50	; 80
   14ae2:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   14ae6:	f8 2e       	mov	r15, r24

      if(strchr_pointer>namestartpos)
   14ae8:	80 91 bb 04 	lds	r24, 0x04BB	; 0x8004bb <strchr_pointer>
   14aec:	90 91 bc 04 	lds	r25, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
   14af0:	08 17       	cp	r16, r24
   14af2:	19 07       	cpc	r17, r25
   14af4:	08 f4       	brcc	.+2      	; 0x14af8 <process_commands() [clone .part.46]+0x2b40>
        call_procedure=false;  //false alert, 'P' found within filename
   14af6:	f1 2c       	mov	r15, r1

      if( card.mounted )
   14af8:	80 91 d8 13 	lds	r24, 0x13D8	; 0x8013d8 <card+0x3>
   14afc:	88 23       	and	r24, r24
   14afe:	09 f4       	brne	.+2      	; 0x14b02 <process_commands() [clone .part.46]+0x2b4a>
   14b00:	86 ce       	rjmp	.-756    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
      {
        card.openFileReadFilteredGcode(namestartpos,!call_procedure);
   14b02:	61 e0       	ldi	r22, 0x01	; 1
   14b04:	6f 25       	eor	r22, r15
   14b06:	c8 01       	movw	r24, r16
   14b08:	0f 94 f3 71 	call	0x2e3e6	; 0x2e3e6 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]>
        if(code_seen('S'))
   14b0c:	83 e5       	ldi	r24, 0x53	; 83
   14b0e:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   14b12:	88 23       	and	r24, r24
   14b14:	99 f0       	breq	.+38     	; 0x14b3c <process_commands() [clone .part.46]+0x2b84>
          if(strchr_pointer<namestartpos) //only if "S" is occuring _before_ the filename
   14b16:	80 91 bb 04 	lds	r24, 0x04BB	; 0x8004bb <strchr_pointer>
   14b1a:	90 91 bc 04 	lds	r25, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
   14b1e:	80 17       	cp	r24, r16
   14b20:	91 07       	cpc	r25, r17
   14b22:	60 f4       	brcc	.+24     	; 0x14b3c <process_commands() [clone .part.46]+0x2b84>
            card.setIndex(code_value_long());
   14b24:	0e 94 5d 56 	call	0xacba	; 0xacba <code_value_long() [clone .lto_priv.507]>
   14b28:	60 93 eb 16 	sts	0x16EB, r22	; 0x8016eb <card+0x316>
   14b2c:	70 93 ec 16 	sts	0x16EC, r23	; 0x8016ec <card+0x317>
   14b30:	80 93 ed 16 	sts	0x16ED, r24	; 0x8016ed <card+0x318>
   14b34:	90 93 ee 16 	sts	0x16EE, r25	; 0x8016ee <card+0x319>
   14b38:	0f 94 17 68 	call	0x2d02e	; 0x2d02e <SdFile::seekSetFilteredGcode(unsigned long) [clone .constprop.289]>
  SERIAL_ECHOLNRPGM(_n("SD card released"));////MSG_SD_CARD_RELEASED
}

void CardReader::startFileprint()
{
  if(mounted)
   14b3c:	80 91 d8 13 	lds	r24, 0x13D8	; 0x8013d8 <card+0x3>
   14b40:	88 23       	and	r24, r24
   14b42:	31 f0       	breq	.+12     	; 0x14b50 <process_commands() [clone .part.46]+0x2b98>
  {
    sdprinting = true;
   14b44:	81 e0       	ldi	r24, 0x01	; 1
   14b46:	80 93 d7 13 	sts	0x13D7, r24	; 0x8013d7 <card+0x2>
   14b4a:	85 e0       	ldi	r24, 0x05	; 5
   14b4c:	80 93 61 0d 	sts	0x0D61, r24	; 0x800d61 <_ZL13printer_state.lto_priv.386>
        card.startFileprint();
        if(!call_procedure)
   14b50:	f1 10       	cpse	r15, r1
   14b52:	5d ce       	rjmp	.-838    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
  FORCE_INLINE uint8_t percentDone(){if(!isFileOpen()) return 0; if(filesize) return sdpos/((filesize+99)/100); else return 0;};
  FORCE_INLINE char* getWorkDirName(){workDir.getFilename(filename);return filename;};
  FORCE_INLINE uint32_t get_sdpos() { if (!isFileOpen()) return 0; else return(sdpos); };
   14b54:	80 91 6a 16 	lds	r24, 0x166A	; 0x80166a <card+0x295>
   14b58:	88 23       	and	r24, r24
   14b5a:	61 f0       	breq	.+24     	; 0x14b74 <process_commands() [clone .part.46]+0x2bbc>
        {
            if(!card.get_sdpos())
   14b5c:	80 91 eb 16 	lds	r24, 0x16EB	; 0x8016eb <card+0x316>
   14b60:	90 91 ec 16 	lds	r25, 0x16EC	; 0x8016ec <card+0x317>
   14b64:	a0 91 ed 16 	lds	r26, 0x16ED	; 0x8016ed <card+0x318>
   14b68:	b0 91 ee 16 	lds	r27, 0x16EE	; 0x8016ee <card+0x319>
   14b6c:	89 2b       	or	r24, r25
   14b6e:	8a 2b       	or	r24, r26
   14b70:	8b 2b       	or	r24, r27
   14b72:	69 f4       	brne	.+26     	; 0x14b8e <process_commands() [clone .part.46]+0x2bd6>
            {
                // A new print has started from scratch, reset stats
                failstats_reset_print();
   14b74:	0e 94 68 56 	call	0xacd0	; 0xacd0 <failstats_reset_print()>
                sdpos_atomic = 0;
   14b78:	10 92 49 12 	sts	0x1249, r1	; 0x801249 <sdpos_atomic>
   14b7c:	10 92 4a 12 	sts	0x124A, r1	; 0x80124a <sdpos_atomic+0x1>
   14b80:	10 92 4b 12 	sts	0x124B, r1	; 0x80124b <sdpos_atomic+0x2>
   14b84:	10 92 4c 12 	sts	0x124C, r1	; 0x80124c <sdpos_atomic+0x3>
   14b88:	80 e0       	ldi	r24, 0x00	; 0
   14b8a:	0e 94 04 86 	call	0x10c08	; 0x10c08 <la10c_mode_change(LA10C_MODE)>
#ifndef LA_NOCOMPAT
                la10c_reset();
#endif
            }
            print_job_timer.start(); // procedure calls count as normal print time.
   14b8e:	0f 94 25 19 	call	0x2324a	; 0x2324a <Stopwatch::start()>
   14b92:	3d ce       	rjmp	.-902    	; 0x1480e <process_commands() [clone .part.46]+0x2856>

        M928 [filename]

    */
    case 928:
      card.openLogFile(strchr_pointer+5);
   14b94:	80 91 bb 04 	lds	r24, 0x04BB	; 0x8004bb <strchr_pointer>
   14b98:	90 91 bc 04 	lds	r25, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
  }
}

void CardReader::openLogFile(const char* name)
{
  logging = true;
   14b9c:	21 e0       	ldi	r18, 0x01	; 1
   14b9e:	20 93 d6 13 	sts	0x13D6, r18	; 0x8013d6 <card+0x1>
  openFileWrite(name);
   14ba2:	05 96       	adiw	r24, 0x05	; 5
   14ba4:	0f 94 0f 78 	call	0x2f01e	; 0x2f01e <CardReader::openFileWrite(char const*) [clone .constprop.155]>
   14ba8:	32 ce       	rjmp	.-924    	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    ### M31 - Report current print time <a href="https://reprap.org/wiki/G-code#M31:_Output_time_since_last_M109_or_SD_card_start_to_serial">M31: Output time since last M109 or SD card start to serial</a>
    */
    case 31: //M31 take time since the start of the SD print or an M109 command
      {
      char time[30];
      uint32_t t = print_job_timer.duration();
   14baa:	0f 94 6d 17 	call	0x22eda	; 0x22eda <Stopwatch::duration()>
      int16_t sec, min;
      min = t / 60;
      sec = t % 60;
   14bae:	2c e3       	ldi	r18, 0x3C	; 60
   14bb0:	30 e0       	ldi	r19, 0x00	; 0
   14bb2:	40 e0       	ldi	r20, 0x00	; 0
   14bb4:	50 e0       	ldi	r21, 0x00	; 0
   14bb6:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
      sprintf_P(time, PSTR("%i min, %i sec"), min, sec);
   14bba:	7f 93       	push	r23
   14bbc:	6f 93       	push	r22
   14bbe:	3f 93       	push	r19
   14bc0:	2f 93       	push	r18
   14bc2:	86 e8       	ldi	r24, 0x86	; 134
   14bc4:	90 e8       	ldi	r25, 0x80	; 128
   14bc6:	9f 93       	push	r25
   14bc8:	8f 93       	push	r24
   14bca:	8e 01       	movw	r16, r28
   14bcc:	0f 5f       	subi	r16, 0xFF	; 255
   14bce:	1f 4f       	sbci	r17, 0xFF	; 255
   14bd0:	1f 93       	push	r17
   14bd2:	0f 93       	push	r16
   14bd4:	0f 94 f7 a2 	call	0x345ee	; 0x345ee <sprintf_P>
      SERIAL_ECHO_START;
   14bd8:	8e ec       	ldi	r24, 0xCE	; 206
   14bda:	91 ea       	ldi	r25, 0xA1	; 161
   14bdc:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
      SERIAL_ECHOLN(time);
   14be0:	c8 01       	movw	r24, r16
   14be2:	0e 94 a1 87 	call	0x10f42	; 0x10f42 <MarlinSerial::println(char const*)>
      lcd_setstatus(time);
   14be6:	c8 01       	movw	r24, r16
   14be8:	0e 94 e8 de 	call	0x1bdd0	; 0x1bdd0 <lcd_setstatus(char const*)>
      autotempShutdown();
   14bec:	0f b6       	in	r0, 0x3f	; 63
   14bee:	f8 94       	cli
   14bf0:	de bf       	out	0x3e, r29	; 62
   14bf2:	0f be       	out	0x3f, r0	; 63
   14bf4:	cd bf       	out	0x3d, r28	; 61
   14bf6:	0b ce       	rjmp	.-1002   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        }
      #if defined(FAN_PIN) && FAN_PIN > -1
        if (pin_number == FAN_PIN)
          fanSpeed = pin_status;
      #endif
        if (pin_number > -1)
   14bf8:	17 fd       	sbrc	r17, 7
   14bfa:	09 ce       	rjmp	.-1006   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
   14bfc:	80 c8       	rjmp	.-3840   	; 0x13cfe <process_commands() [clone .part.46]+0x1d46>
    ### M44 - Reset the bed skew and offset calibration <a href="https://reprap.org/wiki/G-code#M44:_Reset_the_bed_skew_and_offset_calibration">M44: Reset the bed skew and offset calibration</a>
    */
    case 44: // M44: Prusa3D: Reset the bed skew and offset calibration.

        // Reset the baby step value and the baby step applied flag.
        calibration_status_clear(CALIBRATION_STATUS_LIVE_ADJUST);
   14bfe:	80 e1       	ldi	r24, 0x10	; 16
   14c00:	0e 94 f9 d6 	call	0x1adf2	; 0x1adf2 <calibration_status_clear(unsigned char)>
        eeprom_update_word_notify(reinterpret_cast<uint16_t *>(&(EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)),0);
   14c04:	81 ea       	ldi	r24, 0xA1	; 161
   14c06:	9d e0       	ldi	r25, 0x0D	; 13
   14c08:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   14c0c:	4b e0       	ldi	r20, 0x0B	; 11
   14c0e:	84 9f       	mul	r24, r20
   14c10:	c0 01       	movw	r24, r0
   14c12:	11 24       	eor	r1, r1
        if (previous_value != value) {
            eeprom_word_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_word(dst, value);
   14c14:	70 e0       	ldi	r23, 0x00	; 0
   14c16:	60 e0       	ldi	r22, 0x00	; 0
   14c18:	80 5b       	subi	r24, 0xB0	; 176
   14c1a:	92 4f       	sbci	r25, 0xF2	; 242
   14c1c:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>

        // Reset the skew and offset in both RAM and EEPROM.
        calibration_status_clear(CALIBRATION_STATUS_XYZ);
   14c20:	82 e0       	ldi	r24, 0x02	; 2
   14c22:	0e 94 f9 d6 	call	0x1adf2	; 0x1adf2 <calibration_status_clear(unsigned char)>
        reset_bed_offset_and_skew();
   14c26:	0e 94 1e 55 	call	0xaa3c	; 0xaa3c <reset_bed_offset_and_skew()>

        // Reset world2machine_rotation_and_skew and world2machine_shift, therefore
        // the planner will not perform any adjustments in the XY plane.
        // Wait for the motors to stop and update the current position with the absolute values.
        world2machine_revert_to_uncorrected();
   14c2a:	0e 94 2d 62 	call	0xc45a	; 0xc45a <world2machine_revert_to_uncorrected()>
   14c2e:	ef cd       	rjmp	.-1058   	; 0x1480e <process_commands() [clone .part.46]+0x2856>

    */
    case 45: // M45: Prusa3D: bed skew and offset with manual Z up
    {
		int8_t verbosity_level = 0;
		bool only_Z = code_seen('Z');
   14c30:	8a e5       	ldi	r24, 0x5A	; 90
   14c32:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
			// Just 'V' without a number counts as V1.
			char c = strchr_pointer[1];
			verbosity_level = (c == ' ' || c == '\t' || c == 0) ? 1 : code_value_short();
		}
		#endif //SUPPORT_VERBOSITY
		gcode_M45(only_Z, verbosity_level);
   14c36:	0f 94 1e 7d 	call	0x2fa3c	; 0x2fa3c <gcode_M45(bool, signed char) [clone .constprop.63]>
   14c3a:	e9 cd       	rjmp	.-1070   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
                SERIAL_PROTOCOL('.');
                SERIAL_PROTOCOL(uint8_t(ip[2]));
                SERIAL_PROTOCOL('.');
                SERIAL_PROTOCOLLN(uint8_t(ip[3]));
            } else {
                SERIAL_PROTOCOLPGM("?Toshiba FlashAir GetIP failed\n");
   14c3c:	8a e4       	ldi	r24, 0x4A	; 74
   14c3e:	90 e8       	ldi	r25, 0x80	; 128
   14c40:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   14c44:	e4 cd       	rjmp	.-1080   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
            }
        } else {
            SERIAL_PROTOCOLLNPGM("n/a");
   14c46:	86 e4       	ldi	r24, 0x46	; 70
   14c48:	90 e8       	ldi	r25, 0x80	; 128
   14c4a:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   14c4e:	df cd       	rjmp	.-1090   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    /*!
    ### M47 - Show end stops dialog on the display <a href="https://reprap.org/wiki/G-code#M47:_Show_end_stops_dialog_on_the_display">M47: Show end stops dialog on the display</a>
    */
#ifndef TMC2130
    case 47:
		KEEPALIVE_STATE(PAUSED_FOR_USER);
   14c50:	84 e0       	ldi	r24, 0x04	; 4
   14c52:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
    menu_back_if_clicked();
}

void lcd_diag_show_end_stops()
{
    lcd_clear();
   14c56:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
	lcd_consume_click();
   14c5a:	0e 94 70 73 	call	0xe6e0	; 0xe6e0 <lcd_consume_click()>
    for (;;) {
        manage_heater();
   14c5e:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
        manage_inactivity(true);
   14c62:	81 e0       	ldi	r24, 0x01	; 1
   14c64:	0e 94 34 8c 	call	0x11868	; 0x11868 <manage_inactivity(bool)>
        lcd_show_end_stops();
   14c68:	0e 94 46 df 	call	0x1be8c	; 0x1be8c <lcd_show_end_stops() [clone .lto_priv.519]>
        if (lcd_clicked()) {
   14c6c:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   14c70:	88 23       	and	r24, r24
   14c72:	a9 f3       	breq	.-22     	; 0x14c5e <process_commands() [clone .part.46]+0x2ca6>
            break;
        }
    }
    lcd_clear();
   14c74:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
    lcd_return_to_status();
   14c78:	0f 94 d5 07 	call	0x20faa	; 0x20faa <lcd_return_to_status()>
   14c7c:	c8 cd       	rjmp	.-1136   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
   14c7e:	10 92 61 0d 	sts	0x0D61, r1	; 0x800d61 <_ZL13printer_state.lto_priv.386>
   14c82:	c5 cd       	rjmp	.-1142   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
                break;
            default:
                break;
            }
        } else {
            printf_P(_N("PrinterState: %d\n"),uint8_t(GetPrinterState()));
   14c84:	80 91 61 0d 	lds	r24, 0x0D61	; 0x800d61 <_ZL13printer_state.lto_priv.386>
   14c88:	1f 92       	push	r1
   14c8a:	8f 93       	push	r24
   14c8c:	88 e2       	ldi	r24, 0x28	; 40
   14c8e:	96 e6       	ldi	r25, 0x66	; 102
   14c90:	9f 93       	push	r25
   14c92:	8f 93       	push	r24
   14c94:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   14c98:	0f 90       	pop	r0
   14c9a:	0f 90       	pop	r0
   14c9c:	0f 90       	pop	r0
   14c9e:	0f 90       	pop	r0
   14ca0:	b6 cd       	rjmp	.-1172   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        - `C` - Time to change/pause/user interaction in normal mode
        - `D` - Time to change/pause/user interaction in silent mode
    */
    case 73: //M73 show percent done, time remaining and time to change/pause
    {
        if(code_seen('P')) print_percent_done_normal = code_value_uint8();
   14ca2:	80 e5       	ldi	r24, 0x50	; 80
   14ca4:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   14ca8:	88 23       	and	r24, r24
   14caa:	21 f0       	breq	.+8      	; 0x14cb4 <process_commands() [clone .part.46]+0x2cfc>
   14cac:	0e 94 0a 56 	call	0xac14	; 0xac14 <code_value_uint8()>
   14cb0:	80 93 6f 02 	sts	0x026F, r24	; 0x80026f <print_percent_done_normal>
        if(code_seen('R')) print_time_remaining_normal = code_value();
   14cb4:	82 e5       	ldi	r24, 0x52	; 82
   14cb6:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   14cba:	88 23       	and	r24, r24
   14cbc:	41 f0       	breq	.+16     	; 0x14cce <process_commands() [clone .part.46]+0x2d16>
   14cbe:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   14cc2:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   14cc6:	70 93 73 02 	sts	0x0273, r23	; 0x800273 <print_time_remaining_normal+0x1>
   14cca:	60 93 72 02 	sts	0x0272, r22	; 0x800272 <print_time_remaining_normal>
        if(code_seen('Q')) print_percent_done_silent = code_value_uint8();
   14cce:	81 e5       	ldi	r24, 0x51	; 81
   14cd0:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   14cd4:	88 23       	and	r24, r24
   14cd6:	21 f0       	breq	.+8      	; 0x14ce0 <process_commands() [clone .part.46]+0x2d28>
   14cd8:	0e 94 0a 56 	call	0xac14	; 0xac14 <code_value_uint8()>
   14cdc:	80 93 3f 02 	sts	0x023F, r24	; 0x80023f <print_percent_done_silent>
        if(code_seen('S')) print_time_remaining_silent = code_value();
   14ce0:	83 e5       	ldi	r24, 0x53	; 83
   14ce2:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   14ce6:	88 23       	and	r24, r24
   14ce8:	41 f0       	breq	.+16     	; 0x14cfa <process_commands() [clone .part.46]+0x2d42>
   14cea:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   14cee:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   14cf2:	70 93 3e 02 	sts	0x023E, r23	; 0x80023e <print_time_remaining_silent+0x1>
   14cf6:	60 93 3d 02 	sts	0x023D, r22	; 0x80023d <print_time_remaining_silent>
        if(code_seen('C')){
   14cfa:	83 e4       	ldi	r24, 0x43	; 67
   14cfc:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   14d00:	88 23       	and	r24, r24
   14d02:	a9 f0       	breq	.+42     	; 0x14d2e <process_commands() [clone .part.46]+0x2d76>
            float print_time_to_change_normal_f = code_value();
   14d04:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   14d08:	6b 01       	movw	r12, r22
   14d0a:	7c 01       	movw	r14, r24
            print_time_to_change_normal = ( print_time_to_change_normal_f <= 0 ) ? PRINT_TIME_REMAINING_INIT : print_time_to_change_normal_f;
   14d0c:	20 e0       	ldi	r18, 0x00	; 0
   14d0e:	30 e0       	ldi	r19, 0x00	; 0
   14d10:	a9 01       	movw	r20, r18
   14d12:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   14d16:	6f ef       	ldi	r22, 0xFF	; 255
   14d18:	7f ef       	ldi	r23, 0xFF	; 255
   14d1a:	18 16       	cp	r1, r24
   14d1c:	24 f4       	brge	.+8      	; 0x14d26 <process_commands() [clone .part.46]+0x2d6e>
   14d1e:	c7 01       	movw	r24, r14
   14d20:	b6 01       	movw	r22, r12
   14d22:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   14d26:	70 93 71 02 	sts	0x0271, r23	; 0x800271 <print_time_to_change_normal+0x1>
   14d2a:	60 93 70 02 	sts	0x0270, r22	; 0x800270 <print_time_to_change_normal>
        }
        if(code_seen('D')){
   14d2e:	84 e4       	ldi	r24, 0x44	; 68
   14d30:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   14d34:	88 23       	and	r24, r24
   14d36:	a9 f0       	breq	.+42     	; 0x14d62 <process_commands() [clone .part.46]+0x2daa>
            float print_time_to_change_silent_f = code_value();
   14d38:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   14d3c:	6b 01       	movw	r12, r22
   14d3e:	7c 01       	movw	r14, r24
            print_time_to_change_silent = ( print_time_to_change_silent_f <= 0 ) ? PRINT_TIME_REMAINING_INIT : print_time_to_change_silent_f;
   14d40:	20 e0       	ldi	r18, 0x00	; 0
   14d42:	30 e0       	ldi	r19, 0x00	; 0
   14d44:	a9 01       	movw	r20, r18
   14d46:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   14d4a:	6f ef       	ldi	r22, 0xFF	; 255
   14d4c:	7f ef       	ldi	r23, 0xFF	; 255
   14d4e:	18 16       	cp	r1, r24
   14d50:	24 f4       	brge	.+8      	; 0x14d5a <process_commands() [clone .part.46]+0x2da2>
   14d52:	c7 01       	movw	r24, r14
   14d54:	b6 01       	movw	r22, r12
   14d56:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   14d5a:	70 93 3c 02 	sts	0x023C, r23	; 0x80023c <print_time_to_change_silent+0x1>
   14d5e:	60 93 3b 02 	sts	0x023B, r22	; 0x80023b <print_time_to_change_silent>
        }
        {
            const char* _msg_mode_done_remain = _N("%S MODE: Percent done: %hhd; print time remaining in mins: %d; Change in mins: %d\n");
            printf_P(_msg_mode_done_remain, _N("NORMAL"), int8_t(print_percent_done_normal), print_time_remaining_normal, print_time_to_change_normal);
   14d62:	80 91 71 02 	lds	r24, 0x0271	; 0x800271 <print_time_to_change_normal+0x1>
   14d66:	8f 93       	push	r24
   14d68:	80 91 70 02 	lds	r24, 0x0270	; 0x800270 <print_time_to_change_normal>
   14d6c:	8f 93       	push	r24
   14d6e:	80 91 73 02 	lds	r24, 0x0273	; 0x800273 <print_time_remaining_normal+0x1>
   14d72:	8f 93       	push	r24
   14d74:	80 91 72 02 	lds	r24, 0x0272	; 0x800272 <print_time_remaining_normal>
   14d78:	8f 93       	push	r24
   14d7a:	80 91 6f 02 	lds	r24, 0x026F	; 0x80026f <print_percent_done_normal>
   14d7e:	28 2f       	mov	r18, r24
   14d80:	08 2e       	mov	r0, r24
   14d82:	00 0c       	add	r0, r0
   14d84:	33 0b       	sbc	r19, r19
   14d86:	3f 93       	push	r19
   14d88:	8f 93       	push	r24
   14d8a:	8e ec       	ldi	r24, 0xCE	; 206
   14d8c:	95 e6       	ldi	r25, 0x65	; 101
   14d8e:	9f 93       	push	r25
   14d90:	8f 93       	push	r24
   14d92:	05 ed       	ldi	r16, 0xD5	; 213
   14d94:	15 e6       	ldi	r17, 0x65	; 101
   14d96:	1f 93       	push	r17
   14d98:	0f 93       	push	r16
   14d9a:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
            printf_P(_msg_mode_done_remain, _N("SILENT"), int8_t(print_percent_done_silent), print_time_remaining_silent, print_time_to_change_silent);
   14d9e:	80 91 3c 02 	lds	r24, 0x023C	; 0x80023c <print_time_to_change_silent+0x1>
   14da2:	8f 93       	push	r24
   14da4:	80 91 3b 02 	lds	r24, 0x023B	; 0x80023b <print_time_to_change_silent>
   14da8:	8f 93       	push	r24
   14daa:	80 91 3e 02 	lds	r24, 0x023E	; 0x80023e <print_time_remaining_silent+0x1>
   14dae:	8f 93       	push	r24
   14db0:	80 91 3d 02 	lds	r24, 0x023D	; 0x80023d <print_time_remaining_silent>
   14db4:	8f 93       	push	r24
   14db6:	80 91 3f 02 	lds	r24, 0x023F	; 0x80023f <print_percent_done_silent>
   14dba:	28 2f       	mov	r18, r24
   14dbc:	08 2e       	mov	r0, r24
   14dbe:	00 0c       	add	r0, r0
   14dc0:	33 0b       	sbc	r19, r19
   14dc2:	3f 93       	push	r19
   14dc4:	8f 93       	push	r24
   14dc6:	87 ec       	ldi	r24, 0xC7	; 199
   14dc8:	95 e6       	ldi	r25, 0x65	; 101
   14dca:	9f 93       	push	r25
   14dcc:	8f 93       	push	r24
   14dce:	1f 93       	push	r17
   14dd0:	0f 93       	push	r16
   14dd2:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   14dd6:	0f b6       	in	r0, 0x3f	; 63
   14dd8:	f8 94       	cli
   14dda:	de bf       	out	0x3e, r29	; 62
   14ddc:	0f be       	out	0x3f, r0	; 63
   14dde:	cd bf       	out	0x3d, r28	; 61
   14de0:	16 cd       	rjmp	.-1492   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    /*!
    ### M75 - Start the print job timer <a href="https://reprap.org/wiki/G-code#M75:_Start_the_print_job_timer">M75: Start the print job timer</a>
    */
    case 75:
    {
        if (!filament_presence_check()) {
   14de2:	0e 94 f0 ea 	call	0x1d5e0	; 0x1d5e0 <filament_presence_check()>
   14de6:	88 23       	and	r24, r24
   14de8:	09 f4       	brne	.+2      	; 0x14dec <process_commands() [clone .part.46]+0x2e34>
   14dea:	11 cd       	rjmp	.-1502   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
   14dec:	d0 ce       	rjmp	.-608    	; 0x14b8e <process_commands() [clone .part.46]+0x2bd6>
  }
  else return false;
}

bool Stopwatch::pause() {
  if (isRunning()) {
   14dee:	80 91 8b 03 	lds	r24, 0x038B	; 0x80038b <Stopwatch::state>
   14df2:	81 30       	cpi	r24, 0x01	; 1
   14df4:	09 f0       	breq	.+2      	; 0x14df8 <process_commands() [clone .part.46]+0x2e40>
   14df6:	0b cd       	rjmp	.-1514   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    state = PAUSED;
   14df8:	82 e0       	ldi	r24, 0x02	; 2
   14dfa:	80 93 8b 03 	sts	0x038B, r24	; 0x80038b <Stopwatch::state>
    stopTimestamp = _millis();
   14dfe:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   14e02:	60 93 0b 06 	sts	0x060B, r22	; 0x80060b <Stopwatch::stopTimestamp>
   14e06:	70 93 0c 06 	sts	0x060C, r23	; 0x80060c <Stopwatch::stopTimestamp+0x1>
   14e0a:	80 93 0d 06 	sts	0x060D, r24	; 0x80060d <Stopwatch::stopTimestamp+0x2>
   14e0e:	90 93 0e 06 	sts	0x060E, r25	; 0x80060e <Stopwatch::stopTimestamp+0x3>
   14e12:	fd cc       	rjmp	.-1542   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    /*!
    ### M77 - Stop the print job timer <a href="https://reprap.org/wiki/G-code#M77:_Stop_the_print_job_timer">M77: Stop the print job timer</a>
    */
    case 77:
    {
        print_job_timer.stop();
   14e14:	0f 94 49 19 	call	0x23292	; 0x23292 <Stopwatch::stop()>
        save_statistics();
   14e18:	0e 94 b0 64 	call	0xc960	; 0xc960 <save_statistics()>
   14e1c:	f8 cc       	rjmp	.-1552   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
          _m_fil = _O(MSG_FILAMENT_USED);
          _m_time = _O(MSG_PRINT_TIME);
          _cm = (uint32_t)total_filament_used / 1000;
          _min = print_job_timer.duration() / 60;
        } else {
          if (code_seen('S')) {
   14e1e:	83 e5       	ldi	r24, 0x53	; 83
   14e20:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   14e24:	88 23       	and	r24, r24
   14e26:	51 f0       	breq	.+20     	; 0x14e3c <process_commands() [clone .part.46]+0x2e84>
          eeprom_update_dword_notify((uint32_t *)EEPROM_FILAMENTUSED, code_value());
   14e28:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   14e2c:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   14e30:	ab 01       	movw	r20, r22
   14e32:	bc 01       	movw	r22, r24
        if (previous_value != value) {
            eeprom_dword_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_dword(dst, value);
   14e34:	81 ef       	ldi	r24, 0xF1	; 241
   14e36:	9f e0       	ldi	r25, 0x0F	; 15
   14e38:	0f 94 16 a4 	call	0x3482c	; 0x3482c <eeprom_update_dword>
          }
          if (code_seen('T')) {
   14e3c:	84 e5       	ldi	r24, 0x54	; 84
   14e3e:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   14e42:	88 23       	and	r24, r24
   14e44:	51 f0       	breq	.+20     	; 0x14e5a <process_commands() [clone .part.46]+0x2ea2>
          eeprom_update_dword_notify((uint32_t *)EEPROM_TOTALTIME, code_value());
   14e46:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   14e4a:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   14e4e:	ab 01       	movw	r20, r22
   14e50:	bc 01       	movw	r22, r24
   14e52:	8d ee       	ldi	r24, 0xED	; 237
   14e54:	9f e0       	ldi	r25, 0x0F	; 15
   14e56:	0f 94 16 a4 	call	0x3482c	; 0x3482c <eeprom_update_dword>
          }
          _m_fil = _O(MSG_TOTAL_FILAMENT);
          _m_time = _O(MSG_TOTAL_PRINT_TIME);
          _cm = eeprom_read_dword((uint32_t *)EEPROM_FILAMENTUSED);
   14e5a:	81 ef       	ldi	r24, 0xF1	; 241
   14e5c:	9f e0       	ldi	r25, 0x0F	; 15
   14e5e:	0f 94 e8 a3 	call	0x347d0	; 0x347d0 <eeprom_read_dword>
   14e62:	16 2f       	mov	r17, r22
   14e64:	07 2f       	mov	r16, r23
   14e66:	f8 2e       	mov	r15, r24
   14e68:	e9 2e       	mov	r14, r25
          _min = eeprom_read_dword((uint32_t *)EEPROM_TOTALTIME);
   14e6a:	8d ee       	ldi	r24, 0xED	; 237
   14e6c:	9f e0       	ldi	r25, 0x0F	; 15
   14e6e:	0f 94 e8 a3 	call	0x347d0	; 0x347d0 <eeprom_read_dword>
          }
          if (code_seen('T')) {
          eeprom_update_dword_notify((uint32_t *)EEPROM_TOTALTIME, code_value());
          }
          _m_fil = _O(MSG_TOTAL_FILAMENT);
          _m_time = _O(MSG_TOTAL_PRINT_TIME);
   14e72:	4e ea       	ldi	r20, 0xAE	; 174
   14e74:	58 e5       	ldi	r21, 0x58	; 88
          eeprom_update_dword_notify((uint32_t *)EEPROM_FILAMENTUSED, code_value());
          }
          if (code_seen('T')) {
          eeprom_update_dword_notify((uint32_t *)EEPROM_TOTALTIME, code_value());
          }
          _m_fil = _O(MSG_TOTAL_FILAMENT);
   14e76:	2d e9       	ldi	r18, 0x9D	; 157
   14e78:	38 e5       	ldi	r19, 0x58	; 88
   14e7a:	0c 94 1f 9f 	jmp	0x13e3e	; 0x13e3e <process_commands() [clone .part.46]+0x1e86>
void ResetHostStatusScreenName() {
    memset(host_status_screen_name, 0, sizeof(host_status_screen_name));
}

void M79_timer_restart() {
    M79_timer.start();
   14e7e:	8c e8       	ldi	r24, 0x8C	; 140
   14e80:	93 e0       	ldi	r25, 0x03	; 3
   14e82:	0f 94 47 10 	call	0x2208e	; 0x2208e <Timer<unsigned long>::start()>
       - `S` - Quoted string containing two characters e.g. "PL"
    */
    case 79:
        M79_timer_restart();

        if (code_seen('S'))
   14e86:	83 e5       	ldi	r24, 0x53	; 83
   14e88:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   14e8c:	88 23       	and	r24, r24
   14e8e:	09 f1       	breq	.+66     	; 0x14ed2 <process_commands() [clone .part.46]+0x2f1a>
    , found(false)
    {
        const char * pStrEnd = NULL;

        // Start of the string
        this->ptr = strchr(pStr, '"');
   14e90:	62 e2       	ldi	r22, 0x22	; 34
   14e92:	70 e0       	ldi	r23, 0x00	; 0
   14e94:	80 91 bb 04 	lds	r24, 0x04BB	; 0x8004bb <strchr_pointer>
   14e98:	90 91 bc 04 	lds	r25, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
   14e9c:	0f 94 37 aa 	call	0x3546e	; 0x3546e <strchr>
   14ea0:	8c 01       	movw	r16, r24
        if (!this->ptr) {
   14ea2:	89 2b       	or	r24, r25
   14ea4:	b1 f0       	breq	.+44     	; 0x14ed2 <process_commands() [clone .part.46]+0x2f1a>
            // First quote not found
            return;
        }

        // Skip the leading quote
        this->ptr++;
   14ea6:	0f 5f       	subi	r16, 0xFF	; 255
   14ea8:	1f 4f       	sbci	r17, 0xFF	; 255

        // End of the string
        pStrEnd = strchr(this->ptr, '"');
   14eaa:	62 e2       	ldi	r22, 0x22	; 34
   14eac:	70 e0       	ldi	r23, 0x00	; 0
   14eae:	c8 01       	movw	r24, r16
   14eb0:	0f 94 37 aa 	call	0x3546e	; 0x3546e <strchr>
        if(!pStrEnd) {
   14eb4:	89 2b       	or	r24, r25
   14eb6:	69 f0       	breq	.+26     	; 0x14ed2 <process_commands() [clone .part.46]+0x2f1a>
char * GetHostStatusScreenName() {
    return host_status_screen_name;
}

void ResetHostStatusScreenName() {
    memset(host_status_screen_name, 0, sizeof(host_status_screen_name));
   14eb8:	e5 e0       	ldi	r30, 0x05	; 5
   14eba:	f6 e0       	ldi	r31, 0x06	; 6
   14ebc:	83 e0       	ldi	r24, 0x03	; 3
   14ebe:	df 01       	movw	r26, r30
   14ec0:	1d 92       	st	X+, r1
   14ec2:	8a 95       	dec	r24
   14ec4:	e9 f7       	brne	.-6      	; 0x14ec0 <process_commands() [clone .part.46]+0x2f08>

static LongTimer M79_timer;
static char host_status_screen_name[3];

void SetHostStatusScreenName(const char * name) {
    strncpy(host_status_screen_name, name, 2);
   14ec6:	42 e0       	ldi	r20, 0x02	; 2
   14ec8:	50 e0       	ldi	r21, 0x00	; 0
   14eca:	b8 01       	movw	r22, r16
   14ecc:	cf 01       	movw	r24, r30
   14ece:	0f 94 60 aa 	call	0x354c0	; 0x354c0 <strncpy>
        }
#ifdef DEBUG_PRINTER_STATES
        debug_printer_states();
#endif //DEBUG_PRINTER_STATES

        if (eeprom_read_byte((uint8_t*)EEPROM_UVLO_PRINT_TYPE) == PowerPanic::PRINT_TYPE_HOST
   14ed2:	8c e8       	ldi	r24, 0x8C	; 140
   14ed4:	9f e0       	ldi	r25, 0x0F	; 15
   14ed6:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
           && printer_recovering()
           && printingIsPaused()) {
   14eda:	81 30       	cpi	r24, 0x01	; 1
   14edc:	09 f0       	breq	.+2      	; 0x14ee0 <process_commands() [clone .part.46]+0x2f28>
   14ede:	97 cc       	rjmp	.-1746   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
#ifdef DEBUG_PRINTER_STATES
        debug_printer_states();
#endif //DEBUG_PRINTER_STATES

        if (eeprom_read_byte((uint8_t*)EEPROM_UVLO_PRINT_TYPE) == PowerPanic::PRINT_TYPE_HOST
           && printer_recovering()
   14ee0:	0e 94 2b 66 	call	0xcc56	; 0xcc56 <printer_recovering()>
   14ee4:	88 23       	and	r24, r24
   14ee6:	09 f4       	brne	.+2      	; 0x14eea <process_commands() [clone .part.46]+0x2f32>
   14ee8:	92 cc       	rjmp	.-1756   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
           && printingIsPaused()) {
   14eea:	0e 94 35 66 	call	0xcc6a	; 0xcc6a <printingIsPaused()>
   14eee:	88 23       	and	r24, r24
   14ef0:	09 f4       	brne	.+2      	; 0x14ef4 <process_commands() [clone .part.46]+0x2f3c>
   14ef2:	8d cc       	rjmp	.-1766   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
            // Send action to the host, so the host can resume the print. It is up to the host
            // to resume the print correctly.
            if (uvlo_auto_recovery_ready) {
                SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_UVLO_AUTO_RECOVERY_READY);
            } else {
                SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_UVLO_RECOVERY_READY);
   14ef4:	84 e9       	ldi	r24, 0x94	; 148
   14ef6:	95 e6       	ldi	r25, 0x65	; 101
   14ef8:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   14efc:	88 cc       	rjmp	.-1776   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    /*!
    ### M112 - Emergency stop <a href="https://reprap.org/wiki/G-code#M112:_Full_.28Emergency.29_Stop">M112: Full (Emergency) Stop</a>
    It is processed much earlier as to bypass the cmdqueue.
    */
    case 112:
      kill(MSG_M112_KILL);
   14efe:	87 e7       	ldi	r24, 0x77	; 119
   14f00:	95 e6       	ldi	r25, 0x65	; 101
   14f02:	0e 94 23 83 	call	0x10646	; 0x10646 <kill(char const*)>

    #### Parameters
       - `S` - Target temperature
    */
    case 140:
      if (code_seen('S')) setTargetBed(code_value());
   14f06:	83 e5       	ldi	r24, 0x53	; 83
   14f08:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   14f0c:	88 23       	and	r24, r24
   14f0e:	09 f4       	brne	.+2      	; 0x14f12 <process_commands() [clone .part.46]+0x2f5a>
   14f10:	7e cc       	rjmp	.-1796   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
   14f12:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
  resetPID(0);
};

FORCE_INLINE void setTargetBed(const float &celsius) {
  target_temperature_bed = celsius;
   14f16:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   14f1a:	70 93 5a 12 	sts	0x125A, r23	; 0x80125a <target_temperature_bed+0x1>
   14f1e:	60 93 59 12 	sts	0x1259, r22	; 0x801259 <target_temperature_bed>
   14f22:	75 cc       	rjmp	.-1814   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
      ok T:20.2 /0.0 B:19.1 /0.0 T0:20.2 /0.0 @:0 B@:0 P:19.8 A:26.4

    */
    case 105:
    {
      SERIAL_PROTOCOLPGM("ok ");
   14f24:	82 e4       	ldi	r24, 0x42	; 66
   14f26:	90 e8       	ldi	r25, 0x80	; 128
   14f28:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
      gcode_M105();
   14f2c:	0e 94 36 7c 	call	0xf86c	; 0xf86c <gcode_M105()>
      cmdqueue_pop_front(); //prevent an ok after the command since this command uses an ok at the beginning.
   14f30:	0e 94 43 79 	call	0xf286	; 0xf286 <cmdqueue_pop_front()>
      cmdbuffer_front_already_processed = true;
   14f34:	81 e0       	ldi	r24, 0x01	; 1
   14f36:	80 93 53 12 	sts	0x1253, r24	; 0x801253 <cmdbuffer_front_already_processed>
   14f3a:	69 cc       	rjmp	.-1838   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
          bit 6 = free
          bit 7 = free
     */
    case 155:
    {
        if (code_seen('S')){
   14f3c:	83 e5       	ldi	r24, 0x53	; 83
   14f3e:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   14f42:	88 23       	and	r24, r24
   14f44:	51 f0       	breq	.+20     	; 0x14f5a <process_commands() [clone .part.46]+0x2fa2>
            autoReportFeatures.SetPeriod( code_value_uint8() );
   14f46:	0e 94 0a 56 	call	0xac14	; 0xac14 <code_value_uint8()>
    inline void SetMask(uint8_t mask){ arFunctionsActive.byte = mask; }

    /// sets the autoreporting timer's period
    /// setting it to zero stops the timer
    void SetPeriod(uint8_t p){
        auto_report_period = p;
   14f4a:	80 93 cf 13 	sts	0x13CF, r24	; 0x8013cf <autoReportFeatures+0x1>
        if (auto_report_period != 0){
   14f4e:	88 23       	and	r24, r24
   14f50:	71 f0       	breq	.+28     	; 0x14f6e <process_commands() [clone .part.46]+0x2fb6>
          auto_report_timer.start();
   14f52:	80 ed       	ldi	r24, 0xD0	; 208
   14f54:	93 e1       	ldi	r25, 0x13	; 19
   14f56:	0f 94 47 10 	call	0x2208e	; 0x2208e <Timer<unsigned long>::start()>
    case 155:
    {
        if (code_seen('S')){
            autoReportFeatures.SetPeriod( code_value_uint8() );
        }
        if (code_seen('C')){
   14f5a:	83 e4       	ldi	r24, 0x43	; 67
   14f5c:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   14f60:	88 23       	and	r24, r24
   14f62:	41 f0       	breq	.+16     	; 0x14f74 <process_commands() [clone .part.46]+0x2fbc>
            autoReportFeatures.SetMask(code_value_uint8());
   14f64:	0e 94 0a 56 	call	0xac14	; 0xac14 <code_value_uint8()>
    inline void SetFans(uint8_t v){ arFunctionsActive.bits.fans = v; }

    inline bool Pos()const { return arFunctionsActive.bits.pos != 0; }
    inline void SetPos(uint8_t v){ arFunctionsActive.bits.pos = v; }

    inline void SetMask(uint8_t mask){ arFunctionsActive.byte = mask; }
   14f68:	80 93 ce 13 	sts	0x13CE, r24	; 0x8013ce <autoReportFeatures>
   14f6c:	50 cc       	rjmp	.-1888   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
   14f6e:	10 92 d0 13 	sts	0x13D0, r1	; 0x8013d0 <autoReportFeatures+0x2>
   14f72:	f3 cf       	rjmp	.-26     	; 0x14f5a <process_commands() [clone .part.46]+0x2fa2>
   14f74:	81 e0       	ldi	r24, 0x01	; 1
   14f76:	80 93 ce 13 	sts	0x13CE, r24	; 0x8013ce <autoReportFeatures>
   14f7a:	49 cc       	rjmp	.-1902   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    Command always waits for both cool down and heat up.
    If no parameters are supplied waits for previously set extruder temperature.
    */
    case 109:
    {
      LCD_MESSAGERPGM(_T(MSG_HEATING));
   14f7c:	85 e7       	ldi	r24, 0x75	; 117
   14f7e:	96 e5       	ldi	r25, 0x56	; 86
   14f80:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   14f84:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
	  heating_status = HeatingStatus::EXTRUDER_HEATING;
   14f88:	81 e0       	ldi	r24, 0x01	; 1
   14f8a:	80 93 cb 03 	sts	0x03CB, r24	; 0x8003cb <heating_status>
      prusa_statistics(1);
   14f8e:	0f 94 79 32 	call	0x264f2	; 0x264f2 <prusa_statistics(unsigned char)>

#ifdef AUTOTEMP
        autotemp_enabled=false;
      #endif
      if (code_seen('S')) {
   14f92:	83 e5       	ldi	r24, 0x53	; 83
   14f94:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   14f98:	88 23       	and	r24, r24
   14f9a:	49 f0       	breq	.+18     	; 0x14fae <process_commands() [clone .part.46]+0x2ff6>
          setTargetHotend(code_value());
            } else if (code_seen('R')) {
                setTargetHotend(code_value());
   14f9c:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
  return target_temperature_bed;
};

// Doesn't save FLASH when FORCE_INLINE removed.
FORCE_INLINE void setTargetHotend(const float &celsius) {
  target_temperature[0] = celsius;
   14fa0:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   14fa4:	70 93 5e 12 	sts	0x125E, r23	; 0x80125e <target_temperature+0x1>
   14fa8:	60 93 5d 12 	sts	0x125D, r22	; 0x80125d <target_temperature>
   14fac:	05 c0       	rjmp	.+10     	; 0x14fb8 <process_commands() [clone .part.46]+0x3000>
#ifdef AUTOTEMP
        autotemp_enabled=false;
      #endif
      if (code_seen('S')) {
          setTargetHotend(code_value());
            } else if (code_seen('R')) {
   14fae:	82 e5       	ldi	r24, 0x52	; 82
   14fb0:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   14fb4:	81 11       	cpse	r24, r1
   14fb6:	f2 cf       	rjmp	.-28     	; 0x14f9c <process_commands() [clone .part.46]+0x2fe4>
          autotemp_factor=code_value();
          autotemp_enabled=true;
        }
      #endif

      codenum = _millis();
   14fb8:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   14fbc:	6b 01       	movw	r12, r22
   14fbe:	7c 01       	movw	r14, r24
FORCE_INLINE void setTargetBed(const float &celsius) {
  target_temperature_bed = celsius;
};

FORCE_INLINE bool isHeatingHotend(uint8_t extruder){
  return target_temperature[extruder] > current_temperature[extruder];
   14fc0:	60 91 5d 12 	lds	r22, 0x125D	; 0x80125d <target_temperature>
   14fc4:	70 91 5e 12 	lds	r23, 0x125E	; 0x80125e <target_temperature+0x1>
   14fc8:	07 2e       	mov	r0, r23
   14fca:	00 0c       	add	r0, r0
   14fcc:	88 0b       	sbc	r24, r24
   14fce:	99 0b       	sbc	r25, r25
   14fd0:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   14fd4:	11 e0       	ldi	r17, 0x01	; 1
   14fd6:	20 91 5a 0d 	lds	r18, 0x0D5A	; 0x800d5a <current_temperature>
   14fda:	30 91 5b 0d 	lds	r19, 0x0D5B	; 0x800d5b <current_temperature+0x1>
   14fde:	40 91 5c 0d 	lds	r20, 0x0D5C	; 0x800d5c <current_temperature+0x2>
   14fe2:	50 91 5d 0d 	lds	r21, 0x0D5D	; 0x800d5d <current_temperature+0x3>
   14fe6:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   14fea:	18 16       	cp	r1, r24
   14fec:	0c f0       	brlt	.+2      	; 0x14ff0 <process_commands() [clone .part.46]+0x3038>
   14fee:	10 e0       	ldi	r17, 0x00	; 0

      /* See if we are heating up or cooling down */
      target_direction = isHeatingHotend(active_extruder); // true if heating, false if cooling
   14ff0:	10 93 59 0d 	sts	0x0D59, r17	; 0x800d59 <_ZL16target_direction.lto_priv.490>

      wait_for_heater(codenum, active_extruder); //loops until target temperature is reached
   14ff4:	c7 01       	movw	r24, r14
   14ff6:	b6 01       	movw	r22, r12
   14ff8:	0f 94 85 74 	call	0x2e90a	; 0x2e90a <wait_for_heater(long, unsigned char) [clone .constprop.190]>

        LCD_MESSAGERPGM(_T(MSG_HEATING_COMPLETE));
   14ffc:	85 e6       	ldi	r24, 0x65	; 101
   14ffe:	96 e5       	ldi	r25, 0x56	; 86
   15000:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   15004:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
		heating_status = HeatingStatus::EXTRUDER_HEATING_COMPLETE;
   15008:	82 e0       	ldi	r24, 0x02	; 2
   1500a:	80 93 cb 03 	sts	0x03CB, r24	; 0x8003cb <heating_status>
        prusa_statistics(2);
   1500e:	0f 94 79 32 	call	0x264f2	; 0x264f2 <prusa_statistics(unsigned char)>

        previous_millis_cmd.start();
   15012:	88 e4       	ldi	r24, 0x48	; 72
   15014:	93 e0       	ldi	r25, 0x03	; 3
   15016:	0f 94 47 10 	call	0x2208e	; 0x2208e <Timer<unsigned long>::start()>
   1501a:	f9 cb       	rjmp	.-2062   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    */
    case 190:
    #if defined(TEMP_BED_PIN) && TEMP_BED_PIN > -1
    {
        bool CooldownNoWait = false;
        LCD_MESSAGERPGM(_T(MSG_BED_HEATING));
   1501c:	87 e5       	ldi	r24, 0x57	; 87
   1501e:	96 e5       	ldi	r25, 0x56	; 86
   15020:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   15024:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
		heating_status = HeatingStatus::BED_HEATING;
   15028:	83 e0       	ldi	r24, 0x03	; 3
   1502a:	80 93 cb 03 	sts	0x03CB, r24	; 0x8003cb <heating_status>
        prusa_statistics(1);
   1502e:	81 e0       	ldi	r24, 0x01	; 1
   15030:	0f 94 79 32 	call	0x264f2	; 0x264f2 <prusa_statistics(unsigned char)>
        if (code_seen('S'))
   15034:	83 e5       	ldi	r24, 0x53	; 83
   15036:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   1503a:	18 2f       	mov	r17, r24
   1503c:	88 23       	and	r24, r24
   1503e:	49 f0       	breq	.+18     	; 0x15052 <process_commands() [clone .part.46]+0x309a>
          setTargetBed(code_value());
          CooldownNoWait = true;
        }
		else if (code_seen('R'))
		{
          setTargetBed(code_value());
   15040:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
  target_temperature[0] = celsius;
  resetPID(0);
};

FORCE_INLINE void setTargetBed(const float &celsius) {
  target_temperature_bed = celsius;
   15044:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   15048:	70 93 5a 12 	sts	0x125A, r23	; 0x80125a <target_temperature_bed+0x1>
   1504c:	60 93 59 12 	sts	0x1259, r22	; 0x801259 <target_temperature_bed>
   15050:	05 c0       	rjmp	.+10     	; 0x1505c <process_commands() [clone .part.46]+0x30a4>
        if (code_seen('S'))
		{
          setTargetBed(code_value());
          CooldownNoWait = true;
        }
		else if (code_seen('R'))
   15052:	82 e5       	ldi	r24, 0x52	; 82
   15054:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   15058:	81 11       	cpse	r24, r1
   1505a:	f2 cf       	rjmp	.-28     	; 0x15040 <process_commands() [clone .part.46]+0x3088>
		{
          setTargetBed(code_value());
        }
        codenum = _millis();
   1505c:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   15060:	6b 01       	movw	r12, r22
   15062:	7c 01       	movw	r14, r24

        cancel_heatup = false;
   15064:	10 92 5f 0d 	sts	0x0D5F, r1	; 0x800d5f <_ZL13cancel_heatup.lto_priv.391>
FORCE_INLINE bool isHeatingHotend(uint8_t extruder){
  return target_temperature[extruder] > current_temperature[extruder];
};

FORCE_INLINE bool isHeatingBed() {
  return target_temperature_bed > current_temperature_bed;
   15068:	60 91 59 12 	lds	r22, 0x1259	; 0x801259 <target_temperature_bed>
   1506c:	70 91 5a 12 	lds	r23, 0x125A	; 0x80125a <target_temperature_bed+0x1>
   15070:	07 2e       	mov	r0, r23
   15072:	00 0c       	add	r0, r0
   15074:	88 0b       	sbc	r24, r24
   15076:	99 0b       	sbc	r25, r25
   15078:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   1507c:	01 e0       	ldi	r16, 0x01	; 1
   1507e:	20 91 bc 03 	lds	r18, 0x03BC	; 0x8003bc <current_temperature_bed>
   15082:	30 91 bd 03 	lds	r19, 0x03BD	; 0x8003bd <current_temperature_bed+0x1>
   15086:	40 91 be 03 	lds	r20, 0x03BE	; 0x8003be <current_temperature_bed+0x2>
   1508a:	50 91 bf 03 	lds	r21, 0x03BF	; 0x8003bf <current_temperature_bed+0x3>
   1508e:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   15092:	18 16       	cp	r1, r24
   15094:	0c f0       	brlt	.+2      	; 0x15098 <process_commands() [clone .part.46]+0x30e0>
   15096:	00 e0       	ldi	r16, 0x00	; 0
        target_direction = isHeatingBed(); // true if heating, false if cooling
   15098:	00 93 59 0d 	sts	0x0D59, r16	; 0x800d59 <_ZL16target_direction.lto_priv.490>

        while ( (!cancel_heatup) && (target_direction ? (isHeatingBed()) : (isCoolingBed()&&(CooldownNoWait==false))) )
   1509c:	80 91 5f 0d 	lds	r24, 0x0D5F	; 0x800d5f <_ZL13cancel_heatup.lto_priv.391>
   150a0:	81 11       	cpse	r24, r1
   150a2:	1a c0       	rjmp	.+52     	; 0x150d8 <process_commands() [clone .part.46]+0x3120>
   150a4:	60 91 59 12 	lds	r22, 0x1259	; 0x801259 <target_temperature_bed>
   150a8:	70 91 5a 12 	lds	r23, 0x125A	; 0x80125a <target_temperature_bed+0x1>
   150ac:	07 2e       	mov	r0, r23
   150ae:	00 0c       	add	r0, r0
   150b0:	88 0b       	sbc	r24, r24
   150b2:	99 0b       	sbc	r25, r25
   150b4:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   150b8:	20 91 bc 03 	lds	r18, 0x03BC	; 0x8003bc <current_temperature_bed>
   150bc:	30 91 bd 03 	lds	r19, 0x03BD	; 0x8003bd <current_temperature_bed+0x1>
   150c0:	40 91 be 03 	lds	r20, 0x03BE	; 0x8003be <current_temperature_bed+0x2>
   150c4:	50 91 bf 03 	lds	r21, 0x03BF	; 0x8003bf <current_temperature_bed+0x3>
   150c8:	e0 91 59 0d 	lds	r30, 0x0D59	; 0x800d59 <_ZL16target_direction.lto_priv.490>
   150cc:	ee 23       	and	r30, r30
   150ce:	91 f0       	breq	.+36     	; 0x150f4 <process_commands() [clone .part.46]+0x313c>
   150d0:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   150d4:	18 16       	cp	r1, r24
   150d6:	a4 f0       	brlt	.+40     	; 0x15100 <process_commands() [clone .part.46]+0x3148>
          }
          manage_heater();
          manage_inactivity();
          lcd_update(0);
        }
        LCD_MESSAGERPGM(_T(MSG_BED_DONE));
   150d8:	8c e4       	ldi	r24, 0x4C	; 76
   150da:	96 e5       	ldi	r25, 0x56	; 86
   150dc:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   150e0:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
		heating_status = HeatingStatus::BED_HEATING_COMPLETE;
   150e4:	84 e0       	ldi	r24, 0x04	; 4
   150e6:	80 93 cb 03 	sts	0x03CB, r24	; 0x8003cb <heating_status>

        previous_millis_cmd.start();
   150ea:	88 e4       	ldi	r24, 0x48	; 72
   150ec:	93 e0       	ldi	r25, 0x03	; 3
   150ee:	0f 94 47 10 	call	0x2208e	; 0x2208e <Timer<unsigned long>::start()>
   150f2:	8d cb       	rjmp	.-2278   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        codenum = _millis();

        cancel_heatup = false;
        target_direction = isHeatingBed(); // true if heating, false if cooling

        while ( (!cancel_heatup) && (target_direction ? (isHeatingBed()) : (isCoolingBed()&&(CooldownNoWait==false))) )
   150f4:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   150f8:	87 ff       	sbrs	r24, 7
   150fa:	ee cf       	rjmp	.-36     	; 0x150d8 <process_commands() [clone .part.46]+0x3120>
   150fc:	11 11       	cpse	r17, r1
   150fe:	ec cf       	rjmp	.-40     	; 0x150d8 <process_commands() [clone .part.46]+0x3120>
        {
          if (lcd_commands_type == LcdCommands::LongPause) {
   15100:	80 91 5e 0d 	lds	r24, 0x0D5E	; 0x800d5e <lcd_commands_type>
   15104:	82 30       	cpi	r24, 0x02	; 2
   15106:	41 f3       	breq	.-48     	; 0x150d8 <process_commands() [clone .part.46]+0x3120>
            // Print was suddenly paused, break out of the loop
            // This can happen when the firmware report a fan error
            break;
          }

          if(( _millis() - codenum) > 1000 ) //Print Temp Reading every 1 second while heating up.
   15108:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   1510c:	6c 19       	sub	r22, r12
   1510e:	7d 09       	sbc	r23, r13
   15110:	8e 09       	sbc	r24, r14
   15112:	9f 09       	sbc	r25, r15
   15114:	69 3e       	cpi	r22, 0xE9	; 233
   15116:	73 40       	sbci	r23, 0x03	; 3
   15118:	81 05       	cpc	r24, r1
   1511a:	91 05       	cpc	r25, r1
   1511c:	50 f0       	brcs	.+20     	; 0x15132 <process_commands() [clone .part.46]+0x317a>
          {
			  if (!farm_mode) {
   1511e:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   15122:	81 11       	cpse	r24, r1
   15124:	02 c0       	rjmp	.+4      	; 0x1512a <process_commands() [clone .part.46]+0x3172>
				  serialecho_temperatures();
   15126:	0e 94 d2 7a 	call	0xf5a4	; 0xf5a4 <serialecho_temperatures()>
			  }
				  codenum = _millis();
   1512a:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   1512e:	6b 01       	movw	r12, r22
   15130:	7c 01       	movw	r14, r24

          }
          manage_heater();
   15132:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
          manage_inactivity();
   15136:	80 e0       	ldi	r24, 0x00	; 0
   15138:	0e 94 34 8c 	call	0x11868	; 0x11868 <manage_inactivity(bool)>
          lcd_update(0);
   1513c:	80 e0       	ldi	r24, 0x00	; 0
   1513e:	0e 94 f9 6e 	call	0xddf2	; 0xddf2 <lcd_update(unsigned char)>
   15142:	ac cf       	rjmp	.-168    	; 0x1509c <process_commands() [clone .part.46]+0x30e4>

    #### Parameters
      - `S` - Specifies the duty cycle of the print fan. Allowed values are 0-255. If it's omitted, a value of 255 is used.
    */
    case 106: // M106 Sxxx Fan On S<speed> 0 .. 255
        if (code_seen('S')){
   15144:	83 e5       	ldi	r24, 0x53	; 83
   15146:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   1514a:	88 23       	and	r24, r24
   1514c:	29 f0       	breq	.+10     	; 0x15158 <process_commands() [clone .part.46]+0x31a0>
           fanSpeed = code_value_uint8();
   1514e:	0e 94 0a 56 	call	0xac14	; 0xac14 <code_value_uint8()>
   15152:	80 93 55 12 	sts	0x1255, r24	; 0x801255 <fanSpeed>
   15156:	5b cb       	rjmp	.-2378   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        }
        else {
          fanSpeed = 255;
   15158:	8f ef       	ldi	r24, 0xFF	; 255
   1515a:	80 93 55 12 	sts	0x1255, r24	; 0x801255 <fanSpeed>
   1515e:	57 cb       	rjmp	.-2386   	; 0x1480e <process_commands() [clone .part.46]+0x2856>

    /*!
    ### M107 - Fan off <a href="https://reprap.org/wiki/G-code#M107:_Fan_Off">M107: Fan Off</a>
    */
    case 107:
        fanSpeed = 0;
   15160:	10 92 55 12 	sts	0x1255, r1	; 0x801255 <fanSpeed>
   15164:	54 cb       	rjmp	.-2392   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    /*!
    ### M82 - Set E axis to absolute mode <a href="https://reprap.org/wiki/G-code#M82:_Set_extruder_to_absolute_mode">M82: Set extruder to absolute mode</a>
    Makes the extruder interpret extrusion as absolute positions.
    */
    case 82:
      axis_relative_modes &= ~E_AXIS_MASK;
   15166:	80 91 57 12 	lds	r24, 0x1257	; 0x801257 <axis_relative_modes>
   1516a:	87 7f       	andi	r24, 0xF7	; 247
   1516c:	80 93 57 12 	sts	0x1257, r24	; 0x801257 <axis_relative_modes>
   15170:	4e cb       	rjmp	.-2404   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    ### M18 - Disable steppers <a href="https://reprap.org/wiki/G-code#M18:_Disable_all_stepper_motors">M18: Disable all stepper motors</a>
    Equal to M84 (compatibility)
    */
    case 18: //compatibility
    case 84: // M84
      if(code_seen('S')){
   15172:	83 e5       	ldi	r24, 0x53	; 83
   15174:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   15178:	88 23       	and	r24, r24
   1517a:	99 f0       	breq	.+38     	; 0x151a2 <process_commands() [clone .part.46]+0x31ea>
        stepper_inactive_time = code_value() * 1000;
   1517c:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   15180:	20 e0       	ldi	r18, 0x00	; 0
   15182:	30 e0       	ldi	r19, 0x00	; 0
   15184:	4a e7       	ldi	r20, 0x7A	; 122
   15186:	54 e4       	ldi	r21, 0x44	; 68
   15188:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   1518c:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   15190:	60 93 37 02 	sts	0x0237, r22	; 0x800237 <stepper_inactive_time>
   15194:	70 93 38 02 	sts	0x0238, r23	; 0x800238 <stepper_inactive_time+0x1>
   15198:	80 93 39 02 	sts	0x0239, r24	; 0x800239 <stepper_inactive_time+0x2>
   1519c:	90 93 3a 02 	sts	0x023A, r25	; 0x80023a <stepper_inactive_time+0x3>
   151a0:	36 cb       	rjmp	.-2452   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
      }
      else
      {
        bool all_axis = !((code_seen(axis_codes[X_AXIS])) || (code_seen(axis_codes[Y_AXIS])) || (code_seen(axis_codes[Z_AXIS]))|| (code_seen(axis_codes[E_AXIS])));
   151a2:	88 e5       	ldi	r24, 0x58	; 88
   151a4:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   151a8:	88 23       	and	r24, r24
   151aa:	d1 f0       	breq	.+52     	; 0x151e0 <process_commands() [clone .part.46]+0x3228>
          disable_e0();
          finishAndDisableSteppers();
        }
        else
        {
          st_synchronize();
   151ac:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
      if (code_seen('X')) disable_x();
   151b0:	88 e5       	ldi	r24, 0x58	; 88
   151b2:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   151b6:	81 11       	cpse	r24, r1
   151b8:	28 c0       	rjmp	.+80     	; 0x1520a <process_commands() [clone .part.46]+0x3252>
      if (code_seen('Y')) disable_y();
   151ba:	89 e5       	ldi	r24, 0x59	; 89
   151bc:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   151c0:	88 23       	and	r24, r24
   151c2:	19 f0       	breq	.+6      	; 0x151ca <process_commands() [clone .part.46]+0x3212>
   151c4:	16 9a       	sbi	0x02, 6	; 2
   151c6:	10 92 3a 06 	sts	0x063A, r1	; 0x80063a <axis_known_position+0x1>
      if (code_seen('Z')) disable_z();
   151ca:	8a e5       	ldi	r24, 0x5A	; 90
   151cc:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
#if (E0_ENABLE_PIN != X_ENABLE_PIN) // Only enable on boards that have seperate ENABLE_PINS
      if (code_seen('E')) disable_e0();
   151d0:	85 e4       	ldi	r24, 0x45	; 69
   151d2:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   151d6:	88 23       	and	r24, r24
   151d8:	09 f4       	brne	.+2      	; 0x151dc <process_commands() [clone .part.46]+0x3224>
   151da:	19 cb       	rjmp	.-2510   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
   151dc:	14 9a       	sbi	0x02, 4	; 2
   151de:	17 cb       	rjmp	.-2514   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
      if(code_seen('S')){
        stepper_inactive_time = code_value() * 1000;
      }
      else
      {
        bool all_axis = !((code_seen(axis_codes[X_AXIS])) || (code_seen(axis_codes[Y_AXIS])) || (code_seen(axis_codes[Z_AXIS]))|| (code_seen(axis_codes[E_AXIS])));
   151e0:	89 e5       	ldi	r24, 0x59	; 89
   151e2:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   151e6:	81 11       	cpse	r24, r1
   151e8:	e1 cf       	rjmp	.-62     	; 0x151ac <process_commands() [clone .part.46]+0x31f4>
   151ea:	8a e5       	ldi	r24, 0x5A	; 90
   151ec:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   151f0:	81 11       	cpse	r24, r1
   151f2:	dc cf       	rjmp	.-72     	; 0x151ac <process_commands() [clone .part.46]+0x31f4>
   151f4:	85 e4       	ldi	r24, 0x45	; 69
   151f6:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   151fa:	81 11       	cpse	r24, r1
   151fc:	d7 cf       	rjmp	.-82     	; 0x151ac <process_commands() [clone .part.46]+0x31f4>
        if(all_axis)
        {
          st_synchronize();
   151fe:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
          disable_e0();
   15202:	14 9a       	sbi	0x02, 4	; 2
          finishAndDisableSteppers();
   15204:	0e 94 55 86 	call	0x10caa	; 0x10caa <finishAndDisableSteppers()>
   15208:	02 cb       	rjmp	.-2556   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        }
        else
        {
          st_synchronize();
      if (code_seen('X')) disable_x();
   1520a:	17 9a       	sbi	0x02, 7	; 2
   1520c:	10 92 39 06 	sts	0x0639, r1	; 0x800639 <axis_known_position>
   15210:	d4 cf       	rjmp	.-88     	; 0x151ba <process_commands() [clone .part.46]+0x3202>

    #### Parameters
    - `S` - specifies the time in seconds. If a value of 0 is specified, the timer is disabled.
    */
    case 85: // M85
      if(code_seen('S')) {
   15212:	83 e5       	ldi	r24, 0x53	; 83
   15214:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   15218:	88 23       	and	r24, r24
   1521a:	09 f4       	brne	.+2      	; 0x1521e <process_commands() [clone .part.46]+0x3266>
   1521c:	f8 ca       	rjmp	.-2576   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        max_inactive_time = code_value() * 1000;
   1521e:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   15222:	20 e0       	ldi	r18, 0x00	; 0
   15224:	30 e0       	ldi	r19, 0x00	; 0
   15226:	4a e7       	ldi	r20, 0x7A	; 122
   15228:	54 e4       	ldi	r21, 0x44	; 68
   1522a:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   1522e:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   15232:	60 93 44 03 	sts	0x0344, r22	; 0x800344 <max_inactive_time>
   15236:	70 93 45 03 	sts	0x0345, r23	; 0x800345 <max_inactive_time+0x1>
   1523a:	80 93 46 03 	sts	0x0346, r24	; 0x800346 <max_inactive_time+0x2>
   1523e:	90 93 47 03 	sts	0x0347, r25	; 0x800347 <max_inactive_time+0x3>
   15242:	e5 ca       	rjmp	.-2614   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
   15244:	34 ec       	ldi	r19, 0xC4	; 196
   15246:	83 2e       	mov	r8, r19
   15248:	32 e0       	ldi	r19, 0x02	; 2
   1524a:	93 2e       	mov	r9, r19
   1524c:	47 e6       	ldi	r20, 0x67	; 103
   1524e:	a4 2e       	mov	r10, r20
   15250:	4d e0       	ldi	r20, 0x0D	; 13
   15252:	b4 2e       	mov	r11, r20
    - `Y` - Steps per mm for the Y drive
    - `Z` - Steps per mm for the Z drive
    - `E` - Steps per mm for the extruder drive
    */
    case 92:
      for(int8_t i=0; i < NUM_AXIS; i++)
   15254:	10 e0       	ldi	r17, 0x00	; 0
      {
        if(code_seen(axis_codes[i]))
   15256:	f4 01       	movw	r30, r8
   15258:	81 91       	ld	r24, Z+
   1525a:	4f 01       	movw	r8, r30
   1525c:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   15260:	88 23       	and	r24, r24
   15262:	09 f4       	brne	.+2      	; 0x15266 <process_commands() [clone .part.46]+0x32ae>
   15264:	67 c0       	rjmp	.+206    	; 0x15334 <process_commands() [clone .part.46]+0x337c>
        {
          float value = code_value();
   15266:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   1526a:	6b 01       	movw	r12, r22
   1526c:	7c 01       	movw	r14, r24
          if(i == E_AXIS) { // E
   1526e:	13 30       	cpi	r17, 0x03	; 3
   15270:	09 f0       	breq	.+2      	; 0x15274 <process_commands() [clone .part.46]+0x32bc>
   15272:	6a c0       	rjmp	.+212    	; 0x15348 <process_commands() [clone .part.46]+0x3390>
            if(value < 20.0) {
   15274:	20 e0       	ldi	r18, 0x00	; 0
   15276:	30 e0       	ldi	r19, 0x00	; 0
   15278:	40 ea       	ldi	r20, 0xA0	; 160
   1527a:	51 e4       	ldi	r21, 0x41	; 65
   1527c:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   15280:	87 ff       	sbrs	r24, 7
   15282:	4e c0       	rjmp	.+156    	; 0x15320 <process_commands() [clone .part.46]+0x3368>
              const float factor = cs.axis_steps_per_mm[E_AXIS] / value; // increase e constants if M92 E14 is given for netfab.
   15284:	a7 01       	movw	r20, r14
   15286:	96 01       	movw	r18, r12
   15288:	60 91 77 0d 	lds	r22, 0x0D77	; 0x800d77 <cs+0x10>
   1528c:	70 91 78 0d 	lds	r23, 0x0D78	; 0x800d78 <cs+0x11>
   15290:	80 91 79 0d 	lds	r24, 0x0D79	; 0x800d79 <cs+0x12>
   15294:	90 91 7a 0d 	lds	r25, 0x0D7A	; 0x800d7a <cs+0x13>
   15298:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   1529c:	2b 01       	movw	r4, r22
   1529e:	3c 01       	movw	r6, r24
              cs.max_jerk[E_AXIS] *= factor;
   152a0:	ac 01       	movw	r20, r24
   152a2:	9b 01       	movw	r18, r22
   152a4:	60 91 bb 0d 	lds	r22, 0x0DBB	; 0x800dbb <cs+0x54>
   152a8:	70 91 bc 0d 	lds	r23, 0x0DBC	; 0x800dbc <cs+0x55>
   152ac:	80 91 bd 0d 	lds	r24, 0x0DBD	; 0x800dbd <cs+0x56>
   152b0:	90 91 be 0d 	lds	r25, 0x0DBE	; 0x800dbe <cs+0x57>
   152b4:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   152b8:	60 93 bb 0d 	sts	0x0DBB, r22	; 0x800dbb <cs+0x54>
   152bc:	70 93 bc 0d 	sts	0x0DBC, r23	; 0x800dbc <cs+0x55>
   152c0:	80 93 bd 0d 	sts	0x0DBD, r24	; 0x800dbd <cs+0x56>
   152c4:	90 93 be 0d 	sts	0x0DBE, r25	; 0x800dbe <cs+0x57>
              max_feedrate[E_AXIS] *= factor;
   152c8:	a3 01       	movw	r20, r6
   152ca:	92 01       	movw	r18, r4
   152cc:	60 91 87 0d 	lds	r22, 0x0D87	; 0x800d87 <cs+0x20>
   152d0:	70 91 88 0d 	lds	r23, 0x0D88	; 0x800d88 <cs+0x21>
   152d4:	80 91 89 0d 	lds	r24, 0x0D89	; 0x800d89 <cs+0x22>
   152d8:	90 91 8a 0d 	lds	r25, 0x0D8A	; 0x800d8a <cs+0x23>
   152dc:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   152e0:	60 93 87 0d 	sts	0x0D87, r22	; 0x800d87 <cs+0x20>
   152e4:	70 93 88 0d 	sts	0x0D88, r23	; 0x800d88 <cs+0x21>
   152e8:	80 93 89 0d 	sts	0x0D89, r24	; 0x800d89 <cs+0x22>
   152ec:	90 93 8a 0d 	sts	0x0D8A, r25	; 0x800d8a <cs+0x23>
              max_acceleration_steps_per_s2[E_AXIS] *= factor;
   152f0:	60 91 b7 04 	lds	r22, 0x04B7	; 0x8004b7 <max_acceleration_steps_per_s2+0xc>
   152f4:	70 91 b8 04 	lds	r23, 0x04B8	; 0x8004b8 <max_acceleration_steps_per_s2+0xd>
   152f8:	80 91 b9 04 	lds	r24, 0x04B9	; 0x8004b9 <max_acceleration_steps_per_s2+0xe>
   152fc:	90 91 ba 04 	lds	r25, 0x04BA	; 0x8004ba <max_acceleration_steps_per_s2+0xf>
   15300:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   15304:	a3 01       	movw	r20, r6
   15306:	92 01       	movw	r18, r4
   15308:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   1530c:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   15310:	60 93 b7 04 	sts	0x04B7, r22	; 0x8004b7 <max_acceleration_steps_per_s2+0xc>
   15314:	70 93 b8 04 	sts	0x04B8, r23	; 0x8004b8 <max_acceleration_steps_per_s2+0xd>
   15318:	80 93 b9 04 	sts	0x04B9, r24	; 0x8004b9 <max_acceleration_steps_per_s2+0xe>
   1531c:	90 93 ba 04 	sts	0x04BA, r25	; 0x8004ba <max_acceleration_steps_per_s2+0xf>
            }
            cs.axis_steps_per_mm[E_AXIS] = value;
   15320:	c0 92 77 0d 	sts	0x0D77, r12	; 0x800d77 <cs+0x10>
   15324:	d0 92 78 0d 	sts	0x0D78, r13	; 0x800d78 <cs+0x11>
   15328:	e0 92 79 0d 	sts	0x0D79, r14	; 0x800d79 <cs+0x12>
   1532c:	f0 92 7a 0d 	sts	0x0D7A, r15	; 0x800d7a <cs+0x13>
#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
            fsensor.init();
   15330:	0f 94 dc 6d 	call	0x2dbb8	; 0x2dbb8 <PAT9125_sensor::init() [clone .constprop.206]>
   15334:	b4 e0       	ldi	r27, 0x04	; 4
   15336:	ab 0e       	add	r10, r27
   15338:	b1 1c       	adc	r11, r1
   1533a:	1f 5f       	subi	r17, 0xFF	; 255
    - `Y` - Steps per mm for the Y drive
    - `Z` - Steps per mm for the Z drive
    - `E` - Steps per mm for the extruder drive
    */
    case 92:
      for(int8_t i=0; i < NUM_AXIS; i++)
   1533c:	14 30       	cpi	r17, 0x04	; 4
   1533e:	09 f0       	breq	.+2      	; 0x15342 <process_commands() [clone .part.46]+0x338a>
   15340:	8a cf       	rjmp	.-236    	; 0x15256 <process_commands() [clone .part.46]+0x329e>
          } else {
            cs.axis_steps_per_mm[i] = value;
          }
        }
      }
      reset_acceleration_rates();
   15342:	0f 94 a6 3c 	call	0x2794c	; 0x2794c <reset_acceleration_rates()>
   15346:	63 ca       	rjmp	.-2874   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
            cs.axis_steps_per_mm[E_AXIS] = value;
#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
            fsensor.init();
#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
          } else {
            cs.axis_steps_per_mm[i] = value;
   15348:	d5 01       	movw	r26, r10
   1534a:	14 96       	adiw	r26, 0x04	; 4
   1534c:	cd 92       	st	X+, r12
   1534e:	dd 92       	st	X+, r13
   15350:	ed 92       	st	X+, r14
   15352:	fc 92       	st	X, r15
   15354:	17 97       	sbiw	r26, 0x07	; 7
   15356:	ee cf       	rjmp	.-36     	; 0x15334 <process_commands() [clone .part.46]+0x337c>

    #### Parameters
    - `S` - Seconds. Default is 2 seconds between "busy" messages
    */
	case 113:
		if (code_seen('S')) {
   15358:	83 e5       	ldi	r24, 0x53	; 83
   1535a:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   1535e:	88 23       	and	r24, r24
   15360:	29 f0       	breq	.+10     	; 0x1536c <process_commands() [clone .part.46]+0x33b4>
			host_keepalive_interval = code_value_uint8();
   15362:	0e 94 0a 56 	call	0xac14	; 0xac14 <code_value_uint8()>
   15366:	80 93 32 02 	sts	0x0232, r24	; 0x800232 <host_keepalive_interval>
   1536a:	51 ca       	rjmp	.-2910   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
		}
		else {
			SERIAL_ECHO_START;
   1536c:	8e ec       	ldi	r24, 0xCE	; 206
   1536e:	91 ea       	ldi	r25, 0xA1	; 161
   15370:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
			SERIAL_ECHOPAIR("M113 S", (unsigned long)host_keepalive_interval);
   15374:	c0 90 32 02 	lds	r12, 0x0232	; 0x800232 <host_keepalive_interval>
   15378:	d1 2c       	mov	r13, r1
   1537a:	f1 2c       	mov	r15, r1
   1537c:	e1 2c       	mov	r14, r1
void serial_echopair_P(const char *s_P, float v)
    { serialprintPGM(s_P); SERIAL_ECHO(v); }
void serial_echopair_P(const char *s_P, double v)
    { serialprintPGM(s_P); SERIAL_ECHO(v); }
void serial_echopair_P(const char *s_P, unsigned long v)
    { serialprintPGM(s_P); SERIAL_ECHO(v); }
   1537e:	8b e3       	ldi	r24, 0x3B	; 59
   15380:	90 e8       	ldi	r25, 0x80	; 128
   15382:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
}

void MarlinSerial::print(unsigned long n, int base)
{
  if (base == 0) write(n);
  else printNumber(n, base);
   15386:	4a e0       	ldi	r20, 0x0A	; 10
   15388:	c7 01       	movw	r24, r14
   1538a:	b6 01       	movw	r22, r12
   1538c:	0e 94 c5 79 	call	0xf38a	; 0xf38a <MarlinSerial::printNumber(unsigned long, unsigned char)>
			host_keepalive_interval = code_value_uint8();
		}
		else {
			SERIAL_ECHO_START;
			SERIAL_ECHOPAIR("M113 S", (unsigned long)host_keepalive_interval);
			SERIAL_PROTOCOLLN();
   15390:	0e 94 bc 7a 	call	0xf578	; 0xf578 <MarlinSerial::println()>
   15394:	3c ca       	rjmp	.-2952   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    */
	case 115: // M115
      if (code_seen('V')) {
          // Report the Prusa version number.
          SERIAL_PROTOCOLLNRPGM(FW_VERSION_STR_P());
      } else if (code_seen('U')) {
   15396:	85 e5       	ldi	r24, 0x55	; 85
   15398:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   1539c:	88 23       	and	r24, r24
   1539e:	09 f4       	brne	.+2      	; 0x153a2 <process_commands() [clone .part.46]+0x33ea>
   153a0:	5a c0       	rjmp	.+180    	; 0x15456 <process_commands() [clone .part.46]+0x349e>
          // Check the firmware version provided. If the firmware version provided by the U code is higher than the currently running firmware,
          // pause the print for 30s and ask the user to upgrade the firmware.
          show_upgrade_dialog_if_version_newer(++ strchr_pointer);
   153a2:	00 91 bb 04 	lds	r16, 0x04BB	; 0x8004bb <strchr_pointer>
   153a6:	10 91 bc 04 	lds	r17, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
   153aa:	0f 5f       	subi	r16, 0xFF	; 255
   153ac:	1f 4f       	sbci	r17, 0xFF	; 255
   153ae:	10 93 bc 04 	sts	0x04BC, r17	; 0x8004bc <strchr_pointer+0x1>
   153b2:	00 93 bb 04 	sts	0x04BB, r16	; 0x8004bb <strchr_pointer>
    return false;
}

bool show_upgrade_dialog_if_version_newer(const char *version_string)
{
    if(oCheckVersion == ClCheckMode::_None)
   153b6:	80 91 e9 03 	lds	r24, 0x03E9	; 0x8003e9 <oCheckVersion>
   153ba:	88 23       	and	r24, r24
   153bc:	09 f4       	brne	.+2      	; 0x153c0 <process_commands() [clone .part.46]+0x3408>
   153be:	27 ca       	rjmp	.-2994   	; 0x1480e <process_commands() [clone .part.46]+0x2856>

// 1 - yes, 0 - false, -1 - error;
inline int8_t is_provided_version_newer(const char *version_string)
{
    uint16_t ver_gcode[4];
    if (! parse_version(version_string, ver_gcode))
   153c0:	be 01       	movw	r22, r28
   153c2:	6f 5f       	subi	r22, 0xFF	; 255
   153c4:	7f 4f       	sbci	r23, 0xFF	; 255
   153c6:	c8 01       	movw	r24, r16
   153c8:	0e 94 9b d9 	call	0x1b336	; 0x1b336 <parse_version(char const*, unsigned int*)>
   153cc:	88 23       	and	r24, r24
   153ce:	09 f4       	brne	.+2      	; 0x153d2 <process_commands() [clone .part.46]+0x341a>
   153d0:	1e ca       	rjmp	.-3012   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
   153d2:	85 e3       	ldi	r24, 0x35	; 53
   153d4:	97 e8       	ldi	r25, 0x87	; 135
   153d6:	de 01       	movw	r26, r28
   153d8:	11 96       	adiw	r26, 0x01	; 1
   153da:	be 01       	movw	r22, r28
   153dc:	67 5f       	subi	r22, 0xF7	; 247
   153de:	7f 4f       	sbci	r23, 0xFF	; 255
        return -1;
    for (uint8_t i = 0; i < 4; ++ i)
    {
        uint16_t v = (uint16_t)pgm_read_word(&FW_VERSION_NR[i]);
   153e0:	fc 01       	movw	r30, r24
   153e2:	45 91       	lpm	r20, Z+
   153e4:	54 91       	lpm	r21, Z
        if (ver_gcode[i] > v)
   153e6:	2d 91       	ld	r18, X+
   153e8:	3d 91       	ld	r19, X+
   153ea:	42 17       	cp	r20, r18
   153ec:	53 07       	cpc	r21, r19
   153ee:	10 f4       	brcc	.+4      	; 0x153f4 <process_commands() [clone .part.46]+0x343c>
   153f0:	0c 94 30 bc 	jmp	0x17860	; 0x17860 <process_commands() [clone .part.46]+0x58a8>
            return 1;
        else if (ver_gcode[i] < v)
   153f4:	24 17       	cp	r18, r20
   153f6:	35 07       	cpc	r19, r21
   153f8:	08 f4       	brcc	.+2      	; 0x153fc <process_commands() [clone .part.46]+0x3444>
   153fa:	09 ca       	rjmp	.-3054   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
   153fc:	02 96       	adiw	r24, 0x02	; 2
inline int8_t is_provided_version_newer(const char *version_string)
{
    uint16_t ver_gcode[4];
    if (! parse_version(version_string, ver_gcode))
        return -1;
    for (uint8_t i = 0; i < 4; ++ i)
   153fe:	a6 17       	cp	r26, r22
   15400:	b7 07       	cpc	r27, r23
   15402:	71 f7       	brne	.-36     	; 0x153e0 <process_commands() [clone .part.46]+0x3428>
   15404:	04 ca       	rjmp	.-3064   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    if (upgrade) {
        lcd_display_message_fullscreen_P(_T(MSG_NEW_FIRMWARE_AVAILABLE));
        lcd_puts_at_P(0, 2, PSTR(""));
        for (const char *c = version_string; ! is_whitespace_or_nl_or_eol(*c); ++ c)
            lcd_putc(*c);
        lcd_puts_at_P(0, 3, _T(MSG_NEW_FIRMWARE_PLEASE_UPGRADE));
   15406:	8f e0       	ldi	r24, 0x0F	; 15
   15408:	99 e3       	ldi	r25, 0x39	; 57
   1540a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1540e:	ac 01       	movw	r20, r24
   15410:	63 e0       	ldi	r22, 0x03	; 3
   15412:	80 e0       	ldi	r24, 0x00	; 0
   15414:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
        Sound_MakeCustom(50,1000,false);
   15418:	40 e0       	ldi	r20, 0x00	; 0
   1541a:	68 ee       	ldi	r22, 0xE8	; 232
   1541c:	73 e0       	ldi	r23, 0x03	; 3
   1541e:	82 e3       	ldi	r24, 0x32	; 50
   15420:	90 e0       	ldi	r25, 0x00	; 0
   15422:	0f 94 be 27 	call	0x24f7c	; 0x24f7c <Sound_MakeCustom(unsigned int, unsigned int, bool)>
        delay_keep_alive(500);
   15426:	84 ef       	ldi	r24, 0xF4	; 244
   15428:	91 e0       	ldi	r25, 0x01	; 1
   1542a:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
        Sound_MakeCustom(50,1000,false);
   1542e:	40 e0       	ldi	r20, 0x00	; 0
   15430:	68 ee       	ldi	r22, 0xE8	; 232
   15432:	73 e0       	ldi	r23, 0x03	; 3
   15434:	82 e3       	ldi	r24, 0x32	; 50
   15436:	90 e0       	ldi	r25, 0x00	; 0
   15438:	0f 94 be 27 	call	0x24f7c	; 0x24f7c <Sound_MakeCustom(unsigned int, unsigned int, bool)>
        lcd_wait_for_click_delay(30);
   1543c:	8e e1       	ldi	r24, 0x1E	; 30
   1543e:	90 e0       	ldi	r25, 0x00	; 0
   15440:	0e 94 c2 df 	call	0x1bf84	; 0x1bf84 <lcd_wait_for_click_delay(unsigned int)>
        lcd_update_enable(true);
   15444:	81 e0       	ldi	r24, 0x01	; 1
   15446:	0e 94 38 70 	call	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>
        lcd_clear();
   1544a:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
        lcd_update(0);
   1544e:	80 e0       	ldi	r24, 0x00	; 0
   15450:	0e 94 f9 6e 	call	0xddf2	; 0xddf2 <lcd_update(unsigned char)>
   15454:	dc c9       	rjmp	.-3144   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
      } else {
          char custom_mendel_name[MAX_CUSTOM_MENDEL_NAME_LENGTH];
          eeprom_read_block(custom_mendel_name,(char*)EEPROM_CUSTOM_MENDEL_NAME,MAX_CUSTOM_MENDEL_NAME_LENGTH);
   15456:	41 e1       	ldi	r20, 0x11	; 17
   15458:	50 e0       	ldi	r21, 0x00	; 0
   1545a:	60 e8       	ldi	r22, 0x80	; 128
   1545c:	7c e0       	ldi	r23, 0x0C	; 12
   1545e:	ce 01       	movw	r24, r28
   15460:	01 96       	adiw	r24, 0x01	; 1
   15462:	0f 94 d0 a3 	call	0x347a0	; 0x347a0 <eeprom_read_block>
          SERIAL_ECHOPGM("FIRMWARE_NAME:Prusa-Firmware ");
   15466:	8d e1       	ldi	r24, 0x1D	; 29
   15468:	90 e8       	ldi	r25, 0x80	; 128
   1546a:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
          SERIAL_ECHORPGM(FW_VERSION_STR_P());
   1546e:	8c ee       	ldi	r24, 0xEC	; 236
   15470:	98 e8       	ldi	r25, 0x88	; 136
   15472:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
          SERIAL_ECHOPGM("+");
   15476:	8b e1       	ldi	r24, 0x1B	; 27
   15478:	90 e8       	ldi	r25, 0x80	; 128
   1547a:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
          SERIAL_ECHOPGM(STR(FW_COMMITNR));
   1547e:	86 e1       	ldi	r24, 0x16	; 22
   15480:	90 e8       	ldi	r25, 0x80	; 128
   15482:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
          SERIAL_ECHOPGM("_");
   15486:	84 e1       	ldi	r24, 0x14	; 20
   15488:	90 e8       	ldi	r25, 0x80	; 128
   1548a:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
          SERIAL_ECHOPGM(FW_COMMIT_HASH);
   1548e:	8a e0       	ldi	r24, 0x0A	; 10
   15490:	90 e8       	ldi	r25, 0x80	; 128
   15492:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
          SERIAL_ECHOPGM(" based on Marlin FIRMWARE_URL:https://github.com/prusa3d/Prusa-Firmware PROTOCOL_VERSION:");
   15496:	80 eb       	ldi	r24, 0xB0	; 176
   15498:	9f e7       	ldi	r25, 0x7F	; 127
   1549a:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
          SERIAL_ECHOPGM(PROTOCOL_VERSION);
   1549e:	8c ea       	ldi	r24, 0xAC	; 172
   154a0:	9f e7       	ldi	r25, 0x7F	; 127
   154a2:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
          SERIAL_ECHOPGM(" MACHINE_TYPE:");
   154a6:	8d e9       	ldi	r24, 0x9D	; 157
   154a8:	9f e7       	ldi	r25, 0x7F	; 127
   154aa:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   154ae:	ce 01       	movw	r24, r28
   154b0:	01 96       	adiw	r24, 0x01	; 1
   154b2:	0e 94 95 87 	call	0x10f2a	; 0x10f2a <MarlinSerial::write(char const*)>
          SERIAL_PROTOCOL(custom_mendel_name);
          SERIAL_ECHOPGM(" EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS));
   154b6:	8b e8       	ldi	r24, 0x8B	; 139
   154b8:	9f e7       	ldi	r25, 0x7F	; 127
   154ba:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
#ifdef MACHINE_UUID
          SERIAL_ECHOPGM(" UUID:");
          SERIAL_ECHOPGM(MACHINE_UUID);
#endif //MACHINE_UUID
          SERIAL_ECHOLNPGM("");
   154be:	8a e8       	ldi	r24, 0x8A	; 138
   154c0:	9f e7       	ldi	r25, 0x7F	; 127
   154c2:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
}

#ifdef EXTENDED_CAPABILITIES_REPORT

static void cap_line(const char* name, bool ena = false) {
    printf_P(PSTR("Cap:%S:%c\n"), name, (char)ena + '0');
   154c6:	1f 92       	push	r1
   154c8:	21 e3       	ldi	r18, 0x31	; 49
   154ca:	f2 2e       	mov	r15, r18
   154cc:	ff 92       	push	r15
   154ce:	83 ef       	ldi	r24, 0xF3	; 243
   154d0:	9d e7       	ldi	r25, 0x7D	; 125
   154d2:	9f 93       	push	r25
   154d4:	8f 93       	push	r24
   154d6:	0c ea       	ldi	r16, 0xAC	; 172
   154d8:	1d e7       	ldi	r17, 0x7D	; 125
   154da:	1f 93       	push	r17
   154dc:	0f 93       	push	r16
   154de:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   154e2:	1f 92       	push	r1
   154e4:	ff 92       	push	r15
   154e6:	83 ee       	ldi	r24, 0xE3	; 227
   154e8:	9d e7       	ldi	r25, 0x7D	; 125
   154ea:	9f 93       	push	r25
   154ec:	8f 93       	push	r24
   154ee:	1f 93       	push	r17
   154f0:	0f 93       	push	r16
   154f2:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   154f6:	1f 92       	push	r1
   154f8:	ff 92       	push	r15
   154fa:	8f ec       	ldi	r24, 0xCF	; 207
   154fc:	9d e7       	ldi	r25, 0x7D	; 125
   154fe:	9f 93       	push	r25
   15500:	8f 93       	push	r24
   15502:	1f 93       	push	r17
   15504:	0f 93       	push	r16
   15506:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   1550a:	1f 92       	push	r1
   1550c:	ff 92       	push	r15
   1550e:	82 ec       	ldi	r24, 0xC2	; 194
   15510:	9d e7       	ldi	r25, 0x7D	; 125
   15512:	9f 93       	push	r25
   15514:	8f 93       	push	r24
   15516:	1f 93       	push	r17
   15518:	0f 93       	push	r16
   1551a:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   1551e:	1f 92       	push	r1
   15520:	ff 92       	push	r15
   15522:	87 eb       	ldi	r24, 0xB7	; 183
   15524:	9d e7       	ldi	r25, 0x7D	; 125
   15526:	9f 93       	push	r25
   15528:	8f 93       	push	r24
   1552a:	1f 93       	push	r17
   1552c:	0f 93       	push	r16
   1552e:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   15532:	0f b6       	in	r0, 0x3f	; 63
   15534:	f8 94       	cli
   15536:	de bf       	out	0x3e, r29	; 62
   15538:	0f be       	out	0x3f, r0	; 63
   1553a:	cd bf       	out	0x3d, r28	; 61
   1553c:	68 c9       	rjmp	.-3376   	; 0x1480e <process_commands() [clone .part.46]+0x2856>

    /*!
    ### M114 - Get current position <a href="https://reprap.org/wiki/G-code#M114:_Get_Current_Position">M114: Get Current Position</a>
    */
    case 114:
		gcode_M114();
   1553e:	0e 94 bb 7b 	call	0xf776	; 0xf776 <gcode_M114()>
   15542:	65 c9       	rjmp	.-3382   	; 0x1480e <process_commands() [clone .part.46]+0x2856>

    /*!
    ### M117 - Display Message <a href="https://reprap.org/wiki/G-code#M117:_Display_Message">M117: Display Message</a>
    */
    case 117: {
        const char *src = strchr_pointer + 4; // "M117"
   15544:	e0 91 bb 04 	lds	r30, 0x04BB	; 0x8004bb <strchr_pointer>
   15548:	f0 91 bc 04 	lds	r31, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
   1554c:	cf 01       	movw	r24, r30
   1554e:	04 96       	adiw	r24, 0x04	; 4
        lcd_setstatus(*src == ' '? src + 1: src);
   15550:	24 81       	ldd	r18, Z+4	; 0x04
   15552:	20 32       	cpi	r18, 0x20	; 32
   15554:	09 f4       	brne	.+2      	; 0x15558 <process_commands() [clone .part.46]+0x35a0>
   15556:	01 96       	adiw	r24, 0x01	; 1
   15558:	0e 94 e8 de 	call	0x1bdd0	; 0x1bdd0 <lcd_setstatus(char const*)>
        custom_message_type = CustomMsg::M117;
   1555c:	87 e0       	ldi	r24, 0x07	; 7
   1555e:	80 93 5d 06 	sts	0x065D, r24	; 0x80065d <custom_message_type>
   15562:	55 c9       	rjmp	.-3414   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    - `E1` - Prepend echo: to the message. Some hosts will display echo messages differently when preceded by echo:.
    - `String` - Message string. If omitted, a blank line will be sent.
    */
    case 118: {
        bool hasE = false, hasA = false;
        char *p = strchr_pointer + 5;
   15564:	00 91 bb 04 	lds	r16, 0x04BB	; 0x8004bb <strchr_pointer>
   15568:	10 91 bc 04 	lds	r17, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
   1556c:	0b 5f       	subi	r16, 0xFB	; 251
   1556e:	1f 4f       	sbci	r17, 0xFF	; 255
   15570:	83 e0       	ldi	r24, 0x03	; 3
    - `A1` - Prepend // to denote a comment or action command. Hosts like OctoPrint can interpret such commands to perform special actions. See your host’s documentation.
    - `E1` - Prepend echo: to the message. Some hosts will display echo messages differently when preceded by echo:.
    - `String` - Message string. If omitted, a blank line will be sent.
    */
    case 118: {
        bool hasE = false, hasA = false;
   15572:	f1 2c       	mov	r15, r1
   15574:	40 e0       	ldi	r20, 0x00	; 0
   15576:	81 50       	subi	r24, 0x01	; 1
        char *p = strchr_pointer + 5;

        for (uint8_t i = 2; i--;) {
   15578:	e9 f0       	breq	.+58     	; 0x155b4 <process_commands() [clone .part.46]+0x35fc>
          // A1, E1, and Pn are always parsed out
          if (!((p[0] == 'A' || p[0] == 'E') && p[1] == '1')) break;
   1557a:	d8 01       	movw	r26, r16
   1557c:	9c 91       	ld	r25, X
   1557e:	29 2f       	mov	r18, r25
   15580:	2b 7f       	andi	r18, 0xFB	; 251
   15582:	21 34       	cpi	r18, 0x41	; 65
   15584:	b9 f4       	brne	.+46     	; 0x155b4 <process_commands() [clone .part.46]+0x35fc>
   15586:	11 96       	adiw	r26, 0x01	; 1
   15588:	2c 91       	ld	r18, X
   1558a:	21 33       	cpi	r18, 0x31	; 49
   1558c:	99 f4       	brne	.+38     	; 0x155b4 <process_commands() [clone .part.46]+0x35fc>
          switch (p[0]) {
   1558e:	91 34       	cpi	r25, 0x41	; 65
   15590:	71 f0       	breq	.+28     	; 0x155ae <process_commands() [clone .part.46]+0x35f6>
   15592:	95 34       	cpi	r25, 0x45	; 69
   15594:	09 f4       	brne	.+2      	; 0x15598 <process_commands() [clone .part.46]+0x35e0>
            case 'A': hasA = true; break;
            case 'E': hasE = true; break;
   15596:	41 e0       	ldi	r20, 0x01	; 1
          }
          p += 2;
   15598:	98 01       	movw	r18, r16
   1559a:	2e 5f       	subi	r18, 0xFE	; 254
   1559c:	3f 4f       	sbci	r19, 0xFF	; 255
   1559e:	89 01       	movw	r16, r18
   155a0:	2f 5f       	subi	r18, 0xFF	; 255
   155a2:	3f 4f       	sbci	r19, 0xFF	; 255
          while (*p == ' ') ++p;
   155a4:	f8 01       	movw	r30, r16
   155a6:	90 81       	ld	r25, Z
   155a8:	90 32       	cpi	r25, 0x20	; 32
   155aa:	c9 f3       	breq	.-14     	; 0x1559e <process_commands() [clone .part.46]+0x35e6>
   155ac:	e4 cf       	rjmp	.-56     	; 0x15576 <process_commands() [clone .part.46]+0x35be>

        for (uint8_t i = 2; i--;) {
          // A1, E1, and Pn are always parsed out
          if (!((p[0] == 'A' || p[0] == 'E') && p[1] == '1')) break;
          switch (p[0]) {
            case 'A': hasA = true; break;
   155ae:	ff 24       	eor	r15, r15
   155b0:	f3 94       	inc	r15
   155b2:	f2 cf       	rjmp	.-28     	; 0x15598 <process_commands() [clone .part.46]+0x35e0>
          }
          p += 2;
          while (*p == ' ') ++p;
        }

        if (hasE) SERIAL_ECHO_START;
   155b4:	44 23       	and	r20, r20
   155b6:	21 f0       	breq	.+8      	; 0x155c0 <process_commands() [clone .part.46]+0x3608>
   155b8:	8e ec       	ldi	r24, 0xCE	; 206
   155ba:	91 ea       	ldi	r25, 0xA1	; 161
   155bc:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        if (hasA) SERIAL_ECHOPGM("//");
   155c0:	ff 20       	and	r15, r15
   155c2:	21 f0       	breq	.+8      	; 0x155cc <process_commands() [clone .part.46]+0x3614>
   155c4:	87 e8       	ldi	r24, 0x87	; 135
   155c6:	9f e7       	ldi	r25, 0x7F	; 127
   155c8:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>

        SERIAL_ECHOLN(p);
   155cc:	c8 01       	movw	r24, r16
   155ce:	0e 94 a1 87 	call	0x10f42	; 0x10f42 <MarlinSerial::println(char const*)>
   155d2:	1d c9       	rjmp	.-3526   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    SERIAL_PROTOCOLRPGM(_N("Reporting endstop status"));////MSG_M119_REPORT
    SERIAL_PROTOCOLLN();
      #if defined(X_MIN_PIN) && X_MIN_PIN > -1
        SERIAL_PROTOCOLRPGM(_n("x_min: "));////MSG_X_MIN
        if(READ(X_MIN_PIN)^X_MIN_ENDSTOP_INVERTING){
          SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT);
   155d4:	87 e4       	ldi	r24, 0x47	; 71
   155d6:	95 e6       	ldi	r25, 0x65	; 101
   155d8:	0c 94 ea 9f 	jmp	0x13fd4	; 0x13fd4 <process_commands() [clone .part.46]+0x201c>
        SERIAL_PROTOCOLLN();
      #endif
      #if defined(Y_MIN_PIN) && Y_MIN_PIN > -1
        SERIAL_PROTOCOLRPGM(_n("y_min: "));////MSG_Y_MIN
        if(READ(Y_MIN_PIN)^Y_MIN_ENDSTOP_INVERTING){
          SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT);
   155dc:	87 e4       	ldi	r24, 0x47	; 71
   155de:	95 e6       	ldi	r25, 0x65	; 101
   155e0:	0c 94 f8 9f 	jmp	0x13ff0	; 0x13ff0 <process_commands() [clone .part.46]+0x2038>
        SERIAL_PROTOCOLLN();
      #endif
      #if defined(Z_MIN_PIN) && Z_MIN_PIN > -1
        SERIAL_PROTOCOLRPGM(MSG_Z_MIN);
        if(READ(Z_MIN_PIN)^Z_MIN_ENDSTOP_INVERTING){
          SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT);
   155e4:	87 e4       	ldi	r24, 0x47	; 71
   155e6:	95 e6       	ldi	r25, 0x65	; 101
   155e8:	0c 94 06 a0 	jmp	0x1400c	; 0x1400c <process_commands() [clone .part.46]+0x2054>
        SERIAL_PROTOCOLLN();
      #endif
      #if defined(Z_MAX_PIN) && Z_MAX_PIN > -1
        SERIAL_PROTOCOLRPGM(MSG_Z_MAX);
        if(READ(Z_MAX_PIN)^Z_MAX_ENDSTOP_INVERTING){
          SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT);
   155ec:	87 e4       	ldi	r24, 0x47	; 71
   155ee:	95 e6       	ldi	r25, 0x65	; 101
   155f0:	0c 94 14 a0 	jmp	0x14028	; 0x14028 <process_commands() [clone .part.46]+0x2070>

    E0:3240 RPM PRN1:4560 RPM E0@:255 PRN1@:255

    */
    case 123:
    gcode_M123();
   155f4:	0e 94 15 65 	call	0xca2a	; 0xca2a <gcode_M123()>
   155f8:	0a c9       	rjmp	.-3564   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    */
    case 200: // M200 D<millimeters> set filament diameter and set E axis units to cubic millimeters (use S0 to set back to millimeters).
      {

        uint8_t extruder = active_extruder;
        if(code_seen('T')) {
   155fa:	84 e5       	ldi	r24, 0x54	; 84
   155fc:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   15600:	88 23       	and	r24, r24
   15602:	69 f0       	breq	.+26     	; 0x1561e <process_commands() [clone .part.46]+0x3666>
          extruder = code_value_uint8();
   15604:	0e 94 0a 56 	call	0xac14	; 0xac14 <code_value_uint8()>
		  if(extruder >= EXTRUDERS) {
   15608:	88 23       	and	r24, r24
   1560a:	49 f0       	breq	.+18     	; 0x1561e <process_commands() [clone .part.46]+0x3666>
            SERIAL_ECHO_START;
   1560c:	8e ec       	ldi	r24, 0xCE	; 206
   1560e:	91 ea       	ldi	r25, 0xA1	; 161
   15610:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   15614:	88 e1       	ldi	r24, 0x18	; 24
   15616:	95 e6       	ldi	r25, 0x65	; 101
   15618:	0e 94 95 87 	call	0x10f2a	; 0x10f2a <MarlinSerial::write(char const*)>
   1561c:	f8 c8       	rjmp	.-3600   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
            SERIAL_ECHO(_n("M200 Invalid extruder "));////MSG_M200_INVALID_EXTRUDER
            break;
          }
        }
        if(code_seen('D')) {
   1561e:	84 e4       	ldi	r24, 0x44	; 68
   15620:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   15624:	88 23       	and	r24, r24
   15626:	09 f4       	brne	.+2      	; 0x1562a <process_commands() [clone .part.46]+0x3672>
   15628:	f2 c8       	rjmp	.-3612   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
		  float diameter = code_value();
   1562a:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
		  if (diameter == 0.0) {
   1562e:	20 e0       	ldi	r18, 0x00	; 0
   15630:	30 e0       	ldi	r19, 0x00	; 0
   15632:	a9 01       	movw	r20, r18
   15634:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   15638:	81 11       	cpse	r24, r1
   1563a:	05 c0       	rjmp	.+10     	; 0x15646 <process_commands() [clone .part.46]+0x368e>
			// setting any extruder filament size disables volumetric on the assumption that
			// slicers either generate in extruder values as cubic mm or as as filament feeds
			// for all extruders
		    cs.volumetric_enabled = false;
   1563c:	10 92 fe 0d 	sts	0x0DFE, r1	; 0x800dfe <cs+0x97>
		  }
        } else {
          //reserved for setting filament diameter via UFID or filament measuring device
          break;
        }
		calculate_extruder_multipliers();
   15640:	0e 94 4a 64 	call	0xc894	; 0xc894 <calculate_extruder_multipliers()>
   15644:	e4 c8       	rjmp	.-3640   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
			// setting any extruder filament size disables volumetric on the assumption that
			// slicers either generate in extruder values as cubic mm or as as filament feeds
			// for all extruders
		    cs.volumetric_enabled = false;
		  } else {
            cs.filament_size[extruder] = code_value();
   15646:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   1564a:	6b 01       	movw	r12, r22
   1564c:	7c 01       	movw	r14, r24
			// make sure all extruders have some sane value for the filament size
			cs.filament_size[0] = (cs.filament_size[0] == 0.0 ? DEFAULT_NOMINAL_FILAMENT_DIA : cs.filament_size[0]);
   1564e:	20 e0       	ldi	r18, 0x00	; 0
   15650:	30 e0       	ldi	r19, 0x00	; 0
   15652:	a9 01       	movw	r20, r18
   15654:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   15658:	81 11       	cpse	r24, r1
   1565a:	06 c0       	rjmp	.+12     	; 0x15668 <process_commands() [clone .part.46]+0x36b0>
   1565c:	c1 2c       	mov	r12, r1
   1565e:	d1 2c       	mov	r13, r1
   15660:	90 ee       	ldi	r25, 0xE0	; 224
   15662:	e9 2e       	mov	r14, r25
   15664:	9f e3       	ldi	r25, 0x3F	; 63
   15666:	f9 2e       	mov	r15, r25
   15668:	c0 92 ff 0d 	sts	0x0DFF, r12	; 0x800dff <cs+0x98>
   1566c:	d0 92 00 0e 	sts	0x0E00, r13	; 0x800e00 <cs+0x99>
   15670:	e0 92 01 0e 	sts	0x0E01, r14	; 0x800e01 <cs+0x9a>
   15674:	f0 92 02 0e 	sts	0x0E02, r15	; 0x800e02 <cs+0x9b>
				cs.filament_size[1] = (cs.filament_size[1] == 0.0 ? DEFAULT_NOMINAL_FILAMENT_DIA : cs.filament_size[1]);
				#if EXTRUDERS > 2
					cs.filament_size[2] = (cs.filament_size[2] == 0.0 ? DEFAULT_NOMINAL_FILAMENT_DIA : cs.filament_size[2]);
				#endif
            #endif
			cs.volumetric_enabled = true;
   15678:	81 e0       	ldi	r24, 0x01	; 1
   1567a:	80 93 fe 0d 	sts	0x0DFE, r24	; 0x800dfe <cs+0x97>
   1567e:	e0 cf       	rjmp	.-64     	; 0x15640 <process_commands() [clone .part.46]+0x3688>
   15680:	04 ec       	ldi	r16, 0xC4	; 196
   15682:	12 e0       	ldi	r17, 0x02	; 2
   15684:	f7 e6       	ldi	r31, 0x67	; 103
   15686:	ef 2e       	mov	r14, r31
   15688:	fd e0       	ldi	r31, 0x0D	; 13
   1568a:	ff 2e       	mov	r15, r31
   1568c:	a8 ec       	ldi	r26, 0xC8	; 200
   1568e:	ca 2e       	mov	r12, r26
   15690:	a2 e0       	ldi	r26, 0x02	; 2
   15692:	da 2e       	mov	r13, r26
    - `E` - Maximum feedrate for extruder drives
    */
    case 203: // M203 max feedrate mm/sec
		for (uint8_t i = 0; i < NUM_AXIS; i++)
		{
			if (code_seen(axis_codes[i]))
   15694:	d8 01       	movw	r26, r16
   15696:	8d 91       	ld	r24, X+
   15698:	8d 01       	movw	r16, r26
   1569a:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   1569e:	88 23       	and	r24, r24
   156a0:	39 f0       	breq	.+14     	; 0x156b0 <process_commands() [clone .part.46]+0x36f8>
			{
				float val = code_value();
   156a2:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
						val_silent = SILENT_MAX_FEEDRATE_XY;
				}
				cs.max_feedrate_normal[i] = val;
				cs.max_feedrate_silent[i] = val_silent;
#else //TMC2130
				max_feedrate[i] = val;
   156a6:	f7 01       	movw	r30, r14
   156a8:	64 8b       	std	Z+20, r22	; 0x14
   156aa:	75 8b       	std	Z+21, r23	; 0x15
   156ac:	86 8b       	std	Z+22, r24	; 0x16
   156ae:	97 8b       	std	Z+23, r25	; 0x17
   156b0:	f4 e0       	ldi	r31, 0x04	; 4
   156b2:	ef 0e       	add	r14, r31
   156b4:	f1 1c       	adc	r15, r1
    - `Y` - Maximum feedrate for Y axis
    - `Z` - Maximum feedrate for Z axis
    - `E` - Maximum feedrate for extruder drives
    */
    case 203: // M203 max feedrate mm/sec
		for (uint8_t i = 0; i < NUM_AXIS; i++)
   156b6:	c0 16       	cp	r12, r16
   156b8:	d1 06       	cpc	r13, r17
   156ba:	61 f7       	brne	.-40     	; 0x15694 <process_commands() [clone .part.46]+0x36dc>
   156bc:	a8 c8       	rjmp	.-3760   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    - `R` - filmanent only moves
    - `T` - travel moves (as of now T is ignored)
    */
    case 204:
      {
        if(code_seen('S')) {
   156be:	83 e5       	ldi	r24, 0x53	; 83
   156c0:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   156c4:	88 23       	and	r24, r24
   156c6:	19 f1       	breq	.+70     	; 0x1570e <process_commands() [clone .part.46]+0x3756>
          // Legacy acceleration format. This format is used by the legacy Marlin, MK2 or MK3 firmware,
          // and it is also generated by Slic3r to control acceleration per extrusion type
          // (there is a separate acceleration settings in Slicer for perimeter, first layer etc).
          cs.acceleration = cs.travel_acceleration = code_value();
   156c8:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   156cc:	60 93 27 0e 	sts	0x0E27, r22	; 0x800e27 <cs+0xc0>
   156d0:	70 93 28 0e 	sts	0x0E28, r23	; 0x800e28 <cs+0xc1>
   156d4:	80 93 29 0e 	sts	0x0E29, r24	; 0x800e29 <cs+0xc2>
   156d8:	90 93 2a 0e 	sts	0x0E2A, r25	; 0x800e2a <cs+0xc3>
   156dc:	60 93 9b 0d 	sts	0x0D9B, r22	; 0x800d9b <cs+0x34>
   156e0:	70 93 9c 0d 	sts	0x0D9C, r23	; 0x800d9c <cs+0x35>
   156e4:	80 93 9d 0d 	sts	0x0D9D, r24	; 0x800d9d <cs+0x36>
   156e8:	90 93 9e 0d 	sts	0x0D9E, r25	; 0x800d9e <cs+0x37>
          // Interpret the T value as retract acceleration in the old Marlin format.
          if(code_seen('T'))
   156ec:	84 e5       	ldi	r24, 0x54	; 84
   156ee:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   156f2:	88 23       	and	r24, r24
   156f4:	09 f4       	brne	.+2      	; 0x156f8 <process_commands() [clone .part.46]+0x3740>
   156f6:	8b c8       	rjmp	.-3818   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
            cs.retract_acceleration = code_value();
   156f8:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   156fc:	60 93 9f 0d 	sts	0x0D9F, r22	; 0x800d9f <cs+0x38>
   15700:	70 93 a0 0d 	sts	0x0DA0, r23	; 0x800da0 <cs+0x39>
   15704:	80 93 a1 0d 	sts	0x0DA1, r24	; 0x800da1 <cs+0x3a>
   15708:	90 93 a2 0d 	sts	0x0DA2, r25	; 0x800da2 <cs+0x3b>
   1570c:	80 c8       	rjmp	.-3840   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        } else {
          // New acceleration format, compatible with the upstream Marlin.
          if(code_seen('P'))
   1570e:	80 e5       	ldi	r24, 0x50	; 80
   15710:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   15714:	88 23       	and	r24, r24
   15716:	51 f0       	breq	.+20     	; 0x1572c <process_commands() [clone .part.46]+0x3774>
            cs.acceleration = code_value();
   15718:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   1571c:	60 93 9b 0d 	sts	0x0D9B, r22	; 0x800d9b <cs+0x34>
   15720:	70 93 9c 0d 	sts	0x0D9C, r23	; 0x800d9c <cs+0x35>
   15724:	80 93 9d 0d 	sts	0x0D9D, r24	; 0x800d9d <cs+0x36>
   15728:	90 93 9e 0d 	sts	0x0D9E, r25	; 0x800d9e <cs+0x37>
          if(code_seen('R'))
   1572c:	82 e5       	ldi	r24, 0x52	; 82
   1572e:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   15732:	88 23       	and	r24, r24
   15734:	51 f0       	breq	.+20     	; 0x1574a <process_commands() [clone .part.46]+0x3792>
            cs.retract_acceleration = code_value();
   15736:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   1573a:	60 93 9f 0d 	sts	0x0D9F, r22	; 0x800d9f <cs+0x38>
   1573e:	70 93 a0 0d 	sts	0x0DA0, r23	; 0x800da0 <cs+0x39>
   15742:	80 93 a1 0d 	sts	0x0DA1, r24	; 0x800da1 <cs+0x3a>
   15746:	90 93 a2 0d 	sts	0x0DA2, r25	; 0x800da2 <cs+0x3b>
          if(code_seen('T'))
   1574a:	84 e5       	ldi	r24, 0x54	; 84
   1574c:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   15750:	88 23       	and	r24, r24
   15752:	09 f4       	brne	.+2      	; 0x15756 <process_commands() [clone .part.46]+0x379e>
   15754:	5c c8       	rjmp	.-3912   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
            cs.travel_acceleration = code_value();
   15756:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   1575a:	60 93 27 0e 	sts	0x0E27, r22	; 0x800e27 <cs+0xc0>
   1575e:	70 93 28 0e 	sts	0x0E28, r23	; 0x800e28 <cs+0xc1>
   15762:	80 93 29 0e 	sts	0x0E29, r24	; 0x800e29 <cs+0xc2>
   15766:	90 93 2a 0e 	sts	0x0E2A, r25	; 0x800e2a <cs+0xc3>
   1576a:	51 c8       	rjmp	.-3934   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
   1576c:	04 ec       	ldi	r16, 0xC4	; 196
   1576e:	12 e0       	ldi	r17, 0x02	; 2
   15770:	ef eb       	ldi	r30, 0xBF	; 191
   15772:	ee 2e       	mov	r14, r30
   15774:	ed e0       	ldi	r30, 0x0D	; 13
   15776:	fe 2e       	mov	r15, r30
    - `Z` - Z axis offset
    */
    case 206:
      for(uint8_t i=0; i < 3; i++)
      {
        if(code_seen(axis_codes[i])) cs.add_homing[i] = code_value();
   15778:	d8 01       	movw	r26, r16
   1577a:	8d 91       	ld	r24, X+
   1577c:	8d 01       	movw	r16, r26
   1577e:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   15782:	88 23       	and	r24, r24
   15784:	39 f0       	breq	.+14     	; 0x15794 <process_commands() [clone .part.46]+0x37dc>
   15786:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   1578a:	f7 01       	movw	r30, r14
   1578c:	60 83       	st	Z, r22
   1578e:	71 83       	std	Z+1, r23	; 0x01
   15790:	82 83       	std	Z+2, r24	; 0x02
   15792:	93 83       	std	Z+3, r25	; 0x03
   15794:	f4 e0       	ldi	r31, 0x04	; 4
   15796:	ef 0e       	add	r14, r31
   15798:	f1 1c       	adc	r15, r1
    - `X` - X axis offset
    - `Y` - Y axis offset
    - `Z` - Z axis offset
    */
    case 206:
      for(uint8_t i=0; i < 3; i++)
   1579a:	22 e0       	ldi	r18, 0x02	; 2
   1579c:	07 3c       	cpi	r16, 0xC7	; 199
   1579e:	12 07       	cpc	r17, r18
   157a0:	59 f7       	brne	.-42     	; 0x15778 <process_commands() [clone .part.46]+0x37c0>
   157a2:	35 c8       	rjmp	.-3990   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    - `F` - retraction feedrate, in mm/min
    - `Z` - additional zlift/hop
    */
    case 207: //M207 - set retract length S[positive mm] F[feedrate mm/min] Z[additional zlift/hop]
    {
      if(code_seen('S'))
   157a4:	83 e5       	ldi	r24, 0x53	; 83
   157a6:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   157aa:	88 23       	and	r24, r24
   157ac:	51 f0       	breq	.+20     	; 0x157c2 <process_commands() [clone .part.46]+0x380a>
      {
        cs.retract_length = code_value() ;
   157ae:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   157b2:	60 93 ea 0d 	sts	0x0DEA, r22	; 0x800dea <cs+0x83>
   157b6:	70 93 eb 0d 	sts	0x0DEB, r23	; 0x800deb <cs+0x84>
   157ba:	80 93 ec 0d 	sts	0x0DEC, r24	; 0x800dec <cs+0x85>
   157be:	90 93 ed 0d 	sts	0x0DED, r25	; 0x800ded <cs+0x86>
      }
      if(code_seen('F'))
   157c2:	86 e4       	ldi	r24, 0x46	; 70
   157c4:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   157c8:	88 23       	and	r24, r24
   157ca:	61 f0       	breq	.+24     	; 0x157e4 <process_commands() [clone .part.46]+0x382c>
      {
        cs.retract_feedrate = get_feedrate_mm_s(code_value());
   157cc:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   157d0:	0e 94 45 65 	call	0xca8a	; 0xca8a <get_feedrate_mm_s(float)>
   157d4:	60 93 ee 0d 	sts	0x0DEE, r22	; 0x800dee <cs+0x87>
   157d8:	70 93 ef 0d 	sts	0x0DEF, r23	; 0x800def <cs+0x88>
   157dc:	80 93 f0 0d 	sts	0x0DF0, r24	; 0x800df0 <cs+0x89>
   157e0:	90 93 f1 0d 	sts	0x0DF1, r25	; 0x800df1 <cs+0x8a>
      }
      if(code_seen('Z'))
   157e4:	8a e5       	ldi	r24, 0x5A	; 90
   157e6:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   157ea:	88 23       	and	r24, r24
   157ec:	09 f4       	brne	.+2      	; 0x157f0 <process_commands() [clone .part.46]+0x3838>
   157ee:	0f c8       	rjmp	.-4066   	; 0x1480e <process_commands() [clone .part.46]+0x2856>
      {
        cs.retract_zlift = code_value() ;
   157f0:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   157f4:	60 93 f2 0d 	sts	0x0DF2, r22	; 0x800df2 <cs+0x8b>
   157f8:	70 93 f3 0d 	sts	0x0DF3, r23	; 0x800df3 <cs+0x8c>
   157fc:	80 93 f4 0d 	sts	0x0DF4, r24	; 0x800df4 <cs+0x8d>
   15800:	90 93 f5 0d 	sts	0x0DF5, r25	; 0x800df5 <cs+0x8e>
   15804:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    #### Parameters
    - `S` - 1=true or 0=false
    */
    case 209: // M209 - S<1=true/0=false> enable automatic retract detect if the slicer did not support G10/11: every normal extrude-only move will be classified as retract depending on the direction.
    {
      if(code_seen('S'))
   15808:	83 e5       	ldi	r24, 0x53	; 83
   1580a:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   1580e:	88 23       	and	r24, r24
   15810:	11 f4       	brne	.+4      	; 0x15816 <process_commands() [clone .part.46]+0x385e>
   15812:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
      {
        switch(code_value_uint8())
   15816:	0e 94 0a 56 	call	0xac14	; 0xac14 <code_value_uint8()>
   1581a:	88 23       	and	r24, r24
   1581c:	c1 f0       	breq	.+48     	; 0x1584e <process_commands() [clone .part.46]+0x3896>
   1581e:	81 30       	cpi	r24, 0x01	; 1
   15820:	e1 f0       	breq	.+56     	; 0x1585a <process_commands() [clone .part.46]+0x38a2>
            #if EXTRUDERS > 2
              retracted[2]=false;
            #endif
          }break;
          default:
            SERIAL_ECHO_START;
   15822:	8e ec       	ldi	r24, 0xCE	; 206
   15824:	91 ea       	ldi	r25, 0xA1	; 161
   15826:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
            SERIAL_ECHORPGM(MSG_UNKNOWN_COMMAND);
   1582a:	85 e0       	ldi	r24, 0x05	; 5
   1582c:	95 e6       	ldi	r25, 0x65	; 101
   1582e:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
            SERIAL_ECHO(CMDBUFFER_CURRENT_STRING);
   15832:	80 91 38 12 	lds	r24, 0x1238	; 0x801238 <bufindr>
   15836:	90 91 39 12 	lds	r25, 0x1239	; 0x801239 <bufindr+0x1>
   1583a:	82 5b       	subi	r24, 0xB2	; 178
   1583c:	9f 4e       	sbci	r25, 0xEF	; 239
   1583e:	0e 94 95 87 	call	0x10f2a	; 0x10f2a <MarlinSerial::write(char const*)>
            SERIAL_ECHOLNPGM("\"(1)");
   15842:	82 e8       	ldi	r24, 0x82	; 130
   15844:	9f e7       	ldi	r25, 0x7F	; 127
   15846:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   1584a:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
      {
        switch(code_value_uint8())
        {
          case 0:
          {
            cs.autoretract_enabled=false;
   1584e:	10 92 e9 0d 	sts	0x0DE9, r1	; 0x800de9 <cs+0x82>
            retracted[0]=false;
   15852:	10 92 1b 06 	sts	0x061B, r1	; 0x80061b <retracted>
   15856:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
              retracted[2]=false;
            #endif
          }break;
          case 1:
          {
            cs.autoretract_enabled=true;
   1585a:	80 93 e9 0d 	sts	0x0DE9, r24	; 0x800de9 <cs+0x82>
            retracted[0]=false;
   1585e:	10 92 1b 06 	sts	0x061B, r1	; 0x80061b <retracted>
   15862:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
            greater than or less than the minimum and maximum segment length.  Set to 0 to disable.
    */
    case 214:
    {
        // Extract all possible parameters if they appear
        float p = code_seen('P') ? code_value() : cs.mm_per_arc_segment;
   15866:	40 90 2b 0e 	lds	r4, 0x0E2B	; 0x800e2b <cs+0xc4>
   1586a:	50 90 2c 0e 	lds	r5, 0x0E2C	; 0x800e2c <cs+0xc5>
   1586e:	60 90 2d 0e 	lds	r6, 0x0E2D	; 0x800e2d <cs+0xc6>
   15872:	70 90 2e 0e 	lds	r7, 0x0E2E	; 0x800e2e <cs+0xc7>
   15876:	0c 94 37 a1 	jmp	0x1426e	; 0x1426e <process_commands() [clone .part.46]+0x22b6>
        float s = code_seen('S') ? code_value() : cs.min_mm_per_arc_segment;
   1587a:	80 90 2f 0e 	lds	r8, 0x0E2F	; 0x800e2f <cs+0xc8>
   1587e:	90 90 30 0e 	lds	r9, 0x0E30	; 0x800e30 <cs+0xc9>
   15882:	a0 90 31 0e 	lds	r10, 0x0E31	; 0x800e31 <cs+0xca>
   15886:	b0 90 32 0e 	lds	r11, 0x0E32	; 0x800e32 <cs+0xcb>
   1588a:	0c 94 42 a1 	jmp	0x14284	; 0x14284 <process_commands() [clone .part.46]+0x22cc>
    - `R` - Restore previous speed factor
    */
    case 220:
    {
        bool codesWereSeen = false;
        if (code_seen('B')) //backup current speed factor
   1588e:	82 e4       	ldi	r24, 0x42	; 66
   15890:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   15894:	18 2f       	mov	r17, r24
   15896:	88 23       	and	r24, r24
   15898:	41 f0       	breq	.+16     	; 0x158aa <process_commands() [clone .part.46]+0x38f2>
        {
            saved_feedmultiply_mm = feedmultiply;
   1589a:	80 91 8e 02 	lds	r24, 0x028E	; 0x80028e <feedmultiply>
   1589e:	90 91 8f 02 	lds	r25, 0x028F	; 0x80028f <feedmultiply+0x1>
   158a2:	90 93 31 02 	sts	0x0231, r25	; 0x800231 <saved_feedmultiply_mm+0x1>
   158a6:	80 93 30 02 	sts	0x0230, r24	; 0x800230 <saved_feedmultiply_mm>
            codesWereSeen = true;
        }
        if (code_seen('S'))
   158aa:	83 e5       	ldi	r24, 0x53	; 83
   158ac:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   158b0:	08 2f       	mov	r16, r24
   158b2:	88 23       	and	r24, r24
   158b4:	39 f0       	breq	.+14     	; 0x158c4 <process_commands() [clone .part.46]+0x390c>
        {
            feedmultiply = code_value_short();
   158b6:	0e 94 17 56 	call	0xac2e	; 0xac2e <code_value_short() [clone .lto_priv.505]>
   158ba:	90 93 8f 02 	sts	0x028F, r25	; 0x80028f <feedmultiply+0x1>
   158be:	80 93 8e 02 	sts	0x028E, r24	; 0x80028e <feedmultiply>
            codesWereSeen = true;
   158c2:	10 2f       	mov	r17, r16
        }
        if (code_seen('R')) //restore previous feedmultiply
   158c4:	82 e5       	ldi	r24, 0x52	; 82
   158c6:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   158ca:	88 23       	and	r24, r24
   158cc:	51 f0       	breq	.+20     	; 0x158e2 <process_commands() [clone .part.46]+0x392a>
        {
            feedmultiply = saved_feedmultiply_mm;
   158ce:	80 91 30 02 	lds	r24, 0x0230	; 0x800230 <saved_feedmultiply_mm>
   158d2:	90 91 31 02 	lds	r25, 0x0231	; 0x800231 <saved_feedmultiply_mm+0x1>
   158d6:	90 93 8f 02 	sts	0x028F, r25	; 0x80028f <feedmultiply+0x1>
   158da:	80 93 8e 02 	sts	0x028E, r24	; 0x80028e <feedmultiply>
   158de:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
            codesWereSeen = true;
        }
        if (!codesWereSeen)
   158e2:	11 11       	cpse	r17, r1
   158e4:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        {
            printf_P(PSTR("%i%%\n"), feedmultiply);
   158e8:	80 91 8f 02 	lds	r24, 0x028F	; 0x80028f <feedmultiply+0x1>
   158ec:	8f 93       	push	r24
   158ee:	80 91 8e 02 	lds	r24, 0x028E	; 0x80028e <feedmultiply>
   158f2:	8f 93       	push	r24
   158f4:	8c e7       	ldi	r24, 0x7C	; 124
   158f6:	9f e7       	ldi	r25, 0x7F	; 127
   158f8:	9f 93       	push	r25
   158fa:	8f 93       	push	r24
   158fc:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   15900:	0f 90       	pop	r0
   15902:	0f 90       	pop	r0
   15904:	0f 90       	pop	r0
   15906:	0f 90       	pop	r0
   15908:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    #### Parameters
    - `S` - Extrude factor override percentage (0..100 or higher), default 100%
    */
    case 221:
    {
        if (code_seen('S'))
   1590c:	83 e5       	ldi	r24, 0x53	; 83
   1590e:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   15912:	88 23       	and	r24, r24
   15914:	51 f0       	breq	.+20     	; 0x1592a <process_commands() [clone .part.46]+0x3972>
        {
            extrudemultiply = code_value_short();
   15916:	0e 94 17 56 	call	0xac2e	; 0xac2e <code_value_short() [clone .lto_priv.505]>
   1591a:	90 93 76 02 	sts	0x0276, r25	; 0x800276 <extrudemultiply+0x1>
   1591e:	80 93 75 02 	sts	0x0275, r24	; 0x800275 <extrudemultiply>
            calculate_extruder_multipliers();
   15922:	0e 94 4a 64 	call	0xc894	; 0xc894 <calculate_extruder_multipliers()>
   15926:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        }
        else
        {
            printf_P(PSTR("%i%%\n"), extrudemultiply);
   1592a:	80 91 76 02 	lds	r24, 0x0276	; 0x800276 <extrudemultiply+0x1>
   1592e:	8f 93       	push	r24
   15930:	80 91 75 02 	lds	r24, 0x0275	; 0x800275 <extrudemultiply>
   15934:	8f 93       	push	r24
   15936:	86 e7       	ldi	r24, 0x76	; 118
   15938:	9f e7       	ldi	r25, 0x7F	; 127
   1593a:	9f 93       	push	r25
   1593c:	8f 93       	push	r24
   1593e:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   15942:	0f 90       	pop	r0
   15944:	0f 90       	pop	r0
   15946:	0f 90       	pop	r0
   15948:	0f 90       	pop	r0
   1594a:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    - `P` - pin number
    - `S` - pin state
    */
	case 226:
	{
      if(code_seen('P')){
   1594e:	80 e5       	ldi	r24, 0x50	; 80
   15950:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   15954:	88 23       	and	r24, r24
   15956:	11 f4       	brne	.+4      	; 0x1595c <process_commands() [clone .part.46]+0x39a4>
   15958:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        int pin_number = code_value_short(); // pin number
   1595c:	0e 94 17 56 	call	0xac2e	; 0xac2e <code_value_short() [clone .lto_priv.505]>
   15960:	7c 01       	movw	r14, r24
        int pin_state = -1; // required pin state - default is inverted

        if(code_seen('S')) pin_state = code_value_short(); // required pin state
   15962:	83 e5       	ldi	r24, 0x53	; 83
   15964:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
    */
	case 226:
	{
      if(code_seen('P')){
        int pin_number = code_value_short(); // pin number
        int pin_state = -1; // required pin state - default is inverted
   15968:	0f ef       	ldi	r16, 0xFF	; 255
   1596a:	1f ef       	ldi	r17, 0xFF	; 255

        if(code_seen('S')) pin_state = code_value_short(); // required pin state
   1596c:	88 23       	and	r24, r24
   1596e:	19 f0       	breq	.+6      	; 0x15976 <process_commands() [clone .part.46]+0x39be>
   15970:	0e 94 17 56 	call	0xac2e	; 0xac2e <code_value_short() [clone .lto_priv.505]>
   15974:	8c 01       	movw	r16, r24

        if(pin_state >= -1 && pin_state <= 1){
   15976:	c8 01       	movw	r24, r16
   15978:	01 96       	adiw	r24, 0x01	; 1
   1597a:	03 97       	sbiw	r24, 0x03	; 3
   1597c:	10 f0       	brcs	.+4      	; 0x15982 <process_commands() [clone .part.46]+0x39ca>
   1597e:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
   15982:	ea e6       	ldi	r30, 0x6A	; 106
   15984:	f0 e8       	ldi	r31, 0x80	; 128
   15986:	26 e8       	ldi	r18, 0x86	; 134
   15988:	30 e8       	ldi	r19, 0x80	; 128

          for(int8_t i = 0; i < (int8_t)(sizeof(sensitive_pins)/sizeof(sensitive_pins[0])); i++)
          {
            if (((int8_t)pgm_read_byte(&sensitive_pins[i]) == pin_number))
   1598a:	84 91       	lpm	r24, Z
   1598c:	08 2e       	mov	r0, r24
   1598e:	00 0c       	add	r0, r0
   15990:	99 0b       	sbc	r25, r25
   15992:	e8 16       	cp	r14, r24
   15994:	f9 06       	cpc	r15, r25
   15996:	11 f4       	brne	.+4      	; 0x1599c <process_commands() [clone .part.46]+0x39e4>
   15998:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
   1599c:	31 96       	adiw	r30, 0x01	; 1

        if(code_seen('S')) pin_state = code_value_short(); // required pin state

        if(pin_state >= -1 && pin_state <= 1){

          for(int8_t i = 0; i < (int8_t)(sizeof(sensitive_pins)/sizeof(sensitive_pins[0])); i++)
   1599e:	2e 17       	cp	r18, r30
   159a0:	3f 07       	cpc	r19, r31
   159a2:	99 f7       	brne	.-26     	; 0x1598a <process_commands() [clone .part.46]+0x39d2>
              pin_number = -1;
              break;
            }
          }

          if (pin_number > -1)
   159a4:	f7 fe       	sbrs	r15, 7
   159a6:	02 c0       	rjmp	.+4      	; 0x159ac <process_commands() [clone .part.46]+0x39f4>
   159a8:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
          {
            int target = LOW;

            st_synchronize();
   159ac:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>

            pinMode(pin_number, INPUT);
   159b0:	de 2c       	mov	r13, r14
   159b2:	60 e0       	ldi	r22, 0x00	; 0
   159b4:	8e 2d       	mov	r24, r14
   159b6:	0e 94 3d d3 	call	0x1a67a	; 0x1a67a <pinMode>

            switch(pin_state){
   159ba:	0f 3f       	cpi	r16, 0xFF	; 255
   159bc:	10 07       	cpc	r17, r16
   159be:	b1 f0       	breq	.+44     	; 0x159ec <process_commands() [clone .part.46]+0x3a34>
   159c0:	01 30       	cpi	r16, 0x01	; 1
   159c2:	11 05       	cpc	r17, r1
   159c4:	11 f0       	breq	.+4      	; 0x159ca <process_commands() [clone .part.46]+0x3a12>
            }
          }

          if (pin_number > -1)
          {
            int target = LOW;
   159c6:	10 e0       	ldi	r17, 0x00	; 0
   159c8:	00 e0       	ldi	r16, 0x00	; 0
            case -1:
              target = !digitalRead(pin_number);
              break;
            }

            while(digitalRead(pin_number) != target){
   159ca:	8d 2d       	mov	r24, r13
   159cc:	0e 94 e6 d2 	call	0x1a5cc	; 0x1a5cc <digitalRead>
   159d0:	80 17       	cp	r24, r16
   159d2:	91 07       	cpc	r25, r17
   159d4:	11 f4       	brne	.+4      	; 0x159da <process_commands() [clone .part.46]+0x3a22>
   159d6:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
              manage_heater();
   159da:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
              manage_inactivity();
   159de:	80 e0       	ldi	r24, 0x00	; 0
   159e0:	0e 94 34 8c 	call	0x11868	; 0x11868 <manage_inactivity(bool)>
              lcd_update(0);
   159e4:	80 e0       	ldi	r24, 0x00	; 0
   159e6:	0e 94 f9 6e 	call	0xddf2	; 0xddf2 <lcd_update(unsigned char)>
   159ea:	ef cf       	rjmp	.-34     	; 0x159ca <process_commands() [clone .part.46]+0x3a12>
            case 0:
              target = LOW;
              break;

            case -1:
              target = !digitalRead(pin_number);
   159ec:	8e 2d       	mov	r24, r14
   159ee:	0e 94 e6 d2 	call	0x1a5cc	; 0x1a5cc <digitalRead>
   159f2:	31 e0       	ldi	r19, 0x01	; 1
   159f4:	20 e0       	ldi	r18, 0x00	; 0
   159f6:	89 2b       	or	r24, r25
   159f8:	09 f0       	breq	.+2      	; 0x159fc <process_commands() [clone .part.46]+0x3a44>
   159fa:	30 e0       	ldi	r19, 0x00	; 0
   159fc:	03 2f       	mov	r16, r19
   159fe:	12 2f       	mov	r17, r18
   15a00:	e4 cf       	rjmp	.-56     	; 0x159ca <process_commands() [clone .part.46]+0x3a12>
    case 300: // M300
    {
      uint16_t beepP = code_seen('P') ? min(code_value(), 3500) : 1000;
      uint16_t beepS;
      if (!code_seen('S'))
          beepS = 0;
   15a02:	70 e0       	ldi	r23, 0x00	; 0
   15a04:	60 e0       	ldi	r22, 0x00	; 0
              // handle S0 as a pause
              _delay(beepP);
              break;
          }
      }
      Sound_MakeCustom(beepP, beepS, false);
   15a06:	40 e0       	ldi	r20, 0x00	; 0
   15a08:	c8 01       	movw	r24, r16
   15a0a:	0f 94 be 27 	call	0x24f7c	; 0x24f7c <Sound_MakeCustom(unsigned int, unsigned int, bool)>
   15a0e:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    - `I` - integral (Ki)
    - `D` - derivative (Kd)
    */
    case 301:
      {
        if(code_seen('P')) cs.Kp = code_value();
   15a12:	80 e5       	ldi	r24, 0x50	; 80
   15a14:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   15a18:	88 23       	and	r24, r24
   15a1a:	51 f0       	breq	.+20     	; 0x15a30 <process_commands() [clone .part.46]+0x3a78>
   15a1c:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   15a20:	60 93 cf 0d 	sts	0x0DCF, r22	; 0x800dcf <cs+0x68>
   15a24:	70 93 d0 0d 	sts	0x0DD0, r23	; 0x800dd0 <cs+0x69>
   15a28:	80 93 d1 0d 	sts	0x0DD1, r24	; 0x800dd1 <cs+0x6a>
   15a2c:	90 93 d2 0d 	sts	0x0DD2, r25	; 0x800dd2 <cs+0x6b>
        if(code_seen('I')) cs.Ki = scalePID_i(code_value());
   15a30:	89 e4       	ldi	r24, 0x49	; 73
   15a32:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   15a36:	88 23       	and	r24, r24
   15a38:	81 f0       	breq	.+32     	; 0x15a5a <process_commands() [clone .part.46]+0x3aa2>
   15a3a:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
#ifdef PIDTEMP
// Apply the scale factors to the PID values

float scalePID_i(float i)
{
	return i*PID_dT;
   15a3e:	2c ea       	ldi	r18, 0xAC	; 172
   15a40:	35 ec       	ldi	r19, 0xC5	; 197
   15a42:	47 e2       	ldi	r20, 0x27	; 39
   15a44:	5e e3       	ldi	r21, 0x3E	; 62
   15a46:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   15a4a:	60 93 d3 0d 	sts	0x0DD3, r22	; 0x800dd3 <cs+0x6c>
   15a4e:	70 93 d4 0d 	sts	0x0DD4, r23	; 0x800dd4 <cs+0x6d>
   15a52:	80 93 d5 0d 	sts	0x0DD5, r24	; 0x800dd5 <cs+0x6e>
   15a56:	90 93 d6 0d 	sts	0x0DD6, r25	; 0x800dd6 <cs+0x6f>
        if(code_seen('D')) cs.Kd = scalePID_d(code_value());
   15a5a:	84 e4       	ldi	r24, 0x44	; 68
   15a5c:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   15a60:	88 23       	and	r24, r24
   15a62:	81 f0       	breq	.+32     	; 0x15a84 <process_commands() [clone .part.46]+0x3acc>
   15a64:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
}

float unscalePID_i(float i)
{
	return i/PID_dT;
   15a68:	2c ea       	ldi	r18, 0xAC	; 172
   15a6a:	35 ec       	ldi	r19, 0xC5	; 197
   15a6c:	47 e2       	ldi	r20, 0x27	; 39
   15a6e:	5e e3       	ldi	r21, 0x3E	; 62
   15a70:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   15a74:	60 93 d7 0d 	sts	0x0DD7, r22	; 0x800dd7 <cs+0x70>
   15a78:	70 93 d8 0d 	sts	0x0DD8, r23	; 0x800dd8 <cs+0x71>
   15a7c:	80 93 d9 0d 	sts	0x0DD9, r24	; 0x800dd9 <cs+0x72>
   15a80:	90 93 da 0d 	sts	0x0DDA, r25	; 0x800dda <cs+0x73>

        updatePID();
   15a84:	0f 94 40 17 	call	0x22e80	; 0x22e80 <updatePID()>
        SERIAL_PROTOCOLRPGM(MSG_OK);
   15a88:	80 ef       	ldi	r24, 0xF0	; 240
   15a8a:	99 e6       	ldi	r25, 0x69	; 105
   15a8c:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        SERIAL_PROTOCOLPGM(" p:");
   15a90:	82 e7       	ldi	r24, 0x72	; 114
   15a92:	9f e7       	ldi	r25, 0x7F	; 127
   15a94:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
}

void MarlinSerial::print(double n, int digits)
{
  printFloat(n, digits);
   15a98:	60 91 cf 0d 	lds	r22, 0x0DCF	; 0x800dcf <cs+0x68>
   15a9c:	70 91 d0 0d 	lds	r23, 0x0DD0	; 0x800dd0 <cs+0x69>
   15aa0:	80 91 d1 0d 	lds	r24, 0x0DD1	; 0x800dd1 <cs+0x6a>
   15aa4:	90 91 d2 0d 	lds	r25, 0x0DD2	; 0x800dd2 <cs+0x6b>
   15aa8:	42 e0       	ldi	r20, 0x02	; 2
   15aaa:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
        SERIAL_PROTOCOL(cs.Kp);
        SERIAL_PROTOCOLPGM(" i:");
   15aae:	8e e6       	ldi	r24, 0x6E	; 110
   15ab0:	9f e7       	ldi	r25, 0x7F	; 127
   15ab2:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   15ab6:	2c ea       	ldi	r18, 0xAC	; 172
   15ab8:	35 ec       	ldi	r19, 0xC5	; 197
   15aba:	47 e2       	ldi	r20, 0x27	; 39
   15abc:	5e e3       	ldi	r21, 0x3E	; 62
   15abe:	60 91 d3 0d 	lds	r22, 0x0DD3	; 0x800dd3 <cs+0x6c>
   15ac2:	70 91 d4 0d 	lds	r23, 0x0DD4	; 0x800dd4 <cs+0x6d>
   15ac6:	80 91 d5 0d 	lds	r24, 0x0DD5	; 0x800dd5 <cs+0x6e>
   15aca:	90 91 d6 0d 	lds	r25, 0x0DD6	; 0x800dd6 <cs+0x6f>
   15ace:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   15ad2:	42 e0       	ldi	r20, 0x02	; 2
   15ad4:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
        SERIAL_PROTOCOL(unscalePID_i(cs.Ki));
        SERIAL_PROTOCOLPGM(" d:");
   15ad8:	8a e6       	ldi	r24, 0x6A	; 106
   15ada:	9f e7       	ldi	r25, 0x7F	; 127
   15adc:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
#ifdef PIDTEMP
// Apply the scale factors to the PID values

float scalePID_i(float i)
{
	return i*PID_dT;
   15ae0:	2c ea       	ldi	r18, 0xAC	; 172
   15ae2:	35 ec       	ldi	r19, 0xC5	; 197
   15ae4:	47 e2       	ldi	r20, 0x27	; 39
   15ae6:	5e e3       	ldi	r21, 0x3E	; 62
   15ae8:	60 91 d7 0d 	lds	r22, 0x0DD7	; 0x800dd7 <cs+0x70>
   15aec:	70 91 d8 0d 	lds	r23, 0x0DD8	; 0x800dd8 <cs+0x71>
   15af0:	80 91 d9 0d 	lds	r24, 0x0DD9	; 0x800dd9 <cs+0x72>
   15af4:	90 91 da 0d 	lds	r25, 0x0DDA	; 0x800dda <cs+0x73>
   15af8:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
        SERIAL_PROTOCOLLN(unscalePID_d(cs.Kd));
   15afc:	0f 94 a2 65 	call	0x2cb44	; 0x2cb44 <MarlinSerial::println(double, int) [clone .constprop.354]>
   15b00:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    - `I` - integral (Ki)
    - `D` - derivative (Kd)
    */
    case 304:
      {
        if(code_seen('P')) cs.bedKp = code_value();
   15b04:	80 e5       	ldi	r24, 0x50	; 80
   15b06:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   15b0a:	88 23       	and	r24, r24
   15b0c:	51 f0       	breq	.+20     	; 0x15b22 <process_commands() [clone .part.46]+0x3b6a>
   15b0e:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   15b12:	60 93 db 0d 	sts	0x0DDB, r22	; 0x800ddb <cs+0x74>
   15b16:	70 93 dc 0d 	sts	0x0DDC, r23	; 0x800ddc <cs+0x75>
   15b1a:	80 93 dd 0d 	sts	0x0DDD, r24	; 0x800ddd <cs+0x76>
   15b1e:	90 93 de 0d 	sts	0x0DDE, r25	; 0x800dde <cs+0x77>
        if(code_seen('I')) cs.bedKi = scalePID_i(code_value());
   15b22:	89 e4       	ldi	r24, 0x49	; 73
   15b24:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   15b28:	88 23       	and	r24, r24
   15b2a:	81 f0       	breq	.+32     	; 0x15b4c <process_commands() [clone .part.46]+0x3b94>
   15b2c:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   15b30:	2c ea       	ldi	r18, 0xAC	; 172
   15b32:	35 ec       	ldi	r19, 0xC5	; 197
   15b34:	47 e2       	ldi	r20, 0x27	; 39
   15b36:	5e e3       	ldi	r21, 0x3E	; 62
   15b38:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   15b3c:	60 93 df 0d 	sts	0x0DDF, r22	; 0x800ddf <cs+0x78>
   15b40:	70 93 e0 0d 	sts	0x0DE0, r23	; 0x800de0 <cs+0x79>
   15b44:	80 93 e1 0d 	sts	0x0DE1, r24	; 0x800de1 <cs+0x7a>
   15b48:	90 93 e2 0d 	sts	0x0DE2, r25	; 0x800de2 <cs+0x7b>
        if(code_seen('D')) cs.bedKd = scalePID_d(code_value());
   15b4c:	84 e4       	ldi	r24, 0x44	; 68
   15b4e:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   15b52:	88 23       	and	r24, r24
   15b54:	81 f0       	breq	.+32     	; 0x15b76 <process_commands() [clone .part.46]+0x3bbe>
   15b56:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
}

float unscalePID_i(float i)
{
	return i/PID_dT;
   15b5a:	2c ea       	ldi	r18, 0xAC	; 172
   15b5c:	35 ec       	ldi	r19, 0xC5	; 197
   15b5e:	47 e2       	ldi	r20, 0x27	; 39
   15b60:	5e e3       	ldi	r21, 0x3E	; 62
   15b62:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   15b66:	60 93 e3 0d 	sts	0x0DE3, r22	; 0x800de3 <cs+0x7c>
   15b6a:	70 93 e4 0d 	sts	0x0DE4, r23	; 0x800de4 <cs+0x7d>
   15b6e:	80 93 e5 0d 	sts	0x0DE5, r24	; 0x800de5 <cs+0x7e>
   15b72:	90 93 e6 0d 	sts	0x0DE6, r25	; 0x800de6 <cs+0x7f>

        updatePID();
   15b76:	0f 94 40 17 	call	0x22e80	; 0x22e80 <updatePID()>
       	SERIAL_PROTOCOLRPGM(MSG_OK);
   15b7a:	80 ef       	ldi	r24, 0xF0	; 240
   15b7c:	99 e6       	ldi	r25, 0x69	; 105
   15b7e:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        SERIAL_PROTOCOLPGM(" p:");
   15b82:	86 e6       	ldi	r24, 0x66	; 102
   15b84:	9f e7       	ldi	r25, 0x7F	; 127
   15b86:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   15b8a:	60 91 db 0d 	lds	r22, 0x0DDB	; 0x800ddb <cs+0x74>
   15b8e:	70 91 dc 0d 	lds	r23, 0x0DDC	; 0x800ddc <cs+0x75>
   15b92:	80 91 dd 0d 	lds	r24, 0x0DDD	; 0x800ddd <cs+0x76>
   15b96:	90 91 de 0d 	lds	r25, 0x0DDE	; 0x800dde <cs+0x77>
   15b9a:	42 e0       	ldi	r20, 0x02	; 2
   15b9c:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
        SERIAL_PROTOCOL(cs.bedKp);
        SERIAL_PROTOCOLPGM(" i:");
   15ba0:	82 e6       	ldi	r24, 0x62	; 98
   15ba2:	9f e7       	ldi	r25, 0x7F	; 127
   15ba4:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   15ba8:	2c ea       	ldi	r18, 0xAC	; 172
   15baa:	35 ec       	ldi	r19, 0xC5	; 197
   15bac:	47 e2       	ldi	r20, 0x27	; 39
   15bae:	5e e3       	ldi	r21, 0x3E	; 62
   15bb0:	60 91 df 0d 	lds	r22, 0x0DDF	; 0x800ddf <cs+0x78>
   15bb4:	70 91 e0 0d 	lds	r23, 0x0DE0	; 0x800de0 <cs+0x79>
   15bb8:	80 91 e1 0d 	lds	r24, 0x0DE1	; 0x800de1 <cs+0x7a>
   15bbc:	90 91 e2 0d 	lds	r25, 0x0DE2	; 0x800de2 <cs+0x7b>
   15bc0:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   15bc4:	42 e0       	ldi	r20, 0x02	; 2
   15bc6:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
        SERIAL_PROTOCOL(unscalePID_i(cs.bedKi));
        SERIAL_PROTOCOLPGM(" d:");
   15bca:	8e e5       	ldi	r24, 0x5E	; 94
   15bcc:	9f e7       	ldi	r25, 0x7F	; 127
   15bce:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
#ifdef PIDTEMP
// Apply the scale factors to the PID values

float scalePID_i(float i)
{
	return i*PID_dT;
   15bd2:	2c ea       	ldi	r18, 0xAC	; 172
   15bd4:	35 ec       	ldi	r19, 0xC5	; 197
   15bd6:	47 e2       	ldi	r20, 0x27	; 39
   15bd8:	5e e3       	ldi	r21, 0x3E	; 62
   15bda:	60 91 e3 0d 	lds	r22, 0x0DE3	; 0x800de3 <cs+0x7c>
   15bde:	70 91 e4 0d 	lds	r23, 0x0DE4	; 0x800de4 <cs+0x7d>
   15be2:	80 91 e5 0d 	lds	r24, 0x0DE5	; 0x800de5 <cs+0x7e>
   15be6:	90 91 e6 0d 	lds	r25, 0x0DE6	; 0x800de6 <cs+0x7f>
   15bea:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
        SERIAL_PROTOCOLLN(unscalePID_d(cs.bedKd));
   15bee:	0f 94 a2 65 	call	0x2cb44	; 0x2cb44 <MarlinSerial::println(double, int) [clone .constprop.354]>
   15bf2:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    - `S` - Cold extrude minimum temperature
    */
    case 302:
    {
	  int temp = 0;
	  if (code_seen('S')) temp=code_value_short();
   15bf6:	83 e5       	ldi	r24, 0x53	; 83
   15bf8:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   15bfc:	88 23       	and	r24, r24
   15bfe:	41 f0       	breq	.+16     	; 0x15c10 <process_commands() [clone .part.46]+0x3c58>
   15c00:	0e 94 17 56 	call	0xac2e	; 0xac2e <code_value_short() [clone .lto_priv.505]>
}

#ifdef PREVENT_DANGEROUS_EXTRUDE
void set_extrude_min_temp(int temp)
{
  extrude_min_temp = temp;
   15c04:	90 93 58 02 	sts	0x0258, r25	; 0x800258 <extrude_min_temp+0x1>
   15c08:	80 93 57 02 	sts	0x0257, r24	; 0x800257 <extrude_min_temp>
   15c0c:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    #### Parameters
    - `S` - Cold extrude minimum temperature
    */
    case 302:
    {
	  int temp = 0;
   15c10:	90 e0       	ldi	r25, 0x00	; 0
   15c12:	80 e0       	ldi	r24, 0x00	; 0
   15c14:	f7 cf       	rjmp	.-18     	; 0x15c04 <process_commands() [clone .part.46]+0x3c4c>
    */
    case 303:
    {
      float temp = 150.0;
      int e = 0;
      int c = 5;
   15c16:	85 e0       	ldi	r24, 0x05	; 5
   15c18:	90 e0       	ldi	r25, 0x00	; 0
   15c1a:	0c 94 19 a2 	jmp	0x14432	; 0x14432 <process_commands() [clone .part.46]+0x247a>
        M400

    */
    case 400:
    {
      st_synchronize();
   15c1e:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
   15c22:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>

    */

    case 405: // M405 Enable Filament Sensor
    {
        fsensor.setEnabled(1);
   15c26:	81 e0       	ldi	r24, 0x01	; 1
   15c28:	0e 94 90 77 	call	0xef20	; 0xef20 <Filament_sensor::setEnabled(bool)>
   15c2c:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>

    */

    case 406: // M406 Disable Filament Sensor
    {
        fsensor.setEnabled(0);
   15c30:	80 e0       	ldi	r24, 0x00	; 0
   15c32:	0e 94 90 77 	call	0xef20	; 0xef20 <Filament_sensor::setEnabled(bool)>
   15c36:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        M420

    */
    case 420: // M420 Mesh bed leveling status
    {
        gcode_G81_M420();
   15c3a:	0e 94 53 85 	call	0x10aa6	; 0x10aa6 <gcode_G81_M420()>
   15c3e:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        M500

    */
    case 500:
    {
        Config_StoreSettings();
   15c42:	0e 94 7f 87 	call	0x10efe	; 0x10efe <Config_StoreSettings()>
   15c46:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        M502

    */
    case 502:
    {
        Config_ResetDefault();
   15c4a:	0e 94 ee 86 	call	0x10ddc	; 0x10ddc <Config_ResetDefault()>
   15c4e:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
		echomagic, echomagic, cs.max_acceleration_mm_per_s2_silent[X_AXIS], cs.max_acceleration_mm_per_s2_silent[Y_AXIS], cs.max_acceleration_mm_per_s2_silent[Z_AXIS], cs.max_acceleration_mm_per_s2_silent[E_AXIS],
		echomagic, echomagic, cs.acceleration, cs.retract_acceleration, cs.travel_acceleration,
		echomagic, echomagic, cs.minimumfeedrate, cs.mintravelfeedrate, cs.min_segment_time_us, cs.max_jerk[X_AXIS], cs.max_jerk[Y_AXIS], cs.max_jerk[Z_AXIS], cs.max_jerk[E_AXIS],
		echomagic, echomagic, cs.add_homing[X_AXIS], cs.add_homing[Y_AXIS], cs.add_homing[Z_AXIS]
#else //TMC2130
	printf_P(PSTR(
   15c52:	80 91 ca 0d 	lds	r24, 0x0DCA	; 0x800dca <cs+0x63>
   15c56:	8f 93       	push	r24
   15c58:	80 91 c9 0d 	lds	r24, 0x0DC9	; 0x800dc9 <cs+0x62>
   15c5c:	8f 93       	push	r24
   15c5e:	80 91 c8 0d 	lds	r24, 0x0DC8	; 0x800dc8 <cs+0x61>
   15c62:	8f 93       	push	r24
   15c64:	80 91 c7 0d 	lds	r24, 0x0DC7	; 0x800dc7 <cs+0x60>
   15c68:	8f 93       	push	r24
   15c6a:	80 91 c6 0d 	lds	r24, 0x0DC6	; 0x800dc6 <cs+0x5f>
   15c6e:	8f 93       	push	r24
   15c70:	80 91 c5 0d 	lds	r24, 0x0DC5	; 0x800dc5 <cs+0x5e>
   15c74:	8f 93       	push	r24
   15c76:	80 91 c4 0d 	lds	r24, 0x0DC4	; 0x800dc4 <cs+0x5d>
   15c7a:	8f 93       	push	r24
   15c7c:	80 91 c3 0d 	lds	r24, 0x0DC3	; 0x800dc3 <cs+0x5c>
   15c80:	8f 93       	push	r24
   15c82:	80 91 c2 0d 	lds	r24, 0x0DC2	; 0x800dc2 <cs+0x5b>
   15c86:	8f 93       	push	r24
   15c88:	80 91 c1 0d 	lds	r24, 0x0DC1	; 0x800dc1 <cs+0x5a>
   15c8c:	8f 93       	push	r24
   15c8e:	80 91 c0 0d 	lds	r24, 0x0DC0	; 0x800dc0 <cs+0x59>
   15c92:	8f 93       	push	r24
   15c94:	80 91 bf 0d 	lds	r24, 0x0DBF	; 0x800dbf <cs+0x58>
   15c98:	8f 93       	push	r24
   15c9a:	0e ec       	ldi	r16, 0xCE	; 206
   15c9c:	11 ea       	ldi	r17, 0xA1	; 161
   15c9e:	1f 93       	push	r17
   15ca0:	0f 93       	push	r16
   15ca2:	1f 93       	push	r17
   15ca4:	0f 93       	push	r16
   15ca6:	80 91 be 0d 	lds	r24, 0x0DBE	; 0x800dbe <cs+0x57>
   15caa:	8f 93       	push	r24
   15cac:	80 91 bd 0d 	lds	r24, 0x0DBD	; 0x800dbd <cs+0x56>
   15cb0:	8f 93       	push	r24
   15cb2:	80 91 bc 0d 	lds	r24, 0x0DBC	; 0x800dbc <cs+0x55>
   15cb6:	8f 93       	push	r24
   15cb8:	80 91 bb 0d 	lds	r24, 0x0DBB	; 0x800dbb <cs+0x54>
   15cbc:	8f 93       	push	r24
   15cbe:	80 91 ba 0d 	lds	r24, 0x0DBA	; 0x800dba <cs+0x53>
   15cc2:	8f 93       	push	r24
   15cc4:	80 91 b9 0d 	lds	r24, 0x0DB9	; 0x800db9 <cs+0x52>
   15cc8:	8f 93       	push	r24
   15cca:	80 91 b8 0d 	lds	r24, 0x0DB8	; 0x800db8 <cs+0x51>
   15cce:	8f 93       	push	r24
   15cd0:	80 91 b7 0d 	lds	r24, 0x0DB7	; 0x800db7 <cs+0x50>
   15cd4:	8f 93       	push	r24
   15cd6:	80 91 b6 0d 	lds	r24, 0x0DB6	; 0x800db6 <cs+0x4f>
   15cda:	8f 93       	push	r24
   15cdc:	80 91 b5 0d 	lds	r24, 0x0DB5	; 0x800db5 <cs+0x4e>
   15ce0:	8f 93       	push	r24
   15ce2:	80 91 b4 0d 	lds	r24, 0x0DB4	; 0x800db4 <cs+0x4d>
   15ce6:	8f 93       	push	r24
   15ce8:	80 91 b3 0d 	lds	r24, 0x0DB3	; 0x800db3 <cs+0x4c>
   15cec:	8f 93       	push	r24
   15cee:	80 91 b2 0d 	lds	r24, 0x0DB2	; 0x800db2 <cs+0x4b>
   15cf2:	8f 93       	push	r24
   15cf4:	80 91 b1 0d 	lds	r24, 0x0DB1	; 0x800db1 <cs+0x4a>
   15cf8:	8f 93       	push	r24
   15cfa:	80 91 b0 0d 	lds	r24, 0x0DB0	; 0x800db0 <cs+0x49>
   15cfe:	8f 93       	push	r24
   15d00:	80 91 af 0d 	lds	r24, 0x0DAF	; 0x800daf <cs+0x48>
   15d04:	8f 93       	push	r24
   15d06:	80 91 ae 0d 	lds	r24, 0x0DAE	; 0x800dae <cs+0x47>
   15d0a:	8f 93       	push	r24
   15d0c:	80 91 ad 0d 	lds	r24, 0x0DAD	; 0x800dad <cs+0x46>
   15d10:	8f 93       	push	r24
   15d12:	80 91 ac 0d 	lds	r24, 0x0DAC	; 0x800dac <cs+0x45>
   15d16:	8f 93       	push	r24
   15d18:	80 91 ab 0d 	lds	r24, 0x0DAB	; 0x800dab <cs+0x44>
   15d1c:	8f 93       	push	r24
   15d1e:	80 91 aa 0d 	lds	r24, 0x0DAA	; 0x800daa <cs+0x43>
   15d22:	8f 93       	push	r24
   15d24:	80 91 a9 0d 	lds	r24, 0x0DA9	; 0x800da9 <cs+0x42>
   15d28:	8f 93       	push	r24
   15d2a:	80 91 a8 0d 	lds	r24, 0x0DA8	; 0x800da8 <cs+0x41>
   15d2e:	8f 93       	push	r24
   15d30:	80 91 a7 0d 	lds	r24, 0x0DA7	; 0x800da7 <cs+0x40>
   15d34:	8f 93       	push	r24
   15d36:	80 91 a6 0d 	lds	r24, 0x0DA6	; 0x800da6 <cs+0x3f>
   15d3a:	8f 93       	push	r24
   15d3c:	80 91 a5 0d 	lds	r24, 0x0DA5	; 0x800da5 <cs+0x3e>
   15d40:	8f 93       	push	r24
   15d42:	80 91 a4 0d 	lds	r24, 0x0DA4	; 0x800da4 <cs+0x3d>
   15d46:	8f 93       	push	r24
   15d48:	80 91 a3 0d 	lds	r24, 0x0DA3	; 0x800da3 <cs+0x3c>
   15d4c:	8f 93       	push	r24
   15d4e:	1f 93       	push	r17
   15d50:	0f 93       	push	r16
   15d52:	1f 93       	push	r17
   15d54:	0f 93       	push	r16
   15d56:	80 91 2a 0e 	lds	r24, 0x0E2A	; 0x800e2a <cs+0xc3>
   15d5a:	8f 93       	push	r24
   15d5c:	80 91 29 0e 	lds	r24, 0x0E29	; 0x800e29 <cs+0xc2>
   15d60:	8f 93       	push	r24
   15d62:	80 91 28 0e 	lds	r24, 0x0E28	; 0x800e28 <cs+0xc1>
   15d66:	8f 93       	push	r24
   15d68:	80 91 27 0e 	lds	r24, 0x0E27	; 0x800e27 <cs+0xc0>
   15d6c:	8f 93       	push	r24
   15d6e:	80 91 a2 0d 	lds	r24, 0x0DA2	; 0x800da2 <cs+0x3b>
   15d72:	8f 93       	push	r24
   15d74:	80 91 a1 0d 	lds	r24, 0x0DA1	; 0x800da1 <cs+0x3a>
   15d78:	8f 93       	push	r24
   15d7a:	80 91 a0 0d 	lds	r24, 0x0DA0	; 0x800da0 <cs+0x39>
   15d7e:	8f 93       	push	r24
   15d80:	80 91 9f 0d 	lds	r24, 0x0D9F	; 0x800d9f <cs+0x38>
   15d84:	8f 93       	push	r24
   15d86:	80 91 9e 0d 	lds	r24, 0x0D9E	; 0x800d9e <cs+0x37>
   15d8a:	8f 93       	push	r24
   15d8c:	80 91 9d 0d 	lds	r24, 0x0D9D	; 0x800d9d <cs+0x36>
   15d90:	8f 93       	push	r24
   15d92:	80 91 9c 0d 	lds	r24, 0x0D9C	; 0x800d9c <cs+0x35>
   15d96:	8f 93       	push	r24
   15d98:	80 91 9b 0d 	lds	r24, 0x0D9B	; 0x800d9b <cs+0x34>
   15d9c:	8f 93       	push	r24
   15d9e:	1f 93       	push	r17
   15da0:	0f 93       	push	r16
   15da2:	1f 93       	push	r17
   15da4:	0f 93       	push	r16
   15da6:	80 91 9a 0d 	lds	r24, 0x0D9A	; 0x800d9a <cs+0x33>
   15daa:	8f 93       	push	r24
   15dac:	80 91 99 0d 	lds	r24, 0x0D99	; 0x800d99 <cs+0x32>
   15db0:	8f 93       	push	r24
   15db2:	80 91 98 0d 	lds	r24, 0x0D98	; 0x800d98 <cs+0x31>
   15db6:	8f 93       	push	r24
   15db8:	80 91 97 0d 	lds	r24, 0x0D97	; 0x800d97 <cs+0x30>
   15dbc:	8f 93       	push	r24
   15dbe:	80 91 96 0d 	lds	r24, 0x0D96	; 0x800d96 <cs+0x2f>
   15dc2:	8f 93       	push	r24
   15dc4:	80 91 95 0d 	lds	r24, 0x0D95	; 0x800d95 <cs+0x2e>
   15dc8:	8f 93       	push	r24
   15dca:	80 91 94 0d 	lds	r24, 0x0D94	; 0x800d94 <cs+0x2d>
   15dce:	8f 93       	push	r24
   15dd0:	80 91 93 0d 	lds	r24, 0x0D93	; 0x800d93 <cs+0x2c>
   15dd4:	8f 93       	push	r24
   15dd6:	80 91 92 0d 	lds	r24, 0x0D92	; 0x800d92 <cs+0x2b>
   15dda:	8f 93       	push	r24
   15ddc:	80 91 91 0d 	lds	r24, 0x0D91	; 0x800d91 <cs+0x2a>
   15de0:	8f 93       	push	r24
   15de2:	80 91 90 0d 	lds	r24, 0x0D90	; 0x800d90 <cs+0x29>
   15de6:	8f 93       	push	r24
   15de8:	80 91 8f 0d 	lds	r24, 0x0D8F	; 0x800d8f <cs+0x28>
   15dec:	8f 93       	push	r24
   15dee:	80 91 8e 0d 	lds	r24, 0x0D8E	; 0x800d8e <cs+0x27>
   15df2:	8f 93       	push	r24
   15df4:	80 91 8d 0d 	lds	r24, 0x0D8D	; 0x800d8d <cs+0x26>
   15df8:	8f 93       	push	r24
   15dfa:	80 91 8c 0d 	lds	r24, 0x0D8C	; 0x800d8c <cs+0x25>
   15dfe:	8f 93       	push	r24
   15e00:	80 91 8b 0d 	lds	r24, 0x0D8B	; 0x800d8b <cs+0x24>
   15e04:	8f 93       	push	r24
   15e06:	1f 93       	push	r17
   15e08:	0f 93       	push	r16
   15e0a:	1f 93       	push	r17
   15e0c:	0f 93       	push	r16
   15e0e:	80 91 8a 0d 	lds	r24, 0x0D8A	; 0x800d8a <cs+0x23>
   15e12:	8f 93       	push	r24
   15e14:	80 91 89 0d 	lds	r24, 0x0D89	; 0x800d89 <cs+0x22>
   15e18:	8f 93       	push	r24
   15e1a:	80 91 88 0d 	lds	r24, 0x0D88	; 0x800d88 <cs+0x21>
   15e1e:	8f 93       	push	r24
   15e20:	80 91 87 0d 	lds	r24, 0x0D87	; 0x800d87 <cs+0x20>
   15e24:	8f 93       	push	r24
   15e26:	80 91 86 0d 	lds	r24, 0x0D86	; 0x800d86 <cs+0x1f>
   15e2a:	8f 93       	push	r24
   15e2c:	80 91 85 0d 	lds	r24, 0x0D85	; 0x800d85 <cs+0x1e>
   15e30:	8f 93       	push	r24
   15e32:	80 91 84 0d 	lds	r24, 0x0D84	; 0x800d84 <cs+0x1d>
   15e36:	8f 93       	push	r24
   15e38:	80 91 83 0d 	lds	r24, 0x0D83	; 0x800d83 <cs+0x1c>
   15e3c:	8f 93       	push	r24
   15e3e:	80 91 82 0d 	lds	r24, 0x0D82	; 0x800d82 <cs+0x1b>
   15e42:	8f 93       	push	r24
   15e44:	80 91 81 0d 	lds	r24, 0x0D81	; 0x800d81 <cs+0x1a>
   15e48:	8f 93       	push	r24
   15e4a:	80 91 80 0d 	lds	r24, 0x0D80	; 0x800d80 <cs+0x19>
   15e4e:	8f 93       	push	r24
   15e50:	80 91 7f 0d 	lds	r24, 0x0D7F	; 0x800d7f <cs+0x18>
   15e54:	8f 93       	push	r24
   15e56:	80 91 7e 0d 	lds	r24, 0x0D7E	; 0x800d7e <cs+0x17>
   15e5a:	8f 93       	push	r24
   15e5c:	80 91 7d 0d 	lds	r24, 0x0D7D	; 0x800d7d <cs+0x16>
   15e60:	8f 93       	push	r24
   15e62:	80 91 7c 0d 	lds	r24, 0x0D7C	; 0x800d7c <cs+0x15>
   15e66:	8f 93       	push	r24
   15e68:	80 91 7b 0d 	lds	r24, 0x0D7B	; 0x800d7b <cs+0x14>
   15e6c:	8f 93       	push	r24
   15e6e:	1f 93       	push	r17
   15e70:	0f 93       	push	r16
   15e72:	1f 93       	push	r17
   15e74:	0f 93       	push	r16
   15e76:	80 91 7a 0d 	lds	r24, 0x0D7A	; 0x800d7a <cs+0x13>
   15e7a:	8f 93       	push	r24
   15e7c:	80 91 79 0d 	lds	r24, 0x0D79	; 0x800d79 <cs+0x12>
   15e80:	8f 93       	push	r24
   15e82:	80 91 78 0d 	lds	r24, 0x0D78	; 0x800d78 <cs+0x11>
   15e86:	8f 93       	push	r24
   15e88:	80 91 77 0d 	lds	r24, 0x0D77	; 0x800d77 <cs+0x10>
   15e8c:	8f 93       	push	r24
   15e8e:	80 91 76 0d 	lds	r24, 0x0D76	; 0x800d76 <cs+0xf>
   15e92:	8f 93       	push	r24
   15e94:	80 91 75 0d 	lds	r24, 0x0D75	; 0x800d75 <cs+0xe>
   15e98:	8f 93       	push	r24
   15e9a:	80 91 74 0d 	lds	r24, 0x0D74	; 0x800d74 <cs+0xd>
   15e9e:	8f 93       	push	r24
   15ea0:	80 91 73 0d 	lds	r24, 0x0D73	; 0x800d73 <cs+0xc>
   15ea4:	8f 93       	push	r24
   15ea6:	80 91 72 0d 	lds	r24, 0x0D72	; 0x800d72 <cs+0xb>
   15eaa:	8f 93       	push	r24
   15eac:	80 91 71 0d 	lds	r24, 0x0D71	; 0x800d71 <cs+0xa>
   15eb0:	8f 93       	push	r24
   15eb2:	80 91 70 0d 	lds	r24, 0x0D70	; 0x800d70 <cs+0x9>
   15eb6:	8f 93       	push	r24
   15eb8:	80 91 6f 0d 	lds	r24, 0x0D6F	; 0x800d6f <cs+0x8>
   15ebc:	8f 93       	push	r24
   15ebe:	80 91 6e 0d 	lds	r24, 0x0D6E	; 0x800d6e <cs+0x7>
   15ec2:	8f 93       	push	r24
   15ec4:	80 91 6d 0d 	lds	r24, 0x0D6D	; 0x800d6d <cs+0x6>
   15ec8:	8f 93       	push	r24
   15eca:	80 91 6c 0d 	lds	r24, 0x0D6C	; 0x800d6c <cs+0x5>
   15ece:	8f 93       	push	r24
   15ed0:	80 91 6b 0d 	lds	r24, 0x0D6B	; 0x800d6b <cs+0x4>
   15ed4:	8f 93       	push	r24
   15ed6:	1f 93       	push	r17
   15ed8:	0f 93       	push	r16
   15eda:	1f 93       	push	r17
   15edc:	0f 93       	push	r16
   15ede:	81 ea       	ldi	r24, 0xA1	; 161
   15ee0:	9b e7       	ldi	r25, 0x7B	; 123
   15ee2:	9f 93       	push	r25
   15ee4:	8f 93       	push	r24
   15ee6:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
		echomagic, echomagic, cs.minimumfeedrate, cs.mintravelfeedrate, cs.min_segment_time_us, cs.max_jerk[X_AXIS], cs.max_jerk[Y_AXIS], cs.max_jerk[Z_AXIS], cs.max_jerk[E_AXIS],
		echomagic, echomagic, cs.add_homing[X_AXIS], cs.add_homing[Y_AXIS], cs.add_homing[Z_AXIS]
#endif //TMC2130
  );
#ifdef PIDTEMP
  printf_P(PSTR("%SPID settings:\n%S   M301 P%.2f I%.2f D%.2f\n"),
   15eea:	0f b6       	in	r0, 0x3f	; 63
   15eec:	f8 94       	cli
   15eee:	de bf       	out	0x3e, r29	; 62
   15ef0:	0f be       	out	0x3f, r0	; 63
   15ef2:	cd bf       	out	0x3d, r28	; 61
   15ef4:	2c ea       	ldi	r18, 0xAC	; 172
   15ef6:	35 ec       	ldi	r19, 0xC5	; 197
   15ef8:	47 e2       	ldi	r20, 0x27	; 39
   15efa:	5e e3       	ldi	r21, 0x3E	; 62
   15efc:	60 91 d7 0d 	lds	r22, 0x0DD7	; 0x800dd7 <cs+0x70>
   15f00:	70 91 d8 0d 	lds	r23, 0x0DD8	; 0x800dd8 <cs+0x71>
   15f04:	80 91 d9 0d 	lds	r24, 0x0DD9	; 0x800dd9 <cs+0x72>
   15f08:	90 91 da 0d 	lds	r25, 0x0DDA	; 0x800dda <cs+0x73>
   15f0c:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   15f10:	9f 93       	push	r25
   15f12:	8f 93       	push	r24
   15f14:	7f 93       	push	r23
   15f16:	6f 93       	push	r22
}

float unscalePID_i(float i)
{
	return i/PID_dT;
   15f18:	2c ea       	ldi	r18, 0xAC	; 172
   15f1a:	35 ec       	ldi	r19, 0xC5	; 197
   15f1c:	47 e2       	ldi	r20, 0x27	; 39
   15f1e:	5e e3       	ldi	r21, 0x3E	; 62
   15f20:	60 91 d3 0d 	lds	r22, 0x0DD3	; 0x800dd3 <cs+0x6c>
   15f24:	70 91 d4 0d 	lds	r23, 0x0DD4	; 0x800dd4 <cs+0x6d>
   15f28:	80 91 d5 0d 	lds	r24, 0x0DD5	; 0x800dd5 <cs+0x6e>
   15f2c:	90 91 d6 0d 	lds	r25, 0x0DD6	; 0x800dd6 <cs+0x6f>
   15f30:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   15f34:	9f 93       	push	r25
   15f36:	8f 93       	push	r24
   15f38:	7f 93       	push	r23
   15f3a:	6f 93       	push	r22
   15f3c:	80 91 d2 0d 	lds	r24, 0x0DD2	; 0x800dd2 <cs+0x6b>
   15f40:	8f 93       	push	r24
   15f42:	80 91 d1 0d 	lds	r24, 0x0DD1	; 0x800dd1 <cs+0x6a>
   15f46:	8f 93       	push	r24
   15f48:	80 91 d0 0d 	lds	r24, 0x0DD0	; 0x800dd0 <cs+0x69>
   15f4c:	8f 93       	push	r24
   15f4e:	80 91 cf 0d 	lds	r24, 0x0DCF	; 0x800dcf <cs+0x68>
   15f52:	8f 93       	push	r24
   15f54:	1f 93       	push	r17
   15f56:	0f 93       	push	r16
   15f58:	1f 93       	push	r17
   15f5a:	0f 93       	push	r16
   15f5c:	84 e7       	ldi	r24, 0x74	; 116
   15f5e:	9b e7       	ldi	r25, 0x7B	; 123
   15f60:	9f 93       	push	r25
   15f62:	8f 93       	push	r24
   15f64:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
#ifdef PIDTEMP
// Apply the scale factors to the PID values

float scalePID_i(float i)
{
	return i*PID_dT;
   15f68:	2c ea       	ldi	r18, 0xAC	; 172
   15f6a:	35 ec       	ldi	r19, 0xC5	; 197
   15f6c:	47 e2       	ldi	r20, 0x27	; 39
   15f6e:	5e e3       	ldi	r21, 0x3E	; 62
   15f70:	60 91 e3 0d 	lds	r22, 0x0DE3	; 0x800de3 <cs+0x7c>
   15f74:	70 91 e4 0d 	lds	r23, 0x0DE4	; 0x800de4 <cs+0x7d>
   15f78:	80 91 e5 0d 	lds	r24, 0x0DE5	; 0x800de5 <cs+0x7e>
   15f7c:	90 91 e6 0d 	lds	r25, 0x0DE6	; 0x800de6 <cs+0x7f>
   15f80:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    echomagic, echomagic, cs.Kp, unscalePID_i(cs.Ki), unscalePID_d(cs.Kd));
#endif
#ifdef PIDTEMPBED
  printf_P(PSTR("%SPID heatbed settings:\n%S   M304 P%.2f I%.2f D%.2f\n"),
   15f84:	9f 93       	push	r25
   15f86:	8f 93       	push	r24
   15f88:	7f 93       	push	r23
   15f8a:	6f 93       	push	r22
}

float unscalePID_i(float i)
{
	return i/PID_dT;
   15f8c:	2c ea       	ldi	r18, 0xAC	; 172
   15f8e:	35 ec       	ldi	r19, 0xC5	; 197
   15f90:	47 e2       	ldi	r20, 0x27	; 39
   15f92:	5e e3       	ldi	r21, 0x3E	; 62
   15f94:	60 91 df 0d 	lds	r22, 0x0DDF	; 0x800ddf <cs+0x78>
   15f98:	70 91 e0 0d 	lds	r23, 0x0DE0	; 0x800de0 <cs+0x79>
   15f9c:	80 91 e1 0d 	lds	r24, 0x0DE1	; 0x800de1 <cs+0x7a>
   15fa0:	90 91 e2 0d 	lds	r25, 0x0DE2	; 0x800de2 <cs+0x7b>
   15fa4:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   15fa8:	9f 93       	push	r25
   15faa:	8f 93       	push	r24
   15fac:	7f 93       	push	r23
   15fae:	6f 93       	push	r22
   15fb0:	80 91 de 0d 	lds	r24, 0x0DDE	; 0x800dde <cs+0x77>
   15fb4:	8f 93       	push	r24
   15fb6:	80 91 dd 0d 	lds	r24, 0x0DDD	; 0x800ddd <cs+0x76>
   15fba:	8f 93       	push	r24
   15fbc:	80 91 dc 0d 	lds	r24, 0x0DDC	; 0x800ddc <cs+0x75>
   15fc0:	8f 93       	push	r24
   15fc2:	80 91 db 0d 	lds	r24, 0x0DDB	; 0x800ddb <cs+0x74>
   15fc6:	8f 93       	push	r24
   15fc8:	1f 93       	push	r17
   15fca:	0f 93       	push	r16
   15fcc:	1f 93       	push	r17
   15fce:	0f 93       	push	r16
   15fd0:	8f e3       	ldi	r24, 0x3F	; 63
   15fd2:	9b e7       	ldi	r25, 0x7B	; 123
   15fd4:	9f 93       	push	r25
   15fd6:	8f 93       	push	r24
   15fd8:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
    echomagic, echomagic, cs.bedKp, unscalePID_i(cs.bedKi), unscalePID_d(cs.bedKd));
#endif
#ifdef FWRETRACT
  printf_P(PSTR(
   15fdc:	0f b6       	in	r0, 0x3f	; 63
   15fde:	f8 94       	cli
   15fe0:	de bf       	out	0x3e, r29	; 62
   15fe2:	0f be       	out	0x3f, r0	; 63
   15fe4:	cd bf       	out	0x3d, r28	; 61
   15fe6:	80 91 e9 0d 	lds	r24, 0x0DE9	; 0x800de9 <cs+0x82>
   15fea:	1f 92       	push	r1
   15fec:	8f 93       	push	r24
   15fee:	1f 93       	push	r17
   15ff0:	0f 93       	push	r16
   15ff2:	1f 93       	push	r17
   15ff4:	0f 93       	push	r16
   15ff6:	20 e0       	ldi	r18, 0x00	; 0
   15ff8:	30 e0       	ldi	r19, 0x00	; 0
   15ffa:	40 e7       	ldi	r20, 0x70	; 112
   15ffc:	52 e4       	ldi	r21, 0x42	; 66
   15ffe:	60 91 fa 0d 	lds	r22, 0x0DFA	; 0x800dfa <cs+0x93>
   16002:	70 91 fb 0d 	lds	r23, 0x0DFB	; 0x800dfb <cs+0x94>
   16006:	80 91 fc 0d 	lds	r24, 0x0DFC	; 0x800dfc <cs+0x95>
   1600a:	90 91 fd 0d 	lds	r25, 0x0DFD	; 0x800dfd <cs+0x96>
   1600e:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   16012:	9f 93       	push	r25
   16014:	8f 93       	push	r24
   16016:	7f 93       	push	r23
   16018:	6f 93       	push	r22
   1601a:	80 91 f9 0d 	lds	r24, 0x0DF9	; 0x800df9 <cs+0x92>
   1601e:	8f 93       	push	r24
   16020:	80 91 f8 0d 	lds	r24, 0x0DF8	; 0x800df8 <cs+0x91>
   16024:	8f 93       	push	r24
   16026:	80 91 f7 0d 	lds	r24, 0x0DF7	; 0x800df7 <cs+0x90>
   1602a:	8f 93       	push	r24
   1602c:	80 91 f6 0d 	lds	r24, 0x0DF6	; 0x800df6 <cs+0x8f>
   16030:	8f 93       	push	r24
   16032:	1f 93       	push	r17
   16034:	0f 93       	push	r16
   16036:	1f 93       	push	r17
   16038:	0f 93       	push	r16
   1603a:	80 91 f5 0d 	lds	r24, 0x0DF5	; 0x800df5 <cs+0x8e>
   1603e:	8f 93       	push	r24
   16040:	80 91 f4 0d 	lds	r24, 0x0DF4	; 0x800df4 <cs+0x8d>
   16044:	8f 93       	push	r24
   16046:	80 91 f3 0d 	lds	r24, 0x0DF3	; 0x800df3 <cs+0x8c>
   1604a:	8f 93       	push	r24
   1604c:	80 91 f2 0d 	lds	r24, 0x0DF2	; 0x800df2 <cs+0x8b>
   16050:	8f 93       	push	r24
   16052:	20 e0       	ldi	r18, 0x00	; 0
   16054:	30 e0       	ldi	r19, 0x00	; 0
   16056:	40 e7       	ldi	r20, 0x70	; 112
   16058:	52 e4       	ldi	r21, 0x42	; 66
   1605a:	60 91 ee 0d 	lds	r22, 0x0DEE	; 0x800dee <cs+0x87>
   1605e:	70 91 ef 0d 	lds	r23, 0x0DEF	; 0x800def <cs+0x88>
   16062:	80 91 f0 0d 	lds	r24, 0x0DF0	; 0x800df0 <cs+0x89>
   16066:	90 91 f1 0d 	lds	r25, 0x0DF1	; 0x800df1 <cs+0x8a>
   1606a:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   1606e:	9f 93       	push	r25
   16070:	8f 93       	push	r24
   16072:	7f 93       	push	r23
   16074:	6f 93       	push	r22
   16076:	80 91 ed 0d 	lds	r24, 0x0DED	; 0x800ded <cs+0x86>
   1607a:	8f 93       	push	r24
   1607c:	80 91 ec 0d 	lds	r24, 0x0DEC	; 0x800dec <cs+0x85>
   16080:	8f 93       	push	r24
   16082:	80 91 eb 0d 	lds	r24, 0x0DEB	; 0x800deb <cs+0x84>
   16086:	8f 93       	push	r24
   16088:	80 91 ea 0d 	lds	r24, 0x0DEA	; 0x800dea <cs+0x83>
   1608c:	8f 93       	push	r24
   1608e:	1f 93       	push	r17
   16090:	0f 93       	push	r16
   16092:	1f 93       	push	r17
   16094:	0f 93       	push	r16
   16096:	8e e3       	ldi	r24, 0x3E	; 62
   16098:	9a e7       	ldi	r25, 0x7A	; 122
   1609a:	9f 93       	push	r25
   1609c:	8f 93       	push	r24
   1609e:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
  );
#if EXTRUDERS > 1
  printf_P(PSTR("%SMulti-extruder settings:\n%S   Swap retract length (mm):    %.2f\n%S   Swap rec. addl. length (mm): %.2f\n"),
    echomagic, echomagic, retract_length_swap, echomagic, retract_recover_length_swap);
#endif
  if (cs.volumetric_enabled) {
   160a2:	0f b6       	in	r0, 0x3f	; 63
   160a4:	f8 94       	cli
   160a6:	de bf       	out	0x3e, r29	; 62
   160a8:	0f be       	out	0x3f, r0	; 63
   160aa:	cd bf       	out	0x3d, r28	; 61
   160ac:	80 91 fe 0d 	lds	r24, 0x0DFE	; 0x800dfe <cs+0x97>
   160b0:	88 23       	and	r24, r24
   160b2:	09 f4       	brne	.+2      	; 0x160b6 <process_commands() [clone .part.46]+0x40fe>
   160b4:	74 c0       	rjmp	.+232    	; 0x1619e <process_commands() [clone .part.46]+0x41e6>
    printf_P(PSTR("%SFilament settings:\n%S   M200 D%.2f\n"),
   160b6:	80 91 02 0e 	lds	r24, 0x0E02	; 0x800e02 <cs+0x9b>
   160ba:	8f 93       	push	r24
   160bc:	80 91 01 0e 	lds	r24, 0x0E01	; 0x800e01 <cs+0x9a>
   160c0:	8f 93       	push	r24
   160c2:	80 91 00 0e 	lds	r24, 0x0E00	; 0x800e00 <cs+0x99>
   160c6:	8f 93       	push	r24
   160c8:	80 91 ff 0d 	lds	r24, 0x0DFF	; 0x800dff <cs+0x98>
   160cc:	8f 93       	push	r24
   160ce:	1f 93       	push	r17
   160d0:	0f 93       	push	r16
   160d2:	1f 93       	push	r17
   160d4:	0f 93       	push	r16
   160d6:	88 e1       	ldi	r24, 0x18	; 24
   160d8:	9a e7       	ldi	r25, 0x7A	; 122
   160da:	9f 93       	push	r25
   160dc:	8f 93       	push	r24
   160de:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   160e2:	0f b6       	in	r0, 0x3f	; 63
   160e4:	f8 94       	cli
   160e6:	de bf       	out	0x3e, r29	; 62
   160e8:	0f be       	out	0x3f, r0	; 63
   160ea:	cd bf       	out	0x3d, r28	; 61
    printf_P(PSTR("%SLinear advance settings:%S   M900 K%.2f\n"),
                 echomagic, echomagic, extruder_advance_K);
#endif //LIN_ADVANCE
  }
    // Arc Interpolation Settings
    printf_P(PSTR(
   160ec:	80 91 37 0e 	lds	r24, 0x0E37	; 0x800e37 <cs+0xd0>
   160f0:	8f 93       	push	r24
   160f2:	80 91 36 0e 	lds	r24, 0x0E36	; 0x800e36 <cs+0xcf>
   160f6:	8f 93       	push	r24
   160f8:	80 91 35 0e 	lds	r24, 0x0E35	; 0x800e35 <cs+0xce>
   160fc:	8f 93       	push	r24
   160fe:	80 91 34 0e 	lds	r24, 0x0E34	; 0x800e34 <cs+0xcd>
   16102:	8f 93       	push	r24
   16104:	80 91 33 0e 	lds	r24, 0x0E33	; 0x800e33 <cs+0xcc>
   16108:	1f 92       	push	r1
   1610a:	8f 93       	push	r24
   1610c:	80 91 32 0e 	lds	r24, 0x0E32	; 0x800e32 <cs+0xcb>
   16110:	8f 93       	push	r24
   16112:	80 91 31 0e 	lds	r24, 0x0E31	; 0x800e31 <cs+0xca>
   16116:	8f 93       	push	r24
   16118:	80 91 30 0e 	lds	r24, 0x0E30	; 0x800e30 <cs+0xc9>
   1611c:	8f 93       	push	r24
   1611e:	80 91 2f 0e 	lds	r24, 0x0E2F	; 0x800e2f <cs+0xc8>
   16122:	8f 93       	push	r24
   16124:	80 91 2e 0e 	lds	r24, 0x0E2E	; 0x800e2e <cs+0xc7>
   16128:	8f 93       	push	r24
   1612a:	80 91 2d 0e 	lds	r24, 0x0E2D	; 0x800e2d <cs+0xc6>
   1612e:	8f 93       	push	r24
   16130:	80 91 2c 0e 	lds	r24, 0x0E2C	; 0x800e2c <cs+0xc5>
   16134:	8f 93       	push	r24
   16136:	80 91 2b 0e 	lds	r24, 0x0E2B	; 0x800e2b <cs+0xc4>
   1613a:	8f 93       	push	r24
   1613c:	0e ec       	ldi	r16, 0xCE	; 206
   1613e:	11 ea       	ldi	r17, 0xA1	; 161
   16140:	1f 93       	push	r17
   16142:	0f 93       	push	r16
   16144:	1f 93       	push	r17
   16146:	0f 93       	push	r16
   16148:	87 e7       	ldi	r24, 0x77	; 119
   1614a:	99 e7       	ldi	r25, 0x79	; 121
   1614c:	9f 93       	push	r25
   1614e:	8f 93       	push	r24
   16150:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
        "%SArc Settings: P:Max length(mm) S:Min length (mm) N:Corrections R:Min segments F:Segments/sec.\n%S  M214 P%.2f S%.2f N%d R%d F%d\n"),
        echomagic, echomagic, cs.mm_per_arc_segment, cs.min_mm_per_arc_segment, cs.n_arc_correction, cs.min_arc_segments, cs.arc_segments_per_sec);
#ifdef THERMAL_MODEL
    thermal_model_report_settings();
#endif
		printf_P(PSTR(
   16154:	8d ee       	ldi	r24, 0xED	; 237
   16156:	9f e0       	ldi	r25, 0x0F	; 15
   16158:	0f 94 e8 a3 	call	0x347d0	; 0x347d0 <eeprom_read_dword>
   1615c:	f6 2e       	mov	r15, r22
   1615e:	e7 2e       	mov	r14, r23
   16160:	d8 2e       	mov	r13, r24
   16162:	c9 2e       	mov	r12, r25
   16164:	81 ef       	ldi	r24, 0xF1	; 241
   16166:	9f e0       	ldi	r25, 0x0F	; 15
   16168:	0f 94 e8 a3 	call	0x347d0	; 0x347d0 <eeprom_read_dword>
   1616c:	cf 92       	push	r12
   1616e:	df 92       	push	r13
   16170:	ef 92       	push	r14
   16172:	ff 92       	push	r15
   16174:	9f 93       	push	r25
   16176:	8f 93       	push	r24
   16178:	7f 93       	push	r23
   1617a:	6f 93       	push	r22
   1617c:	1f 93       	push	r17
   1617e:	0f 93       	push	r16
   16180:	1f 93       	push	r17
   16182:	0f 93       	push	r16
   16184:	86 e5       	ldi	r24, 0x56	; 86
   16186:	99 e7       	ldi	r25, 0x79	; 121
   16188:	9f 93       	push	r25
   1618a:	8f 93       	push	r24
   1618c:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   16190:	0f b6       	in	r0, 0x3f	; 63
   16192:	f8 94       	cli
   16194:	de bf       	out	0x3e, r29	; 62
   16196:	0f be       	out	0x3f, r0	; 63
   16198:	cd bf       	out	0x3d, r28	; 61
   1619a:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    printf_P(PSTR("%S   M200 T1 D%.2f\n"),
      echomagic, echomagic, cs.filament_size[2]);
#endif
#endif
    } else {
        printf_P(PSTR("%SFilament settings: Disabled\n"), echomagic);
   1619e:	1f 93       	push	r17
   161a0:	0f 93       	push	r16
   161a2:	89 ef       	ldi	r24, 0xF9	; 249
   161a4:	99 e7       	ldi	r25, 0x79	; 121
   161a6:	9f 93       	push	r25
   161a8:	8f 93       	push	r24
   161aa:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   161ae:	0f 90       	pop	r0
   161b0:	0f 90       	pop	r0
   161b2:	0f 90       	pop	r0
   161b4:	0f 90       	pop	r0
   161b6:	9a cf       	rjmp	.-204    	; 0x160ec <process_commands() [clone .part.46]+0x4134>
    #### Parameters
        - `P` - The IP address in xxx.xxx.xxx.xxx format. Eg: P192.168.1.14
    */
    case 552:
    {
        if (code_seen('P'))
   161b8:	80 e5       	ldi	r24, 0x50	; 80
   161ba:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   161be:	88 23       	and	r24, r24
   161c0:	11 f4       	brne	.+4      	; 0x161c6 <process_commands() [clone .part.46]+0x420e>
   161c2:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        {
            uint8_t valCnt = 0;
            IP_address = 0;
   161c6:	10 92 10 06 	sts	0x0610, r1	; 0x800610 <IP_address>
   161ca:	10 92 11 06 	sts	0x0611, r1	; 0x800611 <IP_address+0x1>
   161ce:	10 92 12 06 	sts	0x0612, r1	; 0x800612 <IP_address+0x2>
   161d2:	10 92 13 06 	sts	0x0613, r1	; 0x800613 <IP_address+0x3>
   161d6:	00 e1       	ldi	r16, 0x10	; 16
   161d8:	16 e0       	ldi	r17, 0x06	; 6
   161da:	44 e1       	ldi	r20, 0x14	; 20
   161dc:	e4 2e       	mov	r14, r20
   161de:	46 e0       	ldi	r20, 0x06	; 6
   161e0:	f4 2e       	mov	r15, r20
            do
            {
                *strchr_pointer = '*';
   161e2:	5a e2       	ldi	r21, 0x2A	; 42
   161e4:	d5 2e       	mov	r13, r21
   161e6:	e0 91 bb 04 	lds	r30, 0x04BB	; 0x8004bb <strchr_pointer>
   161ea:	f0 91 bc 04 	lds	r31, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
   161ee:	d0 82       	st	Z, r13
                ((uint8_t*)&IP_address)[valCnt] = code_value_short();
   161f0:	0e 94 17 56 	call	0xac2e	; 0xac2e <code_value_short() [clone .lto_priv.505]>
   161f4:	d8 01       	movw	r26, r16
   161f6:	8d 93       	st	X+, r24
   161f8:	8d 01       	movw	r16, r26
                valCnt++;
            } while ((valCnt < 4) && code_seen('.'));
   161fa:	ea 16       	cp	r14, r26
   161fc:	fb 06       	cpc	r15, r27
   161fe:	11 f4       	brne	.+4      	; 0x16204 <process_commands() [clone .part.46]+0x424c>
   16200:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
   16204:	8e e2       	ldi	r24, 0x2E	; 46
   16206:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   1620a:	81 11       	cpse	r24, r1
   1620c:	ec cf       	rjmp	.-40     	; 0x161e6 <process_commands() [clone .part.46]+0x422e>

            if (valCnt != 4)
                IP_address = 0;
   1620e:	10 92 10 06 	sts	0x0610, r1	; 0x800610 <IP_address>
   16212:	10 92 11 06 	sts	0x0611, r1	; 0x800611 <IP_address+0x1>
   16216:	10 92 12 06 	sts	0x0612, r1	; 0x800612 <IP_address+0x2>
   1621a:	10 92 13 06 	sts	0x0613, r1	; 0x800613 <IP_address+0x3>
   1621e:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    - `C`    - filament name to show during loading
    - `AUTO` - Automatically (only with MMU)
    */
    case 600: //Pause for filament change X[pos] Y[pos] Z[relative lift] E[initial retract] L[later retract distance for removal] C"[filament name to show during loading]"
    {
    st_synchronize();
   16222:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
/// e.g. feedrate, Z-axis position etc.
/// This function should backup variables which may be lost
/// For example a power panic in M600 or during MMU error
void refresh_print_state_in_ram()
{
    if (saved_printing) return;
   16226:	80 91 73 12 	lds	r24, 0x1273	; 0x801273 <saved_printing>
   1622a:	81 11       	cpse	r24, r1
   1622c:	02 c0       	rjmp	.+4      	; 0x16232 <process_commands() [clone .part.46]+0x427a>
   1622e:	0e 94 a6 63 	call	0xc74c	; 0xc74c <refresh_print_state_in_ram() [clone .part.39]>
    float e_shift_init = FILAMENTCHANGE_FIRSTRETRACT;
    float e_shift_late = FILAMENTCHANGE_FINALRETRACT;
    bool automatic = false;

    //Retract extruder
    if (code_seen('E')) e_shift_init = code_value();
   16232:	85 e4       	ldi	r24, 0x45	; 69
   16234:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
    refresh_print_state_in_ram();

    float x_position = FILAMENTCHANGE_XPOS;
    float y_position = FILAMENTCHANGE_YPOS;
    float z_shift = MIN_Z_FOR_SWAP;
    float e_shift_init = FILAMENTCHANGE_FIRSTRETRACT;
   16238:	81 2c       	mov	r8, r1
   1623a:	91 2c       	mov	r9, r1
   1623c:	a1 2c       	mov	r10, r1
   1623e:	30 ec       	ldi	r19, 0xC0	; 192
   16240:	b3 2e       	mov	r11, r19
    float e_shift_late = FILAMENTCHANGE_FINALRETRACT;
    bool automatic = false;

    //Retract extruder
    if (code_seen('E')) e_shift_init = code_value();
   16242:	88 23       	and	r24, r24
   16244:	21 f0       	breq	.+8      	; 0x1624e <process_commands() [clone .part.46]+0x4296>
   16246:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   1624a:	4b 01       	movw	r8, r22
   1624c:	5c 01       	movw	r10, r24
    if (code_seen('L')) e_shift_late = code_value();
   1624e:	8c e4       	ldi	r24, 0x4C	; 76
   16250:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>

    float x_position = FILAMENTCHANGE_XPOS;
    float y_position = FILAMENTCHANGE_YPOS;
    float z_shift = MIN_Z_FOR_SWAP;
    float e_shift_init = FILAMENTCHANGE_FIRSTRETRACT;
    float e_shift_late = FILAMENTCHANGE_FINALRETRACT;
   16254:	c1 2c       	mov	r12, r1
   16256:	d1 2c       	mov	r13, r1
   16258:	76 01       	movw	r14, r12
    bool automatic = false;

    //Retract extruder
    if (code_seen('E')) e_shift_init = code_value();
    if (code_seen('L')) e_shift_late = code_value();
   1625a:	88 23       	and	r24, r24
   1625c:	21 f0       	breq	.+8      	; 0x16266 <process_commands() [clone .part.46]+0x42ae>
   1625e:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   16262:	6b 01       	movw	r12, r22
   16264:	7c 01       	movw	r14, r24

    // Z lift. For safety only allow positive values
    if (code_seen('Z')) z_shift = fabs(code_value());
   16266:	8a e5       	ldi	r24, 0x5A	; 90
   16268:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
    // take a partial back up of print state into RAM (current position, etc.)
    refresh_print_state_in_ram();

    float x_position = FILAMENTCHANGE_XPOS;
    float y_position = FILAMENTCHANGE_YPOS;
    float z_shift = MIN_Z_FOR_SWAP;
   1626c:	41 2c       	mov	r4, r1
   1626e:	51 2c       	mov	r5, r1
   16270:	28 ed       	ldi	r18, 0xD8	; 216
   16272:	62 2e       	mov	r6, r18
   16274:	21 e4       	ldi	r18, 0x41	; 65
   16276:	72 2e       	mov	r7, r18
    //Retract extruder
    if (code_seen('E')) e_shift_init = code_value();
    if (code_seen('L')) e_shift_late = code_value();

    // Z lift. For safety only allow positive values
    if (code_seen('Z')) z_shift = fabs(code_value());
   16278:	88 23       	and	r24, r24
   1627a:	31 f0       	breq	.+12     	; 0x16288 <process_commands() [clone .part.46]+0x42d0>
   1627c:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   16280:	2b 01       	movw	r4, r22
   16282:	3c 01       	movw	r6, r24
   16284:	e8 94       	clt
   16286:	77 f8       	bld	r7, 7

    //Move XY to side
    if (code_seen('X')) x_position = code_value();
   16288:	88 e5       	ldi	r24, 0x58	; 88
   1628a:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   1628e:	88 23       	and	r24, r24
   16290:	09 f4       	brne	.+2      	; 0x16294 <process_commands() [clone .part.46]+0x42dc>
   16292:	40 c1       	rjmp	.+640    	; 0x16514 <process_commands() [clone .part.46]+0x455c>
   16294:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   16298:	68 a7       	std	Y+40, r22	; 0x28
   1629a:	79 a7       	std	Y+41, r23	; 0x29
   1629c:	8a a7       	std	Y+42, r24	; 0x2a
   1629e:	9b a7       	std	Y+43, r25	; 0x2b
    if (code_seen('Y')) y_position = code_value();
   162a0:	89 e5       	ldi	r24, 0x59	; 89
   162a2:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   162a6:	88 23       	and	r24, r24
   162a8:	09 f4       	brne	.+2      	; 0x162ac <process_commands() [clone .part.46]+0x42f4>
   162aa:	3d c1       	rjmp	.+634    	; 0x16526 <process_commands() [clone .part.46]+0x456e>
   162ac:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   162b0:	6c a7       	std	Y+44, r22	; 0x2c
   162b2:	7d a7       	std	Y+45, r23	; 0x2d
   162b4:	8e a7       	std	Y+46, r24	; 0x2e
   162b6:	9f a7       	std	Y+47, r25	; 0x2f

    // Filament name to show during the loading
    char filament_name[LCD_WIDTH + 1] = "";
   162b8:	1a 82       	std	Y+2, r1	; 0x02
   162ba:	19 82       	std	Y+1, r1	; 0x01
   162bc:	fe 01       	movw	r30, r28
   162be:	33 96       	adiw	r30, 0x03	; 3
   162c0:	83 e1       	ldi	r24, 0x13	; 19
   162c2:	df 01       	movw	r26, r30
   162c4:	1d 92       	st	X+, r1
   162c6:	8a 95       	dec	r24
   162c8:	e9 f7       	brne	.-6      	; 0x162c4 <process_commands() [clone .part.46]+0x430c>
    if (code_seen('C')) {
   162ca:	83 e4       	ldi	r24, 0x43	; 67
   162cc:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   162d0:	88 23       	and	r24, r24
   162d2:	f9 f0       	breq	.+62     	; 0x16312 <process_commands() [clone .part.46]+0x435a>
    , found(false)
    {
        const char * pStrEnd = NULL;

        // Start of the string
        this->ptr = strchr(pStr, '"');
   162d4:	62 e2       	ldi	r22, 0x22	; 34
   162d6:	70 e0       	ldi	r23, 0x00	; 0
   162d8:	80 91 bb 04 	lds	r24, 0x04BB	; 0x8004bb <strchr_pointer>
   162dc:	90 91 bc 04 	lds	r25, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
   162e0:	0f 94 37 aa 	call	0x3546e	; 0x3546e <strchr>
   162e4:	8c 01       	movw	r16, r24
        if (!this->ptr) {
   162e6:	89 2b       	or	r24, r25
   162e8:	a1 f0       	breq	.+40     	; 0x16312 <process_commands() [clone .part.46]+0x435a>
            // First quote not found
            return;
        }

        // Skip the leading quote
        this->ptr++;
   162ea:	0f 5f       	subi	r16, 0xFF	; 255
   162ec:	1f 4f       	sbci	r17, 0xFF	; 255

        // End of the string
        pStrEnd = strchr(this->ptr, '"');
   162ee:	62 e2       	ldi	r22, 0x22	; 34
   162f0:	70 e0       	ldi	r23, 0x00	; 0
   162f2:	c8 01       	movw	r24, r16
   162f4:	0f 94 37 aa 	call	0x3546e	; 0x3546e <strchr>
        if(!pStrEnd) {
   162f8:	00 97       	sbiw	r24, 0x00	; 0
   162fa:	59 f0       	breq	.+22     	; 0x16312 <process_commands() [clone .part.46]+0x435a>
            // Second quote not found
            return;
        }
        this->len = pStrEnd - this->ptr;
   162fc:	80 1b       	sub	r24, r16
        unquoted_string str = unquoted_string(strchr_pointer);
        if (str.WasFound()) {
            const uint8_t len = min(str.GetLength(), LCD_WIDTH);
   162fe:	84 31       	cpi	r24, 0x14	; 20
   16300:	08 f0       	brcs	.+2      	; 0x16304 <process_commands() [clone .part.46]+0x434c>
   16302:	84 e1       	ldi	r24, 0x14	; 20
            memcpy(filament_name, str.GetUnquotedString(), len);
   16304:	48 2f       	mov	r20, r24
   16306:	50 e0       	ldi	r21, 0x00	; 0
   16308:	b8 01       	movw	r22, r16
   1630a:	ce 01       	movw	r24, r28
   1630c:	01 96       	adiw	r24, 0x01	; 1
   1630e:	0f 94 09 aa 	call	0x35412	; 0x35412 <memcpy>
        }
    }

    if (MMU2::mmu2.Enabled() && code_seen_P(PSTR("AUTO")))
   16312:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
    float x_position = FILAMENTCHANGE_XPOS;
    float y_position = FILAMENTCHANGE_YPOS;
    float z_shift = MIN_Z_FOR_SWAP;
    float e_shift_init = FILAMENTCHANGE_FIRSTRETRACT;
    float e_shift_late = FILAMENTCHANGE_FINALRETRACT;
    bool automatic = false;
   16316:	10 e0       	ldi	r17, 0x00	; 0
            const uint8_t len = min(str.GetLength(), LCD_WIDTH);
            memcpy(filament_name, str.GetUnquotedString(), len);
        }
    }

    if (MMU2::mmu2.Enabled() && code_seen_P(PSTR("AUTO")))
   16318:	81 30       	cpi	r24, 0x01	; 1
   1631a:	29 f4       	brne	.+10     	; 0x16326 <process_commands() [clone .part.46]+0x436e>
   1631c:	89 e4       	ldi	r24, 0x49	; 73
   1631e:	9f e7       	ldi	r25, 0x7F	; 127
   16320:	0f 94 62 3c 	call	0x278c4	; 0x278c4 <code_seen_P(char const*) [clone .lto_priv.409]>
   16324:	18 2f       	mov	r17, r24
    load_filament_final_feed(); // @@TODO verify
    st_synchronize();
}

static void gcode_M600(const bool automatic, const float x_position, const float y_position, const float z_shift, const float e_shift, const float e_shift_late, const char* filament_name) {
    st_synchronize();
   16326:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
    // When using an MMU, save the currently use slot number
    // so the firmware can know which slot to eject after the filament
    // is unloaded.
    uint8_t eject_slot = 0;

    prusa_statistics(22);
   1632a:	86 e1       	ldi	r24, 0x16	; 22
   1632c:	0f 94 79 32 	call	0x264f2	; 0x264f2 <prusa_statistics(unsigned char)>

    // Turn off the fan
    fanSpeed = 0;
   16330:	10 92 55 12 	sts	0x1255, r1	; 0x801255 <fanSpeed>

    // Retract E
    if (!printingIsPaused())
   16334:	0e 94 35 66 	call	0xcc6a	; 0xcc6a <printingIsPaused()>
   16338:	81 11       	cpse	r24, r1
   1633a:	fa c0       	rjmp	.+500    	; 0x16530 <process_commands() [clone .part.46]+0x4578>
    {
      current_position[E_AXIS] += e_shift;
   1633c:	a5 01       	movw	r20, r10
   1633e:	94 01       	movw	r18, r8
   16340:	60 91 6d 12 	lds	r22, 0x126D	; 0x80126d <current_position+0xc>
   16344:	70 91 6e 12 	lds	r23, 0x126E	; 0x80126e <current_position+0xd>
   16348:	80 91 6f 12 	lds	r24, 0x126F	; 0x80126f <current_position+0xe>
   1634c:	90 91 70 12 	lds	r25, 0x1270	; 0x801270 <current_position+0xf>
   16350:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   16354:	60 93 6d 12 	sts	0x126D, r22	; 0x80126d <current_position+0xc>
   16358:	70 93 6e 12 	sts	0x126E, r23	; 0x80126e <current_position+0xd>
   1635c:	80 93 6f 12 	sts	0x126F, r24	; 0x80126f <current_position+0xe>
   16360:	90 93 70 12 	sts	0x1270, r25	; 0x801270 <current_position+0xf>
      plan_buffer_line_curposXYZE(FILAMENTCHANGE_RFEED);
   16364:	60 e0       	ldi	r22, 0x00	; 0
   16366:	70 e0       	ldi	r23, 0x00	; 0
   16368:	88 ee       	ldi	r24, 0xE8	; 232
   1636a:	92 e4       	ldi	r25, 0x42	; 66
   1636c:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
      st_synchronize();
   16370:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
      SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_PAUSED);
   16374:	8b eb       	ldi	r24, 0xBB	; 187
   16376:	9a e6       	ldi	r25, 0x6A	; 106
   16378:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
        // Filament change can be issued via the Tune menu
        restore_extruder_temperature_from_ram();
    }

    // Raise the Z axis
    raise_z(z_shift);
   1637c:	c3 01       	movw	r24, r6
   1637e:	b2 01       	movw	r22, r4
   16380:	0e 94 94 6c 	call	0xd928	; 0xd928 <raise_z(float)>

    // Move XY to side
    current_position[X_AXIS] = x_position;
   16384:	28 a5       	ldd	r18, Y+40	; 0x28
   16386:	39 a5       	ldd	r19, Y+41	; 0x29
   16388:	4a a5       	ldd	r20, Y+42	; 0x2a
   1638a:	5b a5       	ldd	r21, Y+43	; 0x2b
   1638c:	20 93 61 12 	sts	0x1261, r18	; 0x801261 <current_position>
   16390:	30 93 62 12 	sts	0x1262, r19	; 0x801262 <current_position+0x1>
   16394:	40 93 63 12 	sts	0x1263, r20	; 0x801263 <current_position+0x2>
   16398:	50 93 64 12 	sts	0x1264, r21	; 0x801264 <current_position+0x3>
    current_position[Y_AXIS] = y_position;
   1639c:	8c a5       	ldd	r24, Y+44	; 0x2c
   1639e:	9d a5       	ldd	r25, Y+45	; 0x2d
   163a0:	ae a5       	ldd	r26, Y+46	; 0x2e
   163a2:	bf a5       	ldd	r27, Y+47	; 0x2f
   163a4:	80 93 65 12 	sts	0x1265, r24	; 0x801265 <current_position+0x4>
   163a8:	90 93 66 12 	sts	0x1266, r25	; 0x801266 <current_position+0x5>
   163ac:	a0 93 67 12 	sts	0x1267, r26	; 0x801267 <current_position+0x6>
   163b0:	b0 93 68 12 	sts	0x1268, r27	; 0x801268 <current_position+0x7>
    plan_buffer_line_curposXYZE(FILAMENTCHANGE_XYFEED);
   163b4:	60 e0       	ldi	r22, 0x00	; 0
   163b6:	70 e0       	ldi	r23, 0x00	; 0
   163b8:	88 e4       	ldi	r24, 0x48	; 72
   163ba:	92 e4       	ldi	r25, 0x42	; 66
   163bc:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
    st_synchronize();
   163c0:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>

    bool repeat = false;
   163c4:	18 a6       	std	Y+40, r1	; 0x28
    st_synchronize();

    // When using an MMU, save the currently use slot number
    // so the firmware can know which slot to eject after the filament
    // is unloaded.
    uint8_t eject_slot = 0;
   163c6:	b1 2c       	mov	r11, r1
#endif //PINDA_THERMISTOR

void lcd_wait_for_heater() {
		lcd_display_message_fullscreen_P(_T(MSG_WIZARD_HEATING));
		lcd_putc_at(0, 4, LCD_STR_THERMOMETER[0]);
		lcd_printf_P(PSTR("%3d/%3d"), (int16_t)degHotend(active_extruder), (int16_t) degTargetHotend(active_extruder));
   163c8:	02 e4       	ldi	r16, 0x42	; 66
   163ca:	20 2e       	mov	r2, r16
   163cc:	09 e7       	ldi	r16, 0x79	; 121
   163ce:	30 2e       	mov	r3, r16
				delay_keep_alive(4);

				if (lcd_clicked()) {
					setTargetHotend(saved_extruder_temperature);
					lcd_wait_for_heater();
					wait_for_user_state = 2;
   163d0:	82 e0       	ldi	r24, 0x02	; 2
   163d2:	a8 2e       	mov	r10, r24
					lcd_display_message_fullscreen_P(_T(MSG_PRESS_TO_UNLOAD));
					waiting_start_time = _millis();
					wait_for_user_state = 0;
				} else {
					lcd_set_cursor(1, 4);
					lcd_printf_P(PSTR("%3d"), (int16_t)degHotend(active_extruder));
   163d4:	9a e4       	ldi	r25, 0x4A	; 74
   163d6:	89 2e       	mov	r8, r25
   163d8:	99 e7       	ldi	r25, 0x79	; 121
   163da:	99 2e       	mov	r9, r25
    st_synchronize();

    bool repeat = false;
    do {
        // Unload filament
        if (MMU2::mmu2.Enabled()) {
   163dc:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   163e0:	81 30       	cpi	r24, 0x01	; 1
   163e2:	09 f0       	breq	.+2      	; 0x163e6 <process_commands() [clone .part.46]+0x442e>
   163e4:	a8 c0       	rjmp	.+336    	; 0x16536 <process_commands() [clone .part.46]+0x457e>
            eject_slot = MMU2::mmu2.get_current_tool();
   163e6:	0f 94 a7 65 	call	0x2cb4e	; 0x2cb4e <MMU2::MMU2::get_current_tool() const [clone .constprop.351]>
   163ea:	b8 2e       	mov	r11, r24
            mmu_M600_unload_filament();
   163ec:	0e 94 bc 76 	call	0xed78	; 0xed78 <mmu_M600_unload_filament()>
        } else {
            // Beep, manage nozzle heater and wait for user to start unload filament
            M600_wait_for_user();
            unload_filament(e_shift_late);
        }
        st_synchronize();          // finish moves
   163f0:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>

        FSensorBlockRunout fsBlockRunout;
   163f4:	0f 94 2b 79 	call	0x2f256	; 0x2f256 <FSensorBlockRunout::FSensorBlockRunout() [clone .constprop.136]>

        if (!MMU2::mmu2.Enabled())
   163f8:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   163fc:	81 30       	cpi	r24, 0x01	; 1
   163fe:	09 f4       	brne	.+2      	; 0x16402 <process_commands() [clone .part.46]+0x444a>
   16400:	64 c1       	rjmp	.+712    	; 0x166ca <process_commands() [clone .part.46]+0x4712>
        {
            KEEPALIVE_STATE(PAUSED_FOR_USER);
   16402:	84 e0       	ldi	r24, 0x04	; 4
   16404:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
            uint8_t choice =
                lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_UNLOAD_SUCCESSFUL), false, LCD_LEFT_BUTTON_CHOICE);
   16408:	8d ee       	ldi	r24, 0xED	; 237
   1640a:	98 e3       	ldi	r25, 0x38	; 56
   1640c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   16410:	40 e0       	ldi	r20, 0x00	; 0
   16412:	60 e0       	ldi	r22, 0x00	; 0
   16414:	0e 94 b2 e8 	call	0x1d164	; 0x1d164 <lcd_show_multiscreen_message_yes_no_and_wait_P(char const*, bool, unsigned char)>
   16418:	08 2f       	mov	r16, r24
            lcd_update_enable(false);
   1641a:	80 e0       	ldi	r24, 0x00	; 0
   1641c:	0e 94 38 70 	call	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>
            if (choice == LCD_MIDDLE_BUTTON_CHOICE) {
   16420:	01 30       	cpi	r16, 0x01	; 1
   16422:	29 f5       	brne	.+74     	; 0x1646e <process_commands() [clone .part.46]+0x44b6>
                lcd_clear();
   16424:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
                lcd_puts_at_P(0, 2, _T(MSG_PLEASE_WAIT));
   16428:	85 e6       	ldi	r24, 0x65	; 101
   1642a:	99 e3       	ldi	r25, 0x39	; 57
   1642c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   16430:	ac 01       	movw	r20, r24
   16432:	62 e0       	ldi	r22, 0x02	; 2
   16434:	80 e0       	ldi	r24, 0x00	; 0
   16436:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
                current_position[X_AXIS] = 100;
   1643a:	80 e0       	ldi	r24, 0x00	; 0
   1643c:	90 e0       	ldi	r25, 0x00	; 0
   1643e:	a8 ec       	ldi	r26, 0xC8	; 200
   16440:	b2 e4       	ldi	r27, 0x42	; 66
   16442:	80 93 61 12 	sts	0x1261, r24	; 0x801261 <current_position>
   16446:	90 93 62 12 	sts	0x1262, r25	; 0x801262 <current_position+0x1>
   1644a:	a0 93 63 12 	sts	0x1263, r26	; 0x801263 <current_position+0x2>
   1644e:	b0 93 64 12 	sts	0x1264, r27	; 0x801264 <current_position+0x3>
                plan_buffer_line_curposXYZE(FILAMENTCHANGE_XYFEED);
   16452:	60 e0       	ldi	r22, 0x00	; 0
   16454:	70 e0       	ldi	r23, 0x00	; 0
   16456:	88 e4       	ldi	r24, 0x48	; 72
   16458:	92 e4       	ldi	r25, 0x42	; 66
   1645a:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
                st_synchronize();
   1645e:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
                lcd_show_fullscreen_message_and_wait_P(_T(MSG_CHECK_IDLER));
   16462:	8b eb       	ldi	r24, 0xBB	; 187
   16464:	98 e3       	ldi	r25, 0x38	; 56
   16466:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1646a:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
     preheat_or_continue(FilamentAction::UnLoad);
}

void lcd_wait_interact(const char* filament_name) {

  lcd_clear();
   1646e:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>

  lcd_puts_at_P(0, 0, _T(MSG_INSERT_FILAMENT));
   16472:	89 e4       	ldi	r24, 0x49	; 73
   16474:	98 e3       	ldi	r25, 0x38	; 56
   16476:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1647a:	ac 01       	movw	r20, r24
   1647c:	60 e0       	ldi	r22, 0x00	; 0
   1647e:	80 e0       	ldi	r24, 0x00	; 0
   16480:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
  lcd_set_cursor(0, 1);
   16484:	61 e0       	ldi	r22, 0x01	; 1
   16486:	80 e0       	ldi	r24, 0x00	; 0
   16488:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
  if (filament_name[0]) {
   1648c:	89 81       	ldd	r24, Y+1	; 0x01
   1648e:	88 23       	and	r24, r24
   16490:	41 f0       	breq	.+16     	; 0x164a2 <process_commands() [clone .part.46]+0x44ea>
      lcd_print(filament_name);
   16492:	ce 01       	movw	r24, r28
   16494:	01 96       	adiw	r24, 0x01	; 1
   16496:	0e 94 5f 73 	call	0xe6be	; 0xe6be <lcd_print(char const*)>
      lcd_set_cursor(0, 2);
   1649a:	62 e0       	ldi	r22, 0x02	; 2
   1649c:	80 e0       	ldi	r24, 0x00	; 0
   1649e:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
  }
#ifdef FILAMENT_SENSOR
  if (!fsensor.getAutoLoadEnabled())
   164a2:	80 91 f2 16 	lds	r24, 0x16F2	; 0x8016f2 <fsensor+0x1>
   164a6:	81 11       	cpse	r24, r1
   164a8:	06 c0       	rjmp	.+12     	; 0x164b6 <process_commands() [clone .part.46]+0x44fe>
#endif //FILAMENT_SENSOR
  {
    lcd_puts_P(_T(MSG_PRESS));
   164aa:	84 e3       	ldi	r24, 0x34	; 52
   164ac:	98 e3       	ldi	r25, 0x38	; 56
   164ae:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   164b2:	0e 94 1d 6f 	call	0xde3a	; 0xde3a <lcd_puts_P(char const*)>

void M600_load_filament(const char* filament_name) {
	//load filament for single material and MMU
	lcd_wait_interact(filament_name);

	KEEPALIVE_STATE(PAUSED_FOR_USER);
   164b6:	84 e0       	ldi	r24, 0x04	; 4
   164b8:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>

	while(!lcd_clicked())
   164bc:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   164c0:	81 11       	cpse	r24, r1
   164c2:	10 c0       	rjmp	.+32     	; 0x164e4 <process_commands() [clone .part.46]+0x452c>
	{
		manage_heater();
   164c4:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
		manage_inactivity(true);
   164c8:	81 e0       	ldi	r24, 0x01	; 1
   164ca:	0e 94 34 8c 	call	0x11868	; 0x11868 <manage_inactivity(bool)>
#ifdef FILAMENT_SENSOR
		if (fsensor.getFilamentLoadEvent()) {
   164ce:	80 91 f5 16 	lds	r24, 0x16F5	; 0x8016f5 <fsensor+0x4>
   164d2:	88 23       	and	r24, r24
   164d4:	99 f3       	breq	.-26     	; 0x164bc <process_commands() [clone .part.46]+0x4504>
			Sound_MakeCustom(50,1000,false);
   164d6:	40 e0       	ldi	r20, 0x00	; 0
   164d8:	68 ee       	ldi	r22, 0xE8	; 232
   164da:	73 e0       	ldi	r23, 0x03	; 3
   164dc:	82 e3       	ldi	r24, 0x32	; 50
   164de:	90 e0       	ldi	r25, 0x00	; 0
   164e0:	0f 94 be 27 	call	0x24f7c	; 0x24f7c <Sound_MakeCustom(unsigned int, unsigned int, bool)>
			break;
		}
#endif //FILAMENT_SENSOR
	}
	KEEPALIVE_STATE(IN_HANDLER);
   164e4:	a0 92 78 02 	sts	0x0278, r10	; 0x800278 <busy_state>

	M600_load_filament_movements(filament_name);
   164e8:	ce 01       	movw	r24, r28
   164ea:	01 96       	adiw	r24, 0x01	; 1
   164ec:	0e 94 75 76 	call	0xecea	; 0xecea <M600_load_filament_movements(char const*)>

	Sound_MakeCustom(50,1000,false);
   164f0:	40 e0       	ldi	r20, 0x00	; 0
   164f2:	68 ee       	ldi	r22, 0xE8	; 232
   164f4:	73 e0       	ldi	r23, 0x03	; 3
   164f6:	82 e3       	ldi	r24, 0x32	; 50
   164f8:	90 e0       	ldi	r25, 0x00	; 0
   164fa:	0f 94 be 27 	call	0x24f7c	; 0x24f7c <Sound_MakeCustom(unsigned int, unsigned int, bool)>
bool M600_check_state_and_repeat(const char* filament_name)
{
    uint8_t lcd_change_filament_state = 10;
    while (lcd_change_filament_state != 0 && lcd_change_filament_state != 3)
    {
        KEEPALIVE_STATE(PAUSED_FOR_USER);
   164fe:	b4 e0       	ldi	r27, 0x04	; 4
   16500:	7b 2e       	mov	r7, r27
        else // MMU is enabled
        {
            if (!automatic) mmu_M600_filament_change_screen(eject_slot);
            mmu_M600_load_filament(automatic);
        }
        if (!automatic)
   16502:	11 23       	and	r17, r17
   16504:	09 f4       	brne	.+2      	; 0x16508 <process_commands() [clone .part.46]+0x4550>
   16506:	f6 c0       	rjmp	.+492    	; 0x166f4 <process_commands() [clone .part.46]+0x473c>
#endif //(FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
//    SERIAL_ECHOLNPGM("FSBlockRunout");
}

FSensorBlockRunout::~FSensorBlockRunout() {
    fsensor.settings_init(); // restore filament runout state.
   16508:	0f 94 95 6d 	call	0x2db2a	; 0x2db2a <PAT9125_sensor::settings_init() [clone .constprop.207]>
    current_position[Y_AXIS] = y_position;
    plan_buffer_line_curposXYZE(FILAMENTCHANGE_XYFEED);
    st_synchronize();

    bool repeat = false;
    do {
   1650c:	48 a5       	ldd	r20, Y+40	; 0x28
   1650e:	41 11       	cpse	r20, r1
   16510:	65 cf       	rjmp	.-310    	; 0x163dc <process_commands() [clone .part.46]+0x4424>
   16512:	99 c1       	rjmp	.+818    	; 0x16846 <process_commands() [clone .part.46]+0x488e>

    // In case a power panic happens while waiting for the user
    // take a partial back up of print state into RAM (current position, etc.)
    refresh_print_state_in_ram();

    float x_position = FILAMENTCHANGE_XPOS;
   16514:	20 e0       	ldi	r18, 0x00	; 0
   16516:	30 e0       	ldi	r19, 0x00	; 0
   16518:	43 e5       	ldi	r20, 0x53	; 83
   1651a:	53 e4       	ldi	r21, 0x43	; 67
   1651c:	28 a7       	std	Y+40, r18	; 0x28
   1651e:	39 a7       	std	Y+41, r19	; 0x29
   16520:	4a a7       	std	Y+42, r20	; 0x2a
   16522:	5b a7       	std	Y+43, r21	; 0x2b
   16524:	bd ce       	rjmp	.-646    	; 0x162a0 <process_commands() [clone .part.46]+0x42e8>
    float y_position = FILAMENTCHANGE_YPOS;
   16526:	1c a6       	std	Y+44, r1	; 0x2c
   16528:	1d a6       	std	Y+45, r1	; 0x2d
   1652a:	1e a6       	std	Y+46, r1	; 0x2e
   1652c:	1f a6       	std	Y+47, r1	; 0x2f
   1652e:	c4 ce       	rjmp	.-632    	; 0x162b8 <process_commands() [clone .part.46]+0x4300>
      st_synchronize();
      SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_PAUSED);
    } else {
        // Print is paused and the extruder may be cold
        // Filament change can be issued via the Tune menu
        restore_extruder_temperature_from_ram();
   16530:	0e 94 23 64 	call	0xc846	; 0xc846 <restore_extruder_temperature_from_ram()>
   16534:	23 cf       	rjmp	.-442    	; 0x1637c <process_commands() [clone .part.46]+0x43c4>
//!
//! Beep, manage nozzle heater and wait for user to start unload filament
//! If times out, active extruder temperature is set to 0.
void M600_wait_for_user() {

		KEEPALIVE_STATE(PAUSED_FOR_USER);
   16536:	84 e0       	ldi	r24, 0x04	; 4
   16538:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>

		unsigned long waiting_start_time = _millis();
   1653c:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   16540:	2b 01       	movw	r4, r22
   16542:	3c 01       	movw	r6, r24
		uint8_t wait_for_user_state = 0;
		lcd_display_message_fullscreen_P(_T(MSG_PRESS_TO_UNLOAD));
   16544:	89 e0       	ldi	r24, 0x09	; 9
   16546:	98 e3       	ldi	r25, 0x38	; 56
   16548:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1654c:	0e 94 a9 e0 	call	0x1c152	; 0x1c152 <lcd_display_message_fullscreen_P(char const*)>

		while (!(wait_for_user_state == 0 && lcd_clicked())){
   16550:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   16554:	08 2f       	mov	r16, r24
   16556:	81 11       	cpse	r24, r1
   16558:	34 c0       	rjmp	.+104    	; 0x165c2 <process_commands() [clone .part.46]+0x460a>

			switch (wait_for_user_state) {
			case 0: //nozzle is hot, waiting for user to press the knob to unload filament
				delay_keep_alive(4);

				if (_millis() > waiting_start_time + (unsigned long)M600_TIMEOUT * 1000) {
   1655a:	a3 01       	movw	r20, r6
   1655c:	92 01       	movw	r18, r4
   1655e:	20 54       	subi	r18, 0x40	; 64
   16560:	38 4d       	sbci	r19, 0xD8	; 216
   16562:	46 4f       	sbci	r20, 0xF6	; 246
   16564:	5f 4f       	sbci	r21, 0xFF	; 255
   16566:	2c a7       	std	Y+44, r18	; 0x2c
   16568:	3d a7       	std	Y+45, r19	; 0x2d
   1656a:	4e a7       	std	Y+46, r20	; 0x2e
   1656c:	5f a7       	std	Y+47, r21	; 0x2f
		unsigned long waiting_start_time = _millis();
		uint8_t wait_for_user_state = 0;
		lcd_display_message_fullscreen_P(_T(MSG_PRESS_TO_UNLOAD));

		while (!(wait_for_user_state == 0 && lcd_clicked())){
			manage_heater();
   1656e:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
			manage_inactivity(true);
   16572:	81 e0       	ldi	r24, 0x01	; 1
   16574:	0e 94 34 8c 	call	0x11868	; 0x11868 <manage_inactivity(bool)>
      if (wait_for_user_state != 2) sound_wait_for_user();
   16578:	02 30       	cpi	r16, 0x02	; 2
   1657a:	09 f4       	brne	.+2      	; 0x1657e <process_commands() [clone .part.46]+0x45c6>
   1657c:	65 c0       	rjmp	.+202    	; 0x16648 <process_commands() [clone .part.46]+0x4690>
   1657e:	0f 94 62 28 	call	0x250c4	; 0x250c4 <sound_wait_for_user()>
					st_synchronize();
					disable_e0();
				}
				break;
			case 1: //nozzle target temperature is set to zero, waiting for user to start nozzle preheat
				delay_keep_alive(4);
   16582:	84 e0       	ldi	r24, 0x04	; 4
   16584:	90 e0       	ldi	r25, 0x00	; 0
		while (!(wait_for_user_state == 0 && lcd_clicked())){
			manage_heater();
			manage_inactivity(true);
      if (wait_for_user_state != 2) sound_wait_for_user();

			switch (wait_for_user_state) {
   16586:	01 30       	cpi	r16, 0x01	; 1
   16588:	29 f1       	breq	.+74     	; 0x165d4 <process_commands() [clone .part.46]+0x461c>
			case 0: //nozzle is hot, waiting for user to press the knob to unload filament
				delay_keep_alive(4);
   1658a:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>

				if (_millis() > waiting_start_time + (unsigned long)M600_TIMEOUT * 1000) {
   1658e:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   16592:	2c a5       	ldd	r18, Y+44	; 0x2c
   16594:	3d a5       	ldd	r19, Y+45	; 0x2d
   16596:	4e a5       	ldd	r20, Y+46	; 0x2e
   16598:	5f a5       	ldd	r21, Y+47	; 0x2f
   1659a:	26 17       	cp	r18, r22
   1659c:	37 07       	cpc	r19, r23
   1659e:	48 07       	cpc	r20, r24
   165a0:	59 07       	cpc	r21, r25
   165a2:	b0 f6       	brcc	.-84     	; 0x16550 <process_commands() [clone .part.46]+0x4598>
					lcd_display_message_fullscreen_P(_T(MSG_PRESS_TO_PREHEAT));
   165a4:	88 ed       	ldi	r24, 0xD8	; 216
   165a6:	97 e3       	ldi	r25, 0x37	; 55
   165a8:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   165ac:	0e 94 a9 e0 	call	0x1c152	; 0x1c152 <lcd_display_message_fullscreen_P(char const*)>
  return target_temperature_bed;
};

// Doesn't save FLASH when FORCE_INLINE removed.
FORCE_INLINE void setTargetHotend(const float &celsius) {
  target_temperature[0] = celsius;
   165b0:	10 92 5e 12 	sts	0x125E, r1	; 0x80125e <target_temperature+0x1>
   165b4:	10 92 5d 12 	sts	0x125D, r1	; 0x80125d <target_temperature>
					wait_for_user_state = 1;
					setTargetHotend(0);
					st_synchronize();
   165b8:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
					disable_e0();
   165bc:	14 9a       	sbi	0x02, 4	; 2
			case 0: //nozzle is hot, waiting for user to press the knob to unload filament
				delay_keep_alive(4);

				if (_millis() > waiting_start_time + (unsigned long)M600_TIMEOUT * 1000) {
					lcd_display_message_fullscreen_P(_T(MSG_PRESS_TO_PREHEAT));
					wait_for_user_state = 1;
   165be:	01 e0       	ldi	r16, 0x01	; 1
   165c0:	d6 cf       	rjmp	.-84     	; 0x1656e <process_commands() [clone .part.46]+0x45b6>
   165c2:	10 92 be 04 	sts	0x04BE, r1	; 0x8004be <_ZL10beep_timer.lto_priv.499>

/// @brief Resets the global state of sound_wait_for_user()
void sound_wait_for_user_reset()
{
     beep_timer.stop();
     bFirst = false;
   165c6:	10 92 c1 04 	sts	0x04C1, r1	; 0x8004c1 <_ZL6bFirst.lto_priv.500>
            eject_slot = MMU2::mmu2.get_current_tool();
            mmu_M600_unload_filament();
        } else {
            // Beep, manage nozzle heater and wait for user to start unload filament
            M600_wait_for_user();
            unload_filament(e_shift_late);
   165ca:	c7 01       	movw	r24, r14
   165cc:	b6 01       	movw	r22, r12
   165ce:	0e 94 7e e3 	call	0x1c6fc	; 0x1c6fc <unload_filament(float)>
   165d2:	0e cf       	rjmp	.-484    	; 0x163f0 <process_commands() [clone .part.46]+0x4438>
					st_synchronize();
					disable_e0();
				}
				break;
			case 1: //nozzle target temperature is set to zero, waiting for user to start nozzle preheat
				delay_keep_alive(4);
   165d4:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>

				if (lcd_clicked()) {
   165d8:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   165dc:	88 23       	and	r24, r24
   165de:	39 f2       	breq	.-114    	; 0x1656e <process_commands() [clone .part.46]+0x45b6>
   165e0:	80 91 5b 12 	lds	r24, 0x125B	; 0x80125b <saved_extruder_temperature>
   165e4:	90 91 5c 12 	lds	r25, 0x125C	; 0x80125c <saved_extruder_temperature+0x1>
   165e8:	90 93 5e 12 	sts	0x125E, r25	; 0x80125e <target_temperature+0x1>
   165ec:	80 93 5d 12 	sts	0x125D, r24	; 0x80125d <target_temperature>
	return target_temp_reached;
}
#endif //PINDA_THERMISTOR

void lcd_wait_for_heater() {
		lcd_display_message_fullscreen_P(_T(MSG_WIZARD_HEATING));
   165f0:	89 e8       	ldi	r24, 0x89	; 137
   165f2:	9d e3       	ldi	r25, 0x3D	; 61
   165f4:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   165f8:	0e 94 a9 e0 	call	0x1c152	; 0x1c152 <lcd_display_message_fullscreen_P(char const*)>
		lcd_putc_at(0, 4, LCD_STR_THERMOMETER[0]);
   165fc:	42 e8       	ldi	r20, 0x82	; 130
   165fe:	64 e0       	ldi	r22, 0x04	; 4
   16600:	80 e0       	ldi	r24, 0x00	; 0
   16602:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
		lcd_printf_P(PSTR("%3d/%3d"), (int16_t)degHotend(active_extruder), (int16_t) degTargetHotend(active_extruder));
   16606:	80 91 5e 12 	lds	r24, 0x125E	; 0x80125e <target_temperature+0x1>
   1660a:	8f 93       	push	r24
   1660c:	80 91 5d 12 	lds	r24, 0x125D	; 0x80125d <target_temperature>
   16610:	8f 93       	push	r24
   16612:	60 91 5a 0d 	lds	r22, 0x0D5A	; 0x800d5a <current_temperature>
   16616:	70 91 5b 0d 	lds	r23, 0x0D5B	; 0x800d5b <current_temperature+0x1>
   1661a:	80 91 5c 0d 	lds	r24, 0x0D5C	; 0x800d5c <current_temperature+0x2>
   1661e:	90 91 5d 0d 	lds	r25, 0x0D5D	; 0x800d5d <current_temperature+0x3>
   16622:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   16626:	7f 93       	push	r23
   16628:	6f 93       	push	r22
   1662a:	3f 92       	push	r3
   1662c:	2f 92       	push	r2
   1662e:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
		lcd_putc(LCD_STR_DEGREE[0]);
   16632:	81 e8       	ldi	r24, 0x81	; 129
   16634:	0e 94 21 6f 	call	0xde42	; 0xde42 <lcd_putc(char)>
   16638:	0f 90       	pop	r0
   1663a:	0f 90       	pop	r0
   1663c:	0f 90       	pop	r0
   1663e:	0f 90       	pop	r0
   16640:	0f 90       	pop	r0
   16642:	0f 90       	pop	r0
					setTargetHotend(saved_extruder_temperature);
					lcd_wait_for_heater();
					wait_for_user_state = 2;
   16644:	02 e0       	ldi	r16, 0x02	; 2
   16646:	93 cf       	rjmp	.-218    	; 0x1656e <process_commands() [clone .part.46]+0x45b6>
  return current_temperature_bed;
};

// Doesn't save FLASH when FORCE_INLINE removed.
FORCE_INLINE float degTargetHotend(uint8_t extruder) {
  return target_temperature[extruder];
   16648:	60 91 5d 12 	lds	r22, 0x125D	; 0x80125d <target_temperature>
   1664c:	70 91 5e 12 	lds	r23, 0x125E	; 0x80125e <target_temperature+0x1>
   16650:	07 2e       	mov	r0, r23
   16652:	00 0c       	add	r0, r0
   16654:	88 0b       	sbc	r24, r24
   16656:	99 0b       	sbc	r25, r25
   16658:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
				}
				break;
			case 2: //waiting for nozzle to reach target temperature
				if (fabs(degTargetHotend(active_extruder) - degHotend(active_extruder)) < TEMP_HYSTERESIS) {
   1665c:	20 91 5a 0d 	lds	r18, 0x0D5A	; 0x800d5a <current_temperature>
   16660:	30 91 5b 0d 	lds	r19, 0x0D5B	; 0x800d5b <current_temperature+0x1>
   16664:	40 91 5c 0d 	lds	r20, 0x0D5C	; 0x800d5c <current_temperature+0x2>
   16668:	50 91 5d 0d 	lds	r21, 0x0D5D	; 0x800d5d <current_temperature+0x3>
   1666c:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   16670:	9f 77       	andi	r25, 0x7F	; 127
   16672:	20 e0       	ldi	r18, 0x00	; 0
   16674:	30 e0       	ldi	r19, 0x00	; 0
   16676:	40 ea       	ldi	r20, 0xA0	; 160
   16678:	50 e4       	ldi	r21, 0x40	; 64
   1667a:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   1667e:	87 ff       	sbrs	r24, 7
   16680:	0b c0       	rjmp	.+22     	; 0x16698 <process_commands() [clone .part.46]+0x46e0>
					lcd_display_message_fullscreen_P(_T(MSG_PRESS_TO_UNLOAD));
   16682:	89 e0       	ldi	r24, 0x09	; 9
   16684:	98 e3       	ldi	r25, 0x38	; 56
   16686:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1668a:	0e 94 a9 e0 	call	0x1c152	; 0x1c152 <lcd_display_message_fullscreen_P(char const*)>
					waiting_start_time = _millis();
   1668e:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   16692:	2b 01       	movw	r4, r22
   16694:	3c 01       	movw	r6, r24
   16696:	5c cf       	rjmp	.-328    	; 0x16550 <process_commands() [clone .part.46]+0x4598>
					wait_for_user_state = 0;
				} else {
					lcd_set_cursor(1, 4);
   16698:	64 e0       	ldi	r22, 0x04	; 4
   1669a:	81 e0       	ldi	r24, 0x01	; 1
   1669c:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
					lcd_printf_P(PSTR("%3d"), (int16_t)degHotend(active_extruder));
   166a0:	60 91 5a 0d 	lds	r22, 0x0D5A	; 0x800d5a <current_temperature>
   166a4:	70 91 5b 0d 	lds	r23, 0x0D5B	; 0x800d5b <current_temperature+0x1>
   166a8:	80 91 5c 0d 	lds	r24, 0x0D5C	; 0x800d5c <current_temperature+0x2>
   166ac:	90 91 5d 0d 	lds	r25, 0x0D5D	; 0x800d5d <current_temperature+0x3>
   166b0:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   166b4:	7f 93       	push	r23
   166b6:	6f 93       	push	r22
   166b8:	9f 92       	push	r9
   166ba:	8f 92       	push	r8
   166bc:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
   166c0:	0f 90       	pop	r0
   166c2:	0f 90       	pop	r0
   166c4:	0f 90       	pop	r0
   166c6:	0f 90       	pop	r0
   166c8:	52 cf       	rjmp	.-348    	; 0x1656e <process_commands() [clone .part.46]+0x45b6>
            }
            M600_load_filament(filament_name);
        }
        else // MMU is enabled
        {
            if (!automatic) mmu_M600_filament_change_screen(eject_slot);
   166ca:	11 11       	cpse	r17, r1
   166cc:	03 c0       	rjmp	.+6      	; 0x166d4 <process_commands() [clone .part.46]+0x471c>
   166ce:	8b 2d       	mov	r24, r11
   166d0:	0e 94 b1 8e 	call	0x11d62	; 0x11d62 <mmu_M600_filament_change_screen(unsigned char)>
            mmu_M600_load_filament(automatic);
   166d4:	81 2f       	mov	r24, r17
   166d6:	0e 94 82 7b 	call	0xf704	; 0xf704 <mmu_M600_load_filament(bool)>
   166da:	11 cf       	rjmp	.-478    	; 0x164fe <process_commands() [clone .part.46]+0x4546>
                    cursor_pos--;
                else
                    Sound_MakeSound(e_SOUND_TYPE_BlindAlert);
            } else if (lcd_encoder > 0) {
                // Rotating knob clockwise
                if (cursor_pos < 3)
   166dc:	03 30       	cpi	r16, 0x03	; 3
   166de:	10 f4       	brcc	.+4      	; 0x166e4 <process_commands() [clone .part.46]+0x472c>
                    cursor_pos++;
   166e0:	0f 5f       	subi	r16, 0xFF	; 255
   166e2:	49 c0       	rjmp	.+146    	; 0x16776 <process_commands() [clone .part.46]+0x47be>
                else
                    Sound_MakeSound(e_SOUND_TYPE_BlindAlert);
   166e4:	87 e0       	ldi	r24, 0x07	; 7
   166e6:	0f 94 ad 25 	call	0x24b5a	; 0x24b5a <Sound_MakeSound(eSOUND_TYPE)>
   166ea:	45 c0       	rjmp	.+138    	; 0x16776 <process_commands() [clone .part.46]+0x47be>
                mmu_M600_filament_change_screen(eject_slot);

                // After user clicks knob, MMU will load the filament
                mmu_M600_load_filament(false);
            } else {
                M600_load_filament_movements(filament_name);
   166ec:	ce 01       	movw	r24, r28
   166ee:	01 96       	adiw	r24, 0x01	; 1
   166f0:	0e 94 75 76 	call	0xecea	; 0xecea <M600_load_filament_movements(char const*)>
bool M600_check_state_and_repeat(const char* filament_name)
{
    uint8_t lcd_change_filament_state = 10;
    while (lcd_change_filament_state != 0 && lcd_change_filament_state != 3)
    {
        KEEPALIVE_STATE(PAUSED_FOR_USER);
   166f4:	70 92 78 02 	sts	0x0278, r7	; 0x800278 <busy_state>


uint8_t lcd_alright() {
    uint8_t cursor_pos = 0;

    lcd_clear();
   166f8:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
    lcd_puts_at_P(1, 0, _T(MSG_CORRECTLY));
   166fc:	85 e8       	ldi	r24, 0x85	; 133
   166fe:	98 e3       	ldi	r25, 0x38	; 56
   16700:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   16704:	ac 01       	movw	r20, r24
   16706:	60 e0       	ldi	r22, 0x00	; 0
   16708:	81 e0       	ldi	r24, 0x01	; 1
   1670a:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
    lcd_puts_at_P(1, 1, _T(MSG_NOT_LOADED));
   1670e:	8f e6       	ldi	r24, 0x6F	; 111
   16710:	98 e3       	ldi	r25, 0x38	; 56
   16712:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   16716:	ac 01       	movw	r20, r24
   16718:	61 e0       	ldi	r22, 0x01	; 1
   1671a:	81 e0       	ldi	r24, 0x01	; 1
   1671c:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
    lcd_puts_at_P(1, 2, _T(MSG_NOT_COLOR));
   16720:	8b e5       	ldi	r24, 0x5B	; 91
   16722:	98 e3       	ldi	r25, 0x38	; 56
   16724:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   16728:	ac 01       	movw	r20, r24
   1672a:	62 e0       	ldi	r22, 0x02	; 2
   1672c:	81 e0       	ldi	r24, 0x01	; 1
   1672e:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
    lcd_puts_at_P(1, 3, _T(MSG_UNLOAD_FILAMENT));
   16732:	82 e5       	ldi	r24, 0x52	; 82
   16734:	97 e4       	ldi	r25, 0x47	; 71
   16736:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1673a:	ac 01       	movw	r20, r24
   1673c:	63 e0       	ldi	r22, 0x03	; 3
   1673e:	81 e0       	ldi	r24, 0x01	; 1
   16740:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
    lcd_putc_at(0, cursor_pos, '>');
   16744:	4e e3       	ldi	r20, 0x3E	; 62
   16746:	60 e0       	ldi	r22, 0x00	; 0
   16748:	80 e0       	ldi	r24, 0x00	; 0
   1674a:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>

    lcd_consume_click();
   1674e:	0e 94 70 73 	call	0xe6e0	; 0xe6e0 <lcd_consume_click()>




uint8_t lcd_alright() {
    uint8_t cursor_pos = 0;
   16752:	00 e0       	ldi	r16, 0x00	; 0
    lcd_putc_at(0, cursor_pos, '>');

    lcd_consume_click();
    while (1)
    {
        manage_heater();
   16754:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
        manage_inactivity(true);
   16758:	81 e0       	ldi	r24, 0x01	; 1
   1675a:	0e 94 34 8c 	call	0x11868	; 0x11868 <manage_inactivity(bool)>

        if (lcd_encoder)
   1675e:	80 91 1e 06 	lds	r24, 0x061E	; 0x80061e <lcd_encoder>
   16762:	90 91 1f 06 	lds	r25, 0x061F	; 0x80061f <lcd_encoder+0x1>
   16766:	00 97       	sbiw	r24, 0x00	; 0
   16768:	d9 f0       	breq	.+54     	; 0x167a0 <process_commands() [clone .part.46]+0x47e8>
        {

            if (lcd_encoder < 0 ) {
   1676a:	97 ff       	sbrs	r25, 7
   1676c:	b7 cf       	rjmp	.-146    	; 0x166dc <process_commands() [clone .part.46]+0x4724>
                // Rotating knob counter clockwise
                if (cursor_pos > 0)
   1676e:	00 23       	and	r16, r16
   16770:	09 f4       	brne	.+2      	; 0x16774 <process_commands() [clone .part.46]+0x47bc>
   16772:	b8 cf       	rjmp	.-144    	; 0x166e4 <process_commands() [clone .part.46]+0x472c>
                    cursor_pos--;
   16774:	01 50       	subi	r16, 0x01	; 1
                else
                    Sound_MakeSound(e_SOUND_TYPE_BlindAlert);
            }

            // Update '>' render only
            lcd_puts_at_P(0, 0, PSTR(" \n \n \n "));
   16776:	4e e4       	ldi	r20, 0x4E	; 78
   16778:	59 e7       	ldi	r21, 0x79	; 121
   1677a:	60 e0       	ldi	r22, 0x00	; 0
   1677c:	80 e0       	ldi	r24, 0x00	; 0
   1677e:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
            lcd_putc_at(0, cursor_pos, '>');
   16782:	4e e3       	ldi	r20, 0x3E	; 62
   16784:	60 2f       	mov	r22, r16
   16786:	80 e0       	ldi	r24, 0x00	; 0
   16788:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>

            // Consume rotation event and make feedback sound
            lcd_encoder = 0;
   1678c:	10 92 1f 06 	sts	0x061F, r1	; 0x80061f <lcd_encoder+0x1>
   16790:	10 92 1e 06 	sts	0x061E, r1	; 0x80061e <lcd_encoder>
            _delay(100);
   16794:	64 e6       	ldi	r22, 0x64	; 100
   16796:	70 e0       	ldi	r23, 0x00	; 0
   16798:	80 e0       	ldi	r24, 0x00	; 0
   1679a:	90 e0       	ldi	r25, 0x00	; 0
   1679c:	0f 94 bd 0d 	call	0x21b7a	; 0x21b7a <delay2>
        }

        if (lcd_clicked())
   167a0:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   167a4:	88 23       	and	r24, r24
   167a6:	b1 f2       	breq	.-84     	; 0x16754 <process_commands() [clone .part.46]+0x479c>
        {
            lcd_clear();
   167a8:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
            lcd_return_to_status();
   167ac:	0f 94 d5 07 	call	0x20faa	; 0x20faa <lcd_return_to_status()>
        lcd_change_filament_state = lcd_alright();
        KEEPALIVE_STATE(IN_HANDLER);
   167b0:	a0 92 78 02 	sts	0x0278, r10	; 0x800278 <busy_state>
        switch(lcd_change_filament_state)
   167b4:	02 30       	cpi	r16, 0x02	; 2
   167b6:	b1 f0       	breq	.+44     	; 0x167e4 <process_commands() [clone .part.46]+0x482c>
   167b8:	03 30       	cpi	r16, 0x03	; 3
   167ba:	09 f4       	brne	.+2      	; 0x167be <process_commands() [clone .part.46]+0x4806>
   167bc:	f6 c0       	rjmp	.+492    	; 0x169aa <process_commands() [clone .part.46]+0x49f2>
   167be:	01 30       	cpi	r16, 0x01	; 1
   167c0:	81 f5       	brne	.+96     	; 0x16822 <process_commands() [clone .part.46]+0x486a>
        {
        // Filament failed to load so load it again
        case 1:
            if (MMU2::mmu2.Enabled()) {
   167c2:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   167c6:	81 30       	cpi	r24, 0x01	; 1
   167c8:	09 f0       	breq	.+2      	; 0x167cc <process_commands() [clone .part.46]+0x4814>
   167ca:	90 cf       	rjmp	.-224    	; 0x166ec <process_commands() [clone .part.46]+0x4734>
                uint8_t eject_slot = MMU2::mmu2.get_current_tool();
   167cc:	0f 94 a7 65 	call	0x2cb4e	; 0x2cb4e <MMU2::MMU2::get_current_tool() const [clone .constprop.351]>
   167d0:	08 2f       	mov	r16, r24

                // Unload filament
                mmu_M600_unload_filament();
   167d2:	0e 94 bc 76 	call	0xed78	; 0xed78 <mmu_M600_unload_filament()>

                // Ask to remove any old filament and load new
                mmu_M600_filament_change_screen(eject_slot);
   167d6:	80 2f       	mov	r24, r16
   167d8:	0e 94 b1 8e 	call	0x11d62	; 0x11d62 <mmu_M600_filament_change_screen(unsigned char)>

                // After user clicks knob, MMU will load the filament
                mmu_M600_load_filament(false);
   167dc:	80 e0       	ldi	r24, 0x00	; 0
   167de:	0e 94 82 7b 	call	0xf704	; 0xf704 <mmu_M600_load_filament(bool)>
   167e2:	88 cf       	rjmp	.-240    	; 0x166f4 <process_commands() [clone .part.46]+0x473c>
            }
            break;

        // Filament loaded properly but color is not clear
        case 2:
            st_synchronize();
   167e4:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
            load_filament_final_feed();
   167e8:	0e 94 ed 63 	call	0xc7da	; 0xc7da <load_filament_final_feed()>


void lcd_loading_color() {
	//we are extruding 25mm with feedrate 200mm/min -> 7.5 seconds for whole action, 0.375 s for one character

  lcd_clear();
   167ec:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>

  lcd_puts_at_P(0, 0, _T(MSG_LOADING_COLOR));
   167f0:	89 e9       	ldi	r24, 0x99	; 153
   167f2:	98 e3       	ldi	r25, 0x38	; 56
   167f4:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   167f8:	ac 01       	movw	r20, r24
   167fa:	60 e0       	ldi	r22, 0x00	; 0
   167fc:	80 e0       	ldi	r24, 0x00	; 0
   167fe:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
  lcd_puts_at_P(0, 2, _T(MSG_PLEASE_WAIT));
   16802:	85 e6       	ldi	r24, 0x65	; 101
   16804:	99 e3       	ldi	r25, 0x39	; 57
   16806:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1680a:	ac 01       	movw	r20, r24
   1680c:	62 e0       	ldi	r22, 0x02	; 2
   1680e:	80 e0       	ldi	r24, 0x00	; 0
   16810:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
  lcd_loading_progress_bar((FILAMENTCHANGE_FINALFEED * 1000ul) / FILAMENTCHANGE_EFEED_FINAL); //show progress bar during filament loading slow sequence
   16814:	87 e9       	ldi	r24, 0x97	; 151
   16816:	9d e1       	ldi	r25, 0x1D	; 29
   16818:	0f 94 b2 0b 	call	0x21764	; 0x21764 <lcd_loading_progress_bar(unsigned int) [clone .lto_priv.520]>
            lcd_loading_color();
            st_synchronize();
   1681c:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
   16820:	69 cf       	rjmp	.-302    	; 0x166f4 <process_commands() [clone .part.46]+0x473c>
}


void lcd_change_success() {

  lcd_clear();
   16822:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>

  lcd_puts_at_P(0, 2, _T(MSG_CHANGE_SUCCESS));
   16826:	89 ea       	ldi	r24, 0xA9	; 169
   16828:	98 e3       	ldi	r25, 0x38	; 56
   1682a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1682e:	ac 01       	movw	r20, r24
   16830:	62 e0       	ldi	r22, 0x02	; 2
   16832:	80 e0       	ldi	r24, 0x00	; 0
   16834:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>

//! @brief Wait for user to check the state
bool M600_check_state_and_repeat(const char* filament_name)
{
    uint8_t lcd_change_filament_state = 10;
    while (lcd_change_filament_state != 0 && lcd_change_filament_state != 3)
   16838:	00 23       	and	r16, r16
   1683a:	19 f0       	breq	.+6      	; 0x16842 <process_commands() [clone .part.46]+0x488a>
   1683c:	03 30       	cpi	r16, 0x03	; 3
   1683e:	09 f0       	breq	.+2      	; 0x16842 <process_commands() [clone .part.46]+0x488a>
   16840:	59 cf       	rjmp	.-334    	; 0x166f4 <process_commands() [clone .part.46]+0x473c>
   16842:	0f 94 95 6d 	call	0x2db2a	; 0x2db2a <PAT9125_sensor::settings_init() [clone .constprop.207]>
        if (!automatic)
            repeat = M600_check_state_and_repeat(filament_name);
    }
    while (repeat);

    lcd_update_enable(true);
   16846:	81 e0       	ldi	r24, 0x01	; 1
   16848:	0e 94 38 70 	call	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>

    // Not let's go back to print
    fanSpeed = saved_fan_speed;
   1684c:	80 91 54 12 	lds	r24, 0x1254	; 0x801254 <saved_fan_speed>
   16850:	80 93 55 12 	sts	0x1255, r24	; 0x801255 <fanSpeed>

    // Feed a little of filament to stabilize pressure
    if (!automatic) {
   16854:	11 11       	cpse	r17, r1
   16856:	27 c0       	rjmp	.+78     	; 0x168a6 <process_commands() [clone .part.46]+0x48ee>
        if (printingIsPaused())
   16858:	0e 94 35 66 	call	0xcc6a	; 0xcc6a <printingIsPaused()>
   1685c:	c0 90 6d 12 	lds	r12, 0x126D	; 0x80126d <current_position+0xc>
   16860:	d0 90 6e 12 	lds	r13, 0x126E	; 0x80126e <current_position+0xd>
   16864:	e0 90 6f 12 	lds	r14, 0x126F	; 0x80126f <current_position+0xe>
   16868:	f0 90 70 12 	lds	r15, 0x1270	; 0x801270 <current_position+0xf>
   1686c:	88 23       	and	r24, r24
   1686e:	09 f4       	brne	.+2      	; 0x16872 <process_commands() [clone .part.46]+0x48ba>
   16870:	9f c0       	rjmp	.+318    	; 0x169b0 <process_commands() [clone .part.46]+0x49f8>
        {
            // Return to retracted state during a pause
            // @todo is retraction really needed? E-position is reverted a few lines below
            current_position[E_AXIS] -= default_retraction;
   16872:	20 e0       	ldi	r18, 0x00	; 0
   16874:	30 e0       	ldi	r19, 0x00	; 0
   16876:	40 e8       	ldi	r20, 0x80	; 128
   16878:	5f e3       	ldi	r21, 0x3F	; 63
   1687a:	c7 01       	movw	r24, r14
   1687c:	b6 01       	movw	r22, r12
   1687e:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   16882:	60 93 6d 12 	sts	0x126D, r22	; 0x80126d <current_position+0xc>
   16886:	70 93 6e 12 	sts	0x126E, r23	; 0x80126e <current_position+0xd>
   1688a:	80 93 6f 12 	sts	0x126F, r24	; 0x80126f <current_position+0xe>
   1688e:	90 93 70 12 	sts	0x1270, r25	; 0x801270 <current_position+0xf>
            plan_buffer_line_curposXYZE(FILAMENTCHANGE_RFEED);
   16892:	60 e0       	ldi	r22, 0x00	; 0
   16894:	70 e0       	ldi	r23, 0x00	; 0
   16896:	88 ee       	ldi	r24, 0xE8	; 232
   16898:	92 e4       	ldi	r25, 0x42	; 66
   1689a:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
  return target_temperature_bed;
};

// Doesn't save FLASH when FORCE_INLINE removed.
FORCE_INLINE void setTargetHotend(const float &celsius) {
  target_temperature[0] = celsius;
   1689e:	10 92 5e 12 	sts	0x125E, r1	; 0x80125e <target_temperature+0x1>
   168a2:	10 92 5d 12 	sts	0x125D, r1	; 0x80125d <target_temperature>
            plan_buffer_line_curposXYZE(FILAMENTCHANGE_EXFEED);
        }
    }

    // Move XY back
    plan_buffer_line(saved_pos[X_AXIS], saved_pos[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], FILAMENTCHANGE_XYFEED);
   168a6:	e0 90 69 12 	lds	r14, 0x1269	; 0x801269 <current_position+0x8>
   168aa:	f0 90 6a 12 	lds	r15, 0x126A	; 0x80126a <current_position+0x9>
   168ae:	00 91 6b 12 	lds	r16, 0x126B	; 0x80126b <current_position+0xa>
   168b2:	10 91 6c 12 	lds	r17, 0x126C	; 0x80126c <current_position+0xb>
   168b6:	20 91 94 02 	lds	r18, 0x0294	; 0x800294 <saved_pos+0x4>
   168ba:	30 91 95 02 	lds	r19, 0x0295	; 0x800295 <saved_pos+0x5>
   168be:	40 91 96 02 	lds	r20, 0x0296	; 0x800296 <saved_pos+0x6>
   168c2:	50 91 97 02 	lds	r21, 0x0297	; 0x800297 <saved_pos+0x7>
   168c6:	60 91 90 02 	lds	r22, 0x0290	; 0x800290 <saved_pos>
   168ca:	70 91 91 02 	lds	r23, 0x0291	; 0x800291 <saved_pos+0x1>
   168ce:	80 91 92 02 	lds	r24, 0x0292	; 0x800292 <saved_pos+0x2>
   168d2:	90 91 93 02 	lds	r25, 0x0293	; 0x800293 <saved_pos+0x3>
   168d6:	1f 92       	push	r1
   168d8:	1f 92       	push	r1
   168da:	1f 92       	push	r1
   168dc:	1f 92       	push	r1
   168de:	81 2c       	mov	r8, r1
   168e0:	91 2c       	mov	r9, r1
   168e2:	e8 e4       	ldi	r30, 0x48	; 72
   168e4:	ae 2e       	mov	r10, r30
   168e6:	e2 e4       	ldi	r30, 0x42	; 66
   168e8:	be 2e       	mov	r11, r30
   168ea:	fd e6       	ldi	r31, 0x6D	; 109
   168ec:	cf 2e       	mov	r12, r31
   168ee:	f2 e1       	ldi	r31, 0x12	; 18
   168f0:	df 2e       	mov	r13, r31
   168f2:	0f 94 33 3d 	call	0x27a66	; 0x27a66 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)>
    st_synchronize();
   168f6:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>

    // Move Z back
    plan_buffer_line(saved_pos[X_AXIS], saved_pos[Y_AXIS], saved_pos[Z_AXIS], current_position[E_AXIS], FILAMENTCHANGE_ZFEED);
   168fa:	e0 90 98 02 	lds	r14, 0x0298	; 0x800298 <saved_pos+0x8>
   168fe:	f0 90 99 02 	lds	r15, 0x0299	; 0x800299 <saved_pos+0x9>
   16902:	00 91 9a 02 	lds	r16, 0x029A	; 0x80029a <saved_pos+0xa>
   16906:	10 91 9b 02 	lds	r17, 0x029B	; 0x80029b <saved_pos+0xb>
   1690a:	20 91 94 02 	lds	r18, 0x0294	; 0x800294 <saved_pos+0x4>
   1690e:	30 91 95 02 	lds	r19, 0x0295	; 0x800295 <saved_pos+0x5>
   16912:	40 91 96 02 	lds	r20, 0x0296	; 0x800296 <saved_pos+0x6>
   16916:	50 91 97 02 	lds	r21, 0x0297	; 0x800297 <saved_pos+0x7>
   1691a:	60 91 90 02 	lds	r22, 0x0290	; 0x800290 <saved_pos>
   1691e:	70 91 91 02 	lds	r23, 0x0291	; 0x800291 <saved_pos+0x1>
   16922:	80 91 92 02 	lds	r24, 0x0292	; 0x800292 <saved_pos+0x2>
   16926:	90 91 93 02 	lds	r25, 0x0293	; 0x800293 <saved_pos+0x3>
   1692a:	1f 92       	push	r1
   1692c:	1f 92       	push	r1
   1692e:	1f 92       	push	r1
   16930:	1f 92       	push	r1
   16932:	81 2c       	mov	r8, r1
   16934:	91 2c       	mov	r9, r1
   16936:	a0 e7       	ldi	r26, 0x70	; 112
   16938:	aa 2e       	mov	r10, r26
   1693a:	a1 e4       	ldi	r26, 0x41	; 65
   1693c:	ba 2e       	mov	r11, r26
   1693e:	0f 94 33 3d 	call	0x27a66	; 0x27a66 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)>
    st_synchronize();
   16942:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>

    // Set E position to original
    plan_set_e_position(saved_pos[E_AXIS]);
   16946:	8c e9       	ldi	r24, 0x9C	; 156
   16948:	92 e0       	ldi	r25, 0x02	; 2
   1694a:	0f 94 d9 3c 	call	0x279b2	; 0x279b2 <plan_set_e_position(float const&)>

    memcpy(current_position, saved_pos, sizeof(saved_pos));
   1694e:	80 e1       	ldi	r24, 0x10	; 16
   16950:	e0 e9       	ldi	r30, 0x90	; 144
   16952:	f2 e0       	ldi	r31, 0x02	; 2
   16954:	a1 e6       	ldi	r26, 0x61	; 97
   16956:	b2 e1       	ldi	r27, 0x12	; 18
   16958:	01 90       	ld	r0, Z+
   1695a:	0d 92       	st	X+, r0
   1695c:	8a 95       	dec	r24
   1695e:	e1 f7       	brne	.-8      	; 0x16958 <process_commands() [clone .part.46]+0x49a0>
    set_destination_to_current();
   16960:	0e 94 ae 66 	call	0xcd5c	; 0xcd5c <set_destination_to_current()>

    // Recover feed rate
    feedmultiply = saved_feedmultiply2;
   16964:	80 91 5f 12 	lds	r24, 0x125F	; 0x80125f <_ZL19saved_feedmultiply2.lto_priv.498>
   16968:	90 91 60 12 	lds	r25, 0x1260	; 0x801260 <_ZL19saved_feedmultiply2.lto_priv.498+0x1>
   1696c:	80 93 8e 02 	sts	0x028E, r24	; 0x80028e <feedmultiply>
   16970:	90 93 8f 02 	sts	0x028F, r25	; 0x80028f <feedmultiply+0x1>
    enquecommandf_P(MSG_M220, saved_feedmultiply2);
   16974:	9f 93       	push	r25
   16976:	8f 93       	push	r24
   16978:	87 ee       	ldi	r24, 0xE7	; 231
   1697a:	94 e6       	ldi	r25, 0x64	; 100
   1697c:	9f 93       	push	r25
   1697e:	8f 93       	push	r24
   16980:	0e 94 b7 8f 	call	0x11f6e	; 0x11f6e <enquecommandf_P(char const*, ...)>

    if (printingIsPaused()) {
   16984:	0e 94 35 66 	call	0xcc6a	; 0xcc6a <printingIsPaused()>
   16988:	0f b6       	in	r0, 0x3f	; 63
   1698a:	f8 94       	cli
   1698c:	de bf       	out	0x3e, r29	; 62
   1698e:	0f be       	out	0x3f, r0	; 63
   16990:	cd bf       	out	0x3d, r28	; 61
   16992:	88 23       	and	r24, r24
   16994:	21 f1       	breq	.+72     	; 0x169de <process_commands() [clone .part.46]+0x4a26>
      lcd_setstatuspgm(_T(MSG_PRINT_PAUSED));
   16996:	8f eb       	ldi	r24, 0xBF	; 191
   16998:	9b e4       	ldi	r25, 0x4B	; 75
   1699a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1699e:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
    }
    else {
      lcd_setstatuspgm(MSG_WELCOME);
      SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_RESUMED);
    }
    custom_message_type = CustomMsg::Status;
   169a2:	10 92 5d 06 	sts	0x065D, r1	; 0x80065d <custom_message_type>
   169a6:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
            st_synchronize();
            break;

        // Unload filament
        case 3:
           return true;
   169aa:	31 e0       	ldi	r19, 0x01	; 1
   169ac:	38 a7       	std	Y+40, r19	; 0x28
   169ae:	ac cd       	rjmp	.-1192   	; 0x16508 <process_commands() [clone .part.46]+0x4550>
            setTargetHotend(0);
        }
        else
        {
            // Feed a little of filament to stabilize pressure
            current_position[E_AXIS] += FILAMENTCHANGE_RECFEED;
   169b0:	20 e0       	ldi	r18, 0x00	; 0
   169b2:	30 e0       	ldi	r19, 0x00	; 0
   169b4:	40 ea       	ldi	r20, 0xA0	; 160
   169b6:	50 e4       	ldi	r21, 0x40	; 64
   169b8:	c7 01       	movw	r24, r14
   169ba:	b6 01       	movw	r22, r12
   169bc:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   169c0:	60 93 6d 12 	sts	0x126D, r22	; 0x80126d <current_position+0xc>
   169c4:	70 93 6e 12 	sts	0x126E, r23	; 0x80126e <current_position+0xd>
   169c8:	80 93 6f 12 	sts	0x126F, r24	; 0x80126f <current_position+0xe>
   169cc:	90 93 70 12 	sts	0x1270, r25	; 0x801270 <current_position+0xf>
            plan_buffer_line_curposXYZE(FILAMENTCHANGE_EXFEED);
   169d0:	60 e0       	ldi	r22, 0x00	; 0
   169d2:	70 e0       	ldi	r23, 0x00	; 0
   169d4:	80 e0       	ldi	r24, 0x00	; 0
   169d6:	90 e4       	ldi	r25, 0x40	; 64
   169d8:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
   169dc:	64 cf       	rjmp	.-312    	; 0x168a6 <process_commands() [clone .part.46]+0x48ee>

    if (printingIsPaused()) {
      lcd_setstatuspgm(_T(MSG_PRINT_PAUSED));
    }
    else {
      lcd_setstatuspgm(MSG_WELCOME);
   169de:	86 ee       	ldi	r24, 0xE6	; 230
   169e0:	9b e6       	ldi	r25, 0x6B	; 107
   169e2:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
      SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_RESUMED);
   169e6:	8b e3       	ldi	r24, 0x3B	; 59
   169e8:	98 e6       	ldi	r25, 0x68	; 104
   169ea:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   169ee:	d9 cf       	rjmp	.-78     	; 0x169a2 <process_commands() [clone .part.46]+0x49ea>
        SERIAL_ECHOPGM("Y:");
        SERIAL_ECHOLN(pause_position[Y_AXIS]);
        SERIAL_ECHOPGM("Z:");
        SERIAL_ECHOLN(pause_position[Z_AXIS]);
*/
        if (!printingIsPaused()) {
   169f0:	0e 94 35 66 	call	0xcc6a	; 0xcc6a <printingIsPaused()>
   169f4:	81 11       	cpse	r24, r1
   169f6:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
            st_synchronize();
   169fa:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
            ClearToSend(); //send OK even before the command finishes executing because we want to make sure it is not skipped because of cmdqueue_pop_front();
   169fe:	0e 94 22 85 	call	0x10a44	; 0x10a44 <ClearToSend()>
            cmdqueue_pop_front(); //trick because we want skip this command (M601) after restore
   16a02:	0e 94 43 79 	call	0xf286	; 0xf286 <cmdqueue_pop_front()>
            lcd_pause_print();
   16a06:	0f 94 fc 0d 	call	0x21bf8	; 0x21bf8 <lcd_pause_print()>
   16a0a:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    /*!
    ### M602 - Resume print <a href="https://reprap.org/wiki/G-code#M602:_Resume_print">M602: Resume print</a>
    */
    case 602:
    {
        if (printingIsPaused()) lcd_resume_print();
   16a0e:	0e 94 35 66 	call	0xcc6a	; 0xcc6a <printingIsPaused()>
   16a12:	88 23       	and	r24, r24
   16a14:	11 f4       	brne	.+4      	; 0x16a1a <process_commands() [clone .part.46]+0x4a62>
   16a16:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
   16a1a:	0c 94 5c a4 	jmp	0x148b8	; 0x148b8 <process_commands() [clone .part.46]+0x2900>
			SERIAL_PROTOCOL(max_sheets-1);
			SERIAL_PROTOCOLLN("");
			break; // invalid sheet ID
		}
	} else {
		iSel = eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet));
   16a1e:	81 ea       	ldi	r24, 0xA1	; 161
   16a20:	9d e0       	ldi	r25, 0x0D	; 13
   16a22:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   16a26:	18 2f       	mov	r17, r24
	}

	if (code_seen('Z')){
   16a28:	8a e5       	ldi	r24, 0x5A	; 90
   16a2a:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   16a2e:	88 23       	and	r24, r24
   16a30:	09 f4       	brne	.+2      	; 0x16a34 <process_commands() [clone .part.46]+0x4a7c>
   16a32:	d7 c0       	rjmp	.+430    	; 0x16be2 <process_commands() [clone .part.46]+0x4c2a>
		z_val = code_value();
   16a34:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   16a38:	2b 01       	movw	r4, r22
   16a3a:	3c 01       	movw	r6, r24
		zraw = z_val*cs.axis_steps_per_mm[Z_AXIS];
   16a3c:	20 91 73 0d 	lds	r18, 0x0D73	; 0x800d73 <cs+0xc>
   16a40:	30 91 74 0d 	lds	r19, 0x0D74	; 0x800d74 <cs+0xd>
   16a44:	40 91 75 0d 	lds	r20, 0x0D75	; 0x800d75 <cs+0xe>
   16a48:	50 91 76 0d 	lds	r21, 0x0D76	; 0x800d76 <cs+0xf>
   16a4c:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   16a50:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   16a54:	6b 01       	movw	r12, r22
		if ((zraw < Z_BABYSTEP_MIN) || (zraw > Z_BABYSTEP_MAX))
   16a56:	9b 01       	movw	r18, r22
   16a58:	21 56       	subi	r18, 0x61	; 97
   16a5a:	30 4f       	sbci	r19, 0xF0	; 240
   16a5c:	20 3a       	cpi	r18, 0xA0	; 160
   16a5e:	3f 40       	sbci	r19, 0x0F	; 15
   16a60:	30 f0       	brcs	.+12     	; 0x16a6e <process_commands() [clone .part.46]+0x4ab6>
		{
			SERIAL_PROTOCOLLNPGM(" Z VALUE OUT OF RANGE");
   16a62:	84 e1       	ldi	r24, 0x14	; 20
   16a64:	9f e7       	ldi	r25, 0x7F	; 127
   16a66:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   16a6a:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
			break;
		}
		eeprom_update_word_notify(reinterpret_cast<uint16_t *>(&(EEPROM_Sheets_base->s[iSel].z_offset)),zraw);
   16a6e:	5b e0       	ldi	r21, 0x0B	; 11
   16a70:	15 9f       	mul	r17, r21
   16a72:	90 01       	movw	r18, r0
   16a74:	11 24       	eor	r1, r1
        if (previous_value != value) {
            eeprom_word_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_word(dst, value);
   16a76:	c9 01       	movw	r24, r18
   16a78:	80 5b       	subi	r24, 0xB0	; 176
   16a7a:	92 4f       	sbci	r25, 0xF2	; 242
   16a7c:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>
	{
		zraw = eeprom_read_word(reinterpret_cast<uint16_t *>(&(EEPROM_Sheets_base->s[iSel].z_offset)));
		z_val = ((float)zraw/cs.axis_steps_per_mm[Z_AXIS]);
	}

	if (code_seen('L'))
   16a80:	8c e4       	ldi	r24, 0x4C	; 76
   16a82:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   16a86:	bb e0       	ldi	r27, 0x0B	; 11
   16a88:	1b 9f       	mul	r17, r27
   16a8a:	70 01       	movw	r14, r0
   16a8c:	11 24       	eor	r1, r1
   16a8e:	57 01       	movw	r10, r14
   16a90:	e7 eb       	ldi	r30, 0xB7	; 183
   16a92:	ae 1a       	sub	r10, r30
   16a94:	e2 ef       	ldi	r30, 0xF2	; 242
   16a96:	be 0a       	sbc	r11, r30
   16a98:	88 23       	and	r24, r24
   16a9a:	09 f4       	brne	.+2      	; 0x16a9e <process_commands() [clone .part.46]+0x4ae6>
   16a9c:	be c0       	rjmp	.+380    	; 0x16c1a <process_commands() [clone .part.46]+0x4c62>
	{
		char *src = strchr_pointer + 1;
   16a9e:	e0 91 bb 04 	lds	r30, 0x04BB	; 0x8004bb <strchr_pointer>
   16aa2:	f0 91 bc 04 	lds	r31, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
   16aa6:	31 96       	adiw	r30, 0x01	; 1
   16aa8:	bf 01       	movw	r22, r30
		while (*src == ' ') ++src;
   16aaa:	81 91       	ld	r24, Z+
   16aac:	80 32       	cpi	r24, 0x20	; 32
   16aae:	e1 f3       	breq	.-8      	; 0x16aa8 <process_commands() [clone .part.46]+0x4af0>
		if (*src != '\0')
   16ab0:	88 23       	and	r24, r24
   16ab2:	31 f0       	breq	.+12     	; 0x16ac0 <process_commands() [clone .part.46]+0x4b08>
		{
			strncpy(strLabel,src,7);
   16ab4:	47 e0       	ldi	r20, 0x07	; 7
   16ab6:	50 e0       	ldi	r21, 0x00	; 0
   16ab8:	ce 01       	movw	r24, r28
   16aba:	01 96       	adiw	r24, 0x01	; 1
   16abc:	0f 94 60 aa 	call	0x354c0	; 0x354c0 <strncpy>
#endif //DEBUG_EEPROM_CHANGES
}

#ifndef DEBUG_EEPROM_CHANGES
void eeprom_update_block_notify(const void *__src, void *__dst, size_t __n){
    eeprom_update_block(__src, __dst, __n);
   16ac0:	47 e0       	ldi	r20, 0x07	; 7
   16ac2:	50 e0       	ldi	r21, 0x00	; 0
   16ac4:	b5 01       	movw	r22, r10
   16ac6:	ce 01       	movw	r24, r28
   16ac8:	01 96       	adiw	r24, 0x01	; 1
   16aca:	0f 94 f4 a3 	call	0x347e8	; 0x347e8 <eeprom_update_block>
	else
	{
		eeprom_read_block(strLabel, EEPROM_Sheets_base->s[iSel].name, sizeof(Sheet::name));
	}

	if (code_seen('B'))
   16ace:	82 e4       	ldi	r24, 0x42	; 66
   16ad0:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   16ad4:	57 01       	movw	r10, r14
   16ad6:	fe ea       	ldi	r31, 0xAE	; 174
   16ad8:	af 1a       	sub	r10, r31
   16ada:	f2 ef       	ldi	r31, 0xF2	; 242
   16adc:	bf 0a       	sbc	r11, r31
   16ade:	88 23       	and	r24, r24
   16ae0:	09 f4       	brne	.+2      	; 0x16ae4 <process_commands() [clone .part.46]+0x4b2c>
   16ae2:	a3 c0       	rjmp	.+326    	; 0x16c2a <process_commands() [clone .part.46]+0x4c72>
	{
		iBedC = code_value_uint8();
   16ae4:	0e 94 0a 56 	call	0xac14	; 0xac14 <code_value_uint8()>
   16ae8:	98 2e       	mov	r9, r24
        if (previous_value != value) {
            eeprom_byte_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_byte(dst, value);
   16aea:	68 2f       	mov	r22, r24
   16aec:	c5 01       	movw	r24, r10
   16aee:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
	else
	{
		iBedC = eeprom_read_byte(&EEPROM_Sheets_base->s[iSel].bed_temp);
	}

	if (code_seen('P'))
   16af2:	80 e5       	ldi	r24, 0x50	; 80
   16af4:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   16af8:	2d ea       	ldi	r18, 0xAD	; 173
   16afa:	e2 1a       	sub	r14, r18
   16afc:	22 ef       	ldi	r18, 0xF2	; 242
   16afe:	f2 0a       	sbc	r15, r18
   16b00:	88 23       	and	r24, r24
   16b02:	09 f4       	brne	.+2      	; 0x16b06 <process_commands() [clone .part.46]+0x4b4e>
   16b04:	97 c0       	rjmp	.+302    	; 0x16c34 <process_commands() [clone .part.46]+0x4c7c>
	{
		iPindaC = code_value_uint8();
   16b06:	0e 94 0a 56 	call	0xac14	; 0xac14 <code_value_uint8()>
   16b0a:	b8 2e       	mov	r11, r24
   16b0c:	68 2f       	mov	r22, r24
   16b0e:	c7 01       	movw	r24, r14
   16b10:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
	else
	{
		iPindaC = eeprom_read_byte(&EEPROM_Sheets_base->s[iSel].pinda_temp);
	}

	if (code_seen('A'))
   16b14:	81 e4       	ldi	r24, 0x41	; 65
   16b16:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   16b1a:	88 23       	and	r24, r24
   16b1c:	09 f4       	brne	.+2      	; 0x16b20 <process_commands() [clone .part.46]+0x4b68>
   16b1e:	8f c0       	rjmp	.+286    	; 0x16c3e <process_commands() [clone .part.46]+0x4c86>
	{
		bIsActive |= code_value_uint8() || (eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)) == iSel);
   16b20:	0e 94 0a 56 	call	0xac14	; 0xac14 <code_value_uint8()>
   16b24:	81 11       	cpse	r24, r1
   16b26:	06 c0       	rjmp	.+12     	; 0x16b34 <process_commands() [clone .part.46]+0x4b7c>
   16b28:	81 ea       	ldi	r24, 0xA1	; 161
   16b2a:	9d e0       	ldi	r25, 0x0D	; 13
   16b2c:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   16b30:	18 13       	cpse	r17, r24
   16b32:	8d c0       	rjmp	.+282    	; 0x16c4e <process_commands() [clone .part.46]+0x4c96>
		if(bIsActive && eeprom_is_sheet_initialized(iSel)) {
   16b34:	81 2f       	mov	r24, r17
   16b36:	0e 94 88 78 	call	0xf110	; 0xf110 <eeprom_is_sheet_initialized(unsigned char)>
   16b3a:	08 2f       	mov	r16, r24
   16b3c:	88 23       	and	r24, r24
   16b3e:	29 f0       	breq	.+10     	; 0x16b4a <process_commands() [clone .part.46]+0x4b92>
   16b40:	61 2f       	mov	r22, r17
   16b42:	81 ea       	ldi	r24, 0xA1	; 161
   16b44:	9d e0       	ldi	r25, 0x0D	; 13
   16b46:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
	else
	{
		bIsActive = (eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)) == iSel);
	}

	SERIAL_PROTOCOLPGM("Sheet ");
   16b4a:	8d e0       	ldi	r24, 0x0D	; 13
   16b4c:	9f e7       	ldi	r25, 0x7F	; 127
   16b4e:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
  print((unsigned long) b, base);
}

void MarlinSerial::print(int n, int base)
{
  print((long) n, base);
   16b52:	61 2f       	mov	r22, r17
   16b54:	70 e0       	ldi	r23, 0x00	; 0
   16b56:	90 e0       	ldi	r25, 0x00	; 0
   16b58:	80 e0       	ldi	r24, 0x00	; 0
   16b5a:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
	SERIAL_PROTOCOL((int)iSel);
	if (!eeprom_is_sheet_initialized(iSel))
   16b5e:	81 2f       	mov	r24, r17
   16b60:	0e 94 88 78 	call	0xf110	; 0xf110 <eeprom_is_sheet_initialized(unsigned char)>
   16b64:	81 11       	cpse	r24, r1
   16b66:	04 c0       	rjmp	.+8      	; 0x16b70 <process_commands() [clone .part.46]+0x4bb8>
		SERIAL_PROTOCOLLNPGM(" NOT INITIALIZED");
   16b68:	8c ef       	ldi	r24, 0xFC	; 252
   16b6a:	9e e7       	ldi	r25, 0x7E	; 126
   16b6c:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>


	SERIAL_PROTOCOLPGM(" Z");
   16b70:	89 ef       	ldi	r24, 0xF9	; 249
   16b72:	9e e7       	ldi	r25, 0x7E	; 126
   16b74:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
  else printNumber(n, base);
}

void MarlinSerial::print(double n, int digits)
{
  printFloat(n, digits);
   16b78:	44 e0       	ldi	r20, 0x04	; 4
   16b7a:	c3 01       	movw	r24, r6
   16b7c:	b2 01       	movw	r22, r4
   16b7e:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
	SERIAL_PROTOCOL_F(z_val,4);
	SERIAL_PROTOCOLPGM(" R");
   16b82:	86 ef       	ldi	r24, 0xF6	; 246
   16b84:	9e e7       	ldi	r25, 0x7E	; 126
   16b86:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
  print((unsigned long) b, base);
}

void MarlinSerial::print(int n, int base)
{
  print((long) n, base);
   16b8a:	b6 01       	movw	r22, r12
   16b8c:	dd 0c       	add	r13, r13
   16b8e:	88 0b       	sbc	r24, r24
   16b90:	99 0b       	sbc	r25, r25
   16b92:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
	SERIAL_PROTOCOL((int)zraw);
	SERIAL_PROTOCOLPGM(" L");
   16b96:	83 ef       	ldi	r24, 0xF3	; 243
   16b98:	9e e7       	ldi	r25, 0x7E	; 126
   16b9a:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   16b9e:	ce 01       	movw	r24, r28
   16ba0:	01 96       	adiw	r24, 0x01	; 1
   16ba2:	0e 94 95 87 	call	0x10f2a	; 0x10f2a <MarlinSerial::write(char const*)>
	SERIAL_PROTOCOL(strLabel);
	SERIAL_PROTOCOLPGM(" B");
   16ba6:	80 ef       	ldi	r24, 0xF0	; 240
   16ba8:	9e e7       	ldi	r25, 0x7E	; 126
   16baa:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   16bae:	69 2d       	mov	r22, r9
   16bb0:	70 e0       	ldi	r23, 0x00	; 0
   16bb2:	90 e0       	ldi	r25, 0x00	; 0
   16bb4:	80 e0       	ldi	r24, 0x00	; 0
   16bb6:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
	SERIAL_PROTOCOL((int)iBedC);
	SERIAL_PROTOCOLPGM(" P");
   16bba:	8d ee       	ldi	r24, 0xED	; 237
   16bbc:	9e e7       	ldi	r25, 0x7E	; 126
   16bbe:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   16bc2:	6b 2d       	mov	r22, r11
   16bc4:	70 e0       	ldi	r23, 0x00	; 0
   16bc6:	90 e0       	ldi	r25, 0x00	; 0
   16bc8:	80 e0       	ldi	r24, 0x00	; 0
   16bca:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
	SERIAL_PROTOCOL((int)iPindaC);
	SERIAL_PROTOCOLPGM(" A");
   16bce:	8a ee       	ldi	r24, 0xEA	; 234
   16bd0:	9e e7       	ldi	r25, 0x7E	; 126
   16bd2:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
	SERIAL_PROTOCOLLN((int)bIsActive);
   16bd6:	80 2f       	mov	r24, r16
   16bd8:	90 e0       	ldi	r25, 0x00	; 0
   16bda:	0f 94 bf 65 	call	0x2cb7e	; 0x2cb7e <MarlinSerial::println(int, int) [clone .constprop.319]>
   16bde:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
		}
		eeprom_update_word_notify(reinterpret_cast<uint16_t *>(&(EEPROM_Sheets_base->s[iSel].z_offset)),zraw);
	}
	else
	{
		zraw = eeprom_read_word(reinterpret_cast<uint16_t *>(&(EEPROM_Sheets_base->s[iSel].z_offset)));
   16be2:	ab e0       	ldi	r26, 0x0B	; 11
   16be4:	1a 9f       	mul	r17, r26
   16be6:	c0 01       	movw	r24, r0
   16be8:	11 24       	eor	r1, r1
   16bea:	80 5b       	subi	r24, 0xB0	; 176
   16bec:	92 4f       	sbci	r25, 0xF2	; 242
   16bee:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
   16bf2:	6c 01       	movw	r12, r24
		z_val = ((float)zraw/cs.axis_steps_per_mm[Z_AXIS]);
   16bf4:	bc 01       	movw	r22, r24
   16bf6:	99 0f       	add	r25, r25
   16bf8:	88 0b       	sbc	r24, r24
   16bfa:	99 0b       	sbc	r25, r25
   16bfc:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   16c00:	20 91 73 0d 	lds	r18, 0x0D73	; 0x800d73 <cs+0xc>
   16c04:	30 91 74 0d 	lds	r19, 0x0D74	; 0x800d74 <cs+0xd>
   16c08:	40 91 75 0d 	lds	r20, 0x0D75	; 0x800d75 <cs+0xe>
   16c0c:	50 91 76 0d 	lds	r21, 0x0D76	; 0x800d76 <cs+0xf>
   16c10:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   16c14:	2b 01       	movw	r4, r22
   16c16:	3c 01       	movw	r6, r24
   16c18:	33 cf       	rjmp	.-410    	; 0x16a80 <process_commands() [clone .part.46]+0x4ac8>
		}
		eeprom_update_block_notify(strLabel,EEPROM_Sheets_base->s[iSel].name,sizeof(Sheet::name));
	}
	else
	{
		eeprom_read_block(strLabel, EEPROM_Sheets_base->s[iSel].name, sizeof(Sheet::name));
   16c1a:	47 e0       	ldi	r20, 0x07	; 7
   16c1c:	50 e0       	ldi	r21, 0x00	; 0
   16c1e:	b5 01       	movw	r22, r10
   16c20:	ce 01       	movw	r24, r28
   16c22:	01 96       	adiw	r24, 0x01	; 1
   16c24:	0f 94 d0 a3 	call	0x347a0	; 0x347a0 <eeprom_read_block>
   16c28:	52 cf       	rjmp	.-348    	; 0x16ace <process_commands() [clone .part.46]+0x4b16>
		iBedC = code_value_uint8();
		eeprom_update_byte_notify(&EEPROM_Sheets_base->s[iSel].bed_temp, iBedC);
	}
	else
	{
		iBedC = eeprom_read_byte(&EEPROM_Sheets_base->s[iSel].bed_temp);
   16c2a:	c5 01       	movw	r24, r10
   16c2c:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   16c30:	98 2e       	mov	r9, r24
   16c32:	5f cf       	rjmp	.-322    	; 0x16af2 <process_commands() [clone .part.46]+0x4b3a>
		iPindaC = code_value_uint8();
		eeprom_update_byte_notify(&EEPROM_Sheets_base->s[iSel].pinda_temp, iPindaC);
	}
	else
	{
		iPindaC = eeprom_read_byte(&EEPROM_Sheets_base->s[iSel].pinda_temp);
   16c34:	c7 01       	movw	r24, r14
   16c36:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   16c3a:	b8 2e       	mov	r11, r24
   16c3c:	6b cf       	rjmp	.-298    	; 0x16b14 <process_commands() [clone .part.46]+0x4b5c>
            bIsActive = 0;
        }
	}
	else
	{
		bIsActive = (eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)) == iSel);
   16c3e:	81 ea       	ldi	r24, 0xA1	; 161
   16c40:	9d e0       	ldi	r25, 0x0D	; 13
   16c42:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   16c46:	01 e0       	ldi	r16, 0x01	; 1
   16c48:	18 17       	cp	r17, r24
   16c4a:	09 f4       	brne	.+2      	; 0x16c4e <process_commands() [clone .part.46]+0x4c96>
   16c4c:	7e cf       	rjmp	.-260    	; 0x16b4a <process_commands() [clone .part.46]+0x4b92>
	{
		bIsActive |= code_value_uint8() || (eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)) == iSel);
		if(bIsActive && eeprom_is_sheet_initialized(iSel)) {
            eeprom_update_byte_notify(&EEPROM_Sheets_base->active_sheet, iSel);
        } else {
            bIsActive = 0;
   16c4e:	00 e0       	ldi	r16, 0x00	; 0
   16c50:	7c cf       	rjmp	.-264    	; 0x16b4a <process_commands() [clone .part.46]+0x4b92>
    */
	case 860:
	{
		int set_target_pinda = 0;

		if (code_seen('S')) {
   16c52:	83 e5       	ldi	r24, 0x53	; 83
   16c54:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   16c58:	88 23       	and	r24, r24
   16c5a:	11 f4       	brne	.+4      	; 0x16c60 <process_commands() [clone .part.46]+0x4ca8>
   16c5c:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
			set_target_pinda = code_value_short();
   16c60:	0e 94 17 56 	call	0xac2e	; 0xac2e <code_value_short() [clone .lto_priv.505]>
   16c64:	8c 01       	movw	r16, r24
		}
		else {
			break;
		}

		LCD_MESSAGERPGM(_T(MSG_PLEASE_WAIT));
   16c66:	85 e6       	ldi	r24, 0x65	; 101
   16c68:	99 e3       	ldi	r25, 0x39	; 57
   16c6a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   16c6e:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>

		SERIAL_PROTOCOLPGM("Wait for PINDA target temperature:");
   16c72:	87 ec       	ldi	r24, 0xC7	; 199
   16c74:	9e e7       	ldi	r25, 0x7E	; 126
   16c76:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
		SERIAL_PROTOCOLLN(set_target_pinda);
   16c7a:	c8 01       	movw	r24, r16
   16c7c:	0f 94 bf 65 	call	0x2cb7e	; 0x2cb7e <MarlinSerial::println(int, int) [clone .constprop.319]>

		codenum = _millis();
   16c80:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   16c84:	4b 01       	movw	r8, r22
   16c86:	5c 01       	movw	r10, r24
		cancel_heatup = false;
   16c88:	10 92 5f 0d 	sts	0x0D5F, r1	; 0x800d5f <_ZL13cancel_heatup.lto_priv.391>

		bool is_pinda_cooling = false;
		if (!(CHECK_ALL_HEATERS)) is_pinda_cooling = true;
   16c8c:	80 91 5d 12 	lds	r24, 0x125D	; 0x80125d <target_temperature>
   16c90:	90 91 5e 12 	lds	r25, 0x125E	; 0x80125e <target_temperature+0x1>
   16c94:	89 2b       	or	r24, r25
   16c96:	41 f4       	brne	.+16     	; 0x16ca8 <process_commands() [clone .part.46]+0x4cf0>
   16c98:	ff 24       	eor	r15, r15
   16c9a:	f3 94       	inc	r15
   16c9c:	80 91 59 12 	lds	r24, 0x1259	; 0x801259 <target_temperature_bed>
   16ca0:	90 91 5a 12 	lds	r25, 0x125A	; 0x80125a <target_temperature_bed+0x1>
   16ca4:	89 2b       	or	r24, r25
   16ca6:	09 f0       	breq	.+2      	; 0x16caa <process_commands() [clone .part.46]+0x4cf2>
		SERIAL_PROTOCOLLN(set_target_pinda);

		codenum = _millis();
		cancel_heatup = false;

		bool is_pinda_cooling = false;
   16ca8:	f1 2c       	mov	r15, r1
		if (!(CHECK_ALL_HEATERS)) is_pinda_cooling = true;

		while ( ((!is_pinda_cooling) && (!cancel_heatup) && (current_temperature_pinda < set_target_pinda)) || (is_pinda_cooling && (current_temperature_pinda > set_target_pinda)) ) {
   16caa:	28 01       	movw	r4, r16
   16cac:	01 2e       	mov	r0, r17
   16cae:	00 0c       	add	r0, r0
   16cb0:	66 08       	sbc	r6, r6
   16cb2:	77 08       	sbc	r7, r7
   16cb4:	f1 10       	cpse	r15, r1
   16cb6:	1a c0       	rjmp	.+52     	; 0x16cec <process_commands() [clone .part.46]+0x4d34>
   16cb8:	80 91 5f 0d 	lds	r24, 0x0D5F	; 0x800d5f <_ZL13cancel_heatup.lto_priv.391>
   16cbc:	81 11       	cpse	r24, r1
   16cbe:	10 c0       	rjmp	.+32     	; 0x16ce0 <process_commands() [clone .part.46]+0x4d28>
   16cc0:	c3 01       	movw	r24, r6
   16cc2:	b2 01       	movw	r22, r4
   16cc4:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   16cc8:	20 91 85 03 	lds	r18, 0x0385	; 0x800385 <current_temperature_pinda>
   16ccc:	30 91 86 03 	lds	r19, 0x0386	; 0x800386 <current_temperature_pinda+0x1>
   16cd0:	40 91 87 03 	lds	r20, 0x0387	; 0x800387 <current_temperature_pinda+0x2>
   16cd4:	50 91 88 03 	lds	r21, 0x0388	; 0x800388 <current_temperature_pinda+0x3>
   16cd8:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   16cdc:	18 16       	cp	r1, r24
   16cde:	b4 f0       	brlt	.+44     	; 0x16d0c <process_commands() [clone .part.46]+0x4d54>
			}
			manage_heater();
			manage_inactivity();
			lcd_update(0);
		}
		LCD_MESSAGERPGM(MSG_OK);
   16ce0:	80 ef       	ldi	r24, 0xF0	; 240
   16ce2:	99 e6       	ldi	r25, 0x69	; 105
   16ce4:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
   16ce8:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
		cancel_heatup = false;

		bool is_pinda_cooling = false;
		if (!(CHECK_ALL_HEATERS)) is_pinda_cooling = true;

		while ( ((!is_pinda_cooling) && (!cancel_heatup) && (current_temperature_pinda < set_target_pinda)) || (is_pinda_cooling && (current_temperature_pinda > set_target_pinda)) ) {
   16cec:	c3 01       	movw	r24, r6
   16cee:	b2 01       	movw	r22, r4
   16cf0:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   16cf4:	20 91 85 03 	lds	r18, 0x0385	; 0x800385 <current_temperature_pinda>
   16cf8:	30 91 86 03 	lds	r19, 0x0386	; 0x800386 <current_temperature_pinda+0x1>
   16cfc:	40 91 87 03 	lds	r20, 0x0387	; 0x800387 <current_temperature_pinda+0x2>
   16d00:	50 91 88 03 	lds	r21, 0x0388	; 0x800388 <current_temperature_pinda+0x3>
   16d04:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   16d08:	87 ff       	sbrs	r24, 7
   16d0a:	ea cf       	rjmp	.-44     	; 0x16ce0 <process_commands() [clone .part.46]+0x4d28>
			if ((_millis() - codenum) > 1000) //Print Temp Reading every 1 second while waiting.
   16d0c:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   16d10:	68 19       	sub	r22, r8
   16d12:	79 09       	sbc	r23, r9
   16d14:	8a 09       	sbc	r24, r10
   16d16:	9b 09       	sbc	r25, r11
   16d18:	69 3e       	cpi	r22, 0xE9	; 233
   16d1a:	73 40       	sbci	r23, 0x03	; 3
   16d1c:	81 05       	cpc	r24, r1
   16d1e:	91 05       	cpc	r25, r1
   16d20:	c8 f0       	brcs	.+50     	; 0x16d54 <process_commands() [clone .part.46]+0x4d9c>
			{
				SERIAL_PROTOCOLPGM("P:");
   16d22:	84 ec       	ldi	r24, 0xC4	; 196
   16d24:	9e e7       	ldi	r25, 0x7E	; 126
   16d26:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
  else printNumber(n, base);
}

void MarlinSerial::print(double n, int digits)
{
  printFloat(n, digits);
   16d2a:	60 91 85 03 	lds	r22, 0x0385	; 0x800385 <current_temperature_pinda>
   16d2e:	70 91 86 03 	lds	r23, 0x0386	; 0x800386 <current_temperature_pinda+0x1>
   16d32:	80 91 87 03 	lds	r24, 0x0387	; 0x800387 <current_temperature_pinda+0x2>
   16d36:	90 91 88 03 	lds	r25, 0x0388	; 0x800388 <current_temperature_pinda+0x3>
   16d3a:	41 e0       	ldi	r20, 0x01	; 1
   16d3c:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
}

void MarlinSerial::print(long n, int base)
{
  if (base == 0) {
    write(n);
   16d40:	8f e2       	ldi	r24, 0x2F	; 47
   16d42:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
				SERIAL_PROTOCOL_F(current_temperature_pinda, 1);
				SERIAL_PROTOCOL('/');
				SERIAL_PROTOCOLLN(set_target_pinda);
   16d46:	c8 01       	movw	r24, r16
   16d48:	0f 94 bf 65 	call	0x2cb7e	; 0x2cb7e <MarlinSerial::println(int, int) [clone .constprop.319]>
				codenum = _millis();
   16d4c:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   16d50:	4b 01       	movw	r8, r22
   16d52:	5c 01       	movw	r10, r24
			}
			manage_heater();
   16d54:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
			manage_inactivity();
   16d58:	80 e0       	ldi	r24, 0x00	; 0
   16d5a:	0e 94 34 8c 	call	0x11868	; 0x11868 <manage_inactivity(bool)>
			lcd_update(0);
   16d5e:	80 e0       	ldi	r24, 0x00	; 0
   16d60:	0e 94 f9 6e 	call	0xddf2	; 0xddf2 <lcd_update(unsigned char)>
   16d64:	a7 cf       	rjmp	.-178    	; 0x16cb4 <process_commands() [clone .part.46]+0x4cfc>
    - `S` - Microsteps
    - `I` - Table index
    */
	case 861: {
		const char * const _header = PSTR("index, temp, ustep, um");
		if (code_seen('?')) { // ? - Print out current EEPROM offset values
   16d66:	8f e3       	ldi	r24, 0x3F	; 63
   16d68:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   16d6c:	88 23       	and	r24, r24
   16d6e:	c9 f0       	breq	.+50     	; 0x16da2 <process_commands() [clone .part.46]+0x4dea>
			SERIAL_PROTOCOLPGM("PINDA cal status: ");
   16d70:	81 eb       	ldi	r24, 0xB1	; 177
   16d72:	9e e7       	ldi	r25, 0x7E	; 126
   16d74:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
bool calibration_status_get(CalibrationStatus components);
void calibration_status_set(CalibrationStatus components);
void calibration_status_clear(CalibrationStatus components);

// PINDA has an independent calibration flag
inline bool calibration_status_pinda() { return eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_PINDA); }
   16d78:	86 ea       	ldi	r24, 0xA6	; 166
   16d7a:	9f e0       	ldi	r25, 0x0F	; 15
   16d7c:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   16d80:	21 e0       	ldi	r18, 0x01	; 1
   16d82:	30 e0       	ldi	r19, 0x00	; 0
   16d84:	81 11       	cpse	r24, r1
   16d86:	02 c0       	rjmp	.+4      	; 0x16d8c <process_commands() [clone .part.46]+0x4dd4>
   16d88:	30 e0       	ldi	r19, 0x00	; 0
   16d8a:	20 e0       	ldi	r18, 0x00	; 0
			SERIAL_PROTOCOLLN(calibration_status_pinda());
   16d8c:	c9 01       	movw	r24, r18
   16d8e:	0f 94 bf 65 	call	0x2cb7e	; 0x2cb7e <MarlinSerial::println(int, int) [clone .constprop.319]>
			SERIAL_PROTOCOLLNRPGM(_header);
   16d92:	8a e9       	ldi	r24, 0x9A	; 154
   16d94:	9e e7       	ldi	r25, 0x7E	; 126
   16d96:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
			gcode_M861_print_pinda_cal_eeprom();
   16d9a:	0e 94 fc 7a 	call	0xf5f8	; 0xf5f8 <gcode_M861_print_pinda_cal_eeprom()>
   16d9e:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
		}
		else if (code_seen('!')) { // ! - Set factory default values
   16da2:	81 e2       	ldi	r24, 0x21	; 33
   16da4:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   16da8:	88 23       	and	r24, r24
   16daa:	49 f1       	breq	.+82     	; 0x16dfe <process_commands() [clone .part.46]+0x4e46>
   16dac:	61 e0       	ldi	r22, 0x01	; 1
   16dae:	86 ea       	ldi	r24, 0xA6	; 166
   16db0:	9f e0       	ldi	r25, 0x0F	; 15
   16db2:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
        if (previous_value != value) {
            eeprom_word_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_word(dst, value);
   16db6:	68 e0       	ldi	r22, 0x08	; 8
   16db8:	70 e0       	ldi	r23, 0x00	; 0
   16dba:	80 eb       	ldi	r24, 0xB0	; 176
   16dbc:	9f e0       	ldi	r25, 0x0F	; 15
   16dbe:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>
   16dc2:	68 e1       	ldi	r22, 0x18	; 24
   16dc4:	70 e0       	ldi	r23, 0x00	; 0
   16dc6:	82 eb       	ldi	r24, 0xB2	; 178
   16dc8:	9f e0       	ldi	r25, 0x0F	; 15
   16dca:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>
   16dce:	60 e3       	ldi	r22, 0x30	; 48
   16dd0:	70 e0       	ldi	r23, 0x00	; 0
   16dd2:	84 eb       	ldi	r24, 0xB4	; 180
   16dd4:	9f e0       	ldi	r25, 0x0F	; 15
   16dd6:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>
   16dda:	60 e5       	ldi	r22, 0x50	; 80
   16ddc:	70 e0       	ldi	r23, 0x00	; 0
   16dde:	86 eb       	ldi	r24, 0xB6	; 182
   16de0:	9f e0       	ldi	r25, 0x0F	; 15
   16de2:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>
   16de6:	68 e7       	ldi	r22, 0x78	; 120
   16de8:	70 e0       	ldi	r23, 0x00	; 0
   16dea:	88 eb       	ldi	r24, 0xB8	; 184
   16dec:	9f e0       	ldi	r25, 0x0F	; 15
   16dee:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>
			eeprom_update_word_notify((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + 2, z_shift);
			z_shift = 80;   //55C - 200um -  80usteps
			eeprom_update_word_notify((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + 3, z_shift);
			z_shift = 120;  //60C - 300um - 120usteps
			eeprom_update_word_notify((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + 4, z_shift);
			SERIAL_PROTOCOLLNPGM("factory restored");
   16df2:	89 e8       	ldi	r24, 0x89	; 137
   16df4:	9e e7       	ldi	r25, 0x7E	; 126
   16df6:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   16dfa:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
		}
		else if (code_seen('Z')) { // Z - Set all values to 0 (effectively disabling PINDA temperature compensation)
   16dfe:	8a e5       	ldi	r24, 0x5A	; 90
   16e00:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   16e04:	88 23       	and	r24, r24
   16e06:	c1 f0       	breq	.+48     	; 0x16e38 <process_commands() [clone .part.46]+0x4e80>
        if (previous_value != value) {
            eeprom_byte_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_byte(dst, value);
   16e08:	61 e0       	ldi	r22, 0x01	; 1
   16e0a:	86 ea       	ldi	r24, 0xA6	; 166
   16e0c:	9f e0       	ldi	r25, 0x0F	; 15
   16e0e:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
   16e12:	00 eb       	ldi	r16, 0xB0	; 176
   16e14:	1f e0       	ldi	r17, 0x0F	; 15
        if (previous_value != value) {
            eeprom_word_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_word(dst, value);
   16e16:	70 e0       	ldi	r23, 0x00	; 0
   16e18:	60 e0       	ldi	r22, 0x00	; 0
   16e1a:	c8 01       	movw	r24, r16
   16e1c:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>
   16e20:	0e 5f       	subi	r16, 0xFE	; 254
   16e22:	1f 4f       	sbci	r17, 0xFF	; 255
			eeprom_update_byte_notify((uint8_t*)EEPROM_CALIBRATION_STATUS_PINDA, 1);
			int16_t z_shift = 0;
			for (uint8_t i = 0; i < 5; i++) {
   16e24:	0a 3b       	cpi	r16, 0xBA	; 186
   16e26:	4f e0       	ldi	r20, 0x0F	; 15
   16e28:	14 07       	cpc	r17, r20
   16e2a:	a9 f7       	brne	.-22     	; 0x16e16 <process_commands() [clone .part.46]+0x4e5e>
				eeprom_update_word_notify((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + i, z_shift);
			}
			SERIAL_PROTOCOLLNPGM("zerorized");
   16e2c:	8f e7       	ldi	r24, 0x7F	; 127
   16e2e:	9e e7       	ldi	r25, 0x7E	; 126
   16e30:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   16e34:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
		}
		else if (code_seen('S')) { // Sxxx Iyyy - Set compensation ustep value S for compensation table index I
   16e38:	83 e5       	ldi	r24, 0x53	; 83
   16e3a:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   16e3e:	88 23       	and	r24, r24
   16e40:	21 f1       	breq	.+72     	; 0x16e8a <process_commands() [clone .part.46]+0x4ed2>
			int16_t usteps = code_value_short();
   16e42:	0e 94 17 56 	call	0xac2e	; 0xac2e <code_value_short() [clone .lto_priv.505]>
   16e46:	8c 01       	movw	r16, r24
			if (code_seen('I')) {
   16e48:	89 e4       	ldi	r24, 0x49	; 73
   16e4a:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   16e4e:	88 23       	and	r24, r24
   16e50:	11 f4       	brne	.+4      	; 0x16e56 <process_commands() [clone .part.46]+0x4e9e>
   16e52:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
			    uint8_t index = code_value_uint8();
   16e56:	0e 94 0a 56 	call	0xac14	; 0xac14 <code_value_uint8()>
				if (index < 5) {
   16e5a:	85 30       	cpi	r24, 0x05	; 5
   16e5c:	10 f0       	brcs	.+4      	; 0x16e62 <process_commands() [clone .part.46]+0x4eaa>
   16e5e:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
					eeprom_update_word_notify((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + index, usteps);
   16e62:	90 e0       	ldi	r25, 0x00	; 0
   16e64:	88 52       	subi	r24, 0x28	; 40
   16e66:	98 4f       	sbci	r25, 0xF8	; 248
   16e68:	b8 01       	movw	r22, r16
   16e6a:	88 0f       	add	r24, r24
   16e6c:	99 1f       	adc	r25, r25
   16e6e:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>
					SERIAL_PROTOCOLLNRPGM(MSG_OK);
   16e72:	80 ef       	ldi	r24, 0xF0	; 240
   16e74:	99 e6       	ldi	r25, 0x69	; 105
   16e76:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
					SERIAL_PROTOCOLLNRPGM(_header);
   16e7a:	8a e9       	ldi	r24, 0x9A	; 154
   16e7c:	9e e7       	ldi	r25, 0x7E	; 126
   16e7e:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
					gcode_M861_print_pinda_cal_eeprom();
   16e82:	0e 94 fc 7a 	call	0xf5f8	; 0xf5f8 <gcode_M861_print_pinda_cal_eeprom()>
   16e86:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
				}
			}
		}
		else {
			SERIAL_PROTOCOLLNPGM("no valid command");
   16e8a:	8e e6       	ldi	r24, 0x6E	; 110
   16e8c:	9e e7       	ldi	r25, 0x7E	; 126
   16e8e:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   16e92:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    case 862: // M862: print checking
    {
        // Read the decimal by multiplying the float value by 10 e.g. 862.1 becomes 8621
        // This method consumes less flash memory compared to checking the string length.
        ClPrintChecking nCommand = static_cast<ClPrintChecking>((uint16_t)(code_value()*10) - 8620u);
        switch(nCommand)
   16e96:	64 30       	cpi	r22, 0x04	; 4
   16e98:	09 f4       	brne	.+2      	; 0x16e9c <process_commands() [clone .part.46]+0x4ee4>
   16e9a:	be c0       	rjmp	.+380    	; 0x17018 <process_commands() [clone .part.46]+0x5060>
   16e9c:	65 30       	cpi	r22, 0x05	; 5
   16e9e:	11 f0       	breq	.+4      	; 0x16ea4 <process_commands() [clone .part.46]+0x4eec>
   16ea0:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
                         fw_version_check(++strchr_pointer);
                    else if(code_seen('Q'))
                         SERIAL_PROTOCOLLNRPGM(FW_VERSION_STR_P());
                    break;
               case ClPrintChecking::_Gcode:      // ~ .5
                    if(code_seen('P'))
   16ea4:	80 e5       	ldi	r24, 0x50	; 80
   16ea6:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   16eaa:	88 23       	and	r24, r24
   16eac:	09 f4       	brne	.+2      	; 0x16eb0 <process_commands() [clone .part.46]+0x4ef8>
   16eae:	3a c1       	rjmp	.+628    	; 0x17124 <process_commands() [clone .part.46]+0x516c>
                         {
                         uint16_t nGcodeLevel;
                         nGcodeLevel=(uint16_t)code_value_long();
   16eb0:	0e 94 5d 56 	call	0xacba	; 0xacba <code_value_long() [clone .lto_priv.507]>
done:
    return true;
}

void gcode_level_check(uint16_t nGcodeLevel) {
    if (oCheckGcode == ClCheckMode::_None)
   16eb4:	10 91 e8 03 	lds	r17, 0x03E8	; 0x8003e8 <oCheckGcode>
   16eb8:	11 23       	and	r17, r17
   16eba:	11 f4       	brne	.+4      	; 0x16ec0 <process_commands() [clone .part.46]+0x4f08>
   16ebc:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        return;
    if (nGcodeLevel <= (uint16_t)GCODE_LEVEL)
   16ec0:	62 30       	cpi	r22, 0x02	; 2
   16ec2:	71 05       	cpc	r23, r1
   16ec4:	10 f4       	brcc	.+4      	; 0x16eca <process_commands() [clone .part.46]+0x4f12>
   16ec6:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    // SERIAL_ECHOPGM("actual  : ");
    // SERIAL_ECHOLN(GCODE_LEVEL);
    // SERIAL_ECHOPGM("expected: ");
    // SERIAL_ECHOLN(nGcodeLevel);

    render_M862_warnings(
   16eca:	8b ea       	ldi	r24, 0xAB	; 171
   16ecc:	96 e3       	ldi	r25, 0x36	; 54
   16ece:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   16ed2:	7c 01       	movw	r14, r24
   16ed4:	84 e8       	ldi	r24, 0x84	; 132
   16ed6:	96 e3       	ldi	r25, 0x36	; 54
   16ed8:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   16edc:	41 2f       	mov	r20, r17
   16ede:	b7 01       	movw	r22, r14
   16ee0:	0e 94 df ea 	call	0x1d5be	; 0x1d5be <render_M862_warnings(char const*, char const*, unsigned char) [clone .lto_priv.521]>
   16ee4:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        ClPrintChecking nCommand = static_cast<ClPrintChecking>((uint16_t)(code_value()*10) - 8620u);
        switch(nCommand)
               {
               case ClPrintChecking::_Nozzle:     // ~ .1
                    uint16_t nDiameter;
                    if(code_seen('P'))
   16ee8:	80 e5       	ldi	r24, 0x50	; 80
   16eea:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   16eee:	88 23       	and	r24, r24
   16ef0:	a9 f0       	breq	.+42     	; 0x16f1c <process_commands() [clone .part.46]+0x4f64>
                         {
                         nDiameter=(uint16_t)(code_value()*1000.0+0.5); // [,um]
   16ef2:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   16ef6:	20 e0       	ldi	r18, 0x00	; 0
   16ef8:	30 e0       	ldi	r19, 0x00	; 0
   16efa:	4a e7       	ldi	r20, 0x7A	; 122
   16efc:	54 e4       	ldi	r21, 0x44	; 68
   16efe:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   16f02:	20 e0       	ldi	r18, 0x00	; 0
   16f04:	30 e0       	ldi	r19, 0x00	; 0
   16f06:	40 e0       	ldi	r20, 0x00	; 0
   16f08:	5f e3       	ldi	r21, 0x3F	; 63
   16f0a:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   16f0e:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
                         nozzle_diameter_check(nDiameter);
   16f12:	cb 01       	movw	r24, r22
   16f14:	0e 94 1e eb 	call	0x1d63c	; 0x1d63c <nozzle_diameter_check(unsigned int)>
   16f18:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
                         }
                    else if(code_seen('Q'))
   16f1c:	81 e5       	ldi	r24, 0x51	; 81
   16f1e:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   16f22:	88 23       	and	r24, r24
   16f24:	11 f4       	brne	.+4      	; 0x16f2a <process_commands() [clone .part.46]+0x4f72>
   16f26:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
                         SERIAL_PROTOCOLLN((float)eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM)/1000.0);
   16f2a:	85 ea       	ldi	r24, 0xA5	; 165
   16f2c:	9d e0       	ldi	r25, 0x0D	; 13
   16f2e:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
   16f32:	bc 01       	movw	r22, r24
   16f34:	90 e0       	ldi	r25, 0x00	; 0
   16f36:	80 e0       	ldi	r24, 0x00	; 0
   16f38:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   16f3c:	20 e0       	ldi	r18, 0x00	; 0
   16f3e:	30 e0       	ldi	r19, 0x00	; 0
   16f40:	4a e7       	ldi	r20, 0x7A	; 122
   16f42:	54 e4       	ldi	r21, 0x44	; 68
   16f44:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   16f48:	0f 94 a2 65 	call	0x2cb44	; 0x2cb44 <MarlinSerial::println(double, int) [clone .constprop.354]>
   16f4c:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
                         uint16_t nPrinterModel;
                         nPrinterModel=(uint16_t)code_value_long();
                         // based on current state of MMU (active/stopped/connecting) perform a runtime update of the printer type
                         printer_model_check(nPrinterModel, type);
                         }
                    else if(code_seen('Q'))
   16f50:	81 e5       	ldi	r24, 0x51	; 81
   16f52:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   16f56:	88 23       	and	r24, r24
   16f58:	11 f4       	brne	.+4      	; 0x16f5e <process_commands() [clone .part.46]+0x4fa6>
   16f5a:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
  print((long) n, base);
}

void MarlinSerial::print(unsigned int n, int base)
{
  print((unsigned long) n, base);
   16f5e:	b8 01       	movw	r22, r16
   16f60:	90 e0       	ldi	r25, 0x00	; 0
   16f62:	80 e0       	ldi	r24, 0x00	; 0
}

void MarlinSerial::print(unsigned long n, int base)
{
  if (base == 0) write(n);
  else printNumber(n, base);
   16f64:	4a e0       	ldi	r20, 0x0A	; 10
   16f66:	0e 94 c5 79 	call	0xf38a	; 0xf38a <MarlinSerial::printNumber(unsigned long, unsigned char)>
}

void MarlinSerial::println(unsigned int n, int base)
{
  print(n, base);
  println();
   16f6a:	0e 94 bc 7a 	call	0xf578	; 0xf578 <MarlinSerial::println()>
   16f6e:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        return pgm_read_word(&_nPrinterType);
    }
}

const char *sPrinterType(bool bMMu) {
    if (bMMu) {
   16f72:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
        return _sPrinterMmuName;
   16f76:	74 e3       	ldi	r23, 0x34	; 52
   16f78:	e7 2e       	mov	r14, r23
   16f7a:	79 e7       	ldi	r23, 0x79	; 121
   16f7c:	f7 2e       	mov	r15, r23
        return pgm_read_word(&_nPrinterType);
    }
}

const char *sPrinterType(bool bMMu) {
    if (bMMu) {
   16f7e:	81 30       	cpi	r24, 0x01	; 1
   16f80:	21 f0       	breq	.+8      	; 0x16f8a <process_commands() [clone .part.46]+0x4fd2>
        return _sPrinterMmuName;
    }
    else {
        return _sPrinterName;
   16f82:	6e e2       	ldi	r22, 0x2E	; 46
   16f84:	e6 2e       	mov	r14, r22
   16f86:	69 e7       	ldi	r22, 0x79	; 121
   16f88:	f6 2e       	mov	r15, r22
                         SERIAL_PROTOCOLLN(type);
               } break;
               case ClPrintChecking::_Smodel: {    // ~ .3
                    const char *type = sPrinterType(MMU2::mmu2.Enabled());
                    if(code_seen('P'))
   16f8a:	80 e5       	ldi	r24, 0x50	; 80
   16f8c:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   16f90:	88 23       	and	r24, r24
   16f92:	b1 f1       	breq	.+108    	; 0x17000 <process_commands() [clone .part.46]+0x5048>
    , found(false)
    {
        const char * pStrEnd = NULL;

        // Start of the string
        this->ptr = strchr(pStr, '"');
   16f94:	62 e2       	ldi	r22, 0x22	; 34
   16f96:	70 e0       	ldi	r23, 0x00	; 0
   16f98:	80 91 bb 04 	lds	r24, 0x04BB	; 0x8004bb <strchr_pointer>
   16f9c:	90 91 bc 04 	lds	r25, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
   16fa0:	0f 94 37 aa 	call	0x3546e	; 0x3546e <strchr>
   16fa4:	8c 01       	movw	r16, r24
        if (!this->ptr) {
   16fa6:	89 2b       	or	r24, r25
   16fa8:	d1 f0       	breq	.+52     	; 0x16fde <process_commands() [clone .part.46]+0x5026>
            // First quote not found
            return;
        }

        // Skip the leading quote
        this->ptr++;
   16faa:	0f 5f       	subi	r16, 0xFF	; 255
   16fac:	1f 4f       	sbci	r17, 0xFF	; 255

        // End of the string
        pStrEnd = strchr(this->ptr, '"');
   16fae:	62 e2       	ldi	r22, 0x22	; 34
   16fb0:	70 e0       	ldi	r23, 0x00	; 0
   16fb2:	c8 01       	movw	r24, r16
   16fb4:	0f 94 37 aa 	call	0x3546e	; 0x3546e <strchr>
        if(!pStrEnd) {
   16fb8:	00 97       	sbiw	r24, 0x00	; 0
   16fba:	89 f0       	breq	.+34     	; 0x16fde <process_commands() [clone .part.46]+0x5026>
            // Second quote not found
            return;
        }
        this->len = pStrEnd - this->ptr;
   16fbc:	d8 2e       	mov	r13, r24
   16fbe:	d0 1a       	sub	r13, r16
   16fc0:	c7 01       	movw	r24, r14
   16fc2:	0f 94 9e a1 	call	0x3433c	; 0x3433c <__strlen_P>
    unquoted_string smodel = unquoted_string(pStrPos);

    if(smodel.WasFound()) {
        const uint8_t compareLength = strlen_P(actualPrinterSModel);

        if(compareLength == smodel.GetLength()) {
   16fc6:	d8 12       	cpse	r13, r24
   16fc8:	0a c0       	rjmp	.+20     	; 0x16fde <process_commands() [clone .part.46]+0x5026>
            if (strncmp_P(smodel.GetUnquotedString(), actualPrinterSModel, compareLength) == 0) return;
   16fca:	ac 01       	movw	r20, r24
   16fcc:	55 27       	eor	r21, r21
   16fce:	b7 01       	movw	r22, r14
   16fd0:	c8 01       	movw	r24, r16
   16fd2:	0f 94 bf a1 	call	0x3437e	; 0x3437e <strncmp_P>
   16fd6:	89 2b       	or	r24, r25
   16fd8:	11 f4       	brne	.+4      	; 0x16fde <process_commands() [clone .part.46]+0x5026>
   16fda:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        }
    }

    render_M862_warnings(
   16fde:	f0 90 ea 03 	lds	r15, 0x03EA	; 0x8003ea <oCheckModel>
   16fe2:	89 e8       	ldi	r24, 0x89	; 137
   16fe4:	97 e3       	ldi	r25, 0x37	; 55
   16fe6:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   16fea:	8c 01       	movw	r16, r24
   16fec:	8b e5       	ldi	r24, 0x5B	; 91
   16fee:	97 e3       	ldi	r25, 0x37	; 55
   16ff0:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   16ff4:	4f 2d       	mov	r20, r15
   16ff6:	b8 01       	movw	r22, r16
   16ff8:	0e 94 df ea 	call	0x1d5be	; 0x1d5be <render_M862_warnings(char const*, char const*, unsigned char) [clone .lto_priv.521]>
   16ffc:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
                    {
                        printer_smodel_check(strchr_pointer, type);
                    }
                    else if(code_seen('Q'))
   17000:	81 e5       	ldi	r24, 0x51	; 81
   17002:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   17006:	88 23       	and	r24, r24
   17008:	11 f4       	brne	.+4      	; 0x1700e <process_commands() [clone .part.46]+0x5056>
   1700a:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
                         SERIAL_PROTOCOLLNRPGM(type);
   1700e:	c7 01       	movw	r24, r14
   17010:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   17014:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
               } break;
               case ClPrintChecking::_Version:    // ~ .4
                    if(code_seen('P'))
   17018:	80 e5       	ldi	r24, 0x50	; 80
   1701a:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   1701e:	88 23       	and	r24, r24
   17020:	09 f4       	brne	.+2      	; 0x17024 <process_commands() [clone .part.46]+0x506c>
   17022:	77 c0       	rjmp	.+238    	; 0x17112 <process_commands() [clone .part.46]+0x515a>
                         fw_version_check(++strchr_pointer);
   17024:	80 91 bb 04 	lds	r24, 0x04BB	; 0x8004bb <strchr_pointer>
   17028:	90 91 bc 04 	lds	r25, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
   1702c:	01 96       	adiw	r24, 0x01	; 1
   1702e:	90 93 bc 04 	sts	0x04BC, r25	; 0x8004bc <strchr_pointer+0x1>
   17032:	80 93 bb 04 	sts	0x04BB, r24	; 0x8004bb <strchr_pointer>
        return ((uint8_t)ClCompareValue::_Less);
    return ((uint8_t)ClCompareValue::_Equal);
}

void fw_version_check(const char *pVersion) {
    if (oCheckVersion == ClCheckMode::_None)
   17036:	20 91 e9 03 	lds	r18, 0x03E9	; 0x8003e9 <oCheckVersion>
   1703a:	22 23       	and	r18, r18
   1703c:	11 f4       	brne	.+4      	; 0x17042 <process_commands() [clone .part.46]+0x508a>
   1703e:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        return;

    uint16_t aVersion[4];
    uint8_t nCompareValueResult;
    parse_version(pVersion, aVersion);
   17042:	be 01       	movw	r22, r28
   17044:	6f 5f       	subi	r22, 0xFF	; 255
   17046:	7f 4f       	sbci	r23, 0xFF	; 255
   17048:	0e 94 9b d9 	call	0x1b336	; 0x1b336 <parse_version(char const*, unsigned int*)>
    nCompareValueResult = mCompareValue(aVersion[0], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_MAJOR)) << 6;
   1704c:	8a e0       	ldi	r24, 0x0A	; 10
   1704e:	90 e0       	ldi	r25, 0x00	; 0
   17050:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
   17054:	29 81       	ldd	r18, Y+1	; 0x01
   17056:	3a 81       	ldd	r19, Y+2	; 0x02
    );
}

uint8_t mCompareValue(uint16_t nX, uint16_t nY) {
    if (nX > nY)
        return ((uint8_t)ClCompareValue::_Greater);
   17058:	12 e0       	ldi	r17, 0x02	; 2
        ,(uint8_t)oCheckModel
    );
}

uint8_t mCompareValue(uint16_t nX, uint16_t nY) {
    if (nX > nY)
   1705a:	82 17       	cp	r24, r18
   1705c:	93 07       	cpc	r25, r19
   1705e:	28 f0       	brcs	.+10     	; 0x1706a <process_commands() [clone .part.46]+0x50b2>
        return ((uint8_t)ClCompareValue::_Greater);
    if (nX < nY)
   17060:	11 e0       	ldi	r17, 0x01	; 1
   17062:	28 17       	cp	r18, r24
   17064:	39 07       	cpc	r19, r25
   17066:	08 f4       	brcc	.+2      	; 0x1706a <process_commands() [clone .part.46]+0x50b2>
   17068:	10 e0       	ldi	r17, 0x00	; 0
        return;

    uint16_t aVersion[4];
    uint8_t nCompareValueResult;
    parse_version(pVersion, aVersion);
    nCompareValueResult = mCompareValue(aVersion[0], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_MAJOR)) << 6;
   1706a:	12 95       	swap	r17
   1706c:	11 0f       	add	r17, r17
   1706e:	11 0f       	add	r17, r17
   17070:	10 7c       	andi	r17, 0xC0	; 192
    nCompareValueResult += mCompareValue(aVersion[1], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_MINOR)) << 4;
   17072:	8c e0       	ldi	r24, 0x0C	; 12
   17074:	90 e0       	ldi	r25, 0x00	; 0
   17076:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
   1707a:	ac 01       	movw	r20, r24
   1707c:	2b 81       	ldd	r18, Y+3	; 0x03
   1707e:	3c 81       	ldd	r19, Y+4	; 0x04
    );
}

uint8_t mCompareValue(uint16_t nX, uint16_t nY) {
    if (nX > nY)
        return ((uint8_t)ClCompareValue::_Greater);
   17080:	82 e0       	ldi	r24, 0x02	; 2
        ,(uint8_t)oCheckModel
    );
}

uint8_t mCompareValue(uint16_t nX, uint16_t nY) {
    if (nX > nY)
   17082:	42 17       	cp	r20, r18
   17084:	53 07       	cpc	r21, r19
   17086:	28 f0       	brcs	.+10     	; 0x17092 <process_commands() [clone .part.46]+0x50da>
        return ((uint8_t)ClCompareValue::_Greater);
    if (nX < nY)
   17088:	81 e0       	ldi	r24, 0x01	; 1
   1708a:	24 17       	cp	r18, r20
   1708c:	35 07       	cpc	r19, r21
   1708e:	08 f4       	brcc	.+2      	; 0x17092 <process_commands() [clone .part.46]+0x50da>
   17090:	80 e0       	ldi	r24, 0x00	; 0

    uint16_t aVersion[4];
    uint8_t nCompareValueResult;
    parse_version(pVersion, aVersion);
    nCompareValueResult = mCompareValue(aVersion[0], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_MAJOR)) << 6;
    nCompareValueResult += mCompareValue(aVersion[1], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_MINOR)) << 4;
   17092:	50 e1       	ldi	r21, 0x10	; 16
   17094:	85 9f       	mul	r24, r21
   17096:	c0 01       	movw	r24, r0
   17098:	11 24       	eor	r1, r1
   1709a:	18 0f       	add	r17, r24
    nCompareValueResult += mCompareValue(aVersion[2], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_REVISION)) << 2;
   1709c:	8e e0       	ldi	r24, 0x0E	; 14
   1709e:	90 e0       	ldi	r25, 0x00	; 0
   170a0:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
   170a4:	ac 01       	movw	r20, r24
   170a6:	2d 81       	ldd	r18, Y+5	; 0x05
   170a8:	3e 81       	ldd	r19, Y+6	; 0x06
    );
}

uint8_t mCompareValue(uint16_t nX, uint16_t nY) {
    if (nX > nY)
        return ((uint8_t)ClCompareValue::_Greater);
   170aa:	82 e0       	ldi	r24, 0x02	; 2
        ,(uint8_t)oCheckModel
    );
}

uint8_t mCompareValue(uint16_t nX, uint16_t nY) {
    if (nX > nY)
   170ac:	42 17       	cp	r20, r18
   170ae:	53 07       	cpc	r21, r19
   170b0:	28 f0       	brcs	.+10     	; 0x170bc <process_commands() [clone .part.46]+0x5104>
        return ((uint8_t)ClCompareValue::_Greater);
    if (nX < nY)
   170b2:	81 e0       	ldi	r24, 0x01	; 1
   170b4:	24 17       	cp	r18, r20
   170b6:	35 07       	cpc	r19, r21
   170b8:	08 f4       	brcc	.+2      	; 0x170bc <process_commands() [clone .part.46]+0x5104>
   170ba:	80 e0       	ldi	r24, 0x00	; 0
    uint16_t aVersion[4];
    uint8_t nCompareValueResult;
    parse_version(pVersion, aVersion);
    nCompareValueResult = mCompareValue(aVersion[0], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_MAJOR)) << 6;
    nCompareValueResult += mCompareValue(aVersion[1], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_MINOR)) << 4;
    nCompareValueResult += mCompareValue(aVersion[2], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_REVISION)) << 2;
   170bc:	a4 e0       	ldi	r26, 0x04	; 4
   170be:	8a 9f       	mul	r24, r26
   170c0:	c0 01       	movw	r24, r0
   170c2:	11 24       	eor	r1, r1
   170c4:	18 0f       	add	r17, r24
    nCompareValueResult += mCompareValue(aVersion[3], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_FLAVOR));
   170c6:	80 e1       	ldi	r24, 0x10	; 16
   170c8:	90 e0       	ldi	r25, 0x00	; 0
   170ca:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
   170ce:	ac 01       	movw	r20, r24
   170d0:	2f 81       	ldd	r18, Y+7	; 0x07
   170d2:	38 85       	ldd	r19, Y+8	; 0x08
    );
}

uint8_t mCompareValue(uint16_t nX, uint16_t nY) {
    if (nX > nY)
        return ((uint8_t)ClCompareValue::_Greater);
   170d4:	92 e0       	ldi	r25, 0x02	; 2
        ,(uint8_t)oCheckModel
    );
}

uint8_t mCompareValue(uint16_t nX, uint16_t nY) {
    if (nX > nY)
   170d6:	42 17       	cp	r20, r18
   170d8:	53 07       	cpc	r21, r19
   170da:	28 f0       	brcs	.+10     	; 0x170e6 <process_commands() [clone .part.46]+0x512e>
        return ((uint8_t)ClCompareValue::_Greater);
    if (nX < nY)
   170dc:	91 e0       	ldi	r25, 0x01	; 1
   170de:	24 17       	cp	r18, r20
   170e0:	35 07       	cpc	r19, r21
   170e2:	08 f4       	brcc	.+2      	; 0x170e6 <process_commands() [clone .part.46]+0x512e>
   170e4:	90 e0       	ldi	r25, 0x00	; 0
    uint8_t nCompareValueResult;
    parse_version(pVersion, aVersion);
    nCompareValueResult = mCompareValue(aVersion[0], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_MAJOR)) << 6;
    nCompareValueResult += mCompareValue(aVersion[1], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_MINOR)) << 4;
    nCompareValueResult += mCompareValue(aVersion[2], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_REVISION)) << 2;
    nCompareValueResult += mCompareValue(aVersion[3], eeprom_read_word((uint16_t *)EEPROM_FIRMWARE_VERSION_FLAVOR));
   170e6:	19 0f       	add	r17, r25
    if (nCompareValueResult <= COMPARE_VALUE_EQUAL)
   170e8:	16 35       	cpi	r17, 0x56	; 86
   170ea:	10 f4       	brcc	.+4      	; 0x170f0 <process_commands() [clone .part.46]+0x5138>
   170ec:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    SERIAL_ECHO(aVersion[2]);
    SERIAL_ECHO('.');
    SERIAL_ECHOLN(aVersion[3]);
*/

    render_M862_warnings(
   170f0:	f0 90 e9 03 	lds	r15, 0x03E9	; 0x8003e9 <oCheckVersion>
   170f4:	89 e1       	ldi	r24, 0x19	; 25
   170f6:	97 e3       	ldi	r25, 0x37	; 55
   170f8:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   170fc:	8c 01       	movw	r16, r24
   170fe:	83 ef       	ldi	r24, 0xF3	; 243
   17100:	96 e3       	ldi	r25, 0x36	; 54
   17102:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   17106:	4f 2d       	mov	r20, r15
   17108:	b8 01       	movw	r22, r16
   1710a:	0e 94 df ea 	call	0x1d5be	; 0x1d5be <render_M862_warnings(char const*, char const*, unsigned char) [clone .lto_priv.521]>
   1710e:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
                    else if(code_seen('Q'))
   17112:	81 e5       	ldi	r24, 0x51	; 81
   17114:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   17118:	88 23       	and	r24, r24
   1711a:	11 f4       	brne	.+4      	; 0x17120 <process_commands() [clone .part.46]+0x5168>
   1711c:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
   17120:	0c 94 c5 9f 	jmp	0x13f8a	; 0x13f8a <process_commands() [clone .part.46]+0x1fd2>
                         {
                         uint16_t nGcodeLevel;
                         nGcodeLevel=(uint16_t)code_value_long();
                         gcode_level_check(nGcodeLevel);
                         }
                    else if(code_seen('Q'))
   17124:	81 e5       	ldi	r24, 0x51	; 81
   17126:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   1712a:	88 23       	and	r24, r24
   1712c:	11 f4       	brne	.+4      	; 0x17132 <process_commands() [clone .part.46]+0x517a>
   1712e:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
                         SERIAL_PROTOCOLLN(GCODE_LEVEL);
   17132:	81 e0       	ldi	r24, 0x01	; 1
   17134:	90 e0       	ldi	r25, 0x00	; 0
   17136:	0f 94 bf 65 	call	0x2cb7e	; 0x2cb7e <MarlinSerial::println(int, int) [clone .constprop.319]>
   1713a:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    * M900: Set and/or Get advance K factor
    *
    *  K<factor>                  Set advance K factor
    */
inline void gcode_M900() {
    float newK = code_seen('K') ? code_value() : -2;
   1713e:	8b e4       	ldi	r24, 0x4B	; 75
   17140:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   17144:	c1 2c       	mov	r12, r1
   17146:	d1 2c       	mov	r13, r1
   17148:	e1 2c       	mov	r14, r1
   1714a:	50 ec       	ldi	r21, 0xC0	; 192
   1714c:	f5 2e       	mov	r15, r21
   1714e:	88 23       	and	r24, r24
   17150:	49 f1       	breq	.+82     	; 0x171a4 <process_commands() [clone .part.46]+0x51ec>
   17152:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   17156:	6b 01       	movw	r12, r22
   17158:	7c 01       	movw	r14, r24
    if (newK >= 0 && newK < LA_K_MAX)
        extruder_advance_K = newK;
    else
        SERIAL_ECHOLNPGM("K out of allowed range!");
#else
    if (newK == 0)
   1715a:	20 e0       	ldi	r18, 0x00	; 0
   1715c:	30 e0       	ldi	r19, 0x00	; 0
   1715e:	a9 01       	movw	r20, r18
   17160:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   17164:	81 11       	cpse	r24, r1
   17166:	1e c0       	rjmp	.+60     	; 0x171a4 <process_commands() [clone .part.46]+0x51ec>
    {
        extruder_advance_K = 0;
   17168:	10 92 a7 04 	sts	0x04A7, r1	; 0x8004a7 <extruder_advance_K>
   1716c:	10 92 a8 04 	sts	0x04A8, r1	; 0x8004a8 <extruder_advance_K+0x1>
   17170:	10 92 a9 04 	sts	0x04A9, r1	; 0x8004a9 <extruder_advance_K+0x2>
   17174:	10 92 aa 04 	sts	0x04AA, r1	; 0x8004aa <extruder_advance_K+0x3>
   17178:	0e 94 04 86 	call	0x10c08	; 0x10c08 <la10c_mode_change(LA10C_MODE)>
        else
            extruder_advance_K = newK;
    }
#endif

    SERIAL_ECHO_START;
   1717c:	8e ec       	ldi	r24, 0xCE	; 206
   1717e:	91 ea       	ldi	r25, 0xA1	; 161
   17180:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    SERIAL_ECHOPGM("Advance K=");
   17184:	8b e0       	ldi	r24, 0x0B	; 11
   17186:	99 e7       	ldi	r25, 0x79	; 121
   17188:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    SERIAL_ECHOLN(extruder_advance_K);
   1718c:	60 91 a7 04 	lds	r22, 0x04A7	; 0x8004a7 <extruder_advance_K>
   17190:	70 91 a8 04 	lds	r23, 0x04A8	; 0x8004a8 <extruder_advance_K+0x1>
   17194:	80 91 a9 04 	lds	r24, 0x04A9	; 0x8004a9 <extruder_advance_K+0x2>
   17198:	90 91 aa 04 	lds	r25, 0x04AA	; 0x8004aa <extruder_advance_K+0x3>
   1719c:	0f 94 a2 65 	call	0x2cb44	; 0x2cb44 <MarlinSerial::println(double, int) [clone .constprop.354]>
   171a0:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
}


float la10c_value(float k)
{
    if(la10c_mode == LA10C_UNKNOWN)
   171a4:	80 91 43 03 	lds	r24, 0x0343	; 0x800343 <la10c_mode>
   171a8:	81 11       	cpse	r24, r1
   171aa:	1b c0       	rjmp	.+54     	; 0x171e2 <process_commands() [clone .part.46]+0x522a>
    {
        // do not autodetect until a valid value is seen
        if(k == 0)
            return 0;
        else if(k < 0)
   171ac:	20 e0       	ldi	r18, 0x00	; 0
   171ae:	30 e0       	ldi	r19, 0x00	; 0
   171b0:	a9 01       	movw	r20, r18
   171b2:	c7 01       	movw	r24, r14
   171b4:	b6 01       	movw	r22, r12
   171b6:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   171ba:	87 ff       	sbrs	r24, 7
   171bc:	05 c0       	rjmp	.+10     	; 0x171c8 <process_commands() [clone .part.46]+0x5210>
    }
    else
    {
        newK = la10c_value(newK);
        if (newK < 0)
            SERIAL_ECHOLNPGM("K out of allowed range!");
   171be:	86 e1       	ldi	r24, 0x16	; 22
   171c0:	99 e7       	ldi	r25, 0x79	; 121
   171c2:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   171c6:	da cf       	rjmp	.-76     	; 0x1717c <process_commands() [clone .part.46]+0x51c4>
            return -1;

        la10c_mode_change(k < LA_LA10_MIN? LA10C_LA15: LA10C_LA10);
   171c8:	20 e0       	ldi	r18, 0x00	; 0
   171ca:	30 e0       	ldi	r19, 0x00	; 0
   171cc:	40 e2       	ldi	r20, 0x20	; 32
   171ce:	51 e4       	ldi	r21, 0x41	; 65
   171d0:	c7 01       	movw	r24, r14
   171d2:	b6 01       	movw	r22, r12
   171d4:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   171d8:	87 ff       	sbrs	r24, 7
   171da:	2c c0       	rjmp	.+88     	; 0x17234 <process_commands() [clone .part.46]+0x527c>
   171dc:	81 e0       	ldi	r24, 0x01	; 1
   171de:	0e 94 04 86 	call	0x10c08	; 0x10c08 <la10c_mode_change(LA10C_MODE)>
    }

    if(la10c_mode == LA10C_LA15)
   171e2:	80 91 43 03 	lds	r24, 0x0343	; 0x800343 <la10c_mode>
        return (k >= 0 && k < LA_K_MAX? k: -1);
   171e6:	20 e0       	ldi	r18, 0x00	; 0
   171e8:	30 e0       	ldi	r19, 0x00	; 0
   171ea:	a9 01       	movw	r20, r18
            return -1;

        la10c_mode_change(k < LA_LA10_MIN? LA10C_LA15: LA10C_LA10);
    }

    if(la10c_mode == LA10C_LA15)
   171ec:	81 30       	cpi	r24, 0x01	; 1
   171ee:	21 f5       	brne	.+72     	; 0x17238 <process_commands() [clone .part.46]+0x5280>
        return (k >= 0 && k < LA_K_MAX? k: -1);
   171f0:	c7 01       	movw	r24, r14
   171f2:	b6 01       	movw	r22, r12
   171f4:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   171f8:	87 fd       	sbrc	r24, 7
   171fa:	e1 cf       	rjmp	.-62     	; 0x171be <process_commands() [clone .part.46]+0x5206>
   171fc:	20 e0       	ldi	r18, 0x00	; 0
   171fe:	30 e0       	ldi	r19, 0x00	; 0
   17200:	40 e2       	ldi	r20, 0x20	; 32
   17202:	51 e4       	ldi	r21, 0x41	; 65
   17204:	c7 01       	movw	r24, r14
   17206:	b6 01       	movw	r22, r12
   17208:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   1720c:	87 ff       	sbrs	r24, 7
   1720e:	d7 cf       	rjmp	.-82     	; 0x171be <process_commands() [clone .part.46]+0x5206>
        la10c_reset();
    }
    else
    {
        newK = la10c_value(newK);
        if (newK < 0)
   17210:	20 e0       	ldi	r18, 0x00	; 0
   17212:	30 e0       	ldi	r19, 0x00	; 0
   17214:	a9 01       	movw	r20, r18
   17216:	c7 01       	movw	r24, r14
   17218:	b6 01       	movw	r22, r12
   1721a:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   1721e:	87 fd       	sbrc	r24, 7
   17220:	ce cf       	rjmp	.-100    	; 0x171be <process_commands() [clone .part.46]+0x5206>
            SERIAL_ECHOLNPGM("K out of allowed range!");
        else
            extruder_advance_K = newK;
   17222:	c0 92 a7 04 	sts	0x04A7, r12	; 0x8004a7 <extruder_advance_K>
   17226:	d0 92 a8 04 	sts	0x04A8, r13	; 0x8004a8 <extruder_advance_K+0x1>
   1722a:	e0 92 a9 04 	sts	0x04A9, r14	; 0x8004a9 <extruder_advance_K+0x2>
   1722e:	f0 92 aa 04 	sts	0x04AA, r15	; 0x8004aa <extruder_advance_K+0x3>
   17232:	a4 cf       	rjmp	.-184    	; 0x1717c <process_commands() [clone .part.46]+0x51c4>
        if(k == 0)
            return 0;
        else if(k < 0)
            return -1;

        la10c_mode_change(k < LA_LA10_MIN? LA10C_LA15: LA10C_LA10);
   17234:	82 e0       	ldi	r24, 0x02	; 2
   17236:	d3 cf       	rjmp	.-90     	; 0x171de <process_commands() [clone .part.46]+0x5226>
    }

    if(la10c_mode == LA10C_LA15)
        return (k >= 0 && k < LA_K_MAX? k: -1);
    else
        return (k >= 0? la10c_convert(k): -1);
   17238:	c7 01       	movw	r24, r14
   1723a:	b6 01       	movw	r22, r12
   1723c:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   17240:	87 fd       	sbrc	r24, 7
   17242:	bd cf       	rjmp	.-134    	; 0x171be <process_commands() [clone .part.46]+0x5206>


// Approximate a LA10 value to a LA15 equivalent.
static float la10c_convert(float k)
{
    float new_K = k * 0.002 - 0.01;
   17244:	2f e6       	ldi	r18, 0x6F	; 111
   17246:	32 e1       	ldi	r19, 0x12	; 18
   17248:	43 e0       	ldi	r20, 0x03	; 3
   1724a:	5b e3       	ldi	r21, 0x3B	; 59
   1724c:	c7 01       	movw	r24, r14
   1724e:	b6 01       	movw	r22, r12
   17250:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   17254:	2a e0       	ldi	r18, 0x0A	; 10
   17256:	37 ed       	ldi	r19, 0xD7	; 215
   17258:	43 e2       	ldi	r20, 0x23	; 35
   1725a:	5c e3       	ldi	r21, 0x3C	; 60
   1725c:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   17260:	6b 01       	movw	r12, r22
   17262:	7c 01       	movw	r14, r24
    return new_K < 0? 0:
   17264:	20 e0       	ldi	r18, 0x00	; 0
   17266:	30 e0       	ldi	r19, 0x00	; 0
   17268:	a9 01       	movw	r20, r18
   1726a:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   1726e:	87 fd       	sbrc	r24, 7
   17270:	11 c0       	rjmp	.+34     	; 0x17294 <process_commands() [clone .part.46]+0x52dc>
           new_K > (LA_K_MAX - FLT_EPSILON)? (LA_K_MAX - FLT_EPSILON):
   17272:	20 e0       	ldi	r18, 0x00	; 0
   17274:	30 e0       	ldi	r19, 0x00	; 0
   17276:	40 e2       	ldi	r20, 0x20	; 32
   17278:	51 e4       	ldi	r21, 0x41	; 65
   1727a:	c7 01       	movw	r24, r14
   1727c:	b6 01       	movw	r22, r12
   1727e:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   17282:	18 16       	cp	r1, r24
   17284:	2c f6       	brge	.-118    	; 0x17210 <process_commands() [clone .part.46]+0x5258>
   17286:	c1 2c       	mov	r12, r1
   17288:	d1 2c       	mov	r13, r1
   1728a:	40 e2       	ldi	r20, 0x20	; 32
   1728c:	e4 2e       	mov	r14, r20
   1728e:	41 e4       	ldi	r20, 0x41	; 65
   17290:	f4 2e       	mov	r15, r20
   17292:	c7 cf       	rjmp	.-114    	; 0x17222 <process_commands() [clone .part.46]+0x526a>

// Approximate a LA10 value to a LA15 equivalent.
static float la10c_convert(float k)
{
    float new_K = k * 0.002 - 0.01;
    return new_K < 0? 0:
   17294:	c1 2c       	mov	r12, r1
   17296:	d1 2c       	mov	r13, r1
   17298:	76 01       	movw	r14, r12
   1729a:	c3 cf       	rjmp	.-122    	; 0x17222 <process_commands() [clone .part.46]+0x526a>
			}
		}
		reset_acceleration_rates();
	#else //TMC2130
      #if defined(X_MS1_PIN) && X_MS1_PIN > -1
        if(code_seen('S')) for(int i=0;i<=4;i++) microstep_mode(i,code_value());
   1729c:	83 e5       	ldi	r24, 0x53	; 83
   1729e:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   172a2:	88 23       	and	r24, r24
   172a4:	59 f0       	breq	.+22     	; 0x172bc <process_commands() [clone .part.46]+0x5304>
   172a6:	10 e0       	ldi	r17, 0x00	; 0
   172a8:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   172ac:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   172b0:	81 2f       	mov	r24, r17
   172b2:	0f 94 47 1a 	call	0x2348e	; 0x2348e <microstep_mode(unsigned char, unsigned char)>
   172b6:	1f 5f       	subi	r17, 0xFF	; 255
   172b8:	15 30       	cpi	r17, 0x05	; 5
   172ba:	b1 f7       	brne	.-20     	; 0x172a8 <process_commands() [clone .part.46]+0x52f0>
   172bc:	34 ec       	ldi	r19, 0xC4	; 196
   172be:	e3 2e       	mov	r14, r19
   172c0:	32 e0       	ldi	r19, 0x02	; 2
   172c2:	f3 2e       	mov	r15, r19
   172c4:	10 e0       	ldi	r17, 0x00	; 0
        for(int i=0;i<NUM_AXIS;i++) if(code_seen(axis_codes[i])) microstep_mode(i,(uint8_t)code_value());
   172c6:	f7 01       	movw	r30, r14
   172c8:	81 91       	ld	r24, Z+
   172ca:	7f 01       	movw	r14, r30
   172cc:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   172d0:	88 23       	and	r24, r24
   172d2:	39 f0       	breq	.+14     	; 0x172e2 <process_commands() [clone .part.46]+0x532a>
   172d4:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   172d8:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   172dc:	81 2f       	mov	r24, r17
   172de:	0f 94 47 1a 	call	0x2348e	; 0x2348e <microstep_mode(unsigned char, unsigned char)>
   172e2:	1f 5f       	subi	r17, 0xFF	; 255
   172e4:	14 30       	cpi	r17, 0x04	; 4
   172e6:	79 f7       	brne	.-34     	; 0x172c6 <process_commands() [clone .part.46]+0x530e>
        if(code_seen('B')) microstep_mode(4,code_value());
   172e8:	82 e4       	ldi	r24, 0x42	; 66
   172ea:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   172ee:	88 23       	and	r24, r24
   172f0:	39 f0       	breq	.+14     	; 0x17300 <process_commands() [clone .part.46]+0x5348>
   172f2:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   172f6:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   172fa:	84 e0       	ldi	r24, 0x04	; 4
   172fc:	0f 94 47 1a 	call	0x2348e	; 0x2348e <microstep_mode(unsigned char, unsigned char)>
        microstep_readings();
   17300:	0f 94 6d 19 	call	0x232da	; 0x232da <microstep_readings()>
   17304:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
   17308:	24 ec       	ldi	r18, 0xC4	; 196
   1730a:	e2 2e       	mov	r14, r18
   1730c:	22 e0       	ldi	r18, 0x02	; 2
   1730e:	f2 2e       	mov	r15, r18
    - `B` - new pin value
    */
    case 351:
    {
      #if defined(X_MS1_PIN) && X_MS1_PIN > -1
      if(code_seen('S')) switch((int)code_value())
   17310:	10 e0       	ldi	r17, 0x00	; 0
      {
        case 1:
          for(int i=0;i<NUM_AXIS;i++) if(code_seen(axis_codes[i])) microstep_ms(i,code_value(),-1);
   17312:	d7 01       	movw	r26, r14
   17314:	8d 91       	ld	r24, X+
   17316:	7d 01       	movw	r14, r26
   17318:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   1731c:	88 23       	and	r24, r24
   1731e:	41 f0       	breq	.+16     	; 0x17330 <process_commands() [clone .part.46]+0x5378>
   17320:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   17324:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   17328:	4f ef       	ldi	r20, 0xFF	; 255
   1732a:	81 2f       	mov	r24, r17
   1732c:	0f 94 c8 19 	call	0x23390	; 0x23390 <microstep_ms(unsigned char, signed char, signed char)>
   17330:	1f 5f       	subi	r17, 0xFF	; 255
   17332:	14 30       	cpi	r17, 0x04	; 4
   17334:	71 f7       	brne	.-36     	; 0x17312 <process_commands() [clone .part.46]+0x535a>
          if(code_seen('B')) microstep_ms(4,code_value(),-1);
   17336:	82 e4       	ldi	r24, 0x42	; 66
   17338:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   1733c:	88 23       	and	r24, r24
   1733e:	11 f4       	brne	.+4      	; 0x17344 <process_commands() [clone .part.46]+0x538c>
   17340:	0c 94 44 a2 	jmp	0x14488	; 0x14488 <process_commands() [clone .part.46]+0x24d0>
   17344:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   17348:	0c 94 44 a2 	jmp	0x14488	; 0x14488 <process_commands() [clone .part.46]+0x24d0>
   1734c:	94 ec       	ldi	r25, 0xC4	; 196
   1734e:	e9 2e       	mov	r14, r25
   17350:	92 e0       	ldi	r25, 0x02	; 2
   17352:	f9 2e       	mov	r15, r25
    - `B` - new pin value
    */
    case 351:
    {
      #if defined(X_MS1_PIN) && X_MS1_PIN > -1
      if(code_seen('S')) switch((int)code_value())
   17354:	10 e0       	ldi	r17, 0x00	; 0
        case 1:
          for(int i=0;i<NUM_AXIS;i++) if(code_seen(axis_codes[i])) microstep_ms(i,code_value(),-1);
          if(code_seen('B')) microstep_ms(4,code_value(),-1);
          break;
        case 2:
          for(int i=0;i<NUM_AXIS;i++) if(code_seen(axis_codes[i])) microstep_ms(i,-1,code_value());
   17356:	f7 01       	movw	r30, r14
   17358:	81 91       	ld	r24, Z+
   1735a:	7f 01       	movw	r14, r30
   1735c:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   17360:	88 23       	and	r24, r24
   17362:	49 f0       	breq	.+18     	; 0x17376 <process_commands() [clone .part.46]+0x53be>
   17364:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   17368:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   1736c:	46 2f       	mov	r20, r22
   1736e:	6f ef       	ldi	r22, 0xFF	; 255
   17370:	81 2f       	mov	r24, r17
   17372:	0f 94 c8 19 	call	0x23390	; 0x23390 <microstep_ms(unsigned char, signed char, signed char)>
   17376:	1f 5f       	subi	r17, 0xFF	; 255
   17378:	14 30       	cpi	r17, 0x04	; 4
   1737a:	69 f7       	brne	.-38     	; 0x17356 <process_commands() [clone .part.46]+0x539e>
   1737c:	dc cf       	rjmp	.-72     	; 0x17336 <process_commands() [clone .part.46]+0x537e>
    case 701:
    {
        uint8_t mmuSlotIndex = 0xffU;
        float fastLoadLength = FILAMENTCHANGE_FIRSTFEED; // Only used without MMU
        float z_target = 0;
        if( MMU2::mmu2.Enabled() )
   1737e:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   17382:	81 30       	cpi	r24, 0x01	; 1
   17384:	99 f1       	breq	.+102    	; 0x173ec <process_commands() [clone .part.46]+0x5434>
    - `L` - Extrude distance for insertion (positive value)(manual reload)
    - `Z` - Move the Z axis by this distance. Default value is 0 to maintain backwards compatibility with older gcodes.
    */
    case 701:
    {
        uint8_t mmuSlotIndex = 0xffU;
   17386:	1f ef       	ldi	r17, 0xFF	; 255
            if( code_seen('P') || code_seen('T') ) {
                mmuSlotIndex = code_value_uint8();
            }
        }

        if (code_seen('L')) fastLoadLength = code_value();
   17388:	8c e4       	ldi	r24, 0x4C	; 76
   1738a:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   1738e:	88 23       	and	r24, r24
   17390:	e1 f1       	breq	.+120    	; 0x1740a <process_commands() [clone .part.46]+0x5452>
   17392:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   17396:	6b 01       	movw	r12, r22
   17398:	7c 01       	movw	r14, r24

        // Z lift. For safety only allow positive values
        if (code_seen('Z')) z_target = fabs(code_value());
   1739a:	8a e5       	ldi	r24, 0x5A	; 90
   1739c:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   173a0:	88 23       	and	r24, r24
   173a2:	d1 f1       	breq	.+116    	; 0x17418 <process_commands() [clone .part.46]+0x5460>
   173a4:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   173a8:	9f 77       	andi	r25, 0x7F	; 127
        
        // Raise the Z axis
        float delta = raise_z(z_target);
   173aa:	0e 94 94 6c 	call	0xd928	; 0xd928 <raise_z(float)>
   173ae:	4b 01       	movw	r8, r22
   173b0:	5c 01       	movw	r10, r24

        // Load filament
        gcode_M701(fastLoadLength, mmuSlotIndex, !code_seen('Z')); // if no z -> trigger MIN_Z_FOR_LOAD for backwards compatibility on 3.12 and older FW 
   173b2:	8a e5       	ldi	r24, 0x5A	; 90
   173b4:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   173b8:	08 2f       	mov	r16, r24
    }
    custom_message_type = CustomMsg::Status;
}

void gcode_M701(float fastLoadLength, uint8_t mmuSlotIndex, bool raise_z_axis = false){
    FSensorBlockRunout fsBlockRunout;
   173ba:	0f 94 2b 79 	call	0x2f256	; 0x2f256 <FSensorBlockRunout::FSensorBlockRunout() [clone .constprop.136]>

    prusa_statistics(22);
   173be:	86 e1       	ldi	r24, 0x16	; 22
   173c0:	0f 94 79 32 	call	0x264f2	; 0x264f2 <prusa_statistics(unsigned char)>

    if (MMU2::mmu2.Enabled()) {
   173c4:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   173c8:	81 30       	cpi	r24, 0x01	; 1
   173ca:	51 f5       	brne	.+84     	; 0x17420 <process_commands() [clone .part.46]+0x5468>
        if (mmuSlotIndex < MMU_FILAMENT_COUNT) {
   173cc:	15 30       	cpi	r17, 0x05	; 5
   173ce:	18 f4       	brcc	.+6      	; 0x173d6 <process_commands() [clone .part.46]+0x541e>
          MMU2::mmu2.load_filament_to_nozzle(mmuSlotIndex);
   173d0:	81 2f       	mov	r24, r17
   173d2:	0e 94 37 fe 	call	0x1fc6e	; 0x1fc6e <MMU2::MMU2::load_filament_to_nozzle(unsigned char) [clone .constprop.39]>
        lcd_update(2);
        lcd_setstatuspgm(MSG_WELCOME);
        custom_message_type = CustomMsg::Status;
    }

    eFilamentAction = FilamentAction::None;
   173d6:	10 92 94 03 	sts	0x0394, r1	; 0x800394 <eFilamentAction>
   173da:	0f 94 95 6d 	call	0x2db2a	; 0x2db2a <PAT9125_sensor::settings_init() [clone .constprop.207]>

        // Load filament
        gcode_M701(fastLoadLength, mmuSlotIndex, !code_seen('Z')); // if no z -> trigger MIN_Z_FOR_LOAD for backwards compatibility on 3.12 and older FW 

        // Restore Z axis
        raise_z(-delta);
   173de:	c5 01       	movw	r24, r10
   173e0:	b4 01       	movw	r22, r8
   173e2:	90 58       	subi	r25, 0x80	; 128
   173e4:	0e 94 94 6c 	call	0xd928	; 0xd928 <raise_z(float)>
   173e8:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        uint8_t mmuSlotIndex = 0xffU;
        float fastLoadLength = FILAMENTCHANGE_FIRSTFEED; // Only used without MMU
        float z_target = 0;
        if( MMU2::mmu2.Enabled() )
        {
            if( code_seen('P') || code_seen('T') ) {
   173ec:	80 e5       	ldi	r24, 0x50	; 80
   173ee:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   173f2:	88 23       	and	r24, r24
   173f4:	21 f0       	breq	.+8      	; 0x173fe <process_commands() [clone .part.46]+0x5446>
                mmuSlotIndex = code_value_uint8();
   173f6:	0e 94 0a 56 	call	0xac14	; 0xac14 <code_value_uint8()>
   173fa:	18 2f       	mov	r17, r24
   173fc:	c5 cf       	rjmp	.-118    	; 0x17388 <process_commands() [clone .part.46]+0x53d0>
        uint8_t mmuSlotIndex = 0xffU;
        float fastLoadLength = FILAMENTCHANGE_FIRSTFEED; // Only used without MMU
        float z_target = 0;
        if( MMU2::mmu2.Enabled() )
        {
            if( code_seen('P') || code_seen('T') ) {
   173fe:	84 e5       	ldi	r24, 0x54	; 84
   17400:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   17404:	81 11       	cpse	r24, r1
   17406:	f7 cf       	rjmp	.-18     	; 0x173f6 <process_commands() [clone .part.46]+0x543e>
   17408:	be cf       	rjmp	.-132    	; 0x17386 <process_commands() [clone .part.46]+0x53ce>
    - `Z` - Move the Z axis by this distance. Default value is 0 to maintain backwards compatibility with older gcodes.
    */
    case 701:
    {
        uint8_t mmuSlotIndex = 0xffU;
        float fastLoadLength = FILAMENTCHANGE_FIRSTFEED; // Only used without MMU
   1740a:	c1 2c       	mov	r12, r1
   1740c:	d1 2c       	mov	r13, r1
   1740e:	8c e8       	ldi	r24, 0x8C	; 140
   17410:	e8 2e       	mov	r14, r24
   17412:	82 e4       	ldi	r24, 0x42	; 66
   17414:	f8 2e       	mov	r15, r24
   17416:	c1 cf       	rjmp	.-126    	; 0x1739a <process_commands() [clone .part.46]+0x53e2>
        float z_target = 0;
   17418:	60 e0       	ldi	r22, 0x00	; 0
   1741a:	70 e0       	ldi	r23, 0x00	; 0
   1741c:	cb 01       	movw	r24, r22
   1741e:	c5 cf       	rjmp	.-118    	; 0x173aa <process_commands() [clone .part.46]+0x53f2>
    if (MMU2::mmu2.Enabled()) {
        if (mmuSlotIndex < MMU_FILAMENT_COUNT) {
          MMU2::mmu2.load_filament_to_nozzle(mmuSlotIndex);
        } // else do nothing
    } else {
        custom_message_type = CustomMsg::FilamentLoading;
   17420:	82 e0       	ldi	r24, 0x02	; 2
   17422:	80 93 5d 06 	sts	0x065D, r24	; 0x80065d <custom_message_type>
        lcd_setstatuspgm(_T(MSG_LOADING_FILAMENT));
   17426:	8d ee       	ldi	r24, 0xED	; 237
   17428:	91 e6       	ldi	r25, 0x61	; 97
   1742a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1742e:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>

        current_position[E_AXIS] += fastLoadLength;
   17432:	a7 01       	movw	r20, r14
   17434:	96 01       	movw	r18, r12
   17436:	60 91 6d 12 	lds	r22, 0x126D	; 0x80126d <current_position+0xc>
   1743a:	70 91 6e 12 	lds	r23, 0x126E	; 0x80126e <current_position+0xd>
   1743e:	80 91 6f 12 	lds	r24, 0x126F	; 0x80126f <current_position+0xe>
   17442:	90 91 70 12 	lds	r25, 0x1270	; 0x801270 <current_position+0xf>
   17446:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   1744a:	60 93 6d 12 	sts	0x126D, r22	; 0x80126d <current_position+0xc>
   1744e:	70 93 6e 12 	sts	0x126E, r23	; 0x80126e <current_position+0xd>
   17452:	80 93 6f 12 	sts	0x126F, r24	; 0x80126f <current_position+0xe>
   17456:	90 93 70 12 	sts	0x1270, r25	; 0x801270 <current_position+0xf>
        plan_buffer_line_curposXYZE(FILAMENTCHANGE_EFEED_FIRST); //fast sequence
   1745a:	60 e0       	ldi	r22, 0x00	; 0
   1745c:	70 e0       	ldi	r23, 0x00	; 0
   1745e:	80 ea       	ldi	r24, 0xA0	; 160
   17460:	91 e4       	ldi	r25, 0x41	; 65
   17462:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>

        if (raise_z_axis) { // backwards compatibility for 3.12 and older FW
   17466:	01 11       	cpse	r16, r1
   17468:	06 c0       	rjmp	.+12     	; 0x17476 <process_commands() [clone .part.46]+0x54be>
          raise_z_above(MIN_Z_FOR_LOAD);
   1746a:	60 e0       	ldi	r22, 0x00	; 0
   1746c:	70 e0       	ldi	r23, 0x00	; 0
   1746e:	8c e0       	ldi	r24, 0x0C	; 12
   17470:	92 e4       	ldi	r25, 0x42	; 66
   17472:	0e 94 f6 6c 	call	0xd9ec	; 0xd9ec <raise_z_above(float)>
        }

        load_filament_final_feed(); // slow sequence
   17476:	0e 94 ed 63 	call	0xc7da	; 0xc7da <load_filament_final_feed()>
        st_synchronize();
   1747a:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>

        Sound_MakeCustom(50, 500, false);
   1747e:	40 e0       	ldi	r20, 0x00	; 0
   17480:	64 ef       	ldi	r22, 0xF4	; 244
   17482:	71 e0       	ldi	r23, 0x01	; 1
   17484:	82 e3       	ldi	r24, 0x32	; 50
   17486:	90 e0       	ldi	r25, 0x00	; 0
   17488:	0f 94 be 27 	call	0x24f7c	; 0x24f7c <Sound_MakeCustom(unsigned int, unsigned int, bool)>

        if (!farm_mode && (eFilamentAction != FilamentAction::None)) {
   1748c:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   17490:	81 11       	cpse	r24, r1
   17492:	05 c0       	rjmp	.+10     	; 0x1749e <process_commands() [clone .part.46]+0x54e6>
   17494:	80 91 94 03 	lds	r24, 0x0394	; 0x800394 <eFilamentAction>
   17498:	81 11       	cpse	r24, r1
            lcd_load_filament_color_check();
   1749a:	0f 94 07 1b 	call	0x2360e	; 0x2360e <lcd_load_filament_color_check()>
        #ifdef COMMUNITY_PREVENT_OOZE
        // Retract filament to prevent oozing
        retract_for_ooze_prevention();
        #endif //COMMUNITY_PREVENT_OOZE

        lcd_update_enable(true);
   1749e:	81 e0       	ldi	r24, 0x01	; 1
   174a0:	0e 94 38 70 	call	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>
        lcd_update(2);
   174a4:	82 e0       	ldi	r24, 0x02	; 2
   174a6:	0e 94 f9 6e 	call	0xddf2	; 0xddf2 <lcd_update(unsigned char)>
        lcd_setstatuspgm(MSG_WELCOME);
   174aa:	86 ee       	ldi	r24, 0xE6	; 230
   174ac:	9b e6       	ldi	r25, 0x6B	; 107
   174ae:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
        custom_message_type = CustomMsg::Status;
   174b2:	10 92 5d 06 	sts	0x065D, r1	; 0x80065d <custom_message_type>
   174b6:	8f cf       	rjmp	.-226    	; 0x173d6 <process_commands() [clone .part.46]+0x541e>
    */
    case 702:
    {
        float z_target = 0;
        float unloadLength = FILAMENTCHANGE_FINALRETRACT;
        if (code_seen('U')) unloadLength = code_value();
   174b8:	85 e5       	ldi	r24, 0x55	; 85
   174ba:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
    - `Z` - Move the Z axis by this distance. Default value is 0 to maintain backwards compatibility with older gcodes.
    */
    case 702:
    {
        float z_target = 0;
        float unloadLength = FILAMENTCHANGE_FINALRETRACT;
   174be:	c1 2c       	mov	r12, r1
   174c0:	d1 2c       	mov	r13, r1
   174c2:	76 01       	movw	r14, r12
        if (code_seen('U')) unloadLength = code_value();
   174c4:	88 23       	and	r24, r24
   174c6:	21 f0       	breq	.+8      	; 0x174d0 <process_commands() [clone .part.46]+0x5518>
   174c8:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   174cc:	6b 01       	movw	r12, r22
   174ce:	7c 01       	movw	r14, r24

        // For safety only allow positive values
        if (code_seen('Z')) z_target = fabs(code_value());
   174d0:	8a e5       	ldi	r24, 0x5A	; 90
   174d2:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   174d6:	88 23       	and	r24, r24
   174d8:	a1 f0       	breq	.+40     	; 0x17502 <process_commands() [clone .part.46]+0x554a>
   174da:	0e 94 85 5a 	call	0xb50a	; 0xb50a <code_value() [clone .lto_priv.509]>
   174de:	9f 77       	andi	r25, 0x7F	; 127
        else raise_z_above(MIN_Z_FOR_UNLOAD); // backwards compatibility for 3.12 and older FW

        // Raise the Z axis
        float delta = raise_z(z_target);
   174e0:	0e 94 94 6c 	call	0xd928	; 0xd928 <raise_z(float)>
   174e4:	4b 01       	movw	r8, r22
   174e6:	5c 01       	movw	r10, r24

        // Unload filament
        if (MMU2::mmu2.Enabled())  MMU2::mmu2.unload();
   174e8:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   174ec:	81 30       	cpi	r24, 0x01	; 1
   174ee:	99 f4       	brne	.+38     	; 0x17516 <process_commands() [clone .part.46]+0x555e>
   174f0:	0f 94 71 9d 	call	0x33ae2	; 0x33ae2 <MMU2::MMU2::unload() [clone .constprop.105]>
        else unload_filament(unloadLength);

        // Restore Z axis
        raise_z(-delta);
   174f4:	c5 01       	movw	r24, r10
   174f6:	b4 01       	movw	r22, r8
   174f8:	90 58       	subi	r25, 0x80	; 128
   174fa:	0e 94 94 6c 	call	0xd928	; 0xd928 <raise_z(float)>
   174fe:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        float unloadLength = FILAMENTCHANGE_FINALRETRACT;
        if (code_seen('U')) unloadLength = code_value();

        // For safety only allow positive values
        if (code_seen('Z')) z_target = fabs(code_value());
        else raise_z_above(MIN_Z_FOR_UNLOAD); // backwards compatibility for 3.12 and older FW
   17502:	60 e0       	ldi	r22, 0x00	; 0
   17504:	70 e0       	ldi	r23, 0x00	; 0
   17506:	8c e0       	ldi	r24, 0x0C	; 12
   17508:	92 e4       	ldi	r25, 0x42	; 66
   1750a:	0e 94 f6 6c 	call	0xd9ec	; 0xd9ec <raise_z_above(float)>
    - `U` - Retract distance for removal (manual reload). Default value is FILAMENTCHANGE_FINALRETRACT.
    - `Z` - Move the Z axis by this distance. Default value is 0 to maintain backwards compatibility with older gcodes.
    */
    case 702:
    {
        float z_target = 0;
   1750e:	60 e0       	ldi	r22, 0x00	; 0
   17510:	70 e0       	ldi	r23, 0x00	; 0
   17512:	cb 01       	movw	r24, r22
   17514:	e5 cf       	rjmp	.-54     	; 0x174e0 <process_commands() [clone .part.46]+0x5528>
        // Raise the Z axis
        float delta = raise_z(z_target);

        // Unload filament
        if (MMU2::mmu2.Enabled())  MMU2::mmu2.unload();
        else unload_filament(unloadLength);
   17516:	c7 01       	movw	r24, r14
   17518:	b6 01       	movw	r22, r12
   1751a:	0e 94 7e e3 	call	0x1c6fc	; 0x1c6fc <unload_filament(float)>
   1751e:	ea cf       	rjmp	.-44     	; 0x174f4 <process_commands() [clone .part.46]+0x553c>
    #### Parameters
    - `P` - n index of slot (zero based, so 0-4 like T0 and T4)
    */
    case 704:
    {
        gcodes_M704_M705_M706(704);
   17520:	80 ec       	ldi	r24, 0xC0	; 192
   17522:	92 e0       	ldi	r25, 0x02	; 2
   17524:	0e 94 4b 5a 	call	0xb496	; 0xb496 <gcodes_M704_M705_M706(unsigned int)>
   17528:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    #### Parameters
    - `P` - n index of slot (zero based, so 0-4 like T0 and T4)
    */
    case 705:
    {
        gcodes_M704_M705_M706(705);
   1752c:	81 ec       	ldi	r24, 0xC1	; 193
   1752e:	92 e0       	ldi	r25, 0x02	; 2
   17530:	0e 94 4b 5a 	call	0xb496	; 0xb496 <gcodes_M704_M705_M706(unsigned int)>
   17534:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    M707 A0x1b - Read a 8bit integer from register 0x1b and prints the result onto the serial line.

    Does nothing if the A parameter is not present or if MMU is not enabled.
    */
    case 707: {
        if ( MMU2::mmu2.Enabled() ) {
   17538:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   1753c:	81 30       	cpi	r24, 0x01	; 1
   1753e:	11 f0       	breq	.+4      	; 0x17544 <process_commands() [clone .part.46]+0x558c>
   17540:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
            if( code_seen('A') ) {
   17544:	81 e4       	ldi	r24, 0x41	; 65
   17546:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   1754a:	88 23       	and	r24, r24
   1754c:	11 f4       	brne	.+4      	; 0x17552 <process_commands() [clone .part.46]+0x559a>
   1754e:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
                MMU2::mmu2.ReadRegister(uint8_t(strtol(strchr_pointer+1, NULL, 16)));
   17552:	80 91 bb 04 	lds	r24, 0x04BB	; 0x8004bb <strchr_pointer>
   17556:	90 91 bc 04 	lds	r25, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
   1755a:	40 e1       	ldi	r20, 0x10	; 16
   1755c:	50 e0       	ldi	r21, 0x00	; 0
   1755e:	70 e0       	ldi	r23, 0x00	; 0
   17560:	60 e0       	ldi	r22, 0x00	; 0
   17562:	01 96       	adiw	r24, 0x01	; 1
   17564:	0f 94 6b 9f 	call	0x33ed6	; 0x33ed6 <strtol>
   17568:	86 2f       	mov	r24, r22
   1756a:	0e 94 03 ff 	call	0x1fe06	; 0x1fe06 <MMU2::MMU2::ReadRegister(unsigned char) [clone .constprop.30]>
   1756e:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
    M708 A0x1b X05 - Write to register 0x1b the value 05.

    Does nothing if A parameter is missing or if MMU is not enabled.
    */
    case 708: {
        if ( MMU2::mmu2.Enabled() ){
   17572:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   17576:	81 30       	cpi	r24, 0x01	; 1
   17578:	11 f0       	breq	.+4      	; 0x1757e <process_commands() [clone .part.46]+0x55c6>
   1757a:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
            uint8_t addr = 0;
            if( code_seen('A') ) {
   1757e:	81 e4       	ldi	r24, 0x41	; 65
   17580:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>

    Does nothing if A parameter is missing or if MMU is not enabled.
    */
    case 708: {
        if ( MMU2::mmu2.Enabled() ){
            uint8_t addr = 0;
   17584:	10 e0       	ldi	r17, 0x00	; 0
            if( code_seen('A') ) {
   17586:	88 23       	and	r24, r24
   17588:	61 f0       	breq	.+24     	; 0x175a2 <process_commands() [clone .part.46]+0x55ea>
                addr = uint8_t(strtol(strchr_pointer+1, NULL, 16));
   1758a:	80 91 bb 04 	lds	r24, 0x04BB	; 0x8004bb <strchr_pointer>
   1758e:	90 91 bc 04 	lds	r25, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
   17592:	40 e1       	ldi	r20, 0x10	; 16
   17594:	50 e0       	ldi	r21, 0x00	; 0
   17596:	70 e0       	ldi	r23, 0x00	; 0
   17598:	60 e0       	ldi	r22, 0x00	; 0
   1759a:	01 96       	adiw	r24, 0x01	; 1
   1759c:	0f 94 6b 9f 	call	0x33ed6	; 0x33ed6 <strtol>
   175a0:	16 2f       	mov	r17, r22
            }
            uint16_t data = 0;
            if( code_seen('X') ) {
   175a2:	88 e5       	ldi	r24, 0x58	; 88
   175a4:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   175a8:	88 23       	and	r24, r24
   175aa:	61 f0       	breq	.+24     	; 0x175c4 <process_commands() [clone .part.46]+0x560c>
                data = code_value_short();
   175ac:	0e 94 17 56 	call	0xac2e	; 0xac2e <code_value_short() [clone .lto_priv.505]>
            }
            if(addr){
   175b0:	11 23       	and	r17, r17
   175b2:	11 f4       	brne	.+4      	; 0x175b8 <process_commands() [clone .part.46]+0x5600>
   175b4:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
                MMU2::mmu2.WriteRegister(addr, data);
   175b8:	bc 01       	movw	r22, r24
   175ba:	81 2f       	mov	r24, r17
   175bc:	0e 94 9c d2 	call	0x1a538	; 0x1a538 <MMU2::MMU2::WriteRegister(unsigned char, unsigned int) [clone .constprop.28]>
   175c0:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        if ( MMU2::mmu2.Enabled() ){
            uint8_t addr = 0;
            if( code_seen('A') ) {
                addr = uint8_t(strtol(strchr_pointer+1, NULL, 16));
            }
            uint16_t data = 0;
   175c4:	90 e0       	ldi	r25, 0x00	; 0
   175c6:	80 e0       	ldi	r24, 0x00	; 0
   175c8:	f3 cf       	rjmp	.-26     	; 0x175b0 <process_commands() [clone .part.46]+0x55f8>

    M709    - Serial message if en- or disabled
    */
    case 709:
    {
        if (code_seen('S'))
   175ca:	83 e5       	ldi	r24, 0x53	; 83
   175cc:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   175d0:	88 23       	and	r24, r24
   175d2:	31 f0       	breq	.+12     	; 0x175e0 <process_commands() [clone .part.46]+0x5628>
        {
            switch (code_value_uint8())
   175d4:	0e 94 0a 56 	call	0xac14	; 0xac14 <code_value_uint8()>
   175d8:	88 23       	and	r24, r24
   175da:	a9 f0       	breq	.+42     	; 0x17606 <process_commands() [clone .part.46]+0x564e>
   175dc:	81 30       	cpi	r24, 0x01	; 1
   175de:	f9 f0       	breq	.+62     	; 0x1761e <process_commands() [clone .part.46]+0x5666>
                break;
            default:
                break;
            }
        }
        if (MMU2::mmu2.Enabled() && code_seen('X'))
   175e0:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   175e4:	81 30       	cpi	r24, 0x01	; 1
   175e6:	59 f4       	brne	.+22     	; 0x175fe <process_commands() [clone .part.46]+0x5646>
   175e8:	88 e5       	ldi	r24, 0x58	; 88
   175ea:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   175ee:	88 23       	and	r24, r24
   175f0:	31 f0       	breq	.+12     	; 0x175fe <process_commands() [clone .part.46]+0x5646>
        {
            switch (code_value_uint8())
   175f2:	0e 94 0a 56 	call	0xac14	; 0xac14 <code_value_uint8()>
   175f6:	82 30       	cpi	r24, 0x02	; 2
   175f8:	d0 f0       	brcs	.+52     	; 0x1762e <process_commands() [clone .part.46]+0x5676>
   175fa:	8a 32       	cpi	r24, 0x2A	; 42
   175fc:	e1 f0       	breq	.+56     	; 0x17636 <process_commands() [clone .part.46]+0x567e>
                break;
            default:
                break;
            }
        }
    MMU2::mmu2.Status();
   175fe:	0f 94 ad 65 	call	0x2cb5a	; 0x2cb5a <MMU2::MMU2::Status() [clone .constprop.340]>
   17602:	0c 94 07 a4 	jmp	0x1480e	; 0x1480e <process_commands() [clone .part.46]+0x2856>
        if (previous_value != value) {
            eeprom_byte_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_byte(dst, value);
   17606:	60 e0       	ldi	r22, 0x00	; 0
   17608:	8c ea       	ldi	r24, 0xAC	; 172
   1760a:	9c e0       	ldi	r25, 0x0C	; 12
   1760c:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
    StopKeepPowered();
    PowerOff();
}

void MMU2::StopKeepPowered() {
    state = xState::Stopped;
   17610:	10 92 01 13 	sts	0x1301, r1	; 0x801301 <MMU2::mmu2+0x6f>
    protocol.ResetResponseDecoder(); // important - finished delayed restart relies on this
    StartSeqRestart();
}

void ProtocolLogic::Stop() {
    state = State::Stopped;
   17614:	10 92 af 12 	sts	0x12AF, r1	; 0x8012af <MMU2::mmu2+0x1d>
    currentScope = Scope::Stopped;
   17618:	10 92 94 12 	sts	0x1294, r1	; 0x801294 <MMU2::mmu2+0x2>
   1761c:	e1 cf       	rjmp	.-62     	; 0x175e0 <process_commands() [clone .part.46]+0x5628>
   1761e:	61 e0       	ldi	r22, 0x01	; 1
   17620:	8c ea       	ldi	r24, 0xAC	; 172
   17622:	9c e0       	ldi	r25, 0x0C	; 12
   17624:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
                eeprom_update_byte_notify((uint8_t *)EEPROM_MMU_ENABLED, false);
                MMU2::mmu2.Stop();
                break;
            case 1:
                eeprom_update_byte_notify((uint8_t *)EEPROM_MMU_ENABLED, true);
                MMU2::mmu2.Start();
   17628:	0f 94 80 95 	call	0x32b00	; 0x32b00 <MMU2::MMU2::Start() [clone .constprop.178]>
   1762c:	d9 cf       	rjmp	.-78     	; 0x175e0 <process_commands() [clone .part.46]+0x5628>
        break;
    }
}

void MMU2::ResetX0() {
    logic.ResetMMU(); // Send soft reset
   1762e:	80 e0       	ldi	r24, 0x00	; 0
}

void MMU2::ResetX42() {
    logic.ResetMMU(42);
   17630:	0f 94 43 95 	call	0x32a86	; 0x32a86 <MMU2::ProtocolLogic::ResetMMU(unsigned char) [clone .constprop.326]>
   17634:	e4 cf       	rjmp	.-56     	; 0x175fe <process_commands() [clone .part.46]+0x5646>
   17636:	8a e2       	ldi	r24, 0x2A	; 42
   17638:	fb cf       	rjmp	.-10     	; 0x17630 <process_commands() [clone .part.46]+0x5678>
    T<extruder nr.> - Selects the filament position. A Gcode to load a filament to the nozzle must follow.
    Tx - Printer asks user to select a filament position. Then loads the filament from the MMU unit into the extruder wheels only. G-code to heat up the nozzle follows.
    Tc - Loads the filament tip from the extruder wheels into the nozzle.
    T? - acts the same as Tx followed by Tc
  */
  else if(*CMDBUFFER_CURRENT_STRING == 'T') {
   1763a:	84 35       	cpi	r24, 0x54	; 84
   1763c:	09 f0       	breq	.+2      	; 0x17640 <process_commands() [clone .part.46]+0x5688>
   1763e:	79 c0       	rjmp	.+242    	; 0x17732 <process_commands() [clone .part.46]+0x577a>
        strchr_pointer = CMDBUFFER_CURRENT_STRING;
   17640:	10 93 bc 04 	sts	0x04BC, r17	; 0x8004bc <strchr_pointer+0x1>
   17644:	00 93 bb 04 	sts	0x04BB, r16	; 0x8004bb <strchr_pointer>
        processing_tcode = true;
   17648:	81 e0       	ldi	r24, 0x01	; 1
   1764a:	80 93 91 03 	sts	0x0391, r24	; 0x800391 <processing_tcode>
        TCodes(strchr_pointer, code_value_uint8());
   1764e:	0e 94 0a 56 	call	0xac14	; 0xac14 <code_value_uint8()>
   17652:	18 2f       	mov	r17, r24
   17654:	20 91 bb 04 	lds	r18, 0x04BB	; 0x8004bb <strchr_pointer>
   17658:	30 91 bc 04 	lds	r19, 0x04BC	; 0x8004bc <strchr_pointer+0x1>
inline void TCodeInvalid() {
    SERIAL_ECHOLNPGM("Invalid T code.");
}

void TCodes(char *const strchr_pointer, const uint8_t codeValue) {
    uint8_t index = 1;
   1765c:	91 e0       	ldi	r25, 0x01	; 1
    for ( /*nothing*/ ; strchr_pointer[index] == ' ' || strchr_pointer[index] == '\t'; index++)
   1765e:	79 01       	movw	r14, r18
   17660:	e9 0e       	add	r14, r25
   17662:	f1 1c       	adc	r15, r1
   17664:	d7 01       	movw	r26, r14
   17666:	8c 91       	ld	r24, X
   17668:	80 32       	cpi	r24, 0x20	; 32
   1766a:	11 f0       	breq	.+4      	; 0x17670 <process_commands() [clone .part.46]+0x56b8>
   1766c:	89 30       	cpi	r24, 0x09	; 9
   1766e:	11 f4       	brne	.+4      	; 0x17674 <process_commands() [clone .part.46]+0x56bc>
   17670:	9f 5f       	subi	r25, 0xFF	; 255
   17672:	f5 cf       	rjmp	.-22     	; 0x1765e <process_commands() [clone .part.46]+0x56a6>
        ;

    strchr_pointer[index] = tolower(strchr_pointer[index]);
   17674:	08 2e       	mov	r0, r24
   17676:	00 0c       	add	r0, r0
   17678:	99 0b       	sbc	r25, r25
   1767a:	0f 94 f4 a9 	call	0x353e8	; 0x353e8 <tolower>
   1767e:	f7 01       	movw	r30, r14
   17680:	80 83       	st	Z, r24
#include <stdio.h>

static const char duplicate_Tcode_ignored[] PROGMEM = "Duplicate T-code ignored.";

inline bool IsInvalidTCode(char *const s, uint8_t i) {
    return ((s[i] < '0' || s[i] > '4') && s[i] != '?' && s[i] != 'x' && s[i] != 'c');
   17682:	90 ed       	ldi	r25, 0xD0	; 208
   17684:	98 0f       	add	r25, r24
   17686:	95 30       	cpi	r25, 0x05	; 5
   17688:	58 f0       	brcs	.+22     	; 0x176a0 <process_commands() [clone .part.46]+0x56e8>
   1768a:	8f 33       	cpi	r24, 0x3F	; 63
   1768c:	69 f0       	breq	.+26     	; 0x176a8 <process_commands() [clone .part.46]+0x56f0>
   1768e:	88 37       	cpi	r24, 0x78	; 120
   17690:	59 f0       	breq	.+22     	; 0x176a8 <process_commands() [clone .part.46]+0x56f0>
   17692:	83 36       	cpi	r24, 0x63	; 99
   17694:	01 f1       	breq	.+64     	; 0x176d6 <process_commands() [clone .part.46]+0x571e>
}

inline void TCodeInvalid() {
    SERIAL_ECHOLNPGM("Invalid T code.");
   17696:	81 ee       	ldi	r24, 0xE1	; 225
   17698:	98 e7       	ldi	r25, 0x78	; 120
        } else {
            SERIAL_ECHO_START;
            if (codeValue >= EXTRUDERS) {
                SERIAL_ECHO('T');
                SERIAL_ECHOLN(codeValue + '0');
                SERIAL_ECHOLNRPGM(_n("Invalid extruder")); ////MSG_INVALID_EXTRUDER
   1769a:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   1769e:	15 c0       	rjmp	.+42     	; 0x176ca <process_commands() [clone .part.46]+0x5712>
   176a0:	90 91 01 13 	lds	r25, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>

    strchr_pointer[index] = tolower(strchr_pointer[index]);

    if (IsInvalidTCode(strchr_pointer, index)){
        TCodeInvalid();
    } else if (strchr_pointer[index] == 'x' || strchr_pointer[index] == '?'){
   176a4:	8f 33       	cpi	r24, 0x3F	; 63
   176a6:	a9 f4       	brne	.+42     	; 0x176d2 <process_commands() [clone .part.46]+0x571a>
        // load to extruder gears; if mmu is not present do nothing
        if (MMU2::mmu2.Enabled()) {
   176a8:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   176ac:	81 30       	cpi	r24, 0x01	; 1
   176ae:	69 f4       	brne	.+26     	; 0x176ca <process_commands() [clone .part.46]+0x5712>
            MMU2::mmu2.tool_change(strchr_pointer[index], choose_menu_P(_T(MSG_SELECT_FILAMENT), MSG_FILAMENT));
   176b0:	86 e1       	ldi	r24, 0x16	; 22
   176b2:	9d e3       	ldi	r25, 0x3D	; 61
   176b4:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   176b8:	70 e0       	ldi	r23, 0x00	; 0
   176ba:	60 e0       	ldi	r22, 0x00	; 0
   176bc:	0e 94 c8 d1 	call	0x1a390	; 0x1a390 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]>
   176c0:	68 2f       	mov	r22, r24
   176c2:	d7 01       	movw	r26, r14
   176c4:	8c 91       	ld	r24, X
        }
    } else if (strchr_pointer[index] == 'c'){
        // load from extruder gears to nozzle (nozzle should be preheated)
        if (MMU2::mmu2.Enabled()) {
            MMU2::mmu2.tool_change(strchr_pointer[index], MMU2::mmu2.get_current_tool());
   176c6:	0e 94 a1 fe 	call	0x1fd42	; 0x1fd42 <MMU2::MMU2::tool_change(char, unsigned char) [clone .constprop.24]>
        processing_tcode = false;
   176ca:	10 92 91 03 	sts	0x0391, r1	; 0x800391 <processing_tcode>
   176ce:	0c 94 2c 90 	jmp	0x12058	; 0x12058 <process_commands() [clone .part.46]+0xa0>
    } else if (strchr_pointer[index] == 'x' || strchr_pointer[index] == '?'){
        // load to extruder gears; if mmu is not present do nothing
        if (MMU2::mmu2.Enabled()) {
            MMU2::mmu2.tool_change(strchr_pointer[index], choose_menu_P(_T(MSG_SELECT_FILAMENT), MSG_FILAMENT));
        }
    } else if (strchr_pointer[index] == 'c'){
   176d2:	83 36       	cpi	r24, 0x63	; 99
   176d4:	49 f4       	brne	.+18     	; 0x176e8 <process_commands() [clone .part.46]+0x5730>
        // load from extruder gears to nozzle (nozzle should be preheated)
        if (MMU2::mmu2.Enabled()) {
   176d6:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   176da:	81 30       	cpi	r24, 0x01	; 1
   176dc:	b1 f7       	brne	.-20     	; 0x176ca <process_commands() [clone .part.46]+0x5712>
            MMU2::mmu2.tool_change(strchr_pointer[index], MMU2::mmu2.get_current_tool());
   176de:	0f 94 a7 65 	call	0x2cb4e	; 0x2cb4e <MMU2::MMU2::get_current_tool() const [clone .constprop.351]>
   176e2:	68 2f       	mov	r22, r24
   176e4:	83 e6       	ldi	r24, 0x63	; 99
   176e6:	ef cf       	rjmp	.-34     	; 0x176c6 <process_commands() [clone .part.46]+0x570e>
        }
    } else { // Process T0 ... T4
        if (MMU2::mmu2.Enabled()) {
   176e8:	91 30       	cpi	r25, 0x01	; 1
   176ea:	69 f4       	brne	.+26     	; 0x17706 <process_commands() [clone .part.46]+0x574e>
            if (codeValue == MMU2::mmu2.get_current_tool()){
   176ec:	0f 94 a7 65 	call	0x2cb4e	; 0x2cb4e <MMU2::MMU2::get_current_tool() const [clone .constprop.351]>
   176f0:	18 13       	cpse	r17, r24
   176f2:	05 c0       	rjmp	.+10     	; 0x176fe <process_commands() [clone .part.46]+0x5746>
                // don't execute the same T-code twice in a row
                puts_P(duplicate_Tcode_ignored);
   176f4:	81 ef       	ldi	r24, 0xF1	; 241
   176f6:	98 e7       	ldi	r25, 0x78	; 120
   176f8:	0f 94 c9 a2 	call	0x34592	; 0x34592 <puts_P>
   176fc:	e6 cf       	rjmp	.-52     	; 0x176ca <process_commands() [clone .part.46]+0x5712>
#if defined(MMU_HAS_CUTTER) && defined(MMU_ALWAYS_CUT)
                if (EEPROM_MMU_CUTTER_ENABLED_always == eeprom_read_byte((uint8_t *)EEPROM_MMU_CUTTER_ENABLED)) {
                    MMU2::mmu2.cut_filament(codeValue);
                }
#endif // defined(MMU_HAS_CUTTER) && defined(MMU_ALWAYS_CUT)
                MMU2::mmu2.tool_change(codeValue);
   176fe:	81 2f       	mov	r24, r17
   17700:	0e 94 7e fe 	call	0x1fcfc	; 0x1fcfc <MMU2::MMU2::tool_change(unsigned char) [clone .constprop.26]>
   17704:	e2 cf       	rjmp	.-60     	; 0x176ca <process_commands() [clone .part.46]+0x5712>
            }
        } else {
            SERIAL_ECHO_START;
   17706:	8e ec       	ldi	r24, 0xCE	; 206
   17708:	91 ea       	ldi	r25, 0xA1	; 161
   1770a:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
            if (codeValue >= EXTRUDERS) {
   1770e:	11 23       	and	r17, r17
   17710:	59 f0       	breq	.+22     	; 0x17728 <process_commands() [clone .part.46]+0x5770>
}

void MarlinSerial::print(long n, int base)
{
  if (base == 0) {
    write(n);
   17712:	84 e5       	ldi	r24, 0x54	; 84
   17714:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
                SERIAL_ECHO('T');
                SERIAL_ECHOLN(codeValue + '0');
   17718:	81 2f       	mov	r24, r17
   1771a:	90 e0       	ldi	r25, 0x00	; 0
   1771c:	c0 96       	adiw	r24, 0x30	; 48
   1771e:	0f 94 bf 65 	call	0x2cb7e	; 0x2cb7e <MarlinSerial::println(int, int) [clone .constprop.319]>
                SERIAL_ECHOLNRPGM(_n("Invalid extruder")); ////MSG_INVALID_EXTRUDER
   17722:	86 ed       	ldi	r24, 0xD6	; 214
   17724:	94 e6       	ldi	r25, 0x64	; 100
   17726:	b9 cf       	rjmp	.-142    	; 0x1769a <process_commands() [clone .part.46]+0x56e2>
//                    next_feedrate = code_value();
//                    if (next_feedrate > 0.0) {
//                        feedrate = next_feedrate;
//                    }
//                }
                SERIAL_ECHORPGM(_n("Active Extruder: 0")); ////MSG_ACTIVE_EXTRUDER
   17728:	83 ec       	ldi	r24, 0xC3	; 195
   1772a:	94 e6       	ldi	r25, 0x64	; 100
   1772c:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   17730:	cc cf       	rjmp	.-104    	; 0x176ca <process_commands() [clone .part.46]+0x5712>

  /**
  *---------------------------------------------------------------------------------
  *# D codes
  */
  else if(*CMDBUFFER_CURRENT_STRING == 'D') // D codes (debug)
   17732:	84 34       	cpi	r24, 0x44	; 68
   17734:	09 f0       	breq	.+2      	; 0x17738 <process_commands() [clone .part.46]+0x5780>
   17736:	5d c0       	rjmp	.+186    	; 0x177f2 <process_commands() [clone .part.46]+0x583a>
  {
    strchr_pointer = CMDBUFFER_CURRENT_STRING;
   17738:	10 93 bc 04 	sts	0x04BC, r17	; 0x8004bc <strchr_pointer+0x1>
   1773c:	00 93 bb 04 	sts	0x04BB, r16	; 0x8004bb <strchr_pointer>
    switch(code_value_short())
   17740:	0e 94 17 56 	call	0xac2e	; 0xac2e <code_value_short() [clone .lto_priv.505]>
   17744:	82 30       	cpi	r24, 0x02	; 2
   17746:	91 05       	cpc	r25, r1
   17748:	41 f1       	breq	.+80     	; 0x1779a <process_commands() [clone .part.46]+0x57e2>
   1774a:	8c f4       	brge	.+34     	; 0x1776e <process_commands() [clone .part.46]+0x57b6>
   1774c:	01 96       	adiw	r24, 0x01	; 1
   1774e:	e1 f0       	breq	.+56     	; 0x17788 <process_commands() [clone .part.46]+0x57d0>
#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)

#endif //DEBUG_DCODES

    default:
        printf_P(MSG_UNKNOWN_CODE, 'D', cmdbuffer + bufindr + CMDHDRSIZE);
   17750:	80 91 38 12 	lds	r24, 0x1238	; 0x801238 <bufindr>
   17754:	90 91 39 12 	lds	r25, 0x1239	; 0x801239 <bufindr+0x1>
   17758:	82 5b       	subi	r24, 0xB2	; 178
   1775a:	9f 4e       	sbci	r25, 0xEF	; 239
   1775c:	9f 93       	push	r25
   1775e:	8f 93       	push	r24
   17760:	1f 92       	push	r1
   17762:	84 e4       	ldi	r24, 0x44	; 68
   17764:	8f 93       	push	r24
   17766:	88 e5       	ldi	r24, 0x58	; 88
   17768:	96 e6       	ldi	r25, 0x66	; 102
   1776a:	0c 94 81 90 	jmp	0x12102	; 0x12102 <process_commands() [clone .part.46]+0x14a>
  *# D codes
  */
  else if(*CMDBUFFER_CURRENT_STRING == 'D') // D codes (debug)
  {
    strchr_pointer = CMDBUFFER_CURRENT_STRING;
    switch(code_value_short())
   1776e:	83 30       	cpi	r24, 0x03	; 3
   17770:	91 05       	cpc	r25, r1
   17772:	f9 f0       	breq	.+62     	; 0x177b2 <process_commands() [clone .part.46]+0x57fa>
   17774:	47 97       	sbiw	r24, 0x17	; 23
   17776:	61 f7       	brne	.-40     	; 0x17750 <process_commands() [clone .part.46]+0x5798>

bool emergency_serial_dump = false;

void dcode_23()
{
    if(code_seen('E'))
   17778:	85 e4       	ldi	r24, 0x45	; 69
   1777a:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   1777e:	88 23       	and	r24, r24
   17780:	09 f1       	breq	.+66     	; 0x177c4 <process_commands() [clone .part.46]+0x580c>
        serial_dump_and_reset(dump_crash_reason::manual);
   17782:	80 e0       	ldi	r24, 0x00	; 0
   17784:	0e 94 79 86 	call	0x10cf2	; 0x10cf2 <serial_dump_and_reset(dump_crash_reason)>

    *
    */
void dcode__1()
{
	DBG(_N("D-1 - Endless loop\n"));
   17788:	8f ea       	ldi	r24, 0xAF	; 175
   1778a:	94 e6       	ldi	r25, 0x64	; 100
   1778c:	9f 93       	push	r25
   1778e:	8f 93       	push	r24
   17790:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   17794:	0f 90       	pop	r0
   17796:	0f 90       	pop	r0
   17798:	ff cf       	rjmp	.-2      	; 0x17798 <process_commands() [clone .part.46]+0x57e0>
	- The hex data needs to be lowercase

    */
void dcode_2()
{
    dcode_core(RAMSTART, RAMEND+1, dcode_mem_t::sram, 2, _N("SRAM"));
   1779a:	0a ea       	ldi	r16, 0xAA	; 170
   1779c:	14 e6       	ldi	r17, 0x64	; 100
   1779e:	22 e0       	ldi	r18, 0x02	; 2
   177a0:	40 e0       	ldi	r20, 0x00	; 0
   177a2:	60 e0       	ldi	r22, 0x00	; 0
   177a4:	72 e2       	ldi	r23, 0x22	; 34
   177a6:	80 e0       	ldi	r24, 0x00	; 0
   177a8:	92 e0       	ldi	r25, 0x02	; 2
	- The hex data needs to be lowercase

    */
void dcode_3()
{
    dcode_core(0, EEPROM_SIZE, dcode_mem_t::eeprom, 3, _N("EEPROM"));
   177aa:	0e 94 bc 5d 	call	0xbb78	; 0xbb78 <dcode_core(unsigned int, unsigned int, dcode_mem_t, unsigned char, char const*)>
   177ae:	0c 94 2c 90 	jmp	0x12058	; 0x12058 <process_commands() [clone .part.46]+0xa0>
   177b2:	03 ea       	ldi	r16, 0xA3	; 163
   177b4:	14 e6       	ldi	r17, 0x64	; 100
   177b6:	23 e0       	ldi	r18, 0x03	; 3
   177b8:	41 e0       	ldi	r20, 0x01	; 1
   177ba:	60 e0       	ldi	r22, 0x00	; 0
   177bc:	70 e1       	ldi	r23, 0x10	; 16
   177be:	90 e0       	ldi	r25, 0x00	; 0
   177c0:	80 e0       	ldi	r24, 0x00	; 0
   177c2:	f3 cf       	rjmp	.-26     	; 0x177aa <process_commands() [clone .part.46]+0x57f2>
{
    if(code_seen('E'))
        serial_dump_and_reset(dump_crash_reason::manual);
    else
    {
        emergency_serial_dump = !code_seen('R');
   177c4:	82 e5       	ldi	r24, 0x52	; 82
   177c6:	0e 94 f5 55 	call	0xabea	; 0xabea <code_seen(char) [clone .lto_priv.511]>
   177ca:	91 e0       	ldi	r25, 0x01	; 1
   177cc:	89 27       	eor	r24, r25
   177ce:	80 93 0f 06 	sts	0x060F, r24	; 0x80060f <emergency_serial_dump>
        SERIAL_ECHOPGM("serial dump ");
   177d2:	84 ed       	ldi	r24, 0xD4	; 212
   177d4:	98 e7       	ldi	r25, 0x78	; 120
   177d6:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        SERIAL_ECHOLNRPGM(emergency_serial_dump? _N("enabled"): _N("disabled"));
   177da:	80 91 0f 06 	lds	r24, 0x060F	; 0x80060f <emergency_serial_dump>
   177de:	88 23       	and	r24, r24
   177e0:	21 f0       	breq	.+8      	; 0x177ea <process_commands() [clone .part.46]+0x5832>
   177e2:	8b e9       	ldi	r24, 0x9B	; 155
   177e4:	94 e6       	ldi	r25, 0x64	; 100
   177e6:	0c 94 e8 90 	jmp	0x121d0	; 0x121d0 <process_commands() [clone .part.46]+0x218>
   177ea:	82 e9       	ldi	r24, 0x92	; 146
   177ec:	94 e6       	ldi	r25, 0x64	; 100
   177ee:	0c 94 e8 90 	jmp	0x121d0	; 0x121d0 <process_commands() [clone .part.46]+0x218>
	}
  }

  else
  {
    SERIAL_ECHO_START;
   177f2:	8e ec       	ldi	r24, 0xCE	; 206
   177f4:	91 ea       	ldi	r25, 0xA1	; 161
   177f6:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    SERIAL_ECHORPGM(MSG_UNKNOWN_COMMAND);
   177fa:	85 e0       	ldi	r24, 0x05	; 5
   177fc:	95 e6       	ldi	r25, 0x65	; 101
   177fe:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    SERIAL_ECHO(CMDBUFFER_CURRENT_STRING);
   17802:	80 91 38 12 	lds	r24, 0x1238	; 0x801238 <bufindr>
   17806:	90 91 39 12 	lds	r25, 0x1239	; 0x801239 <bufindr+0x1>
   1780a:	82 5b       	subi	r24, 0xB2	; 178
   1780c:	9f 4e       	sbci	r25, 0xEF	; 239
   1780e:	0e 94 95 87 	call	0x10f2a	; 0x10f2a <MarlinSerial::write(char const*)>
    SERIAL_ECHOLNPGM("\"(2)");
   17812:	89 e6       	ldi	r24, 0x69	; 105
   17814:	9e e7       	ldi	r25, 0x7E	; 126
   17816:	0c 94 e8 90 	jmp	0x121d0	; 0x121d0 <process_commands() [clone .part.46]+0x218>

#ifdef FWRETRACT
        if(cs.autoretract_enabled) {
            if( !(code_seen('X') || code_seen('Y') || code_seen('Z')) && code_seen('E')) {
                float echange=destination[E_AXIS]-current_position[E_AXIS];
                if((echange<-MIN_RETRACT && !retracted[active_extruder]) || (echange>MIN_RETRACT && retracted[active_extruder])) { //move appears to be an attempt to retract or recover
   1781a:	2d ec       	ldi	r18, 0xCD	; 205
   1781c:	3c ec       	ldi	r19, 0xCC	; 204
   1781e:	4c ec       	ldi	r20, 0xCC	; 204
   17820:	5d e3       	ldi	r21, 0x3D	; 61
   17822:	c7 01       	movw	r24, r14
   17824:	b6 01       	movw	r22, r12
   17826:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   1782a:	18 16       	cp	r1, r24
   1782c:	14 f4       	brge	.+4      	; 0x17832 <process_commands() [clone .part.46]+0x587a>
   1782e:	0c 94 50 92 	jmp	0x124a0	; 0x124a0 <process_commands() [clone .part.46]+0x4e8>
   17832:	0c 94 60 93 	jmp	0x126c0	; 0x126c0 <process_commands() [clone .part.46]+0x708>
            float temp = (40 + i * 5);
            printf_P(_N("\nStep: %d/6 (skipped)\nPINDA temperature: %d Z shift (mm):0\n"), i + 2, (40 + i*5));
            if (i >= 0) {
                eeprom_update_word_notify((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + i, z_shift);
            }
            if (start_temp <= temp) break;
   17836:	a3 01       	movw	r20, r6
   17838:	92 01       	movw	r18, r4
   1783a:	62 2d       	mov	r22, r2
   1783c:	73 2d       	mov	r23, r3
   1783e:	8e 2d       	mov	r24, r14
   17840:	9f 2d       	mov	r25, r15
   17842:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   17846:	18 16       	cp	r1, r24
   17848:	14 f0       	brlt	.+4      	; 0x1784e <process_commands() [clone .part.46]+0x5896>
   1784a:	0c 94 d2 9a 	jmp	0x135a4	; 0x135a4 <process_commands() [clone .part.46]+0x15ec>
   1784e:	e5 e0       	ldi	r30, 0x05	; 5
   17850:	ce 0e       	add	r12, r30
   17852:	d1 1c       	adc	r13, r1
   17854:	f2 e0       	ldi	r31, 0x02	; 2
   17856:	8f 0e       	add	r8, r31
   17858:	91 1c       	adc	r9, r1
        SERIAL_ECHOLNPGM("PINDA probe calibration start");

        float zero_z;
        int z_shift = 0; //unit: steps
        float start_temp = 5 * (int)(current_temperature_pinda / 5);
        if (start_temp < 35) start_temp = 35;
   1785a:	85 01       	movw	r16, r10
   1785c:	0c 94 99 9a 	jmp	0x13532	; 0x13532 <process_commands() [clone .part.46]+0x157a>
    int8_t upgrade = is_provided_version_newer(version_string);
    if (upgrade < 0)
        return false;

    if (upgrade) {
        lcd_display_message_fullscreen_P(_T(MSG_NEW_FIRMWARE_AVAILABLE));
   17860:	81 e2       	ldi	r24, 0x21	; 33
   17862:	99 e3       	ldi	r25, 0x39	; 57
   17864:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   17868:	0e 94 a9 e0 	call	0x1c152	; 0x1c152 <lcd_display_message_fullscreen_P(char const*)>
        lcd_puts_at_P(0, 2, PSTR(""));
   1786c:	43 e0       	ldi	r20, 0x03	; 3
   1786e:	5e e7       	ldi	r21, 0x7E	; 126
   17870:	62 e0       	ldi	r22, 0x02	; 2
   17872:	80 e0       	ldi	r24, 0x00	; 0
   17874:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
        for (const char *c = version_string; ! is_whitespace_or_nl_or_eol(*c); ++ c)
   17878:	f8 01       	movw	r30, r16
   1787a:	81 91       	ld	r24, Z+
   1787c:	8f 01       	movw	r16, r30
    return c == ' ' || c == '\t' || c == '\n' || c == '\r';
}

inline bool is_whitespace_or_nl_or_eol(char c)
{
    return c == 0 || c == ' ' || c == '\t' || c == '\n' || c == '\r';
   1787e:	98 2f       	mov	r25, r24
   17880:	9f 7d       	andi	r25, 0xDF	; 223
   17882:	11 f4       	brne	.+4      	; 0x17888 <process_commands() [clone .part.46]+0x58d0>
   17884:	0c 94 03 aa 	jmp	0x15406	; 0x15406 <process_commands() [clone .part.46]+0x344e>
   17888:	97 ef       	ldi	r25, 0xF7	; 247
   1788a:	98 0f       	add	r25, r24
   1788c:	92 30       	cpi	r25, 0x02	; 2
   1788e:	10 f4       	brcc	.+4      	; 0x17894 <process_commands() [clone .part.46]+0x58dc>
   17890:	0c 94 03 aa 	jmp	0x15406	; 0x15406 <process_commands() [clone .part.46]+0x344e>
   17894:	8d 30       	cpi	r24, 0x0D	; 13
   17896:	11 f4       	brne	.+4      	; 0x1789c <process_commands() [clone .part.46]+0x58e4>
   17898:	0c 94 03 aa 	jmp	0x15406	; 0x15406 <process_commands() [clone .part.46]+0x344e>

    if (upgrade) {
        lcd_display_message_fullscreen_P(_T(MSG_NEW_FIRMWARE_AVAILABLE));
        lcd_puts_at_P(0, 2, PSTR(""));
        for (const char *c = version_string; ! is_whitespace_or_nl_or_eol(*c); ++ c)
            lcd_putc(*c);
   1789c:	0e 94 21 6f 	call	0xde42	; 0xde42 <lcd_putc(char)>
   178a0:	eb cf       	rjmp	.-42     	; 0x17878 <process_commands() [clone .part.46]+0x58c0>

000178a2 <__vector_29>:
#ifdef ADC_CALLBACK
extern void ADC_CALLBACK();
#endif //ADC_CALLBACK

ISR(ADC_vect)
{
   178a2:	1f 92       	push	r1
   178a4:	0f 92       	push	r0
   178a6:	0f b6       	in	r0, 0x3f	; 63
   178a8:	0f 92       	push	r0
   178aa:	11 24       	eor	r1, r1
   178ac:	0b b6       	in	r0, 0x3b	; 59
   178ae:	0f 92       	push	r0
   178b0:	2f 93       	push	r18
   178b2:	3f 93       	push	r19
   178b4:	4f 93       	push	r20
   178b6:	5f 93       	push	r21
   178b8:	6f 93       	push	r22
   178ba:	7f 93       	push	r23
   178bc:	8f 93       	push	r24
   178be:	9f 93       	push	r25
   178c0:	af 93       	push	r26
   178c2:	bf 93       	push	r27
   178c4:	ef 93       	push	r30
   178c6:	ff 93       	push	r31
    adc_values[adc_channel] += ADC;
   178c8:	20 91 78 00 	lds	r18, 0x0078	; 0x800078 <__TEXT_REGION_LENGTH__+0x7c2078>
   178cc:	30 91 79 00 	lds	r19, 0x0079	; 0x800079 <__TEXT_REGION_LENGTH__+0x7c2079>
   178d0:	e0 91 14 03 	lds	r30, 0x0314	; 0x800314 <adc_channel>
   178d4:	f0 e0       	ldi	r31, 0x00	; 0
   178d6:	ee 0f       	add	r30, r30
   178d8:	ff 1f       	adc	r31, r31
   178da:	ec 5f       	subi	r30, 0xFC	; 252
   178dc:	fc 4f       	sbci	r31, 0xFC	; 252
   178de:	80 81       	ld	r24, Z
   178e0:	91 81       	ldd	r25, Z+1	; 0x01
   178e2:	82 0f       	add	r24, r18
   178e4:	93 1f       	adc	r25, r19
   178e6:	91 83       	std	Z+1, r25	; 0x01
   178e8:	80 83       	st	Z, r24
    if (++adc_count == ADC_OVRSAMPL)
   178ea:	80 91 03 03 	lds	r24, 0x0303	; 0x800303 <adc_count>
   178ee:	8f 5f       	subi	r24, 0xFF	; 255
   178f0:	80 93 03 03 	sts	0x0303, r24	; 0x800303 <adc_count>
   178f4:	80 31       	cpi	r24, 0x10	; 16
   178f6:	e9 f5       	brne	.+122    	; 0x17972 <__vector_29+0xd0>
    {
        // go to the next channel
        if (++adc_channel == ADC_CHAN_CNT) {
   178f8:	80 91 14 03 	lds	r24, 0x0314	; 0x800314 <adc_channel>
   178fc:	8f 5f       	subi	r24, 0xFF	; 255
   178fe:	80 93 14 03 	sts	0x0314, r24	; 0x800314 <adc_channel>
   17902:	88 30       	cpi	r24, 0x08	; 8
   17904:	71 f5       	brne	.+92     	; 0x17962 <__vector_29+0xc0>
#endif

// ISR callback from adc when sampling finished
void adc_callback()
{
    current_temperature_raw[0] = adc_values[ADC_PIN_IDX(TEMP_0_PIN)]; //heater
   17906:	80 91 04 03 	lds	r24, 0x0304	; 0x800304 <adc_values>
   1790a:	90 91 05 03 	lds	r25, 0x0305	; 0x800305 <adc_values+0x1>
   1790e:	90 93 dd 05 	sts	0x05DD, r25	; 0x8005dd <current_temperature_raw+0x1>
   17912:	80 93 dc 05 	sts	0x05DC, r24	; 0x8005dc <current_temperature_raw>
    current_temperature_bed_raw = adc_values[ADC_PIN_IDX(TEMP_BED_PIN)];
   17916:	80 91 08 03 	lds	r24, 0x0308	; 0x800308 <adc_values+0x4>
   1791a:	90 91 09 03 	lds	r25, 0x0309	; 0x800309 <adc_values+0x5>
   1791e:	90 93 df 05 	sts	0x05DF, r25	; 0x8005df <current_temperature_bed_raw+0x1>
   17922:	80 93 de 05 	sts	0x05DE, r24	; 0x8005de <current_temperature_bed_raw>
#ifdef PINDA_THERMISTOR
    current_temperature_raw_pinda = adc_values[ADC_PIN_IDX(TEMP_PINDA_PIN)];
   17926:	80 91 06 03 	lds	r24, 0x0306	; 0x800306 <adc_values+0x2>
   1792a:	90 91 07 03 	lds	r25, 0x0307	; 0x800307 <adc_values+0x3>
   1792e:	90 93 db 05 	sts	0x05DB, r25	; 0x8005db <current_temperature_raw_pinda+0x1>
   17932:	80 93 da 05 	sts	0x05DA, r24	; 0x8005da <current_temperature_raw_pinda>
    current_voltage_raw_bed = adc_values[ADC_PIN_IDX(VOLT_BED_PIN)]; // 6->9
#endif
#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
    fsensor.voltUpdate(adc_values[ADC_PIN_IDX(VOLT_IR_PIN)]);
#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
    adc_values_ready = true;
   17936:	81 e0       	ldi	r24, 0x01	; 1
   17938:	80 93 f6 05 	sts	0x05F6, r24	; 0x8005f6 <_ZL16adc_values_ready.lto_priv.517>
                break;
            }
        }
    }
    ADCSRA |= (1 << ADSC); //start conversion
}
   1793c:	ff 91       	pop	r31
   1793e:	ef 91       	pop	r30
   17940:	bf 91       	pop	r27
   17942:	af 91       	pop	r26
   17944:	9f 91       	pop	r25
   17946:	8f 91       	pop	r24
   17948:	7f 91       	pop	r23
   1794a:	6f 91       	pop	r22
   1794c:	5f 91       	pop	r21
   1794e:	4f 91       	pop	r20
   17950:	3f 91       	pop	r19
   17952:	2f 91       	pop	r18
   17954:	0f 90       	pop	r0
   17956:	0b be       	out	0x3b, r0	; 59
   17958:	0f 90       	pop	r0
   1795a:	0f be       	out	0x3f, r0	; 63
   1795c:	0f 90       	pop	r0
   1795e:	1f 90       	pop	r1
   17960:	18 95       	reti
   17962:	80 91 02 03 	lds	r24, 0x0302	; 0x800302 <__data_end>
            return; // do not start the next measurement since there are no channels remaining
        }

        // find the next channel
        while (++adc_channel_idx) {
            if (ADC_CHAN_MSK & (1 << adc_channel_idx)) {
   17966:	4f e5       	ldi	r20, 0x5F	; 95
   17968:	53 e0       	ldi	r21, 0x03	; 3
#endif
            return; // do not start the next measurement since there are no channels remaining
        }

        // find the next channel
        while (++adc_channel_idx) {
   1796a:	8f 5f       	subi	r24, 0xFF	; 255
   1796c:	41 f4       	brne	.+16     	; 0x1797e <__vector_29+0xdc>
   1796e:	10 92 02 03 	sts	0x0302, r1	; 0x800302 <__data_end>
                adc_count = 0;
                break;
            }
        }
    }
    ADCSRA |= (1 << ADSC); //start conversion
   17972:	80 91 7a 00 	lds	r24, 0x007A	; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a>
   17976:	80 64       	ori	r24, 0x40	; 64
   17978:	80 93 7a 00 	sts	0x007A, r24	; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a>
   1797c:	df cf       	rjmp	.-66     	; 0x1793c <__vector_29+0x9a>
            return; // do not start the next measurement since there are no channels remaining
        }

        // find the next channel
        while (++adc_channel_idx) {
            if (ADC_CHAN_MSK & (1 << adc_channel_idx)) {
   1797e:	9a 01       	movw	r18, r20
   17980:	08 2e       	mov	r0, r24
   17982:	02 c0       	rjmp	.+4      	; 0x17988 <__vector_29+0xe6>
   17984:	35 95       	asr	r19
   17986:	27 95       	ror	r18
   17988:	0a 94       	dec	r0
   1798a:	e2 f7       	brpl	.-8      	; 0x17984 <__vector_29+0xe2>
   1798c:	20 ff       	sbrs	r18, 0
   1798e:	ed cf       	rjmp	.-38     	; 0x1796a <__vector_29+0xc8>
   17990:	80 93 02 03 	sts	0x0302, r24	; 0x800302 <__data_end>
                adc_setmux(adc_channel_idx);
   17994:	0e 94 09 55 	call	0xaa12	; 0xaa12 <adc_setmux(unsigned char)>
                adc_count = 0;
   17998:	10 92 03 03 	sts	0x0303, r1	; 0x800303 <adc_count>
   1799c:	ea cf       	rjmp	.-44     	; 0x17972 <__vector_29+0xd0>

0001799e <adc_start_cycle()>:
	if (ch & 0x08) ADCSRB |= (1 << MUX5);
	else ADCSRB &= ~(1 << MUX5);
	ADMUX = (ADMUX & ~(0x07)) | (ch & 0x07);
}

void adc_start_cycle() {
   1799e:	cf 93       	push	r28
   179a0:	df 93       	push	r29
static void adc_reset()
{
    static const uint8_t first_channel_idx = 0;
    static_assert((1 << first_channel_idx) & ADC_CHAN_MSK);

    ADCSRA &= ~(1 << ADSC); //stop conversion just in case
   179a2:	ca e7       	ldi	r28, 0x7A	; 122
   179a4:	d0 e0       	ldi	r29, 0x00	; 0
   179a6:	88 81       	ld	r24, Y
   179a8:	8f 7b       	andi	r24, 0xBF	; 191
   179aa:	88 83       	st	Y, r24
    adc_count = 0;
   179ac:	10 92 03 03 	sts	0x0303, r1	; 0x800303 <adc_count>
    adc_channel = 0;
   179b0:	10 92 14 03 	sts	0x0314, r1	; 0x800314 <adc_channel>
    adc_channel_idx = first_channel_idx;
   179b4:	10 92 02 03 	sts	0x0302, r1	; 0x800302 <__data_end>
    adc_setmux(adc_channel_idx);
   179b8:	80 e0       	ldi	r24, 0x00	; 0
   179ba:	0e 94 09 55 	call	0xaa12	; 0xaa12 <adc_setmux(unsigned char)>
    memset((void*)adc_values, 0, sizeof(adc_values));
   179be:	e4 e0       	ldi	r30, 0x04	; 4
   179c0:	f3 e0       	ldi	r31, 0x03	; 3
   179c2:	80 e1       	ldi	r24, 0x10	; 16
   179c4:	df 01       	movw	r26, r30
   179c6:	1d 92       	st	X+, r1
   179c8:	8a 95       	dec	r24
   179ca:	e9 f7       	brne	.-6      	; 0x179c6 <adc_start_cycle()+0x28>
	ADMUX = (ADMUX & ~(0x07)) | (ch & 0x07);
}

void adc_start_cycle() {
	adc_reset();
	ADCSRA |= (1 << ADSC); //start conversion
   179cc:	88 81       	ld	r24, Y
   179ce:	80 64       	ori	r24, 0x40	; 64
   179d0:	88 83       	st	Y, r24
}
   179d2:	df 91       	pop	r29
   179d4:	cf 91       	pop	r28
   179d6:	08 95       	ret

000179d8 <turnOffPWM>:


uint8_t check_pinda_0()
{
	return _PINDA?0:1;
}
   179d8:	81 50       	subi	r24, 0x01	; 1
   179da:	82 31       	cpi	r24, 0x12	; 18
   179dc:	08 f0       	brcs	.+2      	; 0x179e0 <turnOffPWM+0x8>
   179de:	5a c0       	rjmp	.+180    	; 0x17a94 <turnOffPWM+0xbc>
   179e0:	e8 2f       	mov	r30, r24
   179e2:	f0 e0       	ldi	r31, 0x00	; 0
   179e4:	88 27       	eor	r24, r24
   179e6:	e8 50       	subi	r30, 0x08	; 8
   179e8:	f3 44       	sbci	r31, 0x43	; 67
   179ea:	8f 4f       	sbci	r24, 0xFF	; 255
   179ec:	0d 94 f0 a4 	jmp	0x349e0	; 0x349e0 <__tablejump2__>
   179f0:	18 bd       	out	0x28, r17	; 40
   179f2:	1c bd       	out	0x2c, r17	; 44
   179f4:	0a bd       	out	0x2a, r16	; 42
   179f6:	10 bd       	out	0x20, r17	; 32
   179f8:	14 bd       	out	0x24, r17	; 36
   179fa:	4a bd       	out	0x2a, r20	; 42
   179fc:	1f bd       	out	0x2f, r17	; 47
   179fe:	25 bd       	out	0x25, r18	; 37
   17a00:	29 bd       	out	0x29, r18	; 41
   17a02:	2f bd       	out	0x2f, r18	; 47
   17a04:	33 bd       	out	0x23, r19	; 35
   17a06:	37 bd       	out	0x27, r19	; 39
   17a08:	3d bd       	out	0x2d, r19	; 45
   17a0a:	41 bd       	out	0x21, r20	; 33
   17a0c:	4a bd       	out	0x2a, r20	; 42
   17a0e:	45 bd       	out	0x25, r20	; 37
   17a10:	4b bd       	out	0x2b, r20	; 43
   17a12:	4f bd       	out	0x2f, r20	; 47
   17a14:	80 91 80 00 	lds	r24, 0x0080	; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080>
   17a18:	8f 77       	andi	r24, 0x7F	; 127
   17a1a:	80 93 80 00 	sts	0x0080, r24	; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080>
   17a1e:	08 95       	ret
   17a20:	80 91 80 00 	lds	r24, 0x0080	; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080>
   17a24:	8f 7d       	andi	r24, 0xDF	; 223
   17a26:	f9 cf       	rjmp	.-14     	; 0x17a1a <turnOffPWM+0x42>
   17a28:	80 91 80 00 	lds	r24, 0x0080	; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080>
   17a2c:	87 7f       	andi	r24, 0xF7	; 247
   17a2e:	f5 cf       	rjmp	.-22     	; 0x17a1a <turnOffPWM+0x42>
   17a30:	84 b5       	in	r24, 0x24	; 36
   17a32:	8f 77       	andi	r24, 0x7F	; 127
   17a34:	84 bd       	out	0x24, r24	; 36
   17a36:	08 95       	ret
   17a38:	84 b5       	in	r24, 0x24	; 36
   17a3a:	8f 7d       	andi	r24, 0xDF	; 223
   17a3c:	fb cf       	rjmp	.-10     	; 0x17a34 <turnOffPWM+0x5c>
   17a3e:	80 91 b0 00 	lds	r24, 0x00B0	; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0>
   17a42:	8f 77       	andi	r24, 0x7F	; 127
   17a44:	80 93 b0 00 	sts	0x00B0, r24	; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0>
   17a48:	08 95       	ret
   17a4a:	80 91 b0 00 	lds	r24, 0x00B0	; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0>
   17a4e:	8f 7d       	andi	r24, 0xDF	; 223
   17a50:	f9 cf       	rjmp	.-14     	; 0x17a44 <turnOffPWM+0x6c>
   17a52:	80 91 90 00 	lds	r24, 0x0090	; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090>
   17a56:	8f 77       	andi	r24, 0x7F	; 127
   17a58:	80 93 90 00 	sts	0x0090, r24	; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090>
   17a5c:	08 95       	ret
   17a5e:	80 91 90 00 	lds	r24, 0x0090	; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090>
   17a62:	8f 7d       	andi	r24, 0xDF	; 223
   17a64:	f9 cf       	rjmp	.-14     	; 0x17a58 <turnOffPWM+0x80>
   17a66:	80 91 90 00 	lds	r24, 0x0090	; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090>
   17a6a:	87 7f       	andi	r24, 0xF7	; 247
   17a6c:	f5 cf       	rjmp	.-22     	; 0x17a58 <turnOffPWM+0x80>
   17a6e:	80 91 a0 00 	lds	r24, 0x00A0	; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0>
   17a72:	8f 77       	andi	r24, 0x7F	; 127
   17a74:	80 93 a0 00 	sts	0x00A0, r24	; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0>
   17a78:	08 95       	ret
   17a7a:	80 91 a0 00 	lds	r24, 0x00A0	; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0>
   17a7e:	8f 7d       	andi	r24, 0xDF	; 223
   17a80:	f9 cf       	rjmp	.-14     	; 0x17a74 <turnOffPWM+0x9c>
   17a82:	80 91 a0 00 	lds	r24, 0x00A0	; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0>
   17a86:	87 7f       	andi	r24, 0xF7	; 247
   17a88:	f5 cf       	rjmp	.-22     	; 0x17a74 <turnOffPWM+0x9c>
   17a8a:	80 91 20 01 	lds	r24, 0x0120	; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120>
   17a8e:	8f 77       	andi	r24, 0x7F	; 127
   17a90:	80 93 20 01 	sts	0x0120, r24	; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120>
   17a94:	08 95       	ret
   17a96:	80 91 20 01 	lds	r24, 0x0120	; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120>
   17a9a:	8f 7d       	andi	r24, 0xDF	; 223
   17a9c:	f9 cf       	rjmp	.-14     	; 0x17a90 <turnOffPWM+0xb8>
   17a9e:	80 91 20 01 	lds	r24, 0x0120	; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120>
   17aa2:	87 7f       	andi	r24, 0xF7	; 247
   17aa4:	f5 cf       	rjmp	.-22     	; 0x17a90 <turnOffPWM+0xb8>

00017aa6 <check_pinda_1()>:
   17aa6:	83 b1       	in	r24, 0x03	; 3
   17aa8:	82 95       	swap	r24
   17aaa:	81 70       	andi	r24, 0x01	; 1
   17aac:	08 95       	ret

00017aae <xyzcal_calc_delay(unsigned int, unsigned int)>:
}
#else //SM4_ACCEL_TEST
uint16_t xyzcal_calc_delay(uint16_t, uint16_t)
{
    return xyzcal_sm4_delay;
}
   17aae:	80 91 ef 03 	lds	r24, 0x03EF	; 0x8003ef <xyzcal_sm4_delay>
   17ab2:	90 91 f0 03 	lds	r25, 0x03F0	; 0x8003f0 <xyzcal_sm4_delay+0x1>
   17ab6:	08 95       	ret

00017ab8 <xyzcal_update_pos(unsigned int, unsigned int, unsigned int, unsigned int)>:
}

uint8_t xyzcal_dm = 0;

void xyzcal_update_pos(uint16_t dx, uint16_t dy, uint16_t dz, uint16_t)
{
   17ab8:	cf 92       	push	r12
   17aba:	df 92       	push	r13
   17abc:	ef 92       	push	r14
   17abe:	ff 92       	push	r15
//	DBG(_n("xyzcal_update_pos dx=%d dy=%d dz=%d dir=%02x\n"), dx, dy, dz, xyzcal_dm);
	if (xyzcal_dm&1) count_position[0] -= dx; else count_position[0] += dx;
   17ac0:	20 91 f1 03 	lds	r18, 0x03F1	; 0x8003f1 <xyzcal_dm>
   17ac4:	b0 e0       	ldi	r27, 0x00	; 0
   17ac6:	a0 e0       	ldi	r26, 0x00	; 0
   17ac8:	c0 90 4c 06 	lds	r12, 0x064C	; 0x80064c <count_position>
   17acc:	d0 90 4d 06 	lds	r13, 0x064D	; 0x80064d <count_position+0x1>
   17ad0:	e0 90 4e 06 	lds	r14, 0x064E	; 0x80064e <count_position+0x2>
   17ad4:	f0 90 4f 06 	lds	r15, 0x064F	; 0x80064f <count_position+0x3>
   17ad8:	20 ff       	sbrs	r18, 0
   17ada:	42 c0       	rjmp	.+132    	; 0x17b60 <xyzcal_update_pos(unsigned int, unsigned int, unsigned int, unsigned int)+0xa8>
   17adc:	c8 1a       	sub	r12, r24
   17ade:	d9 0a       	sbc	r13, r25
   17ae0:	ea 0a       	sbc	r14, r26
   17ae2:	fb 0a       	sbc	r15, r27
   17ae4:	c0 92 4c 06 	sts	0x064C, r12	; 0x80064c <count_position>
   17ae8:	d0 92 4d 06 	sts	0x064D, r13	; 0x80064d <count_position+0x1>
   17aec:	e0 92 4e 06 	sts	0x064E, r14	; 0x80064e <count_position+0x2>
   17af0:	f0 92 4f 06 	sts	0x064F, r15	; 0x80064f <count_position+0x3>
   17af4:	cb 01       	movw	r24, r22
   17af6:	b0 e0       	ldi	r27, 0x00	; 0
   17af8:	a0 e0       	ldi	r26, 0x00	; 0
	if (xyzcal_dm&2) count_position[1] -= dy; else count_position[1] += dy;
   17afa:	c0 90 50 06 	lds	r12, 0x0650	; 0x800650 <count_position+0x4>
   17afe:	d0 90 51 06 	lds	r13, 0x0651	; 0x800651 <count_position+0x5>
   17b02:	e0 90 52 06 	lds	r14, 0x0652	; 0x800652 <count_position+0x6>
   17b06:	f0 90 53 06 	lds	r15, 0x0653	; 0x800653 <count_position+0x7>
   17b0a:	21 ff       	sbrs	r18, 1
   17b0c:	36 c0       	rjmp	.+108    	; 0x17b7a <xyzcal_update_pos(unsigned int, unsigned int, unsigned int, unsigned int)+0xc2>
   17b0e:	c8 1a       	sub	r12, r24
   17b10:	d9 0a       	sbc	r13, r25
   17b12:	ea 0a       	sbc	r14, r26
   17b14:	fb 0a       	sbc	r15, r27
   17b16:	c0 92 50 06 	sts	0x0650, r12	; 0x800650 <count_position+0x4>
   17b1a:	d0 92 51 06 	sts	0x0651, r13	; 0x800651 <count_position+0x5>
   17b1e:	e0 92 52 06 	sts	0x0652, r14	; 0x800652 <count_position+0x6>
   17b22:	f0 92 53 06 	sts	0x0653, r15	; 0x800653 <count_position+0x7>
   17b26:	70 e0       	ldi	r23, 0x00	; 0
   17b28:	60 e0       	ldi	r22, 0x00	; 0
	if (xyzcal_dm&4) count_position[2] -= dz; else count_position[2] += dz;
   17b2a:	80 91 54 06 	lds	r24, 0x0654	; 0x800654 <count_position+0x8>
   17b2e:	90 91 55 06 	lds	r25, 0x0655	; 0x800655 <count_position+0x9>
   17b32:	a0 91 56 06 	lds	r26, 0x0656	; 0x800656 <count_position+0xa>
   17b36:	b0 91 57 06 	lds	r27, 0x0657	; 0x800657 <count_position+0xb>
   17b3a:	22 ff       	sbrs	r18, 2
   17b3c:	2b c0       	rjmp	.+86     	; 0x17b94 <xyzcal_update_pos(unsigned int, unsigned int, unsigned int, unsigned int)+0xdc>
   17b3e:	84 1b       	sub	r24, r20
   17b40:	95 0b       	sbc	r25, r21
   17b42:	a6 0b       	sbc	r26, r22
   17b44:	b7 0b       	sbc	r27, r23
   17b46:	80 93 54 06 	sts	0x0654, r24	; 0x800654 <count_position+0x8>
   17b4a:	90 93 55 06 	sts	0x0655, r25	; 0x800655 <count_position+0x9>
   17b4e:	a0 93 56 06 	sts	0x0656, r26	; 0x800656 <count_position+0xa>
   17b52:	b0 93 57 06 	sts	0x0657, r27	; 0x800657 <count_position+0xb>
//	DBG(_n(" after xyzcal_update_pos x=%ld y=%ld z=%ld\n"), count_position[0], count_position[1], count_position[2]);
}
   17b56:	ff 90       	pop	r15
   17b58:	ef 90       	pop	r14
   17b5a:	df 90       	pop	r13
   17b5c:	cf 90       	pop	r12
   17b5e:	08 95       	ret
uint8_t xyzcal_dm = 0;

void xyzcal_update_pos(uint16_t dx, uint16_t dy, uint16_t dz, uint16_t)
{
//	DBG(_n("xyzcal_update_pos dx=%d dy=%d dz=%d dir=%02x\n"), dx, dy, dz, xyzcal_dm);
	if (xyzcal_dm&1) count_position[0] -= dx; else count_position[0] += dx;
   17b60:	8c 0d       	add	r24, r12
   17b62:	9d 1d       	adc	r25, r13
   17b64:	ae 1d       	adc	r26, r14
   17b66:	bf 1d       	adc	r27, r15
   17b68:	80 93 4c 06 	sts	0x064C, r24	; 0x80064c <count_position>
   17b6c:	90 93 4d 06 	sts	0x064D, r25	; 0x80064d <count_position+0x1>
   17b70:	a0 93 4e 06 	sts	0x064E, r26	; 0x80064e <count_position+0x2>
   17b74:	b0 93 4f 06 	sts	0x064F, r27	; 0x80064f <count_position+0x3>
   17b78:	bd cf       	rjmp	.-134    	; 0x17af4 <xyzcal_update_pos(unsigned int, unsigned int, unsigned int, unsigned int)+0x3c>
	if (xyzcal_dm&2) count_position[1] -= dy; else count_position[1] += dy;
   17b7a:	8c 0d       	add	r24, r12
   17b7c:	9d 1d       	adc	r25, r13
   17b7e:	ae 1d       	adc	r26, r14
   17b80:	bf 1d       	adc	r27, r15
   17b82:	80 93 50 06 	sts	0x0650, r24	; 0x800650 <count_position+0x4>
   17b86:	90 93 51 06 	sts	0x0651, r25	; 0x800651 <count_position+0x5>
   17b8a:	a0 93 52 06 	sts	0x0652, r26	; 0x800652 <count_position+0x6>
   17b8e:	b0 93 53 06 	sts	0x0653, r27	; 0x800653 <count_position+0x7>
   17b92:	c9 cf       	rjmp	.-110    	; 0x17b26 <xyzcal_update_pos(unsigned int, unsigned int, unsigned int, unsigned int)+0x6e>
	if (xyzcal_dm&4) count_position[2] -= dz; else count_position[2] += dz;
   17b94:	84 0f       	add	r24, r20
   17b96:	95 1f       	adc	r25, r21
   17b98:	a6 1f       	adc	r26, r22
   17b9a:	b7 1f       	adc	r27, r23
   17b9c:	d4 cf       	rjmp	.-88     	; 0x17b46 <xyzcal_update_pos(unsigned int, unsigned int, unsigned int, unsigned int)+0x8e>

00017b9e <Number(char const*, unsigned int*)>:
inline bool is_digit(char c)
{
    return c >= '0' && c <= '9';
}

char const * __attribute__((noinline)) Number(char const *str, uint16_t *v){
   17b9e:	fb 01       	movw	r30, r22
    *v = 0;
   17ba0:	11 82       	std	Z+1, r1	; 0x01
   17ba2:	10 82       	st	Z, r1
    while(is_digit(*str)){
        *v *= 10;
   17ba4:	6a e0       	ldi	r22, 0x0A	; 10
    return c == 0 || c == ' ' || c == '\t' || c == '\n' || c == '\r';
}

inline bool is_digit(char c)
{
    return c >= '0' && c <= '9';
   17ba6:	dc 01       	movw	r26, r24
   17ba8:	2c 91       	ld	r18, X
   17baa:	20 53       	subi	r18, 0x30	; 48
}

char const * __attribute__((noinline)) Number(char const *str, uint16_t *v){
    *v = 0;
    while(is_digit(*str)){
   17bac:	2a 30       	cpi	r18, 0x0A	; 10
   17bae:	a0 f4       	brcc	.+40     	; 0x17bd8 <Number(char const*, unsigned int*)+0x3a>
        *v *= 10;
   17bb0:	40 81       	ld	r20, Z
   17bb2:	51 81       	ldd	r21, Z+1	; 0x01
   17bb4:	64 9f       	mul	r22, r20
   17bb6:	90 01       	movw	r18, r0
   17bb8:	65 9f       	mul	r22, r21
   17bba:	30 0d       	add	r19, r0
   17bbc:	11 24       	eor	r1, r1
   17bbe:	31 83       	std	Z+1, r19	; 0x01
   17bc0:	20 83       	st	Z, r18
        *v += *str - '0';
   17bc2:	4d 91       	ld	r20, X+
   17bc4:	cd 01       	movw	r24, r26
   17bc6:	20 53       	subi	r18, 0x30	; 48
   17bc8:	31 09       	sbc	r19, r1
   17bca:	24 0f       	add	r18, r20
   17bcc:	31 1d       	adc	r19, r1
   17bce:	47 fd       	sbrc	r20, 7
   17bd0:	3a 95       	dec	r19
   17bd2:	31 83       	std	Z+1, r19	; 0x01
   17bd4:	20 83       	st	Z, r18
   17bd6:	e7 cf       	rjmp	.-50     	; 0x17ba6 <Number(char const*, unsigned int*)+0x8>
        ++str;
    }
    return str;
}
   17bd8:	08 95       	ret

00017bda <lcd_check_update_RAM(ClCheckMode*)>:
        case ClNozzleDiameter::_Diameter_800: MENU_ITEM_TOGGLE_P(_T(MSG_NOZZLE_DIAMETER), PSTR("0.80"), lcd_nozzle_diameter_cycle); break;\
    }\
}\
while (0)

static void lcd_check_update_RAM(ClCheckMode * oCheckSetting) {
   17bda:	fc 01       	movw	r30, r24
    switch(*oCheckSetting) {
   17bdc:	80 81       	ld	r24, Z
   17bde:	88 23       	and	r24, r24
   17be0:	21 f0       	breq	.+8      	; 0x17bea <lcd_check_update_RAM(ClCheckMode*)+0x10>
   17be2:	81 30       	cpi	r24, 0x01	; 1
   17be4:	29 f4       	brne	.+10     	; 0x17bf0 <lcd_check_update_RAM(ClCheckMode*)+0x16>
        case ClCheckMode::_None:
            *oCheckSetting = ClCheckMode::_Warn;
            break;
        case ClCheckMode::_Warn:
            *oCheckSetting = ClCheckMode::_Strict;
   17be6:	82 e0       	ldi	r24, 0x02	; 2
   17be8:	01 c0       	rjmp	.+2      	; 0x17bec <lcd_check_update_RAM(ClCheckMode*)+0x12>
while (0)

static void lcd_check_update_RAM(ClCheckMode * oCheckSetting) {
    switch(*oCheckSetting) {
        case ClCheckMode::_None:
            *oCheckSetting = ClCheckMode::_Warn;
   17bea:	81 e0       	ldi	r24, 0x01	; 1
            break;
        case ClCheckMode::_Warn:
            *oCheckSetting = ClCheckMode::_Strict;
   17bec:	80 83       	st	Z, r24
   17bee:	08 95       	ret
            break;
        case ClCheckMode::_Strict:
            *oCheckSetting = ClCheckMode::_None;
   17bf0:	10 82       	st	Z, r1
            break;
        default:
            *oCheckSetting = ClCheckMode::_None;
    }
}
   17bf2:	08 95       	ret

00017bf4 <pgm_is_whitespace(char const*)>:

#endif // TMC2130

static inline bool pgm_is_whitespace(const char *c_addr)
{
    const char c = pgm_read_byte(c_addr);
   17bf4:	fc 01       	movw	r30, r24
   17bf6:	94 91       	lpm	r25, Z
    return c == ' ' || c == '\t' || c == '\r' || c == '\n';
   17bf8:	90 32       	cpi	r25, 0x20	; 32
   17bfa:	49 f0       	breq	.+18     	; 0x17c0e <pgm_is_whitespace(char const*)+0x1a>
   17bfc:	87 ef       	ldi	r24, 0xF7	; 247
   17bfe:	89 0f       	add	r24, r25
   17c00:	82 30       	cpi	r24, 0x02	; 2
   17c02:	28 f0       	brcs	.+10     	; 0x17c0e <pgm_is_whitespace(char const*)+0x1a>
   17c04:	81 e0       	ldi	r24, 0x01	; 1
   17c06:	9d 30       	cpi	r25, 0x0D	; 13
   17c08:	19 f0       	breq	.+6      	; 0x17c10 <pgm_is_whitespace(char const*)+0x1c>
   17c0a:	80 e0       	ldi	r24, 0x00	; 0
   17c0c:	08 95       	ret
   17c0e:	81 e0       	ldi	r24, 0x01	; 1
}
   17c10:	08 95       	ret

00017c12 <MMU2::MMU2::execute_load_to_nozzle_sequence() [clone .constprop.41]>:
    planner_synchronize();

    Disable_E0();
}

void MMU2::execute_load_to_nozzle_sequence() {
   17c12:	cf 93       	push	r28
   17c14:	df 93       	push	r29
bool planner_draining() {
    return planner_aborted;
}

void planner_synchronize() {
    st_synchronize();
   17c16:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
float planner_get_current_position_E() {
    return current_position[E_AXIS];
}

void planner_set_current_position_E(float e) {
        current_position[E_AXIS] = e;
   17c1a:	c1 e6       	ldi	r28, 0x61	; 97
   17c1c:	d2 e1       	ldi	r29, 0x12	; 18
    planner_synchronize();
    // Compensate for configurable Extra Loading Distance
    planner_set_current_position_E(planner_get_current_position_E() - (logic.ExtraLoadDistance() - MMU2_FILAMENT_SENSOR_POSITION));
   17c1e:	60 91 de 12 	lds	r22, 0x12DE	; 0x8012de <MMU2::mmu2+0x4c>
   17c22:	70 e0       	ldi	r23, 0x00	; 0
   17c24:	90 e0       	ldi	r25, 0x00	; 0
   17c26:	80 e0       	ldi	r24, 0x00	; 0
   17c28:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   17c2c:	20 e0       	ldi	r18, 0x00	; 0
   17c2e:	30 e0       	ldi	r19, 0x00	; 0
   17c30:	40 e8       	ldi	r20, 0x80	; 128
   17c32:	51 e4       	ldi	r21, 0x41	; 65
   17c34:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   17c38:	9b 01       	movw	r18, r22
   17c3a:	ac 01       	movw	r20, r24
   17c3c:	6c 85       	ldd	r22, Y+12	; 0x0c
   17c3e:	7d 85       	ldd	r23, Y+13	; 0x0d
   17c40:	8e 85       	ldd	r24, Y+14	; 0x0e
   17c42:	9f 85       	ldd	r25, Y+15	; 0x0f
   17c44:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   17c48:	6c 87       	std	Y+12, r22	; 0x0c
   17c4a:	7d 87       	std	Y+13, r23	; 0x0d
   17c4c:	8e 87       	std	Y+14, r24	; 0x0e
   17c4e:	9f 87       	std	Y+15, r25	; 0x0f
    execute_extruder_sequence(load_to_nozzle_sequence, sizeof(load_to_nozzle_sequence) / sizeof(load_to_nozzle_sequence[0]));
   17c50:	62 e0       	ldi	r22, 0x02	; 2
   17c52:	80 e9       	ldi	r24, 0x90	; 144
   17c54:	97 e8       	ldi	r25, 0x87	; 135
}
   17c56:	df 91       	pop	r29
   17c58:	cf 91       	pop	r28

void MMU2::execute_load_to_nozzle_sequence() {
    planner_synchronize();
    // Compensate for configurable Extra Loading Distance
    planner_set_current_position_E(planner_get_current_position_E() - (logic.ExtraLoadDistance() - MMU2_FILAMENT_SENSOR_POSITION));
    execute_extruder_sequence(load_to_nozzle_sequence, sizeof(load_to_nozzle_sequence) / sizeof(load_to_nozzle_sequence[0]));
   17c5a:	0d 94 7d 79 	jmp	0x2f2fa	; 0x2f2fa <MMU2::MMU2::execute_extruder_sequence(E_Step const*, unsigned char) [clone .constprop.111]>

00017c5e <menu_item_function_E(Sheet const&, void (*)()) [clone .constprop.16]>:
        }
    }
    menu_item++;
}

void __attribute__((noinline)) menu_item_function_E(const Sheet &sheet, menu_func_t func)
   17c5e:	df 92       	push	r13
   17c60:	ef 92       	push	r14
   17c62:	ff 92       	push	r15
   17c64:	0f 93       	push	r16
   17c66:	1f 93       	push	r17
   17c68:	cf 93       	push	r28
   17c6a:	df 93       	push	r29
   17c6c:	cd b7       	in	r28, 0x3d	; 61
   17c6e:	de b7       	in	r29, 0x3e	; 62
   17c70:	63 97       	sbiw	r28, 0x13	; 19
   17c72:	0f b6       	in	r0, 0x3f	; 63
   17c74:	f8 94       	cli
   17c76:	de bf       	out	0x3e, r29	; 62
   17c78:	0f be       	out	0x3f, r0	; 63
   17c7a:	cd bf       	out	0x3d, r28	; 61
{
    if (menu_item == menu_line)
   17c7c:	30 91 63 04 	lds	r19, 0x0463	; 0x800463 <menu_item>
   17c80:	20 91 62 04 	lds	r18, 0x0462	; 0x800462 <menu_line>
   17c84:	32 13       	cpse	r19, r18
   17c86:	73 c0       	rjmp	.+230    	; 0x17d6e <menu_item_function_E(Sheet const&, void (*)()) [clone .constprop.16]+0x110>
   17c88:	7c 01       	movw	r14, r24
    {
        if (lcd_draw_update) menu_draw_item_select_sheet_E(' ', sheet);
   17c8a:	80 91 59 02 	lds	r24, 0x0259	; 0x800259 <lcd_draw_update>
   17c8e:	88 23       	and	r24, r24
   17c90:	09 f4       	brne	.+2      	; 0x17c94 <menu_item_function_E(Sheet const&, void (*)()) [clone .constprop.16]+0x36>
   17c92:	45 c0       	rjmp	.+138    	; 0x17d1e <menu_item_function_E(Sheet const&, void (*)()) [clone .constprop.16]+0xc0>
//!
//! @param[in] sheet_E Sheet in EEPROM
//! @param[out] buffer for formatted output
void menu_format_sheet_select_E(const Sheet &sheet_E, SheetFormatBuffer &buffer)
{
    uint_least8_t index = sprintf_P(buffer.c,PSTR("%-9.9S["), _T(MSG_SHEET));
   17c94:	88 e7       	ldi	r24, 0x78	; 120
   17c96:	9e e4       	ldi	r25, 0x4E	; 78
   17c98:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   17c9c:	9f 93       	push	r25
   17c9e:	8f 93       	push	r24
   17ca0:	82 e8       	ldi	r24, 0x82	; 130
   17ca2:	97 e8       	ldi	r25, 0x87	; 135
   17ca4:	9f 93       	push	r25
   17ca6:	8f 93       	push	r24
   17ca8:	8e 01       	movw	r16, r28
   17caa:	0f 5f       	subi	r16, 0xFF	; 255
   17cac:	1f 4f       	sbci	r17, 0xFF	; 255
   17cae:	1f 93       	push	r17
   17cb0:	0f 93       	push	r16
   17cb2:	0f 94 f7 a2 	call	0x345ee	; 0x345ee <sprintf_P>
   17cb6:	d8 2e       	mov	r13, r24
    eeprom_read_block(&(buffer.c[index]), sheet_E.name, sizeof(sheet_E.name)/sizeof(sheet_E.name[0]));
   17cb8:	47 e0       	ldi	r20, 0x07	; 7
   17cba:	50 e0       	ldi	r21, 0x00	; 0
   17cbc:	b7 01       	movw	r22, r14
   17cbe:	80 0f       	add	r24, r16
   17cc0:	91 2f       	mov	r25, r17
   17cc2:	91 1d       	adc	r25, r1
   17cc4:	0f 94 d0 a3 	call	0x347a0	; 0x347a0 <eeprom_read_block>
   17cc8:	0f 90       	pop	r0
   17cca:	0f 90       	pop	r0
   17ccc:	0f 90       	pop	r0
   17cce:	0f 90       	pop	r0
   17cd0:	0f 90       	pop	r0
   17cd2:	0f 90       	pop	r0
   17cd4:	20 e0       	ldi	r18, 0x00	; 0
   17cd6:	82 2f       	mov	r24, r18
   17cd8:	8d 0d       	add	r24, r13
   17cda:	90 e0       	ldi	r25, 0x00	; 0
    for (const uint_least8_t start = index; static_cast<uint_least8_t>(index - start) < sizeof(sheet_E.name)/sizeof(sheet_E.name[0]); ++index)
   17cdc:	27 30       	cpi	r18, 0x07	; 7
   17cde:	39 f0       	breq	.+14     	; 0x17cee <menu_item_function_E(Sheet const&, void (*)()) [clone .constprop.16]+0x90>
   17ce0:	2f 5f       	subi	r18, 0xFF	; 255
    {
        if (buffer.c[index] == '\0') break;
   17ce2:	f8 01       	movw	r30, r16
   17ce4:	e8 0f       	add	r30, r24
   17ce6:	f9 1f       	adc	r31, r25
   17ce8:	30 81       	ld	r19, Z
   17cea:	31 11       	cpse	r19, r1
   17cec:	f4 cf       	rjmp	.-24     	; 0x17cd6 <menu_item_function_E(Sheet const&, void (*)()) [clone .constprop.16]+0x78>
    }
	buffer.c[index] = ']';
   17cee:	f8 01       	movw	r30, r16
   17cf0:	e8 0f       	add	r30, r24
   17cf2:	f9 1f       	adc	r31, r25
   17cf4:	2d e5       	ldi	r18, 0x5D	; 93
   17cf6:	20 83       	st	Z, r18
    buffer.c[index + 1] = '\0';
   17cf8:	8c 0f       	add	r24, r28
   17cfa:	9d 1f       	adc	r25, r29
   17cfc:	fc 01       	movw	r30, r24
   17cfe:	12 82       	std	Z+2, r1	; 0x02

static void menu_draw_item_select_sheet_E(char type_char, const Sheet &sheet)
{
    SheetFormatBuffer buffer;
    menu_format_sheet_select_E(sheet, buffer);
    lcd_putc_at(0, menu_row, menu_selection_mark());
   17d00:	0e 94 66 62 	call	0xc4cc	; 0xc4cc <menu_selection_mark() [clone .lto_priv.401]>
   17d04:	48 2f       	mov	r20, r24
   17d06:	60 91 60 04 	lds	r22, 0x0460	; 0x800460 <menu_row>
   17d0a:	80 e0       	ldi	r24, 0x00	; 0
   17d0c:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
    lcd_print_pad(buffer.c, LCD_WIDTH - 2);
   17d10:	62 e1       	ldi	r22, 0x12	; 18
   17d12:	c8 01       	movw	r24, r16
   17d14:	0e 94 47 73 	call	0xe68e	; 0xe68e <lcd_print_pad(char const*, unsigned char)>
    lcd_putc(type_char);
   17d18:	80 e2       	ldi	r24, 0x20	; 32
   17d1a:	0e 94 21 6f 	call	0xde42	; 0xde42 <lcd_putc(char)>
void __attribute__((noinline)) menu_item_function_E(const Sheet &sheet, menu_func_t func)
{
    if (menu_item == menu_line)
    {
        if (lcd_draw_update) menu_draw_item_select_sheet_E(' ', sheet);
        if (menu_clicked && (lcd_encoder == menu_item))
   17d1e:	80 91 61 04 	lds	r24, 0x0461	; 0x800461 <menu_clicked>
   17d22:	88 23       	and	r24, r24
   17d24:	21 f1       	breq	.+72     	; 0x17d6e <menu_item_function_E(Sheet const&, void (*)()) [clone .constprop.16]+0x110>
   17d26:	20 91 63 04 	lds	r18, 0x0463	; 0x800463 <menu_item>
   17d2a:	80 91 1e 06 	lds	r24, 0x061E	; 0x80061e <lcd_encoder>
   17d2e:	90 91 1f 06 	lds	r25, 0x061F	; 0x80061f <lcd_encoder+0x1>
   17d32:	28 17       	cp	r18, r24
   17d34:	19 06       	cpc	r1, r25
   17d36:	d9 f4       	brne	.+54     	; 0x17d6e <menu_item_function_E(Sheet const&, void (*)()) [clone .constprop.16]+0x110>
        {
            lcd_update_enabled = 0;
   17d38:	10 92 5a 02 	sts	0x025A, r1	; 0x80025a <lcd_update_enabled>
            if (func) func();
   17d3c:	8a ea       	ldi	r24, 0xAA	; 170
   17d3e:	98 e7       	ldi	r25, 0x78	; 120
   17d40:	89 2b       	or	r24, r25
   17d42:	11 f0       	breq	.+4      	; 0x17d48 <menu_item_function_E(Sheet const&, void (*)()) [clone .constprop.16]+0xea>
   17d44:	0e 94 aa 78 	call	0xf154	; 0xf154 <eeprom_switch_to_next_sheet()>
            lcd_update_enabled = 1;
   17d48:	81 e0       	ldi	r24, 0x01	; 1
   17d4a:	80 93 5a 02 	sts	0x025A, r24	; 0x80025a <lcd_update_enabled>
            menu_item_ret();
   17d4e:	0e 94 73 62 	call	0xc4e6	; 0xc4e6 <menu_item_ret()>
            return;
        }
    }
    menu_item++;
}
   17d52:	63 96       	adiw	r28, 0x13	; 19
   17d54:	0f b6       	in	r0, 0x3f	; 63
   17d56:	f8 94       	cli
   17d58:	de bf       	out	0x3e, r29	; 62
   17d5a:	0f be       	out	0x3f, r0	; 63
   17d5c:	cd bf       	out	0x3d, r28	; 61
   17d5e:	df 91       	pop	r29
   17d60:	cf 91       	pop	r28
   17d62:	1f 91       	pop	r17
   17d64:	0f 91       	pop	r16
   17d66:	ff 90       	pop	r15
   17d68:	ef 90       	pop	r14
   17d6a:	df 90       	pop	r13
   17d6c:	08 95       	ret
            lcd_update_enabled = 1;
            menu_item_ret();
            return;
        }
    }
    menu_item++;
   17d6e:	80 91 63 04 	lds	r24, 0x0463	; 0x800463 <menu_item>
   17d72:	8f 5f       	subi	r24, 0xFF	; 255
   17d74:	80 93 63 04 	sts	0x0463, r24	; 0x800463 <menu_item>
   17d78:	ec cf       	rjmp	.-40     	; 0x17d52 <menu_item_function_E(Sheet const&, void (*)()) [clone .constprop.16]+0xf4>

00017d7a <lcd_send_action_start()>:
}

//! @brief Send host action "start"
void lcd_send_action_start()
{
    SERIAL_PROTOCOLLNRPGM(MSG_HOST_ACTION_START);
   17d7a:	89 eb       	ldi	r24, 0xB9	; 185
   17d7c:	98 e6       	ldi	r25, 0x68	; 104
   17d7e:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
    lcd_return_to_status();
   17d82:	0d 94 d5 07 	jmp	0x20faa	; 0x20faa <lcd_return_to_status()>

00017d86 <lcd_printer_ready_state_toggle()>:
//! Sends the printer state for next print via LCD menu to host
//! The host has to set the printer ready state with `M72` to keep printer in sync with the host
//! @endcode
static void lcd_printer_ready_state_toggle()
{
    if (GetPrinterState() == PrinterState::IsReady) {
   17d86:	80 91 61 0d 	lds	r24, 0x0D61	; 0x800d61 <_ZL13printer_state.lto_priv.386>
   17d8a:	81 30       	cpi	r24, 0x01	; 1
   17d8c:	21 f4       	brne	.+8      	; 0x17d96 <lcd_printer_ready_state_toggle()+0x10>
        SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_NOT_READY);
   17d8e:	8b e6       	ldi	r24, 0x6B	; 107
   17d90:	98 e6       	ldi	r25, 0x68	; 104
    }
    else {
        SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_READY);
   17d92:	0c 94 bd 7c 	jmp	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   17d96:	8c e5       	ldi	r24, 0x5C	; 92
   17d98:	98 e6       	ldi	r25, 0x68	; 104
   17d9a:	fb cf       	rjmp	.-10     	; 0x17d92 <lcd_printer_ready_state_toggle()+0xc>

00017d9c <fsensor_reinit()>:
#endif // TMC2130

#ifdef FILAMENT_SENSOR

static void fsensor_reinit() {
    fsensor.init();
   17d9c:	0d 94 dc 6d 	jmp	0x2dbb8	; 0x2dbb8 <PAT9125_sensor::init() [clone .constprop.206]>

00017da0 <lcd_selftest_screen_step(unsigned char, unsigned char, unsigned char, char const*, char)>:

	return (_progress >= _progress_scale * 2) ? 0 : _progress;
}

static void lcd_selftest_screen_step(const uint8_t _row, const uint8_t _col, const uint8_t _state, const char *_name_PROGMEM, const char _indicator)
{
   17da0:	0f 93       	push	r16
   17da2:	1f 93       	push	r17
   17da4:	cf 93       	push	r28
   17da6:	df 93       	push	r29
   17da8:	98 2f       	mov	r25, r24
   17daa:	86 2f       	mov	r24, r22
   17dac:	14 2f       	mov	r17, r20
   17dae:	e9 01       	movw	r28, r18
	lcd_set_cursor(_col, _row);
   17db0:	69 2f       	mov	r22, r25
   17db2:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
	switch (_state)
   17db6:	11 30       	cpi	r17, 0x01	; 1
   17db8:	21 f0       	breq	.+8      	; 0x17dc2 <lcd_selftest_screen_step(unsigned char, unsigned char, unsigned char, char const*, char)+0x22>
   17dba:	12 30       	cpi	r17, 0x02	; 2
   17dbc:	79 f0       	breq	.+30     	; 0x17ddc <lcd_selftest_screen_step(unsigned char, unsigned char, unsigned char, char const*, char)+0x3c>
		lcd_puts_P(_name_PROGMEM);
		lcd_putc(':');
		lcd_puts_P(MSG_OK_CAPS);
		break;
	default:
		lcd_puts_P(_name_PROGMEM);
   17dbe:	ce 01       	movw	r24, r28
   17dc0:	15 c0       	rjmp	.+42     	; 0x17dec <lcd_selftest_screen_step(unsigned char, unsigned char, unsigned char, char const*, char)+0x4c>
{
	lcd_set_cursor(_col, _row);
	switch (_state)
	{
	case 1:
		lcd_puts_P(_name_PROGMEM);
   17dc2:	ce 01       	movw	r24, r28
   17dc4:	0e 94 1d 6f 	call	0xde3a	; 0xde3a <lcd_puts_P(char const*)>
		lcd_putc(':');
   17dc8:	8a e3       	ldi	r24, 0x3A	; 58
   17dca:	0e 94 21 6f 	call	0xde42	; 0xde42 <lcd_putc(char)>
		lcd_putc(_indicator);
   17dce:	80 2f       	mov	r24, r16
		lcd_puts_P(MSG_OK_CAPS);
		break;
	default:
		lcd_puts_P(_name_PROGMEM);
	}
}
   17dd0:	df 91       	pop	r29
   17dd2:	cf 91       	pop	r28
   17dd4:	1f 91       	pop	r17
   17dd6:	0f 91       	pop	r16
	switch (_state)
	{
	case 1:
		lcd_puts_P(_name_PROGMEM);
		lcd_putc(':');
		lcd_putc(_indicator);
   17dd8:	0c 94 21 6f 	jmp	0xde42	; 0xde42 <lcd_putc(char)>
		break;
	case 2:
		lcd_puts_P(_name_PROGMEM);
   17ddc:	ce 01       	movw	r24, r28
   17dde:	0e 94 1d 6f 	call	0xde3a	; 0xde3a <lcd_puts_P(char const*)>
		lcd_putc(':');
   17de2:	8a e3       	ldi	r24, 0x3A	; 58
   17de4:	0e 94 21 6f 	call	0xde42	; 0xde42 <lcd_putc(char)>
		lcd_puts_P(MSG_OK_CAPS);
   17de8:	82 e9       	ldi	r24, 0x92	; 146
   17dea:	98 e6       	ldi	r25, 0x68	; 104
		break;
	default:
		lcd_puts_P(_name_PROGMEM);
	}
}
   17dec:	df 91       	pop	r29
   17dee:	cf 91       	pop	r28
   17df0:	1f 91       	pop	r17
   17df2:	0f 91       	pop	r16
		lcd_puts_P(_name_PROGMEM);
		lcd_putc(':');
		lcd_puts_P(MSG_OK_CAPS);
		break;
	default:
		lcd_puts_P(_name_PROGMEM);
   17df4:	0c 94 1d 6f 	jmp	0xde3a	; 0xde3a <lcd_puts_P(char const*)>

00017df8 <lcd_print_state(unsigned char)>:
}
#endif // not defined TMC2130

static void lcd_print_state(uint8_t state)
{
	switch (state) {
   17df8:	81 30       	cpi	r24, 0x01	; 1
   17dfa:	21 f4       	brne	.+8      	; 0x17e04 <lcd_print_state(unsigned char)+0xc>
		case STATE_ON:
			lcd_puts_P(_N("  1"));
   17dfc:	88 ea       	ldi	r24, 0xA8	; 168
   17dfe:	97 e6       	ldi	r25, 0x67	; 103
		break;
		case STATE_OFF:
			lcd_puts_P(_N("  0"));
   17e00:	0c 94 1d 6f 	jmp	0xde3a	; 0xde3a <lcd_puts_P(char const*)>
   17e04:	84 ea       	ldi	r24, 0xA4	; 164
   17e06:	97 e6       	ldi	r25, 0x67	; 103
   17e08:	fb cf       	rjmp	.-10     	; 0x17e00 <lcd_print_state(unsigned char)+0x8>

00017e0a <lcd_heat_bed_on_load_toggle()>:
}
#endif //PINDA_TEMP_COMP

void lcd_heat_bed_on_load_toggle()
{
    uint8_t value = eeprom_read_byte((uint8_t*)EEPROM_HEAT_BED_ON_LOAD_FILAMENT);
   17e0a:	87 ea       	ldi	r24, 0xA7	; 167
   17e0c:	9c e0       	ldi	r25, 0x0C	; 12
   17e0e:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
    if (value > 1)
        value = 1;
   17e12:	61 e0       	ldi	r22, 0x01	; 1
#endif //PINDA_TEMP_COMP

void lcd_heat_bed_on_load_toggle()
{
    uint8_t value = eeprom_read_byte((uint8_t*)EEPROM_HEAT_BED_ON_LOAD_FILAMENT);
    if (value > 1)
   17e14:	82 30       	cpi	r24, 0x02	; 2
   17e16:	08 f4       	brcc	.+2      	; 0x17e1a <lcd_heat_bed_on_load_toggle()+0x10>
   17e18:	68 27       	eor	r22, r24
   17e1a:	87 ea       	ldi	r24, 0xA7	; 167
   17e1c:	9c e0       	ldi	r25, 0x0C	; 12
   17e1e:	0d 94 04 a4 	jmp	0x34808	; 0x34808 <eeprom_update_byte>

00017e22 <mbl_probe_nr_toggle()>:
	else mesh_nr = 3;
	eeprom_update_byte_notify((uint8_t*)EEPROM_MBL_POINTS_NR, mesh_nr);
}

static void mbl_probe_nr_toggle() {
	uint8_t mbl_z_probe_nr = eeprom_read_byte((uint8_t*)EEPROM_MBL_PROBE_NR);
   17e22:	8a ea       	ldi	r24, 0xAA	; 170
   17e24:	9d e0       	ldi	r25, 0x0D	; 13
   17e26:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
	switch (mbl_z_probe_nr) {
		case 1: mbl_z_probe_nr = 3; break;
		case 3: mbl_z_probe_nr = 5; break;
   17e2a:	65 e0       	ldi	r22, 0x05	; 5
	eeprom_update_byte_notify((uint8_t*)EEPROM_MBL_POINTS_NR, mesh_nr);
}

static void mbl_probe_nr_toggle() {
	uint8_t mbl_z_probe_nr = eeprom_read_byte((uint8_t*)EEPROM_MBL_PROBE_NR);
	switch (mbl_z_probe_nr) {
   17e2c:	83 30       	cpi	r24, 0x03	; 3
   17e2e:	21 f0       	breq	.+8      	; 0x17e38 <mbl_probe_nr_toggle()+0x16>
		case 1: mbl_z_probe_nr = 3; break;
		case 3: mbl_z_probe_nr = 5; break;
		case 5: mbl_z_probe_nr = 1; break;
   17e30:	61 e0       	ldi	r22, 0x01	; 1
	eeprom_update_byte_notify((uint8_t*)EEPROM_MBL_POINTS_NR, mesh_nr);
}

static void mbl_probe_nr_toggle() {
	uint8_t mbl_z_probe_nr = eeprom_read_byte((uint8_t*)EEPROM_MBL_PROBE_NR);
	switch (mbl_z_probe_nr) {
   17e32:	85 30       	cpi	r24, 0x05	; 5
   17e34:	09 f0       	breq	.+2      	; 0x17e38 <mbl_probe_nr_toggle()+0x16>
		case 1: mbl_z_probe_nr = 3; break;
   17e36:	63 e0       	ldi	r22, 0x03	; 3
   17e38:	8a ea       	ldi	r24, 0xAA	; 170
   17e3a:	9d e0       	ldi	r25, 0x0D	; 13
   17e3c:	0d 94 04 a4 	jmp	0x34808	; 0x34808 <eeprom_update_byte>

00017e40 <mbl_mesh_toggle()>:
	magnet_elimination = !magnet_elimination;
	eeprom_update_byte_notify((uint8_t*)EEPROM_MBL_MAGNET_ELIMINATION, (uint8_t)magnet_elimination);
}

static void mbl_mesh_toggle() {
	uint8_t mesh_nr = eeprom_read_byte((uint8_t*)EEPROM_MBL_POINTS_NR);
   17e40:	8b ea       	ldi	r24, 0xAB	; 171
   17e42:	9d e0       	ldi	r25, 0x0D	; 13
   17e44:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
	if(mesh_nr == 3) mesh_nr = 7;
	else mesh_nr = 3;
   17e48:	63 e0       	ldi	r22, 0x03	; 3
	eeprom_update_byte_notify((uint8_t*)EEPROM_MBL_MAGNET_ELIMINATION, (uint8_t)magnet_elimination);
}

static void mbl_mesh_toggle() {
	uint8_t mesh_nr = eeprom_read_byte((uint8_t*)EEPROM_MBL_POINTS_NR);
	if(mesh_nr == 3) mesh_nr = 7;
   17e4a:	83 30       	cpi	r24, 0x03	; 3
   17e4c:	09 f4       	brne	.+2      	; 0x17e50 <mbl_mesh_toggle()+0x10>
   17e4e:	67 e0       	ldi	r22, 0x07	; 7
   17e50:	8b ea       	ldi	r24, 0xAB	; 171
   17e52:	9d e0       	ldi	r25, 0x0D	; 13
   17e54:	0d 94 04 a4 	jmp	0x34808	; 0x34808 <eeprom_update_byte>

00017e58 <mbl_magnets_elimination_toggle()>:
#endif //LCD_BL_PIN
	MENU_END();
}

static void mbl_magnets_elimination_toggle() {
	bool magnet_elimination = (eeprom_read_byte((uint8_t*)EEPROM_MBL_MAGNET_ELIMINATION) > 0);
   17e58:	8c ea       	ldi	r24, 0xAC	; 172
   17e5a:	9d e0       	ldi	r25, 0x0D	; 13
   17e5c:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
	magnet_elimination = !magnet_elimination;
   17e60:	61 e0       	ldi	r22, 0x01	; 1
   17e62:	81 11       	cpse	r24, r1
   17e64:	60 e0       	ldi	r22, 0x00	; 0
   17e66:	8c ea       	ldi	r24, 0xAC	; 172
   17e68:	9d e0       	ldi	r25, 0x0D	; 13
   17e6a:	0d 94 04 a4 	jmp	0x34808	; 0x34808 <eeprom_update_byte>

00017e6e <lcd_check_filament_set()>:
    lcd_check_update_RAM(&oCheckVersion);
    eeprom_update_byte_notify((uint8_t*)EEPROM_CHECK_VERSION,(uint8_t)oCheckVersion);
}

static void lcd_check_filament_set() {
    lcd_check_update_RAM(&oCheckFilament);
   17e6e:	8e ee       	ldi	r24, 0xEE	; 238
   17e70:	93 e0       	ldi	r25, 0x03	; 3
   17e72:	0e 94 ed bd 	call	0x17bda	; 0x17bda <lcd_check_update_RAM(ClCheckMode*)>
   17e76:	60 91 ee 03 	lds	r22, 0x03EE	; 0x8003ee <oCheckFilament>
   17e7a:	80 e2       	ldi	r24, 0x20	; 32
   17e7c:	9c e0       	ldi	r25, 0x0C	; 12
   17e7e:	0d 94 04 a4 	jmp	0x34808	; 0x34808 <eeprom_update_byte>

00017e82 <lcd_check_version_set()>:
    lcd_check_update_RAM(&oCheckModel);
    eeprom_update_byte_notify((uint8_t*)EEPROM_CHECK_MODEL,(uint8_t)oCheckModel);
}

static void lcd_check_version_set() {
    lcd_check_update_RAM(&oCheckVersion);
   17e82:	89 ee       	ldi	r24, 0xE9	; 233
   17e84:	93 e0       	ldi	r25, 0x03	; 3
   17e86:	0e 94 ed bd 	call	0x17bda	; 0x17bda <lcd_check_update_RAM(ClCheckMode*)>
   17e8a:	60 91 e9 03 	lds	r22, 0x03E9	; 0x8003e9 <oCheckVersion>
   17e8e:	83 ea       	ldi	r24, 0xA3	; 163
   17e90:	9d e0       	ldi	r25, 0x0D	; 13
   17e92:	0d 94 04 a4 	jmp	0x34808	; 0x34808 <eeprom_update_byte>

00017e96 <lcd_check_model_set()>:
    lcd_check_update_RAM(&oCheckMode);
    eeprom_update_byte_notify((uint8_t*)EEPROM_CHECK_MODE,(uint8_t)oCheckMode);
}

static void lcd_check_model_set() {
    lcd_check_update_RAM(&oCheckModel);
   17e96:	8a ee       	ldi	r24, 0xEA	; 234
   17e98:	93 e0       	ldi	r25, 0x03	; 3
   17e9a:	0e 94 ed bd 	call	0x17bda	; 0x17bda <lcd_check_update_RAM(ClCheckMode*)>
   17e9e:	60 91 ea 03 	lds	r22, 0x03EA	; 0x8003ea <oCheckModel>
   17ea2:	84 ea       	ldi	r24, 0xA4	; 164
   17ea4:	9d e0       	ldi	r25, 0x0D	; 13
   17ea6:	0d 94 04 a4 	jmp	0x34808	; 0x34808 <eeprom_update_byte>

00017eaa <lcd_check_mode_set()>:
            *oCheckSetting = ClCheckMode::_None;
    }
}

static void lcd_check_mode_set() {
    lcd_check_update_RAM(&oCheckMode);
   17eaa:	8d ee       	ldi	r24, 0xED	; 237
   17eac:	93 e0       	ldi	r25, 0x03	; 3
   17eae:	0e 94 ed bd 	call	0x17bda	; 0x17bda <lcd_check_update_RAM(ClCheckMode*)>
   17eb2:	60 91 ed 03 	lds	r22, 0x03ED	; 0x8003ed <oCheckMode>
   17eb6:	88 ea       	ldi	r24, 0xA8	; 168
   17eb8:	9d e0       	ldi	r25, 0x0D	; 13
   17eba:	0d 94 04 a4 	jmp	0x34808	; 0x34808 <eeprom_update_byte>

00017ebe <lcd_fsensor_actionNA_set()>:
#endif //FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125

static void lcd_fsensor_actionNA_set(void)
{
    Filament_sensor::SensorActionOnError act = fsensor.getActionOnError();
    switch(act) {
   17ebe:	80 91 f9 16 	lds	r24, 0x16F9	; 0x8016f9 <fsensor+0x8>
        case Filament_sensor::SensorActionOnError::_Continue:
            act = Filament_sensor::SensorActionOnError::_Pause;
            break;
        case Filament_sensor::SensorActionOnError::_Pause:
            act = Filament_sensor::SensorActionOnError::_Continue;
   17ec2:	60 e0       	ldi	r22, 0x00	; 0
#endif //FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125

static void lcd_fsensor_actionNA_set(void)
{
    Filament_sensor::SensorActionOnError act = fsensor.getActionOnError();
    switch(act) {
   17ec4:	81 11       	cpse	r24, r1
   17ec6:	01 c0       	rjmp	.+2      	; 0x17eca <lcd_fsensor_actionNA_set()+0xc>
        case Filament_sensor::SensorActionOnError::_Continue:
            act = Filament_sensor::SensorActionOnError::_Pause;
   17ec8:	61 e0       	ldi	r22, 0x01	; 1
        eeprom_update_byte_notify((uint8_t *)EEPROM_FSENS_RUNOUT_ENABLED, state);
    }
}

void Filament_sensor::setActionOnError(SensorActionOnError state, bool updateEEPROM) {
    sensorActionOnError = state;
   17eca:	60 93 f9 16 	sts	0x16F9, r22	; 0x8016f9 <fsensor+0x8>
   17ece:	87 e4       	ldi	r24, 0x47	; 71
   17ed0:	9d e0       	ldi	r25, 0x0D	; 13
   17ed2:	0d 94 04 a4 	jmp	0x34808	; 0x34808 <eeprom_update_byte>

00017ed6 <lcd_fsensor_autoload_set()>:
static void lcd_fsensor_runout_set() {
    fsensor.setRunoutEnabled(!fsensor.getRunoutEnabled(), true);
}

static void lcd_fsensor_autoload_set() {
    fsensor.setAutoLoadEnabled(!fsensor.getAutoLoadEnabled(), true);
   17ed6:	e1 ef       	ldi	r30, 0xF1	; 241
   17ed8:	f6 e1       	ldi	r31, 0x16	; 22
   17eda:	61 81       	ldd	r22, Z+1	; 0x01
   17edc:	81 e0       	ldi	r24, 0x01	; 1
   17ede:	68 27       	eor	r22, r24
        fsensor.deinit();
    }
}

void Filament_sensor::setAutoLoadEnabled(bool state, bool updateEEPROM) {
    autoLoadEnabled = state;
   17ee0:	61 83       	std	Z+1, r22	; 0x01
   17ee2:	87 e0       	ldi	r24, 0x07	; 7
   17ee4:	9f e0       	ldi	r25, 0x0F	; 15
   17ee6:	0d 94 04 a4 	jmp	0x34808	; 0x34808 <eeprom_update_byte>

00017eea <lcd_fsensor_runout_set()>:
static void lcd_fsensor_enabled_set(void) {
    fsensor.setEnabled(!fsensor.isEnabled());
}

static void lcd_fsensor_runout_set() {
    fsensor.setRunoutEnabled(!fsensor.getRunoutEnabled(), true);
   17eea:	e1 ef       	ldi	r30, 0xF1	; 241
   17eec:	f6 e1       	ldi	r31, 0x16	; 22
   17eee:	62 81       	ldd	r22, Z+2	; 0x02
   17ef0:	81 e0       	ldi	r24, 0x01	; 1
   17ef2:	68 27       	eor	r22, r24
        eeprom_update_byte_notify((uint8_t *)EEPROM_FSENS_AUTOLOAD_ENABLED, state);
    }
}

void Filament_sensor::setRunoutEnabled(bool state, bool updateEEPROM) {
    runoutEnabled = state;
   17ef4:	62 83       	std	Z+2, r22	; 0x02
   17ef6:	85 ed       	ldi	r24, 0xD5	; 213
   17ef8:	9e e0       	ldi	r25, 0x0E	; 14
   17efa:	0d 94 04 a4 	jmp	0x34808	; 0x34808 <eeprom_update_byte>

00017efe <lcd_toshiba_flash_air_compatibility_toggle()>:
	lcd_return_to_status();
}

void lcd_toshiba_flash_air_compatibility_toggle()
{
   card.ToshibaFlashAir_enable(! card.ToshibaFlashAir_isEnabled());
   17efe:	e8 e4       	ldi	r30, 0x48	; 72
   17f00:	f6 e1       	ldi	r31, 0x16	; 22
   17f02:	60 81       	ld	r22, Z
   17f04:	81 e0       	ldi	r24, 0x01	; 1
   17f06:	68 27       	eor	r22, r24
  bool writeStop();

  // Toshiba FlashAir support
  uint8_t readExtMemory(uint8_t mio, uint8_t func, uint32_t addr, uint16_t count, uint8_t* dst);

  void setFlashAirCompatible(bool flashAirCompatible) { flash_air_compatible_ = flashAirCompatible; }
   17f08:	60 83       	st	Z, r22
   17f0a:	8b eb       	ldi	r24, 0xBB	; 187
   17f0c:	9f e0       	ldi	r25, 0x0F	; 15
   17f0e:	0d 94 04 a4 	jmp	0x34808	; 0x34808 <eeprom_update_byte>

00017f12 <lcd_temp_calibration_set()>:
  enquecommand_P(PSTR("M45 Z"));
  lcd_return_to_status();
}

void lcd_temp_calibration_set() {
	bool temp_cal_active = eeprom_read_byte((unsigned char *)EEPROM_TEMP_CAL_ACTIVE);
   17f12:	8f ea       	ldi	r24, 0xAF	; 175
   17f14:	9f e0       	ldi	r25, 0x0F	; 15
   17f16:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
	temp_cal_active = !temp_cal_active;
   17f1a:	61 e0       	ldi	r22, 0x01	; 1
   17f1c:	81 11       	cpse	r24, r1
   17f1e:	60 e0       	ldi	r22, 0x00	; 0
   17f20:	8f ea       	ldi	r24, 0xAF	; 175
   17f22:	9f e0       	ldi	r25, 0x0F	; 15
   17f24:	0d 94 04 a4 	jmp	0x34808	; 0x34808 <eeprom_update_byte>

00017f28 <lcd_sound_state_set()>:
eeprom_update_byte_notify((uint8_t*)EEPROM_SOUND_MODE,(uint8_t)eSoundMode);
}

void Sound_CycleState(void)
{
switch(eSoundMode)
   17f28:	80 91 47 04 	lds	r24, 0x0447	; 0x800447 <eSoundMode>
   17f2c:	81 30       	cpi	r24, 0x01	; 1
   17f2e:	71 f0       	breq	.+28     	; 0x17f4c <lcd_sound_state_set()+0x24>
   17f30:	20 f0       	brcs	.+8      	; 0x17f3a <lcd_sound_state_set()+0x12>
   17f32:	82 30       	cpi	r24, 0x02	; 2
   17f34:	69 f4       	brne	.+26     	; 0x17f50 <lcd_sound_state_set()+0x28>
          break;
     case e_SOUND_MODE_ONCE:
          eSoundMode=e_SOUND_MODE_SILENT;
          break;
     case e_SOUND_MODE_SILENT:
          eSoundMode=e_SOUND_MODE_BLIND;
   17f36:	83 e0       	ldi	r24, 0x03	; 3
   17f38:	01 c0       	rjmp	.+2      	; 0x17f3c <lcd_sound_state_set()+0x14>
void Sound_CycleState(void)
{
switch(eSoundMode)
     {
     case e_SOUND_MODE_LOUD:
          eSoundMode=e_SOUND_MODE_ONCE;
   17f3a:	81 e0       	ldi	r24, 0x01	; 1
          break;
     case e_SOUND_MODE_ONCE:
          eSoundMode=e_SOUND_MODE_SILENT;
   17f3c:	80 93 47 04 	sts	0x0447, r24	; 0x800447 <eSoundMode>
   17f40:	60 91 47 04 	lds	r22, 0x0447	; 0x800447 <eSoundMode>
   17f44:	87 ed       	ldi	r24, 0xD7	; 215
   17f46:	9e e0       	ldi	r25, 0x0E	; 14
   17f48:	0d 94 04 a4 	jmp	0x34808	; 0x34808 <eeprom_update_byte>
   17f4c:	82 e0       	ldi	r24, 0x02	; 2
   17f4e:	f6 cf       	rjmp	.-20     	; 0x17f3c <lcd_sound_state_set()+0x14>
          break;
     case e_SOUND_MODE_SILENT:
          eSoundMode=e_SOUND_MODE_BLIND;
          break;
     case e_SOUND_MODE_BLIND:
          eSoundMode=e_SOUND_MODE_LOUD;
   17f50:	10 92 47 04 	sts	0x0447, r1	; 0x800447 <eSoundMode>
   17f54:	f5 cf       	rjmp	.-22     	; 0x17f40 <lcd_sound_state_set()+0x18>

00017f56 <lcd_sort_type_set()>:
}

#ifdef SDCARD_SORT_ALPHA
static void lcd_sort_type_set() {
	uint8_t sdSort;
	sdSort = eeprom_read_byte((uint8_t*) EEPROM_SD_SORT);
   17f56:	89 e0       	ldi	r24, 0x09	; 9
   17f58:	9f e0       	ldi	r25, 0x0F	; 15
   17f5a:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
	switch (sdSort) {
		case SD_SORT_TIME: sdSort = SD_SORT_ALPHA; break;
   17f5e:	61 e0       	ldi	r22, 0x01	; 1

#ifdef SDCARD_SORT_ALPHA
static void lcd_sort_type_set() {
	uint8_t sdSort;
	sdSort = eeprom_read_byte((uint8_t*) EEPROM_SD_SORT);
	switch (sdSort) {
   17f60:	88 23       	and	r24, r24
   17f62:	21 f0       	breq	.+8      	; 0x17f6c <lcd_sort_type_set()+0x16>
		case SD_SORT_TIME: sdSort = SD_SORT_ALPHA; break;
		case SD_SORT_ALPHA: sdSort = SD_SORT_NONE; break;
   17f64:	62 e0       	ldi	r22, 0x02	; 2

#ifdef SDCARD_SORT_ALPHA
static void lcd_sort_type_set() {
	uint8_t sdSort;
	sdSort = eeprom_read_byte((uint8_t*) EEPROM_SD_SORT);
	switch (sdSort) {
   17f66:	81 30       	cpi	r24, 0x01	; 1
   17f68:	09 f0       	breq	.+2      	; 0x17f6c <lcd_sort_type_set()+0x16>
		case SD_SORT_TIME: sdSort = SD_SORT_ALPHA; break;
		case SD_SORT_ALPHA: sdSort = SD_SORT_NONE; break;
		default: sdSort = SD_SORT_TIME;
   17f6a:	60 e0       	ldi	r22, 0x00	; 0
   17f6c:	89 e0       	ldi	r24, 0x09	; 9
   17f6e:	9f e0       	ldi	r25, 0x0F	; 15
   17f70:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
	}
	eeprom_update_byte_notify((uint8_t*)EEPROM_SD_SORT, sdSort);
	card.presort_flag = true;
   17f74:	81 e0       	ldi	r24, 0x01	; 1
   17f76:	80 93 26 14 	sts	0x1426, r24	; 0x801426 <card+0x51>
}
   17f7a:	08 95       	ret

00017f7c <lcd_nozzle_diameter_cycle()>:
            MENU_ITEM_TOGGLE_P(_T(MSG_SOUND), _T(MSG_SOUND_LOUD), lcd_sound_state_set);\
    }\
}\
while (0)

static void lcd_nozzle_diameter_cycle(void) {
   17f7c:	cf 93       	push	r28
   17f7e:	df 93       	push	r29
    uint16_t nDiameter;
    switch(oNozzleDiameter){
   17f80:	80 91 eb 03 	lds	r24, 0x03EB	; 0x8003eb <oNozzleDiameter>
   17f84:	8c 33       	cpi	r24, 0x3C	; 60
   17f86:	e1 f0       	breq	.+56     	; 0x17fc0 <lcd_nozzle_diameter_cycle()+0x44>
   17f88:	80 35       	cpi	r24, 0x50	; 80
   17f8a:	01 f1       	breq	.+64     	; 0x17fcc <lcd_nozzle_diameter_cycle()+0x50>
   17f8c:	88 32       	cpi	r24, 0x28	; 40
   17f8e:	91 f0       	breq	.+36     	; 0x17fb4 <lcd_nozzle_diameter_cycle()+0x38>
    case ClNozzleDiameter::_Diameter_250:
        oNozzleDiameter=ClNozzleDiameter::_Diameter_400;
   17f90:	88 e2       	ldi	r24, 0x28	; 40
   17f92:	80 93 eb 03 	sts	0x03EB, r24	; 0x8003eb <oNozzleDiameter>
        nDiameter=400;
   17f96:	c0 e9       	ldi	r28, 0x90	; 144
   17f98:	d1 e0       	ldi	r29, 0x01	; 1
   17f9a:	60 91 eb 03 	lds	r22, 0x03EB	; 0x8003eb <oNozzleDiameter>
   17f9e:	87 ea       	ldi	r24, 0xA7	; 167
   17fa0:	9d e0       	ldi	r25, 0x0D	; 13
   17fa2:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
        if (previous_value != value) {
            eeprom_word_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_word(dst, value);
   17fa6:	be 01       	movw	r22, r28
   17fa8:	85 ea       	ldi	r24, 0xA5	; 165
   17faa:	9d e0       	ldi	r25, 0x0D	; 13
        oNozzleDiameter=ClNozzleDiameter::_Diameter_400;
        nDiameter=400;
    }
    eeprom_update_byte_notify((uint8_t*)EEPROM_NOZZLE_DIAMETER,(uint8_t)oNozzleDiameter);
    eeprom_update_word_notify((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM,nDiameter);
}
   17fac:	df 91       	pop	r29
   17fae:	cf 91       	pop	r28
   17fb0:	0d 94 22 a4 	jmp	0x34844	; 0x34844 <eeprom_update_word>
    case ClNozzleDiameter::_Diameter_250:
        oNozzleDiameter=ClNozzleDiameter::_Diameter_400;
        nDiameter=400;
        break;
    case ClNozzleDiameter::_Diameter_400:
        oNozzleDiameter=ClNozzleDiameter::_Diameter_600;
   17fb4:	8c e3       	ldi	r24, 0x3C	; 60
   17fb6:	80 93 eb 03 	sts	0x03EB, r24	; 0x8003eb <oNozzleDiameter>
        nDiameter=600;
   17fba:	c8 e5       	ldi	r28, 0x58	; 88
   17fbc:	d2 e0       	ldi	r29, 0x02	; 2
   17fbe:	ed cf       	rjmp	.-38     	; 0x17f9a <lcd_nozzle_diameter_cycle()+0x1e>
        break;
    case ClNozzleDiameter::_Diameter_600:
        oNozzleDiameter=ClNozzleDiameter::_Diameter_800;
   17fc0:	80 e5       	ldi	r24, 0x50	; 80
   17fc2:	80 93 eb 03 	sts	0x03EB, r24	; 0x8003eb <oNozzleDiameter>
        nDiameter=800;
   17fc6:	c0 e2       	ldi	r28, 0x20	; 32
   17fc8:	d3 e0       	ldi	r29, 0x03	; 3
   17fca:	e7 cf       	rjmp	.-50     	; 0x17f9a <lcd_nozzle_diameter_cycle()+0x1e>
        break;
    case ClNozzleDiameter::_Diameter_800:
        oNozzleDiameter=ClNozzleDiameter::_Diameter_250;
   17fcc:	89 e1       	ldi	r24, 0x19	; 25
   17fce:	80 93 eb 03 	sts	0x03EB, r24	; 0x8003eb <oNozzleDiameter>
        nDiameter=250;
   17fd2:	ca ef       	ldi	r28, 0xFA	; 250
   17fd4:	d0 e0       	ldi	r29, 0x00	; 0
   17fd6:	e1 cf       	rjmp	.-62     	; 0x17f9a <lcd_nozzle_diameter_cycle()+0x1e>

00017fd8 <eeprom_fw_version_older_than_p(unsigned int const (&) [4])>:
    }
    return 0;
}

bool eeprom_fw_version_older_than_p(const uint16_t (&ver_req)[4])
{
   17fd8:	0f 93       	push	r16
   17fda:	1f 93       	push	r17
   17fdc:	cf 93       	push	r28
   17fde:	df 93       	push	r29
   17fe0:	00 d0       	rcall	.+0      	; 0x17fe2 <eeprom_fw_version_older_than_p(unsigned int const (&) [4])+0xa>
   17fe2:	00 d0       	rcall	.+0      	; 0x17fe4 <eeprom_fw_version_older_than_p(unsigned int const (&) [4])+0xc>
   17fe4:	1f 92       	push	r1
   17fe6:	1f 92       	push	r1
   17fe8:	cd b7       	in	r28, 0x3d	; 61
   17fea:	de b7       	in	r29, 0x3e	; 62
   17fec:	8c 01       	movw	r16, r24
    uint16_t ver_eeprom[4];
    ver_eeprom[0] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_MAJOR);
   17fee:	8a e0       	ldi	r24, 0x0A	; 10
   17ff0:	90 e0       	ldi	r25, 0x00	; 0
   17ff2:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
   17ff6:	9a 83       	std	Y+2, r25	; 0x02
   17ff8:	89 83       	std	Y+1, r24	; 0x01
    ver_eeprom[1] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_MINOR);
   17ffa:	8c e0       	ldi	r24, 0x0C	; 12
   17ffc:	90 e0       	ldi	r25, 0x00	; 0
   17ffe:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
   18002:	9c 83       	std	Y+4, r25	; 0x04
   18004:	8b 83       	std	Y+3, r24	; 0x03
    ver_eeprom[2] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_REVISION);
   18006:	8e e0       	ldi	r24, 0x0E	; 14
   18008:	90 e0       	ldi	r25, 0x00	; 0
   1800a:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
   1800e:	9e 83       	std	Y+6, r25	; 0x06
   18010:	8d 83       	std	Y+5, r24	; 0x05
    ver_eeprom[3] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_FLAVOR);
   18012:	80 e1       	ldi	r24, 0x10	; 16
   18014:	90 e0       	ldi	r25, 0x00	; 0
   18016:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
   1801a:	98 87       	std	Y+8, r25	; 0x08
   1801c:	8f 83       	std	Y+7, r24	; 0x07
   1801e:	c8 01       	movw	r24, r16
   18020:	de 01       	movw	r26, r28
   18022:	11 96       	adiw	r26, 0x01	; 1
   18024:	be 01       	movw	r22, r28
   18026:	67 5f       	subi	r22, 0xF7	; 247
   18028:	7f 4f       	sbci	r23, 0xFF	; 255

    for (uint8_t i = 0; i < 4; ++i) {
        uint16_t v = pgm_read_word(&ver_req[i]);
   1802a:	fc 01       	movw	r30, r24
   1802c:	25 91       	lpm	r18, Z+
   1802e:	34 91       	lpm	r19, Z
        if (v > ver_eeprom[i])
   18030:	4d 91       	ld	r20, X+
   18032:	5d 91       	ld	r21, X+
   18034:	42 17       	cp	r20, r18
   18036:	53 07       	cpc	r21, r19
   18038:	48 f0       	brcs	.+18     	; 0x1804c <eeprom_fw_version_older_than_p(unsigned int const (&) [4])+0x74>
            return true;
        else if (v < ver_eeprom[i])
   1803a:	24 17       	cp	r18, r20
   1803c:	35 07       	cpc	r19, r21
   1803e:	20 f0       	brcs	.+8      	; 0x18048 <eeprom_fw_version_older_than_p(unsigned int const (&) [4])+0x70>
   18040:	02 96       	adiw	r24, 0x02	; 2
    ver_eeprom[0] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_MAJOR);
    ver_eeprom[1] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_MINOR);
    ver_eeprom[2] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_REVISION);
    ver_eeprom[3] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_FLAVOR);

    for (uint8_t i = 0; i < 4; ++i) {
   18042:	a6 17       	cp	r26, r22
   18044:	b7 07       	cpc	r27, r23
   18046:	89 f7       	brne	.-30     	; 0x1802a <eeprom_fw_version_older_than_p(unsigned int const (&) [4])+0x52>
            return true;
        else if (v < ver_eeprom[i])
            break;
    }

    return false;
   18048:	80 e0       	ldi	r24, 0x00	; 0
   1804a:	01 c0       	rjmp	.+2      	; 0x1804e <eeprom_fw_version_older_than_p(unsigned int const (&) [4])+0x76>
    ver_eeprom[3] = eeprom_read_word((uint16_t*)EEPROM_FIRMWARE_VERSION_FLAVOR);

    for (uint8_t i = 0; i < 4; ++i) {
        uint16_t v = pgm_read_word(&ver_req[i]);
        if (v > ver_eeprom[i])
            return true;
   1804c:	81 e0       	ldi	r24, 0x01	; 1
        else if (v < ver_eeprom[i])
            break;
    }

    return false;
}
   1804e:	28 96       	adiw	r28, 0x08	; 8
   18050:	0f b6       	in	r0, 0x3f	; 63
   18052:	f8 94       	cli
   18054:	de bf       	out	0x3e, r29	; 62
   18056:	0f be       	out	0x3f, r0	; 63
   18058:	cd bf       	out	0x3d, r28	; 61
   1805a:	df 91       	pop	r29
   1805c:	cf 91       	pop	r28
   1805e:	1f 91       	pop	r17
   18060:	0f 91       	pop	r16
   18062:	08 95       	ret

00018064 <mmu_enable_switch()>:
#endif // MMU_FORCE_STEALTH_MODE
}

static void mmu_enable_switch()
{
    uint8_t current_state = eeprom_read_byte((uint8_t *)EEPROM_MMU_ENABLED);
   18064:	8c ea       	ldi	r24, 0xAC	; 172
   18066:	9c e0       	ldi	r25, 0x0C	; 12
   18068:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>

    if (current_state)
   1806c:	88 23       	and	r24, r24
   1806e:	99 f0       	breq	.+38     	; 0x18096 <mmu_enable_switch()+0x32>
    StopKeepPowered();
    PowerOff();
}

void MMU2::StopKeepPowered() {
    state = xState::Stopped;
   18070:	10 92 01 13 	sts	0x1301, r1	; 0x801301 <MMU2::mmu2+0x6f>
    protocol.ResetResponseDecoder(); // important - finished delayed restart relies on this
    StartSeqRestart();
}

void ProtocolLogic::Stop() {
    state = State::Stopped;
   18074:	10 92 af 12 	sts	0x12AF, r1	; 0x8012af <MMU2::mmu2+0x1d>
    currentScope = Scope::Stopped;
   18078:	10 92 94 12 	sts	0x1294, r1	; 0x801294 <MMU2::mmu2+0x2>
        eeprom_update_byte_notify(dst++, pgm_read_byte(src++));
    }
}

void eeprom_toggle(uint8_t *__p) {
    eeprom_write_byte_notify(__p, !eeprom_read_byte(__p));
   1807c:	8c ea       	ldi	r24, 0xAC	; 172
   1807e:	9c e0       	ldi	r25, 0x0C	; 12
   18080:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   18084:	61 e0       	ldi	r22, 0x01	; 1
   18086:	81 11       	cpse	r24, r1
   18088:	60 e0       	ldi	r22, 0x00	; 0
    if (active) {
        uint8_t previous_value = eeprom_read_byte(dst);
        eeprom_byte_notify(dst, previous_value, value, true);
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_write_byte(dst, value);
   1808a:	8c ea       	ldi	r24, 0xAC	; 172
   1808c:	9c e0       	ldi	r25, 0x0C	; 12
   1808e:	0f 94 28 a4 	call	0x34850	; 0x34850 <eeprom_write_byte>
    {
        MMU2::mmu2.Start();
    }

    eeprom_toggle((uint8_t *)EEPROM_MMU_ENABLED);
    MMU2::mmu2.Status();
   18092:	0d 94 ad 65 	jmp	0x2cb5a	; 0x2cb5a <MMU2::MMU2::Status() [clone .constprop.340]>
    {
        MMU2::mmu2.Stop();
    }
    else
    {
        MMU2::mmu2.Start();
   18096:	0f 94 80 95 	call	0x32b00	; 0x32b00 <MMU2::MMU2::Start() [clone .constprop.178]>
   1809a:	f0 cf       	rjmp	.-32     	; 0x1807c <mmu_enable_switch()+0x18>

0001809c <lcd_silent_mode_set()>:
    eeprom_toggle((uint8_t*)EEPROM_MMU_STEALTH);
}
#endif //MMU_FORCE_STEALTH_MODE

static void lcd_silent_mode_set() {
	switch (SilentModeMenu) {
   1809c:	80 91 bb 03 	lds	r24, 0x03BB	; 0x8003bb <SilentModeMenu>
   180a0:	88 23       	and	r24, r24
   180a2:	21 f0       	breq	.+8      	; 0x180ac <lcd_silent_mode_set()+0x10>
   180a4:	81 30       	cpi	r24, 0x01	; 1
   180a6:	69 f4       	brne	.+26     	; 0x180c2 <lcd_silent_mode_set()+0x26>
	case SILENT_MODE_NORMAL: SilentModeMenu = SILENT_MODE_STEALTH; break;
	case SILENT_MODE_STEALTH: SilentModeMenu = SILENT_MODE_NORMAL; break;
	default: SilentModeMenu = SILENT_MODE_NORMAL; break; // (probably) not needed
#else
	case SILENT_MODE_POWER: SilentModeMenu = SILENT_MODE_SILENT; break;
	case SILENT_MODE_SILENT: SilentModeMenu = SILENT_MODE_AUTO; break;
   180a8:	82 e0       	ldi	r24, 0x02	; 2
   180aa:	01 c0       	rjmp	.+2      	; 0x180ae <lcd_silent_mode_set()+0x12>
#ifdef TMC2130
	case SILENT_MODE_NORMAL: SilentModeMenu = SILENT_MODE_STEALTH; break;
	case SILENT_MODE_STEALTH: SilentModeMenu = SILENT_MODE_NORMAL; break;
	default: SilentModeMenu = SILENT_MODE_NORMAL; break; // (probably) not needed
#else
	case SILENT_MODE_POWER: SilentModeMenu = SILENT_MODE_SILENT; break;
   180ac:	81 e0       	ldi	r24, 0x01	; 1
	case SILENT_MODE_SILENT: SilentModeMenu = SILENT_MODE_AUTO; break;
   180ae:	80 93 bb 03 	sts	0x03BB, r24	; 0x8003bb <SilentModeMenu>
        if (previous_value != value) {
            eeprom_byte_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_byte(dst, value);
   180b2:	60 91 bb 03 	lds	r22, 0x03BB	; 0x8003bb <SilentModeMenu>
   180b6:	8f ef       	ldi	r24, 0xFF	; 255
   180b8:	9f e0       	ldi	r25, 0x0F	; 15
   180ba:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
  // We may have missed a stepper timer interrupt due to the time spent in tmc2130_init.
  // Be safe than sorry, reset the stepper timer before re-enabling interrupts.
  st_reset_timer();
  sei();
#else
    st_current_init();
   180be:	0d 94 84 1a 	jmp	0x23508	; 0x23508 <st_current_init()>
	case SILENT_MODE_STEALTH: SilentModeMenu = SILENT_MODE_NORMAL; break;
	default: SilentModeMenu = SILENT_MODE_NORMAL; break; // (probably) not needed
#else
	case SILENT_MODE_POWER: SilentModeMenu = SILENT_MODE_SILENT; break;
	case SILENT_MODE_SILENT: SilentModeMenu = SILENT_MODE_AUTO; break;
	case SILENT_MODE_AUTO: SilentModeMenu = SILENT_MODE_POWER; break;
   180c2:	10 92 bb 03 	sts	0x03BB, r1	; 0x8003bb <SilentModeMenu>
   180c6:	f5 cf       	rjmp	.-22     	; 0x180b2 <lcd_silent_mode_set()+0x16>

000180c8 <lcd_fsensor_enabled_set()>:
static void fsensor_reinit() {
    fsensor.init();
}

static void lcd_fsensor_enabled_set(void) {
    fsensor.setEnabled(!fsensor.isEnabled());
   180c8:	81 e0       	ldi	r24, 0x01	; 1
   180ca:	90 91 f1 16 	lds	r25, 0x16F1	; 0x8016f1 <fsensor>
   180ce:	91 11       	cpse	r25, r1
   180d0:	80 e0       	ldi	r24, 0x00	; 0
   180d2:	0c 94 90 77 	jmp	0xef20	; 0xef20 <Filament_sensor::setEnabled(bool)>

000180d6 <lcd_fsensor_jam_detection_set()>:
static void lcd_fsensor_autoload_set() {
    fsensor.setAutoLoadEnabled(!fsensor.getAutoLoadEnabled(), true);
}

#if FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125
static void lcd_fsensor_jam_detection_set() {
   180d6:	0f 93       	push	r16
   180d8:	1f 93       	push	r17
   180da:	cf 93       	push	r28
    fsensor.setJamDetectionEnabled(!fsensor.getJamDetectionEnabled(), true);
   180dc:	01 ef       	ldi	r16, 0xF1	; 241
   180de:	16 e1       	ldi	r17, 0x16	; 22
   180e0:	f8 01       	movw	r30, r16
   180e2:	c6 85       	ldd	r28, Z+14	; 0x0e
   180e4:	81 e0       	ldi	r24, 0x01	; 1
   180e6:	c8 27       	eor	r28, r24
    return fsensorDetected;
}
#endif

void PAT9125_sensor::setJamDetectionEnabled(bool state, bool updateEEPROM) {
    jamDetection = state;
   180e8:	c6 87       	std	Z+14, r28	; 0x0e
    oldPos = pat9125_y;
   180ea:	80 91 38 0e 	lds	r24, 0x0E38	; 0x800e38 <pat9125_y>
   180ee:	90 91 39 0e 	lds	r25, 0x0E39	; 0x800e39 <pat9125_y+0x1>
   180f2:	90 8b       	std	Z+16, r25	; 0x10
   180f4:	87 87       	std	Z+15, r24	; 0x0f
    resetStepCount();
   180f6:	0f 94 8d 6d 	call	0x2db1a	; 0x2db1a <PAT9125_sensor::resetStepCount() [clone .constprop.210]>
    jamErrCnt = 0;
   180fa:	f8 01       	movw	r30, r16
   180fc:	15 8a       	std	Z+21, r1	; 0x15
   180fe:	6c 2f       	mov	r22, r28
   18100:	8d ea       	ldi	r24, 0xAD	; 173
   18102:	9c e0       	ldi	r25, 0x0C	; 12
}
   18104:	cf 91       	pop	r28
   18106:	1f 91       	pop	r17
   18108:	0f 91       	pop	r16
   1810a:	0d 94 04 a4 	jmp	0x34808	; 0x34808 <eeprom_update_byte>

0001810e <pid_extruder()>:
//! |                    |
//! ----------------------
//! @endcode
void pid_extruder()
{
	lcd_clear();
   1810e:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
	lcd_puts_at_P(0, 0, _T(MSG_SET_TEMPERATURE));
   18112:	88 e2       	ldi	r24, 0x28	; 40
   18114:	9b e3       	ldi	r25, 0x3B	; 59
   18116:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1811a:	ac 01       	movw	r20, r24
   1811c:	60 e0       	ldi	r22, 0x00	; 0
   1811e:	80 e0       	ldi	r24, 0x00	; 0
   18120:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
	pid_temp += lcd_encoder;
   18124:	80 91 4e 02 	lds	r24, 0x024E	; 0x80024e <pid_temp>
   18128:	90 91 4f 02 	lds	r25, 0x024F	; 0x80024f <pid_temp+0x1>
   1812c:	20 91 1e 06 	lds	r18, 0x061E	; 0x80061e <lcd_encoder>
   18130:	30 91 1f 06 	lds	r19, 0x061F	; 0x80061f <lcd_encoder+0x1>
   18134:	82 0f       	add	r24, r18
   18136:	93 1f       	adc	r25, r19
	if (pid_temp > HEATER_0_MAXTEMP) pid_temp = HEATER_0_MAXTEMP;
   18138:	82 33       	cpi	r24, 0x32	; 50
   1813a:	21 e0       	ldi	r18, 0x01	; 1
   1813c:	92 07       	cpc	r25, r18
   1813e:	50 f1       	brcs	.+84     	; 0x18194 <pid_extruder()+0x86>
   18140:	81 e3       	ldi	r24, 0x31	; 49
   18142:	91 e0       	ldi	r25, 0x01	; 1
	else if (pid_temp < HEATER_0_MINTEMP) pid_temp = HEATER_0_MINTEMP;
   18144:	90 93 4f 02 	sts	0x024F, r25	; 0x80024f <pid_temp+0x1>
   18148:	80 93 4e 02 	sts	0x024E, r24	; 0x80024e <pid_temp>
	lcd_encoder = 0;
   1814c:	10 92 1f 06 	sts	0x061F, r1	; 0x80061f <lcd_encoder+0x1>
   18150:	10 92 1e 06 	sts	0x061E, r1	; 0x80061e <lcd_encoder>
	lcd_set_cursor(1, 2);
   18154:	62 e0       	ldi	r22, 0x02	; 2
   18156:	81 e0       	ldi	r24, 0x01	; 1
   18158:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
	lcd_printf_P(PSTR("%3u"), pid_temp);
   1815c:	80 91 4f 02 	lds	r24, 0x024F	; 0x80024f <pid_temp+0x1>
   18160:	8f 93       	push	r24
   18162:	80 91 4e 02 	lds	r24, 0x024E	; 0x80024e <pid_temp>
   18166:	8f 93       	push	r24
   18168:	88 e9       	ldi	r24, 0x98	; 152
   1816a:	92 e8       	ldi	r25, 0x82	; 130
   1816c:	9f 93       	push	r25
   1816e:	8f 93       	push	r24
   18170:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
	if (lcd_clicked()) {
   18174:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   18178:	0f 90       	pop	r0
   1817a:	0f 90       	pop	r0
   1817c:	0f 90       	pop	r0
   1817e:	0f 90       	pop	r0
   18180:	88 23       	and	r24, r24
   18182:	71 f0       	breq	.+28     	; 0x181a0 <pid_extruder()+0x92>
		lcd_commands_type = LcdCommands::PidExtruder;
   18184:	83 e0       	ldi	r24, 0x03	; 3
   18186:	80 93 5e 0d 	sts	0x0D5E, r24	; 0x800d5e <lcd_commands_type>
		lcd_return_to_status();
   1818a:	0f 94 d5 07 	call	0x20faa	; 0x20faa <lcd_return_to_status()>
		lcd_update(2);
   1818e:	82 e0       	ldi	r24, 0x02	; 2
   18190:	0c 94 f9 6e 	jmp	0xddf2	; 0xddf2 <lcd_update(unsigned char)>
{
	lcd_clear();
	lcd_puts_at_P(0, 0, _T(MSG_SET_TEMPERATURE));
	pid_temp += lcd_encoder;
	if (pid_temp > HEATER_0_MAXTEMP) pid_temp = HEATER_0_MAXTEMP;
	else if (pid_temp < HEATER_0_MINTEMP) pid_temp = HEATER_0_MINTEMP;
   18194:	8e 31       	cpi	r24, 0x1E	; 30
   18196:	91 05       	cpc	r25, r1
   18198:	a8 f6       	brcc	.-86     	; 0x18144 <pid_extruder()+0x36>
   1819a:	8e e1       	ldi	r24, 0x1E	; 30
   1819c:	90 e0       	ldi	r25, 0x00	; 0
   1819e:	d2 cf       	rjmp	.-92     	; 0x18144 <pid_extruder()+0x36>
		lcd_commands_type = LcdCommands::PidExtruder;
		lcd_return_to_status();
		lcd_update(2);
	}

}
   181a0:	08 95       	ret

000181a2 <settings_check_toggle(ClCheckMode*, char const*, void (*)()) [clone .isra.4]>:
static void lcd_check_filament_set() {
    lcd_check_update_RAM(&oCheckFilament);
    eeprom_update_byte_notify((uint8_t*)EEPROM_CHECK_FILAMENT,(uint8_t)oCheckFilament);
}

static void settings_check_toggle(ClCheckMode * oCheckSetting, const char* msg, void (*func)(void)) {
   181a2:	0f 93       	push	r16
   181a4:	1f 93       	push	r17
   181a6:	cf 93       	push	r28
   181a8:	df 93       	push	r29
   181aa:	eb 01       	movw	r28, r22
   181ac:	8a 01       	movw	r16, r20
    switch(*oCheckSetting) {
   181ae:	81 30       	cpi	r24, 0x01	; 1
   181b0:	81 f0       	breq	.+32     	; 0x181d2 <settings_check_toggle(ClCheckMode*, char const*, void (*)()) [clone .isra.4]+0x30>
   181b2:	82 30       	cpi	r24, 0x02	; 2
   181b4:	89 f0       	breq	.+34     	; 0x181d8 <settings_check_toggle(ClCheckMode*, char const*, void (*)()) [clone .isra.4]+0x36>
        case ClCheckMode::_None:
            MENU_ITEM_TOGGLE_P(msg, _T(MSG_NONE), func);
   181b6:	89 e2       	ldi	r24, 0x29	; 41
   181b8:	9b e4       	ldi	r25, 0x4B	; 75
            break;
        case ClCheckMode::_Warn:
            MENU_ITEM_TOGGLE_P(msg, _T(MSG_WARN), func);
            break;
        case ClCheckMode::_Strict:
            MENU_ITEM_TOGGLE_P(msg, _T(MSG_STRICT), func);
   181ba:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   181be:	22 e0       	ldi	r18, 0x02	; 2
   181c0:	a8 01       	movw	r20, r16
   181c2:	bc 01       	movw	r22, r24
   181c4:	ce 01       	movw	r24, r28
            break;
        default:
            MENU_ITEM_TOGGLE_P(msg, _T(MSG_NONE), func);
    }
}
   181c6:	df 91       	pop	r29
   181c8:	cf 91       	pop	r28
   181ca:	1f 91       	pop	r17
   181cc:	0f 91       	pop	r16
            break;
        case ClCheckMode::_Warn:
            MENU_ITEM_TOGGLE_P(msg, _T(MSG_WARN), func);
            break;
        case ClCheckMode::_Strict:
            MENU_ITEM_TOGGLE_P(msg, _T(MSG_STRICT), func);
   181ce:	0c 94 5e 75 	jmp	0xeabc	; 0xeabc <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
    switch(*oCheckSetting) {
        case ClCheckMode::_None:
            MENU_ITEM_TOGGLE_P(msg, _T(MSG_NONE), func);
            break;
        case ClCheckMode::_Warn:
            MENU_ITEM_TOGGLE_P(msg, _T(MSG_WARN), func);
   181d2:	82 e2       	ldi	r24, 0x22	; 34
   181d4:	9b e4       	ldi	r25, 0x4B	; 75
   181d6:	f1 cf       	rjmp	.-30     	; 0x181ba <settings_check_toggle(ClCheckMode*, char const*, void (*)()) [clone .isra.4]+0x18>
            break;
        case ClCheckMode::_Strict:
            MENU_ITEM_TOGGLE_P(msg, _T(MSG_STRICT), func);
   181d8:	89 e1       	ldi	r24, 0x19	; 25
   181da:	9b e4       	ldi	r25, 0x4B	; 75
   181dc:	ee cf       	rjmp	.-36     	; 0x181ba <settings_check_toggle(ClCheckMode*, char const*, void (*)()) [clone .isra.4]+0x18>

000181de <SETTINGS_SILENT_MODE() [clone .part.3]>:

    eeprom_toggle((uint8_t *)EEPROM_MMU_ENABLED);
    MMU2::mmu2.Status();
}

static void SETTINGS_SILENT_MODE()
   181de:	cf 93       	push	r28
   181e0:	df 93       	push	r29
                MENU_ITEM_TOGGLE_P(_T(MSG_MODE), _T(MSG_STEALTH), lcd_silent_mode_set);
            }
            MENU_ITEM_TOGGLE_P(_T(MSG_CRASHDETECT), NULL, lcd_crash_mode_info);
        }
#else  // TMC2130
        switch (eeprom_read_byte((uint8_t *)EEPROM_SILENT))
   181e2:	8f ef       	ldi	r24, 0xFF	; 255
   181e4:	9f e0       	ldi	r25, 0x0F	; 15
   181e6:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   181ea:	81 30       	cpi	r24, 0x01	; 1
   181ec:	99 f0       	breq	.+38     	; 0x18214 <SETTINGS_SILENT_MODE() [clone .part.3]+0x36>
   181ee:	82 30       	cpi	r24, 0x02	; 2
   181f0:	a1 f0       	breq	.+40     	; 0x1821a <SETTINGS_SILENT_MODE() [clone .part.3]+0x3c>
        {
        case SILENT_MODE_POWER:
            MENU_ITEM_TOGGLE_P(_T(MSG_MODE), _T(MSG_HIGH_POWER), lcd_silent_mode_set);
   181f2:	8c e0       	ldi	r24, 0x0C	; 12
   181f4:	9b e4       	ldi	r25, 0x4B	; 75
            break;
        case SILENT_MODE_SILENT:
            MENU_ITEM_TOGGLE_P(_T(MSG_MODE), _T(MSG_SILENT), lcd_silent_mode_set);
            break;
        case SILENT_MODE_AUTO:
            MENU_ITEM_TOGGLE_P(_T(MSG_MODE), _T(MSG_AUTO_POWER), lcd_silent_mode_set);
   181f6:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   181fa:	ec 01       	movw	r28, r24
   181fc:	85 e0       	ldi	r24, 0x05	; 5
   181fe:	9b e4       	ldi	r25, 0x4B	; 75
   18200:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18204:	22 e0       	ldi	r18, 0x02	; 2
   18206:	4e e4       	ldi	r20, 0x4E	; 78
   18208:	50 ec       	ldi	r21, 0xC0	; 192
   1820a:	be 01       	movw	r22, r28
            MENU_ITEM_TOGGLE_P(_T(MSG_MODE), _T(MSG_HIGH_POWER), lcd_silent_mode_set);
            break; // (probably) not needed
        }
#endif // TMC2130
    }
}
   1820c:	df 91       	pop	r29
   1820e:	cf 91       	pop	r28
            break;
        case SILENT_MODE_SILENT:
            MENU_ITEM_TOGGLE_P(_T(MSG_MODE), _T(MSG_SILENT), lcd_silent_mode_set);
            break;
        case SILENT_MODE_AUTO:
            MENU_ITEM_TOGGLE_P(_T(MSG_MODE), _T(MSG_AUTO_POWER), lcd_silent_mode_set);
   18210:	0c 94 5e 75 	jmp	0xeabc	; 0xeabc <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
        {
        case SILENT_MODE_POWER:
            MENU_ITEM_TOGGLE_P(_T(MSG_MODE), _T(MSG_HIGH_POWER), lcd_silent_mode_set);
            break;
        case SILENT_MODE_SILENT:
            MENU_ITEM_TOGGLE_P(_T(MSG_MODE), _T(MSG_SILENT), lcd_silent_mode_set);
   18214:	8c ef       	ldi	r24, 0xFC	; 252
   18216:	9a e4       	ldi	r25, 0x4A	; 74
   18218:	ee cf       	rjmp	.-36     	; 0x181f6 <SETTINGS_SILENT_MODE() [clone .part.3]+0x18>
            break;
        case SILENT_MODE_AUTO:
            MENU_ITEM_TOGGLE_P(_T(MSG_MODE), _T(MSG_AUTO_POWER), lcd_silent_mode_set);
   1821a:	8f ee       	ldi	r24, 0xEF	; 239
   1821c:	9a e4       	ldi	r25, 0x4A	; 74
   1821e:	eb cf       	rjmp	.-42     	; 0x181f6 <SETTINGS_SILENT_MODE() [clone .part.3]+0x18>

00018220 <SETTINGS_FANS_CHECK()>:
    MENU_ITEM_EDIT_int3_jmp_P(_T(MSG_BED), &target_temperature_bed, 0, BED_MAXTEMP - 5, LCD_JUMP_BED_TEMP);
#endif
    MENU_ITEM_EDIT_int3_jmp_P(_T(MSG_FAN_SPEED), &fanSpeed, 0, 255, LCD_JUMP_FAN_SPEED);
}

void SETTINGS_FANS_CHECK() {
   18220:	cf 93       	push	r28
   18222:	df 93       	push	r29
    MENU_ITEM_TOGGLE_P(_T(MSG_FANS_CHECK), fans_check_enabled ? _T(MSG_ON) : _T(MSG_OFF), lcd_set_fan_check);
   18224:	80 91 40 02 	lds	r24, 0x0240	; 0x800240 <fans_check_enabled>
   18228:	88 23       	and	r24, r24
   1822a:	89 f0       	breq	.+34     	; 0x1824e <SETTINGS_FANS_CHECK()+0x2e>
   1822c:	8a e9       	ldi	r24, 0x9A	; 154
   1822e:	92 e6       	ldi	r25, 0x62	; 98
   18230:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18234:	ec 01       	movw	r28, r24
   18236:	87 ec       	ldi	r24, 0xC7	; 199
   18238:	94 e4       	ldi	r25, 0x44	; 68
   1823a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1823e:	22 e0       	ldi	r18, 0x02	; 2
   18240:	46 ea       	ldi	r20, 0xA6	; 166
   18242:	57 e3       	ldi	r21, 0x37	; 55
   18244:	be 01       	movw	r22, r28
}
   18246:	df 91       	pop	r29
   18248:	cf 91       	pop	r28
#endif
    MENU_ITEM_EDIT_int3_jmp_P(_T(MSG_FAN_SPEED), &fanSpeed, 0, 255, LCD_JUMP_FAN_SPEED);
}

void SETTINGS_FANS_CHECK() {
    MENU_ITEM_TOGGLE_P(_T(MSG_FANS_CHECK), fans_check_enabled ? _T(MSG_ON) : _T(MSG_OFF), lcd_set_fan_check);
   1824a:	0c 94 5e 75 	jmp	0xeabc	; 0xeabc <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
   1824e:	84 e9       	ldi	r24, 0x94	; 148
   18250:	92 e6       	ldi	r25, 0x62	; 98
   18252:	ee cf       	rjmp	.-36     	; 0x18230 <SETTINGS_FANS_CHECK()+0x10>

00018254 <menuitems_MMU_settings_common()>:
}

#endif //FILAMENT_SENSOR

static void menuitems_MMU_settings_common()
{
   18254:	cf 93       	push	r28
   18256:	df 93       	push	r29
    }
}

bool SpoolJoin::isSpoolJoinEnabled()
{
    if(eeprom_read_byte((uint8_t*)EEPROM_SPOOL_JOIN) == (uint8_t)EEPROM::Enabled) {
   18258:	86 ed       	ldi	r24, 0xD6	; 214
   1825a:	9e e0       	ldi	r25, 0x0E	; 14
   1825c:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   18260:	81 30       	cpi	r24, 0x01	; 1
   18262:	19 f5       	brne	.+70     	; 0x182aa <menuitems_MMU_settings_common()+0x56>
    MENU_ITEM_TOGGLE_P(MSG_SPOOL_JOIN, SpoolJoin::spooljoin.isSpoolJoinEnabled() ? _T(MSG_ON) : _T(MSG_OFF), SpoolJoin::spooljoin.toggleSpoolJoin);
   18264:	8a e9       	ldi	r24, 0x9A	; 154
   18266:	92 e6       	ldi	r25, 0x62	; 98
   18268:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1826c:	22 e0       	ldi	r18, 0x02	; 2
   1826e:	48 ea       	ldi	r20, 0xA8	; 168
   18270:	58 e3       	ldi	r21, 0x38	; 56
   18272:	bc 01       	movw	r22, r24
   18274:	82 ef       	ldi	r24, 0xF2	; 242
   18276:	97 e6       	ldi	r25, 0x67	; 103
   18278:	0e 94 5e 75 	call	0xeabc	; 0xeabc <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>

#ifdef MMU_HAS_CUTTER
    if (EEPROM_MMU_CUTTER_ENABLED_enabled == eeprom_read_byte((uint8_t *)EEPROM_MMU_CUTTER_ENABLED))
   1827c:	8e ec       	ldi	r24, 0xCE	; 206
   1827e:	9e e0       	ldi	r25, 0x0E	; 14
   18280:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   18284:	81 30       	cpi	r24, 0x01	; 1
   18286:	a1 f4       	brne	.+40     	; 0x182b0 <menuitems_MMU_settings_common()+0x5c>
    {
        MENU_ITEM_TOGGLE_P(_T(MSG_CUTTER), _T(MSG_ON), lcd_cutter_enabled);
   18288:	8a e9       	ldi	r24, 0x9A	; 154
   1828a:	92 e6       	ldi	r25, 0x62	; 98
        MENU_ITEM_TOGGLE_P(_T(MSG_CUTTER), _T(MSG_ALWAYS), lcd_cutter_enabled);
    }
#endif
    else
    {
        MENU_ITEM_TOGGLE_P(_T(MSG_CUTTER), _T(MSG_OFF), lcd_cutter_enabled);
   1828c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18290:	ec 01       	movw	r28, r24
   18292:	8c ea       	ldi	r24, 0xAC	; 172
   18294:	94 e4       	ldi	r25, 0x44	; 68
   18296:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1829a:	22 e0       	ldi	r18, 0x02	; 2
   1829c:	42 ec       	ldi	r20, 0xC2	; 194
   1829e:	56 e3       	ldi	r21, 0x36	; 54
   182a0:	be 01       	movw	r22, r28
#endif // MMU_HAS_CUTTER

#ifndef MMU_FORCE_STEALTH_MODE
    MENU_ITEM_TOGGLE_P(_T(MSG_MMU_MODE), eeprom_read_byte((uint8_t *)EEPROM_MMU_STEALTH) ? _T(MSG_STEALTH) : _T(MSG_NORMAL), lcd_mmu_mode_toggle);
#endif // MMU_FORCE_STEALTH_MODE
}
   182a2:	df 91       	pop	r29
   182a4:	cf 91       	pop	r28
        MENU_ITEM_TOGGLE_P(_T(MSG_CUTTER), _T(MSG_ALWAYS), lcd_cutter_enabled);
    }
#endif
    else
    {
        MENU_ITEM_TOGGLE_P(_T(MSG_CUTTER), _T(MSG_OFF), lcd_cutter_enabled);
   182a6:	0c 94 5e 75 	jmp	0xeabc	; 0xeabc <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>

#endif //FILAMENT_SENSOR

static void menuitems_MMU_settings_common()
{
    MENU_ITEM_TOGGLE_P(MSG_SPOOL_JOIN, SpoolJoin::spooljoin.isSpoolJoinEnabled() ? _T(MSG_ON) : _T(MSG_OFF), SpoolJoin::spooljoin.toggleSpoolJoin);
   182aa:	84 e9       	ldi	r24, 0x94	; 148
   182ac:	92 e6       	ldi	r25, 0x62	; 98
   182ae:	dc cf       	rjmp	.-72     	; 0x18268 <menuitems_MMU_settings_common()+0x14>
        MENU_ITEM_TOGGLE_P(_T(MSG_CUTTER), _T(MSG_ALWAYS), lcd_cutter_enabled);
    }
#endif
    else
    {
        MENU_ITEM_TOGGLE_P(_T(MSG_CUTTER), _T(MSG_OFF), lcd_cutter_enabled);
   182b0:	84 e9       	ldi	r24, 0x94	; 148
   182b2:	92 e6       	ldi	r25, 0x62	; 98
   182b4:	eb cf       	rjmp	.-42     	; 0x1828c <menuitems_MMU_settings_common()+0x38>

000182b6 <lcd_hw_setup_menu()>:
        uint8_t experimental_menu_visibility;
    } _menu_data_t;
    static_assert(sizeof(menu_data)>= sizeof(_menu_data_t),"_menu_data_t doesn't fit into menu_data");
    _menu_data_t* _md = (_menu_data_t*)&(menu_data[0]);

    if (_md->status == 0 || lcd_draw_update)
   182b6:	80 91 96 03 	lds	r24, 0x0396	; 0x800396 <menu_data>
   182ba:	88 23       	and	r24, r24
   182bc:	21 f0       	breq	.+8      	; 0x182c6 <lcd_hw_setup_menu()+0x10>
   182be:	80 91 59 02 	lds	r24, 0x0259	; 0x800259 <lcd_draw_update>
   182c2:	88 23       	and	r24, r24
   182c4:	51 f0       	breq	.+20     	; 0x182da <lcd_hw_setup_menu()+0x24>
    {
        _md->status = 1;
   182c6:	81 e0       	ldi	r24, 0x01	; 1
   182c8:	80 93 96 03 	sts	0x0396, r24	; 0x800396 <menu_data>
        _md->experimental_menu_visibility = eeprom_init_default_byte((uint8_t *)EEPROM_EXPERIMENTAL_VISIBILITY, 0);
   182cc:	60 e0       	ldi	r22, 0x00	; 0
   182ce:	8a e2       	ldi	r24, 0x2A	; 42
   182d0:	9d e0       	ldi	r25, 0x0D	; 13
   182d2:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
   182d6:	80 93 97 03 	sts	0x0397, r24	; 0x800397 <menu_data+0x1>
    }


    MENU_BEGIN();
   182da:	0e 94 0c 74 	call	0xe818	; 0xe818 <menu_start()>
   182de:	10 92 60 04 	sts	0x0460, r1	; 0x800460 <menu_row>
   182e2:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   182e6:	84 30       	cpi	r24, 0x04	; 4
   182e8:	08 f0       	brcs	.+2      	; 0x182ec <lcd_hw_setup_menu()+0x36>
   182ea:	90 c0       	rjmp	.+288    	; 0x1840c <lcd_hw_setup_menu()+0x156>
   182ec:	10 92 63 04 	sts	0x0463, r1	; 0x800463 <menu_item>
    MENU_ITEM_BACK_P(_T(bSettings?MSG_SETTINGS:MSG_BACK)); // i.e. default menu-item / menu-item after checking mismatch
   182f0:	80 91 ec 03 	lds	r24, 0x03EC	; 0x8003ec <bSettings>
   182f4:	81 11       	cpse	r24, r1
   182f6:	55 c0       	rjmp	.+170    	; 0x183a2 <lcd_hw_setup_menu()+0xec>
   182f8:	88 ee       	ldi	r24, 0xE8	; 232
   182fa:	9a e4       	ldi	r25, 0x4A	; 74
   182fc:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18300:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>

    MENU_ITEM_SUBMENU_P(_T(MSG_STEEL_SHEETS), sheets_menu);
   18304:	8c ed       	ldi	r24, 0xDC	; 220
   18306:	96 e4       	ldi	r25, 0x46	; 70
   18308:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1830c:	6a e9       	ldi	r22, 0x9A	; 154
   1830e:	70 ed       	ldi	r23, 0xD0	; 208
   18310:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
    SETTINGS_NOZZLE;
   18314:	80 91 eb 03 	lds	r24, 0x03EB	; 0x8003eb <oNozzleDiameter>
   18318:	8c 33       	cpi	r24, 0x3C	; 60
   1831a:	09 f4       	brne	.+2      	; 0x1831e <lcd_hw_setup_menu()+0x68>
   1831c:	60 c0       	rjmp	.+192    	; 0x183de <lcd_hw_setup_menu()+0x128>
   1831e:	08 f0       	brcs	.+2      	; 0x18322 <lcd_hw_setup_menu()+0x6c>
   18320:	43 c0       	rjmp	.+134    	; 0x183a8 <lcd_hw_setup_menu()+0xf2>
   18322:	89 31       	cpi	r24, 0x19	; 25
   18324:	09 f4       	brne	.+2      	; 0x18328 <lcd_hw_setup_menu()+0x72>
   18326:	4f c0       	rjmp	.+158    	; 0x183c6 <lcd_hw_setup_menu()+0x110>
   18328:	88 32       	cpi	r24, 0x28	; 40
   1832a:	09 f4       	brne	.+2      	; 0x1832e <lcd_hw_setup_menu()+0x78>
   1832c:	42 c0       	rjmp	.+132    	; 0x183b2 <lcd_hw_setup_menu()+0xfc>
    MENU_ITEM_FUNCTION_P(_T(MSG_NOZZLE_CNG_MENU),nozzle_change);
   1832e:	85 e7       	ldi	r24, 0x75	; 117
   18330:	95 e4       	ldi	r25, 0x45	; 69
   18332:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18336:	6c e4       	ldi	r22, 0x4C	; 76
   18338:	7b ee       	ldi	r23, 0xEB	; 235
   1833a:	0e 94 9d 72 	call	0xe53a	; 0xe53a <menu_item_function_P(char const*, void (*)())>
    MENU_ITEM_SUBMENU_P(_T(MSG_CHECKS), lcd_checking_menu);
   1833e:	82 e2       	ldi	r24, 0x22	; 34
   18340:	95 e4       	ldi	r25, 0x45	; 69
   18342:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18346:	6b ed       	ldi	r22, 0xDB	; 219
   18348:	73 ec       	ldi	r23, 0xC3	; 195
   1834a:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
    //! Fsensor Detection isn't ready for mmu yet it is temporarily disabled.
    //! @todo Don't forget to remove this as soon Fsensor Detection works with mmu
    if(!MMU2::mmu2.Enabled()) MENU_ITEM_FUNCTION_P(PSTR("Fsensor Detection"), lcd_detect_IRsensor);
#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)

    if (_md->experimental_menu_visibility)
   1834e:	80 91 97 03 	lds	r24, 0x0397	; 0x800397 <menu_data+0x1>
   18352:	88 23       	and	r24, r24
   18354:	31 f0       	breq	.+12     	; 0x18362 <lcd_hw_setup_menu()+0xac>
    {
        MENU_ITEM_SUBMENU_P(PSTR("Experimental"), lcd_experimental_menu);////MSG_MENU_EXPERIMENTAL c=18
   18356:	67 e0       	ldi	r22, 0x07	; 7
   18358:	72 ec       	ldi	r23, 0xC2	; 194
   1835a:	8d e5       	ldi	r24, 0x5D	; 93
   1835c:	93 e8       	ldi	r25, 0x83	; 131
   1835e:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
	//! The SuperPINDA is detected when the PINDA temp is below its defined limit.
	//! This works well on the EINSY board but not on the miniRAMBo board as
	//! as a disconnected SuperPINDA will show higher temps compared to an EINSY board.
	//!
	//! This menu allows the user to en-/disable the SuperPINDA manualy
	MENU_ITEM_TOGGLE_P(_N("SuperPINDA"), eeprom_read_byte((uint8_t *)EEPROM_PINDA_TEMP_COMPENSATION) ? _T(MSG_YES) : _T(MSG_NO), lcd_pinda_temp_compensation_toggle);
   18362:	89 e2       	ldi	r24, 0x29	; 41
   18364:	9d e0       	ldi	r25, 0x0D	; 13
   18366:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1836a:	88 23       	and	r24, r24
   1836c:	09 f4       	brne	.+2      	; 0x18370 <lcd_hw_setup_menu()+0xba>
   1836e:	4b c0       	rjmp	.+150    	; 0x18406 <lcd_hw_setup_menu()+0x150>
   18370:	89 e9       	ldi	r24, 0x99	; 153
   18372:	98 e4       	ldi	r25, 0x48	; 72
   18374:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18378:	22 e0       	ldi	r18, 0x02	; 2
   1837a:	47 e3       	ldi	r20, 0x37	; 55
   1837c:	58 ec       	ldi	r21, 0xC8	; 200
   1837e:	bc 01       	movw	r22, r24
   18380:	85 e0       	ldi	r24, 0x05	; 5
   18382:	98 e6       	ldi	r25, 0x68	; 104
   18384:	0e 94 5e 75 	call	0xeabc	; 0xeabc <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
#endif //PINDA_TEMP_COMP

    MENU_END();
   18388:	0e 94 83 62 	call	0xc506	; 0xc506 <menu_end()>
        _md->status = 1;
        _md->experimental_menu_visibility = eeprom_init_default_byte((uint8_t *)EEPROM_EXPERIMENTAL_VISIBILITY, 0);
    }


    MENU_BEGIN();
   1838c:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   18390:	8f 5f       	subi	r24, 0xFF	; 255
   18392:	80 93 60 04 	sts	0x0460, r24	; 0x800460 <menu_row>
   18396:	80 91 62 04 	lds	r24, 0x0462	; 0x800462 <menu_line>
   1839a:	8f 5f       	subi	r24, 0xFF	; 255
   1839c:	80 93 62 04 	sts	0x0462, r24	; 0x800462 <menu_line>
   183a0:	a0 cf       	rjmp	.-192    	; 0x182e2 <lcd_hw_setup_menu()+0x2c>
    MENU_ITEM_BACK_P(_T(bSettings?MSG_SETTINGS:MSG_BACK)); // i.e. default menu-item / menu-item after checking mismatch
   183a2:	8e e8       	ldi	r24, 0x8E	; 142
   183a4:	98 e4       	ldi	r25, 0x48	; 72
   183a6:	aa cf       	rjmp	.-172    	; 0x182fc <lcd_hw_setup_menu()+0x46>

    MENU_ITEM_SUBMENU_P(_T(MSG_STEEL_SHEETS), sheets_menu);
    SETTINGS_NOZZLE;
   183a8:	80 35       	cpi	r24, 0x50	; 80
   183aa:	19 f1       	breq	.+70     	; 0x183f2 <lcd_hw_setup_menu()+0x13c>
   183ac:	8f 3f       	cpi	r24, 0xFF	; 255
   183ae:	09 f0       	breq	.+2      	; 0x183b2 <lcd_hw_setup_menu()+0xfc>
   183b0:	be cf       	rjmp	.-132    	; 0x1832e <lcd_hw_setup_menu()+0x78>
   183b2:	8b e2       	ldi	r24, 0x2B	; 43
   183b4:	95 e4       	ldi	r25, 0x45	; 69
   183b6:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   183ba:	22 e0       	ldi	r18, 0x02	; 2
   183bc:	4e eb       	ldi	r20, 0xBE	; 190
   183be:	5f eb       	ldi	r21, 0xBF	; 191
   183c0:	64 e7       	ldi	r22, 0x74	; 116
   183c2:	73 e8       	ldi	r23, 0x83	; 131
   183c4:	09 c0       	rjmp	.+18     	; 0x183d8 <lcd_hw_setup_menu()+0x122>
   183c6:	8b e2       	ldi	r24, 0x2B	; 43
   183c8:	95 e4       	ldi	r25, 0x45	; 69
   183ca:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   183ce:	22 e0       	ldi	r18, 0x02	; 2
   183d0:	4e eb       	ldi	r20, 0xBE	; 190
   183d2:	5f eb       	ldi	r21, 0xBF	; 191
   183d4:	69 e7       	ldi	r22, 0x79	; 121
   183d6:	73 e8       	ldi	r23, 0x83	; 131
   183d8:	0e 94 5e 75 	call	0xeabc	; 0xeabc <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
   183dc:	a8 cf       	rjmp	.-176    	; 0x1832e <lcd_hw_setup_menu()+0x78>
   183de:	8b e2       	ldi	r24, 0x2B	; 43
   183e0:	95 e4       	ldi	r25, 0x45	; 69
   183e2:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   183e6:	22 e0       	ldi	r18, 0x02	; 2
   183e8:	4e eb       	ldi	r20, 0xBE	; 190
   183ea:	5f eb       	ldi	r21, 0xBF	; 191
   183ec:	6f e6       	ldi	r22, 0x6F	; 111
   183ee:	73 e8       	ldi	r23, 0x83	; 131
   183f0:	f3 cf       	rjmp	.-26     	; 0x183d8 <lcd_hw_setup_menu()+0x122>
   183f2:	8b e2       	ldi	r24, 0x2B	; 43
   183f4:	95 e4       	ldi	r25, 0x45	; 69
   183f6:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   183fa:	22 e0       	ldi	r18, 0x02	; 2
   183fc:	4e eb       	ldi	r20, 0xBE	; 190
   183fe:	5f eb       	ldi	r21, 0xBF	; 191
   18400:	6a e6       	ldi	r22, 0x6A	; 106
   18402:	73 e8       	ldi	r23, 0x83	; 131
   18404:	e9 cf       	rjmp	.-46     	; 0x183d8 <lcd_hw_setup_menu()+0x122>
	//! The SuperPINDA is detected when the PINDA temp is below its defined limit.
	//! This works well on the EINSY board but not on the miniRAMBo board as
	//! as a disconnected SuperPINDA will show higher temps compared to an EINSY board.
	//!
	//! This menu allows the user to en-/disable the SuperPINDA manualy
	MENU_ITEM_TOGGLE_P(_N("SuperPINDA"), eeprom_read_byte((uint8_t *)EEPROM_PINDA_TEMP_COMPENSATION) ? _T(MSG_YES) : _T(MSG_NO), lcd_pinda_temp_compensation_toggle);
   18406:	8f e9       	ldi	r24, 0x9F	; 159
   18408:	98 e4       	ldi	r25, 0x48	; 72
   1840a:	b4 cf       	rjmp	.-152    	; 0x18374 <lcd_hw_setup_menu()+0xbe>
#endif //PINDA_TEMP_COMP

    MENU_END();
}
   1840c:	08 95       	ret

0001840e <lcd_experimental_menu()>:
}
#endif //PRUSA_SN_SUPPORT

void lcd_experimental_menu()
{
    MENU_BEGIN();
   1840e:	0e 94 0c 74 	call	0xe818	; 0xe818 <menu_start()>
   18412:	10 92 60 04 	sts	0x0460, r1	; 0x800460 <menu_row>
   18416:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   1841a:	84 30       	cpi	r24, 0x04	; 4
   1841c:	a8 f4       	brcc	.+42     	; 0x18448 <lcd_experimental_menu()+0x3a>
   1841e:	10 92 63 04 	sts	0x0463, r1	; 0x800463 <menu_item>
    MENU_ITEM_BACK_P(_T(MSG_BACK));
   18422:	88 ee       	ldi	r24, 0xE8	; 232
   18424:	9a e4       	ldi	r25, 0x4A	; 74
   18426:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1842a:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
#endif // DEBUG_PULLUP_CRASH

#ifdef PRUSA_SN_SUPPORT
    MENU_ITEM_FUNCTION_P(_N("Fake serial number"), WorkaroundPrusaSN);////MSG_WORKAROUND_PRUSA_SN c=18
#endif //PRUSA_SN_SUPPORT
    MENU_END();
   1842e:	0e 94 83 62 	call	0xc506	; 0xc506 <menu_end()>
}
#endif //PRUSA_SN_SUPPORT

void lcd_experimental_menu()
{
    MENU_BEGIN();
   18432:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   18436:	8f 5f       	subi	r24, 0xFF	; 255
   18438:	80 93 60 04 	sts	0x0460, r24	; 0x800460 <menu_row>
   1843c:	80 91 62 04 	lds	r24, 0x0462	; 0x800462 <menu_line>
   18440:	8f 5f       	subi	r24, 0xFF	; 255
   18442:	80 93 62 04 	sts	0x0462, r24	; 0x800462 <menu_line>
   18446:	e7 cf       	rjmp	.-50     	; 0x18416 <lcd_experimental_menu()+0x8>

#ifdef PRUSA_SN_SUPPORT
    MENU_ITEM_FUNCTION_P(_N("Fake serial number"), WorkaroundPrusaSN);////MSG_WORKAROUND_PRUSA_SN c=18
#endif //PRUSA_SN_SUPPORT
    MENU_END();
}
   18448:	08 95       	ret

0001844a <lcd_sdcard_stop()>:
    lcd_return_to_status();
}
#endif //THERMAL_MODEL

void lcd_sdcard_stop()
{
   1844a:	cf 93       	push	r28
    // Show static message
    lcd_puts_at_P(0, 0, _T(MSG_STOP_PRINT));
   1844c:	84 ea       	ldi	r24, 0xA4	; 164
   1844e:	98 e4       	ldi	r25, 0x48	; 72
   18450:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18454:	ac 01       	movw	r20, r24
   18456:	60 e0       	ldi	r22, 0x00	; 0
   18458:	80 e0       	ldi	r24, 0x00	; 0
   1845a:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
    lcd_putc_at(0, 1, '\n');
   1845e:	4a e0       	ldi	r20, 0x0A	; 10
   18460:	61 e0       	ldi	r22, 0x01	; 1
   18462:	80 e0       	ldi	r24, 0x00	; 0
   18464:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>

    MENU_BEGIN();
   18468:	0e 94 0c 74 	call	0xe818	; 0xe818 <menu_start()>
   1846c:	10 92 60 04 	sts	0x0460, r1	; 0x800460 <menu_row>
    // Skip first two LCD rows used by static message
    if(menu_row == 0) menu_row = 2;
   18470:	c2 e0       	ldi	r28, 0x02	; 2
{
    // Show static message
    lcd_puts_at_P(0, 0, _T(MSG_STOP_PRINT));
    lcd_putc_at(0, 1, '\n');

    MENU_BEGIN();
   18472:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   18476:	84 30       	cpi	r24, 0x04	; 4
   18478:	18 f5       	brcc	.+70     	; 0x184c0 <lcd_sdcard_stop()+0x76>
   1847a:	10 92 63 04 	sts	0x0463, r1	; 0x800463 <menu_item>
    // Skip first two LCD rows used by static message
    if(menu_row == 0) menu_row = 2;
   1847e:	81 11       	cpse	r24, r1
   18480:	02 c0       	rjmp	.+4      	; 0x18486 <lcd_sdcard_stop()+0x3c>
   18482:	c0 93 60 04 	sts	0x0460, r28	; 0x800460 <menu_row>

    // Show No options first, the default selection
    MENU_ITEM_FUNCTION_P(_T(MSG_NO), lcd_return_to_status);
   18486:	8f e9       	ldi	r24, 0x9F	; 159
   18488:	98 e4       	ldi	r25, 0x48	; 72
   1848a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1848e:	62 ee       	ldi	r22, 0xE2	; 226
   18490:	77 e3       	ldi	r23, 0x37	; 55
   18492:	0e 94 9d 72 	call	0xe53a	; 0xe53a <menu_item_function_P(char const*, void (*)())>
    MENU_ITEM_FUNCTION_P(_T(MSG_YES), lcd_print_stop);
   18496:	89 e9       	ldi	r24, 0x99	; 153
   18498:	98 e4       	ldi	r25, 0x48	; 72
   1849a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1849e:	62 e4       	ldi	r22, 0x42	; 66
   184a0:	7f ed       	ldi	r23, 0xDF	; 223
   184a2:	0e 94 9d 72 	call	0xe53a	; 0xe53a <menu_item_function_P(char const*, void (*)())>
    MENU_END();
   184a6:	0e 94 83 62 	call	0xc506	; 0xc506 <menu_end()>
{
    // Show static message
    lcd_puts_at_P(0, 0, _T(MSG_STOP_PRINT));
    lcd_putc_at(0, 1, '\n');

    MENU_BEGIN();
   184aa:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   184ae:	8f 5f       	subi	r24, 0xFF	; 255
   184b0:	80 93 60 04 	sts	0x0460, r24	; 0x800460 <menu_row>
   184b4:	80 91 62 04 	lds	r24, 0x0462	; 0x800462 <menu_line>
   184b8:	8f 5f       	subi	r24, 0xFF	; 255
   184ba:	80 93 62 04 	sts	0x0462, r24	; 0x800462 <menu_line>
   184be:	d9 cf       	rjmp	.-78     	; 0x18472 <lcd_sdcard_stop()+0x28>

    // Show No options first, the default selection
    MENU_ITEM_FUNCTION_P(_T(MSG_NO), lcd_return_to_status);
    MENU_ITEM_FUNCTION_P(_T(MSG_YES), lcd_print_stop);
    MENU_END();
}
   184c0:	cf 91       	pop	r28
   184c2:	08 95       	ret

000184c4 <lcd_fsensor_settings_menu()>:
            act = Filament_sensor::SensorActionOnError::_Continue;
    }
    fsensor.setActionOnError(act, true);
}

static void lcd_fsensor_settings_menu() {
   184c4:	cf 93       	push	r28
   184c6:	df 93       	push	r29
    MENU_BEGIN();
   184c8:	0e 94 0c 74 	call	0xe818	; 0xe818 <menu_start()>
   184cc:	10 92 60 04 	sts	0x0460, r1	; 0x800460 <menu_row>
   184d0:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   184d4:	84 30       	cpi	r24, 0x04	; 4
   184d6:	08 f0       	brcs	.+2      	; 0x184da <lcd_fsensor_settings_menu()+0x16>
   184d8:	bd c0       	rjmp	.+378    	; 0x18654 <lcd_fsensor_settings_menu()+0x190>
   184da:	10 92 63 04 	sts	0x0463, r1	; 0x800463 <menu_item>
    MENU_ITEM_BACK_P(_T(MSG_BACK));
   184de:	88 ee       	ldi	r24, 0xE8	; 232
   184e0:	9a e4       	ldi	r25, 0x4A	; 74
   184e2:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   184e6:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>

    MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR), fsensor.isEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_enabled_set);
   184ea:	80 91 f1 16 	lds	r24, 0x16F1	; 0x8016f1 <fsensor>
   184ee:	88 23       	and	r24, r24
   184f0:	09 f4       	brne	.+2      	; 0x184f4 <lcd_fsensor_settings_menu()+0x30>
   184f2:	4e c0       	rjmp	.+156    	; 0x18590 <lcd_fsensor_settings_menu()+0xcc>
   184f4:	8a e9       	ldi	r24, 0x9A	; 154
   184f6:	92 e6       	ldi	r25, 0x62	; 98
   184f8:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   184fc:	ec 01       	movw	r28, r24
   184fe:	84 e3       	ldi	r24, 0x34	; 52
   18500:	98 e4       	ldi	r25, 0x48	; 72
   18502:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18506:	22 e0       	ldi	r18, 0x02	; 2
   18508:	44 e6       	ldi	r20, 0x64	; 100
   1850a:	50 ec       	ldi	r21, 0xC0	; 192
   1850c:	be 01       	movw	r22, r28
   1850e:	0e 94 5e 75 	call	0xeabc	; 0xeabc <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
   18512:	80 91 f1 16 	lds	r24, 0x16F1	; 0x8016f1 <fsensor>

    if (fsensor.isEnabled()) {
   18516:	88 23       	and	r24, r24
   18518:	09 f4       	brne	.+2      	; 0x1851c <lcd_fsensor_settings_menu()+0x58>
   1851a:	8c c0       	rjmp	.+280    	; 0x18634 <lcd_fsensor_settings_menu()+0x170>
        if (fsensor.isError()) {
   1851c:	83 30       	cpi	r24, 0x03	; 3
   1851e:	d9 f5       	brne	.+118    	; 0x18596 <lcd_fsensor_settings_menu()+0xd2>
            MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_RUNOUT), _T(MSG_NA), fsensor_reinit);
   18520:	83 e7       	ldi	r24, 0x73	; 115
   18522:	98 e4       	ldi	r25, 0x48	; 72
   18524:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18528:	ec 01       	movw	r28, r24
   1852a:	80 ea       	ldi	r24, 0xA0	; 160
   1852c:	94 e4       	ldi	r25, 0x44	; 68
   1852e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18532:	22 e0       	ldi	r18, 0x02	; 2
   18534:	4e ec       	ldi	r20, 0xCE	; 206
   18536:	5e eb       	ldi	r21, 0xBE	; 190
   18538:	be 01       	movw	r22, r28
   1853a:	0e 94 5e 75 	call	0xeabc	; 0xeabc <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
            MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_AUTOLOAD), _T(MSG_NA), fsensor_reinit);
   1853e:	83 e7       	ldi	r24, 0x73	; 115
   18540:	98 e4       	ldi	r25, 0x48	; 72
   18542:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18546:	ec 01       	movw	r28, r24
   18548:	82 e9       	ldi	r24, 0x92	; 146
   1854a:	94 e4       	ldi	r25, 0x44	; 68
   1854c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18550:	22 e0       	ldi	r18, 0x02	; 2
   18552:	4e ec       	ldi	r20, 0xCE	; 206
   18554:	5e eb       	ldi	r21, 0xBE	; 190
   18556:	be 01       	movw	r22, r28
   18558:	0e 94 5e 75 	call	0xeabc	; 0xeabc <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
            MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_JAM_DETECTION), _T(MSG_NA), fsensor_reinit);
   1855c:	83 e7       	ldi	r24, 0x73	; 115
   1855e:	98 e4       	ldi	r25, 0x48	; 72
   18560:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18564:	ec 01       	movw	r28, r24
   18566:	82 e8       	ldi	r24, 0x82	; 130
   18568:	94 e4       	ldi	r25, 0x44	; 68
   1856a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1856e:	22 e0       	ldi	r18, 0x02	; 2
   18570:	4e ec       	ldi	r20, 0xCE	; 206
   18572:	5e eb       	ldi	r21, 0xBE	; 190
        }
        else {
            MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_RUNOUT), fsensor.getRunoutEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_runout_set);
            MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_AUTOLOAD), fsensor.getAutoLoadEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_autoload_set);
#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
            MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_JAM_DETECTION), fsensor.getJamDetectionEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_jam_detection_set);
   18574:	be 01       	movw	r22, r28
   18576:	0e 94 5e 75 	call	0xeabc	; 0xeabc <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
        }

        switch(fsensor.getActionOnError()) {
   1857a:	80 91 f9 16 	lds	r24, 0x16F9	; 0x8016f9 <fsensor+0x8>
   1857e:	88 23       	and	r24, r24
   18580:	09 f4       	brne	.+2      	; 0x18584 <lcd_fsensor_settings_menu()+0xc0>
   18582:	49 c0       	rjmp	.+146    	; 0x18616 <lcd_fsensor_settings_menu()+0x152>
   18584:	81 30       	cpi	r24, 0x01	; 1
   18586:	09 f4       	brne	.+2      	; 0x1858a <lcd_fsensor_settings_menu()+0xc6>
   18588:	62 c0       	rjmp	.+196    	; 0x1864e <lcd_fsensor_settings_menu()+0x18a>
                break;
            case Filament_sensor::SensorActionOnError::_Pause:
                MENU_ITEM_TOGGLE_P(_T(MSG_FS_ACTION), _T(MSG_PAUSE), lcd_fsensor_actionNA_set);
                break;
            default:
                lcd_fsensor_actionNA_set();
   1858a:	0e 94 5f bf 	call	0x17ebe	; 0x17ebe <lcd_fsensor_actionNA_set()>
   1858e:	52 c0       	rjmp	.+164    	; 0x18634 <lcd_fsensor_settings_menu()+0x170>

static void lcd_fsensor_settings_menu() {
    MENU_BEGIN();
    MENU_ITEM_BACK_P(_T(MSG_BACK));

    MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR), fsensor.isEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_enabled_set);
   18590:	84 e9       	ldi	r24, 0x94	; 148
   18592:	92 e6       	ldi	r25, 0x62	; 98
   18594:	b1 cf       	rjmp	.-158    	; 0x184f8 <lcd_fsensor_settings_menu()+0x34>
#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
            MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_JAM_DETECTION), _T(MSG_NA), fsensor_reinit);
#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
        }
        else {
            MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_RUNOUT), fsensor.getRunoutEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_runout_set);
   18596:	80 91 f3 16 	lds	r24, 0x16F3	; 0x8016f3 <fsensor+0x2>
   1859a:	88 23       	and	r24, r24
   1859c:	99 f1       	breq	.+102    	; 0x18604 <lcd_fsensor_settings_menu()+0x140>
   1859e:	8a e9       	ldi	r24, 0x9A	; 154
   185a0:	92 e6       	ldi	r25, 0x62	; 98
   185a2:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   185a6:	ec 01       	movw	r28, r24
   185a8:	80 ea       	ldi	r24, 0xA0	; 160
   185aa:	94 e4       	ldi	r25, 0x44	; 68
   185ac:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   185b0:	22 e0       	ldi	r18, 0x02	; 2
   185b2:	45 e7       	ldi	r20, 0x75	; 117
   185b4:	5f eb       	ldi	r21, 0xBF	; 191
   185b6:	be 01       	movw	r22, r28
   185b8:	0e 94 5e 75 	call	0xeabc	; 0xeabc <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
            MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_AUTOLOAD), fsensor.getAutoLoadEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_autoload_set);
   185bc:	80 91 f2 16 	lds	r24, 0x16F2	; 0x8016f2 <fsensor+0x1>
   185c0:	88 23       	and	r24, r24
   185c2:	19 f1       	breq	.+70     	; 0x1860a <lcd_fsensor_settings_menu()+0x146>
   185c4:	8a e9       	ldi	r24, 0x9A	; 154
   185c6:	92 e6       	ldi	r25, 0x62	; 98
   185c8:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   185cc:	ec 01       	movw	r28, r24
   185ce:	82 e9       	ldi	r24, 0x92	; 146
   185d0:	94 e4       	ldi	r25, 0x44	; 68
   185d2:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   185d6:	22 e0       	ldi	r18, 0x02	; 2
   185d8:	4b e6       	ldi	r20, 0x6B	; 107
   185da:	5f eb       	ldi	r21, 0xBF	; 191
   185dc:	be 01       	movw	r22, r28
   185de:	0e 94 5e 75 	call	0xeabc	; 0xeabc <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
            MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_JAM_DETECTION), fsensor.getJamDetectionEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_jam_detection_set);
   185e2:	80 91 ff 16 	lds	r24, 0x16FF	; 0x8016ff <fsensor+0xe>
   185e6:	88 23       	and	r24, r24
   185e8:	99 f0       	breq	.+38     	; 0x18610 <lcd_fsensor_settings_menu()+0x14c>
   185ea:	8a e9       	ldi	r24, 0x9A	; 154
   185ec:	92 e6       	ldi	r25, 0x62	; 98
   185ee:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   185f2:	ec 01       	movw	r28, r24
   185f4:	82 e8       	ldi	r24, 0x82	; 130
   185f6:	94 e4       	ldi	r25, 0x44	; 68
   185f8:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   185fc:	22 e0       	ldi	r18, 0x02	; 2
   185fe:	4b e6       	ldi	r20, 0x6B	; 107
   18600:	50 ec       	ldi	r21, 0xC0	; 192
   18602:	b8 cf       	rjmp	.-144    	; 0x18574 <lcd_fsensor_settings_menu()+0xb0>
#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
            MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_JAM_DETECTION), _T(MSG_NA), fsensor_reinit);
#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
        }
        else {
            MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_RUNOUT), fsensor.getRunoutEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_runout_set);
   18604:	84 e9       	ldi	r24, 0x94	; 148
   18606:	92 e6       	ldi	r25, 0x62	; 98
   18608:	cc cf       	rjmp	.-104    	; 0x185a2 <lcd_fsensor_settings_menu()+0xde>
            MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_AUTOLOAD), fsensor.getAutoLoadEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_autoload_set);
   1860a:	84 e9       	ldi	r24, 0x94	; 148
   1860c:	92 e6       	ldi	r25, 0x62	; 98
   1860e:	dc cf       	rjmp	.-72     	; 0x185c8 <lcd_fsensor_settings_menu()+0x104>
#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
            MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR_JAM_DETECTION), fsensor.getJamDetectionEnabled() ? _T(MSG_ON) : _T(MSG_OFF), lcd_fsensor_jam_detection_set);
   18610:	84 e9       	ldi	r24, 0x94	; 148
   18612:	92 e6       	ldi	r25, 0x62	; 98
   18614:	ec cf       	rjmp	.-40     	; 0x185ee <lcd_fsensor_settings_menu()+0x12a>
#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
        }

        switch(fsensor.getActionOnError()) {
            case Filament_sensor::SensorActionOnError::_Continue:
                MENU_ITEM_TOGGLE_P(_T(MSG_FS_ACTION), _T(MSG_CONTINUE_SHORT), lcd_fsensor_actionNA_set);
   18616:	8a e7       	ldi	r24, 0x7A	; 122
   18618:	94 e4       	ldi	r25, 0x44	; 68
                break;
            case Filament_sensor::SensorActionOnError::_Pause:
                MENU_ITEM_TOGGLE_P(_T(MSG_FS_ACTION), _T(MSG_PAUSE), lcd_fsensor_actionNA_set);
   1861a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1861e:	ec 01       	movw	r28, r24
   18620:	8e e6       	ldi	r24, 0x6E	; 110
   18622:	94 e4       	ldi	r25, 0x44	; 68
   18624:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18628:	22 e0       	ldi	r18, 0x02	; 2
   1862a:	4f e5       	ldi	r20, 0x5F	; 95
   1862c:	5f eb       	ldi	r21, 0xBF	; 191
   1862e:	be 01       	movw	r22, r28
   18630:	0e 94 5e 75 	call	0xeabc	; 0xeabc <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
            default:
                lcd_fsensor_actionNA_set();
        }
    }

    MENU_END();
   18634:	0e 94 83 62 	call	0xc506	; 0xc506 <menu_end()>
    }
    fsensor.setActionOnError(act, true);
}

static void lcd_fsensor_settings_menu() {
    MENU_BEGIN();
   18638:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   1863c:	8f 5f       	subi	r24, 0xFF	; 255
   1863e:	80 93 60 04 	sts	0x0460, r24	; 0x800460 <menu_row>
   18642:	80 91 62 04 	lds	r24, 0x0462	; 0x800462 <menu_line>
   18646:	8f 5f       	subi	r24, 0xFF	; 255
   18648:	80 93 62 04 	sts	0x0462, r24	; 0x800462 <menu_line>
   1864c:	41 cf       	rjmp	.-382    	; 0x184d0 <lcd_fsensor_settings_menu()+0xc>
        switch(fsensor.getActionOnError()) {
            case Filament_sensor::SensorActionOnError::_Continue:
                MENU_ITEM_TOGGLE_P(_T(MSG_FS_ACTION), _T(MSG_CONTINUE_SHORT), lcd_fsensor_actionNA_set);
                break;
            case Filament_sensor::SensorActionOnError::_Pause:
                MENU_ITEM_TOGGLE_P(_T(MSG_FS_ACTION), _T(MSG_PAUSE), lcd_fsensor_actionNA_set);
   1864e:	86 e6       	ldi	r24, 0x66	; 102
   18650:	94 e4       	ldi	r25, 0x44	; 68
   18652:	e3 cf       	rjmp	.-58     	; 0x1861a <lcd_fsensor_settings_menu()+0x156>
                lcd_fsensor_actionNA_set();
        }
    }

    MENU_END();
}
   18654:	df 91       	pop	r29
   18656:	cf 91       	pop	r28
   18658:	08 95       	ret

0001865a <lcd_sheet_menu()>:
    lcd_first_layer_calibration_reset();
}

static void lcd_sheet_menu()
{
    MENU_BEGIN();
   1865a:	0e 94 0c 74 	call	0xe818	; 0xe818 <menu_start()>
   1865e:	10 92 60 04 	sts	0x0460, r1	; 0x800460 <menu_row>
   18662:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   18666:	84 30       	cpi	r24, 0x04	; 4
   18668:	08 f0       	brcs	.+2      	; 0x1866c <lcd_sheet_menu()+0x12>
   1866a:	3f c0       	rjmp	.+126    	; 0x186ea <lcd_sheet_menu()+0x90>
   1866c:	10 92 63 04 	sts	0x0463, r1	; 0x800463 <menu_item>
    MENU_ITEM_BACK_P(_T(MSG_STEEL_SHEETS));
   18670:	8c ed       	ldi	r24, 0xDC	; 220
   18672:	96 e4       	ldi	r25, 0x46	; 70
   18674:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18678:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>

	if(eeprom_is_sheet_initialized(selected_sheet)){
   1867c:	80 91 ca 03 	lds	r24, 0x03CA	; 0x8003ca <selected_sheet>
   18680:	0e 94 88 78 	call	0xf110	; 0xf110 <eeprom_is_sheet_initialized(unsigned char)>
   18684:	88 23       	and	r24, r24
   18686:	41 f0       	breq	.+16     	; 0x18698 <lcd_sheet_menu()+0x3e>
	    MENU_ITEM_SUBMENU_P(_T(MSG_SELECT), change_sheet);
   18688:	83 ed       	ldi	r24, 0xD3	; 211
   1868a:	96 e4       	ldi	r25, 0x46	; 70
   1868c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18690:	68 ed       	ldi	r22, 0xD8	; 216
   18692:	7f ec       	ldi	r23, 0xCF	; 207
   18694:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
	}

    if (lcd_commands_type == LcdCommands::Idle)
   18698:	80 91 5e 0d 	lds	r24, 0x0D5E	; 0x800d5e <lcd_commands_type>
   1869c:	81 11       	cpse	r24, r1
   1869e:	08 c0       	rjmp	.+16     	; 0x186b0 <lcd_sheet_menu()+0x56>
    {
        MENU_ITEM_SUBMENU_P(_T(MSG_V2_CALIBRATION), activate_calibrate_sheet);
   186a0:	80 ec       	ldi	r24, 0xC0	; 192
   186a2:	96 e4       	ldi	r25, 0x46	; 70
   186a4:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   186a8:	66 e5       	ldi	r22, 0x56	; 86
   186aa:	79 ed       	ldi	r23, 0xD9	; 217
   186ac:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
    }
    MENU_ITEM_SUBMENU_P(_T(MSG_RENAME), lcd_rename_sheet_menu);
   186b0:	87 eb       	ldi	r24, 0xB7	; 183
   186b2:	96 e4       	ldi	r25, 0x46	; 70
   186b4:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   186b8:	6c e0       	ldi	r22, 0x0C	; 12
   186ba:	76 ec       	ldi	r23, 0xC6	; 198
   186bc:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
	MENU_ITEM_FUNCTION_P(_T(MSG_RESET), lcd_reset_sheet);
   186c0:	8f ea       	ldi	r24, 0xAF	; 175
   186c2:	96 e4       	ldi	r25, 0x46	; 70
   186c4:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   186c8:	67 e0       	ldi	r22, 0x07	; 7
   186ca:	77 ed       	ldi	r23, 0xD7	; 215
   186cc:	0e 94 9d 72 	call	0xe53a	; 0xe53a <menu_item_function_P(char const*, void (*)())>

    MENU_END();
   186d0:	0e 94 83 62 	call	0xc506	; 0xc506 <menu_end()>
    lcd_first_layer_calibration_reset();
}

static void lcd_sheet_menu()
{
    MENU_BEGIN();
   186d4:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   186d8:	8f 5f       	subi	r24, 0xFF	; 255
   186da:	80 93 60 04 	sts	0x0460, r24	; 0x800460 <menu_row>
   186de:	80 91 62 04 	lds	r24, 0x0462	; 0x800462 <menu_line>
   186e2:	8f 5f       	subi	r24, 0xFF	; 255
   186e4:	80 93 62 04 	sts	0x0462, r24	; 0x800462 <menu_line>
   186e8:	bc cf       	rjmp	.-136    	; 0x18662 <lcd_sheet_menu()+0x8>
    }
    MENU_ITEM_SUBMENU_P(_T(MSG_RENAME), lcd_rename_sheet_menu);
	MENU_ITEM_FUNCTION_P(_T(MSG_RESET), lcd_reset_sheet);

    MENU_END();
}
   186ea:	08 95       	ret

000186ec <void select_sheet_menu<(unsigned char)7>()>:
}

template <uint8_t number>
static void select_sheet_menu()
{
    selected_sheet = number;
   186ec:	87 e0       	ldi	r24, 0x07	; 7
   186ee:	80 93 ca 03 	sts	0x03CA, r24	; 0x8003ca <selected_sheet>
    lcd_sheet_menu();
   186f2:	0c 94 2d c3 	jmp	0x1865a	; 0x1865a <lcd_sheet_menu()>

000186f6 <void select_sheet_menu<(unsigned char)6>()>:
}

template <uint8_t number>
static void select_sheet_menu()
{
    selected_sheet = number;
   186f6:	86 e0       	ldi	r24, 0x06	; 6
   186f8:	80 93 ca 03 	sts	0x03CA, r24	; 0x8003ca <selected_sheet>
    lcd_sheet_menu();
   186fc:	0c 94 2d c3 	jmp	0x1865a	; 0x1865a <lcd_sheet_menu()>

00018700 <void select_sheet_menu<(unsigned char)5>()>:
}

template <uint8_t number>
static void select_sheet_menu()
{
    selected_sheet = number;
   18700:	85 e0       	ldi	r24, 0x05	; 5
   18702:	80 93 ca 03 	sts	0x03CA, r24	; 0x8003ca <selected_sheet>
    lcd_sheet_menu();
   18706:	0c 94 2d c3 	jmp	0x1865a	; 0x1865a <lcd_sheet_menu()>

0001870a <void select_sheet_menu<(unsigned char)4>()>:
}

template <uint8_t number>
static void select_sheet_menu()
{
    selected_sheet = number;
   1870a:	84 e0       	ldi	r24, 0x04	; 4
   1870c:	80 93 ca 03 	sts	0x03CA, r24	; 0x8003ca <selected_sheet>
    lcd_sheet_menu();
   18710:	0c 94 2d c3 	jmp	0x1865a	; 0x1865a <lcd_sheet_menu()>

00018714 <void select_sheet_menu<(unsigned char)3>()>:
}

template <uint8_t number>
static void select_sheet_menu()
{
    selected_sheet = number;
   18714:	83 e0       	ldi	r24, 0x03	; 3
   18716:	80 93 ca 03 	sts	0x03CA, r24	; 0x8003ca <selected_sheet>
    lcd_sheet_menu();
   1871a:	0c 94 2d c3 	jmp	0x1865a	; 0x1865a <lcd_sheet_menu()>

0001871e <void select_sheet_menu<(unsigned char)2>()>:
}

template <uint8_t number>
static void select_sheet_menu()
{
    selected_sheet = number;
   1871e:	82 e0       	ldi	r24, 0x02	; 2
   18720:	80 93 ca 03 	sts	0x03CA, r24	; 0x8003ca <selected_sheet>
    lcd_sheet_menu();
   18724:	0c 94 2d c3 	jmp	0x1865a	; 0x1865a <lcd_sheet_menu()>

00018728 <void select_sheet_menu<(unsigned char)1>()>:
}

template <uint8_t number>
static void select_sheet_menu()
{
    selected_sheet = number;
   18728:	81 e0       	ldi	r24, 0x01	; 1
   1872a:	80 93 ca 03 	sts	0x03CA, r24	; 0x8003ca <selected_sheet>
    lcd_sheet_menu();
   1872e:	0c 94 2d c3 	jmp	0x1865a	; 0x1865a <lcd_sheet_menu()>

00018732 <void select_sheet_menu<(unsigned char)0>()>:
}

template <uint8_t number>
static void select_sheet_menu()
{
    selected_sheet = number;
   18732:	10 92 ca 03 	sts	0x03CA, r1	; 0x8003ca <selected_sheet>
    lcd_sheet_menu();
   18736:	0c 94 2d c3 	jmp	0x1865a	; 0x1865a <lcd_sheet_menu()>

0001873a <lcd_move_menu_axis()>:
	menu_back_if_clicked();
}

void lcd_move_menu_axis()
{
	MENU_BEGIN();
   1873a:	0e 94 0c 74 	call	0xe818	; 0xe818 <menu_start()>
   1873e:	10 92 60 04 	sts	0x0460, r1	; 0x800460 <menu_row>
   18742:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   18746:	84 30       	cpi	r24, 0x04	; 4
   18748:	a8 f5       	brcc	.+106    	; 0x187b4 <lcd_move_menu_axis()+0x7a>
   1874a:	10 92 63 04 	sts	0x0463, r1	; 0x800463 <menu_item>
	MENU_ITEM_BACK_P(_T(MSG_SETTINGS));
   1874e:	8e e8       	ldi	r24, 0x8E	; 142
   18750:	98 e4       	ldi	r25, 0x48	; 72
   18752:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18756:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
	MENU_ITEM_SUBMENU_P(_T(MSG_MOVE_X), lcd_move_x);
   1875a:	8c eb       	ldi	r24, 0xBC	; 188
   1875c:	9c e3       	ldi	r25, 0x3C	; 60
   1875e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18762:	69 e5       	ldi	r22, 0x59	; 89
   18764:	78 ec       	ldi	r23, 0xC8	; 200
   18766:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
	MENU_ITEM_SUBMENU_P(_T(MSG_MOVE_Y), lcd_move_y);
   1876a:	83 eb       	ldi	r24, 0xB3	; 179
   1876c:	9c e3       	ldi	r25, 0x3C	; 60
   1876e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18772:	62 e6       	ldi	r22, 0x62	; 98
   18774:	78 ec       	ldi	r23, 0xC8	; 200
   18776:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
	MENU_ITEM_SUBMENU_P(_T(MSG_MOVE_Z), lcd_move_z);
   1877a:	8a ea       	ldi	r24, 0xAA	; 170
   1877c:	9c e3       	ldi	r25, 0x3C	; 60
   1877e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18782:	60 e5       	ldi	r22, 0x50	; 80
   18784:	78 ec       	ldi	r23, 0xC8	; 200
   18786:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
	MENU_ITEM_SUBMENU_P(_T(MSG_EXTRUDER), lcd_move_e);
   1878a:	8f e9       	ldi	r24, 0x9F	; 159
   1878c:	9c e3       	ldi	r25, 0x3C	; 60
   1878e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18792:	68 ec       	ldi	r22, 0xC8	; 200
   18794:	7e ec       	ldi	r23, 0xCE	; 206
   18796:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
	MENU_END();
   1879a:	0e 94 83 62 	call	0xc506	; 0xc506 <menu_end()>
	menu_back_if_clicked();
}

void lcd_move_menu_axis()
{
	MENU_BEGIN();
   1879e:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   187a2:	8f 5f       	subi	r24, 0xFF	; 255
   187a4:	80 93 60 04 	sts	0x0460, r24	; 0x800460 <menu_row>
   187a8:	80 91 62 04 	lds	r24, 0x0462	; 0x800462 <menu_line>
   187ac:	8f 5f       	subi	r24, 0xFF	; 255
   187ae:	80 93 62 04 	sts	0x0462, r24	; 0x800462 <menu_line>
   187b2:	c7 cf       	rjmp	.-114    	; 0x18742 <lcd_move_menu_axis()+0x8>
	MENU_ITEM_SUBMENU_P(_T(MSG_MOVE_X), lcd_move_x);
	MENU_ITEM_SUBMENU_P(_T(MSG_MOVE_Y), lcd_move_y);
	MENU_ITEM_SUBMENU_P(_T(MSG_MOVE_Z), lcd_move_z);
	MENU_ITEM_SUBMENU_P(_T(MSG_EXTRUDER), lcd_move_e);
	MENU_END();
}
   187b4:	08 95       	ret

000187b6 <lcd_checking_menu()>:
    }
}

static void lcd_checking_menu(void)
{
    MENU_BEGIN();
   187b6:	0e 94 0c 74 	call	0xe818	; 0xe818 <menu_start()>
   187ba:	10 92 60 04 	sts	0x0460, r1	; 0x800460 <menu_row>
   187be:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   187c2:	84 30       	cpi	r24, 0x04	; 4
   187c4:	d8 f5       	brcc	.+118    	; 0x1883c <lcd_checking_menu()+0x86>
   187c6:	10 92 63 04 	sts	0x0463, r1	; 0x800463 <menu_item>
    MENU_ITEM_BACK_P(_T(MSG_HW_SETUP));
   187ca:	85 e8       	ldi	r24, 0x85	; 133
   187cc:	95 e4       	ldi	r25, 0x45	; 69
   187ce:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   187d2:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
    settings_check_toggle(&oCheckMode, _T(MSG_NOZZLE), lcd_check_mode_set);
   187d6:	8c ed       	ldi	r24, 0xDC	; 220
   187d8:	94 e4       	ldi	r25, 0x44	; 68
   187da:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   187de:	45 e5       	ldi	r20, 0x55	; 85
   187e0:	5f eb       	ldi	r21, 0xBF	; 191
   187e2:	bc 01       	movw	r22, r24
   187e4:	80 91 ed 03 	lds	r24, 0x03ED	; 0x8003ed <oCheckMode>
   187e8:	0e 94 d1 c0 	call	0x181a2	; 0x181a2 <settings_check_toggle(ClCheckMode*, char const*, void (*)()) [clone .isra.4]>
    settings_check_toggle(&oCheckModel, _T(MSG_MODEL), lcd_check_model_set);
   187ec:	84 ed       	ldi	r24, 0xD4	; 212
   187ee:	94 e4       	ldi	r25, 0x44	; 68
   187f0:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   187f4:	4b e4       	ldi	r20, 0x4B	; 75
   187f6:	5f eb       	ldi	r21, 0xBF	; 191
   187f8:	bc 01       	movw	r22, r24
   187fa:	80 91 ea 03 	lds	r24, 0x03EA	; 0x8003ea <oCheckModel>
   187fe:	0e 94 d1 c0 	call	0x181a2	; 0x181a2 <settings_check_toggle(ClCheckMode*, char const*, void (*)()) [clone .isra.4]>
    settings_check_toggle(&oCheckVersion, MSG_FIRMWARE, lcd_check_version_set);
   18802:	41 e4       	ldi	r20, 0x41	; 65
   18804:	5f eb       	ldi	r21, 0xBF	; 191
   18806:	6c ef       	ldi	r22, 0xFC	; 252
   18808:	77 e6       	ldi	r23, 0x67	; 103
   1880a:	80 91 e9 03 	lds	r24, 0x03E9	; 0x8003e9 <oCheckVersion>
   1880e:	0e 94 d1 c0 	call	0x181a2	; 0x181a2 <settings_check_toggle(ClCheckMode*, char const*, void (*)()) [clone .isra.4]>
    settings_check_toggle(&oCheckFilament, MSG_FILAMENT, lcd_check_filament_set);
   18812:	47 e3       	ldi	r20, 0x37	; 55
   18814:	5f eb       	ldi	r21, 0xBF	; 191
   18816:	63 ef       	ldi	r22, 0xF3	; 243
   18818:	79 e6       	ldi	r23, 0x69	; 105
   1881a:	80 91 ee 03 	lds	r24, 0x03EE	; 0x8003ee <oCheckFilament>
   1881e:	0e 94 d1 c0 	call	0x181a2	; 0x181a2 <settings_check_toggle(ClCheckMode*, char const*, void (*)()) [clone .isra.4]>
    MENU_END();
   18822:	0e 94 83 62 	call	0xc506	; 0xc506 <menu_end()>
    }
}

static void lcd_checking_menu(void)
{
    MENU_BEGIN();
   18826:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   1882a:	8f 5f       	subi	r24, 0xFF	; 255
   1882c:	80 93 60 04 	sts	0x0460, r24	; 0x800460 <menu_row>
   18830:	80 91 62 04 	lds	r24, 0x0462	; 0x800462 <menu_line>
   18834:	8f 5f       	subi	r24, 0xFF	; 255
   18836:	80 93 62 04 	sts	0x0462, r24	; 0x800462 <menu_line>
   1883a:	c1 cf       	rjmp	.-126    	; 0x187be <lcd_checking_menu()+0x8>
    settings_check_toggle(&oCheckMode, _T(MSG_NOZZLE), lcd_check_mode_set);
    settings_check_toggle(&oCheckModel, _T(MSG_MODEL), lcd_check_model_set);
    settings_check_toggle(&oCheckVersion, MSG_FIRMWARE, lcd_check_version_set);
    settings_check_toggle(&oCheckFilament, MSG_FILAMENT, lcd_check_filament_set);
    MENU_END();
}
   1883c:	08 95       	ret

0001883e <Tag(char const*, char const*, unsigned char, unsigned int, unsigned int*)>:
        ++str;
    }
    return str;
}

bool __attribute__((noinline)) Tag(const char *str, const char *tag_P, uint8_t tagSize, uint16_t tagMask, uint16_t *v){
   1883e:	cf 92       	push	r12
   18840:	df 92       	push	r13
   18842:	ef 92       	push	r14
   18844:	ff 92       	push	r15
   18846:	0f 93       	push	r16
   18848:	1f 93       	push	r17
   1884a:	cf 93       	push	r28
   1884c:	df 93       	push	r29
   1884e:	6c 01       	movw	r12, r24
   18850:	79 01       	movw	r14, r18
    if( ! strncmp_P(str, tag_P, tagSize) ){
   18852:	c4 2f       	mov	r28, r20
   18854:	d0 e0       	ldi	r29, 0x00	; 0
   18856:	ae 01       	movw	r20, r28
   18858:	0f 94 bf a1 	call	0x3437e	; 0x3437e <strncmp_P>
   1885c:	89 2b       	or	r24, r25
   1885e:	b9 f4       	brne	.+46     	; 0x1888e <Tag(char const*, char const*, unsigned char, unsigned int, unsigned int*)+0x50>
        Number(str + tagSize, v);
   18860:	b8 01       	movw	r22, r16
   18862:	c6 01       	movw	r24, r12
   18864:	8c 0f       	add	r24, r28
   18866:	9d 1f       	adc	r25, r29
   18868:	0e 94 cf bd 	call	0x17b9e	; 0x17b9e <Number(char const*, unsigned int*)>
        *v |= tagMask;
   1886c:	f8 01       	movw	r30, r16
   1886e:	20 81       	ld	r18, Z
   18870:	31 81       	ldd	r19, Z+1	; 0x01
   18872:	2e 29       	or	r18, r14
   18874:	3f 29       	or	r19, r15
   18876:	31 83       	std	Z+1, r19	; 0x01
   18878:	20 83       	st	Z, r18
        return true;
   1887a:	81 e0       	ldi	r24, 0x01	; 1
    }
    return false;
}
   1887c:	df 91       	pop	r29
   1887e:	cf 91       	pop	r28
   18880:	1f 91       	pop	r17
   18882:	0f 91       	pop	r16
   18884:	ff 90       	pop	r15
   18886:	ef 90       	pop	r14
   18888:	df 90       	pop	r13
   1888a:	cf 90       	pop	r12
   1888c:	08 95       	ret
    if( ! strncmp_P(str, tag_P, tagSize) ){
        Number(str + tagSize, v);
        *v |= tagMask;
        return true;
    }
    return false;
   1888e:	80 e0       	ldi	r24, 0x00	; 0
   18890:	f5 cf       	rjmp	.-22     	; 0x1887c <Tag(char const*, char const*, unsigned char, unsigned int, unsigned int*)+0x3e>

00018892 <lcd_language()>:
	}
}

#if (LANG_MODE != 0)
void lcd_language()
{
   18892:	cf 93       	push	r28
   18894:	df 93       	push	r29
	lcd_update_enable(true);
   18896:	81 e0       	ldi	r24, 0x01	; 1
   18898:	0e 94 38 70 	call	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>
	menu_goto(lcd_language_menu, 0, true, true);
   1889c:	21 e0       	ldi	r18, 0x01	; 1
   1889e:	41 e0       	ldi	r20, 0x01	; 1
   188a0:	70 e0       	ldi	r23, 0x00	; 0
   188a2:	60 e0       	ldi	r22, 0x00	; 0
   188a4:	86 e1       	ldi	r24, 0x16	; 22
   188a6:	99 ee       	ldi	r25, 0xE9	; 233
   188a8:	0e 94 b7 62 	call	0xc56e	; 0xc56e <menu_goto(void (*)(), int, bool, bool)>
   188ac:	10 92 e3 03 	sts	0x03E3, r1	; 0x8003e3 <lcd_timeoutToStatus>
	lcd_timeoutToStatus.stop(); //infinite timeout
	while ((menu_menu != lcd_status_screen) && (!lang_is_selected()))
   188b0:	c0 91 02 04 	lds	r28, 0x0402	; 0x800402 <menu_menu>
   188b4:	d0 91 03 04 	lds	r29, 0x0403	; 0x800403 <menu_menu+0x1>
   188b8:	0e 94 2e 74 	call	0xe85c	; 0xe85c <lang_is_selected>
   188bc:	c0 52       	subi	r28, 0x20	; 32
   188be:	d7 43       	sbci	r29, 0x37	; 55
   188c0:	39 f0       	breq	.+14     	; 0x188d0 <lcd_language()+0x3e>
   188c2:	81 11       	cpse	r24, r1
   188c4:	07 c0       	rjmp	.+14     	; 0x188d4 <lcd_language()+0x42>
	{
		delay_keep_alive(50);
   188c6:	82 e3       	ldi	r24, 0x32	; 50
   188c8:	90 e0       	ldi	r25, 0x00	; 0
   188ca:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
   188ce:	f0 cf       	rjmp	.-32     	; 0x188b0 <lcd_language()+0x1e>
	}
	if (lang_is_selected())
   188d0:	88 23       	and	r24, r24
   188d2:	21 f0       	breq	.+8      	; 0x188dc <lcd_language()+0x4a>
		lcd_return_to_status();
	else
		lang_select(LANG_ID_PRI);
}
   188d4:	df 91       	pop	r29
   188d6:	cf 91       	pop	r28
	while ((menu_menu != lcd_status_screen) && (!lang_is_selected()))
	{
		delay_keep_alive(50);
	}
	if (lang_is_selected())
		lcd_return_to_status();
   188d8:	0d 94 d5 07 	jmp	0x20faa	; 0x20faa <lcd_return_to_status()>
	else
		lang_select(LANG_ID_PRI);
   188dc:	80 e0       	ldi	r24, 0x00	; 0
}
   188de:	df 91       	pop	r29
   188e0:	cf 91       	pop	r28
		delay_keep_alive(50);
	}
	if (lang_is_selected())
		lcd_return_to_status();
	else
		lang_select(LANG_ID_PRI);
   188e2:	0c 94 ce 74 	jmp	0xe99c	; 0xe99c <lang_select>

000188e6 <lcd_mesh_calibration()>:
	lcd_return_to_status();
}

void lcd_mesh_calibration()
{
  enquecommand_P(PSTR("M45"));
   188e6:	61 e0       	ldi	r22, 0x01	; 1
   188e8:	85 e3       	ldi	r24, 0x35	; 53
   188ea:	93 e8       	ldi	r25, 0x83	; 131
   188ec:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
  lcd_return_to_status();
   188f0:	0d 94 d5 07 	jmp	0x20faa	; 0x20faa <lcd_return_to_status()>

000188f4 <lcd_mesh_calibration_z()>:
}

void lcd_mesh_calibration_z()
{
  enquecommand_P(PSTR("M45 Z"));
   188f4:	61 e0       	ldi	r22, 0x01	; 1
   188f6:	89 e3       	ldi	r24, 0x39	; 57
   188f8:	93 e8       	ldi	r25, 0x83	; 131
   188fa:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
  lcd_return_to_status();
   188fe:	0d 94 d5 07 	jmp	0x20faa	; 0x20faa <lcd_return_to_status()>

00018902 <lcd_mesh_bedleveling()>:
}
#endif //(LANG_MODE != 0)

void lcd_mesh_bedleveling()
{
	enquecommand_P(PSTR("G80"));
   18902:	61 e0       	ldi	r22, 0x01	; 1
   18904:	81 e3       	ldi	r24, 0x31	; 49
   18906:	93 e8       	ldi	r25, 0x83	; 131
   18908:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
	lcd_return_to_status();
   1890c:	0d 94 d5 07 	jmp	0x20faa	; 0x20faa <lcd_return_to_status()>

00018910 <lcd_calibrate_pinda()>:
	MYSERIAL.begin(BAUDRATE);
}
#endif //HAS_SECOND_SERIAL_PORT

void lcd_calibrate_pinda() {
	enquecommand_P(PSTR("G76"));
   18910:	61 e0       	ldi	r22, 0x01	; 1
   18912:	8f e3       	ldi	r24, 0x3F	; 63
   18914:	93 e8       	ldi	r25, 0x83	; 131
   18916:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
	lcd_return_to_status();
   1891a:	0d 94 d5 07 	jmp	0x20faa	; 0x20faa <lcd_return_to_status()>

0001891e <lcd_menu_show_sensors_state()>:
                 pat9125_s, pat9125_y);
#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
}

void lcd_menu_show_sensors_state()                // NOT static due to using inside "Marlin_main" module ("manage_inactivity()")
{
   1891e:	cf 93       	push	r28
   18920:	10 92 e3 03 	sts	0x03E3, r1	; 0x8003e3 <lcd_timeoutToStatus>
{
	//0: N/A; 1: OFF; 2: ON
	uint8_t pinda_state = STATE_NA;
	uint8_t idler_state = STATE_NA;

	pinda_state = READ(Z_MIN_PIN);
   18924:	c3 b1       	in	r28, 0x03	; 3
	lcd_puts_at_P(0, 0, MSG_PINDA);
   18926:	46 ed       	ldi	r20, 0xD6	; 214
   18928:	57 e6       	ldi	r21, 0x67	; 103
   1892a:	60 e0       	ldi	r22, 0x00	; 0
   1892c:	80 e0       	ldi	r24, 0x00	; 0
   1892e:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
	lcd_set_cursor(LCD_WIDTH - 14, 0);
   18932:	60 e0       	ldi	r22, 0x00	; 0
   18934:	86 e0       	ldi	r24, 0x06	; 6
   18936:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
	lcd_print_state(pinda_state);
   1893a:	c4 fb       	bst	r28, 4
   1893c:	88 27       	eor	r24, r24
   1893e:	80 f9       	bld	r24, 0
   18940:	0e 94 fc be 	call	0x17df8	; 0x17df8 <lcd_print_state(unsigned char)>

	if (MMU2::mmu2.Enabled()) {
   18944:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   18948:	81 30       	cpi	r24, 0x01	; 1
   1894a:	99 f4       	brne	.+38     	; 0x18972 <lcd_menu_show_sensors_state()+0x54>
    inline bool Running() const {
        return state == State::Running;
    }

    inline bool FindaPressed() const {
        return regs8[0];
   1894c:	c1 e0       	ldi	r28, 0x01	; 1
   1894e:	80 91 d7 12 	lds	r24, 0x12D7	; 0x8012d7 <MMU2::mmu2+0x45>
   18952:	81 11       	cpse	r24, r1
   18954:	01 c0       	rjmp	.+2      	; 0x18958 <lcd_menu_show_sensors_state()+0x3a>
   18956:	c0 e0       	ldi	r28, 0x00	; 0
		const uint8_t finda_state = MMU2::mmu2.FindaDetectsFilament();
		lcd_puts_at_P(10, 0, _n("FINDA"));////MSG_FINDA c=5
   18958:	40 ed       	ldi	r20, 0xD0	; 208
   1895a:	57 e6       	ldi	r21, 0x67	; 103
   1895c:	60 e0       	ldi	r22, 0x00	; 0
   1895e:	8a e0       	ldi	r24, 0x0A	; 10
   18960:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
		lcd_set_cursor(LCD_WIDTH - 3, 0);
   18964:	60 e0       	ldi	r22, 0x00	; 0
   18966:	81 e1       	ldi	r24, 0x11	; 17
   18968:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
		lcd_print_state(finda_state);
   1896c:	8c 2f       	mov	r24, r28
   1896e:	0e 94 fc be 	call	0x17df8	; 0x17df8 <lcd_print_state(unsigned char)>
   18972:	c1 e0       	ldi	r28, 0x01	; 1
   18974:	80 91 fe 16 	lds	r24, 0x16FE	; 0x8016fe <fsensor+0xd>
   18978:	81 11       	cpse	r24, r1
   1897a:	01 c0       	rjmp	.+2      	; 0x1897e <lcd_menu_show_sensors_state()+0x60>
   1897c:	c0 e0       	ldi	r28, 0x00	; 0
	}
#ifdef FILAMENT_SENSOR
	idler_state = fsensor.getFilamentPresent();
	lcd_puts_at_P(0, 1, _T(MSG_FSENSOR));
   1897e:	84 e3       	ldi	r24, 0x34	; 52
   18980:	98 e4       	ldi	r25, 0x48	; 72
   18982:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18986:	ac 01       	movw	r20, r24
   18988:	61 e0       	ldi	r22, 0x01	; 1
   1898a:	80 e0       	ldi	r24, 0x00	; 0
   1898c:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
	lcd_set_cursor(LCD_WIDTH - 3, 1);
   18990:	61 e0       	ldi	r22, 0x01	; 1
   18992:	81 e1       	ldi	r24, 0x11	; 17
   18994:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
	lcd_print_state(idler_state);
   18998:	8c 2f       	mov	r24, r28
   1899a:	0e 94 fc be 	call	0x17df8	; 0x17df8 <lcd_print_state(unsigned char)>
    //  auto-exposure algorithm. When the chip is tracking on a reflective surface, the Shutter is small.
    //  When the chip is tracking on a surface that absorbs IR (or doesn't reflect it), the Shutter is large.
    //  The maximum value of the shutter is 17. The value of 16 seems to be reported as 17 even though the
    //  Brightness value changes correctly as if the shutter changed to 16 (probably some bug with the sensor).
    //  The shutter algorithm tries to keep the B value in the 70-110 range.
    lcd_set_cursor(0, 2);
   1899e:	62 e0       	ldi	r22, 0x02	; 2
   189a0:	80 e0       	ldi	r24, 0x00	; 0
   189a2:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
    lcd_printf_P(_N("B: %3d     Xd:%6d\n"
   189a6:	80 91 39 0e 	lds	r24, 0x0E39	; 0x800e39 <pat9125_y+0x1>
   189aa:	8f 93       	push	r24
   189ac:	80 91 38 0e 	lds	r24, 0x0E38	; 0x800e38 <pat9125_y>
   189b0:	8f 93       	push	r24
   189b2:	80 91 64 0d 	lds	r24, 0x0D64	; 0x800d64 <pat9125_s>
   189b6:	1f 92       	push	r1
   189b8:	8f 93       	push	r24
   189ba:	80 91 8a 03 	lds	r24, 0x038A	; 0x80038a <pat9125_x+0x1>
   189be:	8f 93       	push	r24
   189c0:	80 91 89 03 	lds	r24, 0x0389	; 0x800389 <pat9125_x>
   189c4:	8f 93       	push	r24
   189c6:	80 91 63 0d 	lds	r24, 0x0D63	; 0x800d63 <pat9125_b>
   189ca:	1f 92       	push	r1
   189cc:	8f 93       	push	r24
   189ce:	8c ea       	ldi	r24, 0xAC	; 172
   189d0:	97 e6       	ldi	r25, 0x67	; 103
   189d2:	9f 93       	push	r25
   189d4:	8f 93       	push	r24
   189d6:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>

void lcd_menu_show_sensors_state()                // NOT static due to using inside "Marlin_main" module ("manage_inactivity()")
{
	lcd_timeoutToStatus.stop();
	lcd_show_sensors_state();
	menu_back_if_clicked();
   189da:	8d b7       	in	r24, 0x3d	; 61
   189dc:	9e b7       	in	r25, 0x3e	; 62
   189de:	0a 96       	adiw	r24, 0x0a	; 10
   189e0:	0f b6       	in	r0, 0x3f	; 63
   189e2:	f8 94       	cli
   189e4:	9e bf       	out	0x3e, r25	; 62
   189e6:	0f be       	out	0x3f, r0	; 63
   189e8:	8d bf       	out	0x3d, r24	; 61
}
   189ea:	cf 91       	pop	r28

void lcd_menu_show_sensors_state()                // NOT static due to using inside "Marlin_main" module ("manage_inactivity()")
{
	lcd_timeoutToStatus.stop();
	lcd_show_sensors_state();
	menu_back_if_clicked();
   189ec:	0c 94 06 74 	jmp	0xe80c	; 0xe80c <menu_back_if_clicked()>

000189f0 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>:
}

#endif //FANCHECK

static uint8_t lcd_selftest_screen(TestScreen screen, uint8_t _progress, uint8_t _progress_scale, bool _clear, uint16_t _delay)
{
   189f0:	bf 92       	push	r11
   189f2:	cf 92       	push	r12
   189f4:	df 92       	push	r13
   189f6:	ef 92       	push	r14
   189f8:	ff 92       	push	r15
   189fa:	0f 93       	push	r16
   189fc:	1f 93       	push	r17
   189fe:	cf 93       	push	r28
   18a00:	df 93       	push	r29
   18a02:	c8 2f       	mov	r28, r24
   18a04:	f6 2e       	mov	r15, r22
   18a06:	e4 2e       	mov	r14, r20
   18a08:	b2 2e       	mov	r11, r18
   18a0a:	68 01       	movw	r12, r16

	lcd_update_enable(false);
   18a0c:	80 e0       	ldi	r24, 0x00	; 0
   18a0e:	0e 94 38 70 	call	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>
	const char _indicator = (_progress >= _progress_scale) ? '-' : '|';
   18a12:	dc e7       	ldi	r29, 0x7C	; 124
   18a14:	fe 14       	cp	r15, r14
   18a16:	08 f0       	brcs	.+2      	; 0x18a1a <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x2a>
   18a18:	dd e2       	ldi	r29, 0x2D	; 45
	if (_clear)
   18a1a:	bb 20       	and	r11, r11
   18a1c:	09 f1       	breq	.+66     	; 0x18a60 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x70>
		lcd_clear();
   18a1e:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
	else
		lcd_home();

	if (screen == TestScreen::ExtruderFan) lcd_puts_P(_T(MSG_SELFTEST_FAN));
   18a22:	c1 11       	cpse	r28, r1
   18a24:	20 c0       	rjmp	.+64     	; 0x18a66 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x76>
	if (screen == TestScreen::PrintFan) lcd_puts_P(_T(MSG_SELFTEST_FAN));
	if (screen == TestScreen::FansOk) lcd_puts_P(_T(MSG_SELFTEST_FAN));
   18a26:	8d e6       	ldi	r24, 0x6D	; 109
   18a28:	9d e5       	ldi	r25, 0x5D	; 93
	if (screen == TestScreen::EndStops) lcd_puts_P(_T(MSG_SELFTEST_CHECK_ENDSTOPS));
	if (screen == TestScreen::AxisX) lcd_puts_P(_T(MSG_CHECKING_X));
	if (screen == TestScreen::AxisY) lcd_puts_P(_T(MSG_CHECKING_Y));
	if (screen == TestScreen::AxisZ) lcd_puts_P(_T(MSG_SELFTEST_CHECK_Z));
	if (screen == TestScreen::Bed) lcd_puts_P(_T(MSG_SELFTEST_CHECK_BED));
   18a2a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18a2e:	0e 94 1d 6f 	call	0xde3a	; 0xde3a <lcd_puts_P(char const*)>
	if (screen == TestScreen::Hotend
	    || screen == TestScreen::HotendOk) lcd_puts_P(_T(MSG_SELFTEST_CHECK_HOTEND));
   18a32:	88 ef       	ldi	r24, 0xF8	; 248
   18a34:	8c 0f       	add	r24, r28
	if (screen == TestScreen::EndStops) lcd_puts_P(_T(MSG_SELFTEST_CHECK_ENDSTOPS));
	if (screen == TestScreen::AxisX) lcd_puts_P(_T(MSG_CHECKING_X));
	if (screen == TestScreen::AxisY) lcd_puts_P(_T(MSG_CHECKING_Y));
	if (screen == TestScreen::AxisZ) lcd_puts_P(_T(MSG_SELFTEST_CHECK_Z));
	if (screen == TestScreen::Bed) lcd_puts_P(_T(MSG_SELFTEST_CHECK_BED));
	if (screen == TestScreen::Hotend
   18a36:	82 30       	cpi	r24, 0x02	; 2
   18a38:	78 f5       	brcc	.+94     	; 0x18a98 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0xa8>
	    || screen == TestScreen::HotendOk) lcd_puts_P(_T(MSG_SELFTEST_CHECK_HOTEND));
   18a3a:	8e e6       	ldi	r24, 0x6E	; 110
   18a3c:	9a e4       	ldi	r25, 0x4A	; 74
   18a3e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18a42:	0e 94 1d 6f 	call	0xde3a	; 0xde3a <lcd_puts_P(char const*)>
	if (screen == TestScreen::Fsensor) lcd_puts_P(_T(MSG_SELFTEST_CHECK_FSENSOR));
	if (screen == TestScreen::FsensorOk) lcd_puts_P(_T(MSG_SELFTEST_CHECK_FSENSOR));
	if (screen == TestScreen::AllCorrect) lcd_puts_P(_T(MSG_SELFTEST_CHECK_ALLCORRECT));
   18a46:	8d e4       	ldi	r24, 0x4D	; 77
   18a48:	9a e4       	ldi	r25, 0x4A	; 74
   18a4a:	cc 30       	cpi	r28, 0x0C	; 12
   18a4c:	49 f1       	breq	.+82     	; 0x18aa0 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0xb0>
	if (screen == TestScreen::Failed) lcd_puts_P(_T(MSG_SELFTEST_FAILED));
   18a4e:	8b e3       	ldi	r24, 0x3B	; 59
   18a50:	9a e4       	ldi	r25, 0x4A	; 74
   18a52:	cd 30       	cpi	r28, 0x0D	; 13
   18a54:	29 f1       	breq	.+74     	; 0x18aa0 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0xb0>
	if (screen == TestScreen::Home) lcd_puts_P(_T(MSG_CALIBRATING_HOME));
   18a56:	ce 30       	cpi	r28, 0x0E	; 14
   18a58:	39 f5       	brne	.+78     	; 0x18aa8 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0xb8>
   18a5a:	88 e2       	ldi	r24, 0x28	; 40
   18a5c:	9a e4       	ldi	r25, 0x4A	; 74
   18a5e:	20 c0       	rjmp	.+64     	; 0x18aa0 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0xb0>
	lcd_update_enable(false);
	const char _indicator = (_progress >= _progress_scale) ? '-' : '|';
	if (_clear)
		lcd_clear();
	else
		lcd_home();
   18a60:	0e 94 1f 70 	call	0xe03e	; 0xe03e <lcd_home()>
   18a64:	de cf       	rjmp	.-68     	; 0x18a22 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x32>

	if (screen == TestScreen::ExtruderFan) lcd_puts_P(_T(MSG_SELFTEST_FAN));
	if (screen == TestScreen::PrintFan) lcd_puts_P(_T(MSG_SELFTEST_FAN));
   18a66:	c1 30       	cpi	r28, 0x01	; 1
   18a68:	f1 f2       	breq	.-68     	; 0x18a26 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x36>
	if (screen == TestScreen::FansOk) lcd_puts_P(_T(MSG_SELFTEST_FAN));
   18a6a:	c2 30       	cpi	r28, 0x02	; 2
   18a6c:	e1 f2       	breq	.-72     	; 0x18a26 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x36>
	if (screen == TestScreen::EndStops) lcd_puts_P(_T(MSG_SELFTEST_CHECK_ENDSTOPS));
   18a6e:	85 ec       	ldi	r24, 0xC5	; 197
   18a70:	9a e4       	ldi	r25, 0x4A	; 74
   18a72:	c3 30       	cpi	r28, 0x03	; 3
   18a74:	d1 f2       	breq	.-76     	; 0x18a2a <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x3a>
	if (screen == TestScreen::AxisX) lcd_puts_P(_T(MSG_CHECKING_X));
   18a76:	83 eb       	ldi	r24, 0xB3	; 179
   18a78:	9a e4       	ldi	r25, 0x4A	; 74
   18a7a:	c4 30       	cpi	r28, 0x04	; 4
   18a7c:	b1 f2       	breq	.-84     	; 0x18a2a <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x3a>
	if (screen == TestScreen::AxisY) lcd_puts_P(_T(MSG_CHECKING_Y));
   18a7e:	81 ea       	ldi	r24, 0xA1	; 161
   18a80:	9a e4       	ldi	r25, 0x4A	; 74
   18a82:	c5 30       	cpi	r28, 0x05	; 5
   18a84:	91 f2       	breq	.-92     	; 0x18a2a <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x3a>
	if (screen == TestScreen::AxisZ) lcd_puts_P(_T(MSG_SELFTEST_CHECK_Z));
   18a86:	8f e8       	ldi	r24, 0x8F	; 143
   18a88:	9a e4       	ldi	r25, 0x4A	; 74
   18a8a:	c6 30       	cpi	r28, 0x06	; 6
   18a8c:	71 f2       	breq	.-100    	; 0x18a2a <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x3a>
	if (screen == TestScreen::Bed) lcd_puts_P(_T(MSG_SELFTEST_CHECK_BED));
   18a8e:	c7 30       	cpi	r28, 0x07	; 7
   18a90:	81 f6       	brne	.-96     	; 0x18a32 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x42>
   18a92:	80 e8       	ldi	r24, 0x80	; 128
   18a94:	9a e4       	ldi	r25, 0x4A	; 74
   18a96:	c9 cf       	rjmp	.-110    	; 0x18a2a <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x3a>
	if (screen == TestScreen::Hotend
	    || screen == TestScreen::HotendOk) lcd_puts_P(_T(MSG_SELFTEST_CHECK_HOTEND));
	if (screen == TestScreen::Fsensor) lcd_puts_P(_T(MSG_SELFTEST_CHECK_FSENSOR));
   18a98:	ca 30       	cpi	r28, 0x0A	; 10
   18a9a:	99 f5       	brne	.+102    	; 0x18b02 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x112>
	if (screen == TestScreen::FsensorOk) lcd_puts_P(_T(MSG_SELFTEST_CHECK_FSENSOR));
   18a9c:	8b e5       	ldi	r24, 0x5B	; 91
   18a9e:	9a e4       	ldi	r25, 0x4A	; 74
	if (screen == TestScreen::AllCorrect) lcd_puts_P(_T(MSG_SELFTEST_CHECK_ALLCORRECT));
	if (screen == TestScreen::Failed) lcd_puts_P(_T(MSG_SELFTEST_FAILED));
	if (screen == TestScreen::Home) lcd_puts_P(_T(MSG_CALIBRATING_HOME));
   18aa0:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18aa4:	0e 94 1d 6f 	call	0xde3a	; 0xde3a <lcd_puts_P(char const*)>

	lcd_puts_at_P(0, 1, STR_SEPARATOR);
   18aa8:	41 e0       	ldi	r20, 0x01	; 1
   18aaa:	54 e8       	ldi	r21, 0x84	; 132
   18aac:	61 e0       	ldi	r22, 0x01	; 1
   18aae:	80 e0       	ldi	r24, 0x00	; 0
   18ab0:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
	if ((screen >= TestScreen::ExtruderFan) && (screen <= TestScreen::FansOk))
   18ab4:	c3 30       	cpi	r28, 0x03	; 3
   18ab6:	70 f5       	brcc	.+92     	; 0x18b14 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x124>
	{
		//SERIAL_ECHOLNPGM("Fan test");
		lcd_puts_at_P(0, 2, _T(MSG_HOTEND_FAN_SPEED));
   18ab8:	8a e1       	ldi	r24, 0x1A	; 26
   18aba:	9a e4       	ldi	r25, 0x4A	; 74
   18abc:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18ac0:	ac 01       	movw	r20, r24
   18ac2:	62 e0       	ldi	r22, 0x02	; 2
   18ac4:	80 e0       	ldi	r24, 0x00	; 0
   18ac6:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
		lcd_set_cursor(18, 2);
   18aca:	62 e0       	ldi	r22, 0x02	; 2
   18acc:	82 e1       	ldi	r24, 0x12	; 18
   18ace:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
		(screen < TestScreen::PrintFan) ? (void)lcd_putc(_indicator) : (void)lcd_puts_P(MSG_OK_CAPS);
   18ad2:	c1 11       	cpse	r28, r1
   18ad4:	1a c0       	rjmp	.+52     	; 0x18b0a <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x11a>
   18ad6:	8d 2f       	mov	r24, r29
   18ad8:	0e 94 21 6f 	call	0xde42	; 0xde42 <lcd_putc(char)>
		lcd_puts_at_P(0, 3, _T(MSG_PRINT_FAN_SPEED));
   18adc:	8d e0       	ldi	r24, 0x0D	; 13
   18ade:	9a e4       	ldi	r25, 0x4A	; 74
   18ae0:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18ae4:	ac 01       	movw	r20, r24
   18ae6:	63 e0       	ldi	r22, 0x03	; 3
   18ae8:	80 e0       	ldi	r24, 0x00	; 0
   18aea:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
		lcd_set_cursor(18, 3);
   18aee:	63 e0       	ldi	r22, 0x03	; 3
   18af0:	82 e1       	ldi	r24, 0x12	; 18
   18af2:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
		(screen < TestScreen::FansOk) ? (void)lcd_putc(_indicator) : (void)lcd_puts_P(MSG_OK_CAPS);
   18af6:	c2 30       	cpi	r28, 0x02	; 2
   18af8:	19 f1       	breq	.+70     	; 0x18b40 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x150>
	else if (screen >= TestScreen::Fsensor && screen <= TestScreen::FsensorOk)
	{
		lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_FILAMENT_SENSOR));
		lcd_putc(':');
		lcd_set_cursor(18, 2);
		(screen == TestScreen::Fsensor) ? (void)lcd_putc(_indicator) : (void)lcd_puts_P(MSG_OK_CAPS);
   18afa:	8d 2f       	mov	r24, r29
   18afc:	0e 94 21 6f 	call	0xde42	; 0xde42 <lcd_putc(char)>
   18b00:	23 c0       	rjmp	.+70     	; 0x18b48 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x158>
	if (screen == TestScreen::AxisZ) lcd_puts_P(_T(MSG_SELFTEST_CHECK_Z));
	if (screen == TestScreen::Bed) lcd_puts_P(_T(MSG_SELFTEST_CHECK_BED));
	if (screen == TestScreen::Hotend
	    || screen == TestScreen::HotendOk) lcd_puts_P(_T(MSG_SELFTEST_CHECK_HOTEND));
	if (screen == TestScreen::Fsensor) lcd_puts_P(_T(MSG_SELFTEST_CHECK_FSENSOR));
	if (screen == TestScreen::FsensorOk) lcd_puts_P(_T(MSG_SELFTEST_CHECK_FSENSOR));
   18b02:	cb 30       	cpi	r28, 0x0B	; 11
   18b04:	09 f0       	breq	.+2      	; 0x18b08 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x118>
   18b06:	9f cf       	rjmp	.-194    	; 0x18a46 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x56>
   18b08:	c9 cf       	rjmp	.-110    	; 0x18a9c <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0xac>
	if ((screen >= TestScreen::ExtruderFan) && (screen <= TestScreen::FansOk))
	{
		//SERIAL_ECHOLNPGM("Fan test");
		lcd_puts_at_P(0, 2, _T(MSG_HOTEND_FAN_SPEED));
		lcd_set_cursor(18, 2);
		(screen < TestScreen::PrintFan) ? (void)lcd_putc(_indicator) : (void)lcd_puts_P(MSG_OK_CAPS);
   18b0a:	82 e9       	ldi	r24, 0x92	; 146
   18b0c:	98 e6       	ldi	r25, 0x68	; 104
   18b0e:	0e 94 1d 6f 	call	0xde3a	; 0xde3a <lcd_puts_P(char const*)>
   18b12:	e4 cf       	rjmp	.-56     	; 0x18adc <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0xec>
		lcd_puts_at_P(0, 3, _T(MSG_PRINT_FAN_SPEED));
		lcd_set_cursor(18, 3);
		(screen < TestScreen::FansOk) ? (void)lcd_putc(_indicator) : (void)lcd_puts_P(MSG_OK_CAPS);
	}
	else if (screen >= TestScreen::Fsensor && screen <= TestScreen::FsensorOk)
   18b14:	86 ef       	ldi	r24, 0xF6	; 246
   18b16:	8c 0f       	add	r24, r28
   18b18:	82 30       	cpi	r24, 0x02	; 2
   18b1a:	a8 f5       	brcc	.+106    	; 0x18b86 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x196>
	{
		lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_FILAMENT_SENSOR));
   18b1c:	8b ef       	ldi	r24, 0xFB	; 251
   18b1e:	99 e4       	ldi	r25, 0x49	; 73
   18b20:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18b24:	ac 01       	movw	r20, r24
   18b26:	62 e0       	ldi	r22, 0x02	; 2
   18b28:	80 e0       	ldi	r24, 0x00	; 0
   18b2a:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
		lcd_putc(':');
   18b2e:	8a e3       	ldi	r24, 0x3A	; 58
   18b30:	0e 94 21 6f 	call	0xde42	; 0xde42 <lcd_putc(char)>
		lcd_set_cursor(18, 2);
   18b34:	62 e0       	ldi	r22, 0x02	; 2
   18b36:	82 e1       	ldi	r24, 0x12	; 18
   18b38:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
		(screen == TestScreen::Fsensor) ? (void)lcd_putc(_indicator) : (void)lcd_puts_P(MSG_OK_CAPS);
   18b3c:	ca 30       	cpi	r28, 0x0A	; 10
   18b3e:	e9 f2       	breq	.-70     	; 0x18afa <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x10a>
		lcd_puts_at_P(0, 2, _T(MSG_HOTEND_FAN_SPEED));
		lcd_set_cursor(18, 2);
		(screen < TestScreen::PrintFan) ? (void)lcd_putc(_indicator) : (void)lcd_puts_P(MSG_OK_CAPS);
		lcd_puts_at_P(0, 3, _T(MSG_PRINT_FAN_SPEED));
		lcd_set_cursor(18, 3);
		(screen < TestScreen::FansOk) ? (void)lcd_putc(_indicator) : (void)lcd_puts_P(MSG_OK_CAPS);
   18b40:	82 e9       	ldi	r24, 0x92	; 146
   18b42:	98 e6       	ldi	r25, 0x68	; 104
   18b44:	0e 94 1d 6f 	call	0xde3a	; 0xde3a <lcd_puts_P(char const*)>

		_step_block = TestScreen::Hotend;
		lcd_selftest_screen_step(3, 9, ((screen == _step_block) ? 1 : (screen < _step_block) ? 0 : 2), PSTR("Hotend"), _indicator);
	}

	if (_delay > 0) delay_keep_alive(_delay);
   18b48:	c1 14       	cp	r12, r1
   18b4a:	d1 04       	cpc	r13, r1
   18b4c:	19 f0       	breq	.+6      	; 0x18b54 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x164>
   18b4e:	c6 01       	movw	r24, r12
   18b50:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
	_progress++;
   18b54:	81 e0       	ldi	r24, 0x01	; 1
   18b56:	8f 0d       	add	r24, r15

	return (_progress >= _progress_scale * 2) ? 0 : _progress;
   18b58:	48 2f       	mov	r20, r24
   18b5a:	50 e0       	ldi	r21, 0x00	; 0
   18b5c:	92 e0       	ldi	r25, 0x02	; 2
   18b5e:	24 e0       	ldi	r18, 0x04	; 4
   18b60:	30 e0       	ldi	r19, 0x00	; 0
   18b62:	e9 16       	cp	r14, r25
   18b64:	11 f0       	breq	.+4      	; 0x18b6a <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x17a>
   18b66:	26 e0       	ldi	r18, 0x06	; 6
   18b68:	30 e0       	ldi	r19, 0x00	; 0
   18b6a:	42 17       	cp	r20, r18
   18b6c:	53 07       	cpc	r21, r19
   18b6e:	0c f0       	brlt	.+2      	; 0x18b72 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x182>
   18b70:	80 e0       	ldi	r24, 0x00	; 0
}
   18b72:	df 91       	pop	r29
   18b74:	cf 91       	pop	r28
   18b76:	1f 91       	pop	r17
   18b78:	0f 91       	pop	r16
   18b7a:	ff 90       	pop	r15
   18b7c:	ef 90       	pop	r14
   18b7e:	df 90       	pop	r13
   18b80:	cf 90       	pop	r12
   18b82:	bf 90       	pop	r11
   18b84:	08 95       	ret
		lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_FILAMENT_SENSOR));
		lcd_putc(':');
		lcd_set_cursor(18, 2);
		(screen == TestScreen::Fsensor) ? (void)lcd_putc(_indicator) : (void)lcd_puts_P(MSG_OK_CAPS);
	}
	else if (screen < TestScreen::Fsensor)
   18b86:	ca 30       	cpi	r28, 0x0A	; 10
   18b88:	f8 f6       	brcc	.-66     	; 0x18b48 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x158>
	{
		//SERIAL_ECHOLNPGM("Other tests");

		TestScreen _step_block = TestScreen::AxisX;
		lcd_selftest_screen_step(2, 2, ((screen == _step_block) ? 1 : (screen < _step_block) ? 0 : 2), PSTR("X"), _indicator);
   18b8a:	41 e0       	ldi	r20, 0x01	; 1
   18b8c:	c4 30       	cpi	r28, 0x04	; 4
   18b8e:	21 f0       	breq	.+8      	; 0x18b98 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x1a8>
   18b90:	42 e0       	ldi	r20, 0x02	; 2
   18b92:	c3 30       	cpi	r28, 0x03	; 3
   18b94:	09 f4       	brne	.+2      	; 0x18b98 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x1a8>
   18b96:	40 e0       	ldi	r20, 0x00	; 0
   18b98:	0d 2f       	mov	r16, r29
   18b9a:	2f ef       	ldi	r18, 0xFF	; 255
   18b9c:	33 e8       	ldi	r19, 0x83	; 131
   18b9e:	62 e0       	ldi	r22, 0x02	; 2
   18ba0:	82 e0       	ldi	r24, 0x02	; 2
   18ba2:	0e 94 d0 be 	call	0x17da0	; 0x17da0 <lcd_selftest_screen_step(unsigned char, unsigned char, unsigned char, char const*, char)>

		_step_block = TestScreen::AxisY;
		lcd_selftest_screen_step(2, 8, ((screen == _step_block) ? 1 : (screen < _step_block) ? 0 : 2), PSTR("Y"), _indicator);
   18ba6:	41 e0       	ldi	r20, 0x01	; 1
   18ba8:	c5 30       	cpi	r28, 0x05	; 5
   18baa:	21 f0       	breq	.+8      	; 0x18bb4 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x1c4>
   18bac:	42 e0       	ldi	r20, 0x02	; 2
   18bae:	c5 30       	cpi	r28, 0x05	; 5
   18bb0:	08 f4       	brcc	.+2      	; 0x18bb4 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x1c4>
   18bb2:	40 e0       	ldi	r20, 0x00	; 0
   18bb4:	0d 2f       	mov	r16, r29
   18bb6:	2d ef       	ldi	r18, 0xFD	; 253
   18bb8:	33 e8       	ldi	r19, 0x83	; 131
   18bba:	68 e0       	ldi	r22, 0x08	; 8
   18bbc:	82 e0       	ldi	r24, 0x02	; 2
   18bbe:	0e 94 d0 be 	call	0x17da0	; 0x17da0 <lcd_selftest_screen_step(unsigned char, unsigned char, unsigned char, char const*, char)>

		_step_block = TestScreen::AxisZ;
		lcd_selftest_screen_step(2, 14, ((screen == _step_block) ? 1 : (screen < _step_block) ? 0 : 2), PSTR("Z"), _indicator);
   18bc2:	41 e0       	ldi	r20, 0x01	; 1
   18bc4:	c6 30       	cpi	r28, 0x06	; 6
   18bc6:	21 f0       	breq	.+8      	; 0x18bd0 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x1e0>
   18bc8:	42 e0       	ldi	r20, 0x02	; 2
   18bca:	c6 30       	cpi	r28, 0x06	; 6
   18bcc:	08 f4       	brcc	.+2      	; 0x18bd0 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x1e0>
   18bce:	40 e0       	ldi	r20, 0x00	; 0
   18bd0:	0d 2f       	mov	r16, r29
   18bd2:	2b ef       	ldi	r18, 0xFB	; 251
   18bd4:	33 e8       	ldi	r19, 0x83	; 131
   18bd6:	6e e0       	ldi	r22, 0x0E	; 14
   18bd8:	82 e0       	ldi	r24, 0x02	; 2
   18bda:	0e 94 d0 be 	call	0x17da0	; 0x17da0 <lcd_selftest_screen_step(unsigned char, unsigned char, unsigned char, char const*, char)>

		_step_block = TestScreen::Bed;
		lcd_selftest_screen_step(3, 0, ((screen == _step_block) ? 1 : (screen < _step_block) ? 0 : 2), PSTR("Bed"), _indicator);
   18bde:	41 e0       	ldi	r20, 0x01	; 1
   18be0:	c7 30       	cpi	r28, 0x07	; 7
   18be2:	21 f0       	breq	.+8      	; 0x18bec <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x1fc>
   18be4:	42 e0       	ldi	r20, 0x02	; 2
   18be6:	c7 30       	cpi	r28, 0x07	; 7
   18be8:	08 f4       	brcc	.+2      	; 0x18bec <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x1fc>
   18bea:	40 e0       	ldi	r20, 0x00	; 0
   18bec:	0d 2f       	mov	r16, r29
   18bee:	27 ef       	ldi	r18, 0xF7	; 247
   18bf0:	33 e8       	ldi	r19, 0x83	; 131
   18bf2:	60 e0       	ldi	r22, 0x00	; 0
   18bf4:	83 e0       	ldi	r24, 0x03	; 3
   18bf6:	0e 94 d0 be 	call	0x17da0	; 0x17da0 <lcd_selftest_screen_step(unsigned char, unsigned char, unsigned char, char const*, char)>

		_step_block = TestScreen::Hotend;
		lcd_selftest_screen_step(3, 9, ((screen == _step_block) ? 1 : (screen < _step_block) ? 0 : 2), PSTR("Hotend"), _indicator);
   18bfa:	41 e0       	ldi	r20, 0x01	; 1
   18bfc:	c8 30       	cpi	r28, 0x08	; 8
   18bfe:	21 f0       	breq	.+8      	; 0x18c08 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x218>
   18c00:	42 e0       	ldi	r20, 0x02	; 2
   18c02:	c8 30       	cpi	r28, 0x08	; 8
   18c04:	08 f4       	brcc	.+2      	; 0x18c08 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x218>
   18c06:	40 e0       	ldi	r20, 0x00	; 0
   18c08:	0d 2f       	mov	r16, r29
   18c0a:	20 ef       	ldi	r18, 0xF0	; 240
   18c0c:	33 e8       	ldi	r19, 0x83	; 131
   18c0e:	69 e0       	ldi	r22, 0x09	; 9
   18c10:	83 e0       	ldi	r24, 0x03	; 3
   18c12:	0e 94 d0 be 	call	0x17da0	; 0x17da0 <lcd_selftest_screen_step(unsigned char, unsigned char, unsigned char, char const*, char)>
   18c16:	98 cf       	rjmp	.-208    	; 0x18b48 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)+0x158>

00018c18 <lcd_rename_sheet_menu()>:
{
    printf_P(MSG_HOST_ACTION_NOTIFICATION, message);
}

static void lcd_rename_sheet_menu()
{
   18c18:	cf 93       	push	r28
   18c1a:	df 93       	push	r29
        unsigned char name[sizeof(Sheet::name)];
    };
    static_assert(sizeof(menu_data)>= sizeof(MenuData),"MenuData doesn't fit into menu_data");
    MenuData* menuData = (MenuData*)&(menu_data[0]);

    if (!menuData->initialized)
   18c1c:	80 91 96 03 	lds	r24, 0x0396	; 0x800396 <menu_data>
   18c20:	81 11       	cpse	r24, r1
   18c22:	18 c0       	rjmp	.+48     	; 0x18c54 <lcd_rename_sheet_menu()+0x3c>
    {
        eeprom_read_block(menuData->name, EEPROM_Sheets_base->s[selected_sheet].name, sizeof(Sheet::name));
   18c24:	60 91 ca 03 	lds	r22, 0x03CA	; 0x8003ca <selected_sheet>
   18c28:	8b e0       	ldi	r24, 0x0B	; 11
   18c2a:	68 9f       	mul	r22, r24
   18c2c:	b0 01       	movw	r22, r0
   18c2e:	11 24       	eor	r1, r1
   18c30:	67 5b       	subi	r22, 0xB7	; 183
   18c32:	72 4f       	sbci	r23, 0xF2	; 242
   18c34:	47 e0       	ldi	r20, 0x07	; 7
   18c36:	50 e0       	ldi	r21, 0x00	; 0
   18c38:	88 e9       	ldi	r24, 0x98	; 152
   18c3a:	93 e0       	ldi	r25, 0x03	; 3
   18c3c:	0f 94 d0 a3 	call	0x347a0	; 0x347a0 <eeprom_read_block>
        lcd_encoder = menuData->name[0];
   18c40:	80 91 98 03 	lds	r24, 0x0398	; 0x800398 <menu_data+0x2>
   18c44:	90 e0       	ldi	r25, 0x00	; 0
   18c46:	90 93 1f 06 	sts	0x061F, r25	; 0x80061f <lcd_encoder+0x1>
   18c4a:	80 93 1e 06 	sts	0x061E, r24	; 0x80061e <lcd_encoder>
        menuData->initialized = true;
   18c4e:	81 e0       	ldi	r24, 0x01	; 1
   18c50:	80 93 96 03 	sts	0x0396, r24	; 0x800396 <menu_data>
    }
    if (lcd_encoder < 0x20) lcd_encoder = 0x20;
   18c54:	80 91 1e 06 	lds	r24, 0x061E	; 0x80061e <lcd_encoder>
   18c58:	90 91 1f 06 	lds	r25, 0x061F	; 0x80061f <lcd_encoder+0x1>
   18c5c:	80 97       	sbiw	r24, 0x20	; 32
   18c5e:	34 f4       	brge	.+12     	; 0x18c6c <lcd_rename_sheet_menu()+0x54>
   18c60:	80 e2       	ldi	r24, 0x20	; 32
   18c62:	90 e0       	ldi	r25, 0x00	; 0
   18c64:	90 93 1f 06 	sts	0x061F, r25	; 0x80061f <lcd_encoder+0x1>
   18c68:	80 93 1e 06 	sts	0x061E, r24	; 0x80061e <lcd_encoder>
    if (lcd_encoder > 0xFF) lcd_encoder = 0xFF;
   18c6c:	80 91 1e 06 	lds	r24, 0x061E	; 0x80061e <lcd_encoder>
   18c70:	90 91 1f 06 	lds	r25, 0x061F	; 0x80061f <lcd_encoder+0x1>
   18c74:	8f 3f       	cpi	r24, 0xFF	; 255
   18c76:	91 05       	cpc	r25, r1
   18c78:	39 f0       	breq	.+14     	; 0x18c88 <lcd_rename_sheet_menu()+0x70>
   18c7a:	34 f0       	brlt	.+12     	; 0x18c88 <lcd_rename_sheet_menu()+0x70>
   18c7c:	8f ef       	ldi	r24, 0xFF	; 255
   18c7e:	90 e0       	ldi	r25, 0x00	; 0
   18c80:	90 93 1f 06 	sts	0x061F, r25	; 0x80061f <lcd_encoder+0x1>
   18c84:	80 93 1e 06 	sts	0x061E, r24	; 0x80061e <lcd_encoder>

    menuData->name[menuData->selected] = lcd_encoder;
   18c88:	e0 91 97 03 	lds	r30, 0x0397	; 0x800397 <menu_data+0x1>
   18c8c:	f0 e0       	ldi	r31, 0x00	; 0
   18c8e:	ea 56       	subi	r30, 0x6A	; 106
   18c90:	fc 4f       	sbci	r31, 0xFC	; 252
   18c92:	80 91 1e 06 	lds	r24, 0x061E	; 0x80061e <lcd_encoder>
   18c96:	82 83       	std	Z+2, r24	; 0x02
    lcd_home();
   18c98:	0e 94 1f 70 	call	0xe03e	; 0xe03e <lcd_home()>
   18c9c:	c8 e9       	ldi	r28, 0x98	; 152
   18c9e:	d3 e0       	ldi	r29, 0x03	; 3
    for (uint_least8_t i = 0; i < sizeof(Sheet::name); ++i)
    {
        lcd_putc(menuData->name[i]);
   18ca0:	89 91       	ld	r24, Y+
   18ca2:	0e 94 21 6f 	call	0xde42	; 0xde42 <lcd_putc(char)>
    if (lcd_encoder < 0x20) lcd_encoder = 0x20;
    if (lcd_encoder > 0xFF) lcd_encoder = 0xFF;

    menuData->name[menuData->selected] = lcd_encoder;
    lcd_home();
    for (uint_least8_t i = 0; i < sizeof(Sheet::name); ++i)
   18ca6:	83 e0       	ldi	r24, 0x03	; 3
   18ca8:	cf 39       	cpi	r28, 0x9F	; 159
   18caa:	d8 07       	cpc	r29, r24
   18cac:	c9 f7       	brne	.-14     	; 0x18ca0 <lcd_rename_sheet_menu()+0x88>
    {
        lcd_putc(menuData->name[i]);
    }
    lcd_putc_at(menuData->selected, 1, '^');
   18cae:	4e e5       	ldi	r20, 0x5E	; 94
   18cb0:	61 e0       	ldi	r22, 0x01	; 1
   18cb2:	80 91 97 03 	lds	r24, 0x0397	; 0x800397 <menu_data+0x1>
   18cb6:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
    if (menuData->selected > 0)
   18cba:	80 91 97 03 	lds	r24, 0x0397	; 0x800397 <menu_data+0x1>
   18cbe:	88 23       	and	r24, r24
   18cc0:	29 f0       	breq	.+10     	; 0x18ccc <lcd_rename_sheet_menu()+0xb4>
    {
        lcd_putc_at(menuData->selected-1, 1, ' ');
   18cc2:	40 e2       	ldi	r20, 0x20	; 32
   18cc4:	61 e0       	ldi	r22, 0x01	; 1
   18cc6:	81 50       	subi	r24, 0x01	; 1
   18cc8:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
    }
    if (lcd_clicked())
   18ccc:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   18cd0:	88 23       	and	r24, r24
   18cd2:	99 f0       	breq	.+38     	; 0x18cfa <lcd_rename_sheet_menu()+0xe2>
    {
        if ((menuData->selected + 1u) < sizeof(Sheet::name))
   18cd4:	e0 91 97 03 	lds	r30, 0x0397	; 0x800397 <menu_data+0x1>
   18cd8:	8e 2f       	mov	r24, r30
   18cda:	90 e0       	ldi	r25, 0x00	; 0
   18cdc:	01 96       	adiw	r24, 0x01	; 1
   18cde:	07 97       	sbiw	r24, 0x07	; 7
   18ce0:	78 f4       	brcc	.+30     	; 0x18d00 <lcd_rename_sheet_menu()+0xe8>
        {
            lcd_encoder = menuData->name[++(menuData->selected)];
   18ce2:	ef 5f       	subi	r30, 0xFF	; 255
   18ce4:	e0 93 97 03 	sts	0x0397, r30	; 0x800397 <menu_data+0x1>
   18ce8:	f0 e0       	ldi	r31, 0x00	; 0
   18cea:	ea 56       	subi	r30, 0x6A	; 106
   18cec:	fc 4f       	sbci	r31, 0xFC	; 252
   18cee:	82 81       	ldd	r24, Z+2	; 0x02
   18cf0:	90 e0       	ldi	r25, 0x00	; 0
   18cf2:	90 93 1f 06 	sts	0x061F, r25	; 0x80061f <lcd_encoder+0x1>
   18cf6:	80 93 1e 06 	sts	0x061E, r24	; 0x80061e <lcd_encoder>
                EEPROM_Sheets_base->s[selected_sheet].name,
                sizeof(Sheet::name));
            menu_back();
        }
    }
}
   18cfa:	df 91       	pop	r29
   18cfc:	cf 91       	pop	r28
   18cfe:	08 95       	ret
        {
            lcd_encoder = menuData->name[++(menuData->selected)];
        }
        else
        {
            eeprom_update_block_notify(menuData->name,
   18d00:	60 91 ca 03 	lds	r22, 0x03CA	; 0x8003ca <selected_sheet>
   18d04:	8b e0       	ldi	r24, 0x0B	; 11
   18d06:	68 9f       	mul	r22, r24
   18d08:	b0 01       	movw	r22, r0
   18d0a:	11 24       	eor	r1, r1
   18d0c:	67 5b       	subi	r22, 0xB7	; 183
   18d0e:	72 4f       	sbci	r23, 0xF2	; 242
#endif //DEBUG_EEPROM_CHANGES
}

#ifndef DEBUG_EEPROM_CHANGES
void eeprom_update_block_notify(const void *__src, void *__dst, size_t __n){
    eeprom_update_block(__src, __dst, __n);
   18d10:	47 e0       	ldi	r20, 0x07	; 7
   18d12:	50 e0       	ldi	r21, 0x00	; 0
   18d14:	88 e9       	ldi	r24, 0x98	; 152
   18d16:	93 e0       	ldi	r25, 0x03	; 3
   18d18:	0f 94 f4 a3 	call	0x347e8	; 0x347e8 <eeprom_update_block>
                EEPROM_Sheets_base->s[selected_sheet].name,
                sizeof(Sheet::name));
            menu_back();
        }
    }
}
   18d1c:	df 91       	pop	r29
   18d1e:	cf 91       	pop	r28
        else
        {
            eeprom_update_block_notify(menuData->name,
                EEPROM_Sheets_base->s[selected_sheet].name,
                sizeof(Sheet::name));
            menu_back();
   18d20:	0c 94 1b 63 	jmp	0xc636	; 0xc636 <menu_back()>

00018d24 <lcd_menu_xyz_y_min() [clone .lto_priv.418]>:
//! |Right:       00.00mm|	MSG_RIGHT c=10, c=8
//! ----------------------
//! @endcode
//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
static void lcd_menu_xyz_y_min()
{
   18d24:	2f 92       	push	r2
   18d26:	3f 92       	push	r3
   18d28:	4f 92       	push	r4
   18d2a:	5f 92       	push	r5
   18d2c:	6f 92       	push	r6
   18d2e:	7f 92       	push	r7
   18d30:	8f 92       	push	r8
   18d32:	9f 92       	push	r9
   18d34:	af 92       	push	r10
   18d36:	bf 92       	push	r11
   18d38:	cf 92       	push	r12
   18d3a:	df 92       	push	r13
   18d3c:	ef 92       	push	r14
   18d3e:	ff 92       	push	r15
   18d40:	0f 93       	push	r16
   18d42:	1f 93       	push	r17
   18d44:	cf 93       	push	r28
   18d46:	df 93       	push	r29
   18d48:	cd b7       	in	r28, 0x3d	; 61
   18d4a:	de b7       	in	r29, 0x3e	; 62
   18d4c:	a8 97       	sbiw	r28, 0x28	; 40
   18d4e:	0f b6       	in	r0, 0x3f	; 63
   18d50:	f8 94       	cli
   18d52:	de bf       	out	0x3e, r29	; 62
   18d54:	0f be       	out	0x3f, r0	; 63
   18d56:	cd bf       	out	0x3d, r28	; 61

void count_xyz_details(float (&distanceMin)[2]) {
	float cntr[2];
	float vec_x[2];
	float vec_y[2];
	eeprom_read_block(&cntr[0], (float*)(EEPROM_BED_CALIBRATION_CENTER), 8);
   18d58:	48 e0       	ldi	r20, 0x08	; 8
   18d5a:	50 e0       	ldi	r21, 0x00	; 0
   18d5c:	65 ee       	ldi	r22, 0xE5	; 229
   18d5e:	7f e0       	ldi	r23, 0x0F	; 15
   18d60:	ce 01       	movw	r24, r28
   18d62:	41 96       	adiw	r24, 0x11	; 17
   18d64:	0f 94 d0 a3 	call	0x347a0	; 0x347a0 <eeprom_read_block>
	eeprom_read_block(&vec_x[0], (float*)(EEPROM_BED_CALIBRATION_VEC_X), 8);
   18d68:	48 e0       	ldi	r20, 0x08	; 8
   18d6a:	50 e0       	ldi	r21, 0x00	; 0
   18d6c:	6d ed       	ldi	r22, 0xDD	; 221
   18d6e:	7f e0       	ldi	r23, 0x0F	; 15
   18d70:	ce 01       	movw	r24, r28
   18d72:	09 96       	adiw	r24, 0x09	; 9
   18d74:	0f 94 d0 a3 	call	0x347a0	; 0x347a0 <eeprom_read_block>
	eeprom_read_block(&vec_y[0], (float*)(EEPROM_BED_CALIBRATION_VEC_Y), 8);
   18d78:	48 e0       	ldi	r20, 0x08	; 8
   18d7a:	50 e0       	ldi	r21, 0x00	; 0
   18d7c:	65 ed       	ldi	r22, 0xD5	; 213
   18d7e:	7f e0       	ldi	r23, 0x0F	; 15
   18d80:	ce 01       	movw	r24, r28
   18d82:	01 96       	adiw	r24, 0x01	; 1
   18d84:	0f 94 d0 a3 	call	0x347a0	; 0x347a0 <eeprom_read_block>

	for (uint8_t mesh_point = 0; mesh_point < 2; ++mesh_point) {
		float y = vec_x[1] * pgm_read_float(bed_ref_points_4 + mesh_point * 2) + vec_y[1] * pgm_read_float(bed_ref_points_4 + mesh_point * 2 + 1) + cntr[1];
   18d88:	8d 84       	ldd	r8, Y+13	; 0x0d
   18d8a:	9e 84       	ldd	r9, Y+14	; 0x0e
   18d8c:	af 84       	ldd	r10, Y+15	; 0x0f
   18d8e:	b8 88       	ldd	r11, Y+16	; 0x10
   18d90:	e0 e0       	ldi	r30, 0x00	; 0
   18d92:	fc e9       	ldi	r31, 0x9C	; 156
   18d94:	25 91       	lpm	r18, Z+
   18d96:	35 91       	lpm	r19, Z+
   18d98:	45 91       	lpm	r20, Z+
   18d9a:	54 91       	lpm	r21, Z
   18d9c:	cd 80       	ldd	r12, Y+5	; 0x05
   18d9e:	de 80       	ldd	r13, Y+6	; 0x06
   18da0:	ef 80       	ldd	r14, Y+7	; 0x07
   18da2:	f8 84       	ldd	r15, Y+8	; 0x08
   18da4:	e4 e0       	ldi	r30, 0x04	; 4
   18da6:	fc e9       	ldi	r31, 0x9C	; 156
   18da8:	85 91       	lpm	r24, Z+
   18daa:	95 91       	lpm	r25, Z+
   18dac:	a5 91       	lpm	r26, Z+
   18dae:	b4 91       	lpm	r27, Z
   18db0:	8d a3       	std	Y+37, r24	; 0x25
   18db2:	9e a3       	std	Y+38, r25	; 0x26
   18db4:	af a3       	std	Y+39, r26	; 0x27
   18db6:	b8 a7       	std	Y+40, r27	; 0x28
   18db8:	8d 89       	ldd	r24, Y+21	; 0x15
   18dba:	9e 89       	ldd	r25, Y+22	; 0x16
   18dbc:	af 89       	ldd	r26, Y+23	; 0x17
   18dbe:	b8 8d       	ldd	r27, Y+24	; 0x18
   18dc0:	89 a3       	std	Y+33, r24	; 0x21
   18dc2:	9a a3       	std	Y+34, r25	; 0x22
   18dc4:	ab a3       	std	Y+35, r26	; 0x23
   18dc6:	bc a3       	std	Y+36, r27	; 0x24
   18dc8:	c5 01       	movw	r24, r10
   18dca:	b4 01       	movw	r22, r8
   18dcc:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   18dd0:	2b 01       	movw	r4, r22
   18dd2:	3c 01       	movw	r6, r24
   18dd4:	2d a1       	ldd	r18, Y+37	; 0x25
   18dd6:	3e a1       	ldd	r19, Y+38	; 0x26
   18dd8:	4f a1       	ldd	r20, Y+39	; 0x27
   18dda:	58 a5       	ldd	r21, Y+40	; 0x28
   18ddc:	c7 01       	movw	r24, r14
   18dde:	b6 01       	movw	r22, r12
   18de0:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   18de4:	9b 01       	movw	r18, r22
   18de6:	ac 01       	movw	r20, r24
   18de8:	c3 01       	movw	r24, r6
   18dea:	b2 01       	movw	r22, r4
   18dec:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   18df0:	29 a1       	ldd	r18, Y+33	; 0x21
   18df2:	3a a1       	ldd	r19, Y+34	; 0x22
   18df4:	4b a1       	ldd	r20, Y+35	; 0x23
   18df6:	5c a1       	ldd	r21, Y+36	; 0x24
   18df8:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
		distanceMin[mesh_point] = (y - Y_MIN_POS_CALIBRATION_POINT_OUT_OF_REACH);
   18dfc:	20 e0       	ldi	r18, 0x00	; 0
   18dfe:	30 e0       	ldi	r19, 0x00	; 0
   18e00:	40 e9       	ldi	r20, 0x90	; 144
   18e02:	50 e4       	ldi	r21, 0x40	; 64
   18e04:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   18e08:	1b 01       	movw	r2, r22
   18e0a:	8c 01       	movw	r16, r24
	eeprom_read_block(&cntr[0], (float*)(EEPROM_BED_CALIBRATION_CENTER), 8);
	eeprom_read_block(&vec_x[0], (float*)(EEPROM_BED_CALIBRATION_VEC_X), 8);
	eeprom_read_block(&vec_y[0], (float*)(EEPROM_BED_CALIBRATION_VEC_Y), 8);

	for (uint8_t mesh_point = 0; mesh_point < 2; ++mesh_point) {
		float y = vec_x[1] * pgm_read_float(bed_ref_points_4 + mesh_point * 2) + vec_y[1] * pgm_read_float(bed_ref_points_4 + mesh_point * 2 + 1) + cntr[1];
   18e0c:	e8 e0       	ldi	r30, 0x08	; 8
   18e0e:	fc e9       	ldi	r31, 0x9C	; 156
   18e10:	25 91       	lpm	r18, Z+
   18e12:	35 91       	lpm	r19, Z+
   18e14:	45 91       	lpm	r20, Z+
   18e16:	54 91       	lpm	r21, Z
   18e18:	ec e0       	ldi	r30, 0x0C	; 12
   18e1a:	fc e9       	ldi	r31, 0x9C	; 156
   18e1c:	45 90       	lpm	r4, Z+
   18e1e:	55 90       	lpm	r5, Z+
   18e20:	65 90       	lpm	r6, Z+
   18e22:	74 90       	lpm	r7, Z
   18e24:	c5 01       	movw	r24, r10
   18e26:	b4 01       	movw	r22, r8
   18e28:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   18e2c:	4b 01       	movw	r8, r22
   18e2e:	5c 01       	movw	r10, r24
   18e30:	a3 01       	movw	r20, r6
   18e32:	92 01       	movw	r18, r4
   18e34:	c7 01       	movw	r24, r14
   18e36:	b6 01       	movw	r22, r12
   18e38:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   18e3c:	9b 01       	movw	r18, r22
   18e3e:	ac 01       	movw	r20, r24
   18e40:	c5 01       	movw	r24, r10
   18e42:	b4 01       	movw	r22, r8
   18e44:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   18e48:	29 a1       	ldd	r18, Y+33	; 0x21
   18e4a:	3a a1       	ldd	r19, Y+34	; 0x22
   18e4c:	4b a1       	ldd	r20, Y+35	; 0x23
   18e4e:	5c a1       	ldd	r21, Y+36	; 0x24
   18e50:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
		distanceMin[mesh_point] = (y - Y_MIN_POS_CALIBRATION_POINT_OUT_OF_REACH);
   18e54:	20 e0       	ldi	r18, 0x00	; 0
   18e56:	30 e0       	ldi	r19, 0x00	; 0
   18e58:	40 e9       	ldi	r20, 0x90	; 144
   18e5a:	50 e4       	ldi	r21, 0x40	; 64
   18e5c:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   18e60:	6d 8f       	std	Y+29, r22	; 0x1d
   18e62:	7e 8f       	std	Y+30, r23	; 0x1e
   18e64:	8f 8f       	std	Y+31, r24	; 0x1f
   18e66:	98 a3       	std	Y+32, r25	; 0x20
	float distanceMin[2];
    count_xyz_details(distanceMin);
	lcd_home();
   18e68:	0e 94 1f 70 	call	0xe03e	; 0xe03e <lcd_home()>
	lcd_printf_P(_N(
   18e6c:	8d e8       	ldi	r24, 0x8D	; 141
   18e6e:	9a e3       	ldi	r25, 0x3A	; 58
   18e70:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18e74:	d8 2e       	mov	r13, r24
   18e76:	c9 2e       	mov	r12, r25
   18e78:	86 e8       	ldi	r24, 0x86	; 134
   18e7a:	9a e3       	ldi	r25, 0x3A	; 58
   18e7c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18e80:	f8 2e       	mov	r15, r24
   18e82:	e9 2e       	mov	r14, r25
   18e84:	80 e7       	ldi	r24, 0x70	; 112
   18e86:	9a e3       	ldi	r25, 0x3A	; 58
   18e88:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18e8c:	cf 92       	push	r12
   18e8e:	df 92       	push	r13
   18e90:	ef 92       	push	r14
   18e92:	ff 92       	push	r15
   18e94:	21 e0       	ldi	r18, 0x01	; 1
   18e96:	34 e8       	ldi	r19, 0x84	; 132
   18e98:	3f 93       	push	r19
   18e9a:	2f 93       	push	r18
   18e9c:	9f 93       	push	r25
   18e9e:	8f 93       	push	r24
   18ea0:	82 e6       	ldi	r24, 0x62	; 98
   18ea2:	97 e6       	ldi	r25, 0x67	; 103
   18ea4:	9f 93       	push	r25
   18ea6:	8f 93       	push	r24
   18ea8:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
	 _T(MSG_LEFT),
	 _T(MSG_RIGHT)
	);
	for (uint8_t i = 0; i < 2; i++)
	{
		lcd_set_cursor(11,2+i);
   18eac:	62 e0       	ldi	r22, 0x02	; 2
   18eae:	8b e0       	ldi	r24, 0x0B	; 11
   18eb0:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
		if (distanceMin[i] >= 200) lcd_puts_P(_T(MSG_NA));
   18eb4:	0f b6       	in	r0, 0x3f	; 63
   18eb6:	f8 94       	cli
   18eb8:	de bf       	out	0x3e, r29	; 62
   18eba:	0f be       	out	0x3f, r0	; 63
   18ebc:	cd bf       	out	0x3d, r28	; 61
   18ebe:	20 e0       	ldi	r18, 0x00	; 0
   18ec0:	30 e0       	ldi	r19, 0x00	; 0
   18ec2:	48 e4       	ldi	r20, 0x48	; 72
   18ec4:	53 e4       	ldi	r21, 0x43	; 67
   18ec6:	62 2d       	mov	r22, r2
   18ec8:	73 2d       	mov	r23, r3
   18eca:	80 2f       	mov	r24, r16
   18ecc:	91 2f       	mov	r25, r17
   18ece:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   18ed2:	87 ff       	sbrs	r24, 7
   18ed4:	51 c0       	rjmp	.+162    	; 0x18f78 <lcd_menu_xyz_y_min() [clone .lto_priv.418]+0x254>
		else lcd_printf_P(_N("%6.2fmm"), distanceMin[i]);
   18ed6:	1f 93       	push	r17
   18ed8:	0f 93       	push	r16
   18eda:	3f 92       	push	r3
   18edc:	2f 92       	push	r2
   18ede:	8a e5       	ldi	r24, 0x5A	; 90
   18ee0:	97 e6       	ldi	r25, 0x67	; 103
   18ee2:	9f 93       	push	r25
   18ee4:	8f 93       	push	r24
   18ee6:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
   18eea:	0f 90       	pop	r0
   18eec:	0f 90       	pop	r0
   18eee:	0f 90       	pop	r0
   18ef0:	0f 90       	pop	r0
   18ef2:	0f 90       	pop	r0
   18ef4:	0f 90       	pop	r0
	 _T(MSG_LEFT),
	 _T(MSG_RIGHT)
	);
	for (uint8_t i = 0; i < 2; i++)
	{
		lcd_set_cursor(11,2+i);
   18ef6:	63 e0       	ldi	r22, 0x03	; 3
   18ef8:	8b e0       	ldi	r24, 0x0B	; 11
   18efa:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
		if (distanceMin[i] >= 200) lcd_puts_P(_T(MSG_NA));
   18efe:	1d 8d       	ldd	r17, Y+29	; 0x1d
   18f00:	0e 8d       	ldd	r16, Y+30	; 0x1e
   18f02:	ff 8c       	ldd	r15, Y+31	; 0x1f
   18f04:	e8 a0       	ldd	r14, Y+32	; 0x20
   18f06:	20 e0       	ldi	r18, 0x00	; 0
   18f08:	30 e0       	ldi	r19, 0x00	; 0
   18f0a:	48 e4       	ldi	r20, 0x48	; 72
   18f0c:	53 e4       	ldi	r21, 0x43	; 67
   18f0e:	d8 01       	movw	r26, r16
   18f10:	f7 01       	movw	r30, r14
   18f12:	6b 2f       	mov	r22, r27
   18f14:	7a 2f       	mov	r23, r26
   18f16:	8f 2f       	mov	r24, r31
   18f18:	9e 2f       	mov	r25, r30
   18f1a:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   18f1e:	87 fd       	sbrc	r24, 7
   18f20:	32 c0       	rjmp	.+100    	; 0x18f86 <lcd_menu_xyz_y_min() [clone .lto_priv.418]+0x262>
   18f22:	83 e7       	ldi	r24, 0x73	; 115
   18f24:	98 e4       	ldi	r25, 0x48	; 72
   18f26:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18f2a:	0e 94 1d 6f 	call	0xde3a	; 0xde3a <lcd_puts_P(char const*)>
		else lcd_printf_P(_N("%6.2fmm"), distanceMin[i]);
	}
    if (lcd_clicked())
   18f2e:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   18f32:	88 23       	and	r24, r24
   18f34:	41 f0       	breq	.+16     	; 0x18f46 <lcd_menu_xyz_y_min() [clone .lto_priv.418]+0x222>
        menu_goto(lcd_menu_xyz_skew, 0, true);
   18f36:	20 e0       	ldi	r18, 0x00	; 0
   18f38:	41 e0       	ldi	r20, 0x01	; 1
   18f3a:	70 e0       	ldi	r23, 0x00	; 0
   18f3c:	60 e0       	ldi	r22, 0x00	; 0
   18f3e:	83 e3       	ldi	r24, 0x33	; 51
   18f40:	91 ed       	ldi	r25, 0xD1	; 209
   18f42:	0e 94 b7 62 	call	0xc56e	; 0xc56e <menu_goto(void (*)(), int, bool, bool)>
}
   18f46:	a8 96       	adiw	r28, 0x28	; 40
   18f48:	0f b6       	in	r0, 0x3f	; 63
   18f4a:	f8 94       	cli
   18f4c:	de bf       	out	0x3e, r29	; 62
   18f4e:	0f be       	out	0x3f, r0	; 63
   18f50:	cd bf       	out	0x3d, r28	; 61
   18f52:	df 91       	pop	r29
   18f54:	cf 91       	pop	r28
   18f56:	1f 91       	pop	r17
   18f58:	0f 91       	pop	r16
   18f5a:	ff 90       	pop	r15
   18f5c:	ef 90       	pop	r14
   18f5e:	df 90       	pop	r13
   18f60:	cf 90       	pop	r12
   18f62:	bf 90       	pop	r11
   18f64:	af 90       	pop	r10
   18f66:	9f 90       	pop	r9
   18f68:	8f 90       	pop	r8
   18f6a:	7f 90       	pop	r7
   18f6c:	6f 90       	pop	r6
   18f6e:	5f 90       	pop	r5
   18f70:	4f 90       	pop	r4
   18f72:	3f 90       	pop	r3
   18f74:	2f 90       	pop	r2
   18f76:	08 95       	ret
	 _T(MSG_RIGHT)
	);
	for (uint8_t i = 0; i < 2; i++)
	{
		lcd_set_cursor(11,2+i);
		if (distanceMin[i] >= 200) lcd_puts_P(_T(MSG_NA));
   18f78:	83 e7       	ldi	r24, 0x73	; 115
   18f7a:	98 e4       	ldi	r25, 0x48	; 72
   18f7c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   18f80:	0e 94 1d 6f 	call	0xde3a	; 0xde3a <lcd_puts_P(char const*)>
   18f84:	b8 cf       	rjmp	.-144    	; 0x18ef6 <lcd_menu_xyz_y_min() [clone .lto_priv.418]+0x1d2>
		else lcd_printf_P(_N("%6.2fmm"), distanceMin[i]);
   18f86:	ef 92       	push	r14
   18f88:	ff 92       	push	r15
   18f8a:	0f 93       	push	r16
   18f8c:	1f 93       	push	r17
   18f8e:	8a e5       	ldi	r24, 0x5A	; 90
   18f90:	97 e6       	ldi	r25, 0x67	; 103
   18f92:	9f 93       	push	r25
   18f94:	8f 93       	push	r24
   18f96:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
   18f9a:	0f 90       	pop	r0
   18f9c:	0f 90       	pop	r0
   18f9e:	0f 90       	pop	r0
   18fa0:	0f 90       	pop	r0
   18fa2:	0f 90       	pop	r0
   18fa4:	0f 90       	pop	r0
   18fa6:	c3 cf       	rjmp	.-122    	; 0x18f2e <lcd_menu_xyz_y_min() [clone .lto_priv.418]+0x20a>

00018fa8 <lcd_reprint_from_eeprom()>:
    else
        value = !value;
    eeprom_update_byte_notify((uint8_t*)EEPROM_HEAT_BED_ON_LOAD_FILAMENT, value);
}

void lcd_reprint_from_eeprom() {
   18fa8:	ef 92       	push	r14
   18faa:	ff 92       	push	r15
   18fac:	0f 93       	push	r16
   18fae:	1f 93       	push	r17
   18fb0:	cf 93       	push	r28
   18fb2:	df 93       	push	r29
   18fb4:	cd b7       	in	r28, 0x3d	; 61
   18fb6:	de b7       	in	r29, 0x3e	; 62
   18fb8:	6b 97       	sbiw	r28, 0x1b	; 27
   18fba:	0f b6       	in	r0, 0x3f	; 63
   18fbc:	f8 94       	cli
   18fbe:	de bf       	out	0x3e, r29	; 62
   18fc0:	0f be       	out	0x3f, r0	; 63
   18fc2:	cd bf       	out	0x3d, r28	; 61
void restore_file_from_sd()
{
    char filename[FILENAME_LENGTH];
    char dir_name[9];
    char extension_ptr[5];
    uint8_t depth = eeprom_read_byte((uint8_t*)EEPROM_DIR_DEPTH);
   18fc4:	8a e5       	ldi	r24, 0x5A	; 90
   18fc6:	9f e0       	ldi	r25, 0x0F	; 15
   18fc8:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   18fcc:	e8 2e       	mov	r14, r24
   18fce:	0a e0       	ldi	r16, 0x0A	; 10
   18fd0:	1f e0       	ldi	r17, 0x0F	; 15

    for (uint8_t i = 0; i < depth; i++) {
   18fd2:	f1 2c       	mov	r15, r1
        card.chdir(dir_name, false);
    }

    // Recover DOS 8.3 filename without extension.
    // Short filenames are always null terminated.
    eeprom_read_block(filename, (const char *)EEPROM_FILENAME, 8);
   18fd4:	48 e0       	ldi	r20, 0x08	; 8
   18fd6:	50 e0       	ldi	r21, 0x00	; 0
    char filename[FILENAME_LENGTH];
    char dir_name[9];
    char extension_ptr[5];
    uint8_t depth = eeprom_read_byte((uint8_t*)EEPROM_DIR_DEPTH);

    for (uint8_t i = 0; i < depth; i++) {
   18fd8:	ef 14       	cp	r14, r15
   18fda:	79 f0       	breq	.+30     	; 0x18ffa <lcd_reprint_from_eeprom()+0x52>
        eeprom_read_block(dir_name, (const char *)EEPROM_DIRS + 8 * i, 8);
   18fdc:	b8 01       	movw	r22, r16
   18fde:	ce 01       	movw	r24, r28
   18fe0:	0e 96       	adiw	r24, 0x0e	; 14
   18fe2:	0f 94 d0 a3 	call	0x347a0	; 0x347a0 <eeprom_read_block>
        dir_name[8] = '\0';
   18fe6:	1e 8a       	std	Y+22, r1	; 0x16
        card.chdir(dir_name, false);
   18fe8:	60 e0       	ldi	r22, 0x00	; 0
   18fea:	ce 01       	movw	r24, r28
   18fec:	0e 96       	adiw	r24, 0x0e	; 14
   18fee:	0f 94 bc 70 	call	0x2e178	; 0x2e178 <CardReader::chdir(char const*, bool) [clone .constprop.200]>
    char filename[FILENAME_LENGTH];
    char dir_name[9];
    char extension_ptr[5];
    uint8_t depth = eeprom_read_byte((uint8_t*)EEPROM_DIR_DEPTH);

    for (uint8_t i = 0; i < depth; i++) {
   18ff2:	f3 94       	inc	r15
   18ff4:	08 5f       	subi	r16, 0xF8	; 248
   18ff6:	1f 4f       	sbci	r17, 0xFF	; 255
   18ff8:	ed cf       	rjmp	.-38     	; 0x18fd4 <lcd_reprint_from_eeprom()+0x2c>
        card.chdir(dir_name, false);
    }

    // Recover DOS 8.3 filename without extension.
    // Short filenames are always null terminated.
    eeprom_read_block(filename, (const char *)EEPROM_FILENAME, 8);
   18ffa:	65 e9       	ldi	r22, 0x95	; 149
   18ffc:	7f e0       	ldi	r23, 0x0F	; 15
   18ffe:	8e 01       	movw	r16, r28
   19000:	0f 5f       	subi	r16, 0xFF	; 255
   19002:	1f 4f       	sbci	r17, 0xFF	; 255
   19004:	c8 01       	movw	r24, r16
   19006:	0f 94 d0 a3 	call	0x347a0	; 0x347a0 <eeprom_read_block>

    // Add null delimiter in case all 8 characters were not NULL
    filename[8] = '\0';
   1900a:	19 86       	std	Y+9, r1	; 0x09

    // Add extension to complete the DOS 8.3 filename e.g. ".gco" or ".g"
    extension_ptr[0] = '.';
   1900c:	8e e2       	ldi	r24, 0x2E	; 46
   1900e:	8f 8b       	std	Y+23, r24	; 0x17
    eeprom_read_block(&extension_ptr[1], (const char *)EEPROM_FILENAME_EXTENSION, 3);
   19010:	43 e0       	ldi	r20, 0x03	; 3
   19012:	50 e0       	ldi	r21, 0x00	; 0
   19014:	61 e9       	ldi	r22, 0x91	; 145
   19016:	7c e0       	ldi	r23, 0x0C	; 12
   19018:	ce 01       	movw	r24, r28
   1901a:	48 96       	adiw	r24, 0x18	; 24
   1901c:	0f 94 d0 a3 	call	0x347a0	; 0x347a0 <eeprom_read_block>
    extension_ptr[4] = '\0';
   19020:	1b 8e       	std	Y+27, r1	; 0x1b
    strcat(filename, extension_ptr);
   19022:	be 01       	movw	r22, r28
   19024:	69 5e       	subi	r22, 0xE9	; 233
   19026:	7f 4f       	sbci	r23, 0xFF	; 255
   19028:	c8 01       	movw	r24, r16
   1902a:	0f 94 2c aa 	call	0x35458	; 0x35458 <strcat>

    enquecommandf_P(MSG_M23, filename);
   1902e:	1f 93       	push	r17
   19030:	0f 93       	push	r16
   19032:	87 e6       	ldi	r24, 0x67	; 103
   19034:	9c e6       	ldi	r25, 0x6C	; 108
   19036:	9f 93       	push	r25
   19038:	8f 93       	push	r24
   1903a:	0e 94 b7 8f 	call	0x11f6e	; 0x11f6e <enquecommandf_P(char const*, ...)>
    restore_file_from_sd();

    // M24: Start/resume SD print
    enquecommand_P(MSG_M24);
   1903e:	61 e0       	ldi	r22, 0x01	; 1
   19040:	83 e6       	ldi	r24, 0x63	; 99
   19042:	9c e6       	ldi	r25, 0x6C	; 108
   19044:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
    lcd_return_to_status();
   19048:	0f 94 d5 07 	call	0x20faa	; 0x20faa <lcd_return_to_status()>
   1904c:	0f 90       	pop	r0
   1904e:	0f 90       	pop	r0
   19050:	0f 90       	pop	r0
   19052:	0f 90       	pop	r0
}
   19054:	6b 96       	adiw	r28, 0x1b	; 27
   19056:	0f b6       	in	r0, 0x3f	; 63
   19058:	f8 94       	cli
   1905a:	de bf       	out	0x3e, r29	; 62
   1905c:	0f be       	out	0x3f, r0	; 63
   1905e:	cd bf       	out	0x3d, r28	; 61
   19060:	df 91       	pop	r29
   19062:	cf 91       	pop	r28
   19064:	1f 91       	pop	r17
   19066:	0f 91       	pop	r16
   19068:	ff 90       	pop	r15
   1906a:	ef 90       	pop	r14
   1906c:	08 95       	ret

0001906e <lcd_pinda_temp_compensation_toggle()>:
    MENU_END();
}

#ifdef PINDA_TEMP_COMP
void lcd_pinda_temp_compensation_toggle()
{
   1906e:	cf 93       	push	r28
	uint8_t pinda_temp_compensation = eeprom_read_byte((uint8_t*)EEPROM_PINDA_TEMP_COMPENSATION);
   19070:	89 e2       	ldi	r24, 0x29	; 41
   19072:	9d e0       	ldi	r25, 0x0D	; 13
   19074:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
	if (pinda_temp_compensation == EEPROM_EMPTY_VALUE) // On MK2.5/S the EEPROM_EMPTY_VALUE will be set to 0 during eeprom_init.
		pinda_temp_compensation = 1;                   // But for MK3/S it should be 1 so SuperPINDA is "active"
	else
		pinda_temp_compensation = !pinda_temp_compensation;
   19078:	81 50       	subi	r24, 0x01	; 1
   1907a:	c1 e0       	ldi	r28, 0x01	; 1
   1907c:	8e 3f       	cpi	r24, 0xFE	; 254
   1907e:	08 f4       	brcc	.+2      	; 0x19082 <lcd_pinda_temp_compensation_toggle()+0x14>
   19080:	c0 e0       	ldi	r28, 0x00	; 0
        if (previous_value != value) {
            eeprom_byte_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_byte(dst, value);
   19082:	6c 2f       	mov	r22, r28
   19084:	89 e2       	ldi	r24, 0x29	; 41
   19086:	9d e0       	ldi	r25, 0x0D	; 13
   19088:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
	eeprom_update_byte_notify((uint8_t*)EEPROM_PINDA_TEMP_COMPENSATION, pinda_temp_compensation);
	SERIAL_ECHOLNPGM("SuperPINDA:");
   1908c:	86 e1       	ldi	r24, 0x16	; 22
   1908e:	94 e8       	ldi	r25, 0x84	; 132
   19090:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
  }
}

void MarlinSerial::print(unsigned long n, int base)
{
  if (base == 0) write(n);
   19094:	8c 2f       	mov	r24, r28
   19096:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
	SERIAL_ECHOLN(pinda_temp_compensation);
}
   1909a:	cf 91       	pop	r28
}

void MarlinSerial::println(unsigned char b, int base)
{
  print(b, base);
  println();
   1909c:	0c 94 bc 7a 	jmp	0xf578	; 0xf578 <MarlinSerial::println()>

000190a0 <lcd_move_z()>:
}
static void lcd_move_y() {
  _lcd_move(PSTR("Y:"), Y_AXIS, Y_MIN_POS, Y_MAX_POS);
}
static void lcd_move_z() {
  _lcd_move(PSTR("Z:"), Z_AXIS, Z_MIN_POS, Z_MAX_POS);
   190a0:	22 ed       	ldi	r18, 0xD2	; 210
   190a2:	30 e0       	ldi	r19, 0x00	; 0
   190a4:	50 e0       	ldi	r21, 0x00	; 0
   190a6:	40 e0       	ldi	r20, 0x00	; 0
   190a8:	62 e0       	ldi	r22, 0x02	; 2
   190aa:	84 e8       	ldi	r24, 0x84	; 132
   190ac:	92 e8       	ldi	r25, 0x82	; 130
   190ae:	0d 94 b4 4c 	jmp	0x29968	; 0x29968 <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]>

000190b2 <lcd_move_x()>:
}

// Note: the colon behind the text (X, Y, Z) is necessary to greatly shorten
// the implementation of menu_draw_float31
static void lcd_move_x() {
  _lcd_move(PSTR("X:"), X_AXIS, X_MIN_POS, X_MAX_POS);
   190b2:	2a ef       	ldi	r18, 0xFA	; 250
   190b4:	30 e0       	ldi	r19, 0x00	; 0
   190b6:	50 e0       	ldi	r21, 0x00	; 0
   190b8:	40 e0       	ldi	r20, 0x00	; 0
   190ba:	60 e0       	ldi	r22, 0x00	; 0
   190bc:	8e e7       	ldi	r24, 0x7E	; 126
   190be:	92 e8       	ldi	r25, 0x82	; 130
   190c0:	0d 94 b4 4c 	jmp	0x29968	; 0x29968 <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]>

000190c4 <lcd_move_y()>:
}
static void lcd_move_y() {
  _lcd_move(PSTR("Y:"), Y_AXIS, Y_MIN_POS, Y_MAX_POS);
   190c4:	22 ed       	ldi	r18, 0xD2	; 210
   190c6:	30 e0       	ldi	r19, 0x00	; 0
   190c8:	4c ef       	ldi	r20, 0xFC	; 252
   190ca:	5f ef       	ldi	r21, 0xFF	; 255
   190cc:	61 e0       	ldi	r22, 0x01	; 1
   190ce:	81 e8       	ldi	r24, 0x81	; 129
   190d0:	92 e8       	ldi	r25, 0x82	; 130
   190d2:	0d 94 b4 4c 	jmp	0x29968	; 0x29968 <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]>

000190d6 <menu_lcd_longpress_func()>:
{
	return lcd_status_message_level;
}

void menu_lcd_longpress_func(void)
{
   190d6:	cf 93       	push	r28
   190d8:	df 93       	push	r29
    // Wake up the LCD backlight and,
    // start LCD inactivity timer
    lcd_timeoutToStatus.start();
   190da:	83 ee       	ldi	r24, 0xE3	; 227
   190dc:	93 e0       	ldi	r25, 0x03	; 3
   190de:	0f 94 47 10 	call	0x2208e	; 0x2208e <Timer<unsigned long>::start()>
    if (homing_flag || mesh_bed_leveling_flag || menu_menu == lcd_babystep_z || menu_menu == lcd_move_z || menu_is_any_block() || Stopped)
   190e2:	80 91 71 12 	lds	r24, 0x1271	; 0x801271 <homing_flag>
   190e6:	81 11       	cpse	r24, r1
   190e8:	18 c0       	rjmp	.+48     	; 0x1911a <menu_lcd_longpress_func()+0x44>
   190ea:	80 91 72 12 	lds	r24, 0x1272	; 0x801272 <mesh_bed_leveling_flag>
   190ee:	81 11       	cpse	r24, r1
   190f0:	14 c0       	rjmp	.+40     	; 0x1911a <menu_lcd_longpress_func()+0x44>
   190f2:	c0 91 02 04 	lds	r28, 0x0402	; 0x800402 <menu_menu>
   190f6:	d0 91 03 04 	lds	r29, 0x0403	; 0x800403 <menu_menu+0x1>
   190fa:	87 ed       	ldi	r24, 0xD7	; 215
   190fc:	c8 36       	cpi	r28, 0x68	; 104
   190fe:	d8 07       	cpc	r29, r24
   19100:	61 f0       	breq	.+24     	; 0x1911a <menu_lcd_longpress_func()+0x44>
   19102:	88 ec       	ldi	r24, 0xC8	; 200
   19104:	c0 35       	cpi	r28, 0x50	; 80
   19106:	d8 07       	cpc	r29, r24
   19108:	41 f0       	breq	.+16     	; 0x1911a <menu_lcd_longpress_func()+0x44>
   1910a:	80 91 3a 12 	lds	r24, 0x123A	; 0x80123a <menu_block_mask>
   1910e:	81 11       	cpse	r24, r1
   19110:	04 c0       	rjmp	.+8      	; 0x1911a <menu_lcd_longpress_func()+0x44>
   19112:	80 91 3b 12 	lds	r24, 0x123B	; 0x80123b <Stopped>
   19116:	88 23       	and	r24, r24
   19118:	31 f0       	breq	.+12     	; 0x19126 <menu_lcd_longpress_func()+0x50>
    {
        // disable longpress during re-entry, while homing, calibration or if a serious error
        lcd_draw_update = 2;
   1911a:	82 e0       	ldi	r24, 0x02	; 2
   1911c:	80 93 59 02 	sts	0x0259, r24	; 0x800259 <lcd_draw_update>
            menu_submenu(lcd_move_z);
        } else {
            lcd_quick_feedback();
        }
    }
}
   19120:	df 91       	pop	r29
   19122:	cf 91       	pop	r28
   19124:	08 95       	ret
    {
        // disable longpress during re-entry, while homing, calibration or if a serious error
        lcd_draw_update = 2;
        return;
    }
    if (menu_menu == lcd_hw_setup_menu)
   19126:	81 ec       	ldi	r24, 0xC1	; 193
   19128:	cb 35       	cpi	r28, 0x5B	; 91
   1912a:	d8 07       	cpc	r29, r24
   1912c:	81 f4       	brne	.+32     	; 0x1914e <menu_lcd_longpress_func()+0x78>
    {
        // only toggle the experimental menu visibility flag
        lcd_draw_update = 2;
   1912e:	82 e0       	ldi	r24, 0x02	; 2
   19130:	80 93 59 02 	sts	0x0259, r24	; 0x800259 <lcd_draw_update>
        eeprom_update_byte_notify(dst++, pgm_read_byte(src++));
    }
}

void eeprom_toggle(uint8_t *__p) {
    eeprom_write_byte_notify(__p, !eeprom_read_byte(__p));
   19134:	8a e2       	ldi	r24, 0x2A	; 42
   19136:	9d e0       	ldi	r25, 0x0D	; 13
   19138:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1913c:	61 e0       	ldi	r22, 0x01	; 1
   1913e:	81 11       	cpse	r24, r1
   19140:	60 e0       	ldi	r22, 0x00	; 0
    if (active) {
        uint8_t previous_value = eeprom_read_byte(dst);
        eeprom_byte_notify(dst, previous_value, value, true);
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_write_byte(dst, value);
   19142:	8a e2       	ldi	r24, 0x2A	; 42
   19144:	9d e0       	ldi	r25, 0x0D	; 13
            menu_submenu(lcd_move_z);
        } else {
            lcd_quick_feedback();
        }
    }
}
   19146:	df 91       	pop	r29
   19148:	cf 91       	pop	r28
   1914a:	0d 94 28 a4 	jmp	0x34850	; 0x34850 <eeprom_write_byte>
   1914e:	90 91 3e 0d 	lds	r25, 0x0D3E	; 0x800d3e <block_buffer_head>
   19152:	80 91 3f 0d 	lds	r24, 0x0D3F	; 0x800d3f <block_buffer_tail>
        return;
    }

    // explicitely listed menus which are allowed to rise the move-z or live-adj-z functions
    // The lists are not the same for both functions, so first decide which function is to be performed
    if (blocks_queued() || printJobOngoing()){ // long press as live-adj-z
   19156:	98 13       	cpse	r25, r24
   19158:	04 c0       	rjmp	.+8      	; 0x19162 <menu_lcd_longpress_func()+0x8c>
   1915a:	0e 94 40 66 	call	0xcc80	; 0xcc80 <printJobOngoing()>
   1915e:	88 23       	and	r24, r24
   19160:	61 f0       	breq	.+24     	; 0x1917a <menu_lcd_longpress_func()+0xa4>
        if ( babystep_allowed_strict()
   19162:	0e 94 7b 66 	call	0xccf6	; 0xccf6 <babystep_allowed_strict()>
        && (menu_menu == lcd_status_screen // and in listed menus...
   19166:	81 11       	cpse	r24, r1
   19168:	10 c0       	rjmp	.+32     	; 0x1918a <menu_lcd_longpress_func()+0xb4>
	Sound_MakeSound(e_SOUND_TYPE_ButtonEcho);
}

void lcd_quick_feedback(void)
{
  lcd_draw_update = 2;
   1916a:	82 e0       	ldi	r24, 0x02	; 2
   1916c:	80 93 59 02 	sts	0x0259, r24	; 0x800259 <lcd_draw_update>
	}
    return clicked;
}

void lcd_beeper_quick_feedback(void) {
	Sound_MakeSound(e_SOUND_TYPE_ButtonEcho);
   19170:	80 e0       	ldi	r24, 0x00	; 0
            menu_submenu(lcd_move_z);
        } else {
            lcd_quick_feedback();
        }
    }
}
   19172:	df 91       	pop	r29
   19174:	cf 91       	pop	r28
   19176:	0d 94 ad 25 	jmp	0x24b5a	; 0x24b5a <Sound_MakeSound(eSOUND_TYPE)>
            menu_submenu(lcd_babystep_z);
        } else {
            lcd_quick_feedback();
        }
    } else { // long press as move-z
        if (menu_menu == lcd_status_screen
   1917a:	87 e3       	ldi	r24, 0x37	; 55
   1917c:	c0 32       	cpi	r28, 0x20	; 32
   1917e:	d8 07       	cpc	r29, r24
   19180:	e1 f4       	brne	.+56     	; 0x191ba <menu_lcd_longpress_func()+0xe4>
#if (LANG_MODE != 0)
        || menu_menu == lcd_language
#endif
        || menu_menu == lcd_support_menu
        ){
            menu_submenu(lcd_move_z);
   19182:	60 e0       	ldi	r22, 0x00	; 0
   19184:	80 e5       	ldi	r24, 0x50	; 80
   19186:	98 ec       	ldi	r25, 0xC8	; 200
   19188:	14 c0       	rjmp	.+40     	; 0x191b2 <menu_lcd_longpress_func()+0xdc>

    // explicitely listed menus which are allowed to rise the move-z or live-adj-z functions
    // The lists are not the same for both functions, so first decide which function is to be performed
    if (blocks_queued() || printJobOngoing()){ // long press as live-adj-z
        if ( babystep_allowed_strict()
        && (menu_menu == lcd_status_screen // and in listed menus...
   1918a:	87 e3       	ldi	r24, 0x37	; 55
   1918c:	c0 32       	cpi	r28, 0x20	; 32
   1918e:	d8 07       	cpc	r29, r24
   19190:	59 f0       	breq	.+22     	; 0x191a8 <menu_lcd_longpress_func()+0xd2>
          || menu_menu == lcd_main_menu
   19192:	88 ec       	ldi	r24, 0xC8	; 200
   19194:	ca 3f       	cpi	r28, 0xFA	; 250
   19196:	d8 07       	cpc	r29, r24
   19198:	39 f0       	breq	.+14     	; 0x191a8 <menu_lcd_longpress_func()+0xd2>
          || menu_menu == lcd_tune_menu
   1919a:	8c ec       	ldi	r24, 0xCC	; 204
   1919c:	c7 32       	cpi	r28, 0x27	; 39
   1919e:	d8 07       	cpc	r29, r24
   191a0:	19 f0       	breq	.+6      	; 0x191a8 <menu_lcd_longpress_func()+0xd2>
          || menu_menu == lcd_support_menu
   191a2:	c2 5e       	subi	r28, 0xE2	; 226
   191a4:	d6 43       	sbci	r29, 0x36	; 54
   191a6:	09 f7       	brne	.-62     	; 0x1916a <menu_lcd_longpress_func()+0x94>
           )
        ){
            lcd_clear();
   191a8:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
            menu_submenu(lcd_babystep_z);
   191ac:	60 e0       	ldi	r22, 0x00	; 0
   191ae:	88 e6       	ldi	r24, 0x68	; 104
   191b0:	97 ed       	ldi	r25, 0xD7	; 215
            menu_submenu(lcd_move_z);
        } else {
            lcd_quick_feedback();
        }
    }
}
   191b2:	df 91       	pop	r29
   191b4:	cf 91       	pop	r28
#if (LANG_MODE != 0)
        || menu_menu == lcd_language
#endif
        || menu_menu == lcd_support_menu
        ){
            menu_submenu(lcd_move_z);
   191b6:	0c 94 dd 62 	jmp	0xc5ba	; 0xc5ba <menu_submenu(void (*)(), bool)>
        } else {
            lcd_quick_feedback();
        }
    } else { // long press as move-z
        if (menu_menu == lcd_status_screen
        || menu_menu == lcd_main_menu
   191ba:	88 ec       	ldi	r24, 0xC8	; 200
   191bc:	ca 3f       	cpi	r28, 0xFA	; 250
   191be:	d8 07       	cpc	r29, r24
   191c0:	01 f3       	breq	.-64     	; 0x19182 <menu_lcd_longpress_func()+0xac>
        || menu_menu == lcd_preheat_menu
   191c2:	87 e3       	ldi	r24, 0x37	; 55
   191c4:	c6 37       	cpi	r28, 0x76	; 118
   191c6:	d8 07       	cpc	r29, r24
   191c8:	e1 f2       	breq	.-72     	; 0x19182 <menu_lcd_longpress_func()+0xac>
        || menu_menu == lcd_sdcard_menu
   191ca:	85 ee       	ldi	r24, 0xE5	; 229
   191cc:	c0 3a       	cpi	r28, 0xA0	; 160
   191ce:	d8 07       	cpc	r29, r24
   191d0:	c1 f2       	breq	.-80     	; 0x19182 <menu_lcd_longpress_func()+0xac>
        || menu_menu == lcd_settings_menu
   191d2:	8c ec       	ldi	r24, 0xCC	; 204
   191d4:	c5 3e       	cpi	r28, 0xE5	; 229
   191d6:	d8 07       	cpc	r29, r24
   191d8:	a1 f2       	breq	.-88     	; 0x19182 <menu_lcd_longpress_func()+0xac>
        || menu_menu == lcd_control_temperature_menu
   191da:	8b ec       	ldi	r24, 0xCB	; 203
   191dc:	ce 34       	cpi	r28, 0x4E	; 78
   191de:	d8 07       	cpc	r29, r24
   191e0:	81 f2       	breq	.-96     	; 0x19182 <menu_lcd_longpress_func()+0xac>
#if (LANG_MODE != 0)
        || menu_menu == lcd_language
   191e2:	84 ec       	ldi	r24, 0xC4	; 196
   191e4:	c9 34       	cpi	r28, 0x49	; 73
   191e6:	d8 07       	cpc	r29, r24
   191e8:	61 f2       	breq	.-104    	; 0x19182 <menu_lcd_longpress_func()+0xac>
#endif
        || menu_menu == lcd_support_menu
   191ea:	c2 5e       	subi	r28, 0xE2	; 226
   191ec:	d6 43       	sbci	r29, 0x36	; 54
   191ee:	09 f0       	breq	.+2      	; 0x191f2 <menu_lcd_longpress_func()+0x11c>
   191f0:	bc cf       	rjmp	.-136    	; 0x1916a <menu_lcd_longpress_func()+0x94>
   191f2:	c7 cf       	rjmp	.-114    	; 0x19182 <menu_lcd_longpress_func()+0xac>

000191f4 <lcd_main_menu() [clone .lto_priv.420]>:
//! | Fail stats         | allways
//! | Fail stats MMU     | mmu
//! | Support            | allways
//! @endcode
static void lcd_main_menu()
{
   191f4:	1f 93       	push	r17
   191f6:	cf 93       	push	r28
   191f8:	df 93       	push	r29

    MENU_BEGIN();
   191fa:	0e 94 0c 74 	call	0xe818	; 0xe818 <menu_start()>
   191fe:	10 92 60 04 	sts	0x0460, r1	; 0x800460 <menu_row>
#endif //SDSUPPORT
        if(!farm_mode) {
            const int8_t sheet = eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet));
            const int8_t nextSheet = eeprom_next_initialized_sheet(sheet);
            if ((nextSheet >= 0) && (sheet != nextSheet)) { // show menu only if we have 2 or more sheets initialized
                MENU_ITEM_FUNCTION_E(EEPROM_Sheets_base->s[sheet], eeprom_switch_to_next_sheet);
   19202:	1b e0       	ldi	r17, 0x0B	; 11
#ifdef SDSUPPORT //!@todo SDSUPPORT undefined creates several issues in source code
            if (card.mounted
                || lcd_commands_type != LcdCommands::Idle) {
                if (!card.isFileOpen()) {
                    if (!usb_timer.running() && (lcd_commands_type == LcdCommands::Idle)) {
                        bMain=true;               // flag ('fake parameter') for 'lcd_sdcard_menu()' function
   19204:	d1 e0       	ldi	r29, 0x01	; 1
//! | Support            | allways
//! @endcode
static void lcd_main_menu()
{

    MENU_BEGIN();
   19206:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   1920a:	84 30       	cpi	r24, 0x04	; 4
   1920c:	08 f0       	brcs	.+2      	; 0x19210 <lcd_main_menu() [clone .lto_priv.420]+0x1c>
   1920e:	09 c2       	rjmp	.+1042   	; 0x19622 <lcd_main_menu() [clone .lto_priv.420]+0x42e>
   19210:	10 92 63 04 	sts	0x0463, r1	; 0x800463 <menu_item>

    // Majkl superawesome menu


    MENU_ITEM_BACK_P(_T(MSG_INFO_SCREEN));
   19214:	87 e0       	ldi	r24, 0x07	; 7
   19216:	98 e4       	ldi	r25, 0x48	; 72
   19218:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1921c:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
    MENU_ITEM_FUNCTION_P(PSTR("recover print"), recover_print);
    MENU_ITEM_FUNCTION_P(PSTR("power panic"), uvlo_);
#endif //TMC2130_DEBUG

    // Menu item for reprint
    if (!printer_active() && !printer_recovering() && (heating_status == HeatingStatus::NO_HEATING)) {
   19220:	0e 94 91 66 	call	0xcd22	; 0xcd22 <printer_active()>
   19224:	81 11       	cpse	r24, r1
   19226:	19 c0       	rjmp	.+50     	; 0x1925a <lcd_main_menu() [clone .lto_priv.420]+0x66>
   19228:	0e 94 2b 66 	call	0xcc56	; 0xcc56 <printer_recovering()>
   1922c:	81 11       	cpse	r24, r1
   1922e:	15 c0       	rjmp	.+42     	; 0x1925a <lcd_main_menu() [clone .lto_priv.420]+0x66>
   19230:	80 91 cb 03 	lds	r24, 0x03CB	; 0x8003cb <heating_status>
   19234:	81 11       	cpse	r24, r1
   19236:	11 c0       	rjmp	.+34     	; 0x1925a <lcd_main_menu() [clone .lto_priv.420]+0x66>
#include "printer_state.h"

static PrinterState printer_state;

PrinterState GetPrinterState() {
    return printer_state;
   19238:	80 91 61 0d 	lds	r24, 0x0D61	; 0x800d61 <_ZL13printer_state.lto_priv.386>
        if ((GetPrinterState() == PrinterState::SDPrintingFinished) && card.mounted) {
   1923c:	83 30       	cpi	r24, 0x03	; 3
   1923e:	09 f0       	breq	.+2      	; 0x19242 <lcd_main_menu() [clone .lto_priv.420]+0x4e>
   19240:	5d c0       	rjmp	.+186    	; 0x192fc <lcd_main_menu() [clone .lto_priv.420]+0x108>
   19242:	80 91 d8 13 	lds	r24, 0x13D8	; 0x8013d8 <card+0x3>
   19246:	88 23       	and	r24, r24
   19248:	41 f0       	breq	.+16     	; 0x1925a <lcd_main_menu() [clone .lto_priv.420]+0x66>
            MENU_ITEM_FUNCTION_P(_T(MSG_REPRINT), lcd_reprint_from_eeprom);
   1924a:	8d ef       	ldi	r24, 0xFD	; 253
   1924c:	97 e4       	ldi	r25, 0x47	; 71
   1924e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19252:	64 ed       	ldi	r22, 0xD4	; 212
   19254:	77 ec       	ldi	r23, 0xC7	; 199
        } else if ((GetPrinterState() == PrinterState::HostPrintingFinished) && M79_timer_get_status()) {
            MENU_ITEM_FUNCTION_P(_T(MSG_REPRINT), lcd_send_action_start);
   19256:	0e 94 9d 72 	call	0xe53a	; 0xe53a <menu_item_function_P(char const*, void (*)())>
        }
    }

    // Menu is never shown when idle
    if (babystep_allowed_strict() && (printJobOngoing() || lcd_commands_type == LcdCommands::Layer1Cal))
   1925a:	0e 94 7b 66 	call	0xccf6	; 0xccf6 <babystep_allowed_strict()>
   1925e:	88 23       	and	r24, r24
   19260:	81 f0       	breq	.+32     	; 0x19282 <lcd_main_menu() [clone .lto_priv.420]+0x8e>
   19262:	0e 94 40 66 	call	0xcc80	; 0xcc80 <printJobOngoing()>
   19266:	81 11       	cpse	r24, r1
   19268:	04 c0       	rjmp	.+8      	; 0x19272 <lcd_main_menu() [clone .lto_priv.420]+0x7e>
   1926a:	80 91 5e 0d 	lds	r24, 0x0D5E	; 0x800d5e <lcd_commands_type>
   1926e:	84 30       	cpi	r24, 0x04	; 4
   19270:	41 f4       	brne	.+16     	; 0x19282 <lcd_main_menu() [clone .lto_priv.420]+0x8e>
        MENU_ITEM_SUBMENU_P(_T(MSG_BABYSTEP_Z), lcd_babystep_z);//8
   19272:	8d ee       	ldi	r24, 0xED	; 237
   19274:	97 e4       	ldi	r25, 0x47	; 71
   19276:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1927a:	68 e6       	ldi	r22, 0x68	; 104
   1927c:	77 ed       	ldi	r23, 0xD7	; 215
   1927e:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>

    if (farm_mode)
   19282:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   19286:	88 23       	and	r24, r24
   19288:	41 f0       	breq	.+16     	; 0x1929a <lcd_main_menu() [clone .lto_priv.420]+0xa6>
        MENU_ITEM_FUNCTION_P(_T(MSG_FILAMENTCHANGE), lcd_colorprint_change);//8
   1928a:	82 e4       	ldi	r24, 0x42	; 66
   1928c:	98 e4       	ldi	r25, 0x48	; 72
   1928e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19292:	65 ea       	ldi	r22, 0xA5	; 165
   19294:	7e ed       	ldi	r23, 0xDE	; 222
   19296:	0e 94 9d 72 	call	0xe53a	; 0xe53a <menu_item_function_P(char const*, void (*)())>

    if (!printer_recovering()) {
   1929a:	0e 94 2b 66 	call	0xcc56	; 0xcc56 <printer_recovering()>
   1929e:	81 11       	cpse	r24, r1
   192a0:	61 c0       	rjmp	.+194    	; 0x19364 <lcd_main_menu() [clone .lto_priv.420]+0x170>
}

//return the nr of buffered moves
FORCE_INLINE uint8_t moves_planned() {
    return (block_buffer_head + BLOCK_BUFFER_SIZE - block_buffer_tail) & (BLOCK_BUFFER_SIZE - 1);
   192a2:	80 91 3e 0d 	lds	r24, 0x0D3E	; 0x800d3e <block_buffer_head>
   192a6:	90 91 3f 0d 	lds	r25, 0x0D3F	; 0x800d3f <block_buffer_tail>
   192aa:	89 1b       	sub	r24, r25
   192ac:	8f 70       	andi	r24, 0x0F	; 15
        if ( moves_planned() || printer_active()
#ifdef FANCHECK
         || fan_check_error == EFCE_REPORTED
   192ae:	a9 f5       	brne	.+106    	; 0x1931a <lcd_main_menu() [clone .lto_priv.420]+0x126>

    if (farm_mode)
        MENU_ITEM_FUNCTION_P(_T(MSG_FILAMENTCHANGE), lcd_colorprint_change);//8

    if (!printer_recovering()) {
        if ( moves_planned() || printer_active()
   192b0:	0e 94 91 66 	call	0xcd22	; 0xcd22 <printer_active()>
   192b4:	81 11       	cpse	r24, r1
   192b6:	31 c0       	rjmp	.+98     	; 0x1931a <lcd_main_menu() [clone .lto_priv.420]+0x126>
#ifdef FANCHECK
         || fan_check_error == EFCE_REPORTED
   192b8:	80 91 ce 03 	lds	r24, 0x03CE	; 0x8003ce <fan_check_error>
   192bc:	82 30       	cpi	r24, 0x02	; 2
   192be:	69 f1       	breq	.+90     	; 0x1931a <lcd_main_menu() [clone .lto_priv.420]+0x126>
#endif //End FANCHECK
        ) {
            MENU_ITEM_SUBMENU_P(_T(MSG_TUNE), lcd_tune_menu);
        } else if (!Stopped) {
   192c0:	80 91 3b 12 	lds	r24, 0x123B	; 0x80123b <Stopped>
   192c4:	81 11       	cpse	r24, r1
   192c6:	31 c0       	rjmp	.+98     	; 0x1932a <lcd_main_menu() [clone .lto_priv.420]+0x136>
            MENU_ITEM_SUBMENU_P(_T(MSG_PREHEAT), lcd_preheat_menu);
   192c8:	8c ed       	ldi	r24, 0xDC	; 220
   192ca:	97 e4       	ldi	r25, 0x47	; 71
   192cc:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   192d0:	66 e7       	ldi	r22, 0x76	; 118
   192d2:	77 e3       	ldi	r23, 0x37	; 55
   192d4:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
            if (M79_timer_get_status()) {
   192d8:	80 91 8c 03 	lds	r24, 0x038C	; 0x80038c <_ZL9M79_timer.lto_priv.421>
   192dc:	88 23       	and	r24, r24
   192de:	29 f1       	breq	.+74     	; 0x1932a <lcd_main_menu() [clone .lto_priv.420]+0x136>
                #ifndef REPLACE_SETREADY
                if(GetPrinterState() == PrinterState::IsReady) {
   192e0:	80 91 61 0d 	lds	r24, 0x0D61	; 0x800d61 <_ZL13printer_state.lto_priv.386>
   192e4:	81 30       	cpi	r24, 0x01	; 1
   192e6:	09 f0       	breq	.+2      	; 0x192ea <lcd_main_menu() [clone .lto_priv.420]+0xf6>
   192e8:	45 c1       	rjmp	.+650    	; 0x19574 <lcd_main_menu() [clone .lto_priv.420]+0x380>
                    MENU_ITEM_FUNCTION_P(_T(MSG_SET_NOT_READY), lcd_printer_ready_state_toggle);
   192ea:	8c ec       	ldi	r24, 0xCC	; 204
   192ec:	97 e4       	ldi	r25, 0x47	; 71
                } else {
                    MENU_ITEM_FUNCTION_P(_T(MSG_SET_READY), lcd_printer_ready_state_toggle);
   192ee:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   192f2:	63 ec       	ldi	r22, 0xC3	; 195
   192f4:	7e eb       	ldi	r23, 0xBE	; 190
   192f6:	0e 94 9d 72 	call	0xe53a	; 0xe53a <menu_item_function_P(char const*, void (*)())>
   192fa:	17 c0       	rjmp	.+46     	; 0x1932a <lcd_main_menu() [clone .lto_priv.420]+0x136>

    // Menu item for reprint
    if (!printer_active() && !printer_recovering() && (heating_status == HeatingStatus::NO_HEATING)) {
        if ((GetPrinterState() == PrinterState::SDPrintingFinished) && card.mounted) {
            MENU_ITEM_FUNCTION_P(_T(MSG_REPRINT), lcd_reprint_from_eeprom);
        } else if ((GetPrinterState() == PrinterState::HostPrintingFinished) && M79_timer_get_status()) {
   192fc:	84 30       	cpi	r24, 0x04	; 4
   192fe:	09 f0       	breq	.+2      	; 0x19302 <lcd_main_menu() [clone .lto_priv.420]+0x10e>
   19300:	ac cf       	rjmp	.-168    	; 0x1925a <lcd_main_menu() [clone .lto_priv.420]+0x66>
   19302:	80 91 8c 03 	lds	r24, 0x038C	; 0x80038c <_ZL9M79_timer.lto_priv.421>
   19306:	88 23       	and	r24, r24
   19308:	09 f4       	brne	.+2      	; 0x1930c <lcd_main_menu() [clone .lto_priv.420]+0x118>
   1930a:	a7 cf       	rjmp	.-178    	; 0x1925a <lcd_main_menu() [clone .lto_priv.420]+0x66>
            MENU_ITEM_FUNCTION_P(_T(MSG_REPRINT), lcd_send_action_start);
   1930c:	8d ef       	ldi	r24, 0xFD	; 253
   1930e:	97 e4       	ldi	r25, 0x47	; 71
   19310:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19314:	6d eb       	ldi	r22, 0xBD	; 189
   19316:	7e eb       	ldi	r23, 0xBE	; 190
   19318:	9e cf       	rjmp	.-196    	; 0x19256 <lcd_main_menu() [clone .lto_priv.420]+0x62>
        if ( moves_planned() || printer_active()
#ifdef FANCHECK
         || fan_check_error == EFCE_REPORTED
#endif //End FANCHECK
        ) {
            MENU_ITEM_SUBMENU_P(_T(MSG_TUNE), lcd_tune_menu);
   1931a:	86 ee       	ldi	r24, 0xE6	; 230
   1931c:	97 e4       	ldi	r25, 0x47	; 71
   1931e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19322:	67 e2       	ldi	r22, 0x27	; 39
   19324:	7c ec       	ldi	r23, 0xCC	; 204
   19326:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
                #else
                    MENU_ITEM_FUNCTION_P(_T(MSG_HOSTPRINT), lcd_send_action_start);
                #endif //REPLACE_SETREADY
            }
        }
        if (mesh_bed_leveling_flag == false && homing_flag == false && !printingIsPaused() && !processing_tcode) {
   1932a:	c0 91 72 12 	lds	r28, 0x1272	; 0x801272 <mesh_bed_leveling_flag>
   1932e:	0e 94 35 66 	call	0xcc6a	; 0xcc6a <printingIsPaused()>
   19332:	c1 11       	cpse	r28, r1
   19334:	17 c0       	rjmp	.+46     	; 0x19364 <lcd_main_menu() [clone .lto_priv.420]+0x170>
   19336:	90 91 71 12 	lds	r25, 0x1271	; 0x801271 <homing_flag>
   1933a:	91 11       	cpse	r25, r1
   1933c:	13 c0       	rjmp	.+38     	; 0x19364 <lcd_main_menu() [clone .lto_priv.420]+0x170>
   1933e:	81 11       	cpse	r24, r1
   19340:	15 c0       	rjmp	.+42     	; 0x1936c <lcd_main_menu() [clone .lto_priv.420]+0x178>
   19342:	80 91 91 03 	lds	r24, 0x0391	; 0x800391 <processing_tcode>
   19346:	81 11       	cpse	r24, r1
   19348:	0d c0       	rjmp	.+26     	; 0x19364 <lcd_main_menu() [clone .lto_priv.420]+0x170>
            if (usb_timer.running()) {
   1934a:	80 91 42 12 	lds	r24, 0x1242	; 0x801242 <usb_timer>
   1934e:	88 23       	and	r24, r24
   19350:	09 f4       	brne	.+2      	; 0x19354 <lcd_main_menu() [clone .lto_priv.420]+0x160>
   19352:	13 c1       	rjmp	.+550    	; 0x1957a <lcd_main_menu() [clone .lto_priv.420]+0x386>
                MENU_ITEM_FUNCTION_P(_T(MSG_PAUSE_PRINT), lcd_pause_usb_print);
   19354:	82 eb       	ldi	r24, 0xB2	; 178
   19356:	97 e4       	ldi	r25, 0x47	; 71
   19358:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1935c:	62 eb       	ldi	r22, 0xB2	; 178
   1935e:	78 e3       	ldi	r23, 0x38	; 56
            } else if (IS_SD_PRINTING) {
                MENU_ITEM_FUNCTION_P(_T(MSG_PAUSE_PRINT), lcd_pause_print);
   19360:	0e 94 9d 72 	call	0xe53a	; 0xe53a <menu_item_function_P(char const*, void (*)())>
            }
        }
    }
    if (printingIsPaused()
   19364:	0e 94 35 66 	call	0xcc6a	; 0xcc6a <printingIsPaused()>
        && !get_temp_error()
#ifdef FANCHECK
        && fan_check_error != EFCE_REPORTED
#endif //FANCHECK
        && (saved_printing_type != PowerPanic::PRINT_TYPE_NONE || saved_printing)
        && custom_message_type != CustomMsg::Resuming) {
   19368:	88 23       	and	r24, r24
   1936a:	f1 f0       	breq	.+60     	; 0x193a8 <lcd_main_menu() [clone .lto_priv.420]+0x1b4>
    temp_error_state.assert = true;
}

bool get_temp_error()
{
    return temp_error_state.v;
   1936c:	80 91 cc 03 	lds	r24, 0x03CC	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
            }
        }
    }
    if (printingIsPaused()
        // only allow resuming if hardware errors (temperature or fan) are cleared
        && !get_temp_error()
   19370:	81 11       	cpse	r24, r1
   19372:	1a c0       	rjmp	.+52     	; 0x193a8 <lcd_main_menu() [clone .lto_priv.420]+0x1b4>
#ifdef FANCHECK
        && fan_check_error != EFCE_REPORTED
   19374:	80 91 ce 03 	lds	r24, 0x03CE	; 0x8003ce <fan_check_error>
   19378:	82 30       	cpi	r24, 0x02	; 2
   1937a:	b1 f0       	breq	.+44     	; 0x193a8 <lcd_main_menu() [clone .lto_priv.420]+0x1b4>
#endif //FANCHECK
        && (saved_printing_type != PowerPanic::PRINT_TYPE_NONE || saved_printing)
   1937c:	80 91 79 02 	lds	r24, 0x0279	; 0x800279 <saved_printing_type>
   19380:	82 30       	cpi	r24, 0x02	; 2
   19382:	21 f4       	brne	.+8      	; 0x1938c <lcd_main_menu() [clone .lto_priv.420]+0x198>
   19384:	90 91 73 12 	lds	r25, 0x1273	; 0x801273 <saved_printing>
   19388:	99 23       	and	r25, r25
   1938a:	71 f0       	breq	.+28     	; 0x193a8 <lcd_main_menu() [clone .lto_priv.420]+0x1b4>
        && custom_message_type != CustomMsg::Resuming) {
   1938c:	90 91 5d 06 	lds	r25, 0x065D	; 0x80065d <custom_message_type>
   19390:	98 30       	cpi	r25, 0x08	; 8
   19392:	51 f0       	breq	.+20     	; 0x193a8 <lcd_main_menu() [clone .lto_priv.420]+0x1b4>
        if (saved_printing_type == PowerPanic::PRINT_TYPE_SD) {
   19394:	81 11       	cpse	r24, r1
   19396:	fd c0       	rjmp	.+506    	; 0x19592 <lcd_main_menu() [clone .lto_priv.420]+0x39e>
                MENU_ITEM_SUBMENU_P(_T(MSG_RESUME_PRINT), lcd_resume_print);
   19398:	83 ea       	ldi	r24, 0xA3	; 163
   1939a:	97 e4       	ldi	r25, 0x47	; 71
   1939c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   193a0:	69 eb       	ldi	r22, 0xB9	; 185
   193a2:	7e ed       	ldi	r23, 0xDE	; 222
        } else if ((saved_printing_type == PowerPanic::PRINT_TYPE_HOST) && (M79_timer_get_status())) {
                MENU_ITEM_SUBMENU_P(_T(MSG_RESUME_PRINT), lcd_resume_usb_print);
   193a4:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
        }
    }
    if((printJobOngoing() || printingIsPaused() || (printer_recovering()))
   193a8:	0e 94 40 66 	call	0xcc80	; 0xcc80 <printJobOngoing()>
        && (custom_message_type != CustomMsg::MeshBedLeveling) && !processing_tcode) {
   193ac:	81 11       	cpse	r24, r1
   193ae:	08 c0       	rjmp	.+16     	; 0x193c0 <lcd_main_menu() [clone .lto_priv.420]+0x1cc>
                MENU_ITEM_SUBMENU_P(_T(MSG_RESUME_PRINT), lcd_resume_print);
        } else if ((saved_printing_type == PowerPanic::PRINT_TYPE_HOST) && (M79_timer_get_status())) {
                MENU_ITEM_SUBMENU_P(_T(MSG_RESUME_PRINT), lcd_resume_usb_print);
        }
    }
    if((printJobOngoing() || printingIsPaused() || (printer_recovering()))
   193b0:	0e 94 35 66 	call	0xcc6a	; 0xcc6a <printingIsPaused()>
   193b4:	81 11       	cpse	r24, r1
   193b6:	04 c0       	rjmp	.+8      	; 0x193c0 <lcd_main_menu() [clone .lto_priv.420]+0x1cc>
   193b8:	0e 94 2b 66 	call	0xcc56	; 0xcc56 <printer_recovering()>
   193bc:	88 23       	and	r24, r24
   193be:	81 f0       	breq	.+32     	; 0x193e0 <lcd_main_menu() [clone .lto_priv.420]+0x1ec>
        && (custom_message_type != CustomMsg::MeshBedLeveling) && !processing_tcode) {
   193c0:	80 91 5d 06 	lds	r24, 0x065D	; 0x80065d <custom_message_type>
   193c4:	81 30       	cpi	r24, 0x01	; 1
   193c6:	61 f0       	breq	.+24     	; 0x193e0 <lcd_main_menu() [clone .lto_priv.420]+0x1ec>
   193c8:	80 91 91 03 	lds	r24, 0x0391	; 0x800391 <processing_tcode>
   193cc:	81 11       	cpse	r24, r1
   193ce:	08 c0       	rjmp	.+16     	; 0x193e0 <lcd_main_menu() [clone .lto_priv.420]+0x1ec>
        MENU_ITEM_SUBMENU_P(_T(MSG_STOP_PRINT), lcd_sdcard_stop);
   193d0:	84 ea       	ldi	r24, 0xA4	; 164
   193d2:	98 e4       	ldi	r25, 0x48	; 72
   193d4:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   193d8:	65 e2       	ldi	r22, 0x25	; 37
   193da:	72 ec       	ldi	r23, 0xC2	; 194
   193dc:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
        MENU_ITEM_SUBMENU_P(_T(MSG_TM_ACK_ERROR), lcd_print_stop);
    }
#endif

    // only allow starting SD print if hardware errors (temperature or fan) are cleared
    if (!printer_recovering() && !printer_active() && !get_temp_error()
   193e0:	0e 94 2b 66 	call	0xcc56	; 0xcc56 <printer_recovering()>
#ifdef FANCHECK
        && fan_check_error != EFCE_REPORTED
   193e4:	81 11       	cpse	r24, r1
   193e6:	95 c0       	rjmp	.+298    	; 0x19512 <lcd_main_menu() [clone .lto_priv.420]+0x31e>
        MENU_ITEM_SUBMENU_P(_T(MSG_TM_ACK_ERROR), lcd_print_stop);
    }
#endif

    // only allow starting SD print if hardware errors (temperature or fan) are cleared
    if (!printer_recovering() && !printer_active() && !get_temp_error()
   193e8:	0e 94 91 66 	call	0xcd22	; 0xcd22 <printer_active()>
   193ec:	81 11       	cpse	r24, r1
   193ee:	91 c0       	rjmp	.+290    	; 0x19512 <lcd_main_menu() [clone .lto_priv.420]+0x31e>
   193f0:	80 91 cc 03 	lds	r24, 0x03CC	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
   193f4:	81 11       	cpse	r24, r1
   193f6:	8d c0       	rjmp	.+282    	; 0x19512 <lcd_main_menu() [clone .lto_priv.420]+0x31e>
#ifdef FANCHECK
        && fan_check_error != EFCE_REPORTED
   193f8:	80 91 ce 03 	lds	r24, 0x03CE	; 0x8003ce <fan_check_error>
   193fc:	82 30       	cpi	r24, 0x02	; 2
   193fe:	09 f4       	brne	.+2      	; 0x19402 <lcd_main_menu() [clone .lto_priv.420]+0x20e>
   19400:	88 c0       	rjmp	.+272    	; 0x19512 <lcd_main_menu() [clone .lto_priv.420]+0x31e>
#endif //FANCHECK
        ) {
#ifdef SDSUPPORT //!@todo SDSUPPORT undefined creates several issues in source code
            if (card.mounted
   19402:	80 91 d8 13 	lds	r24, 0x13D8	; 0x8013d8 <card+0x3>
   19406:	81 11       	cpse	r24, r1
   19408:	05 c0       	rjmp	.+10     	; 0x19414 <lcd_main_menu() [clone .lto_priv.420]+0x220>
                || lcd_commands_type != LcdCommands::Idle) {
   1940a:	80 91 5e 0d 	lds	r24, 0x0D5E	; 0x800d5e <lcd_commands_type>
   1940e:	88 23       	and	r24, r24
   19410:	09 f4       	brne	.+2      	; 0x19414 <lcd_main_menu() [clone .lto_priv.420]+0x220>
   19412:	ce c0       	rjmp	.+412    	; 0x195b0 <lcd_main_menu() [clone .lto_priv.420]+0x3bc>
                if (!card.isFileOpen()) {
   19414:	80 91 6a 16 	lds	r24, 0x166A	; 0x80166a <card+0x295>
   19418:	81 11       	cpse	r24, r1
   1941a:	12 c0       	rjmp	.+36     	; 0x19440 <lcd_main_menu() [clone .lto_priv.420]+0x24c>
                    if (!usb_timer.running() && (lcd_commands_type == LcdCommands::Idle)) {
   1941c:	80 91 42 12 	lds	r24, 0x1242	; 0x801242 <usb_timer>
   19420:	81 11       	cpse	r24, r1
   19422:	0e c0       	rjmp	.+28     	; 0x19440 <lcd_main_menu() [clone .lto_priv.420]+0x24c>
   19424:	80 91 5e 0d 	lds	r24, 0x0D5E	; 0x800d5e <lcd_commands_type>
   19428:	81 11       	cpse	r24, r1
   1942a:	0a c0       	rjmp	.+20     	; 0x19440 <lcd_main_menu() [clone .lto_priv.420]+0x24c>
                        bMain=true;               // flag ('fake parameter') for 'lcd_sdcard_menu()' function
   1942c:	d0 93 c9 03 	sts	0x03C9, r29	; 0x8003c9 <bMain>
                        MENU_ITEM_SUBMENU_P(_T(MSG_CARD_MENU), lcd_sdcard_menu);
   19430:	83 e9       	ldi	r24, 0x93	; 147
   19432:	97 e4       	ldi	r25, 0x47	; 71
   19434:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19438:	60 ea       	ldi	r22, 0xA0	; 160
   1943a:	75 ee       	ldi	r23, 0xE5	; 229
   1943c:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
#if SDCARDDETECT < 1
            MENU_ITEM_GCODE_P(_T(MSG_INIT_SDCARD), PSTR("M21")); // Manually initialize the SD-card via user interface
#endif //SDCARDDETECT
         }
#endif //SDSUPPORT
        if(!farm_mode) {
   19440:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   19444:	81 11       	cpse	r24, r1
   19446:	12 c0       	rjmp	.+36     	; 0x1946c <lcd_main_menu() [clone .lto_priv.420]+0x278>
            const int8_t sheet = eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet));
   19448:	81 ea       	ldi	r24, 0xA1	; 161
   1944a:	9d e0       	ldi	r25, 0x0D	; 13
   1944c:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   19450:	c8 2f       	mov	r28, r24
            const int8_t nextSheet = eeprom_next_initialized_sheet(sheet);
   19452:	0e 94 96 78 	call	0xf12c	; 0xf12c <eeprom_next_initialized_sheet(signed char)>
            if ((nextSheet >= 0) && (sheet != nextSheet)) { // show menu only if we have 2 or more sheets initialized
   19456:	87 fd       	sbrc	r24, 7
   19458:	09 c0       	rjmp	.+18     	; 0x1946c <lcd_main_menu() [clone .lto_priv.420]+0x278>
   1945a:	c8 17       	cp	r28, r24
   1945c:	39 f0       	breq	.+14     	; 0x1946c <lcd_main_menu() [clone .lto_priv.420]+0x278>
                MENU_ITEM_FUNCTION_E(EEPROM_Sheets_base->s[sheet], eeprom_switch_to_next_sheet);
   1945e:	c1 02       	muls	r28, r17
   19460:	c0 01       	movw	r24, r0
   19462:	11 24       	eor	r1, r1
   19464:	87 5b       	subi	r24, 0xB7	; 183
   19466:	92 4f       	sbci	r25, 0xF2	; 242
   19468:	0e 94 2f be 	call	0x17c5e	; 0x17c5e <menu_item_function_E(Sheet const&, void (*)()) [clone .constprop.16]>
            SETTINGS_NOZZLE;
#endif //QUICK_NOZZLE_CHANGE

        }

        if (!((eFilamentAction != FilamentAction::None) || Stopped )) {
   1946c:	80 91 94 03 	lds	r24, 0x0394	; 0x800394 <eFilamentAction>
   19470:	81 11       	cpse	r24, r1
   19472:	4f c0       	rjmp	.+158    	; 0x19512 <lcd_main_menu() [clone .lto_priv.420]+0x31e>
   19474:	80 91 3b 12 	lds	r24, 0x123B	; 0x80123b <Stopped>
   19478:	81 11       	cpse	r24, r1
   1947a:	4b c0       	rjmp	.+150    	; 0x19512 <lcd_main_menu() [clone .lto_priv.420]+0x31e>
            if (MMU2::mmu2.Enabled()) {
   1947c:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   19480:	81 30       	cpi	r24, 0x01	; 1
   19482:	09 f0       	breq	.+2      	; 0x19486 <lcd_main_menu() [clone .lto_priv.420]+0x292>
   19484:	9e c0       	rjmp	.+316    	; 0x195c2 <lcd_main_menu() [clone .lto_priv.420]+0x3ce>
                if(!MMU2::mmu2.FindaDetectsFilament() && !fsensor.getFilamentPresent()) {
   19486:	80 91 d7 12 	lds	r24, 0x12D7	; 0x8012d7 <MMU2::mmu2+0x45>
   1948a:	81 11       	cpse	r24, r1
   1948c:	0c c0       	rjmp	.+24     	; 0x194a6 <lcd_main_menu() [clone .lto_priv.420]+0x2b2>
   1948e:	80 91 fe 16 	lds	r24, 0x16FE	; 0x8016fe <fsensor+0xd>
   19492:	81 11       	cpse	r24, r1
   19494:	08 c0       	rjmp	.+16     	; 0x194a6 <lcd_main_menu() [clone .lto_priv.420]+0x2b2>
                    // The MMU 'Load filament' state machine will reject the command if any
                    // filament sensor is reporting a detected filament
                    MENU_ITEM_SUBMENU_P(_T(MSG_PRELOAD_TO_MMU), mmu_preload_filament_menu);
   19496:	85 e7       	ldi	r24, 0x75	; 117
   19498:	97 e4       	ldi	r25, 0x47	; 71
   1949a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1949e:	62 e9       	ldi	r22, 0x92	; 146
   194a0:	7f ec       	ldi	r23, 0xCF	; 207
   194a2:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
            }
                MENU_ITEM_SUBMENU_P(_T(MSG_LOAD_TO_NOZZLE), lcd_mmuLoadFilament);
   194a6:	84 e6       	ldi	r24, 0x64	; 100
   194a8:	97 e4       	ldi	r25, 0x47	; 71
   194aa:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   194ae:	69 ec       	ldi	r22, 0xC9	; 201
   194b0:	7f ec       	ldi	r23, 0xCF	; 207
   194b2:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
                MENU_ITEM_SUBMENU_P(_T(MSG_UNLOAD_FILAMENT), lcd_mmuUnloadFilament);
   194b6:	82 e5       	ldi	r24, 0x52	; 82
   194b8:	97 e4       	ldi	r25, 0x47	; 71
   194ba:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   194be:	6c ec       	ldi	r22, 0xCC	; 204
   194c0:	7f ec       	ldi	r23, 0xCF	; 207
   194c2:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
                MENU_ITEM_SUBMENU_P(_T(MSG_EJECT_FROM_MMU), lcd_mmuEjectFilament);
   194c6:	8c ed       	ldi	r24, 0xDC	; 220
   194c8:	91 e6       	ldi	r25, 0x61	; 97
   194ca:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   194ce:	6f ec       	ldi	r22, 0xCF	; 207
   194d0:	7f ec       	ldi	r23, 0xCF	; 207
   194d2:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
#ifdef  MMU_HAS_CUTTER
                if (eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED) != 0) {
   194d6:	8e ec       	ldi	r24, 0xCE	; 206
   194d8:	9e e0       	ldi	r25, 0x0E	; 14
   194da:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   194de:	88 23       	and	r24, r24
   194e0:	41 f0       	breq	.+16     	; 0x194f2 <lcd_main_menu() [clone .lto_priv.420]+0x2fe>
                    MENU_ITEM_SUBMENU_P(_T(MSG_CUT_FILAMENT), lcd_mmuCutFilament);
   194e2:	8d ec       	ldi	r24, 0xCD	; 205
   194e4:	91 e6       	ldi	r25, 0x61	; 97
   194e6:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   194ea:	62 ed       	ldi	r22, 0xD2	; 210
   194ec:	7f ec       	ldi	r23, 0xCF	; 207
                    }
#endif //REMOVE_AUTOLOAD_FILAMENT_MENU_ENTRY 
                } else {
#endif //FILAMENT_SENSOR
                    MENU_ITEM_SUBMENU_P(_T(MSG_LOAD_FILAMENT), lcd_LoadFilament);
                    MENU_ITEM_SUBMENU_P(_T(MSG_UNLOAD_FILAMENT), lcd_unLoadFilament);
   194ee:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
#ifdef FILAMENT_SENSOR
                }
#endif //FILAMENT_SENSOR
            }
            MENU_ITEM_SUBMENU_P(_T(MSG_SETTINGS), lcd_settings_menu);
   194f2:	8e e8       	ldi	r24, 0x8E	; 142
   194f4:	98 e4       	ldi	r25, 0x48	; 72
   194f6:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   194fa:	65 ee       	ldi	r22, 0xE5	; 229
   194fc:	7c ec       	ldi	r23, 0xCC	; 204
   194fe:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
            MENU_ITEM_SUBMENU_P(_T(MSG_CALIBRATION), lcd_calibration_menu);
   19502:	80 e2       	ldi	r24, 0x20	; 32
   19504:	97 e4       	ldi	r25, 0x47	; 71
   19506:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1950a:	61 e4       	ldi	r22, 0x41	; 65
   1950c:	7e ec       	ldi	r23, 0xCE	; 206
   1950e:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
        }
    }

        MENU_ITEM_SUBMENU_P(_T(MSG_STATISTICS), lcd_menu_statistics);
   19512:	83 e1       	ldi	r24, 0x13	; 19
   19514:	97 e4       	ldi	r25, 0x47	; 71
   19516:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1951a:	60 e3       	ldi	r22, 0x30	; 48
   1951c:	77 e3       	ldi	r23, 0x37	; 55
   1951e:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>

#if defined(TMC2130) || defined(FILAMENT_SENSOR)
        MENU_ITEM_SUBMENU_P(_T(MSG_FAIL_STATS), lcd_menu_fails_stats);
   19522:	86 e0       	ldi	r24, 0x06	; 6
   19524:	97 e4       	ldi	r25, 0x47	; 71
   19526:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1952a:	64 eb       	ldi	r22, 0xB4	; 180
   1952c:	78 e3       	ldi	r23, 0x38	; 56
   1952e:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
#endif
    if (MMU2::mmu2.Enabled()) {
   19532:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   19536:	81 30       	cpi	r24, 0x01	; 1
   19538:	41 f4       	brne	.+16     	; 0x1954a <lcd_main_menu() [clone .lto_priv.420]+0x356>
        MENU_ITEM_SUBMENU_P(_T(MSG_MMU_FAIL_STATS), lcd_menu_fails_stats_mmu);
   1953a:	85 ef       	ldi	r24, 0xF5	; 245
   1953c:	96 e4       	ldi	r25, 0x46	; 70
   1953e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19542:	64 ed       	ldi	r22, 0xD4	; 212
   19544:	76 e3       	ldi	r23, 0x36	; 54
   19546:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
    if (!printer_active() && M79_timer_get_status()) {
        MENU_ITEM_FUNCTION_P(_T(MSG_SHUTDOWN_HOST), lcd_shutdown_menu);
    }
#endif //HOST_SHUTOWN

    MENU_ITEM_SUBMENU_P(_T(MSG_SUPPORT), lcd_support_menu);
   1954a:	8b ee       	ldi	r24, 0xEB	; 235
   1954c:	96 e4       	ldi	r25, 0x46	; 70
   1954e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19552:	62 ee       	ldi	r22, 0xE2	; 226
   19554:	76 e3       	ldi	r23, 0x36	; 54
   19556:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>

    MENU_END();
   1955a:	0e 94 83 62 	call	0xc506	; 0xc506 <menu_end()>
//! | Support            | allways
//! @endcode
static void lcd_main_menu()
{

    MENU_BEGIN();
   1955e:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   19562:	8f 5f       	subi	r24, 0xFF	; 255
   19564:	80 93 60 04 	sts	0x0460, r24	; 0x800460 <menu_row>
   19568:	80 91 62 04 	lds	r24, 0x0462	; 0x800462 <menu_line>
   1956c:	8f 5f       	subi	r24, 0xFF	; 255
   1956e:	80 93 62 04 	sts	0x0462, r24	; 0x800462 <menu_line>
   19572:	49 ce       	rjmp	.-878    	; 0x19206 <lcd_main_menu() [clone .lto_priv.420]+0x12>
            if (M79_timer_get_status()) {
                #ifndef REPLACE_SETREADY
                if(GetPrinterState() == PrinterState::IsReady) {
                    MENU_ITEM_FUNCTION_P(_T(MSG_SET_NOT_READY), lcd_printer_ready_state_toggle);
                } else {
                    MENU_ITEM_FUNCTION_P(_T(MSG_SET_READY), lcd_printer_ready_state_toggle);
   19574:	80 ec       	ldi	r24, 0xC0	; 192
   19576:	97 e4       	ldi	r25, 0x47	; 71
   19578:	ba ce       	rjmp	.-652    	; 0x192ee <lcd_main_menu() [clone .lto_priv.420]+0xfa>
            }
        }
        if (mesh_bed_leveling_flag == false && homing_flag == false && !printingIsPaused() && !processing_tcode) {
            if (usb_timer.running()) {
                MENU_ITEM_FUNCTION_P(_T(MSG_PAUSE_PRINT), lcd_pause_usb_print);
            } else if (IS_SD_PRINTING) {
   1957a:	80 91 d7 13 	lds	r24, 0x13D7	; 0x8013d7 <card+0x2>
   1957e:	88 23       	and	r24, r24
   19580:	09 f4       	brne	.+2      	; 0x19584 <lcd_main_menu() [clone .lto_priv.420]+0x390>
   19582:	f0 ce       	rjmp	.-544    	; 0x19364 <lcd_main_menu() [clone .lto_priv.420]+0x170>
                MENU_ITEM_FUNCTION_P(_T(MSG_PAUSE_PRINT), lcd_pause_print);
   19584:	82 eb       	ldi	r24, 0xB2	; 178
   19586:	97 e4       	ldi	r25, 0x47	; 71
   19588:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1958c:	6c ea       	ldi	r22, 0xAC	; 172
   1958e:	78 e3       	ldi	r23, 0x38	; 56
   19590:	e7 ce       	rjmp	.-562    	; 0x19360 <lcd_main_menu() [clone .lto_priv.420]+0x16c>
#endif //FANCHECK
        && (saved_printing_type != PowerPanic::PRINT_TYPE_NONE || saved_printing)
        && custom_message_type != CustomMsg::Resuming) {
        if (saved_printing_type == PowerPanic::PRINT_TYPE_SD) {
                MENU_ITEM_SUBMENU_P(_T(MSG_RESUME_PRINT), lcd_resume_print);
        } else if ((saved_printing_type == PowerPanic::PRINT_TYPE_HOST) && (M79_timer_get_status())) {
   19592:	81 30       	cpi	r24, 0x01	; 1
   19594:	09 f0       	breq	.+2      	; 0x19598 <lcd_main_menu() [clone .lto_priv.420]+0x3a4>
   19596:	08 cf       	rjmp	.-496    	; 0x193a8 <lcd_main_menu() [clone .lto_priv.420]+0x1b4>
   19598:	80 91 8c 03 	lds	r24, 0x038C	; 0x80038c <_ZL9M79_timer.lto_priv.421>
   1959c:	88 23       	and	r24, r24
   1959e:	09 f4       	brne	.+2      	; 0x195a2 <lcd_main_menu() [clone .lto_priv.420]+0x3ae>
   195a0:	03 cf       	rjmp	.-506    	; 0x193a8 <lcd_main_menu() [clone .lto_priv.420]+0x1b4>
                MENU_ITEM_SUBMENU_P(_T(MSG_RESUME_PRINT), lcd_resume_usb_print);
   195a2:	83 ea       	ldi	r24, 0xA3	; 163
   195a4:	97 e4       	ldi	r25, 0x47	; 71
   195a6:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   195aa:	6b e8       	ldi	r22, 0x8B	; 139
   195ac:	7e ed       	ldi	r23, 0xDE	; 222
   195ae:	fa ce       	rjmp	.-524    	; 0x193a4 <lcd_main_menu() [clone .lto_priv.420]+0x1b0>
#if SDCARDDETECT < 1
             MENU_ITEM_GCODE_P(_T(MSG_CNG_SDCARD), PSTR("M21"));  // SD-card changed by user
#endif //SDCARDDETECT
                }
            } else {
                bMain=true;                                   // flag (i.e. 'fake parameter') for 'lcd_sdcard_menu()' function
   195b0:	d0 93 c9 03 	sts	0x03C9, r29	; 0x8003c9 <bMain>
                MENU_ITEM_BACK_P(_T(MSG_NO_CARD));
   195b4:	86 e8       	ldi	r24, 0x86	; 134
   195b6:	97 e4       	ldi	r25, 0x47	; 71
   195b8:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   195bc:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
   195c0:	3f cf       	rjmp	.-386    	; 0x19440 <lcd_main_menu() [clone .lto_priv.420]+0x24c>
                    MENU_ITEM_SUBMENU_P(_T(MSG_CUT_FILAMENT), lcd_mmuCutFilament);
                }
#endif //MMU_HAS_CUTTER
            } else {
#ifdef FILAMENT_SENSOR
                if (fsensor.isEnabled()) {
   195c2:	80 91 f1 16 	lds	r24, 0x16F1	; 0x8016f1 <fsensor>
   195c6:	88 23       	and	r24, r24
   195c8:	19 f1       	breq	.+70     	; 0x19610 <lcd_main_menu() [clone .lto_priv.420]+0x41c>
                    if (!fsensor.getAutoLoadEnabled()) {
   195ca:	80 91 f2 16 	lds	r24, 0x16F2	; 0x8016f2 <fsensor+0x1>
   195ce:	81 11       	cpse	r24, r1
   195d0:	08 c0       	rjmp	.+16     	; 0x195e2 <lcd_main_menu() [clone .lto_priv.420]+0x3ee>
                        MENU_ITEM_SUBMENU_P(_T(MSG_LOAD_FILAMENT), lcd_LoadFilament);
   195d2:	82 e4       	ldi	r24, 0x42	; 66
   195d4:	97 e4       	ldi	r25, 0x47	; 71
   195d6:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   195da:	62 e3       	ldi	r22, 0x32	; 50
   195dc:	78 e3       	ldi	r23, 0x38	; 56
   195de:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
                    }
                    if (fsensor.getFilamentPresent()) {
   195e2:	80 91 fe 16 	lds	r24, 0x16FE	; 0x8016fe <fsensor+0xd>
   195e6:	88 23       	and	r24, r24
   195e8:	39 f0       	breq	.+14     	; 0x195f8 <lcd_main_menu() [clone .lto_priv.420]+0x404>
                    }
#endif //REMOVE_AUTOLOAD_FILAMENT_MENU_ENTRY 
                } else {
#endif //FILAMENT_SENSOR
                    MENU_ITEM_SUBMENU_P(_T(MSG_LOAD_FILAMENT), lcd_LoadFilament);
                    MENU_ITEM_SUBMENU_P(_T(MSG_UNLOAD_FILAMENT), lcd_unLoadFilament);
   195ea:	82 e5       	ldi	r24, 0x52	; 82
   195ec:	97 e4       	ldi	r25, 0x47	; 71
   195ee:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   195f2:	60 e0       	ldi	r22, 0x00	; 0
   195f4:	78 e3       	ldi	r23, 0x38	; 56
   195f6:	7b cf       	rjmp	.-266    	; 0x194ee <lcd_main_menu() [clone .lto_priv.420]+0x2fa>
                    if (fsensor.getFilamentPresent()) {
                        MENU_ITEM_SUBMENU_P(_T(MSG_UNLOAD_FILAMENT), lcd_unLoadFilament);
                    }
#ifndef REMOVE_AUTOLOAD_FILAMENT_MENU_ENTRY
                    else {
                        if (fsensor.getAutoLoadEnabled()) {
   195f8:	80 91 f2 16 	lds	r24, 0x16F2	; 0x8016f2 <fsensor+0x1>
   195fc:	88 23       	and	r24, r24
   195fe:	09 f4       	brne	.+2      	; 0x19602 <lcd_main_menu() [clone .lto_priv.420]+0x40e>
   19600:	78 cf       	rjmp	.-272    	; 0x194f2 <lcd_main_menu() [clone .lto_priv.420]+0x2fe>
                            MENU_ITEM_SUBMENU_P(_T(MSG_AUTOLOAD_FILAMENT), lcd_menu_AutoLoadFilament);
   19602:	8e e2       	ldi	r24, 0x2E	; 46
   19604:	97 e4       	ldi	r25, 0x47	; 71
   19606:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1960a:	6a e0       	ldi	r22, 0x0A	; 10
   1960c:	78 e3       	ldi	r23, 0x38	; 56
   1960e:	6f cf       	rjmp	.-290    	; 0x194ee <lcd_main_menu() [clone .lto_priv.420]+0x2fa>
                        }                        
                    }
#endif //REMOVE_AUTOLOAD_FILAMENT_MENU_ENTRY 
                } else {
#endif //FILAMENT_SENSOR
                    MENU_ITEM_SUBMENU_P(_T(MSG_LOAD_FILAMENT), lcd_LoadFilament);
   19610:	82 e4       	ldi	r24, 0x42	; 66
   19612:	97 e4       	ldi	r25, 0x47	; 71
   19614:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19618:	62 e3       	ldi	r22, 0x32	; 50
   1961a:	78 e3       	ldi	r23, 0x38	; 56
   1961c:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
   19620:	e4 cf       	rjmp	.-56     	; 0x195ea <lcd_main_menu() [clone .lto_priv.420]+0x3f6>
#endif //HOST_SHUTOWN

    MENU_ITEM_SUBMENU_P(_T(MSG_SUPPORT), lcd_support_menu);

    MENU_END();
}
   19622:	df 91       	pop	r29
   19624:	cf 91       	pop	r28
   19626:	1f 91       	pop	r17
   19628:	08 95       	ret

0001962a <menuitems_temperature_common()>:
        }
#endif // TMC2130
    }
}

static void menuitems_temperature_common() {
   1962a:	ef 92       	push	r14
   1962c:	ff 92       	push	r15
   1962e:	0f 93       	push	r16
   19630:	1f 93       	push	r17
#if TEMP_SENSOR_0 != 0
    MENU_ITEM_EDIT_int3_jmp_P(_T(MSG_NOZZLE), &target_temperature[0], 0, HEATER_0_MAXTEMP - 10, LCD_JUMP_HOTEND_TEMP);
   19632:	8c ed       	ldi	r24, 0xDC	; 220
   19634:	94 e4       	ldi	r25, 0x44	; 68
   19636:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1963a:	28 ec       	ldi	r18, 0xC8	; 200
   1963c:	e2 2e       	mov	r14, r18
   1963e:	f1 2c       	mov	r15, r1
   19640:	07 e2       	ldi	r16, 0x27	; 39
   19642:	11 e0       	ldi	r17, 0x01	; 1
   19644:	30 e0       	ldi	r19, 0x00	; 0
   19646:	20 e0       	ldi	r18, 0x00	; 0
   19648:	40 e1       	ldi	r20, 0x10	; 16
   1964a:	6d e5       	ldi	r22, 0x5D	; 93
   1964c:	72 e1       	ldi	r23, 0x12	; 18
   1964e:	0e 94 6e 6f 	call	0xdedc	; 0xdedc <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)>
#endif
#if TEMP_SENSOR_BED != 0
    MENU_ITEM_EDIT_int3_jmp_P(_T(MSG_BED), &target_temperature_bed, 0, BED_MAXTEMP - 5, LCD_JUMP_BED_TEMP);
   19652:	81 ec       	ldi	r24, 0xC1	; 193
   19654:	94 e4       	ldi	r25, 0x44	; 68
   19656:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1965a:	32 e3       	ldi	r19, 0x32	; 50
   1965c:	e3 2e       	mov	r14, r19
   1965e:	f1 2c       	mov	r15, r1
   19660:	08 e7       	ldi	r16, 0x78	; 120
   19662:	10 e0       	ldi	r17, 0x00	; 0
   19664:	30 e0       	ldi	r19, 0x00	; 0
   19666:	20 e0       	ldi	r18, 0x00	; 0
   19668:	40 e1       	ldi	r20, 0x10	; 16
   1966a:	69 e5       	ldi	r22, 0x59	; 89
   1966c:	72 e1       	ldi	r23, 0x12	; 18
   1966e:	0e 94 6e 6f 	call	0xdedc	; 0xdedc <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)>
#endif
    MENU_ITEM_EDIT_int3_jmp_P(_T(MSG_FAN_SPEED), &fanSpeed, 0, 255, LCD_JUMP_FAN_SPEED);
   19672:	85 eb       	ldi	r24, 0xB5	; 181
   19674:	94 e4       	ldi	r25, 0x44	; 68
   19676:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1967a:	4f e7       	ldi	r20, 0x7F	; 127
   1967c:	e4 2e       	mov	r14, r20
   1967e:	f1 2c       	mov	r15, r1
   19680:	0f ef       	ldi	r16, 0xFF	; 255
   19682:	10 e0       	ldi	r17, 0x00	; 0
   19684:	30 e0       	ldi	r19, 0x00	; 0
   19686:	20 e0       	ldi	r18, 0x00	; 0
   19688:	48 e0       	ldi	r20, 0x08	; 8
   1968a:	65 e5       	ldi	r22, 0x55	; 85
   1968c:	72 e1       	ldi	r23, 0x12	; 18
   1968e:	0e 94 6e 6f 	call	0xdedc	; 0xdedc <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)>
}
   19692:	1f 91       	pop	r17
   19694:	0f 91       	pop	r16
   19696:	ff 90       	pop	r15
   19698:	ef 90       	pop	r14
   1969a:	08 95       	ret

0001969c <lcd_control_temperature_menu()>:
}
#endif //LCD_BL_PIN

static void lcd_control_temperature_menu()
{
  MENU_BEGIN();
   1969c:	0e 94 0c 74 	call	0xe818	; 0xe818 <menu_start()>
   196a0:	10 92 60 04 	sts	0x0460, r1	; 0x800460 <menu_row>
   196a4:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   196a8:	84 30       	cpi	r24, 0x04	; 4
   196aa:	b8 f4       	brcc	.+46     	; 0x196da <lcd_control_temperature_menu()+0x3e>
   196ac:	10 92 63 04 	sts	0x0463, r1	; 0x800463 <menu_item>
  MENU_ITEM_BACK_P(_T(MSG_SETTINGS));
   196b0:	8e e8       	ldi	r24, 0x8E	; 142
   196b2:	98 e4       	ldi	r25, 0x48	; 72
   196b4:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   196b8:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>

  menuitems_temperature_common();
   196bc:	0e 94 15 cb 	call	0x1962a	; 0x1962a <menuitems_temperature_common()>

  MENU_END();
   196c0:	0e 94 83 62 	call	0xc506	; 0xc506 <menu_end()>
}
#endif //LCD_BL_PIN

static void lcd_control_temperature_menu()
{
  MENU_BEGIN();
   196c4:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   196c8:	8f 5f       	subi	r24, 0xFF	; 255
   196ca:	80 93 60 04 	sts	0x0460, r24	; 0x800460 <menu_row>
   196ce:	80 91 62 04 	lds	r24, 0x0462	; 0x800462 <menu_line>
   196d2:	8f 5f       	subi	r24, 0xFF	; 255
   196d4:	80 93 62 04 	sts	0x0462, r24	; 0x800462 <menu_line>
   196d8:	e5 cf       	rjmp	.-54     	; 0x196a4 <lcd_control_temperature_menu()+0x8>
  MENU_ITEM_BACK_P(_T(MSG_SETTINGS));

  menuitems_temperature_common();

  MENU_END();
}
   196da:	08 95       	ret

000196dc <lcd_adjust_bed()>:
//! |Rear side [µm]:     |	MSG_BED_CORRECTION_REAR
//! |Reset               |	MSG_BED_CORRECTION_RESET
//! ----------------------
//! @endcode
void lcd_adjust_bed(void)
{
   196dc:	ef 92       	push	r14
   196de:	ff 92       	push	r15
   196e0:	0f 93       	push	r16
   196e2:	1f 93       	push	r17
	_menu_data_adjust_bed_t* _md = (_menu_data_adjust_bed_t*)&(menu_data[0]);
    if (_md->status == 0)
   196e4:	80 91 a3 03 	lds	r24, 0x03A3	; 0x8003a3 <menu_data+0xd>
   196e8:	81 11       	cpse	r24, r1
   196ea:	35 c0       	rjmp	.+106    	; 0x19756 <lcd_adjust_bed()+0x7a>
	{
        // Menu was entered.
        if (eeprom_read_byte((unsigned char*)EEPROM_BED_CORRECTION_VALID) == 1)
   196ec:	80 ec       	ldi	r24, 0xC0	; 192
   196ee:	9f e0       	ldi	r25, 0x0F	; 15
   196f0:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   196f4:	81 30       	cpi	r24, 0x01	; 1
   196f6:	61 f5       	brne	.+88     	; 0x19750 <lcd_adjust_bed()+0x74>
		{
			_md->left = (int8_t)eeprom_read_byte((uint8_t*)EEPROM_BED_CORRECTION_LEFT);
   196f8:	8f eb       	ldi	r24, 0xBF	; 191
   196fa:	9f e0       	ldi	r25, 0x0F	; 15
   196fc:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   19700:	08 2e       	mov	r0, r24
   19702:	00 0c       	add	r0, r0
   19704:	99 0b       	sbc	r25, r25
   19706:	90 93 a5 03 	sts	0x03A5, r25	; 0x8003a5 <menu_data+0xf>
   1970a:	80 93 a4 03 	sts	0x03A4, r24	; 0x8003a4 <menu_data+0xe>
			_md->right = (int8_t)eeprom_read_byte((uint8_t*)EEPROM_BED_CORRECTION_RIGHT);
   1970e:	8e eb       	ldi	r24, 0xBE	; 190
   19710:	9f e0       	ldi	r25, 0x0F	; 15
   19712:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   19716:	08 2e       	mov	r0, r24
   19718:	00 0c       	add	r0, r0
   1971a:	99 0b       	sbc	r25, r25
   1971c:	90 93 a7 03 	sts	0x03A7, r25	; 0x8003a7 <menu_data+0x11>
   19720:	80 93 a6 03 	sts	0x03A6, r24	; 0x8003a6 <menu_data+0x10>
			_md->front = (int8_t)eeprom_read_byte((uint8_t*)EEPROM_BED_CORRECTION_FRONT);
   19724:	8d eb       	ldi	r24, 0xBD	; 189
   19726:	9f e0       	ldi	r25, 0x0F	; 15
   19728:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1972c:	08 2e       	mov	r0, r24
   1972e:	00 0c       	add	r0, r0
   19730:	99 0b       	sbc	r25, r25
   19732:	90 93 a9 03 	sts	0x03A9, r25	; 0x8003a9 <menu_data+0x13>
   19736:	80 93 a8 03 	sts	0x03A8, r24	; 0x8003a8 <menu_data+0x12>
			_md->rear = (int8_t)eeprom_read_byte((uint8_t*)EEPROM_BED_CORRECTION_REAR);
   1973a:	8c eb       	ldi	r24, 0xBC	; 188
   1973c:	9f e0       	ldi	r25, 0x0F	; 15
   1973e:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   19742:	08 2e       	mov	r0, r24
   19744:	00 0c       	add	r0, r0
   19746:	99 0b       	sbc	r25, r25
   19748:	90 93 ab 03 	sts	0x03AB, r25	; 0x8003ab <menu_data+0x15>
   1974c:	80 93 aa 03 	sts	0x03AA, r24	; 0x8003aa <menu_data+0x14>
		}
        _md->status = 1;
   19750:	81 e0       	ldi	r24, 0x01	; 1
   19752:	80 93 a3 03 	sts	0x03A3, r24	; 0x8003a3 <menu_data+0xd>
    }
    MENU_BEGIN();
   19756:	0e 94 0c 74 	call	0xe818	; 0xe818 <menu_start()>
   1975a:	10 92 60 04 	sts	0x0460, r1	; 0x800460 <menu_row>
   1975e:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   19762:	84 30       	cpi	r24, 0x04	; 4
   19764:	08 f0       	brcs	.+2      	; 0x19768 <lcd_adjust_bed()+0x8c>
   19766:	6e c0       	rjmp	.+220    	; 0x19844 <lcd_adjust_bed()+0x168>
   19768:	10 92 63 04 	sts	0x0463, r1	; 0x800463 <menu_item>
	// leaving menu - this condition must be immediately before MENU_ITEM_BACK_P
    ON_MENU_LEAVE(
   1976c:	0e 94 4c 62 	call	0xc498	; 0xc498 <menu_item_leave()>
   19770:	88 23       	and	r24, r24
   19772:	e9 f0       	breq	.+58     	; 0x197ae <lcd_adjust_bed()+0xd2>
        if (previous_value != value) {
            eeprom_byte_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_byte(dst, value);
   19774:	60 91 a4 03 	lds	r22, 0x03A4	; 0x8003a4 <menu_data+0xe>
   19778:	8f eb       	ldi	r24, 0xBF	; 191
   1977a:	9f e0       	ldi	r25, 0x0F	; 15
   1977c:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
   19780:	60 91 a8 03 	lds	r22, 0x03A8	; 0x8003a8 <menu_data+0x12>
   19784:	8d eb       	ldi	r24, 0xBD	; 189
   19786:	9f e0       	ldi	r25, 0x0F	; 15
   19788:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
   1978c:	60 91 aa 03 	lds	r22, 0x03AA	; 0x8003aa <menu_data+0x14>
   19790:	8c eb       	ldi	r24, 0xBC	; 188
   19792:	9f e0       	ldi	r25, 0x0F	; 15
   19794:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
   19798:	60 91 a6 03 	lds	r22, 0x03A6	; 0x8003a6 <menu_data+0x10>
   1979c:	8e eb       	ldi	r24, 0xBE	; 190
   1979e:	9f e0       	ldi	r25, 0x0F	; 15
   197a0:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
   197a4:	61 e0       	ldi	r22, 0x01	; 1
   197a6:	80 ec       	ldi	r24, 0xC0	; 192
   197a8:	9f e0       	ldi	r25, 0x0F	; 15
   197aa:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
        eeprom_update_byte_notify((uint8_t*)EEPROM_BED_CORRECTION_FRONT, (uint8_t)_md->front);
        eeprom_update_byte_notify((uint8_t*)EEPROM_BED_CORRECTION_REAR, (uint8_t)_md->rear);
        eeprom_update_byte_notify((uint8_t*)EEPROM_BED_CORRECTION_RIGHT, (uint8_t)_md->right);
        eeprom_update_byte_notify((uint8_t*)EEPROM_BED_CORRECTION_VALID, 1);
    );
    MENU_ITEM_BACK_P(_T(MSG_BACK));
   197ae:	88 ee       	ldi	r24, 0xE8	; 232
   197b0:	9a e4       	ldi	r25, 0x4A	; 74
   197b2:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   197b6:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
    MENU_ITEM_EDIT_int3_P(_T(MSG_BED_CORRECTION_LEFT),  &_md->left,  -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX);
   197ba:	87 e1       	ldi	r24, 0x17	; 23
   197bc:	9b e3       	ldi	r25, 0x3B	; 59
   197be:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   197c2:	f1 2c       	mov	r15, r1
   197c4:	e1 2c       	mov	r14, r1
   197c6:	04 e6       	ldi	r16, 0x64	; 100
   197c8:	10 e0       	ldi	r17, 0x00	; 0
   197ca:	2c e9       	ldi	r18, 0x9C	; 156
   197cc:	3f ef       	ldi	r19, 0xFF	; 255
   197ce:	40 e1       	ldi	r20, 0x10	; 16
   197d0:	64 ea       	ldi	r22, 0xA4	; 164
   197d2:	73 e0       	ldi	r23, 0x03	; 3
   197d4:	0e 94 6e 6f 	call	0xdedc	; 0xdedc <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)>
    MENU_ITEM_EDIT_int3_P(_T(MSG_BED_CORRECTION_RIGHT), &_md->right, -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX);
   197d8:	86 e0       	ldi	r24, 0x06	; 6
   197da:	9b e3       	ldi	r25, 0x3B	; 59
   197dc:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   197e0:	2c e9       	ldi	r18, 0x9C	; 156
   197e2:	3f ef       	ldi	r19, 0xFF	; 255
   197e4:	40 e1       	ldi	r20, 0x10	; 16
   197e6:	66 ea       	ldi	r22, 0xA6	; 166
   197e8:	73 e0       	ldi	r23, 0x03	; 3
   197ea:	0e 94 6e 6f 	call	0xdedc	; 0xdedc <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)>
    MENU_ITEM_EDIT_int3_P(_T(MSG_BED_CORRECTION_FRONT), &_md->front, -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX);
   197ee:	85 ef       	ldi	r24, 0xF5	; 245
   197f0:	9a e3       	ldi	r25, 0x3A	; 58
   197f2:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   197f6:	2c e9       	ldi	r18, 0x9C	; 156
   197f8:	3f ef       	ldi	r19, 0xFF	; 255
   197fa:	40 e1       	ldi	r20, 0x10	; 16
   197fc:	68 ea       	ldi	r22, 0xA8	; 168
   197fe:	73 e0       	ldi	r23, 0x03	; 3
   19800:	0e 94 6e 6f 	call	0xdedc	; 0xdedc <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)>
    MENU_ITEM_EDIT_int3_P(_T(MSG_BED_CORRECTION_REAR),  &_md->rear,  -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX);
   19804:	84 ee       	ldi	r24, 0xE4	; 228
   19806:	9a e3       	ldi	r25, 0x3A	; 58
   19808:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1980c:	2c e9       	ldi	r18, 0x9C	; 156
   1980e:	3f ef       	ldi	r19, 0xFF	; 255
   19810:	40 e1       	ldi	r20, 0x10	; 16
   19812:	6a ea       	ldi	r22, 0xAA	; 170
   19814:	73 e0       	ldi	r23, 0x03	; 3
   19816:	0e 94 6e 6f 	call	0xdedc	; 0xdedc <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)>
    MENU_ITEM_FUNCTION_P(_T(MSG_RESET), lcd_adjust_bed_reset);
   1981a:	8f ea       	ldi	r24, 0xAF	; 175
   1981c:	96 e4       	ldi	r25, 0x46	; 70
   1981e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19822:	69 ee       	ldi	r22, 0xE9	; 233
   19824:	70 ed       	ldi	r23, 0xD0	; 208
   19826:	0e 94 9d 72 	call	0xe53a	; 0xe53a <menu_item_function_P(char const*, void (*)())>
    MENU_END();
   1982a:	0e 94 83 62 	call	0xc506	; 0xc506 <menu_end()>
			_md->front = (int8_t)eeprom_read_byte((uint8_t*)EEPROM_BED_CORRECTION_FRONT);
			_md->rear = (int8_t)eeprom_read_byte((uint8_t*)EEPROM_BED_CORRECTION_REAR);
		}
        _md->status = 1;
    }
    MENU_BEGIN();
   1982e:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   19832:	8f 5f       	subi	r24, 0xFF	; 255
   19834:	80 93 60 04 	sts	0x0460, r24	; 0x800460 <menu_row>
   19838:	80 91 62 04 	lds	r24, 0x0462	; 0x800462 <menu_line>
   1983c:	8f 5f       	subi	r24, 0xFF	; 255
   1983e:	80 93 62 04 	sts	0x0462, r24	; 0x800462 <menu_line>
   19842:	8d cf       	rjmp	.-230    	; 0x1975e <lcd_adjust_bed()+0x82>
    MENU_ITEM_EDIT_int3_P(_T(MSG_BED_CORRECTION_RIGHT), &_md->right, -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX);
    MENU_ITEM_EDIT_int3_P(_T(MSG_BED_CORRECTION_FRONT), &_md->front, -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX);
    MENU_ITEM_EDIT_int3_P(_T(MSG_BED_CORRECTION_REAR),  &_md->rear,  -BED_ADJUSTMENT_UM_MAX, BED_ADJUSTMENT_UM_MAX);
    MENU_ITEM_FUNCTION_P(_T(MSG_RESET), lcd_adjust_bed_reset);
    MENU_END();
}
   19844:	1f 91       	pop	r17
   19846:	0f 91       	pop	r16
   19848:	ff 90       	pop	r15
   1984a:	ef 90       	pop	r14
   1984c:	08 95       	ret

0001984e <lcd_tune_menu()>:
#define MENU_ITEM_EDIT_advance_K() do { lcd_advance_K(); } while (0)
#endif


static void lcd_tune_menu()
{
   1984e:	ef 92       	push	r14
   19850:	ff 92       	push	r15
   19852:	0f 93       	push	r16
   19854:	1f 93       	push	r17
   19856:	cf 93       	push	r28
   19858:	df 93       	push	r29
   1985a:	80 91 75 02 	lds	r24, 0x0275	; 0x800275 <extrudemultiply>
   1985e:	90 91 76 02 	lds	r25, 0x0276	; 0x800276 <extrudemultiply+0x1>
		//! it needs to be applied.
		int16_t extrudemultiply;
	} _menu_data_t;
	static_assert(sizeof(menu_data)>= sizeof(_menu_data_t),"_menu_data_t doesn't fit into menu_data");
	_menu_data_t* _md = (_menu_data_t*)&(menu_data[0]);
	if (_md->status == 0)
   19862:	20 91 a3 03 	lds	r18, 0x03A3	; 0x8003a3 <menu_data+0xd>
   19866:	21 11       	cpse	r18, r1
   19868:	91 c0       	rjmp	.+290    	; 0x1998c <lcd_tune_menu()+0x13e>
	{
		// Menu was entered. Mark the menu as entered and save the current extrudemultiply value.
		_md->status = 1;
   1986a:	21 e0       	ldi	r18, 0x01	; 1
   1986c:	20 93 a3 03 	sts	0x03A3, r18	; 0x8003a3 <menu_data+0xd>
		_md->extrudemultiply = extrudemultiply;
   19870:	90 93 a5 03 	sts	0x03A5, r25	; 0x8003a5 <menu_data+0xf>
   19874:	80 93 a4 03 	sts	0x03A4, r24	; 0x8003a4 <menu_data+0xe>
		// extrudemultiply has been changed from the child menu. Apply the new value.
		_md->extrudemultiply = extrudemultiply;
		calculate_extruder_multipliers();
	}

	SilentModeMenu = eeprom_read_byte((uint8_t*) EEPROM_SILENT);
   19878:	8f ef       	ldi	r24, 0xFF	; 255
   1987a:	9f e0       	ldi	r25, 0x0F	; 15
   1987c:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   19880:	80 93 bb 03 	sts	0x03BB, r24	; 0x8003bb <SilentModeMenu>

	MENU_BEGIN();
   19884:	0e 94 0c 74 	call	0xe818	; 0xe818 <menu_start()>
   19888:	10 92 60 04 	sts	0x0460, r1	; 0x800460 <menu_row>
   1988c:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   19890:	84 30       	cpi	r24, 0x04	; 4
   19892:	08 f0       	brcs	.+2      	; 0x19896 <lcd_tune_menu()+0x48>
   19894:	93 c0       	rjmp	.+294    	; 0x199bc <lcd_tune_menu()+0x16e>
   19896:	10 92 63 04 	sts	0x0463, r1	; 0x800463 <menu_item>
	ON_MENU_LEAVE(
   1989a:	0e 94 4c 62 	call	0xc498	; 0xc498 <menu_item_leave()>
   1989e:	81 11       	cpse	r24, r1
   198a0:	0e 94 3d 64 	call	0xc87a	; 0xc87a <refresh_saved_feedrate_multiplier_in_ram()>
		refresh_saved_feedrate_multiplier_in_ram();
	);
	MENU_ITEM_BACK_P(_T(MSG_MAIN));
   198a4:	8f ed       	ldi	r24, 0xDF	; 223
   198a6:	98 e4       	ldi	r25, 0x48	; 72
   198a8:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   198ac:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
	MENU_ITEM_EDIT_int3_P(_T(MSG_SPEED), &feedmultiply, 10, 999);
   198b0:	8b e5       	ldi	r24, 0x5B	; 91
   198b2:	98 e4       	ldi	r25, 0x48	; 72
   198b4:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   198b8:	f1 2c       	mov	r15, r1
   198ba:	e1 2c       	mov	r14, r1
   198bc:	07 ee       	ldi	r16, 0xE7	; 231
   198be:	13 e0       	ldi	r17, 0x03	; 3
   198c0:	2a e0       	ldi	r18, 0x0A	; 10
   198c2:	30 e0       	ldi	r19, 0x00	; 0
   198c4:	40 e1       	ldi	r20, 0x10	; 16
   198c6:	6e e8       	ldi	r22, 0x8E	; 142
   198c8:	72 e0       	ldi	r23, 0x02	; 2
   198ca:	0e 94 6e 6f 	call	0xdedc	; 0xdedc <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)>

	menuitems_temperature_common();
   198ce:	0e 94 15 cb 	call	0x1962a	; 0x1962a <menuitems_temperature_common()>

	MENU_ITEM_EDIT_int3_P(_T(MSG_FLOW), &extrudemultiply, 10, 999);
   198d2:	84 e5       	ldi	r24, 0x54	; 84
   198d4:	98 e4       	ldi	r25, 0x48	; 72
   198d6:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   198da:	2a e0       	ldi	r18, 0x0A	; 10
   198dc:	30 e0       	ldi	r19, 0x00	; 0
   198de:	40 e1       	ldi	r20, 0x10	; 16
   198e0:	65 e7       	ldi	r22, 0x75	; 117
   198e2:	72 e0       	ldi	r23, 0x02	; 2
   198e4:	0e 94 6e 6f 	call	0xdedc	; 0xdedc <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)>
#ifdef LA_LIVE_K
	MENU_ITEM_EDIT_advance_K();
#endif
#ifdef FILAMENTCHANGEENABLE
    if (!farm_mode)
   198e8:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   198ec:	81 11       	cpse	r24, r1
   198ee:	08 c0       	rjmp	.+16     	; 0x19900 <lcd_tune_menu()+0xb2>
        MENU_ITEM_FUNCTION_P(_T(MSG_FILAMENTCHANGE), lcd_colorprint_change);
   198f0:	82 e4       	ldi	r24, 0x42	; 66
   198f2:	98 e4       	ldi	r25, 0x48	; 72
   198f4:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   198f8:	65 ea       	ldi	r22, 0xA5	; 165
   198fa:	7e ed       	ldi	r23, 0xDE	; 222
   198fc:	0e 94 9d 72 	call	0xe53a	; 0xe53a <menu_item_function_P(char const*, void (*)())>
#endif
    if (printingIsPaused()) {// Don't allow rehome if actively printing. Maaaaybe it could work to insert on the fly, seems too risky.
   19900:	0e 94 35 66 	call	0xcc6a	; 0xcc6a <printingIsPaused()>
   19904:	88 23       	and	r24, r24
   19906:	41 f0       	breq	.+16     	; 0x19918 <lcd_tune_menu()+0xca>
        MENU_ITEM_GCODE_P(_T(MSG_AUTO_HOME),PSTR("G28 XY"));
   19908:	81 ec       	ldi	r24, 0xC1	; 193
   1990a:	91 e6       	ldi	r25, 0x61	; 97
   1990c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19910:	69 eb       	ldi	r22, 0xB9	; 185
   19912:	73 e8       	ldi	r23, 0x83	; 131
   19914:	0e 94 68 8f 	call	0x11ed0	; 0x11ed0 <menu_item_gcode_P(char const*, char const*)>
    }
#ifdef FILAMENT_SENSOR
    MENU_ITEM_SUBMENU_P(_T(MSG_FSENSOR), lcd_fsensor_settings_menu);
   19918:	84 e3       	ldi	r24, 0x34	; 52
   1991a:	98 e4       	ldi	r25, 0x48	; 72
   1991c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19920:	62 e6       	ldi	r22, 0x62	; 98
   19922:	72 ec       	ldi	r23, 0xC2	; 194
   19924:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
#endif //FILAMENT_SENSOR

    if (MMU2::mmu2.Enabled())
   19928:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   1992c:	81 30       	cpi	r24, 0x01	; 1
   1992e:	11 f4       	brne	.+4      	; 0x19934 <lcd_tune_menu()+0xe6>
    {
        menuitems_MMU_settings_common();
   19930:	0e 94 2a c1 	call	0x18254	; 0x18254 <menuitems_MMU_settings_common()>
    }

    SETTINGS_FANS_CHECK();
   19934:	0e 94 10 c1 	call	0x18220	; 0x18220 <SETTINGS_FANS_CHECK()>
    MMU2::mmu2.Status();
}

static void SETTINGS_SILENT_MODE()
{
    if (!farm_mode)
   19938:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   1993c:	81 11       	cpse	r24, r1
   1993e:	02 c0       	rjmp	.+4      	; 0x19944 <lcd_tune_menu()+0xf6>
   19940:	0e 94 ef c0 	call	0x181de	; 0x181de <SETTINGS_SILENT_MODE() [clone .part.3]>
        menuitems_MMU_settings_common();
    }

    SETTINGS_FANS_CHECK();
    SETTINGS_SILENT_MODE();
    SETTINGS_SOUND;
   19944:	80 91 47 04 	lds	r24, 0x0447	; 0x800447 <eSoundMode>
   19948:	82 30       	cpi	r24, 0x02	; 2
   1994a:	91 f1       	breq	.+100    	; 0x199b0 <lcd_tune_menu()+0x162>
   1994c:	83 30       	cpi	r24, 0x03	; 3
   1994e:	99 f1       	breq	.+102    	; 0x199b6 <lcd_tune_menu()+0x168>
   19950:	81 30       	cpi	r24, 0x01	; 1
   19952:	59 f1       	breq	.+86     	; 0x199aa <lcd_tune_menu()+0x15c>
   19954:	8d e2       	ldi	r24, 0x2D	; 45
   19956:	98 e4       	ldi	r25, 0x48	; 72
   19958:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1995c:	ec 01       	movw	r28, r24
   1995e:	85 e2       	ldi	r24, 0x25	; 37
   19960:	98 e4       	ldi	r25, 0x48	; 72
   19962:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19966:	22 e0       	ldi	r18, 0x02	; 2
   19968:	44 e9       	ldi	r20, 0x94	; 148
   1996a:	5f eb       	ldi	r21, 0xBF	; 191
   1996c:	be 01       	movw	r22, r28
   1996e:	0e 94 5e 75 	call	0xeabc	; 0xeabc <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
    if (backlightSupport)
    {
        MENU_ITEM_SUBMENU_P(_T(MSG_BRIGHTNESS), lcd_backlight_menu);
    }
#endif //LCD_BL_PIN
	MENU_END();
   19972:	0e 94 83 62 	call	0xc506	; 0xc506 <menu_end()>
		calculate_extruder_multipliers();
	}

	SilentModeMenu = eeprom_read_byte((uint8_t*) EEPROM_SILENT);

	MENU_BEGIN();
   19976:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   1997a:	8f 5f       	subi	r24, 0xFF	; 255
   1997c:	80 93 60 04 	sts	0x0460, r24	; 0x800460 <menu_row>
   19980:	80 91 62 04 	lds	r24, 0x0462	; 0x800462 <menu_line>
   19984:	8f 5f       	subi	r24, 0xFF	; 255
   19986:	80 93 62 04 	sts	0x0462, r24	; 0x800462 <menu_line>
   1998a:	80 cf       	rjmp	.-256    	; 0x1988c <lcd_tune_menu()+0x3e>
	{
		// Menu was entered. Mark the menu as entered and save the current extrudemultiply value.
		_md->status = 1;
		_md->extrudemultiply = extrudemultiply;
	}
	else if (_md->extrudemultiply != extrudemultiply)
   1998c:	20 91 a4 03 	lds	r18, 0x03A4	; 0x8003a4 <menu_data+0xe>
   19990:	30 91 a5 03 	lds	r19, 0x03A5	; 0x8003a5 <menu_data+0xf>
   19994:	28 17       	cp	r18, r24
   19996:	39 07       	cpc	r19, r25
   19998:	09 f4       	brne	.+2      	; 0x1999c <lcd_tune_menu()+0x14e>
   1999a:	6e cf       	rjmp	.-292    	; 0x19878 <lcd_tune_menu()+0x2a>
	{
		// extrudemultiply has been changed from the child menu. Apply the new value.
		_md->extrudemultiply = extrudemultiply;
   1999c:	90 93 a5 03 	sts	0x03A5, r25	; 0x8003a5 <menu_data+0xf>
   199a0:	80 93 a4 03 	sts	0x03A4, r24	; 0x8003a4 <menu_data+0xe>
		calculate_extruder_multipliers();
   199a4:	0e 94 4a 64 	call	0xc894	; 0xc894 <calculate_extruder_multipliers()>
   199a8:	67 cf       	rjmp	.-306    	; 0x19878 <lcd_tune_menu()+0x2a>
        menuitems_MMU_settings_common();
    }

    SETTINGS_FANS_CHECK();
    SETTINGS_SILENT_MODE();
    SETTINGS_SOUND;
   199aa:	8e e1       	ldi	r24, 0x1E	; 30
   199ac:	98 e4       	ldi	r25, 0x48	; 72
   199ae:	d4 cf       	rjmp	.-88     	; 0x19958 <lcd_tune_menu()+0x10a>
   199b0:	8c ef       	ldi	r24, 0xFC	; 252
   199b2:	9a e4       	ldi	r25, 0x4A	; 74
   199b4:	d1 cf       	rjmp	.-94     	; 0x19958 <lcd_tune_menu()+0x10a>
   199b6:	85 e1       	ldi	r24, 0x15	; 21
   199b8:	98 e4       	ldi	r25, 0x48	; 72
   199ba:	ce cf       	rjmp	.-100    	; 0x19958 <lcd_tune_menu()+0x10a>
    {
        MENU_ITEM_SUBMENU_P(_T(MSG_BRIGHTNESS), lcd_backlight_menu);
    }
#endif //LCD_BL_PIN
	MENU_END();
}
   199bc:	df 91       	pop	r29
   199be:	cf 91       	pop	r28
   199c0:	1f 91       	pop	r17
   199c2:	0f 91       	pop	r16
   199c4:	ff 90       	pop	r15
   199c6:	ef 90       	pop	r14
   199c8:	08 95       	ret

000199ca <lcd_settings_menu()>:

    MENU_END();
}

static void lcd_settings_menu()
{
   199ca:	1f 93       	push	r17
   199cc:	cf 93       	push	r28
   199ce:	df 93       	push	r29
	SilentModeMenu = eeprom_read_byte((uint8_t*) EEPROM_SILENT);
   199d0:	8f ef       	ldi	r24, 0xFF	; 255
   199d2:	9f e0       	ldi	r25, 0x0F	; 15
   199d4:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   199d8:	80 93 bb 03 	sts	0x03BB, r24	; 0x8003bb <SilentModeMenu>
	MENU_BEGIN();
   199dc:	0e 94 0c 74 	call	0xe818	; 0xe818 <menu_start()>
   199e0:	10 92 60 04 	sts	0x0460, r1	; 0x800460 <menu_row>
    SETTINGS_FANS_CHECK();
    SETTINGS_SILENT_MODE();

    if(!farm_mode)
    {
        bSettings=true;                              // flag ('fake parameter') for 'lcd_hw_setup_menu()' function
   199e4:	11 e0       	ldi	r17, 0x01	; 1
}

static void lcd_settings_menu()
{
	SilentModeMenu = eeprom_read_byte((uint8_t*) EEPROM_SILENT);
	MENU_BEGIN();
   199e6:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   199ea:	84 30       	cpi	r24, 0x04	; 4
   199ec:	08 f0       	brcs	.+2      	; 0x199f0 <lcd_settings_menu()+0x26>
   199ee:	45 c1       	rjmp	.+650    	; 0x19c7a <lcd_settings_menu()+0x2b0>
   199f0:	10 92 63 04 	sts	0x0463, r1	; 0x800463 <menu_item>
	MENU_ITEM_BACK_P(_T(MSG_MAIN));
   199f4:	8f ed       	ldi	r24, 0xDF	; 223
   199f6:	98 e4       	ldi	r25, 0x48	; 72
   199f8:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   199fc:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>

	MENU_ITEM_SUBMENU_P(_T(MSG_TEMPERATURE), lcd_control_temperature_menu);
   19a00:	8e eb       	ldi	r24, 0xBE	; 190
   19a02:	95 e4       	ldi	r25, 0x45	; 69
   19a04:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19a08:	6e e4       	ldi	r22, 0x4E	; 78
   19a0a:	7b ec       	ldi	r23, 0xCB	; 203
   19a0c:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>

	if (!printer_active() || printingIsPaused())
   19a10:	0e 94 91 66 	call	0xcd22	; 0xcd22 <printer_active()>
   19a14:	88 23       	and	r24, r24
   19a16:	21 f0       	breq	.+8      	; 0x19a20 <lcd_settings_menu()+0x56>
   19a18:	0e 94 35 66 	call	0xcc6a	; 0xcc6a <printingIsPaused()>
   19a1c:	88 23       	and	r24, r24
   19a1e:	81 f0       	breq	.+32     	; 0x19a40 <lcd_settings_menu()+0x76>
    {
	    MENU_ITEM_SUBMENU_P(_T(MSG_MOVE_AXIS), lcd_move_menu_axis);
   19a20:	82 eb       	ldi	r24, 0xB2	; 178
   19a22:	95 e4       	ldi	r25, 0x45	; 69
   19a24:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19a28:	6d e9       	ldi	r22, 0x9D	; 157
   19a2a:	73 ec       	ldi	r23, 0xC3	; 195
   19a2c:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
	    MENU_ITEM_GCODE_P(_T(MSG_DISABLE_STEPPERS), MSG_M84);
   19a30:	8f e9       	ldi	r24, 0x9F	; 159
   19a32:	95 e4       	ldi	r25, 0x45	; 69
   19a34:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19a38:	6e e8       	ldi	r22, 0x8E	; 142
   19a3a:	78 e6       	ldi	r23, 0x68	; 104
   19a3c:	0e 94 68 8f 	call	0x11ed0	; 0x11ed0 <menu_item_gcode_P(char const*, char const*)>
    }

#ifdef FILAMENT_SENSOR
    MENU_ITEM_SUBMENU_P(_T(MSG_FSENSOR), lcd_fsensor_settings_menu);
   19a40:	84 e3       	ldi	r24, 0x34	; 52
   19a42:	98 e4       	ldi	r25, 0x48	; 72
   19a44:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19a48:	62 e6       	ldi	r22, 0x62	; 98
   19a4a:	72 ec       	ldi	r23, 0xC2	; 194
   19a4c:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
#endif //FILAMENT_SENSOR

    MENU_ITEM_TOGGLE_P(PSTR("MMU"), eeprom_read_byte((uint8_t *)EEPROM_MMU_ENABLED) ? _T(MSG_ON) : _T(MSG_OFF), mmu_enable_switch);
   19a50:	8c ea       	ldi	r24, 0xAC	; 172
   19a52:	9c e0       	ldi	r25, 0x0C	; 12
   19a54:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   19a58:	88 23       	and	r24, r24
   19a5a:	09 f4       	brne	.+2      	; 0x19a5e <lcd_settings_menu()+0x94>
   19a5c:	91 c0       	rjmp	.+290    	; 0x19b80 <lcd_settings_menu()+0x1b6>
   19a5e:	8a e9       	ldi	r24, 0x9A	; 154
   19a60:	92 e6       	ldi	r25, 0x62	; 98
   19a62:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19a66:	22 e0       	ldi	r18, 0x02	; 2
   19a68:	42 e3       	ldi	r20, 0x32	; 50
   19a6a:	50 ec       	ldi	r21, 0xC0	; 192
   19a6c:	bc 01       	movw	r22, r24
   19a6e:	8a e9       	ldi	r24, 0x9A	; 154
   19a70:	93 e8       	ldi	r25, 0x83	; 131
   19a72:	0e 94 5e 75 	call	0xeabc	; 0xeabc <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
    if (eeprom_read_byte((uint8_t *)EEPROM_MMU_ENABLED))
   19a76:	8c ea       	ldi	r24, 0xAC	; 172
   19a78:	9c e0       	ldi	r25, 0x0C	; 12
   19a7a:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   19a7e:	88 23       	and	r24, r24
   19a80:	31 f0       	breq	.+12     	; 0x19a8e <lcd_settings_menu()+0xc4>
    { // Communication with MMU not required to reset MMU
        MENU_ITEM_FUNCTION_P(PSTR("Reset MMU"), []() { MMU2::mmu2.Reset(MMU2::MMU2::ResetForm::Software); });
   19a82:	67 e9       	ldi	r22, 0x97	; 151
   19a84:	70 ed       	ldi	r23, 0xD0	; 208
   19a86:	80 e9       	ldi	r24, 0x90	; 144
   19a88:	93 e8       	ldi	r25, 0x83	; 131
   19a8a:	0e 94 9d 72 	call	0xe53a	; 0xe53a <menu_item_function_P(char const*, void (*)())>
    }

    if (MMU2::mmu2.Enabled())
   19a8e:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   19a92:	81 30       	cpi	r24, 0x01	; 1
   19a94:	51 f4       	brne	.+20     	; 0x19aaa <lcd_settings_menu()+0xe0>
    { // Only show menus when communicating with MMU
        menuitems_MMU_settings_common();
   19a96:	0e 94 2a c1 	call	0x18254	; 0x18254 <menuitems_MMU_settings_common()>
        MENU_ITEM_SUBMENU_P(_T(MSG_LOADING_TEST), lcd_mmuLoadingTest);
   19a9a:	80 e9       	ldi	r24, 0x90	; 144
   19a9c:	95 e4       	ldi	r25, 0x45	; 69
   19a9e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19aa2:	65 ed       	ldi	r22, 0xD5	; 213
   19aa4:	7f ec       	ldi	r23, 0xCF	; 207
   19aa6:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
    }

    SETTINGS_FANS_CHECK();
   19aaa:	0e 94 10 c1 	call	0x18220	; 0x18220 <SETTINGS_FANS_CHECK()>
    MMU2::mmu2.Status();
}

static void SETTINGS_SILENT_MODE()
{
    if (!farm_mode)
   19aae:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   19ab2:	81 11       	cpse	r24, r1
   19ab4:	02 c0       	rjmp	.+4      	; 0x19aba <lcd_settings_menu()+0xf0>
   19ab6:	0e 94 ef c0 	call	0x181de	; 0x181de <SETTINGS_SILENT_MODE() [clone .part.3]>
    }

    SETTINGS_FANS_CHECK();
    SETTINGS_SILENT_MODE();

    if(!farm_mode)
   19aba:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   19abe:	81 11       	cpse	r24, r1
   19ac0:	62 c0       	rjmp	.+196    	; 0x19b86 <lcd_settings_menu()+0x1bc>
    {
        bSettings=true;                              // flag ('fake parameter') for 'lcd_hw_setup_menu()' function
   19ac2:	10 93 ec 03 	sts	0x03EC, r17	; 0x8003ec <bSettings>
        MENU_ITEM_SUBMENU_P(_T(MSG_HW_SETUP), lcd_hw_setup_menu);
   19ac6:	85 e8       	ldi	r24, 0x85	; 133
   19ac8:	95 e4       	ldi	r25, 0x45	; 69
   19aca:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19ace:	6b e5       	ldi	r22, 0x5B	; 91
   19ad0:	71 ec       	ldi	r23, 0xC1	; 193
   19ad2:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
    } else MENU_ITEM_FUNCTION_P(_T(MSG_NOZZLE_CNG_MENU),nozzle_change);

	MENU_ITEM_SUBMENU_P(_T(MSG_MESH_BED_LEVELING), lcd_mesh_bed_leveling_settings);
   19ad6:	84 e2       	ldi	r24, 0x24	; 36
   19ad8:	96 e4       	ldi	r25, 0x46	; 70
   19ada:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19ade:	63 e0       	ldi	r22, 0x03	; 3
   19ae0:	7a ee       	ldi	r23, 0xEA	; 234
   19ae2:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>

#if defined (TMC2130) && defined (LINEARITY_CORRECTION)
    MENU_ITEM_SUBMENU_P(_T(MSG_LIN_CORRECTION), lcd_settings_linearity_correction_menu);
#endif //LINEARITY_CORRECTION && TMC2130
#ifdef PINDA_THERMISTOR
    if(has_temperature_compensation())
   19ae6:	0f 94 58 13 	call	0x226b0	; 0x226b0 <has_temperature_compensation()>
   19aea:	88 23       	and	r24, r24
   19aec:	b1 f0       	breq	.+44     	; 0x19b1a <lcd_settings_menu()+0x150>
        MENU_ITEM_TOGGLE_P(_T(MSG_PINDA_CALIBRATION), eeprom_read_byte((unsigned char *)EEPROM_TEMP_CAL_ACTIVE) ? _T(MSG_ON) : _T(MSG_OFF), lcd_temp_calibration_set);
   19aee:	8f ea       	ldi	r24, 0xAF	; 175
   19af0:	9f e0       	ldi	r25, 0x0F	; 15
   19af2:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   19af6:	88 23       	and	r24, r24
   19af8:	09 f4       	brne	.+2      	; 0x19afc <lcd_settings_menu()+0x132>
   19afa:	4e c0       	rjmp	.+156    	; 0x19b98 <lcd_settings_menu()+0x1ce>
   19afc:	8a e9       	ldi	r24, 0x9A	; 154
   19afe:	92 e6       	ldi	r25, 0x62	; 98
   19b00:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19b04:	ec 01       	movw	r28, r24
   19b06:	8c ec       	ldi	r24, 0xCC	; 204
   19b08:	95 e4       	ldi	r25, 0x45	; 69
   19b0a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19b0e:	22 e0       	ldi	r18, 0x02	; 2
   19b10:	49 e8       	ldi	r20, 0x89	; 137
   19b12:	5f eb       	ldi	r21, 0xBF	; 191
   19b14:	be 01       	movw	r22, r28
   19b16:	0e 94 5e 75 	call	0xeabc	; 0xeabc <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
#endif
#ifdef HAS_SECOND_SERIAL_PORT
    MENU_ITEM_TOGGLE_P(_T(MSG_RPI_PORT), (selectedSerialPort == 0) ? _T(MSG_OFF) : _T(MSG_ON), lcd_second_serial_set);
#endif //HAS_SECOND_SERIAL

    if (!printingIsPaused()) MENU_ITEM_SUBMENU_P(_T(MSG_BABYSTEP_Z), lcd_babystep_z);
   19b1a:	0e 94 35 66 	call	0xcc6a	; 0xcc6a <printingIsPaused()>
   19b1e:	81 11       	cpse	r24, r1
   19b20:	08 c0       	rjmp	.+16     	; 0x19b32 <lcd_settings_menu()+0x168>
   19b22:	8d ee       	ldi	r24, 0xED	; 237
   19b24:	97 e4       	ldi	r25, 0x47	; 71
   19b26:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19b2a:	68 e6       	ldi	r22, 0x68	; 104
   19b2c:	77 ed       	ldi	r23, 0xD7	; 215
   19b2e:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>

#if (LANG_MODE != 0)
	MENU_ITEM_SUBMENU_P(_T(MSG_SELECT_LANGUAGE), lcd_language_menu);
   19b32:	83 e6       	ldi	r24, 0x63	; 99
   19b34:	95 e4       	ldi	r25, 0x45	; 69
   19b36:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19b3a:	66 e1       	ldi	r22, 0x16	; 22
   19b3c:	79 ee       	ldi	r23, 0xE9	; 233
   19b3e:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
#endif //(LANG_MODE != 0)

    if (!farm_mode) { //SD related settings are not available in farm mode
   19b42:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   19b46:	81 11       	cpse	r24, r1
   19b48:	47 c0       	rjmp	.+142    	; 0x19bd8 <lcd_settings_menu()+0x20e>
        if (card.ToshibaFlashAir_isEnabled())
   19b4a:	80 91 48 16 	lds	r24, 0x1648	; 0x801648 <card+0x273>
   19b4e:	88 23       	and	r24, r24
   19b50:	31 f1       	breq	.+76     	; 0x19b9e <lcd_settings_menu()+0x1d4>
            MENU_ITEM_TOGGLE_P(_T(MSG_SD_CARD), MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY, lcd_toshiba_flash_air_compatibility_toggle);
   19b52:	89 e5       	ldi	r24, 0x59	; 89
   19b54:	95 e4       	ldi	r25, 0x45	; 69
   19b56:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19b5a:	22 e0       	ldi	r18, 0x02	; 2
   19b5c:	4f e7       	ldi	r20, 0x7F	; 127
   19b5e:	5f eb       	ldi	r21, 0xBF	; 191
   19b60:	6d e1       	ldi	r22, 0x1D	; 29
   19b62:	78 e6       	ldi	r23, 0x68	; 104
        else
            MENU_ITEM_TOGGLE_P(_T(MSG_SD_CARD), _T(MSG_NORMAL), lcd_toshiba_flash_air_compatibility_toggle);
   19b64:	0e 94 5e 75 	call	0xeabc	; 0xeabc <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
#ifdef SDCARD_SORT_ALPHA
        switch (eeprom_read_byte((uint8_t*) EEPROM_SD_SORT)) {
   19b68:	89 e0       	ldi	r24, 0x09	; 9
   19b6a:	9f e0       	ldi	r25, 0x0F	; 15
   19b6c:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   19b70:	88 23       	and	r24, r24
   19b72:	19 f1       	breq	.+70     	; 0x19bba <lcd_settings_menu()+0x1f0>
   19b74:	81 30       	cpi	r24, 0x01	; 1
   19b76:	09 f4       	brne	.+2      	; 0x19b7a <lcd_settings_menu()+0x1b0>
   19b78:	71 c0       	rjmp	.+226    	; 0x19c5c <lcd_settings_menu()+0x292>
            case SD_SORT_TIME: MENU_ITEM_TOGGLE_P(_T(MSG_SORT), _T(MSG_SORT_TIME), lcd_sort_type_set); break;
            case SD_SORT_ALPHA: MENU_ITEM_TOGGLE_P(_T(MSG_SORT), _T(MSG_SORT_ALPHA), lcd_sort_type_set); break;
            default: MENU_ITEM_TOGGLE_P(_T(MSG_SORT), _T(MSG_NONE), lcd_sort_type_set);
   19b7a:	89 e2       	ldi	r24, 0x29	; 41
   19b7c:	9b e4       	ldi	r25, 0x4B	; 75
   19b7e:	1f c0       	rjmp	.+62     	; 0x19bbe <lcd_settings_menu()+0x1f4>

#ifdef FILAMENT_SENSOR
    MENU_ITEM_SUBMENU_P(_T(MSG_FSENSOR), lcd_fsensor_settings_menu);
#endif //FILAMENT_SENSOR

    MENU_ITEM_TOGGLE_P(PSTR("MMU"), eeprom_read_byte((uint8_t *)EEPROM_MMU_ENABLED) ? _T(MSG_ON) : _T(MSG_OFF), mmu_enable_switch);
   19b80:	84 e9       	ldi	r24, 0x94	; 148
   19b82:	92 e6       	ldi	r25, 0x62	; 98
   19b84:	6e cf       	rjmp	.-292    	; 0x19a62 <lcd_settings_menu()+0x98>

    if(!farm_mode)
    {
        bSettings=true;                              // flag ('fake parameter') for 'lcd_hw_setup_menu()' function
        MENU_ITEM_SUBMENU_P(_T(MSG_HW_SETUP), lcd_hw_setup_menu);
    } else MENU_ITEM_FUNCTION_P(_T(MSG_NOZZLE_CNG_MENU),nozzle_change);
   19b86:	85 e7       	ldi	r24, 0x75	; 117
   19b88:	95 e4       	ldi	r25, 0x45	; 69
   19b8a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19b8e:	6c e4       	ldi	r22, 0x4C	; 76
   19b90:	7b ee       	ldi	r23, 0xEB	; 235
   19b92:	0e 94 9d 72 	call	0xe53a	; 0xe53a <menu_item_function_P(char const*, void (*)())>
   19b96:	9f cf       	rjmp	.-194    	; 0x19ad6 <lcd_settings_menu()+0x10c>
#if defined (TMC2130) && defined (LINEARITY_CORRECTION)
    MENU_ITEM_SUBMENU_P(_T(MSG_LIN_CORRECTION), lcd_settings_linearity_correction_menu);
#endif //LINEARITY_CORRECTION && TMC2130
#ifdef PINDA_THERMISTOR
    if(has_temperature_compensation())
        MENU_ITEM_TOGGLE_P(_T(MSG_PINDA_CALIBRATION), eeprom_read_byte((unsigned char *)EEPROM_TEMP_CAL_ACTIVE) ? _T(MSG_ON) : _T(MSG_OFF), lcd_temp_calibration_set);
   19b98:	84 e9       	ldi	r24, 0x94	; 148
   19b9a:	92 e6       	ldi	r25, 0x62	; 98
   19b9c:	b1 cf       	rjmp	.-158    	; 0x19b00 <lcd_settings_menu()+0x136>

    if (!farm_mode) { //SD related settings are not available in farm mode
        if (card.ToshibaFlashAir_isEnabled())
            MENU_ITEM_TOGGLE_P(_T(MSG_SD_CARD), MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY, lcd_toshiba_flash_air_compatibility_toggle);
        else
            MENU_ITEM_TOGGLE_P(_T(MSG_SD_CARD), _T(MSG_NORMAL), lcd_toshiba_flash_air_compatibility_toggle);
   19b9e:	80 e5       	ldi	r24, 0x50	; 80
   19ba0:	95 e4       	ldi	r25, 0x45	; 69
   19ba2:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19ba6:	ec 01       	movw	r28, r24
   19ba8:	89 e5       	ldi	r24, 0x59	; 89
   19baa:	95 e4       	ldi	r25, 0x45	; 69
   19bac:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19bb0:	22 e0       	ldi	r18, 0x02	; 2
   19bb2:	4f e7       	ldi	r20, 0x7F	; 127
   19bb4:	5f eb       	ldi	r21, 0xBF	; 191
   19bb6:	be 01       	movw	r22, r28
   19bb8:	d5 cf       	rjmp	.-86     	; 0x19b64 <lcd_settings_menu()+0x19a>
#ifdef SDCARD_SORT_ALPHA
        switch (eeprom_read_byte((uint8_t*) EEPROM_SD_SORT)) {
            case SD_SORT_TIME: MENU_ITEM_TOGGLE_P(_T(MSG_SORT), _T(MSG_SORT_TIME), lcd_sort_type_set); break;
   19bba:	89 e4       	ldi	r24, 0x49	; 73
   19bbc:	95 e4       	ldi	r25, 0x45	; 69
            case SD_SORT_ALPHA: MENU_ITEM_TOGGLE_P(_T(MSG_SORT), _T(MSG_SORT_ALPHA), lcd_sort_type_set); break;
            default: MENU_ITEM_TOGGLE_P(_T(MSG_SORT), _T(MSG_NONE), lcd_sort_type_set);
   19bbe:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19bc2:	ec 01       	movw	r28, r24
   19bc4:	82 e4       	ldi	r24, 0x42	; 66
   19bc6:	95 e4       	ldi	r25, 0x45	; 69
   19bc8:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19bcc:	22 e0       	ldi	r18, 0x02	; 2
   19bce:	4b ea       	ldi	r20, 0xAB	; 171
   19bd0:	5f eb       	ldi	r21, 0xBF	; 191
   19bd2:	be 01       	movw	r22, r28
   19bd4:	0e 94 5e 75 	call	0xeabc	; 0xeabc <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
        }
    }
#endif //SDCARD_SORT_ALPHA

	SETTINGS_SOUND;
   19bd8:	80 91 47 04 	lds	r24, 0x0447	; 0x800447 <eSoundMode>
   19bdc:	82 30       	cpi	r24, 0x02	; 2
   19bde:	09 f4       	brne	.+2      	; 0x19be2 <lcd_settings_menu()+0x218>
   19be0:	43 c0       	rjmp	.+134    	; 0x19c68 <lcd_settings_menu()+0x29e>
   19be2:	83 30       	cpi	r24, 0x03	; 3
   19be4:	09 f4       	brne	.+2      	; 0x19be8 <lcd_settings_menu()+0x21e>
   19be6:	43 c0       	rjmp	.+134    	; 0x19c6e <lcd_settings_menu()+0x2a4>
   19be8:	81 30       	cpi	r24, 0x01	; 1
   19bea:	d9 f1       	breq	.+118    	; 0x19c62 <lcd_settings_menu()+0x298>
   19bec:	8d e2       	ldi	r24, 0x2D	; 45
   19bee:	98 e4       	ldi	r25, 0x48	; 72
   19bf0:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19bf4:	ec 01       	movw	r28, r24
   19bf6:	85 e2       	ldi	r24, 0x25	; 37
   19bf8:	98 e4       	ldi	r25, 0x48	; 72
   19bfa:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19bfe:	22 e0       	ldi	r18, 0x02	; 2
   19c00:	44 e9       	ldi	r20, 0x94	; 148
   19c02:	5f eb       	ldi	r21, 0xBF	; 191
   19c04:	be 01       	movw	r22, r28
   19c06:	0e 94 5e 75 	call	0xeabc	; 0xeabc <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
        MENU_ITEM_SUBMENU_P(_T(MSG_BRIGHTNESS), lcd_backlight_menu);
    }
#endif //LCD_BL_PIN

    //! Enables/disables the bed heating while heating the nozzle for loading/unloading filament
    MENU_ITEM_TOGGLE_P(_N("HBed on load"), eeprom_read_byte((uint8_t *)EEPROM_HEAT_BED_ON_LOAD_FILAMENT) ? _T(MSG_YES) : _T(MSG_NO), lcd_heat_bed_on_load_toggle); ////MSG_HEAT_BED_ON_LOAD c=12
   19c0a:	87 ea       	ldi	r24, 0xA7	; 167
   19c0c:	9c e0       	ldi	r25, 0x0C	; 12
   19c0e:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   19c12:	88 23       	and	r24, r24
   19c14:	79 f1       	breq	.+94     	; 0x19c74 <lcd_settings_menu()+0x2aa>
   19c16:	89 e9       	ldi	r24, 0x99	; 153
   19c18:	98 e4       	ldi	r25, 0x48	; 72
   19c1a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19c1e:	22 e0       	ldi	r18, 0x02	; 2
   19c20:	45 e0       	ldi	r20, 0x05	; 5
   19c22:	5f eb       	ldi	r21, 0xBF	; 191
   19c24:	bc 01       	movw	r22, r24
   19c26:	80 e1       	ldi	r24, 0x10	; 16
   19c28:	98 e6       	ldi	r25, 0x68	; 104
   19c2a:	0e 94 5e 75 	call	0xeabc	; 0xeabc <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>

	if (farm_mode)
   19c2e:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   19c32:	88 23       	and	r24, r24
   19c34:	31 f0       	breq	.+12     	; 0x19c42 <lcd_settings_menu()+0x278>
	{
		MENU_ITEM_FUNCTION_P(PSTR("Disable farm mode"), lcd_disable_farm_mode);
   19c36:	60 e8       	ldi	r22, 0x80	; 128
   19c38:	79 ee       	ldi	r23, 0xE9	; 233
   19c3a:	8e e7       	ldi	r24, 0x7E	; 126
   19c3c:	93 e8       	ldi	r25, 0x83	; 131
   19c3e:	0e 94 9d 72 	call	0xe53a	; 0xe53a <menu_item_function_P(char const*, void (*)())>
	}

	MENU_END();
   19c42:	0e 94 83 62 	call	0xc506	; 0xc506 <menu_end()>
}

static void lcd_settings_menu()
{
	SilentModeMenu = eeprom_read_byte((uint8_t*) EEPROM_SILENT);
	MENU_BEGIN();
   19c46:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   19c4a:	8f 5f       	subi	r24, 0xFF	; 255
   19c4c:	80 93 60 04 	sts	0x0460, r24	; 0x800460 <menu_row>
   19c50:	80 91 62 04 	lds	r24, 0x0462	; 0x800462 <menu_line>
   19c54:	8f 5f       	subi	r24, 0xFF	; 255
   19c56:	80 93 62 04 	sts	0x0462, r24	; 0x800462 <menu_line>
   19c5a:	c5 ce       	rjmp	.-630    	; 0x199e6 <lcd_settings_menu()+0x1c>
        else
            MENU_ITEM_TOGGLE_P(_T(MSG_SD_CARD), _T(MSG_NORMAL), lcd_toshiba_flash_air_compatibility_toggle);
#ifdef SDCARD_SORT_ALPHA
        switch (eeprom_read_byte((uint8_t*) EEPROM_SD_SORT)) {
            case SD_SORT_TIME: MENU_ITEM_TOGGLE_P(_T(MSG_SORT), _T(MSG_SORT_TIME), lcd_sort_type_set); break;
            case SD_SORT_ALPHA: MENU_ITEM_TOGGLE_P(_T(MSG_SORT), _T(MSG_SORT_ALPHA), lcd_sort_type_set); break;
   19c5c:	87 e3       	ldi	r24, 0x37	; 55
   19c5e:	95 e4       	ldi	r25, 0x45	; 69
   19c60:	ae cf       	rjmp	.-164    	; 0x19bbe <lcd_settings_menu()+0x1f4>
            default: MENU_ITEM_TOGGLE_P(_T(MSG_SORT), _T(MSG_NONE), lcd_sort_type_set);
        }
    }
#endif //SDCARD_SORT_ALPHA

	SETTINGS_SOUND;
   19c62:	8e e1       	ldi	r24, 0x1E	; 30
   19c64:	98 e4       	ldi	r25, 0x48	; 72
   19c66:	c4 cf       	rjmp	.-120    	; 0x19bf0 <lcd_settings_menu()+0x226>
   19c68:	8c ef       	ldi	r24, 0xFC	; 252
   19c6a:	9a e4       	ldi	r25, 0x4A	; 74
   19c6c:	c1 cf       	rjmp	.-126    	; 0x19bf0 <lcd_settings_menu()+0x226>
   19c6e:	85 e1       	ldi	r24, 0x15	; 21
   19c70:	98 e4       	ldi	r25, 0x48	; 72
   19c72:	be cf       	rjmp	.-132    	; 0x19bf0 <lcd_settings_menu()+0x226>
        MENU_ITEM_SUBMENU_P(_T(MSG_BRIGHTNESS), lcd_backlight_menu);
    }
#endif //LCD_BL_PIN

    //! Enables/disables the bed heating while heating the nozzle for loading/unloading filament
    MENU_ITEM_TOGGLE_P(_N("HBed on load"), eeprom_read_byte((uint8_t *)EEPROM_HEAT_BED_ON_LOAD_FILAMENT) ? _T(MSG_YES) : _T(MSG_NO), lcd_heat_bed_on_load_toggle); ////MSG_HEAT_BED_ON_LOAD c=12
   19c74:	8f e9       	ldi	r24, 0x9F	; 159
   19c76:	98 e4       	ldi	r25, 0x48	; 72
   19c78:	d0 cf       	rjmp	.-96     	; 0x19c1a <lcd_settings_menu()+0x250>
	{
		MENU_ITEM_FUNCTION_P(PSTR("Disable farm mode"), lcd_disable_farm_mode);
	}

	MENU_END();
}
   19c7a:	df 91       	pop	r29
   19c7c:	cf 91       	pop	r28
   19c7e:	1f 91       	pop	r17
   19c80:	08 95       	ret

00019c82 <lcd_calibration_menu()>:
}
#endif //TMC2130

static void lcd_calibration_menu()
{
    MENU_BEGIN();
   19c82:	0e 94 0c 74 	call	0xe818	; 0xe818 <menu_start()>
   19c86:	10 92 60 04 	sts	0x0460, r1	; 0x800460 <menu_row>
   19c8a:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   19c8e:	84 30       	cpi	r24, 0x04	; 4
   19c90:	08 f0       	brcs	.+2      	; 0x19c94 <lcd_calibration_menu()+0x12>
   19c92:	7d c0       	rjmp	.+250    	; 0x19d8e <lcd_calibration_menu()+0x10c>
   19c94:	10 92 63 04 	sts	0x0463, r1	; 0x800463 <menu_item>
    MENU_ITEM_BACK_P(_T(MSG_MAIN));
   19c98:	8f ed       	ldi	r24, 0xDF	; 223
   19c9a:	98 e4       	ldi	r25, 0x48	; 72
   19c9c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19ca0:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
    MENU_ITEM_FUNCTION_P(_T(MSG_WIZARD), lcd_wizard);
   19ca4:	81 e6       	ldi	r24, 0x61	; 97
   19ca6:	96 e4       	ldi	r25, 0x46	; 70
   19ca8:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19cac:	61 ec       	ldi	r22, 0xC1	; 193
   19cae:	7b ef       	ldi	r23, 0xFB	; 251
   19cb0:	0e 94 9d 72 	call	0xe53a	; 0xe53a <menu_item_function_P(char const*, void (*)())>
    if (lcd_commands_type == LcdCommands::Idle)
   19cb4:	80 91 5e 0d 	lds	r24, 0x0D5E	; 0x800d5e <lcd_commands_type>
   19cb8:	81 11       	cpse	r24, r1
   19cba:	08 c0       	rjmp	.+16     	; 0x19ccc <lcd_calibration_menu()+0x4a>
    {
        MENU_ITEM_SUBMENU_P(_T(MSG_V2_CALIBRATION), lcd_first_layer_calibration_reset);
   19cbc:	80 ec       	ldi	r24, 0xC0	; 192
   19cbe:	96 e4       	ldi	r25, 0x46	; 70
   19cc0:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19cc4:	69 e9       	ldi	r22, 0x99	; 153
   19cc6:	78 ed       	ldi	r23, 0xD8	; 216
   19cc8:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
    }
    MENU_ITEM_GCODE_P(_T(MSG_AUTO_HOME), G28W);
   19ccc:	81 ec       	ldi	r24, 0xC1	; 193
   19cce:	91 e6       	ldi	r25, 0x61	; 97
   19cd0:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19cd4:	61 ed       	ldi	r22, 0xD1	; 209
   19cd6:	78 e6       	ldi	r23, 0x68	; 104
   19cd8:	0e 94 68 8f 	call	0x11ed0	; 0x11ed0 <menu_item_gcode_P(char const*, char const*)>
#ifdef TMC2130
    MENU_ITEM_FUNCTION_P(_T(MSG_BELTTEST), lcd_belttest_v);
#endif //TMC2130
    MENU_ITEM_FUNCTION_P(_T(MSG_SELFTEST), lcd_selftest_v);
   19cdc:	86 e5       	ldi	r24, 0x56	; 86
   19cde:	96 e4       	ldi	r25, 0x46	; 70
   19ce0:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19ce4:	6c e7       	ldi	r22, 0x7C	; 124
   19ce6:	73 ee       	ldi	r23, 0xE3	; 227
   19ce8:	0e 94 9d 72 	call	0xe53a	; 0xe53a <menu_item_function_P(char const*, void (*)())>
    // MK2
    MENU_ITEM_FUNCTION_P(_T(MSG_CALIBRATE_BED), lcd_mesh_calibration);
   19cec:	86 e4       	ldi	r24, 0x46	; 70
   19cee:	96 e4       	ldi	r25, 0x46	; 70
   19cf0:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19cf4:	63 e7       	ldi	r22, 0x73	; 115
   19cf6:	74 ec       	ldi	r23, 0xC4	; 196
   19cf8:	0e 94 9d 72 	call	0xe53a	; 0xe53a <menu_item_function_P(char const*, void (*)())>
    // "Calibrate Z" with storing the reference values to EEPROM.
    MENU_ITEM_FUNCTION_P(_T(MSG_HOMEYZ), lcd_mesh_calibration_z);
   19cfc:	88 e3       	ldi	r24, 0x38	; 56
   19cfe:	96 e4       	ldi	r25, 0x46	; 70
   19d00:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19d04:	6a e7       	ldi	r22, 0x7A	; 122
   19d06:	74 ec       	ldi	r23, 0xC4	; 196
   19d08:	0e 94 9d 72 	call	0xe53a	; 0xe53a <menu_item_function_P(char const*, void (*)())>

    MENU_ITEM_SUBMENU_P(_T(MSG_MESH_BED_LEVELING), lcd_mesh_bedleveling); ////MSG_MESH_BED_LEVELING c=18
   19d0c:	84 e2       	ldi	r24, 0x24	; 36
   19d0e:	96 e4       	ldi	r25, 0x46	; 70
   19d10:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19d14:	61 e8       	ldi	r22, 0x81	; 129
   19d16:	74 ec       	ldi	r23, 0xC4	; 196
   19d18:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>

    MENU_ITEM_SUBMENU_P(_T(MSG_BED_CORRECTION_MENU), lcd_adjust_bed);
   19d1c:	80 e1       	ldi	r24, 0x10	; 16
   19d1e:	96 e4       	ldi	r25, 0x46	; 70
   19d20:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19d24:	6e e6       	ldi	r22, 0x6E	; 110
   19d26:	7b ec       	ldi	r23, 0xCB	; 203
   19d28:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
    MENU_ITEM_SUBMENU_P(_T(MSG_PID_EXTRUDER), pid_extruder);
   19d2c:	8e ef       	ldi	r24, 0xFE	; 254
   19d2e:	95 e4       	ldi	r25, 0x45	; 69
   19d30:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19d34:	67 e8       	ldi	r22, 0x87	; 135
   19d36:	70 ec       	ldi	r23, 0xC0	; 192
   19d38:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
#ifndef TMC2130
    MENU_ITEM_SUBMENU_P(_T(MSG_SHOW_END_STOPS), menu_show_end_stops);
   19d3c:	8d ee       	ldi	r24, 0xED	; 237
   19d3e:	95 e4       	ldi	r25, 0x45	; 69
   19d40:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19d44:	6d e6       	ldi	r22, 0x6D	; 109
   19d46:	7f ed       	ldi	r23, 0xDF	; 223
   19d48:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
#endif
    MENU_ITEM_GCODE_P(_T(MSG_CALIBRATE_BED_RESET), PSTR("M44"));
   19d4c:	89 ed       	ldi	r24, 0xD9	; 217
   19d4e:	95 e4       	ldi	r25, 0x45	; 69
   19d50:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19d54:	6e e9       	ldi	r22, 0x9E	; 158
   19d56:	73 e8       	ldi	r23, 0x83	; 131
   19d58:	0e 94 68 8f 	call	0x11ed0	; 0x11ed0 <menu_item_gcode_P(char const*, char const*)>
#ifdef PINDA_THERMISTOR
    if(has_temperature_compensation())
   19d5c:	0f 94 58 13 	call	0x226b0	; 0x226b0 <has_temperature_compensation()>
   19d60:	88 23       	and	r24, r24
   19d62:	41 f0       	breq	.+16     	; 0x19d74 <lcd_calibration_menu()+0xf2>
        MENU_ITEM_FUNCTION_P(_T(MSG_PINDA_CALIBRATION), lcd_calibrate_pinda);
   19d64:	8c ec       	ldi	r24, 0xCC	; 204
   19d66:	95 e4       	ldi	r25, 0x45	; 69
   19d68:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19d6c:	68 e8       	ldi	r22, 0x88	; 136
   19d6e:	74 ec       	ldi	r23, 0xC4	; 196
   19d70:	0e 94 9d 72 	call	0xe53a	; 0xe53a <menu_item_function_P(char const*, void (*)())>

#ifdef THERMAL_MODEL
    MENU_ITEM_FUNCTION_P(_n("Thermal Model cal."), lcd_thermal_model_cal);
#endif //THERMAL_MODEL

    MENU_END();
   19d74:	0e 94 83 62 	call	0xc506	; 0xc506 <menu_end()>
}
#endif //TMC2130

static void lcd_calibration_menu()
{
    MENU_BEGIN();
   19d78:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   19d7c:	8f 5f       	subi	r24, 0xFF	; 255
   19d7e:	80 93 60 04 	sts	0x0460, r24	; 0x800460 <menu_row>
   19d82:	80 91 62 04 	lds	r24, 0x0462	; 0x800462 <menu_line>
   19d86:	8f 5f       	subi	r24, 0xFF	; 255
   19d88:	80 93 62 04 	sts	0x0462, r24	; 0x800462 <menu_line>
   19d8c:	7e cf       	rjmp	.-260    	; 0x19c8a <lcd_calibration_menu()+0x8>
#ifdef THERMAL_MODEL
    MENU_ITEM_FUNCTION_P(_n("Thermal Model cal."), lcd_thermal_model_cal);
#endif //THERMAL_MODEL

    MENU_END();
}
   19d8e:	08 95       	ret

00019d90 <lcd_move_e()>:
}


void lcd_move_e()
{
	if ((int)degHotend0() > extrude_min_temp)
   19d90:	60 91 5a 0d 	lds	r22, 0x0D5A	; 0x800d5a <current_temperature>
   19d94:	70 91 5b 0d 	lds	r23, 0x0D5B	; 0x800d5b <current_temperature+0x1>
   19d98:	80 91 5c 0d 	lds	r24, 0x0D5C	; 0x800d5c <current_temperature+0x2>
   19d9c:	90 91 5d 0d 	lds	r25, 0x0D5D	; 0x800d5d <current_temperature+0x3>
   19da0:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   19da4:	20 91 57 02 	lds	r18, 0x0257	; 0x800257 <extrude_min_temp>
   19da8:	30 91 58 02 	lds	r19, 0x0258	; 0x800258 <extrude_min_temp+0x1>
   19dac:	26 17       	cp	r18, r22
   19dae:	37 07       	cpc	r19, r23
   19db0:	0c f0       	brlt	.+2      	; 0x19db4 <lcd_move_e()+0x24>
   19db2:	65 c0       	rjmp	.+202    	; 0x19e7e <lcd_move_e()+0xee>
	{
		if (lcd_encoder != 0)
   19db4:	80 91 1e 06 	lds	r24, 0x061E	; 0x80061e <lcd_encoder>
   19db8:	90 91 1f 06 	lds	r25, 0x061F	; 0x80061f <lcd_encoder+0x1>
   19dbc:	89 2b       	or	r24, r25
   19dbe:	b9 f1       	breq	.+110    	; 0x19e2e <lcd_move_e()+0x9e>
		{
			refresh_cmd_timeout();
   19dc0:	0e 94 41 65 	call	0xca82	; 0xca82 <refresh_cmd_timeout()>
}

FORCE_INLINE bool planner_queue_full() {
    uint8_t next_block_index = block_buffer_head;
   19dc4:	80 91 3e 0d 	lds	r24, 0x0D3E	; 0x800d3e <block_buffer_head>
    if (++ next_block_index == BLOCK_BUFFER_SIZE)
   19dc8:	8f 5f       	subi	r24, 0xFF	; 255
   19dca:	80 31       	cpi	r24, 0x10	; 16
   19dcc:	09 f4       	brne	.+2      	; 0x19dd0 <lcd_move_e()+0x40>
        next_block_index = 0;
   19dce:	80 e0       	ldi	r24, 0x00	; 0
    return block_buffer_tail == next_block_index;
   19dd0:	90 91 3f 0d 	lds	r25, 0x0D3F	; 0x800d3f <block_buffer_tail>
			if (! planner_queue_full())
   19dd4:	98 17       	cp	r25, r24
   19dd6:	59 f1       	breq	.+86     	; 0x19e2e <lcd_move_e()+0x9e>
			{
				current_position[E_AXIS] += lcd_encoder;
   19dd8:	60 91 1e 06 	lds	r22, 0x061E	; 0x80061e <lcd_encoder>
   19ddc:	70 91 1f 06 	lds	r23, 0x061F	; 0x80061f <lcd_encoder+0x1>
   19de0:	07 2e       	mov	r0, r23
   19de2:	00 0c       	add	r0, r0
   19de4:	88 0b       	sbc	r24, r24
   19de6:	99 0b       	sbc	r25, r25
   19de8:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   19dec:	9b 01       	movw	r18, r22
   19dee:	ac 01       	movw	r20, r24
   19df0:	60 91 6d 12 	lds	r22, 0x126D	; 0x80126d <current_position+0xc>
   19df4:	70 91 6e 12 	lds	r23, 0x126E	; 0x80126e <current_position+0xd>
   19df8:	80 91 6f 12 	lds	r24, 0x126F	; 0x80126f <current_position+0xe>
   19dfc:	90 91 70 12 	lds	r25, 0x1270	; 0x801270 <current_position+0xf>
   19e00:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   19e04:	60 93 6d 12 	sts	0x126D, r22	; 0x80126d <current_position+0xc>
   19e08:	70 93 6e 12 	sts	0x126E, r23	; 0x80126e <current_position+0xd>
   19e0c:	80 93 6f 12 	sts	0x126F, r24	; 0x80126f <current_position+0xe>
   19e10:	90 93 70 12 	sts	0x1270, r25	; 0x801270 <current_position+0xf>
				lcd_encoder = 0;
   19e14:	10 92 1f 06 	sts	0x061F, r1	; 0x80061f <lcd_encoder+0x1>
   19e18:	10 92 1e 06 	sts	0x061E, r1	; 0x80061e <lcd_encoder>
				plan_buffer_line_curposXYZE(manual_feedrate[E_AXIS] / 60);
   19e1c:	65 e5       	ldi	r22, 0x55	; 85
   19e1e:	75 e5       	ldi	r23, 0x55	; 85
   19e20:	85 ed       	ldi	r24, 0xD5	; 213
   19e22:	9f e3       	ldi	r25, 0x3F	; 63
   19e24:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
				lcd_draw_update = 1;
   19e28:	81 e0       	ldi	r24, 0x01	; 1
   19e2a:	80 93 59 02 	sts	0x0259, r24	; 0x800259 <lcd_draw_update>
			}
		}
		if (lcd_draw_update)
   19e2e:	80 91 59 02 	lds	r24, 0x0259	; 0x800259 <lcd_draw_update>
   19e32:	88 23       	and	r24, r24
   19e34:	11 f1       	breq	.+68     	; 0x19e7a <lcd_move_e()+0xea>
		{
		    lcd_set_cursor(0, 1);
   19e36:	61 e0       	ldi	r22, 0x01	; 1
   19e38:	80 e0       	ldi	r24, 0x00	; 0
   19e3a:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
//! The text needs to come with a colon ":", this function does not append it anymore.
//! That resulted in a much shorter implementation (234628B -> 234476B)
//! There are similar functions around which may be shortened in a similar way
void menu_draw_float31(const char* str, float val)
{
	lcd_printf_P(menu_fmt_float31, str, val);
   19e3e:	80 91 70 12 	lds	r24, 0x1270	; 0x801270 <current_position+0xf>
   19e42:	8f 93       	push	r24
   19e44:	80 91 6f 12 	lds	r24, 0x126F	; 0x80126f <current_position+0xe>
   19e48:	8f 93       	push	r24
   19e4a:	80 91 6e 12 	lds	r24, 0x126E	; 0x80126e <current_position+0xd>
   19e4e:	8f 93       	push	r24
   19e50:	80 91 6d 12 	lds	r24, 0x126D	; 0x80126d <current_position+0xc>
   19e54:	8f 93       	push	r24
   19e56:	89 e6       	ldi	r24, 0x69	; 105
   19e58:	92 e8       	ldi	r25, 0x82	; 130
   19e5a:	9f 93       	push	r25
   19e5c:	8f 93       	push	r24
   19e5e:	8a e5       	ldi	r24, 0x5A	; 90
   19e60:	92 e8       	ldi	r25, 0x82	; 130
   19e62:	9f 93       	push	r25
   19e64:	8f 93       	push	r24
   19e66:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
   19e6a:	8d b7       	in	r24, 0x3d	; 61
   19e6c:	9e b7       	in	r25, 0x3e	; 62
   19e6e:	08 96       	adiw	r24, 0x08	; 8
   19e70:	0f b6       	in	r0, 0x3f	; 63
   19e72:	f8 94       	cli
   19e74:	9e bf       	out	0x3e, r25	; 62
   19e76:	0f be       	out	0x3f, r0	; 63
   19e78:	8d bf       	out	0x3d, r24	; 61
			// Note: the colon behind the text is necessary to greatly shorten
			// the implementation of menu_draw_float31
			menu_draw_float31(PSTR("Extruder:"), current_position[E_AXIS]);
		}
		menu_back_if_clicked();
   19e7a:	0c 94 06 74 	jmp	0xe80c	; 0xe80c <menu_back_if_clicked()>
    };
}

void show_preheat_nozzle_warning()
{
    lcd_clear();
   19e7e:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
    lcd_puts_at_P(0, 0, _T(MSG_ERROR));
   19e82:	87 e6       	ldi	r24, 0x67	; 103
   19e84:	9a e3       	ldi	r25, 0x3A	; 58
   19e86:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19e8a:	ac 01       	movw	r20, r24
   19e8c:	60 e0       	ldi	r22, 0x00	; 0
   19e8e:	80 e0       	ldi	r24, 0x00	; 0
   19e90:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
    lcd_puts_at_P(0, 2, _T(MSG_PREHEAT_NOZZLE));
   19e94:	81 e5       	ldi	r24, 0x51	; 81
   19e96:	9a e3       	ldi	r25, 0x3A	; 58
   19e98:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19e9c:	ac 01       	movw	r20, r24
   19e9e:	62 e0       	ldi	r22, 0x02	; 2
   19ea0:	80 e0       	ldi	r24, 0x00	; 0
   19ea2:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
    _delay(2000);
   19ea6:	60 ed       	ldi	r22, 0xD0	; 208
   19ea8:	77 e0       	ldi	r23, 0x07	; 7
   19eaa:	80 e0       	ldi	r24, 0x00	; 0
   19eac:	90 e0       	ldi	r25, 0x00	; 0
   19eae:	0f 94 bd 0d 	call	0x21b7a	; 0x21b7a <delay2>
    lcd_clear();
   19eb2:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
		menu_back_if_clicked();
	}
	else
	{
		show_preheat_nozzle_warning();
		lcd_return_to_status();
   19eb6:	0d 94 d5 07 	jmp	0x20faa	; 0x20faa <lcd_return_to_status()>

00019eba <lcd_sd_refresh()>:
static void lcd_sd_refresh()
{
#if SDCARDDETECT == -1
  card.mount();
#else
  card.presort();
   19eba:	0f 94 32 6f 	call	0x2de64	; 0x2de64 <CardReader::presort() [clone .constprop.194]>
#endif
  menu_top = 0;
   19ebe:	10 92 92 03 	sts	0x0392, r1	; 0x800392 <menu_top>
  lcd_encoder = 0;
   19ec2:	10 92 1f 06 	sts	0x061F, r1	; 0x80061f <lcd_encoder+0x1>
   19ec6:	10 92 1e 06 	sts	0x061E, r1	; 0x80061e <lcd_encoder>
  menu_data_reset(); //Forces reloading of cached variables.
   19eca:	0c 94 af 62 	jmp	0xc55e	; 0xc55e <menu_data_reset()>

00019ece <lcd_sd_updir()>:
  }
}

void CardReader::updir()
{
  if(workDirDepth > 0)
   19ece:	80 91 77 15 	lds	r24, 0x1577	; 0x801577 <card+0x1a2>
   19ed2:	88 23       	and	r24, r24
   19ed4:	f9 f0       	breq	.+62     	; 0x19f14 <lcd_sd_updir()+0x46>
  {
    --workDirDepth;
   19ed6:	81 50       	subi	r24, 0x01	; 1
   19ed8:	80 93 77 15 	sts	0x1577, r24	; 0x801577 <card+0x1a2>
    workDir = workDirParents[0];
   19edc:	93 e2       	ldi	r25, 0x23	; 35
   19ede:	e5 ea       	ldi	r30, 0xA5	; 165
   19ee0:	f4 e1       	ldi	r31, 0x14	; 20
   19ee2:	a2 e8       	ldi	r26, 0x82	; 130
   19ee4:	b4 e1       	ldi	r27, 0x14	; 20
   19ee6:	01 90       	ld	r0, Z+
   19ee8:	0d 92       	st	X+, r0
   19eea:	9a 95       	dec	r25
   19eec:	e1 f7       	brne	.-8      	; 0x19ee6 <lcd_sd_updir()+0x18>
   19eee:	25 ea       	ldi	r18, 0xA5	; 165
   19ef0:	34 e1       	ldi	r19, 0x14	; 20
    for (uint8_t d = 0; d < workDirDepth; d++)
   19ef2:	90 e0       	ldi	r25, 0x00	; 0
   19ef4:	98 17       	cp	r25, r24
   19ef6:	60 f4       	brcc	.+24     	; 0x19f10 <lcd_sd_updir()+0x42>
    {
        workDirParents[d] = workDirParents[d+1];
   19ef8:	43 e2       	ldi	r20, 0x23	; 35
   19efa:	f9 01       	movw	r30, r18
   19efc:	b3 96       	adiw	r30, 0x23	; 35
   19efe:	d9 01       	movw	r26, r18
   19f00:	01 90       	ld	r0, Z+
   19f02:	0d 92       	st	X+, r0
   19f04:	4a 95       	dec	r20
   19f06:	e1 f7       	brne	.-8      	; 0x19f00 <lcd_sd_updir()+0x32>
{
  if(workDirDepth > 0)
  {
    --workDirDepth;
    workDir = workDirParents[0];
    for (uint8_t d = 0; d < workDirDepth; d++)
   19f08:	9f 5f       	subi	r25, 0xFF	; 255
   19f0a:	2d 5d       	subi	r18, 0xDD	; 221
   19f0c:	3f 4f       	sbci	r19, 0xFF	; 255
   19f0e:	f2 cf       	rjmp	.-28     	; 0x19ef4 <lcd_sd_updir()+0x26>
    {
        workDirParents[d] = workDirParents[d+1];
    }
	#ifdef SDCARD_SORT_ALPHA
    presort();
   19f10:	0f 94 32 6f 	call	0x2de64	; 0x2de64 <CardReader::presort() [clone .constprop.194]>
}

static void lcd_sd_updir()
{
  card.updir();
  menu_top = 0;
   19f14:	10 92 92 03 	sts	0x0392, r1	; 0x800392 <menu_top>
  lcd_encoder = 0;
   19f18:	10 92 1f 06 	sts	0x061F, r1	; 0x80061f <lcd_encoder+0x1>
   19f1c:	10 92 1e 06 	sts	0x061E, r1	; 0x80061e <lcd_encoder>
  menu_data_reset(); //Forces reloading of cached variables.
   19f20:	0c 94 af 62 	jmp	0xc55e	; 0xc55e <menu_data_reset()>

00019f24 <mmu_preload_filament_menu()>:

static inline void load_filament_wrapper(uint8_t i){
    MMU2::mmu2.load_filament(i);
}

static void mmu_preload_filament_menu() {
   19f24:	cf 93       	push	r28
    MENU_BEGIN();
   19f26:	0e 94 0c 74 	call	0xe818	; 0xe818 <menu_start()>
   19f2a:	10 92 60 04 	sts	0x0460, r1	; 0x800460 <menu_row>
   19f2e:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   19f32:	84 30       	cpi	r24, 0x04	; 4
   19f34:	60 f5       	brcc	.+88     	; 0x19f8e <mmu_preload_filament_menu()+0x6a>
   19f36:	10 92 63 04 	sts	0x0463, r1	; 0x800463 <menu_item>
    MENU_ITEM_BACK_P(_T(MSG_MAIN));
   19f3a:	8f ed       	ldi	r24, 0xDF	; 223
   19f3c:	98 e4       	ldi	r25, 0x48	; 72
   19f3e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19f42:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
    MENU_ITEM_FUNCTION_P(_T(MSG_LOAD_ALL), load_all_wrapper);
   19f46:	8d e7       	ldi	r24, 0x7D	; 125
   19f48:	96 e4       	ldi	r25, 0x46	; 70
   19f4a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19f4e:	66 e8       	ldi	r22, 0x86	; 134
   19f50:	70 ed       	ldi	r23, 0xD0	; 208
   19f52:	0e 94 9d 72 	call	0xe53a	; 0xe53a <menu_item_function_P(char const*, void (*)())>
    for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++)
   19f56:	c0 e0       	ldi	r28, 0x00	; 0
        MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), i + '1', load_filament_wrapper, i);
   19f58:	82 e4       	ldi	r24, 0x42	; 66
   19f5a:	97 e4       	ldi	r25, 0x47	; 71
   19f5c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19f60:	61 e3       	ldi	r22, 0x31	; 49
   19f62:	6c 0f       	add	r22, r28
   19f64:	2c 2f       	mov	r18, r28
   19f66:	45 e9       	ldi	r20, 0x95	; 149
   19f68:	50 ed       	ldi	r21, 0xD0	; 208
   19f6a:	0e 94 2f 72 	call	0xe45e	; 0xe45e <menu_item_function_P(char const*, char, void (*)(unsigned char), unsigned char)>

static void mmu_preload_filament_menu() {
    MENU_BEGIN();
    MENU_ITEM_BACK_P(_T(MSG_MAIN));
    MENU_ITEM_FUNCTION_P(_T(MSG_LOAD_ALL), load_all_wrapper);
    for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++)
   19f6e:	cf 5f       	subi	r28, 0xFF	; 255
   19f70:	c5 30       	cpi	r28, 0x05	; 5
   19f72:	91 f7       	brne	.-28     	; 0x19f58 <mmu_preload_filament_menu()+0x34>
        MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), i + '1', load_filament_wrapper, i);
    MENU_END();
   19f74:	0e 94 83 62 	call	0xc506	; 0xc506 <menu_end()>
static inline void load_filament_wrapper(uint8_t i){
    MMU2::mmu2.load_filament(i);
}

static void mmu_preload_filament_menu() {
    MENU_BEGIN();
   19f78:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   19f7c:	8f 5f       	subi	r24, 0xFF	; 255
   19f7e:	80 93 60 04 	sts	0x0460, r24	; 0x800460 <menu_row>
   19f82:	80 91 62 04 	lds	r24, 0x0462	; 0x800462 <menu_line>
   19f86:	8f 5f       	subi	r24, 0xFF	; 255
   19f88:	80 93 62 04 	sts	0x0462, r24	; 0x800462 <menu_line>
   19f8c:	d0 cf       	rjmp	.-96     	; 0x19f2e <mmu_preload_filament_menu()+0xa>
    MENU_ITEM_BACK_P(_T(MSG_MAIN));
    MENU_ITEM_FUNCTION_P(_T(MSG_LOAD_ALL), load_all_wrapper);
    for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++)
        MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), i + '1', load_filament_wrapper, i);
    MENU_END();
}
   19f8e:	cf 91       	pop	r28
   19f90:	08 95       	ret

00019f92 <lcd_mmuLoadFilament()>:
static void lcd_mmuCutFilament() {
    preheat_or_continue(FilamentAction::MmuCut);
}

static void lcd_mmuLoadFilament() {
    preheat_or_continue(FilamentAction::MmuLoad);
   19f92:	84 e0       	ldi	r24, 0x04	; 4
   19f94:	0d 94 2a 27 	jmp	0x24e54	; 0x24e54 <preheat_or_continue(FilamentAction) [clone .lto_priv.410]>

00019f98 <lcd_mmuUnloadFilament()>:
}

static void lcd_mmuUnloadFilament() {
    preheat_or_continue(FilamentAction::MmuUnLoad);
   19f98:	85 e0       	ldi	r24, 0x05	; 5
   19f9a:	0d 94 2a 27 	jmp	0x24e54	; 0x24e54 <preheat_or_continue(FilamentAction) [clone .lto_priv.410]>

00019f9e <lcd_mmuEjectFilament()>:
}

static void lcd_mmuEjectFilament() {
    preheat_or_continue(FilamentAction::MmuEject);
   19f9e:	86 e0       	ldi	r24, 0x06	; 6
   19fa0:	0d 94 2a 27 	jmp	0x24e54	; 0x24e54 <preheat_or_continue(FilamentAction) [clone .lto_priv.410]>

00019fa4 <lcd_mmuCutFilament()>:
static void lcd_mmuLoadingTest() {
    preheat_or_continue(FilamentAction::MmuLoadingTest);
}

static void lcd_mmuCutFilament() {
    preheat_or_continue(FilamentAction::MmuCut);
   19fa4:	87 e0       	ldi	r24, 0x07	; 7
   19fa6:	0d 94 2a 27 	jmp	0x24e54	; 0x24e54 <preheat_or_continue(FilamentAction) [clone .lto_priv.410]>

00019faa <lcd_mmuLoadingTest()>:
        MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), i + '1', loading_test_wrapper, i);
    MENU_END();
}

static void lcd_mmuLoadingTest() {
    preheat_or_continue(FilamentAction::MmuLoadingTest);
   19faa:	88 e0       	ldi	r24, 0x08	; 8
   19fac:	0d 94 2a 27 	jmp	0x24e54	; 0x24e54 <preheat_or_continue(FilamentAction) [clone .lto_priv.410]>

00019fb0 <change_sheet()>:
   19fb0:	60 91 ca 03 	lds	r22, 0x03CA	; 0x8003ca <selected_sheet>
   19fb4:	81 ea       	ldi	r24, 0xA1	; 161
   19fb6:	9d e0       	ldi	r25, 0x0D	; 13
   19fb8:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
}

static void change_sheet()
{
	eeprom_update_byte_notify(&(EEPROM_Sheets_base->active_sheet), selected_sheet);
    menu_back(3);
   19fbc:	83 e0       	ldi	r24, 0x03	; 3
   19fbe:	0c 94 ff 62 	jmp	0xc5fe	; 0xc5fe <menu_back(unsigned char)>

00019fc2 <mmu_loading_test_menu() [clone .lto_priv.414]>:

    // Clear the filament action
    clearFilamentAction();
}

static void mmu_loading_test_menu() {
   19fc2:	cf 93       	push	r28
    MENU_BEGIN();
   19fc4:	0e 94 0c 74 	call	0xe818	; 0xe818 <menu_start()>
   19fc8:	10 92 60 04 	sts	0x0460, r1	; 0x800460 <menu_row>
   19fcc:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   19fd0:	84 30       	cpi	r24, 0x04	; 4
   19fd2:	88 f5       	brcc	.+98     	; 0x1a036 <mmu_loading_test_menu() [clone .lto_priv.414]+0x74>
   19fd4:	10 92 63 04 	sts	0x0463, r1	; 0x800463 <menu_item>
    ON_MENU_LEAVE(
   19fd8:	0e 94 4c 62 	call	0xc498	; 0xc498 <menu_item_leave()>
   19fdc:	81 11       	cpse	r24, r1
   19fde:	0f 94 d6 0b 	call	0x217ac	; 0x217ac <clearFilamentAction() [clone .lto_priv.411]>
        clearFilamentAction();
    );
    MENU_ITEM_BACK_P(_T(MSG_MAIN));
   19fe2:	8f ed       	ldi	r24, 0xDF	; 223
   19fe4:	98 e4       	ldi	r25, 0x48	; 72
   19fe6:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19fea:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
    MENU_ITEM_FUNCTION_P(_T(MSG_LOAD_ALL), loading_test_all_wrapper);
   19fee:	8d e7       	ldi	r24, 0x7D	; 125
   19ff0:	96 e4       	ldi	r25, 0x46	; 70
   19ff2:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   19ff6:	6b ee       	ldi	r22, 0xEB	; 235
   19ff8:	7e ef       	ldi	r23, 0xFE	; 254
   19ffa:	0e 94 9d 72 	call	0xe53a	; 0xe53a <menu_item_function_P(char const*, void (*)())>
    for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++)
   19ffe:	c0 e0       	ldi	r28, 0x00	; 0
        MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), i + '1', loading_test_wrapper, i);
   1a000:	82 e4       	ldi	r24, 0x42	; 66
   1a002:	97 e4       	ldi	r25, 0x47	; 71
   1a004:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1a008:	61 e3       	ldi	r22, 0x31	; 49
   1a00a:	6c 0f       	add	r22, r28
   1a00c:	2c 2f       	mov	r18, r28
   1a00e:	46 ed       	ldi	r20, 0xD6	; 214
   1a010:	5e ef       	ldi	r21, 0xFE	; 254
   1a012:	0e 94 2f 72 	call	0xe45e	; 0xe45e <menu_item_function_P(char const*, char, void (*)(unsigned char), unsigned char)>
    ON_MENU_LEAVE(
        clearFilamentAction();
    );
    MENU_ITEM_BACK_P(_T(MSG_MAIN));
    MENU_ITEM_FUNCTION_P(_T(MSG_LOAD_ALL), loading_test_all_wrapper);
    for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++)
   1a016:	cf 5f       	subi	r28, 0xFF	; 255
   1a018:	c5 30       	cpi	r28, 0x05	; 5
   1a01a:	91 f7       	brne	.-28     	; 0x1a000 <mmu_loading_test_menu() [clone .lto_priv.414]+0x3e>
        MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), i + '1', loading_test_wrapper, i);
    MENU_END();
   1a01c:	0e 94 83 62 	call	0xc506	; 0xc506 <menu_end()>
    // Clear the filament action
    clearFilamentAction();
}

static void mmu_loading_test_menu() {
    MENU_BEGIN();
   1a020:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   1a024:	8f 5f       	subi	r24, 0xFF	; 255
   1a026:	80 93 60 04 	sts	0x0460, r24	; 0x800460 <menu_row>
   1a02a:	80 91 62 04 	lds	r24, 0x0462	; 0x800462 <menu_line>
   1a02e:	8f 5f       	subi	r24, 0xFF	; 255
   1a030:	80 93 62 04 	sts	0x0462, r24	; 0x800462 <menu_line>
   1a034:	cb cf       	rjmp	.-106    	; 0x19fcc <mmu_loading_test_menu() [clone .lto_priv.414]+0xa>
    MENU_ITEM_BACK_P(_T(MSG_MAIN));
    MENU_ITEM_FUNCTION_P(_T(MSG_LOAD_ALL), loading_test_all_wrapper);
    for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++)
        MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), i + '1', loading_test_wrapper, i);
    MENU_END();
}
   1a036:	cf 91       	pop	r28
   1a038:	08 95       	ret

0001a03a <mmu_common_choose_filament_menu(char const*, void (*)(unsigned char))>:
}

// Helper function to save code size by reducing duplicated code
// These menus are not time critical
static void mmu_common_choose_filament_menu(const char * label, void (*menuAction)(uint8_t))
{
   1a03a:	ef 92       	push	r14
   1a03c:	ff 92       	push	r15
   1a03e:	0f 93       	push	r16
   1a040:	1f 93       	push	r17
   1a042:	cf 93       	push	r28
   1a044:	8c 01       	movw	r16, r24
   1a046:	7b 01       	movw	r14, r22
    MENU_BEGIN();
   1a048:	0e 94 0c 74 	call	0xe818	; 0xe818 <menu_start()>
   1a04c:	10 92 60 04 	sts	0x0460, r1	; 0x800460 <menu_row>
   1a050:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   1a054:	84 30       	cpi	r24, 0x04	; 4
   1a056:	28 f5       	brcc	.+74     	; 0x1a0a2 <mmu_common_choose_filament_menu(char const*, void (*)(unsigned char))+0x68>
   1a058:	10 92 63 04 	sts	0x0463, r1	; 0x800463 <menu_item>
    ON_MENU_LEAVE(
   1a05c:	0e 94 4c 62 	call	0xc498	; 0xc498 <menu_item_leave()>
   1a060:	81 11       	cpse	r24, r1
   1a062:	0f 94 d6 0b 	call	0x217ac	; 0x217ac <clearFilamentAction() [clone .lto_priv.411]>
        clearFilamentAction();
    );
    MENU_ITEM_BACK_P(_T(MSG_MAIN));
   1a066:	8f ed       	ldi	r24, 0xDF	; 223
   1a068:	98 e4       	ldi	r25, 0x48	; 72
   1a06a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1a06e:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
    for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++)
   1a072:	c0 e0       	ldi	r28, 0x00	; 0
        MENU_ITEM_FUNCTION_NR_P(label, i + '1', menuAction, i);
   1a074:	61 e3       	ldi	r22, 0x31	; 49
   1a076:	6c 0f       	add	r22, r28
   1a078:	2c 2f       	mov	r18, r28
   1a07a:	a7 01       	movw	r20, r14
   1a07c:	c8 01       	movw	r24, r16
   1a07e:	0e 94 2f 72 	call	0xe45e	; 0xe45e <menu_item_function_P(char const*, char, void (*)(unsigned char), unsigned char)>
    MENU_BEGIN();
    ON_MENU_LEAVE(
        clearFilamentAction();
    );
    MENU_ITEM_BACK_P(_T(MSG_MAIN));
    for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++)
   1a082:	cf 5f       	subi	r28, 0xFF	; 255
   1a084:	c5 30       	cpi	r28, 0x05	; 5
   1a086:	b1 f7       	brne	.-20     	; 0x1a074 <mmu_common_choose_filament_menu(char const*, void (*)(unsigned char))+0x3a>
        MENU_ITEM_FUNCTION_NR_P(label, i + '1', menuAction, i);
    MENU_END();
   1a088:	0e 94 83 62 	call	0xc506	; 0xc506 <menu_end()>

// Helper function to save code size by reducing duplicated code
// These menus are not time critical
static void mmu_common_choose_filament_menu(const char * label, void (*menuAction)(uint8_t))
{
    MENU_BEGIN();
   1a08c:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   1a090:	8f 5f       	subi	r24, 0xFF	; 255
   1a092:	80 93 60 04 	sts	0x0460, r24	; 0x800460 <menu_row>
   1a096:	80 91 62 04 	lds	r24, 0x0462	; 0x800462 <menu_line>
   1a09a:	8f 5f       	subi	r24, 0xFF	; 255
   1a09c:	80 93 62 04 	sts	0x0462, r24	; 0x800462 <menu_line>
   1a0a0:	d7 cf       	rjmp	.-82     	; 0x1a050 <mmu_common_choose_filament_menu(char const*, void (*)(unsigned char))+0x16>
    );
    MENU_ITEM_BACK_P(_T(MSG_MAIN));
    for (uint8_t i = 0; i < MMU_FILAMENT_COUNT; i++)
        MENU_ITEM_FUNCTION_NR_P(label, i + '1', menuAction, i);
    MENU_END();
}
   1a0a2:	cf 91       	pop	r28
   1a0a4:	1f 91       	pop	r17
   1a0a6:	0f 91       	pop	r16
   1a0a8:	ff 90       	pop	r15
   1a0aa:	ef 90       	pop	r14
   1a0ac:	08 95       	ret

0001a0ae <mmu_cut_filament_menu() [clone .lto_priv.416]>:
static inline void mmu_cut_filament_wrapper(uint8_t index){
    MMU2::mmu2.cut_filament(index);
}

static void mmu_cut_filament_menu() {
    mmu_common_choose_filament_menu(_T(MSG_CUT_FILAMENT), mmu_cut_filament_wrapper);
   1a0ae:	8d ec       	ldi	r24, 0xCD	; 205
   1a0b0:	91 e6       	ldi	r25, 0x61	; 97
   1a0b2:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1a0b6:	6f e6       	ldi	r22, 0x6F	; 111
   1a0b8:	70 ed       	ldi	r23, 0xD0	; 208
   1a0ba:	0c 94 1d d0 	jmp	0x1a03a	; 0x1a03a <mmu_common_choose_filament_menu(char const*, void (*)(unsigned char))>

0001a0be <mmu_fil_eject_menu() [clone .lto_priv.415]>:
    // Clear the filament action
    clearFilamentAction();
}

static void mmu_fil_eject_menu() {
    mmu_common_choose_filament_menu(_T(MSG_EJECT_FROM_MMU), mmu_eject_filament);
   1a0be:	8c ed       	ldi	r24, 0xDC	; 220
   1a0c0:	91 e6       	ldi	r25, 0x61	; 97
   1a0c2:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1a0c6:	6b e7       	ldi	r22, 0x7B	; 123
   1a0c8:	70 ed       	ldi	r23, 0xD0	; 208
   1a0ca:	0c 94 1d d0 	jmp	0x1a03a	; 0x1a03a <mmu_common_choose_filament_menu(char const*, void (*)(unsigned char))>

0001a0ce <mmu_load_to_nozzle_menu() [clone .lto_priv.413]>:
        MENU_ITEM_FUNCTION_NR_P(label, i + '1', menuAction, i);
    MENU_END();
}

static void mmu_load_to_nozzle_menu() {
    mmu_common_choose_filament_menu(_T(MSG_LOAD_FILAMENT), lcd_mmu_load_to_nozzle_wrapper);
   1a0ce:	82 e4       	ldi	r24, 0x42	; 66
   1a0d0:	97 e4       	ldi	r25, 0x47	; 71
   1a0d2:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1a0d6:	6c e6       	ldi	r22, 0x6C	; 108
   1a0d8:	7e ef       	ldi	r23, 0xFE	; 254
   1a0da:	0c 94 1d d0 	jmp	0x1a03a	; 0x1a03a <mmu_common_choose_filament_menu(char const*, void (*)(unsigned char))>

0001a0de <mmu_cut_filament_wrapper(unsigned char)>:
static void mmu_fil_eject_menu() {
    mmu_common_choose_filament_menu(_T(MSG_EJECT_FROM_MMU), mmu_eject_filament);
}

#ifdef MMU_HAS_CUTTER
static inline void mmu_cut_filament_wrapper(uint8_t index){
   1a0de:	cf 93       	push	r28
   1a0e0:	c8 2f       	mov	r28, r24
        IncrementMMUFails();
    }
}

bool MMU2::cut_filament(uint8_t slot, bool enableFullScreenMsg /*= true*/) {
    if (!WaitForMMUReady()) {
   1a0e2:	0f 94 a6 79 	call	0x2f34c	; 0x2f34c <MMU2::MMU2::WaitForMMUReady() [clone .constprop.106]>
   1a0e6:	88 23       	and	r24, r24
   1a0e8:	21 f0       	breq	.+8      	; 0x1a0f2 <mmu_cut_filament_wrapper(unsigned char)+0x14>
   1a0ea:	8c 2f       	mov	r24, r28
    MMU2::mmu2.cut_filament(index);
}
   1a0ec:	cf 91       	pop	r28
   1a0ee:	0d 94 49 9e 	jmp	0x33c92	; 0x33c92 <MMU2::MMU2::cut_filament(unsigned char, bool) [clone .part.39] [clone .constprop.96]>
   1a0f2:	cf 91       	pop	r28
   1a0f4:	08 95       	ret

0001a0f6 <mmu_eject_filament(unsigned char)>:

static void mmu_load_to_nozzle_menu() {
    mmu_common_choose_filament_menu(_T(MSG_LOAD_FILAMENT), lcd_mmu_load_to_nozzle_wrapper);
}

static void mmu_eject_filament(uint8_t filament) {
   1a0f6:	cf 93       	push	r28
   1a0f8:	c8 2f       	mov	r28, r24
    menu_back();
   1a0fa:	0e 94 1b 63 	call	0xc636	; 0xc636 <menu_back()>
    MMU2::mmu2.eject_filament(filament, true);
   1a0fe:	61 e0       	ldi	r22, 0x01	; 1
   1a100:	8c 2f       	mov	r24, r28
   1a102:	0f 94 cc 9d 	call	0x33b98	; 0x33b98 <MMU2::MMU2::eject_filament(unsigned char, bool) [clone .constprop.99]>

    // Clear the filament action
    clearFilamentAction();
}
   1a106:	cf 91       	pop	r28
static void mmu_eject_filament(uint8_t filament) {
    menu_back();
    MMU2::mmu2.eject_filament(filament, true);

    // Clear the filament action
    clearFilamentAction();
   1a108:	0d 94 d6 0b 	jmp	0x217ac	; 0x217ac <clearFilamentAction() [clone .lto_priv.411]>

0001a10c <load_all_wrapper()>:

}

static inline void load_all_wrapper(){
    for(uint8_t i = 0; i < MMU_FILAMENT_COUNT; ++i){
        MMU2::mmu2.load_filament(i);
   1a10c:	80 e0       	ldi	r24, 0x00	; 0
   1a10e:	0f 94 89 9d 	call	0x33b12	; 0x33b12 <MMU2::MMU2::load_filament(unsigned char) [clone .constprop.102]>
   1a112:	81 e0       	ldi	r24, 0x01	; 1
   1a114:	0f 94 89 9d 	call	0x33b12	; 0x33b12 <MMU2::MMU2::load_filament(unsigned char) [clone .constprop.102]>
   1a118:	82 e0       	ldi	r24, 0x02	; 2
   1a11a:	0f 94 89 9d 	call	0x33b12	; 0x33b12 <MMU2::MMU2::load_filament(unsigned char) [clone .constprop.102]>
   1a11e:	83 e0       	ldi	r24, 0x03	; 3
   1a120:	0f 94 89 9d 	call	0x33b12	; 0x33b12 <MMU2::MMU2::load_filament(unsigned char) [clone .constprop.102]>
   1a124:	84 e0       	ldi	r24, 0x04	; 4
   1a126:	0d 94 89 9d 	jmp	0x33b12	; 0x33b12 <MMU2::MMU2::load_filament(unsigned char) [clone .constprop.102]>

0001a12a <load_filament_wrapper(unsigned char)>:
    }
}

static inline void load_filament_wrapper(uint8_t i){
    MMU2::mmu2.load_filament(i);
   1a12a:	0d 94 89 9d 	jmp	0x33b12	; 0x33b12 <MMU2::MMU2::load_filament(unsigned char) [clone .constprop.102]>

0001a12e <lcd_settings_menu()::{lambda()#1}::_FUN()>:
        break;
    }
}

void MMU2::ResetX0() {
    logic.ResetMMU(); // Send soft reset
   1a12e:	80 e0       	ldi	r24, 0x00	; 0
   1a130:	0d 94 43 95 	jmp	0x32a86	; 0x32a86 <MMU2::ProtocolLogic::ResetMMU(unsigned char) [clone .constprop.326]>

0001a134 <sheets_menu()>:
    lcd_sheet_menu();
}

static void sheets_menu()
{
    MENU_BEGIN();
   1a134:	0e 94 0c 74 	call	0xe818	; 0xe818 <menu_start()>
   1a138:	10 92 60 04 	sts	0x0460, r1	; 0x800460 <menu_row>
   1a13c:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   1a140:	84 30       	cpi	r24, 0x04	; 4
   1a142:	08 f0       	brcs	.+2      	; 0x1a146 <sheets_menu()+0x12>
   1a144:	45 c0       	rjmp	.+138    	; 0x1a1d0 <sheets_menu()+0x9c>
   1a146:	10 92 63 04 	sts	0x0463, r1	; 0x800463 <menu_item>
    MENU_ITEM_BACK_P(_T(MSG_HW_SETUP));
   1a14a:	85 e8       	ldi	r24, 0x85	; 133
   1a14c:	95 e4       	ldi	r25, 0x45	; 69
   1a14e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1a152:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
    MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[0], select_sheet_menu<0>);
   1a156:	69 e9       	ldi	r22, 0x99	; 153
   1a158:	73 ec       	ldi	r23, 0xC3	; 195
   1a15a:	89 e4       	ldi	r24, 0x49	; 73
   1a15c:	9d e0       	ldi	r25, 0x0D	; 13
   1a15e:	0e 94 25 76 	call	0xec4a	; 0xec4a <menu_item_submenu_E(Sheet const&, void (*)())>
    MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[1], select_sheet_menu<1>);
   1a162:	64 e9       	ldi	r22, 0x94	; 148
   1a164:	73 ec       	ldi	r23, 0xC3	; 195
   1a166:	84 e5       	ldi	r24, 0x54	; 84
   1a168:	9d e0       	ldi	r25, 0x0D	; 13
   1a16a:	0e 94 25 76 	call	0xec4a	; 0xec4a <menu_item_submenu_E(Sheet const&, void (*)())>
    MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[2], select_sheet_menu<2>);
   1a16e:	6f e8       	ldi	r22, 0x8F	; 143
   1a170:	73 ec       	ldi	r23, 0xC3	; 195
   1a172:	8f e5       	ldi	r24, 0x5F	; 95
   1a174:	9d e0       	ldi	r25, 0x0D	; 13
   1a176:	0e 94 25 76 	call	0xec4a	; 0xec4a <menu_item_submenu_E(Sheet const&, void (*)())>
    MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[3], select_sheet_menu<3>);
   1a17a:	6a e8       	ldi	r22, 0x8A	; 138
   1a17c:	73 ec       	ldi	r23, 0xC3	; 195
   1a17e:	8a e6       	ldi	r24, 0x6A	; 106
   1a180:	9d e0       	ldi	r25, 0x0D	; 13
   1a182:	0e 94 25 76 	call	0xec4a	; 0xec4a <menu_item_submenu_E(Sheet const&, void (*)())>
    MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[4], select_sheet_menu<4>);
   1a186:	65 e8       	ldi	r22, 0x85	; 133
   1a188:	73 ec       	ldi	r23, 0xC3	; 195
   1a18a:	85 e7       	ldi	r24, 0x75	; 117
   1a18c:	9d e0       	ldi	r25, 0x0D	; 13
   1a18e:	0e 94 25 76 	call	0xec4a	; 0xec4a <menu_item_submenu_E(Sheet const&, void (*)())>
    MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[5], select_sheet_menu<5>);
   1a192:	60 e8       	ldi	r22, 0x80	; 128
   1a194:	73 ec       	ldi	r23, 0xC3	; 195
   1a196:	80 e8       	ldi	r24, 0x80	; 128
   1a198:	9d e0       	ldi	r25, 0x0D	; 13
   1a19a:	0e 94 25 76 	call	0xec4a	; 0xec4a <menu_item_submenu_E(Sheet const&, void (*)())>
    MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[6], select_sheet_menu<6>);
   1a19e:	6b e7       	ldi	r22, 0x7B	; 123
   1a1a0:	73 ec       	ldi	r23, 0xC3	; 195
   1a1a2:	8b e8       	ldi	r24, 0x8B	; 139
   1a1a4:	9d e0       	ldi	r25, 0x0D	; 13
   1a1a6:	0e 94 25 76 	call	0xec4a	; 0xec4a <menu_item_submenu_E(Sheet const&, void (*)())>
    MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[7], select_sheet_menu<7>);
   1a1aa:	66 e7       	ldi	r22, 0x76	; 118
   1a1ac:	73 ec       	ldi	r23, 0xC3	; 195
   1a1ae:	86 e9       	ldi	r24, 0x96	; 150
   1a1b0:	9d e0       	ldi	r25, 0x0D	; 13
   1a1b2:	0e 94 25 76 	call	0xec4a	; 0xec4a <menu_item_submenu_E(Sheet const&, void (*)())>
    MENU_END();
   1a1b6:	0e 94 83 62 	call	0xc506	; 0xc506 <menu_end()>
    lcd_sheet_menu();
}

static void sheets_menu()
{
    MENU_BEGIN();
   1a1ba:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   1a1be:	8f 5f       	subi	r24, 0xFF	; 255
   1a1c0:	80 93 60 04 	sts	0x0460, r24	; 0x800460 <menu_row>
   1a1c4:	80 91 62 04 	lds	r24, 0x0462	; 0x800462 <menu_line>
   1a1c8:	8f 5f       	subi	r24, 0xFF	; 255
   1a1ca:	80 93 62 04 	sts	0x0462, r24	; 0x800462 <menu_line>
   1a1ce:	b6 cf       	rjmp	.-148    	; 0x1a13c <sheets_menu()+0x8>
    MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[4], select_sheet_menu<4>);
    MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[5], select_sheet_menu<5>);
    MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[6], select_sheet_menu<6>);
    MENU_ITEM_SUBMENU_E(EEPROM_Sheets_base->s[7], select_sheet_menu<7>);
    MENU_END();
}
   1a1d0:	08 95       	ret

0001a1d2 <lcd_adjust_bed_reset()>:
} _menu_data_adjust_bed_t;
static_assert(sizeof(menu_data)>= sizeof(_menu_data_adjust_bed_t),"_menu_data_adjust_bed_t doesn't fit into menu_data");

void lcd_adjust_bed_reset(void)
{
	eeprom_adjust_bed_reset();
   1a1d2:	0e 94 df 78 	call	0xf1be	; 0xf1be <eeprom_adjust_bed_reset()>
	_menu_data_adjust_bed_t* _md = (_menu_data_adjust_bed_t*)&(menu_data[0]);
	_md->status = 0;
   1a1d6:	10 92 a3 03 	sts	0x03A3, r1	; 0x8003a3 <menu_data+0xd>
}
   1a1da:	08 95       	ret

0001a1dc <lcd_menu_xyz_offset()>:
//! |Y            00.00mm|	c=10
//! ----------------------
//! @endcode
//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
static void lcd_menu_xyz_offset()
{
   1a1dc:	cf 93       	push	r28
   1a1de:	df 93       	push	r29
    lcd_puts_at_P(0, 0, _T(MSG_MEASURED_OFFSET));
   1a1e0:	81 ec       	ldi	r24, 0xC1	; 193
   1a1e2:	9a e3       	ldi	r25, 0x3A	; 58
   1a1e4:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1a1e8:	ac 01       	movw	r20, r24
   1a1ea:	60 e0       	ldi	r22, 0x00	; 0
   1a1ec:	80 e0       	ldi	r24, 0x00	; 0
   1a1ee:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
    lcd_puts_at_P(0, 1, STR_SEPARATOR);
   1a1f2:	41 e0       	ldi	r20, 0x01	; 1
   1a1f4:	54 e8       	ldi	r21, 0x84	; 132
   1a1f6:	61 e0       	ldi	r22, 0x01	; 1
   1a1f8:	80 e0       	ldi	r24, 0x00	; 0
   1a1fa:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>

    for (uint8_t i = 0; i < 2; i++) {
        lcd_set_cursor(0, i + 2);
   1a1fe:	62 e0       	ldi	r22, 0x02	; 2
   1a200:	80 e0       	ldi	r24, 0x00	; 0
   1a202:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
        lcd_printf_P(PSTR("%c%17.2fmm"), 'X' + i, eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_CENTER+4*i)));
   1a206:	85 ee       	ldi	r24, 0xE5	; 229
   1a208:	9f e0       	ldi	r25, 0x0F	; 15
   1a20a:	0f 94 e8 a3 	call	0x347d0	; 0x347d0 <eeprom_read_dword>
   1a20e:	9f 93       	push	r25
   1a210:	8f 93       	push	r24
   1a212:	7f 93       	push	r23
   1a214:	6f 93       	push	r22
   1a216:	1f 92       	push	r1
   1a218:	88 e5       	ldi	r24, 0x58	; 88
   1a21a:	8f 93       	push	r24
   1a21c:	c3 e7       	ldi	r28, 0x73	; 115
   1a21e:	d2 e8       	ldi	r29, 0x82	; 130
   1a220:	df 93       	push	r29
   1a222:	cf 93       	push	r28
   1a224:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
{
    lcd_puts_at_P(0, 0, _T(MSG_MEASURED_OFFSET));
    lcd_puts_at_P(0, 1, STR_SEPARATOR);

    for (uint8_t i = 0; i < 2; i++) {
        lcd_set_cursor(0, i + 2);
   1a228:	63 e0       	ldi	r22, 0x03	; 3
   1a22a:	80 e0       	ldi	r24, 0x00	; 0
   1a22c:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
        lcd_printf_P(PSTR("%c%17.2fmm"), 'X' + i, eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_CENTER+4*i)));
   1a230:	89 ee       	ldi	r24, 0xE9	; 233
   1a232:	9f e0       	ldi	r25, 0x0F	; 15
   1a234:	0f 94 e8 a3 	call	0x347d0	; 0x347d0 <eeprom_read_dword>
   1a238:	9f 93       	push	r25
   1a23a:	8f 93       	push	r24
   1a23c:	7f 93       	push	r23
   1a23e:	6f 93       	push	r22
   1a240:	1f 92       	push	r1
   1a242:	89 e5       	ldi	r24, 0x59	; 89
   1a244:	8f 93       	push	r24
   1a246:	df 93       	push	r29
   1a248:	cf 93       	push	r28
   1a24a:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
    }
    menu_back_if_clicked();
   1a24e:	8d b7       	in	r24, 0x3d	; 61
   1a250:	9e b7       	in	r25, 0x3e	; 62
   1a252:	40 96       	adiw	r24, 0x10	; 16
   1a254:	0f b6       	in	r0, 0x3f	; 63
   1a256:	f8 94       	cli
   1a258:	9e bf       	out	0x3e, r25	; 62
   1a25a:	0f be       	out	0x3f, r0	; 63
   1a25c:	8d bf       	out	0x3d, r24	; 61
}
   1a25e:	df 91       	pop	r29
   1a260:	cf 91       	pop	r28

    for (uint8_t i = 0; i < 2; i++) {
        lcd_set_cursor(0, i + 2);
        lcd_printf_P(PSTR("%c%17.2fmm"), 'X' + i, eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_CENTER+4*i)));
    }
    menu_back_if_clicked();
   1a262:	0c 94 06 74 	jmp	0xe80c	; 0xe80c <menu_back_if_clicked()>

0001a266 <lcd_menu_xyz_skew()>:
//! ----------------------
//! D - Degree sysmbol		LCD_STR_DEGREE
//! @endcode
//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
static void lcd_menu_xyz_skew()
{
   1a266:	cf 92       	push	r12
   1a268:	df 92       	push	r13
   1a26a:	ef 92       	push	r14
   1a26c:	ff 92       	push	r15
   1a26e:	0f 93       	push	r16
   1a270:	1f 93       	push	r17
   1a272:	cf 93       	push	r28
   1a274:	df 93       	push	r29
    float angleDiff = eeprom_read_float((float*)(EEPROM_XYZ_CAL_SKEW));
   1a276:	80 e6       	ldi	r24, 0x60	; 96
   1a278:	9f e0       	ldi	r25, 0x0F	; 15
   1a27a:	0f 94 e8 a3 	call	0x347d0	; 0x347d0 <eeprom_read_dword>
   1a27e:	6b 01       	movw	r12, r22
   1a280:	7c 01       	movw	r14, r24
	lcd_home();
   1a282:	0e 94 1f 70 	call	0xe03e	; 0xe03e <lcd_home()>
	lcd_printf_P(_N(
   1a286:	83 eb       	ldi	r24, 0xB3	; 179
   1a288:	9a e3       	ldi	r25, 0x3A	; 58
   1a28a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1a28e:	18 2f       	mov	r17, r24
   1a290:	09 2f       	mov	r16, r25
   1a292:	85 ea       	ldi	r24, 0xA5	; 165
   1a294:	9a e3       	ldi	r25, 0x3A	; 58
   1a296:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1a29a:	ec 01       	movw	r28, r24
   1a29c:	85 e9       	ldi	r24, 0x95	; 149
   1a29e:	9a e3       	ldi	r25, 0x3A	; 58
   1a2a0:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1a2a4:	2e e3       	ldi	r18, 0x3E	; 62
   1a2a6:	2f 93       	push	r18
   1a2a8:	20 e8       	ldi	r18, 0x80	; 128
   1a2aa:	2f 93       	push	r18
   1a2ac:	1f 92       	push	r1
   1a2ae:	1f 92       	push	r1
   1a2b0:	0f 93       	push	r16
   1a2b2:	1f 93       	push	r17
   1a2b4:	2d e3       	ldi	r18, 0x3D	; 61
   1a2b6:	2f 93       	push	r18
   1a2b8:	25 ef       	ldi	r18, 0xF5	; 245
   1a2ba:	2f 93       	push	r18
   1a2bc:	22 ec       	ldi	r18, 0xC2	; 194
   1a2be:	2f 93       	push	r18
   1a2c0:	20 e9       	ldi	r18, 0x90	; 144
   1a2c2:	2f 93       	push	r18
   1a2c4:	df 93       	push	r29
   1a2c6:	cf 93       	push	r28
   1a2c8:	21 e0       	ldi	r18, 0x01	; 1
   1a2ca:	34 e8       	ldi	r19, 0x84	; 132
   1a2cc:	3f 93       	push	r19
   1a2ce:	2f 93       	push	r18
   1a2d0:	9f 93       	push	r25
   1a2d2:	8f 93       	push	r24
   1a2d4:	87 e7       	ldi	r24, 0x77	; 119
   1a2d6:	97 e6       	ldi	r25, 0x67	; 103
   1a2d8:	9f 93       	push	r25
   1a2da:	8f 93       	push	r24
   1a2dc:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
	 _T(MSG_MEASURED_SKEW),
	 STR_SEPARATOR,
	 _T(MSG_SLIGHT_SKEW), _deg(bed_skew_angle_mild),
	 _T(MSG_SEVERE_SKEW), _deg(bed_skew_angle_extreme)
	);
	lcd_set_cursor(15, 0);
   1a2e0:	60 e0       	ldi	r22, 0x00	; 0
   1a2e2:	8f e0       	ldi	r24, 0x0F	; 15
   1a2e4:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
	if (angleDiff < 100){
   1a2e8:	8d b7       	in	r24, 0x3d	; 61
   1a2ea:	9e b7       	in	r25, 0x3e	; 62
   1a2ec:	42 96       	adiw	r24, 0x12	; 18
   1a2ee:	0f b6       	in	r0, 0x3f	; 63
   1a2f0:	f8 94       	cli
   1a2f2:	9e bf       	out	0x3e, r25	; 62
   1a2f4:	0f be       	out	0x3f, r0	; 63
   1a2f6:	8d bf       	out	0x3d, r24	; 61
   1a2f8:	20 e0       	ldi	r18, 0x00	; 0
   1a2fa:	30 e0       	ldi	r19, 0x00	; 0
   1a2fc:	48 ec       	ldi	r20, 0xC8	; 200
   1a2fe:	52 e4       	ldi	r21, 0x42	; 66
   1a300:	c7 01       	movw	r24, r14
   1a302:	b6 01       	movw	r22, r12
   1a304:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   1a308:	87 ff       	sbrs	r24, 7
   1a30a:	32 c0       	rjmp	.+100    	; 0x1a370 <lcd_menu_xyz_skew()+0x10a>
}

//@brief Show measured axis skewness
float _deg(float rad)
{
	return rad * 180 / M_PI;
   1a30c:	20 e0       	ldi	r18, 0x00	; 0
   1a30e:	30 e0       	ldi	r19, 0x00	; 0
   1a310:	44 e3       	ldi	r20, 0x34	; 52
   1a312:	53 e4       	ldi	r21, 0x43	; 67
   1a314:	c7 01       	movw	r24, r14
   1a316:	b6 01       	movw	r22, r12
   1a318:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   1a31c:	2b ed       	ldi	r18, 0xDB	; 219
   1a31e:	3f e0       	ldi	r19, 0x0F	; 15
   1a320:	49 e4       	ldi	r20, 0x49	; 73
   1a322:	50 e4       	ldi	r21, 0x40	; 64
   1a324:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
	 _T(MSG_SLIGHT_SKEW), _deg(bed_skew_angle_mild),
	 _T(MSG_SEVERE_SKEW), _deg(bed_skew_angle_extreme)
	);
	lcd_set_cursor(15, 0);
	if (angleDiff < 100){
		lcd_printf_P(_N("%3.2f" LCD_STR_DEGREE), _deg(angleDiff));
   1a328:	9f 93       	push	r25
   1a32a:	8f 93       	push	r24
   1a32c:	7f 93       	push	r23
   1a32e:	6f 93       	push	r22
   1a330:	80 e7       	ldi	r24, 0x70	; 112
   1a332:	97 e6       	ldi	r25, 0x67	; 103
   1a334:	9f 93       	push	r25
   1a336:	8f 93       	push	r24
   1a338:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
   1a33c:	0f 90       	pop	r0
   1a33e:	0f 90       	pop	r0
   1a340:	0f 90       	pop	r0
   1a342:	0f 90       	pop	r0
   1a344:	0f 90       	pop	r0
   1a346:	0f 90       	pop	r0
	} else {
		lcd_puts_P(_T(MSG_NA));
	}
    if (lcd_clicked())
   1a348:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   1a34c:	88 23       	and	r24, r24
   1a34e:	b9 f0       	breq	.+46     	; 0x1a37e <lcd_menu_xyz_skew()+0x118>
        menu_goto(lcd_menu_xyz_offset, 0, true);
   1a350:	20 e0       	ldi	r18, 0x00	; 0
   1a352:	41 e0       	ldi	r20, 0x01	; 1
   1a354:	70 e0       	ldi	r23, 0x00	; 0
   1a356:	60 e0       	ldi	r22, 0x00	; 0
   1a358:	8e ee       	ldi	r24, 0xEE	; 238
   1a35a:	90 ed       	ldi	r25, 0xD0	; 208
}
   1a35c:	df 91       	pop	r29
   1a35e:	cf 91       	pop	r28
   1a360:	1f 91       	pop	r17
   1a362:	0f 91       	pop	r16
   1a364:	ff 90       	pop	r15
   1a366:	ef 90       	pop	r14
   1a368:	df 90       	pop	r13
   1a36a:	cf 90       	pop	r12
		lcd_printf_P(_N("%3.2f" LCD_STR_DEGREE), _deg(angleDiff));
	} else {
		lcd_puts_P(_T(MSG_NA));
	}
    if (lcd_clicked())
        menu_goto(lcd_menu_xyz_offset, 0, true);
   1a36c:	0c 94 b7 62 	jmp	0xc56e	; 0xc56e <menu_goto(void (*)(), int, bool, bool)>
	);
	lcd_set_cursor(15, 0);
	if (angleDiff < 100){
		lcd_printf_P(_N("%3.2f" LCD_STR_DEGREE), _deg(angleDiff));
	} else {
		lcd_puts_P(_T(MSG_NA));
   1a370:	83 e7       	ldi	r24, 0x73	; 115
   1a372:	98 e4       	ldi	r25, 0x48	; 72
   1a374:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1a378:	0e 94 1d 6f 	call	0xde3a	; 0xde3a <lcd_puts_P(char const*)>
   1a37c:	e5 cf       	rjmp	.-54     	; 0x1a348 <lcd_menu_xyz_skew()+0xe2>
	}
    if (lcd_clicked())
        menu_goto(lcd_menu_xyz_offset, 0, true);
}
   1a37e:	df 91       	pop	r29
   1a380:	cf 91       	pop	r28
   1a382:	1f 91       	pop	r17
   1a384:	0f 91       	pop	r16
   1a386:	ff 90       	pop	r15
   1a388:	ef 90       	pop	r14
   1a38a:	df 90       	pop	r13
   1a38c:	cf 90       	pop	r12
   1a38e:	08 95       	ret

0001a390 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]>:
//!
//! @param header Header text
//! @param item Item text
//! @param last_item Last item text, or nullptr if there is no Last item
//! @return selected item index, first item index is 0
uint8_t choose_menu_P(const char *header, const char *item, const char *last_item)
   1a390:	4f 92       	push	r4
   1a392:	5f 92       	push	r5
   1a394:	6f 92       	push	r6
   1a396:	7f 92       	push	r7
   1a398:	8f 92       	push	r8
   1a39a:	9f 92       	push	r9
   1a39c:	af 92       	push	r10
   1a39e:	bf 92       	push	r11
   1a3a0:	cf 92       	push	r12
   1a3a2:	df 92       	push	r13
   1a3a4:	ef 92       	push	r14
   1a3a6:	ff 92       	push	r15
   1a3a8:	0f 93       	push	r16
   1a3aa:	1f 93       	push	r17
   1a3ac:	cf 93       	push	r28
   1a3ae:	df 93       	push	r29
   1a3b0:	6c 01       	movw	r12, r24
   1a3b2:	7b 01       	movw	r14, r22
   1a3b4:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
{
    //following code should handle 3 to 127 number of items well
    const int8_t items_no = last_item?(MMU2::mmu2.Enabled()?6:5):(MMU2::mmu2.Enabled()?5:4);
   1a3b8:	67 2b       	or	r22, r23
   1a3ba:	29 f0       	breq	.+10     	; 0x1a3c6 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0x36>
   1a3bc:	06 e0       	ldi	r16, 0x06	; 6
   1a3be:	81 30       	cpi	r24, 0x01	; 1
   1a3c0:	29 f0       	breq	.+10     	; 0x1a3cc <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0x3c>
   1a3c2:	05 e0       	ldi	r16, 0x05	; 5
   1a3c4:	03 c0       	rjmp	.+6      	; 0x1a3cc <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0x3c>
   1a3c6:	04 e0       	ldi	r16, 0x04	; 4
   1a3c8:	81 30       	cpi	r24, 0x01	; 1
   1a3ca:	d9 f3       	breq	.-10     	; 0x1a3c2 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0x32>
    const uint8_t item_len = item?strlen_P(item):0;
	int8_t first = 0;
	int8_t cursor_pos = 1;

	lcd_clear();
   1a3cc:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>

	KEEPALIVE_STATE(PAUSED_FOR_USER);
   1a3d0:	84 e0       	ldi	r24, 0x04	; 4
   1a3d2:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
{
    //following code should handle 3 to 127 number of items well
    const int8_t items_no = last_item?(MMU2::mmu2.Enabled()?6:5):(MMU2::mmu2.Enabled()?5:4);
    const uint8_t item_len = item?strlen_P(item):0;
	int8_t first = 0;
	int8_t cursor_pos = 1;
   1a3d6:	c1 e0       	ldi	r28, 0x01	; 1
uint8_t choose_menu_P(const char *header, const char *item, const char *last_item)
{
    //following code should handle 3 to 127 number of items well
    const int8_t items_no = last_item?(MMU2::mmu2.Enabled()?6:5):(MMU2::mmu2.Enabled()?5:4);
    const uint8_t item_len = item?strlen_P(item):0;
	int8_t first = 0;
   1a3d8:	81 2c       	mov	r8, r1
		}

		if (cursor_pos > 3)
		{
            cursor_pos = 3;
            if (first < items_no - 3)
   1a3da:	03 50       	subi	r16, 0x03	; 3
   1a3dc:	11 0b       	sbc	r17, r17
	lcd_clear();

	KEEPALIVE_STATE(PAUSED_FOR_USER);
	while (1)
	{
		manage_heater();
   1a3de:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
        manage_inactivity(true);
   1a3e2:	81 e0       	ldi	r24, 0x01	; 1
   1a3e4:	0e 94 34 8c 	call	0x11868	; 0x11868 <manage_inactivity(bool)>

		if (lcd_encoder)
   1a3e8:	80 91 1e 06 	lds	r24, 0x061E	; 0x80061e <lcd_encoder>
   1a3ec:	90 91 1f 06 	lds	r25, 0x061F	; 0x80061f <lcd_encoder+0x1>
   1a3f0:	00 97       	sbiw	r24, 0x00	; 0
   1a3f2:	09 f4       	brne	.+2      	; 0x1a3f6 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0x66>
   1a3f4:	9d c0       	rjmp	.+314    	; 0x1a530 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0x1a0>
		{
            if (lcd_encoder < 0)
   1a3f6:	97 ff       	sbrs	r25, 7
   1a3f8:	88 c0       	rjmp	.+272    	; 0x1a50a <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0x17a>
            {
                cursor_pos--;
   1a3fa:	c1 50       	subi	r28, 0x01	; 1

            if (lcd_encoder > 0)
            {
                cursor_pos++;
            }
            lcd_encoder = 0;
   1a3fc:	10 92 1f 06 	sts	0x061F, r1	; 0x80061f <lcd_encoder+0x1>
   1a400:	10 92 1e 06 	sts	0x061E, r1	; 0x80061e <lcd_encoder>
		}

		if (cursor_pos > 3)
   1a404:	c4 30       	cpi	r28, 0x04	; 4
   1a406:	0c f4       	brge	.+2      	; 0x1a40a <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0x7a>
   1a408:	86 c0       	rjmp	.+268    	; 0x1a516 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0x186>
		{
            cursor_pos = 3;
            if (first < items_no - 3)
   1a40a:	88 2d       	mov	r24, r8
   1a40c:	08 2c       	mov	r0, r8
   1a40e:	00 0c       	add	r0, r0
   1a410:	99 0b       	sbc	r25, r25
   1a412:	80 17       	cp	r24, r16
   1a414:	91 07       	cpc	r25, r17
   1a416:	0c f0       	brlt	.+2      	; 0x1a41a <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0x8a>
   1a418:	7a c0       	rjmp	.+244    	; 0x1a50e <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0x17e>
            {
                first++;
   1a41a:	83 94       	inc	r8
                lcd_clear();
   1a41c:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
            lcd_encoder = 0;
		}

		if (cursor_pos > 3)
		{
            cursor_pos = 3;
   1a420:	c3 e0       	ldi	r28, 0x03	; 3
            } else { // here we are at the very end of the list
				Sound_MakeSound(e_SOUND_TYPE_BlindAlert);
            }
        }

        if (header) lcd_puts_at_P(0,0,header);
   1a422:	c1 14       	cp	r12, r1
   1a424:	d1 04       	cpc	r13, r1
   1a426:	29 f0       	breq	.+10     	; 0x1a432 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0xa2>
   1a428:	a6 01       	movw	r20, r12
   1a42a:	60 e0       	ldi	r22, 0x00	; 0
   1a42c:	80 e0       	ldi	r24, 0x00	; 0
   1a42e:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>

        const bool last_visible = (first == items_no - 3);
   1a432:	a8 2c       	mov	r10, r8
   1a434:	08 2c       	mov	r0, r8
   1a436:	00 0c       	add	r0, r0
   1a438:	bb 08       	sbc	r11, r11
        const uint_least8_t ordinary_items = (last_item&&last_visible)?2:3;
   1a43a:	e1 14       	cp	r14, r1
   1a43c:	f1 04       	cpc	r15, r1
   1a43e:	29 f0       	breq	.+10     	; 0x1a44a <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0xba>
   1a440:	82 e0       	ldi	r24, 0x02	; 2
   1a442:	98 2e       	mov	r9, r24
   1a444:	a0 16       	cp	r10, r16
   1a446:	b1 06       	cpc	r11, r17
   1a448:	11 f0       	breq	.+4      	; 0x1a44e <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0xbe>
   1a44a:	93 e0       	ldi	r25, 0x03	; 3
   1a44c:	99 2e       	mov	r9, r25

        for (uint_least8_t i = 0; i < ordinary_items; i++)
   1a44e:	d0 e0       	ldi	r29, 0x00	; 0
        {
            if (item) lcd_puts_at_P(1, i + 1, item);
   1a450:	df 5f       	subi	r29, 0xFF	; 255
   1a452:	43 ef       	ldi	r20, 0xF3	; 243
   1a454:	59 e6       	ldi	r21, 0x69	; 105
   1a456:	6d 2f       	mov	r22, r29
   1a458:	81 e0       	ldi	r24, 0x01	; 1
   1a45a:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
        if (header) lcd_puts_at_P(0,0,header);

        const bool last_visible = (first == items_no - 3);
        const uint_least8_t ordinary_items = (last_item&&last_visible)?2:3;

        for (uint_least8_t i = 0; i < ordinary_items; i++)
   1a45e:	9d 12       	cpse	r9, r29
   1a460:	f7 cf       	rjmp	.-18     	; 0x1a450 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0xc0>
   1a462:	48 2c       	mov	r4, r8
   1a464:	08 2c       	mov	r0, r8
   1a466:	00 0c       	add	r0, r0
   1a468:	55 08       	sbc	r5, r5
   1a46a:	66 08       	sbc	r6, r6
   1a46c:	77 08       	sbc	r7, r7
   1a46e:	8f ef       	ldi	r24, 0xFF	; 255
   1a470:	48 1a       	sub	r4, r24
   1a472:	58 0a       	sbc	r5, r24
   1a474:	68 0a       	sbc	r6, r24
   1a476:	78 0a       	sbc	r7, r24
        {
            if (item) lcd_puts_at_P(1, i + 1, item);
        }

        for (uint_least8_t i = 0; i < ordinary_items; i++)
   1a478:	91 2c       	mov	r9, r1
        {
            lcd_set_cursor(2 + item_len, i+1);
   1a47a:	93 94       	inc	r9
   1a47c:	69 2d       	mov	r22, r9
   1a47e:	8a e0       	ldi	r24, 0x0A	; 10
   1a480:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
   1a484:	c3 01       	movw	r24, r6
   1a486:	b2 01       	movw	r22, r4
   1a488:	0e 94 db 71 	call	0xe3b6	; 0xe3b6 <lcd_print(long, int) [clone .part.3]>
   1a48c:	8f ef       	ldi	r24, 0xFF	; 255
   1a48e:	48 1a       	sub	r4, r24
   1a490:	58 0a       	sbc	r5, r24
   1a492:	68 0a       	sbc	r6, r24
   1a494:	78 0a       	sbc	r7, r24
        for (uint_least8_t i = 0; i < ordinary_items; i++)
        {
            if (item) lcd_puts_at_P(1, i + 1, item);
        }

        for (uint_least8_t i = 0; i < ordinary_items; i++)
   1a496:	d9 11       	cpse	r29, r9
   1a498:	f0 cf       	rjmp	.-32     	; 0x1a47a <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0xea>
        {
            lcd_set_cursor(2 + item_len, i+1);
            lcd_print(first + i + 1);
        }

        if (last_item&&last_visible) lcd_puts_at_P(1, 3, last_item);
   1a49a:	e1 14       	cp	r14, r1
   1a49c:	f1 04       	cpc	r15, r1
   1a49e:	41 f0       	breq	.+16     	; 0x1a4b0 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0x120>
   1a4a0:	a0 16       	cp	r10, r16
   1a4a2:	b1 06       	cpc	r11, r17
   1a4a4:	29 f4       	brne	.+10     	; 0x1a4b0 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0x120>
   1a4a6:	a7 01       	movw	r20, r14
   1a4a8:	63 e0       	ldi	r22, 0x03	; 3
   1a4aa:	81 e0       	ldi	r24, 0x01	; 1
   1a4ac:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>

        lcd_puts_at_P(0, 1, PSTR(" \n \n "));
   1a4b0:	4a e8       	ldi	r20, 0x8A	; 138
   1a4b2:	57 e8       	ldi	r21, 0x87	; 135
   1a4b4:	61 e0       	ldi	r22, 0x01	; 1
   1a4b6:	80 e0       	ldi	r24, 0x00	; 0
   1a4b8:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
        lcd_putc_at(0, cursor_pos, '>');
   1a4bc:	4e e3       	ldi	r20, 0x3E	; 62
   1a4be:	6c 2f       	mov	r22, r28
   1a4c0:	80 e0       	ldi	r24, 0x00	; 0
   1a4c2:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
        _delay(100);
   1a4c6:	64 e6       	ldi	r22, 0x64	; 100
   1a4c8:	70 e0       	ldi	r23, 0x00	; 0
   1a4ca:	80 e0       	ldi	r24, 0x00	; 0
   1a4cc:	90 e0       	ldi	r25, 0x00	; 0
   1a4ce:	0f 94 bd 0d 	call	0x21b7a	; 0x21b7a <delay2>

		if (lcd_clicked())
   1a4d2:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   1a4d6:	88 23       	and	r24, r24
   1a4d8:	09 f4       	brne	.+2      	; 0x1a4dc <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0x14c>
   1a4da:	81 cf       	rjmp	.-254    	; 0x1a3de <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0x4e>
		{
		    KEEPALIVE_STATE(IN_HANDLER);
   1a4dc:	82 e0       	ldi	r24, 0x02	; 2
   1a4de:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
			return(cursor_pos + first - 1);
   1a4e2:	8f ef       	ldi	r24, 0xFF	; 255
   1a4e4:	8c 0f       	add	r24, r28
   1a4e6:	88 0d       	add	r24, r8
		}
	}
}
   1a4e8:	df 91       	pop	r29
   1a4ea:	cf 91       	pop	r28
   1a4ec:	1f 91       	pop	r17
   1a4ee:	0f 91       	pop	r16
   1a4f0:	ff 90       	pop	r15
   1a4f2:	ef 90       	pop	r14
   1a4f4:	df 90       	pop	r13
   1a4f6:	cf 90       	pop	r12
   1a4f8:	bf 90       	pop	r11
   1a4fa:	af 90       	pop	r10
   1a4fc:	9f 90       	pop	r9
   1a4fe:	8f 90       	pop	r8
   1a500:	7f 90       	pop	r7
   1a502:	6f 90       	pop	r6
   1a504:	5f 90       	pop	r5
   1a506:	4f 90       	pop	r4
   1a508:	08 95       	ret
                cursor_pos--;
            }

            if (lcd_encoder > 0)
            {
                cursor_pos++;
   1a50a:	cf 5f       	subi	r28, 0xFF	; 255
   1a50c:	77 cf       	rjmp	.-274    	; 0x1a3fc <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0x6c>
            if (first < items_no - 3)
            {
                first++;
                lcd_clear();
            } else { // here we are at the very end of the list
				Sound_MakeSound(e_SOUND_TYPE_BlindAlert);
   1a50e:	87 e0       	ldi	r24, 0x07	; 7
   1a510:	0f 94 ad 25 	call	0x24b5a	; 0x24b5a <Sound_MakeSound(eSOUND_TYPE)>
   1a514:	85 cf       	rjmp	.-246    	; 0x1a420 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0x90>
            }
        }

        if (cursor_pos < 1)
   1a516:	c1 11       	cpse	r28, r1
   1a518:	84 cf       	rjmp	.-248    	; 0x1a422 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0x92>
        {
            cursor_pos = 1;
            if (first > 0)
   1a51a:	18 14       	cp	r1, r8
   1a51c:	2c f4       	brge	.+10     	; 0x1a528 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0x198>
            {
                first--;
   1a51e:	8a 94       	dec	r8
                lcd_clear();
   1a520:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
            }
        }

        if (cursor_pos < 1)
        {
            cursor_pos = 1;
   1a524:	c1 e0       	ldi	r28, 0x01	; 1
   1a526:	7d cf       	rjmp	.-262    	; 0x1a422 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0x92>
            if (first > 0)
            {
                first--;
                lcd_clear();
            } else { // here we are at the very end of the list
				Sound_MakeSound(e_SOUND_TYPE_BlindAlert);
   1a528:	87 e0       	ldi	r24, 0x07	; 7
   1a52a:	0f 94 ad 25 	call	0x24b5a	; 0x24b5a <Sound_MakeSound(eSOUND_TYPE)>
   1a52e:	fa cf       	rjmp	.-12     	; 0x1a524 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0x194>
                cursor_pos++;
            }
            lcd_encoder = 0;
		}

		if (cursor_pos > 3)
   1a530:	c4 30       	cpi	r28, 0x04	; 4
   1a532:	0c f0       	brlt	.+2      	; 0x1a536 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0x1a6>
   1a534:	6a cf       	rjmp	.-300    	; 0x1a40a <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0x7a>
   1a536:	75 cf       	rjmp	.-278    	; 0x1a422 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]+0x92>

0001a538 <MMU2::MMU2::WriteRegister(unsigned char, unsigned int) [clone .constprop.28]>:
    // Update cached value
    lastReadRegisterValue = logic.rsp.paramValue;
    return true;
}

bool __attribute__((noinline)) MMU2::WriteRegister(uint8_t address, uint16_t data) {
   1a538:	ef 92       	push	r14
   1a53a:	ff 92       	push	r15
   1a53c:	0f 93       	push	r16
   1a53e:	1f 93       	push	r17
   1a540:	cf 93       	push	r28
   1a542:	df 93       	push	r29
   1a544:	00 d0       	rcall	.+0      	; 0x1a546 <MMU2::MMU2::WriteRegister(unsigned char, unsigned int) [clone .constprop.28]+0xe>
   1a546:	1f 92       	push	r1
   1a548:	1f 92       	push	r1
   1a54a:	cd b7       	in	r28, 0x3d	; 61
   1a54c:	de b7       	in	r29, 0x3e	; 62
   1a54e:	08 2f       	mov	r16, r24
   1a550:	16 2f       	mov	r17, r22
   1a552:	f7 2e       	mov	r15, r23
    if (!WaitForMMUReady()) {
   1a554:	0f 94 a6 79 	call	0x2f34c	; 0x2f34c <MMU2::MMU2::WaitForMMUReady() [clone .constprop.106]>
   1a558:	88 23       	and	r24, r24
   1a55a:	d9 f0       	breq	.+54     	; 0x1a592 <MMU2::MMU2::WriteRegister(unsigned char, unsigned int) [clone .constprop.28]+0x5a>
        return false;
    }

    // special cases - intercept requests of registers which influence the printer's behaviour too + perform the change even on the printer's side
    switch (address) {
   1a55c:	0b 30       	cpi	r16, 0x0B	; 11
   1a55e:	29 f1       	breq	.+74     	; 0x1a5aa <MMU2::MMU2::WriteRegister(unsigned char, unsigned int) [clone .constprop.28]+0x72>
   1a560:	04 31       	cpi	r16, 0x14	; 20
   1a562:	31 f1       	breq	.+76     	; 0x1a5b0 <MMU2::MMU2::WriteRegister(unsigned char, unsigned int) [clone .constprop.28]+0x78>
    /// @param value to write into the register
    inline constexpr RequestMsg(RequestMsgCodes code, uint8_t address, uint16_t value)
        : code(code)
        , value(address)
        , value2(value)
        , crc8(ComputeCRC8()) {
   1a564:	87 e5       	ldi	r24, 0x57	; 87
   1a566:	e8 2e       	mov	r14, r24
   1a568:	e9 82       	std	Y+1, r14	; 0x01
   1a56a:	0a 83       	std	Y+2, r16	; 0x02
   1a56c:	1b 83       	std	Y+3, r17	; 0x03
   1a56e:	fc 82       	std	Y+4, r15	; 0x04
   1a570:	ce 01       	movw	r24, r28
   1a572:	01 96       	adiw	r24, 0x01	; 1
   1a574:	0f 94 a3 50 	call	0x2a146	; 0x2a146 <modules::protocol::RequestMsg::ComputeCRC8() const>
   1a578:	8d 83       	std	Y+5, r24	; 0x05
void ProtocolLogic::ReadRegister(uint8_t address) {
    PlanGenericRequest(RequestMsg(RequestMsgCodes::Read, address));
}

void ProtocolLogic::WriteRegister(uint8_t address, uint16_t data) {
    PlanGenericRequest(RequestMsg(RequestMsgCodes::Write, address, data));
   1a57a:	47 e5       	ldi	r20, 0x57	; 87
   1a57c:	50 2f       	mov	r21, r16
   1a57e:	61 2f       	mov	r22, r17
   1a580:	7f 2d       	mov	r23, r15
   1a582:	0f 94 19 95 	call	0x32a32	; 0x32a32 <MMU2::ProtocolLogic::PlanGenericRequest(modules::protocol::RequestMsg) [clone .constprop.327]>
        break; // do not intercept any other register writes
    }

    do {
        logic.WriteRegister(address, data); // we may signal the accepted/rejected status of the response as return value of this function
    } while (!manage_response(false, false));
   1a586:	60 e0       	ldi	r22, 0x00	; 0
   1a588:	80 e0       	ldi	r24, 0x00	; 0
   1a58a:	0f 94 aa 9c 	call	0x33954	; 0x33954 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]>
   1a58e:	88 23       	and	r24, r24
   1a590:	59 f3       	breq	.-42     	; 0x1a568 <MMU2::MMU2::WriteRegister(unsigned char, unsigned int) [clone .constprop.28]+0x30>

    return true;
}
   1a592:	0f 90       	pop	r0
   1a594:	0f 90       	pop	r0
   1a596:	0f 90       	pop	r0
   1a598:	0f 90       	pop	r0
   1a59a:	0f 90       	pop	r0
   1a59c:	df 91       	pop	r29
   1a59e:	cf 91       	pop	r28
   1a5a0:	1f 91       	pop	r17
   1a5a2:	0f 91       	pop	r16
   1a5a4:	ff 90       	pop	r15
   1a5a6:	ef 90       	pop	r14
   1a5a8:	08 95       	ret
    }

    // special cases - intercept requests of registers which influence the printer's behaviour too + perform the change even on the printer's side
    switch (address) {
    case (uint8_t)Register::Extra_Load_Distance:
        logic.PlanExtraLoadDistance(data);
   1a5aa:	10 93 de 12 	sts	0x12DE, r17	; 0x8012de <MMU2::mmu2+0x4c>
   1a5ae:	da cf       	rjmp	.-76     	; 0x1a564 <MMU2::MMU2::WriteRegister(unsigned char, unsigned int) [clone .constprop.28]+0x2c>
        break;
    case (uint8_t)Register::Pulley_Slow_Feedrate:
        logic.PlanPulleySlowFeedRate(data);
   1a5b0:	10 93 df 12 	sts	0x12DF, r17	; 0x8012df <MMU2::mmu2+0x4d>
   1a5b4:	d7 cf       	rjmp	.-82     	; 0x1a564 <MMU2::MMU2::WriteRegister(unsigned char, unsigned int) [clone .constprop.28]+0x2c>

0001a5b6 <delayMicroseconds>:
#elif F_CPU >= 16000000L
	// for the 16 MHz clock on most Arduino boards

	// for a one-microsecond delay, simply return.  the overhead
	// of the function call takes 14 (16) cycles, which is 1us
	if (us <= 1) return; //  = 3 cycles, (4 when true)
   1a5b6:	82 30       	cpi	r24, 0x02	; 2
   1a5b8:	91 05       	cpc	r25, r1
   1a5ba:	38 f0       	brcs	.+14     	; 0x1a5ca <delayMicroseconds+0x14>

	// the following loop takes 1/4 of a microsecond (4 cycles)
	// per iteration, so execute it four times for each microsecond of
	// delay requested.
	us <<= 2; // x4 us, = 4 cycles
   1a5bc:	88 0f       	add	r24, r24
   1a5be:	99 1f       	adc	r25, r25
   1a5c0:	88 0f       	add	r24, r24
   1a5c2:	99 1f       	adc	r25, r25

	// account for the time taken in the preceeding commands.
	// we just burned 19 (21) cycles above, remove 5, (5*4=20)
	// us is at least 8 so we can substract 5
	us -= 5; // = 2 cycles,
   1a5c4:	05 97       	sbiw	r24, 0x05	; 5
	

#endif

	// busy wait
	__asm__ __volatile__ (
   1a5c6:	01 97       	sbiw	r24, 0x01	; 1
   1a5c8:	f1 f7       	brne	.-4      	; 0x1a5c6 <delayMicroseconds+0x10>
		"1: sbiw %0,1" "\n\t" // 2 cycles
		"brne 1b" : "=w" (us) : "0" (us) // 2 cycles
	);
	// return = 4 cycles
}
   1a5ca:	08 95       	ret

0001a5cc <digitalRead>:

	SREG = oldSREG;
}

int digitalRead(uint8_t pin)
{
   1a5cc:	cf 93       	push	r28
   1a5ce:	df 93       	push	r29
	uint8_t timer = digitalPinToTimer(pin);
   1a5d0:	28 2f       	mov	r18, r24
   1a5d2:	30 e0       	ldi	r19, 0x00	; 0
   1a5d4:	f9 01       	movw	r30, r18
   1a5d6:	e6 5d       	subi	r30, 0xD6	; 214
   1a5d8:	f9 47       	sbci	r31, 0x79	; 121
   1a5da:	84 91       	lpm	r24, Z
	uint8_t bit = digitalPinToBitMask(pin);
   1a5dc:	f9 01       	movw	r30, r18
   1a5de:	ec 52       	subi	r30, 0x2C	; 44
   1a5e0:	fa 47       	sbci	r31, 0x7A	; 122
   1a5e2:	d4 91       	lpm	r29, Z
	uint8_t port = digitalPinToPort(pin);
   1a5e4:	f9 01       	movw	r30, r18
   1a5e6:	e2 58       	subi	r30, 0x82	; 130
   1a5e8:	fa 47       	sbci	r31, 0x7A	; 122
   1a5ea:	c4 91       	lpm	r28, Z

	if (port == NOT_A_PIN) return LOW;
   1a5ec:	cc 23       	and	r28, r28
   1a5ee:	a1 f0       	breq	.+40     	; 0x1a618 <digitalRead+0x4c>

	// If the pin that support PWM output, we need to turn it off
	// before getting a digital reading.
	if (timer != NOT_ON_TIMER) turnOffPWM(timer);
   1a5f0:	81 11       	cpse	r24, r1
   1a5f2:	0e 94 ec bc 	call	0x179d8	; 0x179d8 <turnOffPWM>

	if (*portInputRegister(port) & bit) return HIGH;
   1a5f6:	ec 2f       	mov	r30, r28
   1a5f8:	f0 e0       	ldi	r31, 0x00	; 0
   1a5fa:	ee 0f       	add	r30, r30
   1a5fc:	ff 1f       	adc	r31, r31
   1a5fe:	ec 59       	subi	r30, 0x9C	; 156
   1a600:	fa 47       	sbci	r31, 0x7A	; 122
   1a602:	a5 91       	lpm	r26, Z+
   1a604:	b4 91       	lpm	r27, Z
   1a606:	ec 91       	ld	r30, X
   1a608:	ed 23       	and	r30, r29
   1a60a:	81 e0       	ldi	r24, 0x01	; 1
   1a60c:	90 e0       	ldi	r25, 0x00	; 0
   1a60e:	09 f4       	brne	.+2      	; 0x1a612 <digitalRead+0x46>
   1a610:	80 e0       	ldi	r24, 0x00	; 0
	return LOW;
}
   1a612:	df 91       	pop	r29
   1a614:	cf 91       	pop	r28
   1a616:	08 95       	ret
{
	uint8_t timer = digitalPinToTimer(pin);
	uint8_t bit = digitalPinToBitMask(pin);
	uint8_t port = digitalPinToPort(pin);

	if (port == NOT_A_PIN) return LOW;
   1a618:	80 e0       	ldi	r24, 0x00	; 0
   1a61a:	90 e0       	ldi	r25, 0x00	; 0
   1a61c:	fa cf       	rjmp	.-12     	; 0x1a612 <digitalRead+0x46>

0001a61e <digitalWrite>:
		#endif
	}
}

void digitalWrite(uint8_t pin, uint8_t val)
{
   1a61e:	1f 93       	push	r17
   1a620:	cf 93       	push	r28
   1a622:	df 93       	push	r29
	uint8_t timer = digitalPinToTimer(pin);
   1a624:	28 2f       	mov	r18, r24
   1a626:	30 e0       	ldi	r19, 0x00	; 0
   1a628:	f9 01       	movw	r30, r18
   1a62a:	e6 5d       	subi	r30, 0xD6	; 214
   1a62c:	f9 47       	sbci	r31, 0x79	; 121
   1a62e:	84 91       	lpm	r24, Z
	uint8_t bit = digitalPinToBitMask(pin);
   1a630:	f9 01       	movw	r30, r18
   1a632:	ec 52       	subi	r30, 0x2C	; 44
   1a634:	fa 47       	sbci	r31, 0x7A	; 122
   1a636:	d4 91       	lpm	r29, Z
	uint8_t port = digitalPinToPort(pin);
   1a638:	f9 01       	movw	r30, r18
   1a63a:	e2 58       	subi	r30, 0x82	; 130
   1a63c:	fa 47       	sbci	r31, 0x7A	; 122
   1a63e:	c4 91       	lpm	r28, Z
	volatile uint8_t *out;

	if (port == NOT_A_PIN) return;
   1a640:	cc 23       	and	r28, r28
   1a642:	a9 f0       	breq	.+42     	; 0x1a66e <digitalWrite+0x50>
   1a644:	16 2f       	mov	r17, r22

	// If the pin that support PWM output, we need to turn it off
	// before doing a digital write.
	if (timer != NOT_ON_TIMER) turnOffPWM(timer);
   1a646:	81 11       	cpse	r24, r1
   1a648:	0e 94 ec bc 	call	0x179d8	; 0x179d8 <turnOffPWM>

	out = portOutputRegister(port);
   1a64c:	ec 2f       	mov	r30, r28
   1a64e:	f0 e0       	ldi	r31, 0x00	; 0
   1a650:	ee 0f       	add	r30, r30
   1a652:	ff 1f       	adc	r31, r31
   1a654:	e6 5b       	subi	r30, 0xB6	; 182
   1a656:	fa 47       	sbci	r31, 0x7A	; 122
   1a658:	a5 91       	lpm	r26, Z+
   1a65a:	b4 91       	lpm	r27, Z

	uint8_t oldSREG = SREG;
   1a65c:	8f b7       	in	r24, 0x3f	; 63
	cli();
   1a65e:	f8 94       	cli

	if (val == LOW) {
		*out &= ~bit;
   1a660:	ec 91       	ld	r30, X
	out = portOutputRegister(port);

	uint8_t oldSREG = SREG;
	cli();

	if (val == LOW) {
   1a662:	11 11       	cpse	r17, r1
   1a664:	08 c0       	rjmp	.+16     	; 0x1a676 <digitalWrite+0x58>
		*out &= ~bit;
   1a666:	d0 95       	com	r29
   1a668:	de 23       	and	r29, r30
	} else {
		*out |= bit;
   1a66a:	dc 93       	st	X, r29
	}

	SREG = oldSREG;
   1a66c:	8f bf       	out	0x3f, r24	; 63
}
   1a66e:	df 91       	pop	r29
   1a670:	cf 91       	pop	r28
   1a672:	1f 91       	pop	r17
   1a674:	08 95       	ret
	cli();

	if (val == LOW) {
		*out &= ~bit;
	} else {
		*out |= bit;
   1a676:	de 2b       	or	r29, r30
   1a678:	f8 cf       	rjmp	.-16     	; 0x1a66a <digitalWrite+0x4c>

0001a67a <pinMode>:
#define ARDUINO_MAIN
#include "wiring_private.h"
#include "pins_arduino.h"

void pinMode(uint8_t pin, uint8_t mode)
{
   1a67a:	cf 93       	push	r28
   1a67c:	df 93       	push	r29
	uint8_t bit = digitalPinToBitMask(pin);
   1a67e:	90 e0       	ldi	r25, 0x00	; 0
   1a680:	fc 01       	movw	r30, r24
   1a682:	ec 52       	subi	r30, 0x2C	; 44
   1a684:	fa 47       	sbci	r31, 0x7A	; 122
   1a686:	24 91       	lpm	r18, Z
	uint8_t port = digitalPinToPort(pin);
   1a688:	82 58       	subi	r24, 0x82	; 130
   1a68a:	9a 47       	sbci	r25, 0x7A	; 122
   1a68c:	fc 01       	movw	r30, r24
   1a68e:	84 91       	lpm	r24, Z
	volatile uint8_t *reg, *out;

	if (port == NOT_A_PIN) return;
   1a690:	88 23       	and	r24, r24
   1a692:	d1 f0       	breq	.+52     	; 0x1a6c8 <pinMode+0x4e>

	// JWS: can I let the optimizer do this?
	reg = portModeRegister(port);
   1a694:	90 e0       	ldi	r25, 0x00	; 0
   1a696:	88 0f       	add	r24, r24
   1a698:	99 1f       	adc	r25, r25
   1a69a:	fc 01       	movw	r30, r24
   1a69c:	e0 5d       	subi	r30, 0xD0	; 208
   1a69e:	fa 47       	sbci	r31, 0x7A	; 122
   1a6a0:	a5 91       	lpm	r26, Z+
   1a6a2:	b4 91       	lpm	r27, Z
	out = portOutputRegister(port);
   1a6a4:	fc 01       	movw	r30, r24
   1a6a6:	e6 5b       	subi	r30, 0xB6	; 182
   1a6a8:	fa 47       	sbci	r31, 0x7A	; 122
   1a6aa:	c5 91       	lpm	r28, Z+
   1a6ac:	d4 91       	lpm	r29, Z

	if (mode == INPUT) { 
   1a6ae:	61 11       	cpse	r22, r1
   1a6b0:	0e c0       	rjmp	.+28     	; 0x1a6ce <pinMode+0x54>
		uint8_t oldSREG = SREG;
   1a6b2:	9f b7       	in	r25, 0x3f	; 63
                cli();
   1a6b4:	f8 94       	cli
		*reg &= ~bit;
   1a6b6:	8c 91       	ld	r24, X
   1a6b8:	e2 2f       	mov	r30, r18
   1a6ba:	e0 95       	com	r30
   1a6bc:	8e 23       	and	r24, r30
   1a6be:	8c 93       	st	X, r24
		*out &= ~bit;
   1a6c0:	28 81       	ld	r18, Y
   1a6c2:	e2 23       	and	r30, r18
   1a6c4:	e8 83       	st	Y, r30
		SREG = oldSREG;
   1a6c6:	9f bf       	out	0x3f, r25	; 63
		uint8_t oldSREG = SREG;
                cli();
		*reg |= bit;
		SREG = oldSREG;
	}
}
   1a6c8:	df 91       	pop	r29
   1a6ca:	cf 91       	pop	r28
   1a6cc:	08 95       	ret
                cli();
		*reg &= ~bit;
		*out |= bit;
		SREG = oldSREG;
	} else {
		uint8_t oldSREG = SREG;
   1a6ce:	8f b7       	in	r24, 0x3f	; 63
                cli();
   1a6d0:	f8 94       	cli
		*reg |= bit;
   1a6d2:	ec 91       	ld	r30, X
   1a6d4:	e2 2b       	or	r30, r18
   1a6d6:	ec 93       	st	X, r30
		SREG = oldSREG;
   1a6d8:	8f bf       	out	0x3f, r24	; 63
   1a6da:	f6 cf       	rjmp	.-20     	; 0x1a6c8 <pinMode+0x4e>

0001a6dc <analogWrite>:
// Right now, PWM output only works on the pins with
// hardware support.  These are defined in the appropriate
// pins_*.c file.  For the rest of the pins, we default
// to digital output.
void analogWrite(uint8_t pin, int val)
{
   1a6dc:	1f 93       	push	r17
   1a6de:	cf 93       	push	r28
   1a6e0:	df 93       	push	r29
   1a6e2:	18 2f       	mov	r17, r24
   1a6e4:	eb 01       	movw	r28, r22
	// We need to make sure the PWM output is enabled for those pins
	// that support it, as we turn it off when digitally reading or
	// writing with them.  Also, make sure the pin is in output mode
	// for consistenty with Wiring, which doesn't require a pinMode
	// call for the analog output pins.
	pinMode(pin, OUTPUT);
   1a6e6:	61 e0       	ldi	r22, 0x01	; 1
   1a6e8:	0e 94 3d d3 	call	0x1a67a	; 0x1a67a <pinMode>
	if (val == 0)
   1a6ec:	20 97       	sbiw	r28, 0x00	; 0
   1a6ee:	39 f4       	brne	.+14     	; 0x1a6fe <analogWrite+0x22>
	{
		digitalWrite(pin, LOW);
   1a6f0:	60 e0       	ldi	r22, 0x00	; 0
	}
	else if (val == 255)
	{
		digitalWrite(pin, HIGH);
   1a6f2:	81 2f       	mov	r24, r17
				} else {
					digitalWrite(pin, HIGH);
				}
		}
	}
}
   1a6f4:	df 91       	pop	r29
   1a6f6:	cf 91       	pop	r28
   1a6f8:	1f 91       	pop	r17
	{
		digitalWrite(pin, LOW);
	}
	else if (val == 255)
	{
		digitalWrite(pin, HIGH);
   1a6fa:	0c 94 0f d3 	jmp	0x1a61e	; 0x1a61e <digitalWrite>
	pinMode(pin, OUTPUT);
	if (val == 0)
	{
		digitalWrite(pin, LOW);
	}
	else if (val == 255)
   1a6fe:	cf 3f       	cpi	r28, 0xFF	; 255
   1a700:	d1 05       	cpc	r29, r1
   1a702:	11 f4       	brne	.+4      	; 0x1a708 <analogWrite+0x2c>
	{
		digitalWrite(pin, HIGH);
   1a704:	61 e0       	ldi	r22, 0x01	; 1
   1a706:	f5 cf       	rjmp	.-22     	; 0x1a6f2 <analogWrite+0x16>
	}
	else
	{
		switch(digitalPinToTimer(pin))
   1a708:	e1 2f       	mov	r30, r17
   1a70a:	f0 e0       	ldi	r31, 0x00	; 0
   1a70c:	e6 5d       	subi	r30, 0xD6	; 214
   1a70e:	f9 47       	sbci	r31, 0x79	; 121
   1a710:	e4 91       	lpm	r30, Z
   1a712:	e1 50       	subi	r30, 0x01	; 1
   1a714:	e2 31       	cpi	r30, 0x12	; 18
   1a716:	08 f0       	brcs	.+2      	; 0x1a71a <analogWrite+0x3e>
   1a718:	b3 c0       	rjmp	.+358    	; 0x1a880 <analogWrite+0x1a4>
   1a71a:	f0 e0       	ldi	r31, 0x00	; 0
   1a71c:	88 27       	eor	r24, r24
   1a71e:	ec 56       	subi	r30, 0x6C	; 108
   1a720:	fc 42       	sbci	r31, 0x2C	; 44
   1a722:	8f 4f       	sbci	r24, 0xFF	; 255
   1a724:	0d 94 f0 a4 	jmp	0x349e0	; 0x349e0 <__tablejump2__>
   1a728:	a6 d3       	rcall	.+1868   	; 0x1ae76 <lcd_reset_sheet()+0x68>
   1a72a:	ae d3       	rcall	.+1884   	; 0x1ae88 <lcd_reset_sheet()+0x7a>
   1a72c:	b3 d3       	rcall	.+1894   	; 0x1ae94 <lcd_reset_sheet()+0x86>
   1a72e:	bd d3       	rcall	.+1914   	; 0x1aeaa <calibration_status_set(unsigned char)+0xe>
   1a730:	c7 d3       	rcall	.+1934   	; 0x1aec0 <calibration_status_get(unsigned char)+0xa>
   1a732:	40 d4       	rcall	.+2176   	; 0x1afb4 <lcd_babystep_z()+0xe4>
   1a734:	d1 d3       	rcall	.+1954   	; 0x1aed8 <lcd_babystep_z()+0x8>
   1a736:	d9 d3       	rcall	.+1970   	; 0x1aeea <lcd_babystep_z()+0x1a>
   1a738:	e1 d3       	rcall	.+1986   	; 0x1aefc <lcd_babystep_z()+0x2c>
   1a73a:	eb d3       	rcall	.+2006   	; 0x1af12 <lcd_babystep_z()+0x42>
   1a73c:	f5 d3       	rcall	.+2026   	; 0x1af28 <lcd_babystep_z()+0x58>
   1a73e:	ff d3       	rcall	.+2046   	; 0x1af3e <lcd_babystep_z()+0x6e>
   1a740:	0e d4       	rcall	.+2076   	; 0x1af5e <lcd_babystep_z()+0x8e>
   1a742:	18 d4       	rcall	.+2096   	; 0x1af74 <lcd_babystep_z()+0xa4>
   1a744:	40 d4       	rcall	.+2176   	; 0x1afc6 <lcd_babystep_z()+0xf6>
   1a746:	22 d4       	rcall	.+2116   	; 0x1af8c <lcd_babystep_z()+0xbc>
   1a748:	2c d4       	rcall	.+2136   	; 0x1afa2 <lcd_babystep_z()+0xd2>
   1a74a:	36 d4       	rcall	.+2156   	; 0x1afb8 <lcd_babystep_z()+0xe8>
			#endif

			#if defined(TCCR0A) && defined(COM0A1)
			case TIMER0A:
				// connect pwm to pin on timer 0, channel A
				sbi(TCCR0A, COM0A1);
   1a74c:	84 b5       	in	r24, 0x24	; 36
   1a74e:	80 68       	ori	r24, 0x80	; 128
   1a750:	84 bd       	out	0x24, r24	; 36
				OCR0A = val; // set pwm duty
   1a752:	c7 bd       	out	0x27, r28	; 39
				} else {
					digitalWrite(pin, HIGH);
				}
		}
	}
}
   1a754:	df 91       	pop	r29
   1a756:	cf 91       	pop	r28
   1a758:	1f 91       	pop	r17
   1a75a:	08 95       	ret
			#endif

			#if defined(TCCR0A) && defined(COM0B1)
			case TIMER0B:
				// connect pwm to pin on timer 0, channel B
				sbi(TCCR0A, COM0B1);
   1a75c:	84 b5       	in	r24, 0x24	; 36
   1a75e:	80 62       	ori	r24, 0x20	; 32
   1a760:	84 bd       	out	0x24, r24	; 36
				OCR0B = val; // set pwm duty
   1a762:	c8 bd       	out	0x28, r28	; 40
   1a764:	f7 cf       	rjmp	.-18     	; 0x1a754 <analogWrite+0x78>
			#endif

			#if defined(TCCR1A) && defined(COM1A1)
			case TIMER1A:
				// connect pwm to pin on timer 1, channel A
				sbi(TCCR1A, COM1A1);
   1a766:	80 91 80 00 	lds	r24, 0x0080	; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080>
   1a76a:	80 68       	ori	r24, 0x80	; 128
   1a76c:	80 93 80 00 	sts	0x0080, r24	; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080>
				OCR1A = val; // set pwm duty
   1a770:	d0 93 89 00 	sts	0x0089, r29	; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089>
   1a774:	c0 93 88 00 	sts	0x0088, r28	; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088>
   1a778:	ed cf       	rjmp	.-38     	; 0x1a754 <analogWrite+0x78>
			#endif

			#if defined(TCCR1A) && defined(COM1B1)
			case TIMER1B:
				// connect pwm to pin on timer 1, channel B
				sbi(TCCR1A, COM1B1);
   1a77a:	80 91 80 00 	lds	r24, 0x0080	; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080>
   1a77e:	80 62       	ori	r24, 0x20	; 32
   1a780:	80 93 80 00 	sts	0x0080, r24	; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080>
				OCR1B = val; // set pwm duty
   1a784:	d0 93 8b 00 	sts	0x008B, r29	; 0x80008b <__TEXT_REGION_LENGTH__+0x7c208b>
   1a788:	c0 93 8a 00 	sts	0x008A, r28	; 0x80008a <__TEXT_REGION_LENGTH__+0x7c208a>
   1a78c:	e3 cf       	rjmp	.-58     	; 0x1a754 <analogWrite+0x78>
			#endif

			#if defined(TCCR1A) && defined(COM1C1)
			case TIMER1C:
				// connect pwm to pin on timer 1, channel C
				sbi(TCCR1A, COM1C1);
   1a78e:	80 91 80 00 	lds	r24, 0x0080	; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080>
   1a792:	88 60       	ori	r24, 0x08	; 8
   1a794:	80 93 80 00 	sts	0x0080, r24	; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080>
				OCR1C = val; // set pwm duty
   1a798:	d0 93 8d 00 	sts	0x008D, r29	; 0x80008d <__TEXT_REGION_LENGTH__+0x7c208d>
   1a79c:	c0 93 8c 00 	sts	0x008C, r28	; 0x80008c <__TEXT_REGION_LENGTH__+0x7c208c>
   1a7a0:	d9 cf       	rjmp	.-78     	; 0x1a754 <analogWrite+0x78>
			#endif

			#if defined(TCCR2A) && defined(COM2A1)
			case TIMER2A:
				// connect pwm to pin on timer 2, channel A
				sbi(TCCR2A, COM2A1);
   1a7a2:	80 91 b0 00 	lds	r24, 0x00B0	; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0>
   1a7a6:	80 68       	ori	r24, 0x80	; 128
   1a7a8:	80 93 b0 00 	sts	0x00B0, r24	; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0>
				OCR2A = val; // set pwm duty
   1a7ac:	c0 93 b3 00 	sts	0x00B3, r28	; 0x8000b3 <__TEXT_REGION_LENGTH__+0x7c20b3>
   1a7b0:	d1 cf       	rjmp	.-94     	; 0x1a754 <analogWrite+0x78>
			#endif

			#if defined(TCCR2A) && defined(COM2B1)
			case TIMER2B:
				// connect pwm to pin on timer 2, channel B
				sbi(TCCR2A, COM2B1);
   1a7b2:	80 91 b0 00 	lds	r24, 0x00B0	; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0>
   1a7b6:	80 62       	ori	r24, 0x20	; 32
   1a7b8:	80 93 b0 00 	sts	0x00B0, r24	; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0>
				OCR2B = val; // set pwm duty
   1a7bc:	c0 93 b4 00 	sts	0x00B4, r28	; 0x8000b4 <__TEXT_REGION_LENGTH__+0x7c20b4>
   1a7c0:	c9 cf       	rjmp	.-110    	; 0x1a754 <analogWrite+0x78>
			#endif

			#if defined(TCCR3A) && defined(COM3A1)
			case TIMER3A:
				// connect pwm to pin on timer 3, channel A
				sbi(TCCR3A, COM3A1);
   1a7c2:	80 91 90 00 	lds	r24, 0x0090	; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090>
   1a7c6:	80 68       	ori	r24, 0x80	; 128
   1a7c8:	80 93 90 00 	sts	0x0090, r24	; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090>
				OCR3A = val; // set pwm duty
   1a7cc:	d0 93 99 00 	sts	0x0099, r29	; 0x800099 <__TEXT_REGION_LENGTH__+0x7c2099>
   1a7d0:	c0 93 98 00 	sts	0x0098, r28	; 0x800098 <__TEXT_REGION_LENGTH__+0x7c2098>
   1a7d4:	bf cf       	rjmp	.-130    	; 0x1a754 <analogWrite+0x78>
			#endif

			#if defined(TCCR3A) && defined(COM3B1)
			case TIMER3B:
				// connect pwm to pin on timer 3, channel B
				sbi(TCCR3A, COM3B1);
   1a7d6:	80 91 90 00 	lds	r24, 0x0090	; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090>
   1a7da:	80 62       	ori	r24, 0x20	; 32
   1a7dc:	80 93 90 00 	sts	0x0090, r24	; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090>
				OCR3B = val; // set pwm duty
   1a7e0:	d0 93 9b 00 	sts	0x009B, r29	; 0x80009b <__TEXT_REGION_LENGTH__+0x7c209b>
   1a7e4:	c0 93 9a 00 	sts	0x009A, r28	; 0x80009a <__TEXT_REGION_LENGTH__+0x7c209a>
   1a7e8:	b5 cf       	rjmp	.-150    	; 0x1a754 <analogWrite+0x78>
			#endif

			#if defined(TCCR3A) && defined(COM3C1)
			case TIMER3C:
				// connect pwm to pin on timer 3, channel C
				sbi(TCCR3A, COM3C1);
   1a7ea:	80 91 90 00 	lds	r24, 0x0090	; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090>
   1a7ee:	88 60       	ori	r24, 0x08	; 8
   1a7f0:	80 93 90 00 	sts	0x0090, r24	; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090>
				OCR3C = val; // set pwm duty
   1a7f4:	d0 93 9d 00 	sts	0x009D, r29	; 0x80009d <__TEXT_REGION_LENGTH__+0x7c209d>
   1a7f8:	c0 93 9c 00 	sts	0x009C, r28	; 0x80009c <__TEXT_REGION_LENGTH__+0x7c209c>
   1a7fc:	ab cf       	rjmp	.-170    	; 0x1a754 <analogWrite+0x78>
			#endif

			#if defined(TCCR4A)
			case TIMER4A:
				//connect pwm to pin on timer 4, channel A
				sbi(TCCR4A, COM4A1);
   1a7fe:	80 91 a0 00 	lds	r24, 0x00A0	; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0>
   1a802:	80 68       	ori	r24, 0x80	; 128
   1a804:	80 93 a0 00 	sts	0x00A0, r24	; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0>
				#if defined(COM4A0)		// only used on 32U4
				cbi(TCCR4A, COM4A0);
   1a808:	80 91 a0 00 	lds	r24, 0x00A0	; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0>
   1a80c:	8f 7b       	andi	r24, 0xBF	; 191
   1a80e:	80 93 a0 00 	sts	0x00A0, r24	; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0>
				#endif
				OCR4A = val;	// set pwm duty
   1a812:	d0 93 a9 00 	sts	0x00A9, r29	; 0x8000a9 <__TEXT_REGION_LENGTH__+0x7c20a9>
   1a816:	c0 93 a8 00 	sts	0x00A8, r28	; 0x8000a8 <__TEXT_REGION_LENGTH__+0x7c20a8>
   1a81a:	9c cf       	rjmp	.-200    	; 0x1a754 <analogWrite+0x78>
			#endif
			
			#if defined(TCCR4A) && defined(COM4B1)
			case TIMER4B:
				// connect pwm to pin on timer 4, channel B
				sbi(TCCR4A, COM4B1);
   1a81c:	80 91 a0 00 	lds	r24, 0x00A0	; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0>
   1a820:	80 62       	ori	r24, 0x20	; 32
   1a822:	80 93 a0 00 	sts	0x00A0, r24	; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0>
				OCR4B = val; // set pwm duty
   1a826:	d0 93 ab 00 	sts	0x00AB, r29	; 0x8000ab <__TEXT_REGION_LENGTH__+0x7c20ab>
   1a82a:	c0 93 aa 00 	sts	0x00AA, r28	; 0x8000aa <__TEXT_REGION_LENGTH__+0x7c20aa>
   1a82e:	92 cf       	rjmp	.-220    	; 0x1a754 <analogWrite+0x78>
			#endif

			#if defined(TCCR4A) && defined(COM4C1)
			case TIMER4C:
				// connect pwm to pin on timer 4, channel C
				sbi(TCCR4A, COM4C1);
   1a830:	80 91 a0 00 	lds	r24, 0x00A0	; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0>
   1a834:	88 60       	ori	r24, 0x08	; 8
   1a836:	80 93 a0 00 	sts	0x00A0, r24	; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0>
				OCR4C = val; // set pwm duty
   1a83a:	d0 93 ad 00 	sts	0x00AD, r29	; 0x8000ad <__TEXT_REGION_LENGTH__+0x7c20ad>
   1a83e:	c0 93 ac 00 	sts	0x00AC, r28	; 0x8000ac <__TEXT_REGION_LENGTH__+0x7c20ac>
   1a842:	88 cf       	rjmp	.-240    	; 0x1a754 <analogWrite+0x78>

							
			#if defined(TCCR5A) && defined(COM5A1)
			case TIMER5A:
				// connect pwm to pin on timer 5, channel A
				sbi(TCCR5A, COM5A1);
   1a844:	80 91 20 01 	lds	r24, 0x0120	; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120>
   1a848:	80 68       	ori	r24, 0x80	; 128
   1a84a:	80 93 20 01 	sts	0x0120, r24	; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120>
				OCR5A = val; // set pwm duty
   1a84e:	d0 93 29 01 	sts	0x0129, r29	; 0x800129 <__TEXT_REGION_LENGTH__+0x7c2129>
   1a852:	c0 93 28 01 	sts	0x0128, r28	; 0x800128 <__TEXT_REGION_LENGTH__+0x7c2128>
   1a856:	7e cf       	rjmp	.-260    	; 0x1a754 <analogWrite+0x78>
			#endif

			#if defined(TCCR5A) && defined(COM5B1)
			case TIMER5B:
				// connect pwm to pin on timer 5, channel B
				sbi(TCCR5A, COM5B1);
   1a858:	80 91 20 01 	lds	r24, 0x0120	; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120>
   1a85c:	80 62       	ori	r24, 0x20	; 32
   1a85e:	80 93 20 01 	sts	0x0120, r24	; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120>
				OCR5B = val; // set pwm duty
   1a862:	d0 93 2b 01 	sts	0x012B, r29	; 0x80012b <__TEXT_REGION_LENGTH__+0x7c212b>
   1a866:	c0 93 2a 01 	sts	0x012A, r28	; 0x80012a <__TEXT_REGION_LENGTH__+0x7c212a>
   1a86a:	74 cf       	rjmp	.-280    	; 0x1a754 <analogWrite+0x78>
			#endif

			#if defined(TCCR5A) && defined(COM5C1)
			case TIMER5C:
				// connect pwm to pin on timer 5, channel C
				sbi(TCCR5A, COM5C1);
   1a86c:	80 91 20 01 	lds	r24, 0x0120	; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120>
   1a870:	88 60       	ori	r24, 0x08	; 8
   1a872:	80 93 20 01 	sts	0x0120, r24	; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120>
				OCR5C = val; // set pwm duty
   1a876:	d0 93 2d 01 	sts	0x012D, r29	; 0x80012d <__TEXT_REGION_LENGTH__+0x7c212d>
   1a87a:	c0 93 2c 01 	sts	0x012C, r28	; 0x80012c <__TEXT_REGION_LENGTH__+0x7c212c>
   1a87e:	6a cf       	rjmp	.-300    	; 0x1a754 <analogWrite+0x78>
				break;
			#endif

			case NOT_ON_TIMER:
			default:
				if (val < 128) {
   1a880:	c0 38       	cpi	r28, 0x80	; 128
   1a882:	d1 05       	cpc	r29, r1
   1a884:	0c f0       	brlt	.+2      	; 0x1a888 <analogWrite+0x1ac>
   1a886:	3e cf       	rjmp	.-388    	; 0x1a704 <analogWrite+0x28>
   1a888:	33 cf       	rjmp	.-410    	; 0x1a6f0 <analogWrite+0x14>

0001a88a <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)>:
	}
}

/// Accelerate up to max.speed (defined by @min_delay_us)
/// does not update global positions
void accelerate_1_step(uint8_t axes, int16_t acc, uint16_t &delay_us, uint16_t min_delay_us){
   1a88a:	4f 92       	push	r4
   1a88c:	5f 92       	push	r5
   1a88e:	6f 92       	push	r6
   1a890:	7f 92       	push	r7
   1a892:	8f 92       	push	r8
   1a894:	9f 92       	push	r9
   1a896:	af 92       	push	r10
   1a898:	bf 92       	push	r11
   1a89a:	cf 92       	push	r12
   1a89c:	df 92       	push	r13
   1a89e:	ef 92       	push	r14
   1a8a0:	ff 92       	push	r15
   1a8a2:	0f 93       	push	r16
   1a8a4:	1f 93       	push	r17
   1a8a6:	cf 93       	push	r28
   1a8a8:	df 93       	push	r29
   1a8aa:	eb 01       	movw	r28, r22
   1a8ac:	6a 01       	movw	r12, r20
   1a8ae:	79 01       	movw	r14, r18
	sm4_do_step(axes);
   1a8b0:	0f 94 94 28 	call	0x25128	; 0x25128 <sm4_do_step(unsigned char)>
   1a8b4:	f6 01       	movw	r30, r12
   1a8b6:	00 81       	ld	r16, Z
   1a8b8:	11 81       	ldd	r17, Z+1	; 0x01

	/// keep max speed (avoid extra computation)
	if (acc > 0 && delay_us == min_delay_us){
   1a8ba:	1c 16       	cp	r1, r28
   1a8bc:	1d 06       	cpc	r1, r29
   1a8be:	b4 f4       	brge	.+44     	; 0x1a8ec <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)+0x62>
   1a8c0:	0e 15       	cp	r16, r14
   1a8c2:	1f 05       	cpc	r17, r15
   1a8c4:	99 f4       	brne	.+38     	; 0x1a8ec <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)+0x62>
		delayMicroseconds(delay_us);
   1a8c6:	c8 01       	movw	r24, r16

	//DBG(_n("%d "), t1);

	delayMicroseconds(t1);
	delay_us = t1;
}
   1a8c8:	df 91       	pop	r29
   1a8ca:	cf 91       	pop	r28
   1a8cc:	1f 91       	pop	r17
   1a8ce:	0f 91       	pop	r16
   1a8d0:	ff 90       	pop	r15
   1a8d2:	ef 90       	pop	r14
   1a8d4:	df 90       	pop	r13
   1a8d6:	cf 90       	pop	r12
   1a8d8:	bf 90       	pop	r11
   1a8da:	af 90       	pop	r10
   1a8dc:	9f 90       	pop	r9
   1a8de:	8f 90       	pop	r8
   1a8e0:	7f 90       	pop	r7
   1a8e2:	6f 90       	pop	r6
   1a8e4:	5f 90       	pop	r5
   1a8e6:	4f 90       	pop	r4
void accelerate_1_step(uint8_t axes, int16_t acc, uint16_t &delay_us, uint16_t min_delay_us){
	sm4_do_step(axes);

	/// keep max speed (avoid extra computation)
	if (acc > 0 && delay_us == min_delay_us){
		delayMicroseconds(delay_us);
   1a8e8:	0c 94 db d2 	jmp	0x1a5b6	; 0x1a5b6 <delayMicroseconds>
		return;
	}

	// v1 = v0 + a * t
	// 0.01 = length of a step
	const float t0 = delay_us * 0.000001f;
   1a8ec:	b8 01       	movw	r22, r16
   1a8ee:	90 e0       	ldi	r25, 0x00	; 0
   1a8f0:	80 e0       	ldi	r24, 0x00	; 0
   1a8f2:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   1a8f6:	2d eb       	ldi	r18, 0xBD	; 189
   1a8f8:	37 e3       	ldi	r19, 0x37	; 55
   1a8fa:	46 e8       	ldi	r20, 0x86	; 134
   1a8fc:	55 e3       	ldi	r21, 0x35	; 53
   1a8fe:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   1a902:	4b 01       	movw	r8, r22
   1a904:	5c 01       	movw	r10, r24
	const float v1 = (0.01f / t0 + acc * t0);
   1a906:	be 01       	movw	r22, r28
   1a908:	0d 2e       	mov	r0, r29
   1a90a:	00 0c       	add	r0, r0
   1a90c:	88 0b       	sbc	r24, r24
   1a90e:	99 0b       	sbc	r25, r25
   1a910:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   1a914:	a5 01       	movw	r20, r10
   1a916:	94 01       	movw	r18, r8
   1a918:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   1a91c:	2b 01       	movw	r4, r22
   1a91e:	3c 01       	movw	r6, r24
   1a920:	a5 01       	movw	r20, r10
   1a922:	94 01       	movw	r18, r8
   1a924:	6a e0       	ldi	r22, 0x0A	; 10
   1a926:	77 ed       	ldi	r23, 0xD7	; 215
   1a928:	83 e2       	ldi	r24, 0x23	; 35
   1a92a:	9c e3       	ldi	r25, 0x3C	; 60
   1a92c:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   1a930:	9b 01       	movw	r18, r22
   1a932:	ac 01       	movw	r20, r24
   1a934:	c3 01       	movw	r24, r6
   1a936:	b2 01       	movw	r22, r4
   1a938:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   1a93c:	4b 01       	movw	r8, r22
   1a93e:	5c 01       	movw	r10, r24
	uint16_t t1;
	if (v1 <= 0.16f){ ///< slowest speed convertible to uint16_t delay
   1a940:	2a e0       	ldi	r18, 0x0A	; 10
   1a942:	37 ed       	ldi	r19, 0xD7	; 215
   1a944:	43 e2       	ldi	r20, 0x23	; 35
   1a946:	5e e3       	ldi	r21, 0x3E	; 62
   1a948:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   1a94c:	18 16       	cp	r1, r24
   1a94e:	dc f5       	brge	.+118    	; 0x1a9c6 <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)+0x13c>
		t1 = MAX_DELAY; ///< already too slow so it wants to move back
	} else {
		/// don't exceed max.speed
		t1 = MAX(min_delay_us, round_to_u16(0.01f / v1 * 1000000.f));
   1a950:	a5 01       	movw	r20, r10
   1a952:	94 01       	movw	r18, r8
   1a954:	6a e0       	ldi	r22, 0x0A	; 10
   1a956:	77 ed       	ldi	r23, 0xD7	; 215
   1a958:	83 e2       	ldi	r24, 0x23	; 35
   1a95a:	9c e3       	ldi	r25, 0x3C	; 60
   1a95c:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   1a960:	20 e0       	ldi	r18, 0x00	; 0
   1a962:	34 e2       	ldi	r19, 0x24	; 36
   1a964:	44 e7       	ldi	r20, 0x74	; 116
   1a966:	59 e4       	ldi	r21, 0x49	; 73
   1a968:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
uint8_t round_to_u8(float f){
	return (uint8_t)(f + .5f);
}

uint16_t round_to_u16(float f){
	return (uint16_t)(f + .5f);
   1a96c:	20 e0       	ldi	r18, 0x00	; 0
   1a96e:	30 e0       	ldi	r19, 0x00	; 0
   1a970:	40 e0       	ldi	r20, 0x00	; 0
   1a972:	5f e3       	ldi	r21, 0x3F	; 63
   1a974:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   1a978:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   1a97c:	5b 01       	movw	r10, r22
   1a97e:	6e 15       	cp	r22, r14
   1a980:	7f 05       	cpc	r23, r15
   1a982:	08 f4       	brcc	.+2      	; 0x1a986 <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)+0xfc>
   1a984:	57 01       	movw	r10, r14
		/// don't exceed max.speed
		t1 = MAX(min_delay_us, round_to_u16(0.01f / v1 * 1000000.f));
	}

	/// make sure delay has changed a bit at least
	if (t1 == delay_us && acc != 0){
   1a986:	0a 15       	cp	r16, r10
   1a988:	1b 05       	cpc	r17, r11
   1a98a:	31 f4       	brne	.+12     	; 0x1a998 <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)+0x10e>
   1a98c:	20 97       	sbiw	r28, 0x00	; 0
   1a98e:	21 f0       	breq	.+8      	; 0x1a998 <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)+0x10e>
		if (acc > 0)
   1a990:	fc f0       	brlt	.+62     	; 0x1a9d0 <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)+0x146>
			t1--;
   1a992:	f1 e0       	ldi	r31, 0x01	; 1
   1a994:	af 1a       	sub	r10, r31
   1a996:	b1 08       	sbc	r11, r1
			t1++;
	}

	//DBG(_n("%d "), t1);

	delayMicroseconds(t1);
   1a998:	c5 01       	movw	r24, r10
   1a99a:	0e 94 db d2 	call	0x1a5b6	; 0x1a5b6 <delayMicroseconds>
	delay_us = t1;
   1a99e:	f6 01       	movw	r30, r12
   1a9a0:	b1 82       	std	Z+1, r11	; 0x01
   1a9a2:	a0 82       	st	Z, r10
}
   1a9a4:	df 91       	pop	r29
   1a9a6:	cf 91       	pop	r28
   1a9a8:	1f 91       	pop	r17
   1a9aa:	0f 91       	pop	r16
   1a9ac:	ff 90       	pop	r15
   1a9ae:	ef 90       	pop	r14
   1a9b0:	df 90       	pop	r13
   1a9b2:	cf 90       	pop	r12
   1a9b4:	bf 90       	pop	r11
   1a9b6:	af 90       	pop	r10
   1a9b8:	9f 90       	pop	r9
   1a9ba:	8f 90       	pop	r8
   1a9bc:	7f 90       	pop	r7
   1a9be:	6f 90       	pop	r6
   1a9c0:	5f 90       	pop	r5
   1a9c2:	4f 90       	pop	r4
   1a9c4:	08 95       	ret
	// 0.01 = length of a step
	const float t0 = delay_us * 0.000001f;
	const float v1 = (0.01f / t0 + acc * t0);
	uint16_t t1;
	if (v1 <= 0.16f){ ///< slowest speed convertible to uint16_t delay
		t1 = MAX_DELAY; ///< already too slow so it wants to move back
   1a9c6:	80 e1       	ldi	r24, 0x10	; 16
   1a9c8:	a8 2e       	mov	r10, r24
   1a9ca:	87 e2       	ldi	r24, 0x27	; 39
   1a9cc:	b8 2e       	mov	r11, r24
   1a9ce:	db cf       	rjmp	.-74     	; 0x1a986 <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)+0xfc>
	/// make sure delay has changed a bit at least
	if (t1 == delay_us && acc != 0){
		if (acc > 0)
			t1--;
		else
			t1++;
   1a9d0:	8f ef       	ldi	r24, 0xFF	; 255
   1a9d2:	a8 1a       	sub	r10, r24
   1a9d4:	b8 0a       	sbc	r11, r24
   1a9d6:	e0 cf       	rjmp	.-64     	; 0x1a998 <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)+0x10e>

0001a9d8 <go_and_stop_1_step(unsigned char, int, unsigned int&, unsigned int&)>:
/// keeps speed and then it decelerates to a complete stop (if possible)
/// it goes defined number of steps
/// returns after each step
/// \returns true if step was done
/// does not update global positions
bool go_and_stop_1_step(uint8_t axes, int16_t dec, uint16_t &delay_us, uint16_t &steps){
   1a9d8:	2f 92       	push	r2
   1a9da:	3f 92       	push	r3
   1a9dc:	4f 92       	push	r4
   1a9de:	5f 92       	push	r5
   1a9e0:	6f 92       	push	r6
   1a9e2:	7f 92       	push	r7
   1a9e4:	8f 92       	push	r8
   1a9e6:	9f 92       	push	r9
   1a9e8:	af 92       	push	r10
   1a9ea:	bf 92       	push	r11
   1a9ec:	cf 92       	push	r12
   1a9ee:	df 92       	push	r13
   1a9f0:	ef 92       	push	r14
   1a9f2:	ff 92       	push	r15
   1a9f4:	0f 93       	push	r16
   1a9f6:	1f 93       	push	r17
   1a9f8:	cf 93       	push	r28
   1a9fa:	df 93       	push	r29
   1a9fc:	00 d0       	rcall	.+0      	; 0x1a9fe <go_and_stop_1_step(unsigned char, int, unsigned int&, unsigned int&)+0x26>
   1a9fe:	cd b7       	in	r28, 0x3d	; 61
   1aa00:	de b7       	in	r29, 0x3e	; 62
	if (steps <= 0 || dec <= 0)
   1aa02:	f9 01       	movw	r30, r18
   1aa04:	e0 80       	ld	r14, Z
   1aa06:	f1 80       	ldd	r15, Z+1	; 0x01
   1aa08:	e1 14       	cp	r14, r1
   1aa0a:	f1 04       	cpc	r15, r1
   1aa0c:	09 f4       	brne	.+2      	; 0x1aa10 <go_and_stop_1_step(unsigned char, int, unsigned int&, unsigned int&)+0x38>
   1aa0e:	6c c0       	rjmp	.+216    	; 0x1aae8 <go_and_stop_1_step(unsigned char, int, unsigned int&, unsigned int&)+0x110>
   1aa10:	16 16       	cp	r1, r22
   1aa12:	17 06       	cpc	r1, r23
   1aa14:	0c f0       	brlt	.+2      	; 0x1aa18 <go_and_stop_1_step(unsigned char, int, unsigned int&, unsigned int&)+0x40>
   1aa16:	68 c0       	rjmp	.+208    	; 0x1aae8 <go_and_stop_1_step(unsigned char, int, unsigned int&, unsigned int&)+0x110>
   1aa18:	19 01       	movw	r2, r18
   1aa1a:	5b 83       	std	Y+3, r21	; 0x03
   1aa1c:	4a 83       	std	Y+2, r20	; 0x02
   1aa1e:	6b 01       	movw	r12, r22
   1aa20:	89 83       	std	Y+1, r24	; 0x01
		return false;

	/// deceleration distance in steps, s = 1/2 v^2 / a
	uint16_t s = round_to_u16(100 * 0.5f * SQR(0.01f) / (SQR((float)delay_us) * dec));
   1aa22:	fa 01       	movw	r30, r20
   1aa24:	00 81       	ld	r16, Z
   1aa26:	11 81       	ldd	r17, Z+1	; 0x01
   1aa28:	b8 01       	movw	r22, r16
   1aa2a:	90 e0       	ldi	r25, 0x00	; 0
   1aa2c:	80 e0       	ldi	r24, 0x00	; 0
   1aa2e:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   1aa32:	4b 01       	movw	r8, r22
   1aa34:	5c 01       	movw	r10, r24
   1aa36:	b6 01       	movw	r22, r12
   1aa38:	0d 2c       	mov	r0, r13
   1aa3a:	00 0c       	add	r0, r0
   1aa3c:	88 0b       	sbc	r24, r24
   1aa3e:	99 0b       	sbc	r25, r25
   1aa40:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   1aa44:	2b 01       	movw	r4, r22
   1aa46:	3c 01       	movw	r6, r24
   1aa48:	a5 01       	movw	r20, r10
   1aa4a:	94 01       	movw	r18, r8
   1aa4c:	c5 01       	movw	r24, r10
   1aa4e:	b4 01       	movw	r22, r8
   1aa50:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   1aa54:	9b 01       	movw	r18, r22
   1aa56:	ac 01       	movw	r20, r24
   1aa58:	c3 01       	movw	r24, r6
   1aa5a:	b2 01       	movw	r22, r4
   1aa5c:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   1aa60:	9b 01       	movw	r18, r22
   1aa62:	ac 01       	movw	r20, r24
   1aa64:	6a e0       	ldi	r22, 0x0A	; 10
   1aa66:	77 ed       	ldi	r23, 0xD7	; 215
   1aa68:	83 ea       	ldi	r24, 0xA3	; 163
   1aa6a:	9b e3       	ldi	r25, 0x3B	; 59
   1aa6c:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
uint8_t round_to_u8(float f){
	return (uint8_t)(f + .5f);
}

uint16_t round_to_u16(float f){
	return (uint16_t)(f + .5f);
   1aa70:	20 e0       	ldi	r18, 0x00	; 0
   1aa72:	30 e0       	ldi	r19, 0x00	; 0
   1aa74:	40 e0       	ldi	r20, 0x00	; 0
   1aa76:	5f e3       	ldi	r21, 0x3F	; 63
   1aa78:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   1aa7c:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
	if (steps <= 0 || dec <= 0)
		return false;

	/// deceleration distance in steps, s = 1/2 v^2 / a
	uint16_t s = round_to_u16(100 * 0.5f * SQR(0.01f) / (SQR((float)delay_us) * dec));
	if (steps > s){
   1aa80:	6e 15       	cp	r22, r14
   1aa82:	7f 05       	cpc	r23, r15
   1aa84:	30 f5       	brcc	.+76     	; 0x1aad2 <go_and_stop_1_step(unsigned char, int, unsigned int&, unsigned int&)+0xfa>
		/// go steady
		sm4_do_step(axes);
   1aa86:	89 81       	ldd	r24, Y+1	; 0x01
   1aa88:	0f 94 94 28 	call	0x25128	; 0x25128 <sm4_do_step(unsigned char)>
		delayMicroseconds(delay_us);
   1aa8c:	ea 81       	ldd	r30, Y+2	; 0x02
   1aa8e:	fb 81       	ldd	r31, Y+3	; 0x03
   1aa90:	80 81       	ld	r24, Z
   1aa92:	91 81       	ldd	r25, Z+1	; 0x01
   1aa94:	0e 94 db d2 	call	0x1a5b6	; 0x1a5b6 <delayMicroseconds>
	} else {
		/// decelerate
		accelerate_1_step(axes, -dec, delay_us, delay_us);
	}
	--steps;
   1aa98:	f1 01       	movw	r30, r2
   1aa9a:	80 81       	ld	r24, Z
   1aa9c:	91 81       	ldd	r25, Z+1	; 0x01
   1aa9e:	01 97       	sbiw	r24, 0x01	; 1
   1aaa0:	91 83       	std	Z+1, r25	; 0x01
   1aaa2:	80 83       	st	Z, r24
	return true;
   1aaa4:	81 e0       	ldi	r24, 0x01	; 1
}
   1aaa6:	0f 90       	pop	r0
   1aaa8:	0f 90       	pop	r0
   1aaaa:	0f 90       	pop	r0
   1aaac:	df 91       	pop	r29
   1aaae:	cf 91       	pop	r28
   1aab0:	1f 91       	pop	r17
   1aab2:	0f 91       	pop	r16
   1aab4:	ff 90       	pop	r15
   1aab6:	ef 90       	pop	r14
   1aab8:	df 90       	pop	r13
   1aaba:	cf 90       	pop	r12
   1aabc:	bf 90       	pop	r11
   1aabe:	af 90       	pop	r10
   1aac0:	9f 90       	pop	r9
   1aac2:	8f 90       	pop	r8
   1aac4:	7f 90       	pop	r7
   1aac6:	6f 90       	pop	r6
   1aac8:	5f 90       	pop	r5
   1aaca:	4f 90       	pop	r4
   1aacc:	3f 90       	pop	r3
   1aace:	2f 90       	pop	r2
   1aad0:	08 95       	ret
		/// go steady
		sm4_do_step(axes);
		delayMicroseconds(delay_us);
	} else {
		/// decelerate
		accelerate_1_step(axes, -dec, delay_us, delay_us);
   1aad2:	66 27       	eor	r22, r22
   1aad4:	77 27       	eor	r23, r23
   1aad6:	6c 19       	sub	r22, r12
   1aad8:	7d 09       	sbc	r23, r13
   1aada:	98 01       	movw	r18, r16
   1aadc:	4a 81       	ldd	r20, Y+2	; 0x02
   1aade:	5b 81       	ldd	r21, Y+3	; 0x03
   1aae0:	89 81       	ldd	r24, Y+1	; 0x01
   1aae2:	0e 94 45 d4 	call	0x1a88a	; 0x1a88a <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)>
   1aae6:	d8 cf       	rjmp	.-80     	; 0x1aa98 <go_and_stop_1_step(unsigned char, int, unsigned int&, unsigned int&)+0xc0>
/// returns after each step
/// \returns true if step was done
/// does not update global positions
bool go_and_stop_1_step(uint8_t axes, int16_t dec, uint16_t &delay_us, uint16_t &steps){
	if (steps <= 0 || dec <= 0)
		return false;
   1aae8:	80 e0       	ldi	r24, 0x00	; 0
   1aaea:	dd cf       	rjmp	.-70     	; 0x1aaa6 <go_and_stop_1_step(unsigned char, int, unsigned int&, unsigned int&)+0xce>

0001aaec <set_axes_dir(unsigned char, unsigned char) [clone .lto_priv.380]>:
			count_position[i] += dir & mask ? -1L : 1L;
		}
	}
}

static void __attribute__((noinline)) set_axes_dir(const uint8_t axis, const uint8_t dir) {
   1aaec:	0f 93       	push	r16
   1aaee:	1f 93       	push	r17
   1aaf0:	cf 93       	push	r28
   1aaf2:	df 93       	push	r29
   1aaf4:	18 2f       	mov	r17, r24
   1aaf6:	06 2f       	mov	r16, r22
	for (uint8_t i = X_AXIS, mask = X_AXIS_MASK; i <= Z_AXIS; i++, mask <<= 1) {
   1aaf8:	d1 e0       	ldi	r29, 0x01	; 1
   1aafa:	c0 e0       	ldi	r28, 0x00	; 0
		if (axis & mask) {
   1aafc:	81 2f       	mov	r24, r17
   1aafe:	8d 23       	and	r24, r29
   1ab00:	29 f0       	breq	.+10     	; 0x1ab0c <set_axes_dir(unsigned char, unsigned char) [clone .lto_priv.380]+0x20>
			sm4_set_dir(i, dir & mask);
   1ab02:	60 2f       	mov	r22, r16
   1ab04:	6d 23       	and	r22, r29
   1ab06:	8c 2f       	mov	r24, r28
   1ab08:	0f 94 9c 28 	call	0x25138	; 0x25138 <sm4_set_dir(unsigned char, unsigned char)>
		}
	}
}

static void __attribute__((noinline)) set_axes_dir(const uint8_t axis, const uint8_t dir) {
	for (uint8_t i = X_AXIS, mask = X_AXIS_MASK; i <= Z_AXIS; i++, mask <<= 1) {
   1ab0c:	cf 5f       	subi	r28, 0xFF	; 255
   1ab0e:	dd 0f       	add	r29, r29
   1ab10:	c3 30       	cpi	r28, 0x03	; 3
   1ab12:	a1 f7       	brne	.-24     	; 0x1aafc <set_axes_dir(unsigned char, unsigned char) [clone .lto_priv.380]+0x10>
		if (axis & mask) {
			sm4_set_dir(i, dir & mask);
		}
	}
}
   1ab14:	df 91       	pop	r29
   1ab16:	cf 91       	pop	r28
   1ab18:	1f 91       	pop	r17
   1ab1a:	0f 91       	pop	r16
   1ab1c:	08 95       	ret

0001ab1e <update_position_1_step(unsigned char, unsigned char) [clone .lto_priv.379]>:
        //@size=114
		DBG(_n("min, trigger, untrigger, max: [%d %d %d %d]\n"), _Z, trigger, untrigger, z);
	}
}

static void update_position_1_step(const uint8_t axis, const uint8_t dir) {
   1ab1e:	8f 92       	push	r8
   1ab20:	9f 92       	push	r9
   1ab22:	af 92       	push	r10
   1ab24:	bf 92       	push	r11
   1ab26:	cf 92       	push	r12
   1ab28:	df 92       	push	r13
   1ab2a:	ef 92       	push	r14
   1ab2c:	ff 92       	push	r15
   1ab2e:	30 e0       	ldi	r19, 0x00	; 0
   1ab30:	20 e0       	ldi	r18, 0x00	; 0
	for (uint8_t i = X_AXIS, mask = X_AXIS_MASK; i <= Z_AXIS; i++, mask <<= 1) {
   1ab32:	91 e0       	ldi	r25, 0x01	; 1
		if (axis & mask) {
   1ab34:	48 2f       	mov	r20, r24
   1ab36:	49 23       	and	r20, r25
   1ab38:	19 f1       	breq	.+70     	; 0x1ab80 <update_position_1_step(unsigned char, unsigned char) [clone .lto_priv.379]+0x62>
			count_position[i] += dir & mask ? -1L : 1L;
   1ab3a:	a9 01       	movw	r20, r18
   1ab3c:	44 0f       	add	r20, r20
   1ab3e:	55 1f       	adc	r21, r21
   1ab40:	44 0f       	add	r20, r20
   1ab42:	55 1f       	adc	r21, r21
   1ab44:	fa 01       	movw	r30, r20
   1ab46:	e4 5b       	subi	r30, 0xB4	; 180
   1ab48:	f9 4f       	sbci	r31, 0xF9	; 249
   1ab4a:	c0 80       	ld	r12, Z
   1ab4c:	d1 80       	ldd	r13, Z+1	; 0x01
   1ab4e:	e2 80       	ldd	r14, Z+2	; 0x02
   1ab50:	f3 80       	ldd	r15, Z+3	; 0x03
   1ab52:	76 2f       	mov	r23, r22
   1ab54:	79 23       	and	r23, r25
   1ab56:	81 2c       	mov	r8, r1
   1ab58:	91 2c       	mov	r9, r1
   1ab5a:	54 01       	movw	r10, r8
   1ab5c:	83 94       	inc	r8
   1ab5e:	77 23       	and	r23, r23
   1ab60:	21 f0       	breq	.+8      	; 0x1ab6a <update_position_1_step(unsigned char, unsigned char) [clone .lto_priv.379]+0x4c>
   1ab62:	88 24       	eor	r8, r8
   1ab64:	8a 94       	dec	r8
   1ab66:	98 2c       	mov	r9, r8
   1ab68:	54 01       	movw	r10, r8
   1ab6a:	c8 0c       	add	r12, r8
   1ab6c:	d9 1c       	adc	r13, r9
   1ab6e:	ea 1c       	adc	r14, r10
   1ab70:	fb 1c       	adc	r15, r11
   1ab72:	44 5b       	subi	r20, 0xB4	; 180
   1ab74:	59 4f       	sbci	r21, 0xF9	; 249
   1ab76:	fa 01       	movw	r30, r20
   1ab78:	c0 82       	st	Z, r12
   1ab7a:	d1 82       	std	Z+1, r13	; 0x01
   1ab7c:	e2 82       	std	Z+2, r14	; 0x02
   1ab7e:	f3 82       	std	Z+3, r15	; 0x03
		DBG(_n("min, trigger, untrigger, max: [%d %d %d %d]\n"), _Z, trigger, untrigger, z);
	}
}

static void update_position_1_step(const uint8_t axis, const uint8_t dir) {
	for (uint8_t i = X_AXIS, mask = X_AXIS_MASK; i <= Z_AXIS; i++, mask <<= 1) {
   1ab80:	99 0f       	add	r25, r25
   1ab82:	2f 5f       	subi	r18, 0xFF	; 255
   1ab84:	3f 4f       	sbci	r19, 0xFF	; 255
   1ab86:	23 30       	cpi	r18, 0x03	; 3
   1ab88:	31 05       	cpc	r19, r1
   1ab8a:	a1 f6       	brne	.-88     	; 0x1ab34 <update_position_1_step(unsigned char, unsigned char) [clone .lto_priv.379]+0x16>
		if (axis & mask) {
			count_position[i] += dir & mask ? -1L : 1L;
		}
	}
}
   1ab8c:	ff 90       	pop	r15
   1ab8e:	ef 90       	pop	r14
   1ab90:	df 90       	pop	r13
   1ab92:	cf 90       	pop	r12
   1ab94:	bf 90       	pop	r11
   1ab96:	af 90       	pop	r10
   1ab98:	9f 90       	pop	r9
   1ab9a:	8f 90       	pop	r8
   1ab9c:	08 95       	ret

0001ab9e <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)>:
/// Moves printer to absolute position [x,y,z] defined in integer position system
/// check_pinda == 0: ordinary move
/// check_pinda == 1: stop when PINDA triggered
/// check_pinda == -1: stop when PINDA untriggered
bool xyzcal_lineXYZ_to(int16_t x, int16_t y, int16_t z, uint16_t delay_us, int8_t check_pinda)
{
   1ab9e:	2f 92       	push	r2
   1aba0:	3f 92       	push	r3
   1aba2:	4f 92       	push	r4
   1aba4:	5f 92       	push	r5
   1aba6:	6f 92       	push	r6
   1aba8:	7f 92       	push	r7
   1abaa:	8f 92       	push	r8
   1abac:	9f 92       	push	r9
   1abae:	af 92       	push	r10
   1abb0:	bf 92       	push	r11
   1abb2:	cf 92       	push	r12
   1abb4:	df 92       	push	r13
   1abb6:	ef 92       	push	r14
   1abb8:	ff 92       	push	r15
   1abba:	0f 93       	push	r16
   1abbc:	1f 93       	push	r17
   1abbe:	cf 93       	push	r28
   1abc0:	df 93       	push	r29
   1abc2:	00 d0       	rcall	.+0      	; 0x1abc4 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x26>
   1abc4:	00 d0       	rcall	.+0      	; 0x1abc6 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x28>
   1abc6:	cd b7       	in	r28, 0x3d	; 61
   1abc8:	de b7       	in	r29, 0x3e	; 62
//	DBG(_n("xyzcal_lineXYZ_to x=%d y=%d z=%d  check=%d\n"), x, y, z, check_pinda);
	x -= (int16_t)count_position[0];
   1abca:	c0 90 4c 06 	lds	r12, 0x064C	; 0x80064c <count_position>
   1abce:	d0 90 4d 06 	lds	r13, 0x064D	; 0x80064d <count_position+0x1>
   1abd2:	e0 90 4e 06 	lds	r14, 0x064E	; 0x80064e <count_position+0x2>
   1abd6:	f0 90 4f 06 	lds	r15, 0x064F	; 0x80064f <count_position+0x3>
   1abda:	7c 01       	movw	r14, r24
   1abdc:	ec 18       	sub	r14, r12
   1abde:	fd 08       	sbc	r15, r13
	y -= (int16_t)count_position[1];
   1abe0:	80 91 50 06 	lds	r24, 0x0650	; 0x800650 <count_position+0x4>
   1abe4:	90 91 51 06 	lds	r25, 0x0651	; 0x800651 <count_position+0x5>
   1abe8:	a0 91 52 06 	lds	r26, 0x0652	; 0x800652 <count_position+0x6>
   1abec:	b0 91 53 06 	lds	r27, 0x0653	; 0x800653 <count_position+0x7>
   1abf0:	68 1b       	sub	r22, r24
   1abf2:	79 0b       	sbc	r23, r25
	z -= (int16_t)count_position[2];
   1abf4:	80 91 54 06 	lds	r24, 0x0654	; 0x800654 <count_position+0x8>
   1abf8:	90 91 55 06 	lds	r25, 0x0655	; 0x800655 <count_position+0x9>
   1abfc:	a0 91 56 06 	lds	r26, 0x0656	; 0x800656 <count_position+0xa>
   1ac00:	b0 91 57 06 	lds	r27, 0x0657	; 0x800657 <count_position+0xb>
   1ac04:	fa 01       	movw	r30, r20
   1ac06:	e8 1b       	sub	r30, r24
   1ac08:	f9 0b       	sbc	r31, r25
   1ac0a:	fa 83       	std	Y+2, r31	; 0x02
   1ac0c:	e9 83       	std	Y+1, r30	; 0x01
	xyzcal_dm = ((x<0)?1:0) | ((y<0)?2:0) | ((z<0)?4:0);
   1ac0e:	fb 01       	movw	r30, r22
   1ac10:	ff 0f       	add	r31, r31
   1ac12:	ee 0b       	sbc	r30, r30
   1ac14:	ff 0f       	add	r31, r31
   1ac16:	fe 2f       	mov	r31, r30
   1ac18:	ee 1f       	adc	r30, r30
   1ac1a:	e2 70       	andi	r30, 0x02	; 2
   1ac1c:	89 81       	ldd	r24, Y+1	; 0x01
   1ac1e:	9a 81       	ldd	r25, Y+2	; 0x02
   1ac20:	88 e0       	ldi	r24, 0x08	; 8
   1ac22:	98 02       	muls	r25, r24
   1ac24:	81 2d       	mov	r24, r1
   1ac26:	99 0b       	sbc	r25, r25
   1ac28:	11 24       	eor	r1, r1
   1ac2a:	84 70       	andi	r24, 0x04	; 4
   1ac2c:	e8 2b       	or	r30, r24
   1ac2e:	8f 2d       	mov	r24, r15
   1ac30:	88 1f       	adc	r24, r24
   1ac32:	88 27       	eor	r24, r24
   1ac34:	88 1f       	adc	r24, r24
   1ac36:	e8 2b       	or	r30, r24
   1ac38:	e0 93 f1 03 	sts	0x03F1, r30	; 0x8003f1 <xyzcal_dm>
	asm("nop");
}

void sm4_set_dir_bits(uint8_t dir_bits)
{
	uint8_t portL = PORTL;
   1ac3c:	90 91 0b 01 	lds	r25, 0x010B	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
	portL &= 0xb8; //set direction bits to zero
   1ac40:	98 7b       	andi	r25, 0xB8	; 184
	//TODO -optimize in asm
#if ((MOTHERBOARD == BOARD_RAMBO_MINI_1_0) || (MOTHERBOARD == BOARD_RAMBO_MINI_1_3))
	dir_bits ^= dir_mask;
   1ac42:	87 e0       	ldi	r24, 0x07	; 7
   1ac44:	e8 27       	eor	r30, r24
	if (dir_bits & 1) portL |= 2;  //set X direction bit
   1ac46:	e0 fd       	sbrc	r30, 0
   1ac48:	92 60       	ori	r25, 0x02	; 2
	if (dir_bits & 2) portL |= 1;  //set Y direction bit
   1ac4a:	e1 fd       	sbrc	r30, 1
   1ac4c:	91 60       	ori	r25, 0x01	; 1
	if (dir_bits & 4) portL |= 4;  //set Z direction bit
   1ac4e:	e4 70       	andi	r30, 0x04	; 4
   1ac50:	09 f0       	breq	.+2      	; 0x1ac54 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0xb6>
   1ac52:	94 60       	ori	r25, 0x04	; 4
	if (dir_bits & 1) portL |= 1;  //set X direction bit
	if (dir_bits & 2) portL |= 2;  //set Y direction bit
	if (dir_bits & 4) portL |= 4;  //set Z direction bit
	if (dir_bits & 8) portL |= 64; //set E direction bit
#endif
	PORTL = portL;
   1ac54:	90 93 0b 01 	sts	0x010B, r25	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
	asm("nop");
   1ac58:	00 00       	nop
	sm4_set_dir_bits(xyzcal_dm);
	sm4_stop_cb = check_pinda?((check_pinda<0)?check_pinda_0:check_pinda_1):0;
   1ac5a:	83 e5       	ldi	r24, 0x53	; 83
   1ac5c:	9d eb       	ldi	r25, 0xBD	; 189
   1ac5e:	01 11       	cpse	r16, r1
   1ac60:	02 c0       	rjmp	.+4      	; 0x1ac66 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0xc8>
   1ac62:	90 e0       	ldi	r25, 0x00	; 0
   1ac64:	80 e0       	ldi	r24, 0x00	; 0
   1ac66:	90 93 25 06 	sts	0x0625, r25	; 0x800625 <sm4_stop_cb+0x1>
   1ac6a:	80 93 24 06 	sts	0x0624, r24	; 0x800624 <sm4_stop_cb>
	xyzcal_sm4_delay = delay_us;
   1ac6e:	30 93 f0 03 	sts	0x03F0, r19	; 0x8003f0 <xyzcal_sm4_delay+0x1>
   1ac72:	20 93 ef 03 	sts	0x03EF, r18	; 0x8003ef <xyzcal_sm4_delay>
	//	uint32_t u = _micros();
	bool ret = sm4_line_xyz_ui(abs(x), abs(y), abs(z)) ? true : false;
   1ac76:	29 81       	ldd	r18, Y+1	; 0x01
   1ac78:	3a 81       	ldd	r19, Y+2	; 0x02
   1ac7a:	3e 83       	std	Y+6, r19	; 0x06
   1ac7c:	2d 83       	std	Y+5, r18	; 0x05
   1ac7e:	37 ff       	sbrs	r19, 7
   1ac80:	05 c0       	rjmp	.+10     	; 0x1ac8c <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0xee>
   1ac82:	31 95       	neg	r19
   1ac84:	21 95       	neg	r18
   1ac86:	31 09       	sbc	r19, r1
   1ac88:	3e 83       	std	Y+6, r19	; 0x06
   1ac8a:	2d 83       	std	Y+5, r18	; 0x05
   1ac8c:	8b 01       	movw	r16, r22
   1ac8e:	77 ff       	sbrs	r23, 7
   1ac90:	03 c0       	rjmp	.+6      	; 0x1ac98 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0xfa>
   1ac92:	11 95       	neg	r17
   1ac94:	01 95       	neg	r16
   1ac96:	11 09       	sbc	r17, r1
   1ac98:	f7 fe       	sbrs	r15, 7
   1ac9a:	03 c0       	rjmp	.+6      	; 0x1aca2 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x104>
   1ac9c:	f1 94       	neg	r15
   1ac9e:	e1 94       	neg	r14
   1aca0:	f1 08       	sbc	r15, r1
#endif
#endif //((MOTHERBOARD == BOARD_RAMBO_MINI_1_0) || (MOTHERBOARD == BOARD_RAMBO_MINI_1_3) || (MOTHERBOARD == BOARD_EINSY_1_0a))
}

uint16_t sm4_line_xyz_ui(uint16_t dx, uint16_t dy, uint16_t dz){
	uint16_t dd = (uint16_t)(sqrt((float)(((uint32_t)dx)*dx + ((uint32_t)dy*dy) + ((uint32_t)dz*dz))) + 0.5);
   1aca2:	98 01       	movw	r18, r16
   1aca4:	d8 01       	movw	r26, r16
   1aca6:	0f 94 f8 a4 	call	0x349f0	; 0x349f0 <__mulhisi3>
   1acaa:	4b 01       	movw	r8, r22
   1acac:	5c 01       	movw	r10, r24
   1acae:	2d 81       	ldd	r18, Y+5	; 0x05
   1acb0:	3e 81       	ldd	r19, Y+6	; 0x06
   1acb2:	d9 01       	movw	r26, r18
   1acb4:	0f 94 f8 a4 	call	0x349f0	; 0x349f0 <__mulhisi3>
   1acb8:	86 0e       	add	r8, r22
   1acba:	97 1e       	adc	r9, r23
   1acbc:	a8 1e       	adc	r10, r24
   1acbe:	b9 1e       	adc	r11, r25
   1acc0:	97 01       	movw	r18, r14
   1acc2:	d7 01       	movw	r26, r14
   1acc4:	0f 94 f8 a4 	call	0x349f0	; 0x349f0 <__mulhisi3>
   1acc8:	68 0d       	add	r22, r8
   1acca:	79 1d       	adc	r23, r9
   1accc:	8a 1d       	adc	r24, r10
   1acce:	9b 1d       	adc	r25, r11
   1acd0:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   1acd4:	0f 94 d6 a8 	call	0x351ac	; 0x351ac <sqrt>
   1acd8:	20 e0       	ldi	r18, 0x00	; 0
   1acda:	30 e0       	ldi	r19, 0x00	; 0
   1acdc:	40 e0       	ldi	r20, 0x00	; 0
   1acde:	5f e3       	ldi	r21, 0x3F	; 63
   1ace0:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   1ace4:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   1ace8:	2b 01       	movw	r4, r22
	uint16_t nd = dd;
	uint16_t cx = dd;
	uint16_t cy = dd;
	uint16_t cz = dd;
   1acea:	4b 01       	movw	r8, r22

uint16_t sm4_line_xyz_ui(uint16_t dx, uint16_t dy, uint16_t dz){
	uint16_t dd = (uint16_t)(sqrt((float)(((uint32_t)dx)*dx + ((uint32_t)dy*dy) + ((uint32_t)dz*dz))) + 0.5);
	uint16_t nd = dd;
	uint16_t cx = dd;
	uint16_t cy = dd;
   1acec:	5b 01       	movw	r10, r22
}

uint16_t sm4_line_xyz_ui(uint16_t dx, uint16_t dy, uint16_t dz){
	uint16_t dd = (uint16_t)(sqrt((float)(((uint32_t)dx)*dx + ((uint32_t)dy*dy) + ((uint32_t)dz*dz))) + 0.5);
	uint16_t nd = dd;
	uint16_t cx = dd;
   1acee:	6b 01       	movw	r12, r22
#endif //((MOTHERBOARD == BOARD_RAMBO_MINI_1_0) || (MOTHERBOARD == BOARD_RAMBO_MINI_1_3) || (MOTHERBOARD == BOARD_EINSY_1_0a))
}

uint16_t sm4_line_xyz_ui(uint16_t dx, uint16_t dy, uint16_t dz){
	uint16_t dd = (uint16_t)(sqrt((float)(((uint32_t)dx)*dx + ((uint32_t)dy*dy) + ((uint32_t)dz*dz))) + 0.5);
	uint16_t nd = dd;
   1acf0:	3b 01       	movw	r6, r22
	uint16_t cx = dd;
	uint16_t cy = dd;
	uint16_t cz = dd;
	uint16_t x = 0;
	uint16_t y = 0;
	uint16_t z = 0;
   1acf2:	1c 82       	std	Y+4, r1	; 0x04
   1acf4:	1b 82       	std	Y+3, r1	; 0x03
	uint16_t nd = dd;
	uint16_t cx = dd;
	uint16_t cy = dd;
	uint16_t cz = dd;
	uint16_t x = 0;
	uint16_t y = 0;
   1acf6:	31 2c       	mov	r3, r1
   1acf8:	21 2c       	mov	r2, r1
	uint16_t dd = (uint16_t)(sqrt((float)(((uint32_t)dx)*dx + ((uint32_t)dy*dy) + ((uint32_t)dz*dz))) + 0.5);
	uint16_t nd = dd;
	uint16_t cx = dd;
	uint16_t cy = dd;
	uint16_t cz = dd;
	uint16_t x = 0;
   1acfa:	1a 82       	std	Y+2, r1	; 0x02
   1acfc:	19 82       	std	Y+1, r1	; 0x01
	uint16_t y = 0;
	uint16_t z = 0;
	while (nd){
   1acfe:	61 14       	cp	r6, r1
   1ad00:	71 04       	cpc	r7, r1
   1ad02:	09 f4       	brne	.+2      	; 0x1ad06 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x168>
   1ad04:	48 c0       	rjmp	.+144    	; 0x1ad96 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x1f8>
		if (sm4_stop_cb && (*sm4_stop_cb)()) break;
   1ad06:	e0 91 24 06 	lds	r30, 0x0624	; 0x800624 <sm4_stop_cb>
   1ad0a:	f0 91 25 06 	lds	r31, 0x0625	; 0x800625 <sm4_stop_cb+0x1>
   1ad0e:	30 97       	sbiw	r30, 0x00	; 0
   1ad10:	f1 f5       	brne	.+124    	; 0x1ad8e <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x1f0>
		uint8_t sm = 0; //step mask
   1ad12:	80 e0       	ldi	r24, 0x00	; 0
		if (cx <= dx){
   1ad14:	ec 14       	cp	r14, r12
   1ad16:	fd 04       	cpc	r15, r13
   1ad18:	40 f0       	brcs	.+16     	; 0x1ad2a <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x18c>
			sm |= 1;
			cx += dd;
   1ad1a:	c4 0c       	add	r12, r4
   1ad1c:	d5 1c       	adc	r13, r5
			x++;
   1ad1e:	89 81       	ldd	r24, Y+1	; 0x01
   1ad20:	9a 81       	ldd	r25, Y+2	; 0x02
   1ad22:	01 96       	adiw	r24, 0x01	; 1
   1ad24:	9a 83       	std	Y+2, r25	; 0x02
   1ad26:	89 83       	std	Y+1, r24	; 0x01
	uint16_t z = 0;
	while (nd){
		if (sm4_stop_cb && (*sm4_stop_cb)()) break;
		uint8_t sm = 0; //step mask
		if (cx <= dx){
			sm |= 1;
   1ad28:	81 e0       	ldi	r24, 0x01	; 1
			cx += dd;
			x++;
		}
		if (cy <= dy){
   1ad2a:	0a 15       	cp	r16, r10
   1ad2c:	1b 05       	cpc	r17, r11
   1ad2e:	30 f0       	brcs	.+12     	; 0x1ad3c <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x19e>
			sm |= 2;
   1ad30:	82 60       	ori	r24, 0x02	; 2
			cy += dd;
   1ad32:	a4 0c       	add	r10, r4
   1ad34:	b5 1c       	adc	r11, r5
			y++;
   1ad36:	9f ef       	ldi	r25, 0xFF	; 255
   1ad38:	29 1a       	sub	r2, r25
   1ad3a:	39 0a       	sbc	r3, r25
		}
		if (cz <= dz){
   1ad3c:	ed 81       	ldd	r30, Y+5	; 0x05
   1ad3e:	fe 81       	ldd	r31, Y+6	; 0x06
   1ad40:	e8 15       	cp	r30, r8
   1ad42:	f9 05       	cpc	r31, r9
   1ad44:	48 f0       	brcs	.+18     	; 0x1ad58 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x1ba>
			sm |= 4;
   1ad46:	84 60       	ori	r24, 0x04	; 4
			cz += dd;
   1ad48:	84 0c       	add	r8, r4
   1ad4a:	95 1c       	adc	r9, r5
			z++;
   1ad4c:	2b 81       	ldd	r18, Y+3	; 0x03
   1ad4e:	3c 81       	ldd	r19, Y+4	; 0x04
   1ad50:	2f 5f       	subi	r18, 0xFF	; 255
   1ad52:	3f 4f       	sbci	r19, 0xFF	; 255
   1ad54:	3c 83       	std	Y+4, r19	; 0x04
   1ad56:	2b 83       	std	Y+3, r18	; 0x03
		}
		cx -= dx;
   1ad58:	ce 18       	sub	r12, r14
   1ad5a:	df 08       	sbc	r13, r15
		cy -= dy;
   1ad5c:	a0 1a       	sub	r10, r16
   1ad5e:	b1 0a       	sbc	r11, r17
		cz -= dz;
   1ad60:	ed 81       	ldd	r30, Y+5	; 0x05
   1ad62:	fe 81       	ldd	r31, Y+6	; 0x06
   1ad64:	8e 1a       	sub	r8, r30
   1ad66:	9f 0a       	sbc	r9, r31
		sm4_do_step(sm);
   1ad68:	0f 94 94 28 	call	0x25128	; 0x25128 <sm4_do_step(unsigned char)>
		uint16_t delay = SM4_DEFDELAY;
		if (sm4_calc_delay_cb) delay = (*sm4_calc_delay_cb)(nd, dd);
   1ad6c:	e0 91 20 06 	lds	r30, 0x0620	; 0x800620 <sm4_calc_delay_cb>
   1ad70:	f0 91 21 06 	lds	r31, 0x0621	; 0x800621 <sm4_calc_delay_cb+0x1>
   1ad74:	30 97       	sbiw	r30, 0x00	; 0
   1ad76:	d1 f1       	breq	.+116    	; 0x1adec <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x24e>
   1ad78:	b2 01       	movw	r22, r4
   1ad7a:	c3 01       	movw	r24, r6
   1ad7c:	19 95       	eicall
		if (delay) delayMicroseconds(delay);
   1ad7e:	00 97       	sbiw	r24, 0x00	; 0
   1ad80:	11 f0       	breq	.+4      	; 0x1ad86 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x1e8>
   1ad82:	0e 94 db d2 	call	0x1a5b6	; 0x1a5b6 <delayMicroseconds>
		nd--;
   1ad86:	f1 e0       	ldi	r31, 0x01	; 1
   1ad88:	6f 1a       	sub	r6, r31
   1ad8a:	71 08       	sbc	r7, r1
   1ad8c:	b8 cf       	rjmp	.-144    	; 0x1acfe <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x160>
	uint16_t cz = dd;
	uint16_t x = 0;
	uint16_t y = 0;
	uint16_t z = 0;
	while (nd){
		if (sm4_stop_cb && (*sm4_stop_cb)()) break;
   1ad8e:	19 95       	eicall
   1ad90:	88 23       	and	r24, r24
   1ad92:	09 f4       	brne	.+2      	; 0x1ad96 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x1f8>
   1ad94:	be cf       	rjmp	.-132    	; 0x1ad12 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x174>
		uint16_t delay = SM4_DEFDELAY;
		if (sm4_calc_delay_cb) delay = (*sm4_calc_delay_cb)(nd, dd);
		if (delay) delayMicroseconds(delay);
		nd--;
	}
	if (sm4_update_pos_cb)
   1ad96:	e0 91 22 06 	lds	r30, 0x0622	; 0x800622 <sm4_update_pos_cb>
   1ad9a:	f0 91 23 06 	lds	r31, 0x0623	; 0x800623 <sm4_update_pos_cb+0x1>
   1ad9e:	30 97       	sbiw	r30, 0x00	; 0
   1ada0:	41 f0       	breq	.+16     	; 0x1adb2 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x214>
		(*sm4_update_pos_cb)(x, y, z, 0);
   1ada2:	30 e0       	ldi	r19, 0x00	; 0
   1ada4:	20 e0       	ldi	r18, 0x00	; 0
   1ada6:	4b 81       	ldd	r20, Y+3	; 0x03
   1ada8:	5c 81       	ldd	r21, Y+4	; 0x04
   1adaa:	b1 01       	movw	r22, r2
   1adac:	89 81       	ldd	r24, Y+1	; 0x01
   1adae:	9a 81       	ldd	r25, Y+2	; 0x02
   1adb0:	19 95       	eicall
   1adb2:	81 e0       	ldi	r24, 0x01	; 1
   1adb4:	67 28       	or	r6, r7
   1adb6:	09 f4       	brne	.+2      	; 0x1adba <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x21c>
   1adb8:	80 e0       	ldi	r24, 0x00	; 0
	//	u = _micros() - u;
	return ret;
}
   1adba:	26 96       	adiw	r28, 0x06	; 6
   1adbc:	0f b6       	in	r0, 0x3f	; 63
   1adbe:	f8 94       	cli
   1adc0:	de bf       	out	0x3e, r29	; 62
   1adc2:	0f be       	out	0x3f, r0	; 63
   1adc4:	cd bf       	out	0x3d, r28	; 61
   1adc6:	df 91       	pop	r29
   1adc8:	cf 91       	pop	r28
   1adca:	1f 91       	pop	r17
   1adcc:	0f 91       	pop	r16
   1adce:	ff 90       	pop	r15
   1add0:	ef 90       	pop	r14
   1add2:	df 90       	pop	r13
   1add4:	cf 90       	pop	r12
   1add6:	bf 90       	pop	r11
   1add8:	af 90       	pop	r10
   1adda:	9f 90       	pop	r9
   1addc:	8f 90       	pop	r8
   1adde:	7f 90       	pop	r7
   1ade0:	6f 90       	pop	r6
   1ade2:	5f 90       	pop	r5
   1ade4:	4f 90       	pop	r4
   1ade6:	3f 90       	pop	r3
   1ade8:	2f 90       	pop	r2
   1adea:	08 95       	ret
		}
		cx -= dx;
		cy -= dy;
		cz -= dz;
		sm4_do_step(sm);
		uint16_t delay = SM4_DEFDELAY;
   1adec:	84 ef       	ldi	r24, 0xF4	; 244
   1adee:	91 e0       	ldi	r25, 0x01	; 1
   1adf0:	c8 cf       	rjmp	.-112    	; 0x1ad82 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x1e4>

0001adf2 <calibration_status_clear(unsigned char)>:
    status |= components;
    eeprom_update_byte_notify((uint8_t*)EEPROM_CALIBRATION_STATUS_V2, status);
}

void calibration_status_clear(CalibrationStatus components)
{
   1adf2:	cf 93       	push	r28
   1adf4:	c8 2f       	mov	r28, r24
    CalibrationStatus status = eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_V2);
   1adf6:	86 ea       	ldi	r24, 0xA6	; 166
   1adf8:	9c e0       	ldi	r25, 0x0C	; 12
   1adfa:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
    status &= ~components;
   1adfe:	c0 95       	com	r28
   1ae00:	6c 2f       	mov	r22, r28
   1ae02:	68 23       	and	r22, r24
   1ae04:	86 ea       	ldi	r24, 0xA6	; 166
   1ae06:	9c e0       	ldi	r25, 0x0C	; 12
    eeprom_update_byte_notify((uint8_t*)EEPROM_CALIBRATION_STATUS_V2, status);
}
   1ae08:	cf 91       	pop	r28
   1ae0a:	0d 94 04 a4 	jmp	0x34808	; 0x34808 <eeprom_update_byte>

0001ae0e <lcd_reset_sheet()>:
        }
    }
}

static void lcd_reset_sheet()
{
   1ae0e:	1f 93       	push	r17
   1ae10:	cf 93       	push	r28
   1ae12:	df 93       	push	r29
   1ae14:	00 d0       	rcall	.+0      	; 0x1ae16 <lcd_reset_sheet()+0x8>
   1ae16:	00 d0       	rcall	.+0      	; 0x1ae18 <lcd_reset_sheet()+0xa>
   1ae18:	1f 92       	push	r1
   1ae1a:	1f 92       	push	r1
   1ae1c:	cd b7       	in	r28, 0x3d	; 61
   1ae1e:	de b7       	in	r29, 0x3e	; 62
    SheetName sheetName;
    eeprom_default_sheet_name(selected_sheet, sheetName);
   1ae20:	be 01       	movw	r22, r28
   1ae22:	6f 5f       	subi	r22, 0xFF	; 255
   1ae24:	7f 4f       	sbci	r23, 0xFF	; 255
   1ae26:	80 91 ca 03 	lds	r24, 0x03CA	; 0x8003ca <selected_sheet>
   1ae2a:	0e 94 b8 78 	call	0xf170	; 0xf170 <eeprom_default_sheet_name(unsigned char, SheetName&)>
	eeprom_update_word_notify(reinterpret_cast<uint16_t *>(&(EEPROM_Sheets_base->s[selected_sheet].z_offset)),EEPROM_EMPTY_VALUE16);
   1ae2e:	80 91 ca 03 	lds	r24, 0x03CA	; 0x8003ca <selected_sheet>
   1ae32:	1b e0       	ldi	r17, 0x0B	; 11
   1ae34:	81 9f       	mul	r24, r17
   1ae36:	c0 01       	movw	r24, r0
   1ae38:	11 24       	eor	r1, r1
        if (previous_value != value) {
            eeprom_word_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_word(dst, value);
   1ae3a:	6f ef       	ldi	r22, 0xFF	; 255
   1ae3c:	7f ef       	ldi	r23, 0xFF	; 255
   1ae3e:	80 5b       	subi	r24, 0xB0	; 176
   1ae40:	92 4f       	sbci	r25, 0xF2	; 242
   1ae42:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>
	eeprom_update_block_notify(sheetName.c,EEPROM_Sheets_base->s[selected_sheet].name,sizeof(Sheet::name));
   1ae46:	60 91 ca 03 	lds	r22, 0x03CA	; 0x8003ca <selected_sheet>
   1ae4a:	61 9f       	mul	r22, r17
   1ae4c:	b0 01       	movw	r22, r0
   1ae4e:	11 24       	eor	r1, r1
   1ae50:	67 5b       	subi	r22, 0xB7	; 183
   1ae52:	72 4f       	sbci	r23, 0xF2	; 242
#endif //DEBUG_EEPROM_CHANGES
}

#ifndef DEBUG_EEPROM_CHANGES
void eeprom_update_block_notify(const void *__src, void *__dst, size_t __n){
    eeprom_update_block(__src, __dst, __n);
   1ae54:	47 e0       	ldi	r20, 0x07	; 7
   1ae56:	50 e0       	ldi	r21, 0x00	; 0
   1ae58:	ce 01       	movw	r24, r28
   1ae5a:	01 96       	adiw	r24, 0x01	; 1
   1ae5c:	0f 94 f4 a3 	call	0x347e8	; 0x347e8 <eeprom_update_block>
	if (selected_sheet == eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))
   1ae60:	81 ea       	ldi	r24, 0xA1	; 161
   1ae62:	9d e0       	ldi	r25, 0x0D	; 13
   1ae64:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1ae68:	90 91 ca 03 	lds	r25, 0x03CA	; 0x8003ca <selected_sheet>
   1ae6c:	89 13       	cpse	r24, r25
   1ae6e:	0a c0       	rjmp	.+20     	; 0x1ae84 <lcd_reset_sheet()+0x76>
	{
        eeprom_switch_to_next_sheet();
   1ae70:	0e 94 aa 78 	call	0xf154	; 0xf154 <eeprom_switch_to_next_sheet()>
        if (-1 == eeprom_next_initialized_sheet(0))
   1ae74:	80 e0       	ldi	r24, 0x00	; 0
   1ae76:	0e 94 96 78 	call	0xf12c	; 0xf12c <eeprom_next_initialized_sheet(signed char)>
   1ae7a:	8f 3f       	cpi	r24, 0xFF	; 255
   1ae7c:	19 f4       	brne	.+6      	; 0x1ae84 <lcd_reset_sheet()+0x76>
            calibration_status_clear(CALIBRATION_STATUS_LIVE_ADJUST);
   1ae7e:	80 e1       	ldi	r24, 0x10	; 16
   1ae80:	0e 94 f9 d6 	call	0x1adf2	; 0x1adf2 <calibration_status_clear(unsigned char)>
	}

	menu_back();
   1ae84:	0e 94 1b 63 	call	0xc636	; 0xc636 <menu_back()>
}
   1ae88:	28 96       	adiw	r28, 0x08	; 8
   1ae8a:	0f b6       	in	r0, 0x3f	; 63
   1ae8c:	f8 94       	cli
   1ae8e:	de bf       	out	0x3e, r29	; 62
   1ae90:	0f be       	out	0x3f, r0	; 63
   1ae92:	cd bf       	out	0x3d, r28	; 61
   1ae94:	df 91       	pop	r29
   1ae96:	cf 91       	pop	r28
   1ae98:	1f 91       	pop	r17
   1ae9a:	08 95       	ret

0001ae9c <calibration_status_set(unsigned char)>:
    CalibrationStatus status = eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_V2);
    return ((status & components) == components);
}

void calibration_status_set(CalibrationStatus components)
{
   1ae9c:	cf 93       	push	r28
   1ae9e:	c8 2f       	mov	r28, r24
    CalibrationStatus status = eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_V2);
   1aea0:	86 ea       	ldi	r24, 0xA6	; 166
   1aea2:	9c e0       	ldi	r25, 0x0C	; 12
   1aea4:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
    status |= components;
   1aea8:	68 2f       	mov	r22, r24
   1aeaa:	6c 2b       	or	r22, r28
        if (previous_value != value) {
            eeprom_byte_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_byte(dst, value);
   1aeac:	86 ea       	ldi	r24, 0xA6	; 166
   1aeae:	9c e0       	ldi	r25, 0x0C	; 12
    eeprom_update_byte_notify((uint8_t*)EEPROM_CALIBRATION_STATUS_V2, status);
}
   1aeb0:	cf 91       	pop	r28
   1aeb2:	0d 94 04 a4 	jmp	0x34808	; 0x34808 <eeprom_update_byte>

0001aeb6 <calibration_status_get(unsigned char)>:
    sprintf_P(dest, PSTR("%u.%u.%u.%u"), IP[0], IP[1], IP[2], IP[3]);
}


bool calibration_status_get(CalibrationStatus components)
{
   1aeb6:	cf 93       	push	r28
   1aeb8:	c8 2f       	mov	r28, r24
    CalibrationStatus status = eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_V2);
   1aeba:	86 ea       	ldi	r24, 0xA6	; 166
   1aebc:	9c e0       	ldi	r25, 0x0C	; 12
   1aebe:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
    return ((status & components) == components);
   1aec2:	98 2f       	mov	r25, r24
   1aec4:	9c 23       	and	r25, r28
   1aec6:	81 e0       	ldi	r24, 0x01	; 1
   1aec8:	9c 13       	cpse	r25, r28
   1aeca:	80 e0       	ldi	r24, 0x00	; 0
}
   1aecc:	cf 91       	pop	r28
   1aece:	08 95       	ret

0001aed0 <lcd_babystep_z()>:
 * @param axis AxisEnum X_AXIS Y_AXIS Z_AXIS
 * other value leads to storing Z_AXIS
 * @param msg text to be displayed
 */
static void lcd_babystep_z()
{
   1aed0:	ef 92       	push	r14
   1aed2:	ff 92       	push	r15
   1aed4:	0f 93       	push	r16
   1aed6:	1f 93       	push	r17
   1aed8:	cf 93       	push	r28
   1aeda:	df 93       	push	r29
   1aedc:	cd b7       	in	r28, 0x3d	; 61
   1aede:	de b7       	in	r29, 0x3e	; 62
   1aee0:	63 97       	sbiw	r28, 0x13	; 19
   1aee2:	0f b6       	in	r0, 0x3f	; 63
   1aee4:	f8 94       	cli
   1aee6:	de bf       	out	0x3e, r29	; 62
   1aee8:	0f be       	out	0x3f, r0	; 63
   1aeea:	cd bf       	out	0x3d, r28	; 61
		int16_t babystepMemZ;
		float babystepMemMMZ;
	} _menu_data_t;
	static_assert(sizeof(menu_data)>= sizeof(_menu_data_t),"_menu_data_t doesn't fit into menu_data");
	_menu_data_t* _md = (_menu_data_t*)&(menu_data[0]);
	if (_md->status == 0)
   1aeec:	80 91 96 03 	lds	r24, 0x0396	; 0x800396 <menu_data>
   1aef0:	81 11       	cpse	r24, r1
   1aef2:	3a c0       	rjmp	.+116    	; 0x1af68 <lcd_babystep_z()+0x98>
	{
		// Menu was entered.
		// Initialize its status.
		_md->status = 1;
   1aef4:	81 e0       	ldi	r24, 0x01	; 1
   1aef6:	80 93 96 03 	sts	0x0396, r24	; 0x800396 <menu_data>
		check_babystep();
   1aefa:	0e 94 1c 7d 	call	0xfa38	; 0xfa38 <check_babystep()>

		if(!eeprom_is_sheet_initialized(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))){
   1aefe:	81 ea       	ldi	r24, 0xA1	; 161
   1af00:	9d e0       	ldi	r25, 0x0D	; 13
   1af02:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1af06:	18 2f       	mov	r17, r24
   1af08:	0e 94 88 78 	call	0xf110	; 0xf110 <eeprom_is_sheet_initialized(unsigned char)>
   1af0c:	81 11       	cpse	r24, r1
   1af0e:	ee c0       	rjmp	.+476    	; 0x1b0ec <lcd_babystep_z()+0x21c>
			_md->babystepMemZ = 0;
   1af10:	10 92 98 03 	sts	0x0398, r1	; 0x800398 <menu_data+0x2>
   1af14:	10 92 97 03 	sts	0x0397, r1	; 0x800397 <menu_data+0x1>
			_md->babystepMemZ = eeprom_read_word(reinterpret_cast<uint16_t *>(&(EEPROM_Sheets_base->
					s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)));
		}

		// same logic as in babystep_load
	    if (!calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST))
   1af18:	80 e1       	ldi	r24, 0x10	; 16
   1af1a:	0e 94 5b d7 	call	0x1aeb6	; 0x1aeb6 <calibration_status_get(unsigned char)>
   1af1e:	81 11       	cpse	r24, r1
   1af20:	04 c0       	rjmp	.+8      	; 0x1af2a <lcd_babystep_z()+0x5a>
			_md->babystepMemZ = 0;
   1af22:	10 92 98 03 	sts	0x0398, r1	; 0x800398 <menu_data+0x2>
   1af26:	10 92 97 03 	sts	0x0397, r1	; 0x800397 <menu_data+0x1>

		_md->babystepMemMMZ = _md->babystepMemZ/cs.axis_steps_per_mm[Z_AXIS];
   1af2a:	60 91 97 03 	lds	r22, 0x0397	; 0x800397 <menu_data+0x1>
   1af2e:	70 91 98 03 	lds	r23, 0x0398	; 0x800398 <menu_data+0x2>
   1af32:	07 2e       	mov	r0, r23
   1af34:	00 0c       	add	r0, r0
   1af36:	88 0b       	sbc	r24, r24
   1af38:	99 0b       	sbc	r25, r25
   1af3a:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   1af3e:	20 91 73 0d 	lds	r18, 0x0D73	; 0x800d73 <cs+0xc>
   1af42:	30 91 74 0d 	lds	r19, 0x0D74	; 0x800d74 <cs+0xd>
   1af46:	40 91 75 0d 	lds	r20, 0x0D75	; 0x800d75 <cs+0xe>
   1af4a:	50 91 76 0d 	lds	r21, 0x0D76	; 0x800d76 <cs+0xf>
   1af4e:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   1af52:	60 93 99 03 	sts	0x0399, r22	; 0x800399 <menu_data+0x3>
   1af56:	70 93 9a 03 	sts	0x039A, r23	; 0x80039a <menu_data+0x4>
   1af5a:	80 93 9b 03 	sts	0x039B, r24	; 0x80039b <menu_data+0x5>
   1af5e:	90 93 9c 03 	sts	0x039C, r25	; 0x80039c <menu_data+0x6>
		lcd_draw_update = 1;
   1af62:	81 e0       	ldi	r24, 0x01	; 1
   1af64:	80 93 59 02 	sts	0x0259, r24	; 0x800259 <lcd_draw_update>
		//SERIAL_ECHO("Z baby step: ");
		//SERIAL_ECHO(_md->babystepMem[2]);
	}

	if (lcd_encoder != 0)
   1af68:	80 91 1e 06 	lds	r24, 0x061E	; 0x80061e <lcd_encoder>
   1af6c:	90 91 1f 06 	lds	r25, 0x061F	; 0x80061f <lcd_encoder+0x1>
   1af70:	00 97       	sbiw	r24, 0x00	; 0
   1af72:	f1 f1       	breq	.+124    	; 0x1aff0 <lcd_babystep_z()+0x120>
	{
		_md->babystepMemZ += lcd_encoder;
   1af74:	20 91 97 03 	lds	r18, 0x0397	; 0x800397 <menu_data+0x1>
   1af78:	30 91 98 03 	lds	r19, 0x0398	; 0x800398 <menu_data+0x2>
   1af7c:	28 0f       	add	r18, r24
   1af7e:	39 1f       	adc	r19, r25
   1af80:	30 93 98 03 	sts	0x0398, r19	; 0x800398 <menu_data+0x2>
   1af84:	20 93 97 03 	sts	0x0397, r18	; 0x800397 <menu_data+0x1>

        if (_md->babystepMemZ < Z_BABYSTEP_MIN) _md->babystepMemZ = Z_BABYSTEP_MIN; //-3999 -> -9.99 mm
   1af88:	21 36       	cpi	r18, 0x61	; 97
   1af8a:	40 ef       	ldi	r20, 0xF0	; 240
   1af8c:	34 07       	cpc	r19, r20
   1af8e:	0c f0       	brlt	.+2      	; 0x1af92 <lcd_babystep_z()+0xc2>
   1af90:	ba c0       	rjmp	.+372    	; 0x1b106 <lcd_babystep_z()+0x236>
   1af92:	81 e6       	ldi	r24, 0x61	; 97
   1af94:	90 ef       	ldi	r25, 0xF0	; 240
   1af96:	90 93 98 03 	sts	0x0398, r25	; 0x800398 <menu_data+0x2>
   1af9a:	80 93 97 03 	sts	0x0397, r24	; 0x800397 <menu_data+0x1>
        else if (_md->babystepMemZ > Z_BABYSTEP_MAX) _md->babystepMemZ = Z_BABYSTEP_MAX; //0
        else babystepsTodoZadd(lcd_encoder);

		_md->babystepMemMMZ = _md->babystepMemZ/cs.axis_steps_per_mm[Z_AXIS];
   1af9e:	60 91 97 03 	lds	r22, 0x0397	; 0x800397 <menu_data+0x1>
   1afa2:	70 91 98 03 	lds	r23, 0x0398	; 0x800398 <menu_data+0x2>
   1afa6:	07 2e       	mov	r0, r23
   1afa8:	00 0c       	add	r0, r0
   1afaa:	88 0b       	sbc	r24, r24
   1afac:	99 0b       	sbc	r25, r25
   1afae:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   1afb2:	20 91 73 0d 	lds	r18, 0x0D73	; 0x800d73 <cs+0xc>
   1afb6:	30 91 74 0d 	lds	r19, 0x0D74	; 0x800d74 <cs+0xd>
   1afba:	40 91 75 0d 	lds	r20, 0x0D75	; 0x800d75 <cs+0xe>
   1afbe:	50 91 76 0d 	lds	r21, 0x0D76	; 0x800d76 <cs+0xf>
   1afc2:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   1afc6:	60 93 99 03 	sts	0x0399, r22	; 0x800399 <menu_data+0x3>
   1afca:	70 93 9a 03 	sts	0x039A, r23	; 0x80039a <menu_data+0x4>
   1afce:	80 93 9b 03 	sts	0x039B, r24	; 0x80039b <menu_data+0x5>
   1afd2:	90 93 9c 03 	sts	0x039C, r25	; 0x80039c <menu_data+0x6>
		_delay(50);
   1afd6:	62 e3       	ldi	r22, 0x32	; 50
   1afd8:	70 e0       	ldi	r23, 0x00	; 0
   1afda:	80 e0       	ldi	r24, 0x00	; 0
   1afdc:	90 e0       	ldi	r25, 0x00	; 0
   1afde:	0f 94 bd 0d 	call	0x21b7a	; 0x21b7a <delay2>
		lcd_encoder = 0;
   1afe2:	10 92 1f 06 	sts	0x061F, r1	; 0x80061f <lcd_encoder+0x1>
   1afe6:	10 92 1e 06 	sts	0x061E, r1	; 0x80061e <lcd_encoder>
		lcd_draw_update = 1;
   1afea:	81 e0       	ldi	r24, 0x01	; 1
   1afec:	80 93 59 02 	sts	0x0259, r24	; 0x800259 <lcd_draw_update>
	}
	if (lcd_draw_update)
   1aff0:	80 91 59 02 	lds	r24, 0x0259	; 0x800259 <lcd_draw_update>
   1aff4:	88 23       	and	r24, r24
   1aff6:	c9 f1       	breq	.+114    	; 0x1b06a <lcd_babystep_z()+0x19a>
	{
	    SheetFormatBuffer buffer;
	    menu_format_sheet_E(EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))], buffer);
   1aff8:	81 ea       	ldi	r24, 0xA1	; 161
   1affa:	9d e0       	ldi	r25, 0x0D	; 13
   1affc:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1b000:	2b e0       	ldi	r18, 0x0B	; 11
   1b002:	82 9f       	mul	r24, r18
   1b004:	c0 01       	movw	r24, r0
   1b006:	11 24       	eor	r1, r1
   1b008:	be 01       	movw	r22, r28
   1b00a:	6f 5f       	subi	r22, 0xFF	; 255
   1b00c:	7f 4f       	sbci	r23, 0xFF	; 255
   1b00e:	87 5b       	subi	r24, 0xB7	; 183
   1b010:	92 4f       	sbci	r25, 0xF2	; 242
   1b012:	0e 94 fd 75 	call	0xebfa	; 0xebfa <menu_format_sheet_E(Sheet const&, SheetFormatBuffer&)>
	    lcd_home();
   1b016:	0e 94 1f 70 	call	0xe03e	; 0xe03e <lcd_home()>
	    lcd_print(buffer.c);
   1b01a:	ce 01       	movw	r24, r28
   1b01c:	01 96       	adiw	r24, 0x01	; 1
   1b01e:	0e 94 5f 73 	call	0xe6be	; 0xe6be <lcd_print(char const*)>
	    lcd_set_cursor(0, 1);
   1b022:	61 e0       	ldi	r22, 0x01	; 1
   1b024:	80 e0       	ldi	r24, 0x00	; 0
   1b026:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
		menu_draw_float13(_T(MSG_BABYSTEPPING_Z), _md->babystepMemMMZ);
   1b02a:	10 91 99 03 	lds	r17, 0x0399	; 0x800399 <menu_data+0x3>
   1b02e:	00 91 9a 03 	lds	r16, 0x039A	; 0x80039a <menu_data+0x4>
   1b032:	f0 90 9b 03 	lds	r15, 0x039B	; 0x80039b <menu_data+0x5>
   1b036:	e0 90 9c 03 	lds	r14, 0x039C	; 0x80039c <menu_data+0x6>
   1b03a:	86 ed       	ldi	r24, 0xD6	; 214
   1b03c:	9a e3       	ldi	r25, 0x3A	; 58
   1b03e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
//! (i.e. str must include a ':' at its end)
//! FLASH usage dropped 234476B -> 234392B
//! Moreover, this function gets inlined in the final code, so removing it doesn't really help ;)
void menu_draw_float13(const char* str, float val)
{
	lcd_printf_P(menu_fmt_float13, ' ', str, val);
   1b042:	ef 92       	push	r14
   1b044:	ff 92       	push	r15
   1b046:	0f 93       	push	r16
   1b048:	1f 93       	push	r17
   1b04a:	9f 93       	push	r25
   1b04c:	8f 93       	push	r24
   1b04e:	1f 92       	push	r1
   1b050:	80 e2       	ldi	r24, 0x20	; 32
   1b052:	8f 93       	push	r24
   1b054:	87 e8       	ldi	r24, 0x87	; 135
   1b056:	92 e8       	ldi	r25, 0x82	; 130
   1b058:	9f 93       	push	r25
   1b05a:	8f 93       	push	r24
   1b05c:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
   1b060:	0f b6       	in	r0, 0x3f	; 63
   1b062:	f8 94       	cli
   1b064:	de bf       	out	0x3e, r29	; 62
   1b066:	0f be       	out	0x3f, r0	; 63
   1b068:	cd bf       	out	0x3d, r28	; 61
	}
	if (LCD_CLICKED || menu_leaving)
   1b06a:	80 91 95 03 	lds	r24, 0x0395	; 0x800395 <lcd_click_trigger>
   1b06e:	81 11       	cpse	r24, r1
   1b070:	04 c0       	rjmp	.+8      	; 0x1b07a <lcd_babystep_z()+0x1aa>
   1b072:	80 91 c4 03 	lds	r24, 0x03C4	; 0x8003c4 <menu_leaving>
   1b076:	88 23       	and	r24, r24
   1b078:	51 f1       	breq	.+84     	; 0x1b0ce <lcd_babystep_z()+0x1fe>
	{
		// Only update the EEPROM when leaving the menu.
          uint8_t active_sheet=eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet));
   1b07a:	81 ea       	ldi	r24, 0xA1	; 161
   1b07c:	9d e0       	ldi	r25, 0x0D	; 13
   1b07e:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1b082:	9b e0       	ldi	r25, 0x0B	; 11
   1b084:	89 9f       	mul	r24, r25
   1b086:	80 01       	movw	r16, r0
   1b088:	11 24       	eor	r1, r1
        if (previous_value != value) {
            eeprom_word_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_word(dst, value);
   1b08a:	60 91 97 03 	lds	r22, 0x0397	; 0x800397 <menu_data+0x1>
   1b08e:	70 91 98 03 	lds	r23, 0x0398	; 0x800398 <menu_data+0x2>
   1b092:	c8 01       	movw	r24, r16
   1b094:	80 5b       	subi	r24, 0xB0	; 176
   1b096:	92 4f       	sbci	r25, 0xF2	; 242
   1b098:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>
        if (previous_value != value) {
            eeprom_byte_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_byte(dst, value);
   1b09c:	60 91 59 12 	lds	r22, 0x1259	; 0x801259 <target_temperature_bed>
   1b0a0:	c8 01       	movw	r24, r16
   1b0a2:	8e 5a       	subi	r24, 0xAE	; 174
   1b0a4:	92 4f       	sbci	r25, 0xF2	; 242
   1b0a6:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
		eeprom_update_word_notify(reinterpret_cast<uint16_t *>(&(EEPROM_Sheets_base->s[active_sheet].z_offset)),_md->babystepMemZ);

        // NOTE: bed_temp and pinda_temp are not currently read/used anywhere.
		eeprom_update_byte_notify(&(EEPROM_Sheets_base->s[active_sheet].bed_temp),target_temperature_bed);
#ifdef PINDA_THERMISTOR
		eeprom_update_byte_notify(&(EEPROM_Sheets_base->s[active_sheet].pinda_temp),current_temperature_pinda);
   1b0aa:	60 91 85 03 	lds	r22, 0x0385	; 0x800385 <current_temperature_pinda>
   1b0ae:	70 91 86 03 	lds	r23, 0x0386	; 0x800386 <current_temperature_pinda+0x1>
   1b0b2:	80 91 87 03 	lds	r24, 0x0387	; 0x800387 <current_temperature_pinda+0x2>
   1b0b6:	90 91 88 03 	lds	r25, 0x0388	; 0x800388 <current_temperature_pinda+0x3>
   1b0ba:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   1b0be:	c8 01       	movw	r24, r16
   1b0c0:	8d 5a       	subi	r24, 0xAD	; 173
   1b0c2:	92 4f       	sbci	r25, 0xF2	; 242
   1b0c4:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
#endif //PINDA_THERMISTOR
		calibration_status_set(CALIBRATION_STATUS_LIVE_ADJUST);
   1b0c8:	80 e1       	ldi	r24, 0x10	; 16
   1b0ca:	0e 94 4e d7 	call	0x1ae9c	; 0x1ae9c <calibration_status_set(unsigned char)>
	}
	menu_back_if_clicked();
   1b0ce:	0e 94 06 74 	call	0xe80c	; 0xe80c <menu_back_if_clicked()>
}
   1b0d2:	63 96       	adiw	r28, 0x13	; 19
   1b0d4:	0f b6       	in	r0, 0x3f	; 63
   1b0d6:	f8 94       	cli
   1b0d8:	de bf       	out	0x3e, r29	; 62
   1b0da:	0f be       	out	0x3f, r0	; 63
   1b0dc:	cd bf       	out	0x3d, r28	; 61
   1b0de:	df 91       	pop	r29
   1b0e0:	cf 91       	pop	r28
   1b0e2:	1f 91       	pop	r17
   1b0e4:	0f 91       	pop	r16
   1b0e6:	ff 90       	pop	r15
   1b0e8:	ef 90       	pop	r14
   1b0ea:	08 95       	ret

		if(!eeprom_is_sheet_initialized(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))){
			_md->babystepMemZ = 0;
		}
		else{
			_md->babystepMemZ = eeprom_read_word(reinterpret_cast<uint16_t *>(&(EEPROM_Sheets_base->
   1b0ec:	2b e0       	ldi	r18, 0x0B	; 11
   1b0ee:	12 9f       	mul	r17, r18
   1b0f0:	c0 01       	movw	r24, r0
   1b0f2:	11 24       	eor	r1, r1
   1b0f4:	80 5b       	subi	r24, 0xB0	; 176
   1b0f6:	92 4f       	sbci	r25, 0xF2	; 242
   1b0f8:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
   1b0fc:	90 93 98 03 	sts	0x0398, r25	; 0x800398 <menu_data+0x2>
   1b100:	80 93 97 03 	sts	0x0397, r24	; 0x800397 <menu_data+0x1>
   1b104:	09 cf       	rjmp	.-494    	; 0x1af18 <lcd_babystep_z()+0x48>
	if (lcd_encoder != 0)
	{
		_md->babystepMemZ += lcd_encoder;

        if (_md->babystepMemZ < Z_BABYSTEP_MIN) _md->babystepMemZ = Z_BABYSTEP_MIN; //-3999 -> -9.99 mm
        else if (_md->babystepMemZ > Z_BABYSTEP_MAX) _md->babystepMemZ = Z_BABYSTEP_MAX; //0
   1b106:	12 16       	cp	r1, r18
   1b108:	13 06       	cpc	r1, r19
   1b10a:	2c f4       	brge	.+10     	; 0x1b116 <lcd_babystep_z()+0x246>
   1b10c:	10 92 98 03 	sts	0x0398, r1	; 0x800398 <menu_data+0x2>
   1b110:	10 92 97 03 	sts	0x0397, r1	; 0x800397 <menu_data+0x1>
   1b114:	44 cf       	rjmp	.-376    	; 0x1af9e <lcd_babystep_z()+0xce>
extern volatile int babystepsTodo[3];

inline void babystepsTodoZadd(int n)
{
    if (n != 0) {
        CRITICAL_SECTION_START
   1b116:	2f b7       	in	r18, 0x3f	; 63
   1b118:	f8 94       	cli
        babystepsTodo[Z_AXIS] += n;
   1b11a:	40 91 83 03 	lds	r20, 0x0383	; 0x800383 <babystepsTodo+0x4>
   1b11e:	50 91 84 03 	lds	r21, 0x0384	; 0x800384 <babystepsTodo+0x5>
   1b122:	84 0f       	add	r24, r20
   1b124:	95 1f       	adc	r25, r21
   1b126:	90 93 84 03 	sts	0x0384, r25	; 0x800384 <babystepsTodo+0x5>
   1b12a:	80 93 83 03 	sts	0x0383, r24	; 0x800383 <babystepsTodo+0x4>
        CRITICAL_SECTION_END
   1b12e:	2f bf       	out	0x3f, r18	; 63
   1b130:	36 cf       	rjmp	.-404    	; 0x1af9e <lcd_babystep_z()+0xce>

0001b132 <lcd_first_layer_calibration_reset()>:
//! |>Continue           |  MSG_CONTINUE
//! | Reset              |  MSG_RESET
//! ----------------------
//! @endcode
void lcd_first_layer_calibration_reset()
{
   1b132:	af 92       	push	r10
   1b134:	bf 92       	push	r11
   1b136:	cf 92       	push	r12
   1b138:	df 92       	push	r13
   1b13a:	ef 92       	push	r14
   1b13c:	ff 92       	push	r15
   1b13e:	0f 93       	push	r16
   1b140:	1f 93       	push	r17
   1b142:	cf 93       	push	r28
   1b144:	df 93       	push	r29
   1b146:	00 d0       	rcall	.+0      	; 0x1b148 <lcd_first_layer_calibration_reset()+0x16>
   1b148:	00 d0       	rcall	.+0      	; 0x1b14a <lcd_first_layer_calibration_reset()+0x18>
   1b14a:	1f 92       	push	r1
   1b14c:	cd b7       	in	r28, 0x3d	; 61
   1b14e:	de b7       	in	r29, 0x3e	; 62
    } MenuData;
    static_assert(sizeof(menu_data)>= sizeof(MenuData),"_menu_data_t doesn't fit into menu_data");
    MenuData* menuData = (MenuData*)&(menu_data[0]);

    if(LCD_CLICKED || !eeprom_is_sheet_initialized(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet))) ||
            (!calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST)) ||
   1b150:	80 91 95 03 	lds	r24, 0x0395	; 0x800395 <lcd_click_trigger>
   1b154:	81 11       	cpse	r24, r1
   1b156:	18 c0       	rjmp	.+48     	; 0x1b188 <lcd_first_layer_calibration_reset()+0x56>
        bool reset;
    } MenuData;
    static_assert(sizeof(menu_data)>= sizeof(MenuData),"_menu_data_t doesn't fit into menu_data");
    MenuData* menuData = (MenuData*)&(menu_data[0]);

    if(LCD_CLICKED || !eeprom_is_sheet_initialized(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet))) ||
   1b158:	81 ea       	ldi	r24, 0xA1	; 161
   1b15a:	9d e0       	ldi	r25, 0x0D	; 13
   1b15c:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1b160:	18 2f       	mov	r17, r24
   1b162:	0e 94 88 78 	call	0xf110	; 0xf110 <eeprom_is_sheet_initialized(unsigned char)>
   1b166:	88 23       	and	r24, r24
   1b168:	79 f0       	breq	.+30     	; 0x1b188 <lcd_first_layer_calibration_reset()+0x56>
            (!calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST)) ||
   1b16a:	80 e1       	ldi	r24, 0x10	; 16
   1b16c:	0e 94 5b d7 	call	0x1aeb6	; 0x1aeb6 <calibration_status_get(unsigned char)>
        bool reset;
    } MenuData;
    static_assert(sizeof(menu_data)>= sizeof(MenuData),"_menu_data_t doesn't fit into menu_data");
    MenuData* menuData = (MenuData*)&(menu_data[0]);

    if(LCD_CLICKED || !eeprom_is_sheet_initialized(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet))) ||
   1b170:	88 23       	and	r24, r24
   1b172:	51 f0       	breq	.+20     	; 0x1b188 <lcd_first_layer_calibration_reset()+0x56>
            (!calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST)) ||
            (0 == static_cast<int16_t>(eeprom_read_word(reinterpret_cast<uint16_t*>
            (&EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)))))
   1b174:	2b e0       	ldi	r18, 0x0B	; 11
   1b176:	12 9f       	mul	r17, r18
   1b178:	c0 01       	movw	r24, r0
   1b17a:	11 24       	eor	r1, r1
    static_assert(sizeof(menu_data)>= sizeof(MenuData),"_menu_data_t doesn't fit into menu_data");
    MenuData* menuData = (MenuData*)&(menu_data[0]);

    if(LCD_CLICKED || !eeprom_is_sheet_initialized(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet))) ||
            (!calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST)) ||
            (0 == static_cast<int16_t>(eeprom_read_word(reinterpret_cast<uint16_t*>
   1b17c:	80 5b       	subi	r24, 0xB0	; 176
   1b17e:	92 4f       	sbci	r25, 0xF2	; 242
   1b180:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
    } MenuData;
    static_assert(sizeof(menu_data)>= sizeof(MenuData),"_menu_data_t doesn't fit into menu_data");
    MenuData* menuData = (MenuData*)&(menu_data[0]);

    if(LCD_CLICKED || !eeprom_is_sheet_initialized(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet))) ||
            (!calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST)) ||
   1b184:	89 2b       	or	r24, r25
   1b186:	f1 f4       	brne	.+60     	; 0x1b1c4 <lcd_first_layer_calibration_reset()+0x92>
            (0 == static_cast<int16_t>(eeprom_read_word(reinterpret_cast<uint16_t*>
            (&EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)))))
    {
        if (menuData->reset)
   1b188:	80 91 96 03 	lds	r24, 0x0396	; 0x800396 <menu_data>
   1b18c:	88 23       	and	r24, r24
   1b18e:	71 f0       	breq	.+28     	; 0x1b1ac <lcd_first_layer_calibration_reset()+0x7a>
        {
            eeprom_update_word_notify(reinterpret_cast<uint16_t*>(&EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset), 0xffff);
   1b190:	81 ea       	ldi	r24, 0xA1	; 161
   1b192:	9d e0       	ldi	r25, 0x0D	; 13
   1b194:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1b198:	2b e0       	ldi	r18, 0x0B	; 11
   1b19a:	82 9f       	mul	r24, r18
   1b19c:	c0 01       	movw	r24, r0
   1b19e:	11 24       	eor	r1, r1
        if (previous_value != value) {
            eeprom_word_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_word(dst, value);
   1b1a0:	6f ef       	ldi	r22, 0xFF	; 255
   1b1a2:	7f ef       	ldi	r23, 0xFF	; 255
   1b1a4:	80 5b       	subi	r24, 0xB0	; 176
   1b1a6:	92 4f       	sbci	r25, 0xF2	; 242
   1b1a8:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>
        }

        // If the knob was clicked, don't produce feedback
        // It should only be done when the firmware changes the menu
        // on its own (silently)
        menu_goto(lcd_v2_calibration, 0, true, !lcd_clicked());
   1b1ac:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   1b1b0:	21 e0       	ldi	r18, 0x01	; 1
   1b1b2:	81 11       	cpse	r24, r1
   1b1b4:	20 e0       	ldi	r18, 0x00	; 0
   1b1b6:	41 e0       	ldi	r20, 0x01	; 1
   1b1b8:	70 e0       	ldi	r23, 0x00	; 0
   1b1ba:	60 e0       	ldi	r22, 0x00	; 0
   1b1bc:	86 e9       	ldi	r24, 0x96	; 150
   1b1be:	99 ee       	ldi	r25, 0xE9	; 233
   1b1c0:	0e 94 b7 62 	call	0xc56e	; 0xc56e <menu_goto(void (*)(), int, bool, bool)>
    }

    if (lcd_encoder) {
   1b1c4:	20 91 1e 06 	lds	r18, 0x061E	; 0x80061e <lcd_encoder>
   1b1c8:	30 91 1f 06 	lds	r19, 0x061F	; 0x80061f <lcd_encoder+0x1>
   1b1cc:	21 15       	cp	r18, r1
   1b1ce:	31 05       	cpc	r19, r1
   1b1d0:	59 f0       	breq	.+22     	; 0x1b1e8 <lcd_first_layer_calibration_reset()+0xb6>
        menuData->reset = lcd_encoder > 0;
   1b1d2:	81 e0       	ldi	r24, 0x01	; 1
   1b1d4:	12 16       	cp	r1, r18
   1b1d6:	13 06       	cpc	r1, r19
   1b1d8:	0c f0       	brlt	.+2      	; 0x1b1dc <lcd_first_layer_calibration_reset()+0xaa>
   1b1da:	80 e0       	ldi	r24, 0x00	; 0
   1b1dc:	80 93 96 03 	sts	0x0396, r24	; 0x800396 <menu_data>
        lcd_encoder = 0; // Reset
   1b1e0:	10 92 1f 06 	sts	0x061F, r1	; 0x80061f <lcd_encoder+0x1>
   1b1e4:	10 92 1e 06 	sts	0x061E, r1	; 0x80061e <lcd_encoder>
    }

    char sheet_name[sizeof(Sheet::name)];
    eeprom_read_block(sheet_name, &EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].name, sizeof(Sheet::name));
   1b1e8:	81 ea       	ldi	r24, 0xA1	; 161
   1b1ea:	9d e0       	ldi	r25, 0x0D	; 13
   1b1ec:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1b1f0:	1b e0       	ldi	r17, 0x0B	; 11
   1b1f2:	81 9f       	mul	r24, r17
   1b1f4:	b0 01       	movw	r22, r0
   1b1f6:	11 24       	eor	r1, r1
   1b1f8:	67 5b       	subi	r22, 0xB7	; 183
   1b1fa:	72 4f       	sbci	r23, 0xF2	; 242
   1b1fc:	47 e0       	ldi	r20, 0x07	; 7
   1b1fe:	50 e0       	ldi	r21, 0x00	; 0
   1b200:	ce 01       	movw	r24, r28
   1b202:	01 96       	adiw	r24, 0x01	; 1
   1b204:	7c 01       	movw	r14, r24
   1b206:	0f 94 d0 a3 	call	0x347a0	; 0x347a0 <eeprom_read_block>
    lcd_home();
   1b20a:	0e 94 1f 70 	call	0xe03e	; 0xe03e <lcd_home()>
    float offset = static_cast<int16_t>(eeprom_read_word(reinterpret_cast<uint16_t*>(&EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)))/cs.axis_steps_per_mm[Z_AXIS];
   1b20e:	81 ea       	ldi	r24, 0xA1	; 161
   1b210:	9d e0       	ldi	r25, 0x0D	; 13
   1b212:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1b216:	81 9f       	mul	r24, r17
   1b218:	c0 01       	movw	r24, r0
   1b21a:	11 24       	eor	r1, r1
   1b21c:	80 5b       	subi	r24, 0xB0	; 176
   1b21e:	92 4f       	sbci	r25, 0xF2	; 242
   1b220:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
   1b224:	bc 01       	movw	r22, r24
   1b226:	99 0f       	add	r25, r25
   1b228:	88 0b       	sbc	r24, r24
   1b22a:	99 0b       	sbc	r25, r25
   1b22c:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   1b230:	20 91 73 0d 	lds	r18, 0x0D73	; 0x800d73 <cs+0xc>
   1b234:	30 91 74 0d 	lds	r19, 0x0D74	; 0x800d74 <cs+0xd>
   1b238:	40 91 75 0d 	lds	r20, 0x0D75	; 0x800d75 <cs+0xe>
   1b23c:	50 91 76 0d 	lds	r21, 0x0D76	; 0x800d76 <cs+0xf>
   1b240:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   1b244:	d6 2e       	mov	r13, r22
   1b246:	c7 2e       	mov	r12, r23
   1b248:	b8 2e       	mov	r11, r24
   1b24a:	a9 2e       	mov	r10, r25
    lcd_printf_P(_T(MSG_SHEET_OFFSET),
   1b24c:	80 91 96 03 	lds	r24, 0x0396	; 0x800396 <menu_data>
   1b250:	0e e3       	ldi	r16, 0x3E	; 62
   1b252:	10 e2       	ldi	r17, 0x20	; 32
   1b254:	81 11       	cpse	r24, r1
   1b256:	02 c0       	rjmp	.+4      	; 0x1b25c <lcd_first_layer_calibration_reset()+0x12a>
   1b258:	00 e2       	ldi	r16, 0x20	; 32
   1b25a:	1e e3       	ldi	r17, 0x3E	; 62
   1b25c:	85 ec       	ldi	r24, 0xC5	; 197
   1b25e:	9c e3       	ldi	r25, 0x3C	; 60
   1b260:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1b264:	1f 92       	push	r1
   1b266:	0f 93       	push	r16
   1b268:	1f 92       	push	r1
   1b26a:	1f 93       	push	r17
   1b26c:	af 92       	push	r10
   1b26e:	bf 92       	push	r11
   1b270:	cf 92       	push	r12
   1b272:	df 92       	push	r13
   1b274:	ff 92       	push	r15
   1b276:	ef 92       	push	r14
   1b278:	9f 93       	push	r25
   1b27a:	8f 93       	push	r24
   1b27c:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
   1b280:	0f b6       	in	r0, 0x3f	; 63
   1b282:	f8 94       	cli
   1b284:	de bf       	out	0x3e, r29	; 62
   1b286:	0f be       	out	0x3f, r0	; 63
   1b288:	cd bf       	out	0x3d, r28	; 61
            sheet_name, offset, menuData->reset ? ' ' : '>', menuData->reset ? '>' : ' ');// \n denotes line break, %.7s is replaced by 7 character long sheet name, %+1.3f is replaced by 6 character long floating point number, %c is replaced by > or white space (one character) based on whether first or second option is selected. % denoted place holders can not be reordered.

}
   1b28a:	27 96       	adiw	r28, 0x07	; 7
   1b28c:	0f b6       	in	r0, 0x3f	; 63
   1b28e:	f8 94       	cli
   1b290:	de bf       	out	0x3e, r29	; 62
   1b292:	0f be       	out	0x3f, r0	; 63
   1b294:	cd bf       	out	0x3d, r28	; 61
   1b296:	df 91       	pop	r29
   1b298:	cf 91       	pop	r28
   1b29a:	1f 91       	pop	r17
   1b29c:	0f 91       	pop	r16
   1b29e:	ff 90       	pop	r15
   1b2a0:	ef 90       	pop	r14
   1b2a2:	df 90       	pop	r13
   1b2a4:	cf 90       	pop	r12
   1b2a6:	bf 90       	pop	r11
   1b2a8:	af 90       	pop	r10
   1b2aa:	08 95       	ret

0001b2ac <activate_calibrate_sheet()>:
        if (previous_value != value) {
            eeprom_byte_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_byte(dst, value);
   1b2ac:	60 91 ca 03 	lds	r22, 0x03CA	; 0x8003ca <selected_sheet>
   1b2b0:	81 ea       	ldi	r24, 0xA1	; 161
   1b2b2:	9d e0       	ldi	r25, 0x0D	; 13
   1b2b4:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>

//! @brief Activate selected_sheet and run first layer calibration
static void activate_calibrate_sheet()
{
    eeprom_update_byte_notify(&(EEPROM_Sheets_base->active_sheet), selected_sheet);
    lcd_first_layer_calibration_reset();
   1b2b8:	0c 94 99 d8 	jmp	0x1b132	; 0x1b132 <lcd_first_layer_calibration_reset()>

0001b2bc <fCheckModeInit()>:
ClCheckMode oCheckVersion;
ClCheckMode oCheckGcode;
ClCheckMode oCheckFilament;

void fCheckModeInit() {
    oCheckMode = (ClCheckMode)eeprom_init_default_byte((uint8_t *)EEPROM_CHECK_MODE, (uint8_t)ClCheckMode::_Warn);
   1b2bc:	61 e0       	ldi	r22, 0x01	; 1
   1b2be:	88 ea       	ldi	r24, 0xA8	; 168
   1b2c0:	9d e0       	ldi	r25, 0x0D	; 13
   1b2c2:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
   1b2c6:	80 93 ed 03 	sts	0x03ED, r24	; 0x8003ed <oCheckMode>

    if (farm_mode) {
   1b2ca:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   1b2ce:	88 23       	and	r24, r24
   1b2d0:	41 f0       	breq	.+16     	; 0x1b2e2 <fCheckModeInit()+0x26>
        oCheckMode = ClCheckMode::_Strict;
   1b2d2:	82 e0       	ldi	r24, 0x02	; 2
   1b2d4:	80 93 ed 03 	sts	0x03ED, r24	; 0x8003ed <oCheckMode>
   1b2d8:	62 e0       	ldi	r22, 0x02	; 2
   1b2da:	88 ea       	ldi	r24, 0xA8	; 168
   1b2dc:	9d e0       	ldi	r25, 0x0D	; 13
   1b2de:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
        eeprom_update_byte_notify((uint8_t *)EEPROM_CHECK_MODE, (uint8_t)ClCheckMode::_Strict);
    }

    oNozzleDiameter = (ClNozzleDiameter)eeprom_init_default_byte((uint8_t *)EEPROM_NOZZLE_DIAMETER, (uint8_t)ClNozzleDiameter::_Diameter_400);
   1b2e2:	68 e2       	ldi	r22, 0x28	; 40
   1b2e4:	87 ea       	ldi	r24, 0xA7	; 167
   1b2e6:	9d e0       	ldi	r25, 0x0D	; 13
   1b2e8:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
   1b2ec:	80 93 eb 03 	sts	0x03EB, r24	; 0x8003eb <oNozzleDiameter>
    eeprom_init_default_word((uint16_t *)EEPROM_NOZZLE_DIAMETER_uM, EEPROM_NOZZLE_DIAMETER_uM_DEFAULT);
   1b2f0:	60 e9       	ldi	r22, 0x90	; 144
   1b2f2:	71 e0       	ldi	r23, 0x01	; 1
   1b2f4:	85 ea       	ldi	r24, 0xA5	; 165
   1b2f6:	9d e0       	ldi	r25, 0x0D	; 13
   1b2f8:	0e 94 45 78 	call	0xf08a	; 0xf08a <eeprom_init_default_word(unsigned int*, unsigned int)>

    oCheckModel = (ClCheckMode)eeprom_init_default_byte((uint8_t *)EEPROM_CHECK_MODEL, (uint8_t)ClCheckMode::_Warn);
   1b2fc:	61 e0       	ldi	r22, 0x01	; 1
   1b2fe:	84 ea       	ldi	r24, 0xA4	; 164
   1b300:	9d e0       	ldi	r25, 0x0D	; 13
   1b302:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
   1b306:	80 93 ea 03 	sts	0x03EA, r24	; 0x8003ea <oCheckModel>
    oCheckVersion = (ClCheckMode)eeprom_init_default_byte((uint8_t *)EEPROM_CHECK_VERSION, (uint8_t)ClCheckMode::_Warn);
   1b30a:	61 e0       	ldi	r22, 0x01	; 1
   1b30c:	83 ea       	ldi	r24, 0xA3	; 163
   1b30e:	9d e0       	ldi	r25, 0x0D	; 13
   1b310:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
   1b314:	80 93 e9 03 	sts	0x03E9, r24	; 0x8003e9 <oCheckVersion>
    oCheckGcode = (ClCheckMode)eeprom_init_default_byte((uint8_t *)EEPROM_CHECK_GCODE, (uint8_t)ClCheckMode::_Warn);
   1b318:	61 e0       	ldi	r22, 0x01	; 1
   1b31a:	82 ea       	ldi	r24, 0xA2	; 162
   1b31c:	9d e0       	ldi	r25, 0x0D	; 13
   1b31e:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
   1b322:	80 93 e8 03 	sts	0x03E8, r24	; 0x8003e8 <oCheckGcode>
    oCheckFilament = (ClCheckMode)eeprom_init_default_byte((uint8_t *)EEPROM_CHECK_FILAMENT, (uint8_t)ClCheckMode::_Warn);
   1b326:	61 e0       	ldi	r22, 0x01	; 1
   1b328:	80 e2       	ldi	r24, 0x20	; 32
   1b32a:	9c e0       	ldi	r25, 0x0C	; 12
   1b32c:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
   1b330:	80 93 ee 03 	sts	0x03EE, r24	; 0x8003ee <oCheckFilament>
}
   1b334:	08 95       	ret

0001b336 <parse_version(char const*, unsigned int*)>:
    return false;
}

// Parse a major.minor.revision version number.
// Return true if valid.
bool parse_version(const char *str, uint16_t version[4]) {
   1b336:	0f 93       	push	r16
   1b338:	1f 93       	push	r17
   1b33a:	8b 01       	movw	r16, r22
    for(uint8_t i = 0; i < 2; ++i){
        str = Number(str, version + i);
   1b33c:	0e 94 cf bd 	call	0x17b9e	; 0x17b9e <Number(char const*, unsigned int*)>
        if (*str != '.')
   1b340:	fc 01       	movw	r30, r24
   1b342:	20 81       	ld	r18, Z
   1b344:	2e 32       	cpi	r18, 0x2E	; 46
   1b346:	11 f0       	breq	.+4      	; 0x1b34c <parse_version(char const*, unsigned int*)+0x16>
            static_assert(sizeof(STR_REVISION_DEV) == 4);
            return Tag( str, STR_REVISION_DEV, sizeof(STR_REVISION_DEV) - 1, FIRMWARE_REVISION_DEV, version + 3);
        case 'R': // expect RC
            static_assert(sizeof(STR_REVISION_RC) == 3);
            return Tag( str, STR_REVISION_RC, sizeof(STR_REVISION_RC) - 1, FIRMWARE_REVISION_RC, version + 3);
        default: return false; // fail everything else
   1b348:	80 e0       	ldi	r24, 0x00	; 0
   1b34a:	34 c0       	rjmp	.+104    	; 0x1b3b4 <parse_version(char const*, unsigned int*)+0x7e>

// Parse a major.minor.revision version number.
// Return true if valid.
bool parse_version(const char *str, uint16_t version[4]) {
    for(uint8_t i = 0; i < 2; ++i){
        str = Number(str, version + i);
   1b34c:	b8 01       	movw	r22, r16
   1b34e:	6e 5f       	subi	r22, 0xFE	; 254
   1b350:	7f 4f       	sbci	r23, 0xFF	; 255
   1b352:	01 96       	adiw	r24, 0x01	; 1
   1b354:	0e 94 cf bd 	call	0x17b9e	; 0x17b9e <Number(char const*, unsigned int*)>
        if (*str != '.')
   1b358:	fc 01       	movw	r30, r24
   1b35a:	20 81       	ld	r18, Z
   1b35c:	2e 32       	cpi	r18, 0x2E	; 46
   1b35e:	a1 f7       	brne	.-24     	; 0x1b348 <parse_version(char const*, unsigned int*)+0x12>
            return false;
        ++str;
    }
    str = Number(str, version + 2);
   1b360:	b8 01       	movw	r22, r16
   1b362:	6c 5f       	subi	r22, 0xFC	; 252
   1b364:	7f 4f       	sbci	r23, 0xFF	; 255
   1b366:	01 96       	adiw	r24, 0x01	; 1
   1b368:	0e 94 cf bd 	call	0x17b9e	; 0x17b9e <Number(char const*, unsigned int*)>

    version[3] = FIRMWARE_REVISION_RELEASED;
   1b36c:	20 e4       	ldi	r18, 0x40	; 64
   1b36e:	30 e0       	ldi	r19, 0x00	; 0
   1b370:	f8 01       	movw	r30, r16
   1b372:	37 83       	std	Z+7, r19	; 0x07
   1b374:	26 83       	std	Z+6, r18	; 0x06
   1b376:	fc 01       	movw	r30, r24
   1b378:	df 01       	movw	r26, r30

    // skip everything else until eol or '-'
    for(;;){
        if(is_whitespace_or_nl_or_eol(*str)){
   1b37a:	91 91       	ld	r25, Z+
    return c == ' ' || c == '\t' || c == '\n' || c == '\r';
}

inline bool is_whitespace_or_nl_or_eol(char c)
{
    return c == 0 || c == ' ' || c == '\t' || c == '\n' || c == '\r';
   1b37c:	89 2f       	mov	r24, r25
   1b37e:	8f 7d       	andi	r24, 0xDF	; 223
   1b380:	c1 f1       	breq	.+112    	; 0x1b3f2 <parse_version(char const*, unsigned int*)+0xbc>
   1b382:	87 ef       	ldi	r24, 0xF7	; 247
   1b384:	89 0f       	add	r24, r25
   1b386:	82 30       	cpi	r24, 0x02	; 2
   1b388:	a0 f1       	brcs	.+104    	; 0x1b3f2 <parse_version(char const*, unsigned int*)+0xbc>
   1b38a:	9d 30       	cpi	r25, 0x0D	; 13
   1b38c:	91 f1       	breq	.+100    	; 0x1b3f2 <parse_version(char const*, unsigned int*)+0xbc>
    for(;;){
        if(is_whitespace_or_nl_or_eol(*str)){
            // speculatively reached the end of line, silently ignoring anything which is not a '-'
            return true;
        }
        if( *str == '-'){
   1b38e:	9d 32       	cpi	r25, 0x2D	; 45
   1b390:	99 f7       	brne	.-26     	; 0x1b378 <parse_version(char const*, unsigned int*)+0x42>
//    SERIAL_ECHO('.');
//    SERIAL_ECHO(version[2]);
//    SERIAL_ECHO('.');
//    SERIAL_ECHOLN(version[3]);
    if (*str++ == '-') {
        switch(*str){
   1b392:	11 96       	adiw	r26, 0x01	; 1
   1b394:	9c 91       	ld	r25, X
   1b396:	92 34       	cpi	r25, 0x42	; 66
   1b398:	e1 f0       	breq	.+56     	; 0x1b3d2 <parse_version(char const*, unsigned int*)+0x9c>
   1b39a:	7c f4       	brge	.+30     	; 0x1b3ba <parse_version(char const*, unsigned int*)+0x84>
   1b39c:	91 34       	cpi	r25, 0x41	; 65
   1b39e:	a1 f6       	brne	.-88     	; 0x1b348 <parse_version(char const*, unsigned int*)+0x12>
        case 'A': // expect ALPHA
            static_assert(sizeof(STR_REVISION_ALPHA) == 6);
            return Tag( str, STR_REVISION_ALPHA, sizeof(STR_REVISION_ALPHA) - 1, FIRMWARE_REVISION_ALPHA, version + 3);
   1b3a0:	0a 5f       	subi	r16, 0xFA	; 250
   1b3a2:	1f 4f       	sbci	r17, 0xFF	; 255
   1b3a4:	28 e0       	ldi	r18, 0x08	; 8
   1b3a6:	30 e0       	ldi	r19, 0x00	; 0
   1b3a8:	45 e0       	ldi	r20, 0x05	; 5
   1b3aa:	6a e2       	ldi	r22, 0x2A	; 42
   1b3ac:	75 e8       	ldi	r23, 0x85	; 133
        case 'D': // expect DEV
            static_assert(sizeof(STR_REVISION_DEV) == 4);
            return Tag( str, STR_REVISION_DEV, sizeof(STR_REVISION_DEV) - 1, FIRMWARE_REVISION_DEV, version + 3);
        case 'R': // expect RC
            static_assert(sizeof(STR_REVISION_RC) == 3);
            return Tag( str, STR_REVISION_RC, sizeof(STR_REVISION_RC) - 1, FIRMWARE_REVISION_RC, version + 3);
   1b3ae:	cf 01       	movw	r24, r30
   1b3b0:	0e 94 1f c4 	call	0x1883e	; 0x1883e <Tag(char const*, char const*, unsigned char, unsigned int, unsigned int*)>
//    SERIAL_ECHO('.');
//    SERIAL_ECHO(version[2]);
//    SERIAL_ECHO('.');
//    SERIAL_ECHOLN(version[3]);
    return false;
}
   1b3b4:	1f 91       	pop	r17
   1b3b6:	0f 91       	pop	r16
   1b3b8:	08 95       	ret
//    SERIAL_ECHO('.');
//    SERIAL_ECHO(version[2]);
//    SERIAL_ECHO('.');
//    SERIAL_ECHOLN(version[3]);
    if (*str++ == '-') {
        switch(*str){
   1b3ba:	94 34       	cpi	r25, 0x44	; 68
   1b3bc:	91 f0       	breq	.+36     	; 0x1b3e2 <parse_version(char const*, unsigned int*)+0xac>
   1b3be:	92 35       	cpi	r25, 0x52	; 82
   1b3c0:	19 f6       	brne	.-122    	; 0x1b348 <parse_version(char const*, unsigned int*)+0x12>
        case 'D': // expect DEV
            static_assert(sizeof(STR_REVISION_DEV) == 4);
            return Tag( str, STR_REVISION_DEV, sizeof(STR_REVISION_DEV) - 1, FIRMWARE_REVISION_DEV, version + 3);
        case 'R': // expect RC
            static_assert(sizeof(STR_REVISION_RC) == 3);
            return Tag( str, STR_REVISION_RC, sizeof(STR_REVISION_RC) - 1, FIRMWARE_REVISION_RC, version + 3);
   1b3c2:	0a 5f       	subi	r16, 0xFA	; 250
   1b3c4:	1f 4f       	sbci	r17, 0xFF	; 255
   1b3c6:	20 e2       	ldi	r18, 0x20	; 32
   1b3c8:	30 e0       	ldi	r19, 0x00	; 0
   1b3ca:	42 e0       	ldi	r20, 0x02	; 2
   1b3cc:	6e e1       	ldi	r22, 0x1E	; 30
   1b3ce:	75 e8       	ldi	r23, 0x85	; 133
   1b3d0:	ee cf       	rjmp	.-36     	; 0x1b3ae <parse_version(char const*, unsigned int*)+0x78>
        case 'A': // expect ALPHA
            static_assert(sizeof(STR_REVISION_ALPHA) == 6);
            return Tag( str, STR_REVISION_ALPHA, sizeof(STR_REVISION_ALPHA) - 1, FIRMWARE_REVISION_ALPHA, version + 3);
        case 'B': // expect BETA
            static_assert(sizeof(STR_REVISION_BETA) == 5);
            return Tag( str, STR_REVISION_BETA, sizeof(STR_REVISION_BETA) - 1, FIRMWARE_REVISION_BETA, version + 3);
   1b3d2:	0a 5f       	subi	r16, 0xFA	; 250
   1b3d4:	1f 4f       	sbci	r17, 0xFF	; 255
   1b3d6:	20 e1       	ldi	r18, 0x10	; 16
   1b3d8:	30 e0       	ldi	r19, 0x00	; 0
   1b3da:	44 e0       	ldi	r20, 0x04	; 4
   1b3dc:	65 e2       	ldi	r22, 0x25	; 37
   1b3de:	75 e8       	ldi	r23, 0x85	; 133
   1b3e0:	e6 cf       	rjmp	.-52     	; 0x1b3ae <parse_version(char const*, unsigned int*)+0x78>
        case 'D': // expect DEV
            static_assert(sizeof(STR_REVISION_DEV) == 4);
            return Tag( str, STR_REVISION_DEV, sizeof(STR_REVISION_DEV) - 1, FIRMWARE_REVISION_DEV, version + 3);
   1b3e2:	0a 5f       	subi	r16, 0xFA	; 250
   1b3e4:	1f 4f       	sbci	r17, 0xFF	; 255
   1b3e6:	30 e0       	ldi	r19, 0x00	; 0
   1b3e8:	20 e0       	ldi	r18, 0x00	; 0
   1b3ea:	43 e0       	ldi	r20, 0x03	; 3
   1b3ec:	61 e2       	ldi	r22, 0x21	; 33
   1b3ee:	75 e8       	ldi	r23, 0x85	; 133
   1b3f0:	de cf       	rjmp	.-68     	; 0x1b3ae <parse_version(char const*, unsigned int*)+0x78>

    // skip everything else until eol or '-'
    for(;;){
        if(is_whitespace_or_nl_or_eol(*str)){
            // speculatively reached the end of line, silently ignoring anything which is not a '-'
            return true;
   1b3f2:	81 e0       	ldi	r24, 0x01	; 1
   1b3f4:	df cf       	rjmp	.-66     	; 0x1b3b4 <parse_version(char const*, unsigned int*)+0x7e>

0001b3f6 <lcd_updatestatus(char const*, bool) [clone .lto_priv.487]>:
}

static void lcd_updatestatus(const char *message, bool progmem = false)
{
    if (progmem)
        strncpy_P(lcd_status_message, message, LCD_WIDTH);
   1b3f6:	44 e1       	ldi	r20, 0x14	; 20
   1b3f8:	50 e0       	ldi	r21, 0x00	; 0
    return false;
}

static void lcd_updatestatus(const char *message, bool progmem = false)
{
    if (progmem)
   1b3fa:	66 23       	and	r22, r22
   1b3fc:	89 f0       	breq	.+34     	; 0x1b420 <lcd_updatestatus(char const*, bool) [clone .lto_priv.487]+0x2a>
        strncpy_P(lcd_status_message, message, LCD_WIDTH);
   1b3fe:	bc 01       	movw	r22, r24
   1b400:	85 e6       	ldi	r24, 0x65	; 101
   1b402:	94 e0       	ldi	r25, 0x04	; 4
   1b404:	0f 94 cd a1 	call	0x3439a	; 0x3439a <strncpy_P>
    else
        strncpy(lcd_status_message, message, LCD_WIDTH);

    lcd_status_message[LCD_WIDTH] = 0;
   1b408:	10 92 79 04 	sts	0x0479, r1	; 0x800479 <_ZL18lcd_status_message.lto_priv.424+0x14>
    lcd_status_message_idx = 0; // Print message from beginning
   1b40c:	10 92 64 04 	sts	0x0464, r1	; 0x800464 <_ZL22lcd_status_message_idx.lto_priv.419>

    SERIAL_PROTOCOLLNRPGM(MSG_LCD_STATUS_CHANGED);
   1b410:	85 e9       	ldi	r24, 0x95	; 149
   1b412:	98 e6       	ldi	r25, 0x68	; 104
   1b414:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>

    // hack lcd_draw_update to 1, i.e. without clear
    lcd_draw_update = 1;
   1b418:	81 e0       	ldi	r24, 0x01	; 1
   1b41a:	80 93 59 02 	sts	0x0259, r24	; 0x800259 <lcd_draw_update>
}
   1b41e:	08 95       	ret
static void lcd_updatestatus(const char *message, bool progmem = false)
{
    if (progmem)
        strncpy_P(lcd_status_message, message, LCD_WIDTH);
    else
        strncpy(lcd_status_message, message, LCD_WIDTH);
   1b420:	bc 01       	movw	r22, r24
   1b422:	85 e6       	ldi	r24, 0x65	; 101
   1b424:	94 e0       	ldi	r25, 0x04	; 4
   1b426:	0f 94 60 aa 	call	0x354c0	; 0x354c0 <strncpy>
   1b42a:	ee cf       	rjmp	.-36     	; 0x1b408 <lcd_updatestatus(char const*, bool) [clone .lto_priv.487]+0x12>

0001b42c <lcd_message_check(unsigned char) [clone .lto_priv.486]>:
}

static bool lcd_message_check(uint8_t priority)
{
    // regular priority check
    if (priority >= lcd_status_message_level)
   1b42c:	90 91 c0 03 	lds	r25, 0x03C0	; 0x8003c0 <_ZL24lcd_status_message_level.lto_priv.422>
   1b430:	89 17       	cp	r24, r25
   1b432:	80 f4       	brcc	.+32     	; 0x1b454 <lcd_message_check(unsigned char) [clone .lto_priv.486]+0x28>
        return true;

    // check if we can override an info message yet
    if (lcd_status_message_level == LCD_STATUS_INFO) {
   1b434:	91 30       	cpi	r25, 0x01	; 1
   1b436:	61 f4       	brne	.+24     	; 0x1b450 <lcd_message_check(unsigned char) [clone .lto_priv.486]+0x24>
}

template<typename T>
bool Timer<T>::expired_cont(T msPeriod)
{
    return !m_isRunning || expired(msPeriod);
   1b438:	80 91 7a 04 	lds	r24, 0x047A	; 0x80047a <_ZL26lcd_status_message_timeout.lto_priv.423>
   1b43c:	88 23       	and	r24, r24
   1b43e:	51 f0       	breq	.+20     	; 0x1b454 <lcd_message_check(unsigned char) [clone .lto_priv.486]+0x28>
   1b440:	40 e2       	ldi	r20, 0x20	; 32
   1b442:	5e e4       	ldi	r21, 0x4E	; 78
   1b444:	60 e0       	ldi	r22, 0x00	; 0
   1b446:	70 e0       	ldi	r23, 0x00	; 0
   1b448:	8a e7       	ldi	r24, 0x7A	; 122
   1b44a:	94 e0       	ldi	r25, 0x04	; 4
   1b44c:	0d 94 88 0e 	jmp	0x21d10	; 0x21d10 <Timer<unsigned long>::expired(unsigned long)>
        return lcd_status_message_timeout.expired_cont(LCD_STATUS_INFO_TIMEOUT);
    }

    return false;
   1b450:	80 e0       	ldi	r24, 0x00	; 0
   1b452:	08 95       	ret

static bool lcd_message_check(uint8_t priority)
{
    // regular priority check
    if (priority >= lcd_status_message_level)
        return true;
   1b454:	81 e0       	ldi	r24, 0x01	; 1
    if (lcd_status_message_level == LCD_STATUS_INFO) {
        return lcd_status_message_timeout.expired_cont(LCD_STATUS_INFO_TIMEOUT);
    }

    return false;
}
   1b456:	08 95       	ret

0001b458 <lcd_setalertstatuspgm(char const*, unsigned char)>:
{
    lcd_setalertstatus_(message, severity, false);
}

void lcd_setalertstatuspgm(const char* message, uint8_t severity)
{
   1b458:	ef 92       	push	r14
   1b45a:	ff 92       	push	r15
   1b45c:	1f 93       	push	r17
   1b45e:	cf 93       	push	r28
   1b460:	df 93       	push	r29
   1b462:	ec 01       	movw	r28, r24
   1b464:	16 2f       	mov	r17, r22
    lcd_status_message_timeout.start();
}

void lcd_setalertstatus_(const char* message, uint8_t severity, bool progmem)
{
    if (lcd_message_check(severity)) {
   1b466:	86 2f       	mov	r24, r22
   1b468:	0e 94 16 da 	call	0x1b42c	; 0x1b42c <lcd_message_check(unsigned char) [clone .lto_priv.486]>
   1b46c:	88 23       	and	r24, r24
   1b46e:	e9 f0       	breq	.+58     	; 0x1b4aa <lcd_setalertstatuspgm(char const*, unsigned char)+0x52>
        bool same = !(progmem?
            strcmp_P(lcd_status_message, message):
   1b470:	be 01       	movw	r22, r28
   1b472:	85 e6       	ldi	r24, 0x65	; 101
   1b474:	94 e0       	ldi	r25, 0x04	; 4
   1b476:	0f 94 8e a1 	call	0x3431c	; 0x3431c <strcmp_P>
   1b47a:	7c 01       	movw	r14, r24
            strcmp(lcd_status_message, message));
        lcd_status_message_timeout.start();
   1b47c:	8a e7       	ldi	r24, 0x7A	; 122
   1b47e:	94 e0       	ldi	r25, 0x04	; 4
   1b480:	0f 94 47 10 	call	0x2208e	; 0x2208e <Timer<unsigned long>::start()>
        lcd_status_message_level = severity;
   1b484:	10 93 c0 03 	sts	0x03C0, r17	; 0x8003c0 <_ZL24lcd_status_message_level.lto_priv.422>
        custom_message_type = CustomMsg::Status;
   1b488:	10 92 5d 06 	sts	0x065D, r1	; 0x80065d <custom_message_type>
        custom_message_state = 0;
   1b48c:	10 92 de 03 	sts	0x03DE, r1	; 0x8003de <custom_message_state>
        if (!same) {
   1b490:	ef 28       	or	r14, r15
   1b492:	59 f0       	breq	.+22     	; 0x1b4aa <lcd_setalertstatuspgm(char const*, unsigned char)+0x52>
            // do not kick the user out of the menus if the message is unchanged
            lcd_updatestatus(message, progmem);
   1b494:	61 e0       	ldi	r22, 0x01	; 1
   1b496:	ce 01       	movw	r24, r28
   1b498:	0e 94 fb d9 	call	0x1b3f6	; 0x1b3f6 <lcd_updatestatus(char const*, bool) [clone .lto_priv.487]>
}

void lcd_setalertstatuspgm(const char* message, uint8_t severity)
{
    lcd_setalertstatus_(message, severity, true);
}
   1b49c:	df 91       	pop	r29
   1b49e:	cf 91       	pop	r28
   1b4a0:	1f 91       	pop	r17
   1b4a2:	ff 90       	pop	r15
   1b4a4:	ef 90       	pop	r14
        custom_message_type = CustomMsg::Status;
        custom_message_state = 0;
        if (!same) {
            // do not kick the user out of the menus if the message is unchanged
            lcd_updatestatus(message, progmem);
            lcd_return_to_status();
   1b4a6:	0d 94 d5 07 	jmp	0x20faa	; 0x20faa <lcd_return_to_status()>
}

void lcd_setalertstatuspgm(const char* message, uint8_t severity)
{
    lcd_setalertstatus_(message, severity, true);
}
   1b4aa:	df 91       	pop	r29
   1b4ac:	cf 91       	pop	r28
   1b4ae:	1f 91       	pop	r17
   1b4b0:	ff 90       	pop	r15
   1b4b2:	ef 90       	pop	r14
   1b4b4:	08 95       	ret

0001b4b6 <lcd_selftest_error(TestError, char const*, char const*)>:
	manage_inactivity(true);
	return _stepresult;

}
static void lcd_selftest_error(TestError testError, const char *_error_1, const char *_error_2)
{
   1b4b6:	ef 92       	push	r14
   1b4b8:	ff 92       	push	r15
   1b4ba:	1f 93       	push	r17
   1b4bc:	cf 93       	push	r28
   1b4be:	df 93       	push	r29
   1b4c0:	18 2f       	mov	r17, r24
   1b4c2:	eb 01       	movw	r28, r22
   1b4c4:	7a 01       	movw	r14, r20
   1b4c6:	80 e0       	ldi	r24, 0x00	; 0
   1b4c8:	0f 94 ad 25 	call	0x24b5a	; 0x24b5a <Sound_MakeSound(eSOUND_TYPE)>
	lcd_beeper_quick_feedback();

    FORCE_BL_ON_END;

	target_temperature[0] = 0;
   1b4cc:	10 92 5e 12 	sts	0x125E, r1	; 0x80125e <target_temperature+0x1>
   1b4d0:	10 92 5d 12 	sts	0x125D, r1	; 0x80125d <target_temperature>
	target_temperature_bed = 0;
   1b4d4:	10 92 5a 12 	sts	0x125A, r1	; 0x80125a <target_temperature_bed+0x1>
   1b4d8:	10 92 59 12 	sts	0x1259, r1	; 0x801259 <target_temperature_bed>
	manage_heater();
   1b4dc:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
	manage_inactivity();
   1b4e0:	80 e0       	ldi	r24, 0x00	; 0
   1b4e2:	0e 94 34 8c 	call	0x11868	; 0x11868 <manage_inactivity(bool)>

	lcd_clear();
   1b4e6:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>

	lcd_puts_at_P(0, 0, _T(MSG_SELFTEST_ERROR));
   1b4ea:	89 ee       	ldi	r24, 0xE9	; 233
   1b4ec:	99 e4       	ldi	r25, 0x49	; 73
   1b4ee:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1b4f2:	ac 01       	movw	r20, r24
   1b4f4:	60 e0       	ldi	r22, 0x00	; 0
   1b4f6:	80 e0       	ldi	r24, 0x00	; 0
   1b4f8:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
	lcd_puts_at_P(0, 1, _T(MSG_SELFTEST_PLEASECHECK));
   1b4fc:	89 ed       	ldi	r24, 0xD9	; 217
   1b4fe:	99 e4       	ldi	r25, 0x49	; 73
   1b500:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1b504:	ac 01       	movw	r20, r24
   1b506:	61 e0       	ldi	r22, 0x01	; 1
   1b508:	80 e0       	ldi	r24, 0x00	; 0
   1b50a:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>

	switch (testError)
   1b50e:	11 50       	subi	r17, 0x01	; 1
   1b510:	1a 30       	cpi	r17, 0x0A	; 10
   1b512:	90 f4       	brcc	.+36     	; 0x1b538 <lcd_selftest_error(TestError, char const*, char const*)+0x82>
   1b514:	e1 2f       	mov	r30, r17
   1b516:	f0 e0       	ldi	r31, 0x00	; 0
   1b518:	88 27       	eor	r24, r24
   1b51a:	ee 56       	subi	r30, 0x6E	; 110
   1b51c:	f5 42       	sbci	r31, 0x25	; 37
   1b51e:	8f 4f       	sbci	r24, 0xFF	; 255
   1b520:	0d 94 f0 a4 	jmp	0x349e0	; 0x349e0 <__tablejump2__>
   1b524:	af da       	rcall	.-2722   	; 0x1aa84 <go_and_stop_1_step(unsigned char, int, unsigned int&, unsigned int&)+0xac>
   1b526:	bb da       	rcall	.-2698   	; 0x1aa9e <go_and_stop_1_step(unsigned char, int, unsigned int&, unsigned int&)+0xc6>
   1b528:	d3 da       	rcall	.-2650   	; 0x1aad0 <go_and_stop_1_step(unsigned char, int, unsigned int&, unsigned int&)+0xf8>
   1b52a:	19 db       	rcall	.-2510   	; 0x1ab5e <update_position_1_step(unsigned char, unsigned char) [clone .lto_priv.379]+0x40>
   1b52c:	25 db       	rcall	.-2486   	; 0x1ab78 <update_position_1_step(unsigned char, unsigned char) [clone .lto_priv.379]+0x5a>
   1b52e:	28 db       	rcall	.-2480   	; 0x1ab80 <update_position_1_step(unsigned char, unsigned char) [clone .lto_priv.379]+0x62>
   1b530:	2b db       	rcall	.-2474   	; 0x1ab88 <update_position_1_step(unsigned char, unsigned char) [clone .lto_priv.379]+0x6a>
   1b532:	2e db       	rcall	.-2468   	; 0x1ab90 <update_position_1_step(unsigned char, unsigned char) [clone .lto_priv.379]+0x72>
   1b534:	3a db       	rcall	.-2444   	; 0x1abaa <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0xc>
   1b536:	46 db       	rcall	.-2420   	; 0x1abc4 <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)+0x26>
	{
	case TestError::Heater:
		lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_HEATERTHERMISTOR));
   1b538:	85 ec       	ldi	r24, 0xC5	; 197
   1b53a:	99 e4       	ldi	r25, 0x49	; 73
   1b53c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1b540:	ac 01       	movw	r20, r24
   1b542:	62 e0       	ldi	r22, 0x02	; 2
   1b544:	80 e0       	ldi	r24, 0x00	; 0
   1b546:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
		lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_NOTCONNECTED));
   1b54a:	85 eb       	ldi	r24, 0xB5	; 181
   1b54c:	99 e4       	ldi	r25, 0x49	; 73
		lcd_set_cursor(18, 3);
		lcd_print(_error_1);
		break;
	case TestError::WiringFsensor:
		lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_FILAMENT_SENSOR));
		lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_WIRINGERROR));
   1b54e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1b552:	ac 01       	movw	r20, r24
   1b554:	63 e0       	ldi	r22, 0x03	; 3
   1b556:	80 e0       	ldi	r24, 0x00	; 0
   1b558:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
   1b55c:	44 c0       	rjmp	.+136    	; 0x1b5e6 <lcd_selftest_error(TestError, char const*, char const*)+0x130>
	case TestError::Heater:
		lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_HEATERTHERMISTOR));
		lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_NOTCONNECTED));
		break;
	case TestError::Bed:
		lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_BEDHEATER));
   1b55e:	88 ea       	ldi	r24, 0xA8	; 168
   1b560:	99 e4       	ldi	r25, 0x49	; 73
		lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_SWAPPED));
		lcd_set_cursor(18, 3);
		lcd_print(_error_1);
		break;
	case TestError::WiringFsensor:
		lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_FILAMENT_SENSOR));
   1b562:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1b566:	ac 01       	movw	r20, r24
   1b568:	62 e0       	ldi	r22, 0x02	; 2
   1b56a:	80 e0       	ldi	r24, 0x00	; 0
   1b56c:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
		lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_WIRINGERROR));
   1b570:	89 e9       	ldi	r24, 0x99	; 153
   1b572:	99 e4       	ldi	r25, 0x49	; 73
   1b574:	ec cf       	rjmp	.-40     	; 0x1b54e <lcd_selftest_error(TestError, char const*, char const*)+0x98>
	case TestError::Bed:
		lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_BEDHEATER));
		lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_WIRINGERROR));
		break;
	case TestError::Endstops:
		lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_ENDSTOPS));
   1b576:	8e e8       	ldi	r24, 0x8E	; 142
   1b578:	99 e4       	ldi	r25, 0x49	; 73
		lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_WIRINGERROR));
		lcd_set_cursor(18, 3);
		lcd_print(_error_1);
		break;
	case TestError::ExtruderFan:
		lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_HOTEND_FAN));
   1b57a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1b57e:	ac 01       	movw	r20, r24
   1b580:	62 e0       	ldi	r22, 0x02	; 2
   1b582:	80 e0       	ldi	r24, 0x00	; 0
   1b584:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
		lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_WIRINGERROR));
   1b588:	89 e9       	ldi	r24, 0x99	; 153
   1b58a:	99 e4       	ldi	r25, 0x49	; 73
		lcd_set_cursor(18, 3);
		lcd_print(_error_1);
		break;
	case TestError::SwappedFan:
		lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_FANS));
		lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_SWAPPED));
   1b58c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1b590:	ac 01       	movw	r20, r24
   1b592:	63 e0       	ldi	r22, 0x03	; 3
   1b594:	80 e0       	ldi	r24, 0x00	; 0
   1b596:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
		lcd_set_cursor(18, 3);
   1b59a:	63 e0       	ldi	r22, 0x03	; 3
   1b59c:	82 e1       	ldi	r24, 0x12	; 18
   1b59e:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
		lcd_print(_error_1);
   1b5a2:	ce 01       	movw	r24, r28
   1b5a4:	1e c0       	rjmp	.+60     	; 0x1b5e2 <lcd_selftest_error(TestError, char const*, char const*)+0x12c>
		lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_WIRINGERROR));
		lcd_set_cursor(18, 3);
		lcd_print(_error_1);
		break;
	case TestError::Motor:
		lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_MOTOR));
   1b5a6:	86 e8       	ldi	r24, 0x86	; 134
   1b5a8:	99 e4       	ldi	r25, 0x49	; 73
   1b5aa:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1b5ae:	ac 01       	movw	r20, r24
   1b5b0:	62 e0       	ldi	r22, 0x02	; 2
   1b5b2:	80 e0       	ldi	r24, 0x00	; 0
   1b5b4:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
		lcd_set_cursor(18, 2);
   1b5b8:	62 e0       	ldi	r22, 0x02	; 2
   1b5ba:	82 e1       	ldi	r24, 0x12	; 18
   1b5bc:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
		lcd_print(_error_1);
   1b5c0:	ce 01       	movw	r24, r28
   1b5c2:	0e 94 5f 73 	call	0xe6be	; 0xe6be <lcd_print(char const*)>
		lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_ENDSTOP));
   1b5c6:	8c e7       	ldi	r24, 0x7C	; 124
   1b5c8:	99 e4       	ldi	r25, 0x49	; 73
   1b5ca:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1b5ce:	ac 01       	movw	r20, r24
   1b5d0:	63 e0       	ldi	r22, 0x03	; 3
   1b5d2:	80 e0       	ldi	r24, 0x00	; 0
   1b5d4:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
		lcd_set_cursor(18, 3);
   1b5d8:	63 e0       	ldi	r22, 0x03	; 3
   1b5da:	82 e1       	ldi	r24, 0x12	; 18
   1b5dc:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
		lcd_print(_error_2);
   1b5e0:	c7 01       	movw	r24, r14
		break;
	case TestError::SwappedFan:
		lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_FANS));
		lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_SWAPPED));
		lcd_set_cursor(18, 3);
		lcd_print(_error_1);
   1b5e2:	0e 94 5f 73 	call	0xe6be	; 0xe6be <lcd_print(char const*)>
          lcd_set_cursor(0, 3);
          lcd_printf_P(_T(MSG_SELFTEST_FS_LEVEL),_error_1);
          break;
	}

	_delay(1000);
   1b5e6:	68 ee       	ldi	r22, 0xE8	; 232
   1b5e8:	73 e0       	ldi	r23, 0x03	; 3
   1b5ea:	80 e0       	ldi	r24, 0x00	; 0
   1b5ec:	90 e0       	ldi	r25, 0x00	; 0
   1b5ee:	0f 94 bd 0d 	call	0x21b7a	; 0x21b7a <delay2>
   1b5f2:	80 e0       	ldi	r24, 0x00	; 0
   1b5f4:	0f 94 ad 25 	call	0x24b5a	; 0x24b5a <Sound_MakeSound(eSOUND_TYPE)>
	lcd_beeper_quick_feedback();

	do {
		_delay(100);
   1b5f8:	64 e6       	ldi	r22, 0x64	; 100
   1b5fa:	70 e0       	ldi	r23, 0x00	; 0
   1b5fc:	80 e0       	ldi	r24, 0x00	; 0
   1b5fe:	90 e0       	ldi	r25, 0x00	; 0
   1b600:	0f 94 bd 0d 	call	0x21b7a	; 0x21b7a <delay2>
		manage_heater();
   1b604:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
		manage_inactivity();
   1b608:	80 e0       	ldi	r24, 0x00	; 0
   1b60a:	0e 94 34 8c 	call	0x11868	; 0x11868 <manage_inactivity(bool)>
	} while (!lcd_clicked());
   1b60e:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   1b612:	88 23       	and	r24, r24
   1b614:	89 f3       	breq	.-30     	; 0x1b5f8 <lcd_selftest_error(TestError, char const*, char const*)+0x142>

	LCD_ALERTMESSAGERPGM(_T(MSG_SELFTEST_FAILED));
   1b616:	8b e3       	ldi	r24, 0x3B	; 59
   1b618:	9a e4       	ldi	r25, 0x4A	; 74
   1b61a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1b61e:	62 e0       	ldi	r22, 0x02	; 2
   1b620:	0e 94 2c da 	call	0x1b458	; 0x1b458 <lcd_setalertstatuspgm(char const*, unsigned char)>
	lcd_return_to_status();

}
   1b624:	df 91       	pop	r29
   1b626:	cf 91       	pop	r28
   1b628:	1f 91       	pop	r17
   1b62a:	ff 90       	pop	r15
   1b62c:	ef 90       	pop	r14
		manage_heater();
		manage_inactivity();
	} while (!lcd_clicked());

	LCD_ALERTMESSAGERPGM(_T(MSG_SELFTEST_FAILED));
	lcd_return_to_status();
   1b62e:	0d 94 d5 07 	jmp	0x20faa	; 0x20faa <lcd_return_to_status()>
		lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_ENDSTOP));
		lcd_set_cursor(18, 3);
		lcd_print(_error_2);
		break;
	case TestError::Endstop:
		lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_ENDSTOP_NOTHIT));
   1b632:	8a e6       	ldi	r24, 0x6A	; 106
   1b634:	99 e4       	ldi	r25, 0x49	; 73
		lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_WIRINGERROR));
		lcd_set_cursor(18, 3);
		lcd_print(_error_1);
		break;
	case TestError::Pulley:
		lcd_puts_at_P(0, 2, _T(MSG_LOOSE_PULLEY));
   1b636:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1b63a:	ac 01       	movw	r20, r24
   1b63c:	62 e0       	ldi	r22, 0x02	; 2
   1b63e:	80 e0       	ldi	r24, 0x00	; 0
   1b640:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
		lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_MOTOR));
   1b644:	86 e8       	ldi	r24, 0x86	; 134
   1b646:	99 e4       	ldi	r25, 0x49	; 73
   1b648:	a1 cf       	rjmp	.-190    	; 0x1b58c <lcd_selftest_error(TestError, char const*, char const*)+0xd6>
		lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_MOTOR));
		lcd_set_cursor(18, 3);
		lcd_print(_error_1);
		break;
	case TestError::PrintFan:
		lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_PART_FAN));
   1b64a:	8a e5       	ldi	r24, 0x5A	; 90
   1b64c:	9d e5       	ldi	r25, 0x5D	; 93
   1b64e:	95 cf       	rjmp	.-214    	; 0x1b57a <lcd_selftest_error(TestError, char const*, char const*)+0xc4>
		lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_WIRINGERROR));
		lcd_set_cursor(18, 3);
		lcd_print(_error_1);
		break;
	case TestError::ExtruderFan:
		lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_HOTEND_FAN));
   1b650:	87 e4       	ldi	r24, 0x47	; 71
   1b652:	9d e5       	ldi	r25, 0x5D	; 93
   1b654:	92 cf       	rjmp	.-220    	; 0x1b57a <lcd_selftest_error(TestError, char const*, char const*)+0xc4>
		lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_WIRINGERROR));
		lcd_set_cursor(18, 3);
		lcd_print(_error_1);
		break;
	case TestError::Pulley:
		lcd_puts_at_P(0, 2, _T(MSG_LOOSE_PULLEY));
   1b656:	8b e5       	ldi	r24, 0x5B	; 91
   1b658:	99 e4       	ldi	r25, 0x49	; 73
   1b65a:	ed cf       	rjmp	.-38     	; 0x1b636 <lcd_selftest_error(TestError, char const*, char const*)+0x180>
		lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_MOTOR));
		lcd_set_cursor(18, 3);
		lcd_print(_error_1);
		break;
	case TestError::Axis:
		lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_AXIS_LENGTH));
   1b65c:	8d e4       	ldi	r24, 0x4D	; 77
   1b65e:	99 e4       	ldi	r25, 0x49	; 73
   1b660:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1b664:	ac 01       	movw	r20, r24
   1b666:	62 e0       	ldi	r22, 0x02	; 2
   1b668:	80 e0       	ldi	r24, 0x00	; 0
   1b66a:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
		lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_AXIS));
   1b66e:	86 e4       	ldi	r24, 0x46	; 70
   1b670:	99 e4       	ldi	r25, 0x49	; 73
   1b672:	8c cf       	rjmp	.-232    	; 0x1b58c <lcd_selftest_error(TestError, char const*, char const*)+0xd6>
		lcd_set_cursor(18, 3);
		lcd_print(_error_1);
		break;
	case TestError::SwappedFan:
		lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_FANS));
   1b674:	84 e3       	ldi	r24, 0x34	; 52
   1b676:	99 e4       	ldi	r25, 0x49	; 73
   1b678:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1b67c:	ac 01       	movw	r20, r24
   1b67e:	62 e0       	ldi	r22, 0x02	; 2
   1b680:	80 e0       	ldi	r24, 0x00	; 0
   1b682:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
		lcd_puts_at_P(0, 3, _T(MSG_SELFTEST_SWAPPED));
   1b686:	8a e2       	ldi	r24, 0x2A	; 42
   1b688:	99 e4       	ldi	r25, 0x49	; 73
   1b68a:	80 cf       	rjmp	.-256    	; 0x1b58c <lcd_selftest_error(TestError, char const*, char const*)+0xd6>
		lcd_set_cursor(18, 3);
		lcd_print(_error_1);
		break;
	case TestError::WiringFsensor:
		lcd_puts_at_P(0, 2, _T(MSG_SELFTEST_FILAMENT_SENSOR));
   1b68c:	8b ef       	ldi	r24, 0xFB	; 251
   1b68e:	99 e4       	ldi	r25, 0x49	; 73
   1b690:	68 cf       	rjmp	.-304    	; 0x1b562 <lcd_selftest_error(TestError, char const*, char const*)+0xac>

0001b692 <lcd_selfcheck_check_heater(bool)>:
	manage_inactivity(true);
	return _result;
}

static bool lcd_selfcheck_check_heater(bool _isbed)
{
   1b692:	8f 92       	push	r8
   1b694:	9f 92       	push	r9
   1b696:	af 92       	push	r10
   1b698:	bf 92       	push	r11
   1b69a:	cf 92       	push	r12
   1b69c:	df 92       	push	r13
   1b69e:	ef 92       	push	r14
   1b6a0:	ff 92       	push	r15
   1b6a2:	0f 93       	push	r16
   1b6a4:	1f 93       	push	r17
   1b6a6:	cf 93       	push	r28
   1b6a8:	df 93       	push	r29
   1b6aa:	f8 2e       	mov	r15, r24
   1b6ac:	60 91 5a 0d 	lds	r22, 0x0D5A	; 0x800d5a <current_temperature>
   1b6b0:	70 91 5b 0d 	lds	r23, 0x0D5B	; 0x800d5b <current_temperature+0x1>
   1b6b4:	80 91 5c 0d 	lds	r24, 0x0D5C	; 0x800d5c <current_temperature+0x2>
   1b6b8:	90 91 5d 0d 	lds	r25, 0x0D5D	; 0x800d5d <current_temperature+0x3>
   1b6bc:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   1b6c0:	4b 01       	movw	r8, r22
   1b6c2:	6b 01       	movw	r12, r22
   1b6c4:	60 91 bc 03 	lds	r22, 0x03BC	; 0x8003bc <current_temperature_bed>
   1b6c8:	70 91 bd 03 	lds	r23, 0x03BD	; 0x8003bd <current_temperature_bed+0x1>
   1b6cc:	80 91 be 03 	lds	r24, 0x03BE	; 0x8003be <current_temperature_bed+0x2>
   1b6d0:	90 91 bf 03 	lds	r25, 0x03BF	; 0x8003bf <current_temperature_bed+0x3>
   1b6d4:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   1b6d8:	eb 01       	movw	r28, r22
	uint8_t _progress = 0;
	int _checked_snapshot = (_isbed) ? degBed() : degHotend(0);
	int _opposite_snapshot = (_isbed) ? degHotend(0) : degBed();
	uint8_t _cycles = (_isbed) ? 180 : 60; //~ 90s / 30s
   1b6da:	9c e3       	ldi	r25, 0x3C	; 60
   1b6dc:	a9 2e       	mov	r10, r25

	target_temperature[0] = (_isbed) ? 0 : 200;
   1b6de:	88 ec       	ldi	r24, 0xC8	; 200
   1b6e0:	90 e0       	ldi	r25, 0x00	; 0
}

static bool lcd_selfcheck_check_heater(bool _isbed)
{
	uint8_t _progress = 0;
	int _checked_snapshot = (_isbed) ? degBed() : degHotend(0);
   1b6e2:	ff 20       	and	r15, r15
   1b6e4:	31 f0       	breq	.+12     	; 0x1b6f2 <lcd_selfcheck_check_heater(bool)+0x60>
   1b6e6:	6b 01       	movw	r12, r22
	int _opposite_snapshot = (_isbed) ? degHotend(0) : degBed();
   1b6e8:	e4 01       	movw	r28, r8
	uint8_t _cycles = (_isbed) ? 180 : 60; //~ 90s / 30s
   1b6ea:	24 eb       	ldi	r18, 0xB4	; 180
   1b6ec:	a2 2e       	mov	r10, r18

	target_temperature[0] = (_isbed) ? 0 : 200;
   1b6ee:	90 e0       	ldi	r25, 0x00	; 0
   1b6f0:	80 e0       	ldi	r24, 0x00	; 0
   1b6f2:	90 93 5e 12 	sts	0x125E, r25	; 0x80125e <target_temperature+0x1>
   1b6f6:	80 93 5d 12 	sts	0x125D, r24	; 0x80125d <target_temperature>
	target_temperature_bed = (_isbed) ? 100 : 0;
   1b6fa:	84 e6       	ldi	r24, 0x64	; 100
   1b6fc:	90 e0       	ldi	r25, 0x00	; 0
   1b6fe:	f1 10       	cpse	r15, r1
   1b700:	02 c0       	rjmp	.+4      	; 0x1b706 <lcd_selfcheck_check_heater(bool)+0x74>
   1b702:	90 e0       	ldi	r25, 0x00	; 0
   1b704:	80 e0       	ldi	r24, 0x00	; 0
   1b706:	90 93 5a 12 	sts	0x125A, r25	; 0x80125a <target_temperature_bed+0x1>
   1b70a:	80 93 59 12 	sts	0x1259, r24	; 0x801259 <target_temperature_bed>
#ifdef THERMAL_MODEL
	bool tm_was_enabled = thermal_model_enabled();
	thermal_model_set_enabled(false);
#endif //THERMAL_MODEL
	manage_heater();
   1b70e:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
	manage_inactivity(true);
   1b712:	81 e0       	ldi	r24, 0x01	; 1
   1b714:	0e 94 34 8c 	call	0x11868	; 0x11868 <manage_inactivity(bool)>

    for(uint8_t _counter = 0; _counter < _cycles && !Stopped; ++_counter)
   1b718:	e1 2c       	mov	r14, r1
	return _result;
}

static bool lcd_selfcheck_check_heater(bool _isbed)
{
	uint8_t _progress = 0;
   1b71a:	b1 2c       	mov	r11, r1
		}
		else {
			MYSERIAL.print("Hotend temp:");
			MYSERIAL.println(degHotend(0));
		}*/
		if(_counter%5 == 0) serialecho_temperatures(); //show temperatures once in two seconds
   1b71c:	85 e0       	ldi	r24, 0x05	; 5
   1b71e:	98 2e       	mov	r9, r24
	thermal_model_set_enabled(false);
#endif //THERMAL_MODEL
	manage_heater();
	manage_inactivity(true);

    for(uint8_t _counter = 0; _counter < _cycles && !Stopped; ++_counter)
   1b720:	80 91 3b 12 	lds	r24, 0x123B	; 0x80123b <Stopped>
   1b724:	81 11       	cpse	r24, r1
   1b726:	1c c0       	rjmp	.+56     	; 0x1b760 <lcd_selfcheck_check_heater(bool)+0xce>
    {
		manage_heater();
   1b728:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
		manage_inactivity(true);
   1b72c:	81 e0       	ldi	r24, 0x01	; 1
   1b72e:	0e 94 34 8c 	call	0x11868	; 0x11868 <manage_inactivity(bool)>
		_progress = (_isbed?
   1b732:	00 e9       	ldi	r16, 0x90	; 144
   1b734:	11 e0       	ldi	r17, 0x01	; 1
   1b736:	20 e0       	ldi	r18, 0x00	; 0
   1b738:	42 e0       	ldi	r20, 0x02	; 2
   1b73a:	6b 2d       	mov	r22, r11
   1b73c:	87 e0       	ldi	r24, 0x07	; 7
   1b73e:	f1 10       	cpse	r15, r1
   1b740:	01 c0       	rjmp	.+2      	; 0x1b744 <lcd_selfcheck_check_heater(bool)+0xb2>
   1b742:	88 e0       	ldi	r24, 0x08	; 8
   1b744:	0e 94 f8 c4 	call	0x189f0	; 0x189f0 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
   1b748:	b8 2e       	mov	r11, r24
		}
		else {
			MYSERIAL.print("Hotend temp:");
			MYSERIAL.println(degHotend(0));
		}*/
		if(_counter%5 == 0) serialecho_temperatures(); //show temperatures once in two seconds
   1b74a:	8e 2d       	mov	r24, r14
   1b74c:	69 2d       	mov	r22, r9
   1b74e:	0f 94 8f a4 	call	0x3491e	; 0x3491e <__udivmodqi4>
   1b752:	91 11       	cpse	r25, r1
   1b754:	02 c0       	rjmp	.+4      	; 0x1b75a <lcd_selfcheck_check_heater(bool)+0xc8>
   1b756:	0e 94 d2 7a 	call	0xf5a4	; 0xf5a4 <serialecho_temperatures()>
	thermal_model_set_enabled(false);
#endif //THERMAL_MODEL
	manage_heater();
	manage_inactivity(true);

    for(uint8_t _counter = 0; _counter < _cycles && !Stopped; ++_counter)
   1b75a:	e3 94       	inc	r14
   1b75c:	ea 10       	cpse	r14, r10
   1b75e:	e0 cf       	rjmp	.-64     	; 0x1b720 <lcd_selfcheck_check_heater(bool)+0x8e>
			MYSERIAL.println(degHotend(0));
		}*/
		if(_counter%5 == 0) serialecho_temperatures(); //show temperatures once in two seconds
	}

	target_temperature[0] = 0;
   1b760:	10 92 5e 12 	sts	0x125E, r1	; 0x80125e <target_temperature+0x1>
   1b764:	10 92 5d 12 	sts	0x125D, r1	; 0x80125d <target_temperature>
	target_temperature_bed = 0;
   1b768:	10 92 5a 12 	sts	0x125A, r1	; 0x80125a <target_temperature_bed+0x1>
   1b76c:	10 92 59 12 	sts	0x1259, r1	; 0x801259 <target_temperature_bed>
	manage_heater();
   1b770:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
   1b774:	b6 01       	movw	r22, r12
   1b776:	dd 0c       	add	r13, r13
   1b778:	88 0b       	sbc	r24, r24
   1b77a:	99 0b       	sbc	r25, r25
   1b77c:	4e 01       	movw	r8, r28
   1b77e:	dd 0f       	add	r29, r29
   1b780:	aa 08       	sbc	r10, r10
   1b782:	bb 08       	sbc	r11, r11

	int _checked_result = (_isbed) ? degBed() - _checked_snapshot : degHotend(0) - _checked_snapshot;
   1b784:	ff 20       	and	r15, r15
   1b786:	09 f4       	brne	.+2      	; 0x1b78a <lcd_selfcheck_check_heater(bool)+0xf8>
   1b788:	4d c0       	rjmp	.+154    	; 0x1b824 <lcd_selfcheck_check_heater(bool)+0x192>
   1b78a:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   1b78e:	9b 01       	movw	r18, r22
   1b790:	ac 01       	movw	r20, r24
   1b792:	60 91 bc 03 	lds	r22, 0x03BC	; 0x8003bc <current_temperature_bed>
   1b796:	70 91 bd 03 	lds	r23, 0x03BD	; 0x8003bd <current_temperature_bed+0x1>
   1b79a:	80 91 be 03 	lds	r24, 0x03BE	; 0x8003be <current_temperature_bed+0x2>
   1b79e:	90 91 bf 03 	lds	r25, 0x03BF	; 0x8003bf <current_temperature_bed+0x3>
   1b7a2:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   1b7a6:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   1b7aa:	eb 01       	movw	r28, r22
	int _opposite_result = (_isbed) ? degHotend(0) - _opposite_snapshot : degBed() - _opposite_snapshot;
   1b7ac:	c5 01       	movw	r24, r10
   1b7ae:	b4 01       	movw	r22, r8
   1b7b0:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   1b7b4:	9b 01       	movw	r18, r22
   1b7b6:	ac 01       	movw	r20, r24
   1b7b8:	60 91 5a 0d 	lds	r22, 0x0D5A	; 0x800d5a <current_temperature>
   1b7bc:	70 91 5b 0d 	lds	r23, 0x0D5B	; 0x800d5b <current_temperature+0x1>
   1b7c0:	80 91 5c 0d 	lds	r24, 0x0D5C	; 0x800d5c <current_temperature+0x2>
   1b7c4:	90 91 5d 0d 	lds	r25, 0x0D5D	; 0x800d5d <current_temperature+0x3>
   1b7c8:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   1b7cc:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
	MYSERIAL.print("Opposite result:");
	MYSERIAL.println(_opposite_result);
	*/

    bool _stepresult = false;
    if (Stopped || _opposite_result < ((_isbed) ? 30 : 9))
   1b7d0:	10 91 3b 12 	lds	r17, 0x123B	; 0x80123b <Stopped>
   1b7d4:	11 11       	cpse	r17, r1
   1b7d6:	0c c0       	rjmp	.+24     	; 0x1b7f0 <lcd_selfcheck_check_heater(bool)+0x15e>
   1b7d8:	f1 10       	cpse	r15, r1
   1b7da:	44 c0       	rjmp	.+136    	; 0x1b864 <lcd_selfcheck_check_heater(bool)+0x1d2>
   1b7dc:	69 30       	cpi	r22, 0x09	; 9
   1b7de:	71 05       	cpc	r23, r1
   1b7e0:	0c f0       	brlt	.+2      	; 0x1b7e4 <lcd_selfcheck_check_heater(bool)+0x152>
   1b7e2:	46 c0       	rjmp	.+140    	; 0x1b870 <lcd_selfcheck_check_heater(bool)+0x1de>
    {
        if (!Stopped && _checked_result >= ((_isbed) ? 9 : 30))
   1b7e4:	8e e1       	ldi	r24, 0x1E	; 30
   1b7e6:	90 e0       	ldi	r25, 0x00	; 0
            _stepresult = true;
   1b7e8:	11 e0       	ldi	r17, 0x01	; 1
	*/

    bool _stepresult = false;
    if (Stopped || _opposite_result < ((_isbed) ? 30 : 9))
    {
        if (!Stopped && _checked_result >= ((_isbed) ? 9 : 30))
   1b7ea:	c8 17       	cp	r28, r24
   1b7ec:	d9 07       	cpc	r29, r25
   1b7ee:	3c f4       	brge	.+14     	; 0x1b7fe <lcd_selfcheck_check_heater(bool)+0x16c>
            _stepresult = true;
        else
            lcd_selftest_error(TestError::Heater, "", "");
   1b7f0:	4f ed       	ldi	r20, 0xDF	; 223
   1b7f2:	52 e0       	ldi	r21, 0x02	; 2
   1b7f4:	ba 01       	movw	r22, r20
   1b7f6:	80 e0       	ldi	r24, 0x00	; 0
   1b7f8:	0e 94 5b da 	call	0x1b4b6	; 0x1b4b6 <lcd_selftest_error(TestError, char const*, char const*)>
	MYSERIAL.println(_checked_result);
	MYSERIAL.print("Opposite result:");
	MYSERIAL.println(_opposite_result);
	*/

    bool _stepresult = false;
   1b7fc:	10 e0       	ldi	r17, 0x00	; 0
    }

#ifdef THERMAL_MODEL
	thermal_model_set_enabled(tm_was_enabled);
#endif //THERMAL_MODEL
	manage_heater();
   1b7fe:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
	manage_inactivity(true);
   1b802:	81 e0       	ldi	r24, 0x01	; 1
   1b804:	0e 94 34 8c 	call	0x11868	; 0x11868 <manage_inactivity(bool)>
	return _stepresult;

}
   1b808:	81 2f       	mov	r24, r17
   1b80a:	df 91       	pop	r29
   1b80c:	cf 91       	pop	r28
   1b80e:	1f 91       	pop	r17
   1b810:	0f 91       	pop	r16
   1b812:	ff 90       	pop	r15
   1b814:	ef 90       	pop	r14
   1b816:	df 90       	pop	r13
   1b818:	cf 90       	pop	r12
   1b81a:	bf 90       	pop	r11
   1b81c:	af 90       	pop	r10
   1b81e:	9f 90       	pop	r9
   1b820:	8f 90       	pop	r8
   1b822:	08 95       	ret

	target_temperature[0] = 0;
	target_temperature_bed = 0;
	manage_heater();

	int _checked_result = (_isbed) ? degBed() - _checked_snapshot : degHotend(0) - _checked_snapshot;
   1b824:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   1b828:	9b 01       	movw	r18, r22
   1b82a:	ac 01       	movw	r20, r24
   1b82c:	60 91 5a 0d 	lds	r22, 0x0D5A	; 0x800d5a <current_temperature>
   1b830:	70 91 5b 0d 	lds	r23, 0x0D5B	; 0x800d5b <current_temperature+0x1>
   1b834:	80 91 5c 0d 	lds	r24, 0x0D5C	; 0x800d5c <current_temperature+0x2>
   1b838:	90 91 5d 0d 	lds	r25, 0x0D5D	; 0x800d5d <current_temperature+0x3>
   1b83c:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   1b840:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   1b844:	eb 01       	movw	r28, r22
	int _opposite_result = (_isbed) ? degHotend(0) - _opposite_snapshot : degBed() - _opposite_snapshot;
   1b846:	c5 01       	movw	r24, r10
   1b848:	b4 01       	movw	r22, r8
   1b84a:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   1b84e:	9b 01       	movw	r18, r22
   1b850:	ac 01       	movw	r20, r24
   1b852:	60 91 bc 03 	lds	r22, 0x03BC	; 0x8003bc <current_temperature_bed>
   1b856:	70 91 bd 03 	lds	r23, 0x03BD	; 0x8003bd <current_temperature_bed+0x1>
   1b85a:	80 91 be 03 	lds	r24, 0x03BE	; 0x8003be <current_temperature_bed+0x2>
   1b85e:	90 91 bf 03 	lds	r25, 0x03BF	; 0x8003bf <current_temperature_bed+0x3>
   1b862:	b2 cf       	rjmp	.-156    	; 0x1b7c8 <lcd_selfcheck_check_heater(bool)+0x136>
	*/

    bool _stepresult = false;
    if (Stopped || _opposite_result < ((_isbed) ? 30 : 9))
    {
        if (!Stopped && _checked_result >= ((_isbed) ? 9 : 30))
   1b864:	89 e0       	ldi	r24, 0x09	; 9
   1b866:	90 e0       	ldi	r25, 0x00	; 0
	MYSERIAL.print("Opposite result:");
	MYSERIAL.println(_opposite_result);
	*/

    bool _stepresult = false;
    if (Stopped || _opposite_result < ((_isbed) ? 30 : 9))
   1b868:	6e 31       	cpi	r22, 0x1E	; 30
   1b86a:	71 05       	cpc	r23, r1
   1b86c:	0c f4       	brge	.+2      	; 0x1b870 <lcd_selfcheck_check_heater(bool)+0x1de>
   1b86e:	bc cf       	rjmp	.-136    	; 0x1b7e8 <lcd_selfcheck_check_heater(bool)+0x156>
        else
            lcd_selftest_error(TestError::Heater, "", "");
    }
    else
    {
        lcd_selftest_error(TestError::Bed, "", "");
   1b870:	4f ed       	ldi	r20, 0xDF	; 223
   1b872:	52 e0       	ldi	r21, 0x02	; 2
   1b874:	ba 01       	movw	r22, r20
   1b876:	81 e0       	ldi	r24, 0x01	; 1
   1b878:	0e 94 5b da 	call	0x1b4b6	; 0x1b4b6 <lcd_selftest_error(TestError, char const*, char const*)>
   1b87c:	c0 cf       	rjmp	.-128    	; 0x1b7fe <lcd_selfcheck_check_heater(bool)+0x16c>

0001b87e <lcd_selfcheck_pulleys(int)>:

	return _stepresult;
}

static bool lcd_selfcheck_pulleys(int axis)
{
   1b87e:	2f 92       	push	r2
   1b880:	3f 92       	push	r3
   1b882:	4f 92       	push	r4
   1b884:	5f 92       	push	r5
   1b886:	6f 92       	push	r6
   1b888:	7f 92       	push	r7
   1b88a:	8f 92       	push	r8
   1b88c:	9f 92       	push	r9
   1b88e:	af 92       	push	r10
   1b890:	bf 92       	push	r11
   1b892:	cf 92       	push	r12
   1b894:	df 92       	push	r13
   1b896:	ef 92       	push	r14
   1b898:	ff 92       	push	r15
   1b89a:	0f 93       	push	r16
   1b89c:	1f 93       	push	r17
   1b89e:	cf 93       	push	r28
   1b8a0:	df 93       	push	r29
   1b8a2:	8c 01       	movw	r16, r24
	float current_position_init;
	float move;
	bool endstop_triggered = false;
	int i;
	unsigned long timeout_counter;
	refresh_cmd_timeout();
   1b8a4:	0e 94 41 65 	call	0xca82	; 0xca82 <refresh_cmd_timeout()>
	manage_inactivity(true);
   1b8a8:	81 e0       	ldi	r24, 0x01	; 1
   1b8aa:	0e 94 34 8c 	call	0x11868	; 0x11868 <manage_inactivity(bool)>

	if (axis == 0) move = 50; //X_AXIS
	else move = 50; //Y_AXIS

	current_position_init = current_position[axis];
   1b8ae:	18 01       	movw	r2, r16
   1b8b0:	22 0c       	add	r2, r2
   1b8b2:	33 1c       	adc	r3, r3
   1b8b4:	22 0c       	add	r2, r2
   1b8b6:	33 1c       	adc	r3, r3
   1b8b8:	e1 01       	movw	r28, r2
   1b8ba:	cf 59       	subi	r28, 0x9F	; 159
   1b8bc:	dd 4e       	sbci	r29, 0xED	; 237
   1b8be:	88 80       	ld	r8, Y
   1b8c0:	99 80       	ldd	r9, Y+1	; 0x01
   1b8c2:	aa 80       	ldd	r10, Y+2	; 0x02
   1b8c4:	bb 80       	ldd	r11, Y+3	; 0x03

	current_position[axis] += 2;
   1b8c6:	20 e0       	ldi	r18, 0x00	; 0
   1b8c8:	30 e0       	ldi	r19, 0x00	; 0
   1b8ca:	40 e0       	ldi	r20, 0x00	; 0
   1b8cc:	50 e4       	ldi	r21, 0x40	; 64
   1b8ce:	c5 01       	movw	r24, r10
   1b8d0:	b4 01       	movw	r22, r8
   1b8d2:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   1b8d6:	68 83       	st	Y, r22
   1b8d8:	79 83       	std	Y+1, r23	; 0x01
   1b8da:	8a 83       	std	Y+2, r24	; 0x02
   1b8dc:	9b 83       	std	Y+3, r25	; 0x03
	plan_buffer_line_curposXYZE(manual_feedrate[0] / 60);
   1b8de:	60 e0       	ldi	r22, 0x00	; 0
   1b8e0:	70 e0       	ldi	r23, 0x00	; 0
   1b8e2:	84 e3       	ldi	r24, 0x34	; 52
   1b8e4:	92 e4       	ldi	r25, 0x42	; 66
   1b8e6:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
   1b8ea:	95 e0       	ldi	r25, 0x05	; 5
   1b8ec:	e9 2e       	mov	r14, r25
   1b8ee:	f1 2c       	mov	r15, r1
	for (i = 0; i < 5; i++) {
		refresh_cmd_timeout();
   1b8f0:	0e 94 41 65 	call	0xca82	; 0xca82 <refresh_cmd_timeout()>
		current_position[axis] = current_position[axis] + move;
   1b8f4:	20 e0       	ldi	r18, 0x00	; 0
   1b8f6:	30 e0       	ldi	r19, 0x00	; 0
   1b8f8:	48 e4       	ldi	r20, 0x48	; 72
   1b8fa:	52 e4       	ldi	r21, 0x42	; 66
   1b8fc:	68 81       	ld	r22, Y
   1b8fe:	79 81       	ldd	r23, Y+1	; 0x01
   1b900:	8a 81       	ldd	r24, Y+2	; 0x02
   1b902:	9b 81       	ldd	r25, Y+3	; 0x03
   1b904:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   1b908:	68 83       	st	Y, r22
   1b90a:	79 83       	std	Y+1, r23	; 0x01
   1b90c:	8a 83       	std	Y+2, r24	; 0x02
   1b90e:	9b 83       	std	Y+3, r25	; 0x03
}

#ifdef MOTOR_CURRENT_PWM_XY_PIN
void st_current_set(uint8_t driver, int current)
{
  if (driver == 0) analogWrite(MOTOR_CURRENT_PWM_XY_PIN, (long)current * 255L / (long)MOTOR_CURRENT_PWM_RANGE);
   1b910:	6c e6       	ldi	r22, 0x6C	; 108
   1b912:	70 e0       	ldi	r23, 0x00	; 0
   1b914:	8e e2       	ldi	r24, 0x2E	; 46
   1b916:	0e 94 6e d3 	call	0x1a6dc	; 0x1a6dc <analogWrite>
		st_current_set(0, 850); //set motor current higher
		plan_buffer_line_curposXYZE(200);
   1b91a:	60 e0       	ldi	r22, 0x00	; 0
   1b91c:	70 e0       	ldi	r23, 0x00	; 0
   1b91e:	88 e4       	ldi	r24, 0x48	; 72
   1b920:	93 e4       	ldi	r25, 0x43	; 67
   1b922:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
		st_synchronize();
   1b926:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
          if (SilentModeMenu != SILENT_MODE_OFF) st_current_set(0, tmp_motor[0]); //set back to normal operation currents
   1b92a:	80 91 bb 03 	lds	r24, 0x03BB	; 0x8003bb <SilentModeMenu>
   1b92e:	62 e2       	ldi	r22, 0x22	; 34
   1b930:	70 e0       	ldi	r23, 0x00	; 0
   1b932:	81 11       	cpse	r24, r1
   1b934:	02 c0       	rjmp	.+4      	; 0x1b93a <lcd_selfcheck_pulleys(int)+0xbc>
   1b936:	64 e4       	ldi	r22, 0x44	; 68
   1b938:	70 e0       	ldi	r23, 0x00	; 0
   1b93a:	8e e2       	ldi	r24, 0x2E	; 46
   1b93c:	0e 94 6e d3 	call	0x1a6dc	; 0x1a6dc <analogWrite>
		else st_current_set(0, tmp_motor_loud[0]); //set motor current back
		current_position[axis] = current_position[axis] - move;
   1b940:	20 e0       	ldi	r18, 0x00	; 0
   1b942:	30 e0       	ldi	r19, 0x00	; 0
   1b944:	48 e4       	ldi	r20, 0x48	; 72
   1b946:	52 e4       	ldi	r21, 0x42	; 66
   1b948:	68 81       	ld	r22, Y
   1b94a:	79 81       	ldd	r23, Y+1	; 0x01
   1b94c:	8a 81       	ldd	r24, Y+2	; 0x02
   1b94e:	9b 81       	ldd	r25, Y+3	; 0x03
   1b950:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   1b954:	68 83       	st	Y, r22
   1b956:	79 83       	std	Y+1, r23	; 0x01
   1b958:	8a 83       	std	Y+2, r24	; 0x02
   1b95a:	9b 83       	std	Y+3, r25	; 0x03
		plan_buffer_line_curposXYZE(50);
   1b95c:	60 e0       	ldi	r22, 0x00	; 0
   1b95e:	70 e0       	ldi	r23, 0x00	; 0
   1b960:	88 e4       	ldi	r24, 0x48	; 72
   1b962:	92 e4       	ldi	r25, 0x42	; 66
   1b964:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
		st_synchronize();
   1b968:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
		if (((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) ||
   1b96c:	1e 99       	sbic	0x03, 6	; 3
   1b96e:	3a c0       	rjmp	.+116    	; 0x1b9e4 <lcd_selfcheck_pulleys(int)+0x166>
   1b970:	1d 99       	sbic	0x03, 5	; 3
   1b972:	38 c0       	rjmp	.+112    	; 0x1b9e4 <lcd_selfcheck_pulleys(int)+0x166>
   1b974:	21 e0       	ldi	r18, 0x01	; 1
   1b976:	e2 1a       	sub	r14, r18
   1b978:	f1 08       	sbc	r15, r1

	current_position_init = current_position[axis];

	current_position[axis] += 2;
	plan_buffer_line_curposXYZE(manual_feedrate[0] / 60);
	for (i = 0; i < 5; i++) {
   1b97a:	09 f0       	breq	.+2      	; 0x1b97e <lcd_selfcheck_pulleys(int)+0x100>
   1b97c:	b9 cf       	rjmp	.-142    	; 0x1b8f0 <lcd_selfcheck_pulleys(int)+0x72>
			((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1)) {
			lcd_selftest_error(TestError::Pulley, (axis == 0) ? "X" : "Y", "");
			return(false);
		}
	}
	timeout_counter = _millis() + 2500;
   1b97e:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   1b982:	2b 01       	movw	r4, r22
   1b984:	3c 01       	movw	r6, r24
   1b986:	24 ec       	ldi	r18, 0xC4	; 196
   1b988:	42 0e       	add	r4, r18
   1b98a:	29 e0       	ldi	r18, 0x09	; 9
   1b98c:	52 1e       	adc	r5, r18
   1b98e:	61 1c       	adc	r6, r1
   1b990:	71 1c       	adc	r7, r1
	endstop_triggered = false;
	manage_inactivity(true);
   1b992:	81 e0       	ldi	r24, 0x01	; 1
   1b994:	0e 94 34 8c 	call	0x11868	; 0x11868 <manage_inactivity(bool)>
   1b998:	e1 01       	movw	r28, r2
   1b99a:	cf 59       	subi	r28, 0x9F	; 159
   1b99c:	dd 4e       	sbci	r29, 0xED	; 237
   1b99e:	c8 80       	ld	r12, Y
   1b9a0:	d9 80       	ldd	r13, Y+1	; 0x01
   1b9a2:	ea 80       	ldd	r14, Y+2	; 0x02
   1b9a4:	fb 80       	ldd	r15, Y+3	; 0x03
	while (!endstop_triggered) {
		if (((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) ||
			((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1)) {
			endstop_triggered = true;
			if (current_position_init - 1 <= current_position[axis] && current_position_init + 1 >= current_position[axis]) {
   1b9a6:	20 e0       	ldi	r18, 0x00	; 0
   1b9a8:	30 e0       	ldi	r19, 0x00	; 0
   1b9aa:	40 e8       	ldi	r20, 0x80	; 128
   1b9ac:	5f e3       	ldi	r21, 0x3F	; 63
	}
	timeout_counter = _millis() + 2500;
	endstop_triggered = false;
	manage_inactivity(true);
	while (!endstop_triggered) {
		if (((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) ||
   1b9ae:	1e 99       	sbic	0x03, 6	; 3
   1b9b0:	26 c0       	rjmp	.+76     	; 0x1b9fe <lcd_selfcheck_pulleys(int)+0x180>
   1b9b2:	1d 99       	sbic	0x03, 5	; 3
   1b9b4:	24 c0       	rjmp	.+72     	; 0x1b9fe <lcd_selfcheck_pulleys(int)+0x180>
				lcd_selftest_error(TestError::Pulley, (axis == 0) ? "X" : "Y", "");
				return(false);
			}
		}
		else {
			current_position[axis] -= 1;
   1b9b6:	c7 01       	movw	r24, r14
   1b9b8:	b6 01       	movw	r22, r12
   1b9ba:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   1b9be:	68 83       	st	Y, r22
   1b9c0:	79 83       	std	Y+1, r23	; 0x01
   1b9c2:	8a 83       	std	Y+2, r24	; 0x02
   1b9c4:	9b 83       	std	Y+3, r25	; 0x03
			plan_buffer_line_curposXYZE(manual_feedrate[0] / 60);
   1b9c6:	60 e0       	ldi	r22, 0x00	; 0
   1b9c8:	70 e0       	ldi	r23, 0x00	; 0
   1b9ca:	84 e3       	ldi	r24, 0x34	; 52
   1b9cc:	92 e4       	ldi	r25, 0x42	; 66
   1b9ce:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
			st_synchronize();
   1b9d2:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
			if (_millis() > timeout_counter) {
   1b9d6:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   1b9da:	46 16       	cp	r4, r22
   1b9dc:	57 06       	cpc	r5, r23
   1b9de:	68 06       	cpc	r6, r24
   1b9e0:	79 06       	cpc	r7, r25
   1b9e2:	e8 f6       	brcc	.-70     	; 0x1b99e <lcd_selfcheck_pulleys(int)+0x120>
				lcd_selftest_error(TestError::Pulley, (axis == 0) ? "X" : "Y", "");
   1b9e4:	68 ec       	ldi	r22, 0xC8	; 200
   1b9e6:	72 e0       	ldi	r23, 0x02	; 2
   1b9e8:	01 2b       	or	r16, r17
   1b9ea:	11 f0       	breq	.+4      	; 0x1b9f0 <lcd_selfcheck_pulleys(int)+0x172>
   1b9ec:	6a ec       	ldi	r22, 0xCA	; 202
   1b9ee:	72 e0       	ldi	r23, 0x02	; 2
   1b9f0:	4f ed       	ldi	r20, 0xDF	; 223
   1b9f2:	52 e0       	ldi	r21, 0x02	; 2
   1b9f4:	87 e0       	ldi	r24, 0x07	; 7
   1b9f6:	0e 94 5b da 	call	0x1b4b6	; 0x1b4b6 <lcd_selftest_error(TestError, char const*, char const*)>
				return(false);
   1b9fa:	80 e0       	ldi	r24, 0x00	; 0
   1b9fc:	30 c0       	rjmp	.+96     	; 0x1ba5e <lcd_selfcheck_pulleys(int)+0x1e0>
	manage_inactivity(true);
	while (!endstop_triggered) {
		if (((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) ||
			((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1)) {
			endstop_triggered = true;
			if (current_position_init - 1 <= current_position[axis] && current_position_init + 1 >= current_position[axis]) {
   1b9fe:	c5 01       	movw	r24, r10
   1ba00:	b4 01       	movw	r22, r8
   1ba02:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   1ba06:	a7 01       	movw	r20, r14
   1ba08:	96 01       	movw	r18, r12
   1ba0a:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   1ba0e:	18 16       	cp	r1, r24
   1ba10:	4c f3       	brlt	.-46     	; 0x1b9e4 <lcd_selfcheck_pulleys(int)+0x166>
   1ba12:	20 e0       	ldi	r18, 0x00	; 0
   1ba14:	30 e0       	ldi	r19, 0x00	; 0
   1ba16:	40 e8       	ldi	r20, 0x80	; 128
   1ba18:	5f e3       	ldi	r21, 0x3F	; 63
   1ba1a:	c5 01       	movw	r24, r10
   1ba1c:	b4 01       	movw	r22, r8
   1ba1e:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   1ba22:	a7 01       	movw	r20, r14
   1ba24:	96 01       	movw	r18, r12
   1ba26:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   1ba2a:	87 fd       	sbrc	r24, 7
   1ba2c:	db cf       	rjmp	.-74     	; 0x1b9e4 <lcd_selfcheck_pulleys(int)+0x166>
				current_position[axis] += 10;
   1ba2e:	e1 01       	movw	r28, r2
   1ba30:	cf 59       	subi	r28, 0x9F	; 159
   1ba32:	dd 4e       	sbci	r29, 0xED	; 237
   1ba34:	20 e0       	ldi	r18, 0x00	; 0
   1ba36:	30 e0       	ldi	r19, 0x00	; 0
   1ba38:	40 e2       	ldi	r20, 0x20	; 32
   1ba3a:	51 e4       	ldi	r21, 0x41	; 65
   1ba3c:	c7 01       	movw	r24, r14
   1ba3e:	b6 01       	movw	r22, r12
   1ba40:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   1ba44:	68 83       	st	Y, r22
   1ba46:	79 83       	std	Y+1, r23	; 0x01
   1ba48:	8a 83       	std	Y+2, r24	; 0x02
   1ba4a:	9b 83       	std	Y+3, r25	; 0x03
				plan_buffer_line_curposXYZE(manual_feedrate[0] / 60);
   1ba4c:	60 e0       	ldi	r22, 0x00	; 0
   1ba4e:	70 e0       	ldi	r23, 0x00	; 0
   1ba50:	84 e3       	ldi	r24, 0x34	; 52
   1ba52:	92 e4       	ldi	r25, 0x42	; 66
   1ba54:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
				st_synchronize();
   1ba58:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
				return(true);
   1ba5c:	81 e0       	ldi	r24, 0x01	; 1
				return(false);
			}
		}
	}
	return(true);
}
   1ba5e:	df 91       	pop	r29
   1ba60:	cf 91       	pop	r28
   1ba62:	1f 91       	pop	r17
   1ba64:	0f 91       	pop	r16
   1ba66:	ff 90       	pop	r15
   1ba68:	ef 90       	pop	r14
   1ba6a:	df 90       	pop	r13
   1ba6c:	cf 90       	pop	r12
   1ba6e:	bf 90       	pop	r11
   1ba70:	af 90       	pop	r10
   1ba72:	9f 90       	pop	r9
   1ba74:	8f 90       	pop	r8
   1ba76:	7f 90       	pop	r7
   1ba78:	6f 90       	pop	r6
   1ba7a:	5f 90       	pop	r5
   1ba7c:	4f 90       	pop	r4
   1ba7e:	3f 90       	pop	r3
   1ba80:	2f 90       	pop	r2
   1ba82:	08 95       	ret

0001ba84 <lcd_selfcheck_axis(int, int)>:
}
#endif //TMC2130

#ifndef TMC2130
static bool lcd_selfcheck_axis(int _axis, int _travel)
{
   1ba84:	2f 92       	push	r2
   1ba86:	3f 92       	push	r3
   1ba88:	4f 92       	push	r4
   1ba8a:	5f 92       	push	r5
   1ba8c:	6f 92       	push	r6
   1ba8e:	7f 92       	push	r7
   1ba90:	8f 92       	push	r8
   1ba92:	9f 92       	push	r9
   1ba94:	af 92       	push	r10
   1ba96:	bf 92       	push	r11
   1ba98:	cf 92       	push	r12
   1ba9a:	df 92       	push	r13
   1ba9c:	ef 92       	push	r14
   1ba9e:	ff 92       	push	r15
   1baa0:	0f 93       	push	r16
   1baa2:	1f 93       	push	r17
   1baa4:	cf 93       	push	r28
   1baa6:	df 93       	push	r29
   1baa8:	7c 01       	movw	r14, r24
   1baaa:	3b 01       	movw	r6, r22
	bool _stepresult = false;
	uint8_t _progress = 0;
	int _travel_done = 0;
	int _err_endstop = 0;
	int _lcd_refresh = 0;
	_travel = _travel + (_travel / 10);
   1baac:	cb 01       	movw	r24, r22
   1baae:	6a e0       	ldi	r22, 0x0A	; 10
   1bab0:	70 e0       	ldi	r23, 0x00	; 0
   1bab2:	0f 94 bd a4 	call	0x3497a	; 0x3497a <__divmodhi4>
   1bab6:	66 0e       	add	r6, r22
   1bab8:	77 1e       	adc	r7, r23

	if (_axis == X_AXIS) {
   1baba:	e1 14       	cp	r14, r1
   1babc:	f1 04       	cpc	r15, r1
   1babe:	e1 f4       	brne	.+56     	; 0x1baf8 <lcd_selfcheck_axis(int, int)+0x74>
		current_position[Z_AXIS] += 17;
   1bac0:	20 e0       	ldi	r18, 0x00	; 0
   1bac2:	30 e0       	ldi	r19, 0x00	; 0
   1bac4:	48 e8       	ldi	r20, 0x88	; 136
   1bac6:	51 e4       	ldi	r21, 0x41	; 65
   1bac8:	60 91 69 12 	lds	r22, 0x1269	; 0x801269 <current_position+0x8>
   1bacc:	70 91 6a 12 	lds	r23, 0x126A	; 0x80126a <current_position+0x9>
   1bad0:	80 91 6b 12 	lds	r24, 0x126B	; 0x80126b <current_position+0xa>
   1bad4:	90 91 6c 12 	lds	r25, 0x126C	; 0x80126c <current_position+0xb>
   1bad8:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   1badc:	60 93 69 12 	sts	0x1269, r22	; 0x801269 <current_position+0x8>
   1bae0:	70 93 6a 12 	sts	0x126A, r23	; 0x80126a <current_position+0x9>
   1bae4:	80 93 6b 12 	sts	0x126B, r24	; 0x80126b <current_position+0xa>
   1bae8:	90 93 6c 12 	sts	0x126C, r25	; 0x80126c <current_position+0xb>
		plan_buffer_line_curposXYZE(manual_feedrate[0] / 60);
   1baec:	60 e0       	ldi	r22, 0x00	; 0
   1baee:	70 e0       	ldi	r23, 0x00	; 0
   1baf0:	84 e3       	ldi	r24, 0x34	; 52
   1baf2:	92 e4       	ldi	r25, 0x42	; 66
   1baf4:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
}
#endif //TMC2130

#ifndef TMC2130
static bool lcd_selfcheck_axis(int _axis, int _travel)
{
   1baf8:	10 e0       	ldi	r17, 0x00	; 0
   1bafa:	00 e0       	ldi	r16, 0x00	; 0
   1bafc:	d0 e0       	ldi	r29, 0x00	; 0
   1bafe:	c0 e0       	ldi	r28, 0x00	; 0
   1bb00:	d1 2c       	mov	r13, r1
   1bb02:	c1 2c       	mov	r12, r1
   1bb04:	31 2c       	mov	r3, r1
   1bb06:	51 2c       	mov	r5, r1
		current_position[Z_AXIS] += 17;
		plan_buffer_line_curposXYZE(manual_feedrate[0] / 60);
	}

	do {
		current_position[_axis] = current_position[_axis] - 1;
   1bb08:	57 01       	movw	r10, r14
   1bb0a:	aa 0c       	add	r10, r10
   1bb0c:	bb 1c       	adc	r11, r11
   1bb0e:	aa 0c       	add	r10, r10
   1bb10:	bb 1c       	adc	r11, r11
   1bb12:	c5 01       	movw	r24, r10
   1bb14:	8f 59       	subi	r24, 0x9F	; 159
   1bb16:	9d 4e       	sbci	r25, 0xED	; 237
   1bb18:	4c 01       	movw	r8, r24
		{
			_lcd_refresh++;
		}
		else
		{
			_progress = lcd_selftest_screen(static_cast<TestScreen>(static_cast<int>(TestScreen::AxisX) + _axis), _progress, 3, false, 0);
   1bb1a:	94 e0       	ldi	r25, 0x04	; 4
   1bb1c:	29 2e       	mov	r2, r25
   1bb1e:	2e 0c       	add	r2, r14
		current_position[Z_AXIS] += 17;
		plan_buffer_line_curposXYZE(manual_feedrate[0] / 60);
	}

	do {
		current_position[_axis] = current_position[_axis] - 1;
   1bb20:	20 e0       	ldi	r18, 0x00	; 0
   1bb22:	30 e0       	ldi	r19, 0x00	; 0
   1bb24:	40 e8       	ldi	r20, 0x80	; 128
   1bb26:	5f e3       	ldi	r21, 0x3F	; 63
   1bb28:	f4 01       	movw	r30, r8
   1bb2a:	60 81       	ld	r22, Z
   1bb2c:	71 81       	ldd	r23, Z+1	; 0x01
   1bb2e:	82 81       	ldd	r24, Z+2	; 0x02
   1bb30:	93 81       	ldd	r25, Z+3	; 0x03
   1bb32:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   1bb36:	f4 01       	movw	r30, r8
   1bb38:	60 83       	st	Z, r22
   1bb3a:	71 83       	std	Z+1, r23	; 0x01
   1bb3c:	82 83       	std	Z+2, r24	; 0x02
   1bb3e:	93 83       	std	Z+3, r25	; 0x03

		plan_buffer_line_curposXYZE(manual_feedrate[0] / 60);
   1bb40:	60 e0       	ldi	r22, 0x00	; 0
   1bb42:	70 e0       	ldi	r23, 0x00	; 0
   1bb44:	84 e3       	ldi	r24, 0x34	; 52
   1bb46:	92 e4       	ldi	r25, 0x42	; 66
   1bb48:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
		st_synchronize();
   1bb4c:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
		if ((READ(X_MIN_PIN) ^ (bool)X_MIN_ENDSTOP_INVERTING) ||
			(READ(Y_MIN_PIN) ^ (bool)Y_MIN_ENDSTOP_INVERTING) ||
   1bb50:	1e 99       	sbic	0x03, 6	; 3
   1bb52:	04 c0       	rjmp	.+8      	; 0x1bb5c <lcd_selfcheck_axis(int, int)+0xd8>
   1bb54:	1d 99       	sbic	0x03, 5	; 3
   1bb56:	02 c0       	rjmp	.+4      	; 0x1bb5c <lcd_selfcheck_axis(int, int)+0xd8>
   1bb58:	1c 9b       	sbis	0x03, 4	; 3
   1bb5a:	39 c0       	rjmp	.+114    	; 0x1bbce <lcd_selfcheck_axis(int, int)+0x14a>
			(READ(Z_MIN_PIN) ^ (bool)Z_MIN_ENDSTOP_INVERTING))
		{
			if (_axis == 0)
			{
				_stepresult = ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) ? true : false;
   1bb5c:	53 b0       	in	r5, 0x03	; 3
		st_synchronize();
		if ((READ(X_MIN_PIN) ^ (bool)X_MIN_ENDSTOP_INVERTING) ||
			(READ(Y_MIN_PIN) ^ (bool)Y_MIN_ENDSTOP_INVERTING) ||
			(READ(Z_MIN_PIN) ^ (bool)Z_MIN_ENDSTOP_INVERTING))
		{
			if (_axis == 0)
   1bb5e:	e1 14       	cp	r14, r1
   1bb60:	f1 04       	cpc	r15, r1
   1bb62:	51 f4       	brne	.+20     	; 0x1bb78 <lcd_selfcheck_axis(int, int)+0xf4>
			{
				_stepresult = ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) ? true : false;
   1bb64:	56 fa       	bst	r5, 6
   1bb66:	55 24       	eor	r5, r5
   1bb68:	50 f8       	bld	r5, 0
				_err_endstop = ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) ? 1 : 2;
   1bb6a:	1d 99       	sbic	0x03, 5	; 3
   1bb6c:	8e c0       	rjmp	.+284    	; 0x1bc8a <lcd_selfcheck_axis(int, int)+0x206>

			}
			if (_axis == 1)
			{
				_stepresult = ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) ? true : false;
				_err_endstop = ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) ? 0 : 2;
   1bb6e:	c2 e0       	ldi	r28, 0x02	; 2
   1bb70:	d0 e0       	ldi	r29, 0x00	; 0
			{
				_stepresult = ((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING) == 1) ? true : false;
				_err_endstop = ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) ? 0 : 1;
				printf_P(PSTR("lcd_selfcheck_axis %d, %d\n"), _stepresult, _err_endstop);
			}
			_stepdone = true;
   1bb72:	44 24       	eor	r4, r4
   1bb74:	43 94       	inc	r4
   1bb76:	2c c0       	rjmp	.+88     	; 0x1bbd0 <lcd_selfcheck_axis(int, int)+0x14c>
			{
				_stepresult = ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) ? true : false;
				_err_endstop = ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) ? 1 : 2;

			}
			if (_axis == 1)
   1bb78:	f1 e0       	ldi	r31, 0x01	; 1
   1bb7a:	ef 16       	cp	r14, r31
   1bb7c:	f1 04       	cpc	r15, r1
   1bb7e:	41 f4       	brne	.+16     	; 0x1bb90 <lcd_selfcheck_axis(int, int)+0x10c>
			{
				_stepresult = ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) ? true : false;
   1bb80:	55 fa       	bst	r5, 5
   1bb82:	55 24       	eor	r5, r5
   1bb84:	50 f8       	bld	r5, 0
				_err_endstop = ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) ? 0 : 2;
   1bb86:	1e 9b       	sbis	0x03, 6	; 3
   1bb88:	f2 cf       	rjmp	.-28     	; 0x1bb6e <lcd_selfcheck_axis(int, int)+0xea>
   1bb8a:	d0 e0       	ldi	r29, 0x00	; 0
   1bb8c:	c0 e0       	ldi	r28, 0x00	; 0
   1bb8e:	f1 cf       	rjmp	.-30     	; 0x1bb72 <lcd_selfcheck_axis(int, int)+0xee>

			}
			if (_axis == 2)
			{
				_stepresult = ((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING) == 1) ? true : false;
   1bb90:	54 fa       	bst	r5, 4
   1bb92:	55 24       	eor	r5, r5
   1bb94:	50 f8       	bld	r5, 0
				_err_endstop = ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) ? 0 : 1;
   1bb96:	83 b1       	in	r24, 0x03	; 3
   1bb98:	82 95       	swap	r24
   1bb9a:	86 95       	lsr	r24
   1bb9c:	86 95       	lsr	r24
   1bb9e:	83 70       	andi	r24, 0x03	; 3
   1bba0:	21 e0       	ldi	r18, 0x01	; 1
   1bba2:	82 27       	eor	r24, r18
   1bba4:	81 70       	andi	r24, 0x01	; 1
   1bba6:	c8 2f       	mov	r28, r24
   1bba8:	80 e0       	ldi	r24, 0x00	; 0
   1bbaa:	d8 2f       	mov	r29, r24
				printf_P(PSTR("lcd_selfcheck_axis %d, %d\n"), _stepresult, _err_endstop);
   1bbac:	8f 93       	push	r24
   1bbae:	cf 93       	push	r28
   1bbb0:	1f 92       	push	r1
   1bbb2:	5f 92       	push	r5
   1bbb4:	e5 ed       	ldi	r30, 0xD5	; 213
   1bbb6:	f3 e8       	ldi	r31, 0x83	; 131
   1bbb8:	ff 93       	push	r31
   1bbba:	ef 93       	push	r30
   1bbbc:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   1bbc0:	0f 90       	pop	r0
   1bbc2:	0f 90       	pop	r0
   1bbc4:	0f 90       	pop	r0
   1bbc6:	0f 90       	pop	r0
   1bbc8:	0f 90       	pop	r0
   1bbca:	0f 90       	pop	r0
   1bbcc:	d2 cf       	rjmp	.-92     	; 0x1bb72 <lcd_selfcheck_axis(int, int)+0xee>
		current_position[_axis] = current_position[_axis] - 1;

		plan_buffer_line_curposXYZE(manual_feedrate[0] / 60);
		st_synchronize();
		if ((READ(X_MIN_PIN) ^ (bool)X_MIN_ENDSTOP_INVERTING) ||
			(READ(Y_MIN_PIN) ^ (bool)Y_MIN_ENDSTOP_INVERTING) ||
   1bbce:	41 2c       	mov	r4, r1
				printf_P(PSTR("lcd_selfcheck_axis %d, %d\n"), _stepresult, _err_endstop);
			}
			_stepdone = true;
		}

		if (_lcd_refresh < 6)
   1bbd0:	06 30       	cpi	r16, 0x06	; 6
   1bbd2:	11 05       	cpc	r17, r1
   1bbd4:	0c f0       	brlt	.+2      	; 0x1bbd8 <lcd_selfcheck_axis(int, int)+0x154>
   1bbd6:	4f c0       	rjmp	.+158    	; 0x1bc76 <lcd_selfcheck_axis(int, int)+0x1f2>
		{
			_lcd_refresh++;
   1bbd8:	0f 5f       	subi	r16, 0xFF	; 255
   1bbda:	1f 4f       	sbci	r17, 0xFF	; 255
		{
			_progress = lcd_selftest_screen(static_cast<TestScreen>(static_cast<int>(TestScreen::AxisX) + _axis), _progress, 3, false, 0);
			_lcd_refresh = 0;
		}

		manage_heater();
   1bbdc:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
		manage_inactivity(true);
   1bbe0:	81 e0       	ldi	r24, 0x01	; 1
   1bbe2:	0e 94 34 8c 	call	0x11868	; 0x11868 <manage_inactivity(bool)>

		(_travel_done <= _travel) ? _travel_done++ : _stepdone = true;
   1bbe6:	6c 14       	cp	r6, r12
   1bbe8:	7d 04       	cpc	r7, r13
   1bbea:	34 f0       	brlt	.+12     	; 0x1bbf8 <lcd_selfcheck_axis(int, int)+0x174>
   1bbec:	8f ef       	ldi	r24, 0xFF	; 255
   1bbee:	c8 1a       	sub	r12, r24
   1bbf0:	d8 0a       	sbc	r13, r24

	} while (!_stepdone);
   1bbf2:	44 20       	and	r4, r4
   1bbf4:	09 f4       	brne	.+2      	; 0x1bbf8 <lcd_selfcheck_axis(int, int)+0x174>
   1bbf6:	94 cf       	rjmp	.-216    	; 0x1bb20 <lcd_selfcheck_axis(int, int)+0x9c>

	if (!_stepresult)
   1bbf8:	51 10       	cpse	r5, r1
   1bbfa:	20 c0       	rjmp	.+64     	; 0x1bc3c <lcd_selfcheck_axis(int, int)+0x1b8>
	{
		const char *_error_1;
		const char *_error_2;

		if (_axis == X_AXIS) _error_1 = "X";
		if (_axis == Y_AXIS) _error_1 = "Y";
   1bbfc:	6a ec       	ldi	r22, 0xCA	; 202
   1bbfe:	72 e0       	ldi	r23, 0x02	; 2
   1bc00:	91 e0       	ldi	r25, 0x01	; 1
   1bc02:	e9 16       	cp	r14, r25
   1bc04:	f1 04       	cpc	r15, r1
   1bc06:	41 f0       	breq	.+16     	; 0x1bc18 <lcd_selfcheck_axis(int, int)+0x194>
		if (_axis == Z_AXIS) _error_1 = "Z";
   1bc08:	6c ec       	ldi	r22, 0xCC	; 204
   1bc0a:	72 e0       	ldi	r23, 0x02	; 2
   1bc0c:	e2 e0       	ldi	r30, 0x02	; 2
   1bc0e:	ee 16       	cp	r14, r30
   1bc10:	f1 04       	cpc	r15, r1
   1bc12:	11 f0       	breq	.+4      	; 0x1bc18 <lcd_selfcheck_axis(int, int)+0x194>
   1bc14:	68 ec       	ldi	r22, 0xC8	; 200
   1bc16:	72 e0       	ldi	r23, 0x02	; 2

		if (_err_endstop == 0) _error_2 = "X";
		if (_err_endstop == 1) _error_2 = "Y";
   1bc18:	4a ec       	ldi	r20, 0xCA	; 202
   1bc1a:	52 e0       	ldi	r21, 0x02	; 2
   1bc1c:	c1 30       	cpi	r28, 0x01	; 1
   1bc1e:	d1 05       	cpc	r29, r1
   1bc20:	31 f0       	breq	.+12     	; 0x1bc2e <lcd_selfcheck_axis(int, int)+0x1aa>
		if (_err_endstop == 2) _error_2 = "Z";
   1bc22:	4c ec       	ldi	r20, 0xCC	; 204
   1bc24:	52 e0       	ldi	r21, 0x02	; 2
   1bc26:	22 97       	sbiw	r28, 0x02	; 2
   1bc28:	11 f0       	breq	.+4      	; 0x1bc2e <lcd_selfcheck_axis(int, int)+0x1aa>
   1bc2a:	48 ec       	ldi	r20, 0xC8	; 200
   1bc2c:	52 e0       	ldi	r21, 0x02	; 2


		if (_travel_done >= _travel)
		{
			lcd_selftest_error(TestError::Endstop, _error_1, _error_2);
   1bc2e:	84 e0       	ldi	r24, 0x04	; 4
		if (_err_endstop == 0) _error_2 = "X";
		if (_err_endstop == 1) _error_2 = "Y";
		if (_err_endstop == 2) _error_2 = "Z";


		if (_travel_done >= _travel)
   1bc30:	c6 14       	cp	r12, r6
   1bc32:	d7 04       	cpc	r13, r7
   1bc34:	0c f4       	brge	.+2      	; 0x1bc38 <lcd_selfcheck_axis(int, int)+0x1b4>
		{
			lcd_selftest_error(TestError::Endstop, _error_1, _error_2);
		}
		else
		{
			lcd_selftest_error(TestError::Motor, _error_1, _error_2);
   1bc36:	83 e0       	ldi	r24, 0x03	; 3
   1bc38:	0e 94 5b da 	call	0x1b4b6	; 0x1b4b6 <lcd_selftest_error(TestError, char const*, char const*)>
		}
	}
	current_position[_axis] = 0; //simulate axis home to avoid negative numbers for axis position, especially Z.
   1bc3c:	f5 01       	movw	r30, r10
   1bc3e:	ef 59       	subi	r30, 0x9F	; 159
   1bc40:	fd 4e       	sbci	r31, 0xED	; 237
   1bc42:	10 82       	st	Z, r1
   1bc44:	11 82       	std	Z+1, r1	; 0x01
   1bc46:	12 82       	std	Z+2, r1	; 0x02
   1bc48:	13 82       	std	Z+3, r1	; 0x03
	plan_set_position_curposXYZE();
   1bc4a:	0f 94 41 4b 	call	0x29682	; 0x29682 <plan_set_position_curposXYZE()>

	return _stepresult;
}
   1bc4e:	85 2d       	mov	r24, r5
   1bc50:	df 91       	pop	r29
   1bc52:	cf 91       	pop	r28
   1bc54:	1f 91       	pop	r17
   1bc56:	0f 91       	pop	r16
   1bc58:	ff 90       	pop	r15
   1bc5a:	ef 90       	pop	r14
   1bc5c:	df 90       	pop	r13
   1bc5e:	cf 90       	pop	r12
   1bc60:	bf 90       	pop	r11
   1bc62:	af 90       	pop	r10
   1bc64:	9f 90       	pop	r9
   1bc66:	8f 90       	pop	r8
   1bc68:	7f 90       	pop	r7
   1bc6a:	6f 90       	pop	r6
   1bc6c:	5f 90       	pop	r5
   1bc6e:	4f 90       	pop	r4
   1bc70:	3f 90       	pop	r3
   1bc72:	2f 90       	pop	r2
   1bc74:	08 95       	ret
		{
			_lcd_refresh++;
		}
		else
		{
			_progress = lcd_selftest_screen(static_cast<TestScreen>(static_cast<int>(TestScreen::AxisX) + _axis), _progress, 3, false, 0);
   1bc76:	10 e0       	ldi	r17, 0x00	; 0
   1bc78:	00 e0       	ldi	r16, 0x00	; 0
   1bc7a:	20 e0       	ldi	r18, 0x00	; 0
   1bc7c:	43 e0       	ldi	r20, 0x03	; 3
   1bc7e:	63 2d       	mov	r22, r3
   1bc80:	82 2d       	mov	r24, r2
   1bc82:	0e 94 f8 c4 	call	0x189f0	; 0x189f0 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
   1bc86:	38 2e       	mov	r3, r24
   1bc88:	a9 cf       	rjmp	.-174    	; 0x1bbdc <lcd_selfcheck_axis(int, int)+0x158>
			(READ(Z_MIN_PIN) ^ (bool)Z_MIN_ENDSTOP_INVERTING))
		{
			if (_axis == 0)
			{
				_stepresult = ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) ? true : false;
				_err_endstop = ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) ? 1 : 2;
   1bc8a:	c1 e0       	ldi	r28, 0x01	; 1
   1bc8c:	d0 e0       	ldi	r29, 0x00	; 0
   1bc8e:	71 cf       	rjmp	.-286    	; 0x1bb72 <lcd_selfcheck_axis(int, int)+0xee>

0001bc90 <resume_print_checks()>:
    return 0;
}

bool resume_print_checks() {
    // reset the lcd status so that a newer error will be shown
    lcd_return_to_status();
   1bc90:	0f 94 d5 07 	call	0x20faa	; 0x20faa <lcd_return_to_status()>
    lcd_setalertstatus_(message, severity, true);
}

void lcd_reset_alert_level()
{
    lcd_status_message_level = 0;
   1bc94:	10 92 c0 03 	sts	0x03C0, r1	; 0x8003c0 <_ZL24lcd_status_message_level.lto_priv.422>
   1bc98:	80 91 cc 03 	lds	r24, 0x03CC	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
    lcd_reset_alert_level();

    // ensure thermal issues (temp or fan) are resolved before we allow to resume
    if (get_temp_error()
#ifdef FANCHECK
        || fan_error_selftest()
   1bc9c:	81 11       	cpse	r24, r1
   1bc9e:	39 c0       	rjmp	.+114    	; 0x1bd12 <resume_print_checks()+0x82>
}

static bool fan_error_selftest()
{
#ifdef FANCHECK
    if (!fans_check_enabled) return 0;
   1bca0:	80 91 40 02 	lds	r24, 0x0240	; 0x800240 <fans_check_enabled>
   1bca4:	81 11       	cpse	r24, r1
   1bca6:	02 c0       	rjmp	.+4      	; 0x1bcac <resume_print_checks()+0x1c>
#endif
        ) {
        return false; // abort if error persists
    }

    return true;
   1bca8:	81 e0       	ldi	r24, 0x01	; 1
   1bcaa:	08 95       	ret
}

/// @brief Set print fan speed
/// @param speed ranges from 0 to 255
static void lcd_selftest_setfan(const uint8_t speed) {
    fanSpeed = speed;
   1bcac:	8f ef       	ldi	r24, 0xFF	; 255
   1bcae:	80 93 55 12 	sts	0x1255, r24	; 0x801255 <fanSpeed>
#ifdef FAN_SOFT_PWM
    fanSpeedSoftPwm = speed;
   1bcb2:	80 93 1d 06 	sts	0x061D, r24	; 0x80061d <fanSpeedSoftPwm>
#endif
    manage_heater();
   1bcb6:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
{
#ifdef FANCHECK
    if (!fans_check_enabled) return 0;

    lcd_selftest_setfan(255);
    setExtruderAutoFanState(3); //force enables the hotend fan
   1bcba:	83 e0       	ldi	r24, 0x03	; 3
   1bcbc:	0e 94 af 77 	call	0xef5e	; 0xef5e <setExtruderAutoFanState(unsigned char)>
#ifdef FAN_SOFT_PWM
    extruder_autofan_last_check = _millis();
   1bcc0:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   1bcc4:	60 93 07 17 	sts	0x1707, r22	; 0x801707 <extruder_autofan_last_check>
   1bcc8:	70 93 08 17 	sts	0x1708, r23	; 0x801708 <extruder_autofan_last_check+0x1>
   1bccc:	80 93 09 17 	sts	0x1709, r24	; 0x801709 <extruder_autofan_last_check+0x2>
   1bcd0:	90 93 0a 17 	sts	0x170A, r25	; 0x80170a <extruder_autofan_last_check+0x3>
    fan_measuring = true;
   1bcd4:	81 e0       	ldi	r24, 0x01	; 1
   1bcd6:	80 93 b6 03 	sts	0x03B6, r24	; 0x8003b6 <fan_measuring>
#endif //FAN_SOFT_PWM
    _delay(1000); //delay_keep_alive would turn off hotend fan, because temerature is too low (maybe)
   1bcda:	68 ee       	ldi	r22, 0xE8	; 232
   1bcdc:	73 e0       	ldi	r23, 0x03	; 3
   1bcde:	80 e0       	ldi	r24, 0x00	; 0
   1bce0:	90 e0       	ldi	r25, 0x00	; 0
   1bce2:	0f 94 bd 0d 	call	0x21b7a	; 0x21b7a <delay2>
    manage_heater();
   1bce6:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
    setExtruderAutoFanState(1); //releases lock on the hotend fan
   1bcea:	81 e0       	ldi	r24, 0x01	; 1
   1bcec:	0e 94 af 77 	call	0xef5e	; 0xef5e <setExtruderAutoFanState(unsigned char)>
}

/// @brief Set print fan speed
/// @param speed ranges from 0 to 255
static void lcd_selftest_setfan(const uint8_t speed) {
    fanSpeed = speed;
   1bcf0:	10 92 55 12 	sts	0x1255, r1	; 0x801255 <fanSpeed>
#ifdef FAN_SOFT_PWM
    fanSpeedSoftPwm = speed;
   1bcf4:	10 92 1d 06 	sts	0x061D, r1	; 0x80061d <fanSpeedSoftPwm>
#endif
    manage_heater();
   1bcf8:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
    _delay(1000); //delay_keep_alive would turn off hotend fan, because temerature is too low (maybe)
    manage_heater();
    setExtruderAutoFanState(1); //releases lock on the hotend fan
    lcd_selftest_setfan(0);
#ifdef TACH_0
    if (fan_speed[0] <= 20) { //hotend fan error
   1bcfc:	80 91 b7 03 	lds	r24, 0x03B7	; 0x8003b7 <fan_speed>
   1bd00:	90 91 b8 03 	lds	r25, 0x03B8	; 0x8003b8 <fan_speed+0x1>
   1bd04:	45 97       	sbiw	r24, 0x15	; 21
   1bd06:	84 f6       	brge	.-96     	; 0x1bca8 <resume_print_checks()+0x18>
        LCD_ALERTMESSAGERPGM(MSG_FANCHECK_HOTEND);
   1bd08:	62 e0       	ldi	r22, 0x02	; 2
   1bd0a:	86 e2       	ldi	r24, 0x26	; 38
   1bd0c:	98 e6       	ldi	r25, 0x68	; 104
   1bd0e:	0e 94 2c da 	call	0x1b458	; 0x1b458 <lcd_setalertstatuspgm(char const*, unsigned char)>
    if (get_temp_error()
#ifdef FANCHECK
        || fan_error_selftest()
#endif
        ) {
        return false; // abort if error persists
   1bd12:	80 e0       	ldi	r24, 0x00	; 0
    }

    return true;
}
   1bd14:	08 95       	ret

0001bd16 <lcd_resume_usb_print()>:

//! @brief Resume paused USB/host print, send host action "resume"
void lcd_resume_usb_print()
{
    // reset lcd and ensure we can resume first
    if (!resume_print_checks()) return;
   1bd16:	0e 94 48 de 	call	0x1bc90	; 0x1bc90 <resume_print_checks()>
   1bd1a:	88 23       	and	r24, r24
   1bd1c:	21 f0       	breq	.+8      	; 0x1bd26 <lcd_resume_usb_print()+0x10>

    // resume the usb host
    SERIAL_PROTOCOLLNRPGM(MSG_HOST_ACTION_ASK_RESUME);
   1bd1e:	8c e4       	ldi	r24, 0x4C	; 76
   1bd20:	98 e6       	ldi	r25, 0x68	; 104
   1bd22:	0c 94 bd 7c 	jmp	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
}
   1bd26:	08 95       	ret

0001bd28 <lcd_setstatuspgm(char const*)>:
void lcd_getstatus(char buf[LCD_WIDTH]) {
    strncpy(buf, lcd_status_message, LCD_WIDTH);
}

void lcd_setstatuspgm(const char* message)
{
   1bd28:	cf 93       	push	r28
   1bd2a:	df 93       	push	r29
   1bd2c:	ec 01       	movw	r28, r24
    if (lcd_message_check(LCD_STATUS_NONE))
   1bd2e:	80 e0       	ldi	r24, 0x00	; 0
   1bd30:	0e 94 16 da 	call	0x1b42c	; 0x1b42c <lcd_message_check(unsigned char) [clone .lto_priv.486]>
   1bd34:	88 23       	and	r24, r24
   1bd36:	31 f0       	breq	.+12     	; 0x1bd44 <lcd_setstatuspgm(char const*)+0x1c>
        lcd_updatestatus(message, true);
   1bd38:	61 e0       	ldi	r22, 0x01	; 1
   1bd3a:	ce 01       	movw	r24, r28
}
   1bd3c:	df 91       	pop	r29
   1bd3e:	cf 91       	pop	r28
}

void lcd_setstatuspgm(const char* message)
{
    if (lcd_message_check(LCD_STATUS_NONE))
        lcd_updatestatus(message, true);
   1bd40:	0c 94 fb d9 	jmp	0x1b3f6	; 0x1b3f6 <lcd_updatestatus(char const*, bool) [clone .lto_priv.487]>
}
   1bd44:	df 91       	pop	r29
   1bd46:	cf 91       	pop	r28
   1bd48:	08 95       	ret

0001bd4a <lcd_colorprint_change()>:
}
#endif /* DEBUG_STEPPER_TIMER_MISSED */

static void lcd_colorprint_change() {

	enquecommand_P(MSG_M600);
   1bd4a:	61 e0       	ldi	r22, 0x01	; 1
   1bd4c:	8e e5       	ldi	r24, 0x5E	; 94
   1bd4e:	9c e6       	ldi	r25, 0x6C	; 108
   1bd50:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>

	custom_message_type = CustomMsg::FilamentLoading; //just print status message
   1bd54:	82 e0       	ldi	r24, 0x02	; 2
   1bd56:	80 93 5d 06 	sts	0x065D, r24	; 0x80065d <custom_message_type>
	lcd_setstatuspgm(_T(MSG_FINISHING_MOVEMENTS));
   1bd5a:	86 e0       	ldi	r24, 0x06	; 6
   1bd5c:	9a e5       	ldi	r25, 0x5A	; 90
   1bd5e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1bd62:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
	lcd_return_to_status();
   1bd66:	0f 94 d5 07 	call	0x20faa	; 0x20faa <lcd_return_to_status()>
	lcd_draw_update = 3;
   1bd6a:	83 e0       	ldi	r24, 0x03	; 3
   1bd6c:	80 93 59 02 	sts	0x0259, r24	; 0x800259 <lcd_draw_update>
}
   1bd70:	08 95       	ret

0001bd72 <lcd_resume_print()>:
//! @todo It is not good to call restore_print_from_ram_and_continue() from function called by lcd_update(),
//! as restore_print_from_ram_and_continue() calls lcd_update() internally.
void lcd_resume_print()
{
    // reset lcd and ensure we can resume first
    if (!resume_print_checks()) return;
   1bd72:	0e 94 48 de 	call	0x1bc90	; 0x1bc90 <resume_print_checks()>
   1bd76:	88 23       	and	r24, r24
   1bd78:	51 f1       	breq	.+84     	; 0x1bdce <lcd_resume_print()+0x5c>

    cmdqueue_serial_disabled = false;
   1bd7a:	10 92 93 03 	sts	0x0393, r1	; 0x800393 <cmdqueue_serial_disabled>
    lcd_setstatuspgm(_T(MSG_FINISHING_MOVEMENTS));
   1bd7e:	86 e0       	ldi	r24, 0x06	; 6
   1bd80:	9a e5       	ldi	r25, 0x5A	; 90
   1bd82:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1bd86:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
    st_synchronize();
   1bd8a:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
    custom_message_type = CustomMsg::Resuming;
   1bd8e:	88 e0       	ldi	r24, 0x08	; 8
   1bd90:	80 93 5d 06 	sts	0x065D, r24	; 0x80065d <custom_message_type>
{
#if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1)
#ifdef EXTRUDER_ALTFAN_DETECT
    altfanStatus.altfanOverride = eeprom_read_byte((uint8_t*)EEPROM_ALTFAN_OVERRIDE);
#endif
    resetFanCheck();
   1bd94:	0e 94 a2 77 	call	0xef44	; 0xef44 <resetFanCheck()>
    setExtruderAutoFanState(1);
   1bd98:	81 e0       	ldi	r24, 0x01	; 1
   1bd9a:	0e 94 af 77 	call	0xef5e	; 0xef5e <setExtruderAutoFanState(unsigned char)>

    // resume processing USB commands again and restore hotend fan state (in case the print was
    // stopped due to a thermal error)
    hotendDefaultAutoFanState();
    Stopped = false;
   1bd9e:	10 92 3b 12 	sts	0x123B, r1	; 0x80123b <Stopped>

    restore_print_from_ram_and_continue(default_retraction);
   1bda2:	60 e0       	ldi	r22, 0x00	; 0
   1bda4:	70 e0       	ldi	r23, 0x00	; 0
   1bda6:	80 e8       	ldi	r24, 0x80	; 128
   1bda8:	9f e3       	ldi	r25, 0x3F	; 63
   1bdaa:	0e 94 b8 66 	call	0xcd70	; 0xcd70 <restore_print_from_ram_and_continue(float)>

    did_pause_print = false;
   1bdae:	10 92 cd 03 	sts	0x03CD, r1	; 0x8003cd <did_pause_print>

    // Resume the print job timer if it was running
    if (print_job_timer.isPaused()) print_job_timer.start();
   1bdb2:	80 91 8b 03 	lds	r24, 0x038B	; 0x80038b <Stopwatch::state>
   1bdb6:	82 30       	cpi	r24, 0x02	; 2
   1bdb8:	11 f4       	brne	.+4      	; 0x1bdbe <lcd_resume_print()+0x4c>
   1bdba:	0f 94 25 19 	call	0x2324a	; 0x2324a <Stopwatch::start()>

    refresh_cmd_timeout();
   1bdbe:	0e 94 41 65 	call	0xca82	; 0xca82 <refresh_cmd_timeout()>
    SERIAL_PROTOCOLLNRPGM(MSG_HOST_ACTION_RESUMED);
   1bdc2:	8b e3       	ldi	r24, 0x3B	; 59
   1bdc4:	98 e6       	ldi	r25, 0x68	; 104
   1bdc6:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
    custom_message_type = CustomMsg::Status;
   1bdca:	10 92 5d 06 	sts	0x065D, r1	; 0x80065d <custom_message_type>
}
   1bdce:	08 95       	ret

0001bdd0 <lcd_setstatus(char const*)>:
    // hack lcd_draw_update to 1, i.e. without clear
    lcd_draw_update = 1;
}

void lcd_setstatus(const char* message)
{
   1bdd0:	cf 93       	push	r28
   1bdd2:	df 93       	push	r29
   1bdd4:	ec 01       	movw	r28, r24
    if (lcd_message_check(LCD_STATUS_NONE))
   1bdd6:	80 e0       	ldi	r24, 0x00	; 0
   1bdd8:	0e 94 16 da 	call	0x1b42c	; 0x1b42c <lcd_message_check(unsigned char) [clone .lto_priv.486]>
   1bddc:	88 23       	and	r24, r24
   1bdde:	31 f0       	breq	.+12     	; 0x1bdec <lcd_setstatus(char const*)+0x1c>
        lcd_updatestatus(message);
   1bde0:	60 e0       	ldi	r22, 0x00	; 0
   1bde2:	ce 01       	movw	r24, r28
}
   1bde4:	df 91       	pop	r29
   1bde6:	cf 91       	pop	r28
}

void lcd_setstatus(const char* message)
{
    if (lcd_message_check(LCD_STATUS_NONE))
        lcd_updatestatus(message);
   1bde8:	0c 94 fb d9 	jmp	0x1b3f6	; 0x1b3f6 <lcd_updatestatus(char const*, bool) [clone .lto_priv.487]>
}
   1bdec:	df 91       	pop	r29
   1bdee:	cf 91       	pop	r28
   1bdf0:	08 95       	ret

0001bdf2 <print_stop(bool, bool)>:
    axis_relative_modes = E_AXIS_MASK; //XYZ absolute, E relative
    did_pause_print = false; // Clear pause state in case the print was aborted while paused
}

void print_stop(bool interactive, bool unconditional_stop)
{
   1bdf2:	cf 93       	push	r28
   1bdf4:	df 93       	push	r29
   1bdf6:	c8 2f       	mov	r28, r24
    softReset();
}

void UnconditionalStop()
{
    CRITICAL_SECTION_START;
   1bdf8:	df b7       	in	r29, 0x3f	; 63
    // UnconditionalStop() will internally cause planner_abort_hard(), meaning we _cannot_ plan any
    // more move in this call! Any further move must happen inside lcd_print_stop_finish(), which is
    // called by the main loop one iteration later.
    if (unconditional_stop) {
   1bdfa:	66 23       	and	r22, r22
   1bdfc:	89 f1       	breq	.+98     	; 0x1be60 <print_stop(bool, bool)+0x6e>
   1bdfe:	f8 94       	cli

    // Disable all heaters and unroll the temperature wait loop stack
    disable_heater();
   1be00:	0f 94 05 11 	call	0x2220a	; 0x2220a <disable_heater()>
    cancel_heatup = true;
   1be04:	81 e0       	ldi	r24, 0x01	; 1
   1be06:	80 93 5f 0d 	sts	0x0D5F, r24	; 0x800d5f <_ZL13cancel_heatup.lto_priv.391>
    heating_status = HeatingStatus::NO_HEATING;
   1be0a:	10 92 cb 03 	sts	0x03CB, r1	; 0x8003cb <heating_status>

    // Clear any saved printing state
    cancel_saved_printing();
   1be0e:	0e 94 07 64 	call	0xc80e	; 0xc80e <cancel_saved_printing()>

    // Abort the planner
    planner_abort_hard();
   1be12:	0f 94 fb 4e 	call	0x29df6	; 0x29df6 <planner_abort_hard()>

    // Reset the queue
    cmdqueue_reset();
   1be16:	0e 94 3c 85 	call	0x10a78	; 0x10a78 <cmdqueue_reset()>
    cmdqueue_serial_disabled = false;
   1be1a:	10 92 93 03 	sts	0x0393, r1	; 0x800393 <cmdqueue_serial_disabled>

    st_reset_timer();
   1be1e:	0f 94 4c 1b 	call	0x23698	; 0x23698 <st_reset_timer()>
    CRITICAL_SECTION_END;
   1be22:	df bf       	out	0x3f, r29	; 63

    // clear paused state immediately
    did_pause_print = false;
   1be24:	10 92 cd 03 	sts	0x03CD, r1	; 0x8003cd <did_pause_print>
    print_job_timer.stop();
   1be28:	0f 94 49 19 	call	0x23292	; 0x23292 <Stopwatch::stop()>
    } else {
        // Allow lcd_print_stop_finish() to use the heaters when it is safe
        ConditionalStop();
    }

    if (card.isFileOpen()) {
   1be2c:	80 91 6a 16 	lds	r24, 0x166A	; 0x80166a <card+0x295>
   1be30:	88 23       	and	r24, r24
   1be32:	21 f0       	breq	.+8      	; 0x1be3c <print_stop(bool, bool)+0x4a>
        // Reset the sd status
        card.sdprinting = false;
   1be34:	10 92 d7 13 	sts	0x13D7, r1	; 0x8013d7 <card+0x2>
        card.closefile();
   1be38:	0f 94 f9 65 	call	0x2cbf2	; 0x2cbf2 <CardReader::closefile(bool) [clone .constprop.307]>
    }
    SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_CANCEL);
   1be3c:	8e e7       	ldi	r24, 0x7E	; 126
   1be3e:	98 e6       	ldi	r25, 0x68	; 104
   1be40:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>

#ifdef MESH_BED_LEVELING
    mbl.active = false;
   1be44:	10 92 09 13 	sts	0x1309, r1	; 0x801309 <mbl>
#endif

    if (interactive) {
   1be48:	c1 11       	cpse	r28, r1
        // acknowledged by the user from the LCD: resume processing USB commands again
        Stopped = false;
   1be4a:	10 92 3b 12 	sts	0x123B, r1	; 0x80123b <Stopped>
    }

    // return to status is required to continue processing in the main loop!
    lcd_commands_type = LcdCommands::StopPrint;
   1be4e:	81 e0       	ldi	r24, 0x01	; 1
   1be50:	80 93 5e 0d 	sts	0x0D5E, r24	; 0x800d5e <lcd_commands_type>
}

PrinterState SetPrinterState(PrinterState status) {
    return printer_state = status;
   1be54:	10 92 61 0d 	sts	0x0D61, r1	; 0x800d61 <_ZL13printer_state.lto_priv.386>
    SetPrinterState(PrinterState::NotReady); //set printer state to show LCD menu after print has been stopped
    lcd_return_to_status();
}
   1be58:	df 91       	pop	r29
   1be5a:	cf 91       	pop	r28
    }

    // return to status is required to continue processing in the main loop!
    lcd_commands_type = LcdCommands::StopPrint;
    SetPrinterState(PrinterState::NotReady); //set printer state to show LCD menu after print has been stopped
    lcd_return_to_status();
   1be5c:	0d 94 d5 07 	jmp	0x20faa	; 0x20faa <lcd_return_to_status()>
}

void ConditionalStop()
{
    CRITICAL_SECTION_START;
   1be60:	f8 94       	cli
    //
    // However, the firmware must take into account the edge case when the firmware
    // is running M109 or M190 G-codes. These G-codes execute a blocking while loop
    // which waits for the bed or nozzle to reach their target temperature.
    // To exit the loop, the firmware must set cancel_heatup to true.
    cancel_heatup = true;
   1be62:	81 e0       	ldi	r24, 0x01	; 1
   1be64:	80 93 5f 0d 	sts	0x0D5F, r24	; 0x800d5f <_ZL13cancel_heatup.lto_priv.391>
    heating_status = HeatingStatus::NO_HEATING;
   1be68:	10 92 cb 03 	sts	0x03CB, r1	; 0x8003cb <heating_status>

    // Clear any saved printing state
    cancel_saved_printing();
   1be6c:	0e 94 07 64 	call	0xc80e	; 0xc80e <cancel_saved_printing()>

    // Abort the planner
    planner_abort_hard();
   1be70:	0f 94 fb 4e 	call	0x29df6	; 0x29df6 <planner_abort_hard()>

    // Reset the queue
    cmdqueue_reset();
   1be74:	0e 94 3c 85 	call	0x10a78	; 0x10a78 <cmdqueue_reset()>
    cmdqueue_serial_disabled = false;
   1be78:	10 92 93 03 	sts	0x0393, r1	; 0x800393 <cmdqueue_serial_disabled>

    st_reset_timer();
   1be7c:	0f 94 4c 1b 	call	0x23698	; 0x23698 <st_reset_timer()>
    CRITICAL_SECTION_END;
   1be80:	df bf       	out	0x3f, r29	; 63
   1be82:	d4 cf       	rjmp	.-88     	; 0x1be2c <print_stop(bool, bool)+0x3a>

0001be84 <lcd_print_stop()>:
}

void lcd_print_stop()
{
    print_stop(true);
   1be84:	60 e0       	ldi	r22, 0x00	; 0
   1be86:	81 e0       	ldi	r24, 0x01	; 1
   1be88:	0c 94 f9 de 	jmp	0x1bdf2	; 0x1bdf2 <print_stop(bool, bool)>

0001be8c <lcd_show_end_stops() [clone .lto_priv.519]>:
	lcd_update(2);
}

#ifndef TMC2130
static void lcd_show_end_stops() {
	lcd_puts_at_P(0, 0, (PSTR("End stops diag")));
   1be8c:	42 e2       	ldi	r20, 0x22	; 34
   1be8e:	53 e8       	ldi	r21, 0x83	; 131
   1be90:	60 e0       	ldi	r22, 0x00	; 0
   1be92:	80 e0       	ldi	r24, 0x00	; 0
   1be94:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
	lcd_puts_at_P(0, 1, (READ(X_MIN_PIN) ^ (bool)X_MIN_ENDSTOP_INVERTING) ? (PSTR("X1")) : (PSTR("X0")));
   1be98:	1e 99       	sbic	0x03, 6	; 3
   1be9a:	16 c0       	rjmp	.+44     	; 0x1bec8 <lcd_show_end_stops() [clone .lto_priv.519]+0x3c>
   1be9c:	4c e1       	ldi	r20, 0x1C	; 28
   1be9e:	53 e8       	ldi	r21, 0x83	; 131
   1bea0:	61 e0       	ldi	r22, 0x01	; 1
   1bea2:	80 e0       	ldi	r24, 0x00	; 0
   1bea4:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
	lcd_puts_at_P(0, 2, (READ(Y_MIN_PIN) ^ (bool)Y_MIN_ENDSTOP_INVERTING) ? (PSTR("Y1")) : (PSTR("Y0")));
   1bea8:	1d 9b       	sbis	0x03, 5	; 3
   1beaa:	11 c0       	rjmp	.+34     	; 0x1bece <lcd_show_end_stops() [clone .lto_priv.519]+0x42>
   1beac:	49 e1       	ldi	r20, 0x19	; 25
   1beae:	53 e8       	ldi	r21, 0x83	; 131
   1beb0:	62 e0       	ldi	r22, 0x02	; 2
   1beb2:	80 e0       	ldi	r24, 0x00	; 0
   1beb4:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
	lcd_puts_at_P(0, 3, (READ(Z_MIN_PIN) ^ (bool)Z_MIN_ENDSTOP_INVERTING) ? (PSTR("Z1")) : (PSTR("Z0")));
   1beb8:	1c 9b       	sbis	0x03, 4	; 3
   1beba:	0c c0       	rjmp	.+24     	; 0x1bed4 <lcd_show_end_stops() [clone .lto_priv.519]+0x48>
   1bebc:	43 e1       	ldi	r20, 0x13	; 19
   1bebe:	53 e8       	ldi	r21, 0x83	; 131
   1bec0:	63 e0       	ldi	r22, 0x03	; 3
   1bec2:	80 e0       	ldi	r24, 0x00	; 0
   1bec4:	0c 94 07 70 	jmp	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
}

#ifndef TMC2130
static void lcd_show_end_stops() {
	lcd_puts_at_P(0, 0, (PSTR("End stops diag")));
	lcd_puts_at_P(0, 1, (READ(X_MIN_PIN) ^ (bool)X_MIN_ENDSTOP_INVERTING) ? (PSTR("X1")) : (PSTR("X0")));
   1bec8:	4f e1       	ldi	r20, 0x1F	; 31
   1beca:	53 e8       	ldi	r21, 0x83	; 131
   1becc:	e9 cf       	rjmp	.-46     	; 0x1bea0 <lcd_show_end_stops() [clone .lto_priv.519]+0x14>
	lcd_puts_at_P(0, 2, (READ(Y_MIN_PIN) ^ (bool)Y_MIN_ENDSTOP_INVERTING) ? (PSTR("Y1")) : (PSTR("Y0")));
   1bece:	46 e1       	ldi	r20, 0x16	; 22
   1bed0:	53 e8       	ldi	r21, 0x83	; 131
   1bed2:	ee cf       	rjmp	.-36     	; 0x1beb0 <lcd_show_end_stops() [clone .lto_priv.519]+0x24>
	lcd_puts_at_P(0, 3, (READ(Z_MIN_PIN) ^ (bool)Z_MIN_ENDSTOP_INVERTING) ? (PSTR("Z1")) : (PSTR("Z0")));
   1bed4:	40 e1       	ldi	r20, 0x10	; 16
   1bed6:	53 e8       	ldi	r21, 0x83	; 131
   1bed8:	f3 cf       	rjmp	.-26     	; 0x1bec0 <lcd_show_end_stops() [clone .lto_priv.519]+0x34>

0001beda <menu_show_end_stops()>:
}

static void menu_show_end_stops() {
    lcd_show_end_stops();
   1beda:	0e 94 46 df 	call	0x1be8c	; 0x1be8c <lcd_show_end_stops() [clone .lto_priv.519]>
    menu_back_if_clicked();
   1bede:	0c 94 06 74 	jmp	0xe80c	; 0xe80c <menu_back_if_clicked()>

0001bee2 <lcd_show_choices_prompt_P(unsigned char, char const*, char const*, unsigned char, char const*)>:
//! @param first_choice text caption of first possible choice
//! @param second_choice text caption of second possible choice
//! @param second_col column on LCD where second choice is rendered.
//! @param third_choice text caption of third, optional, choice.
void lcd_show_choices_prompt_P(uint8_t selected, const char *first_choice, const char *second_choice, uint8_t second_col, const char *third_choice)
{
   1bee2:	cf 92       	push	r12
   1bee4:	df 92       	push	r13
   1bee6:	ef 92       	push	r14
   1bee8:	ff 92       	push	r15
   1beea:	0f 93       	push	r16
   1beec:	1f 93       	push	r17
   1beee:	cf 93       	push	r28
   1bef0:	df 93       	push	r29
   1bef2:	d8 2f       	mov	r29, r24
   1bef4:	6b 01       	movw	r12, r22
   1bef6:	7a 01       	movw	r14, r20
   1bef8:	c2 2f       	mov	r28, r18
    lcd_putc_at(0, 3, selected == LCD_LEFT_BUTTON_CHOICE ? '>': ' ');
   1befa:	40 e2       	ldi	r20, 0x20	; 32
   1befc:	81 11       	cpse	r24, r1
   1befe:	01 c0       	rjmp	.+2      	; 0x1bf02 <lcd_show_choices_prompt_P(unsigned char, char const*, char const*, unsigned char, char const*)+0x20>
   1bf00:	4e e3       	ldi	r20, 0x3E	; 62
   1bf02:	63 e0       	ldi	r22, 0x03	; 3
   1bf04:	80 e0       	ldi	r24, 0x00	; 0
   1bf06:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
    lcd_puts_P(first_choice);
   1bf0a:	c6 01       	movw	r24, r12
   1bf0c:	0e 94 1d 6f 	call	0xde3a	; 0xde3a <lcd_puts_P(char const*)>
    lcd_putc_at(second_col, 3, selected == LCD_MIDDLE_BUTTON_CHOICE ? '>': ' ');
   1bf10:	40 e2       	ldi	r20, 0x20	; 32
   1bf12:	d1 30       	cpi	r29, 0x01	; 1
   1bf14:	09 f4       	brne	.+2      	; 0x1bf18 <lcd_show_choices_prompt_P(unsigned char, char const*, char const*, unsigned char, char const*)+0x36>
   1bf16:	4e e3       	ldi	r20, 0x3E	; 62
   1bf18:	63 e0       	ldi	r22, 0x03	; 3
   1bf1a:	8c 2f       	mov	r24, r28
   1bf1c:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
    lcd_puts_P(second_choice);
   1bf20:	c7 01       	movw	r24, r14
   1bf22:	0e 94 1d 6f 	call	0xde3a	; 0xde3a <lcd_puts_P(char const*)>
    if (third_choice) {
   1bf26:	01 15       	cp	r16, r1
   1bf28:	11 05       	cpc	r17, r1
   1bf2a:	19 f1       	breq	.+70     	; 0x1bf72 <lcd_show_choices_prompt_P(unsigned char, char const*, char const*, unsigned char, char const*)+0x90>
   1bf2c:	c8 01       	movw	r24, r16
   1bf2e:	0f 94 9e a1 	call	0x3433c	; 0x3433c <__strlen_P>
   1bf32:	d8 2e       	mov	r13, r24
   1bf34:	c7 01       	movw	r24, r14
   1bf36:	0f 94 9e a1 	call	0x3433c	; 0x3433c <__strlen_P>
        ////get size of third_choice, offset to the left. Make sure it doesn't overlap second_choice.
        size_t third_choice_len = strlen_P(third_choice);
        uint8_t second_col_end = second_col + strlen_P(second_choice) + 2;
   1bf3a:	ce 5f       	subi	r28, 0xFE	; 254
        uint8_t third_col;
        if (uint8_t pos = 19 - third_choice_len; pos > second_col_end) {third_col = pos;} else {third_col = second_col_end;}
   1bf3c:	93 e1       	ldi	r25, 0x13	; 19
   1bf3e:	9d 19       	sub	r25, r13
   1bf40:	8c 0f       	add	r24, r28
   1bf42:	89 17       	cp	r24, r25
   1bf44:	08 f4       	brcc	.+2      	; 0x1bf48 <lcd_show_choices_prompt_P(unsigned char, char const*, char const*, unsigned char, char const*)+0x66>
   1bf46:	89 2f       	mov	r24, r25
   1bf48:	83 31       	cpi	r24, 0x13	; 19
   1bf4a:	08 f0       	brcs	.+2      	; 0x1bf4e <lcd_show_choices_prompt_P(unsigned char, char const*, char const*, unsigned char, char const*)+0x6c>
   1bf4c:	82 e1       	ldi	r24, 0x12	; 18
        if (third_col > 18) {third_col = 18;} //backwards compatability - make sure at least one character of the third selection is shown
        lcd_putc_at(third_col, 3, selected == LCD_RIGHT_BUTTON_CHOICE ? '>': ' ');
   1bf4e:	40 e2       	ldi	r20, 0x20	; 32
   1bf50:	d2 30       	cpi	r29, 0x02	; 2
   1bf52:	09 f4       	brne	.+2      	; 0x1bf56 <lcd_show_choices_prompt_P(unsigned char, char const*, char const*, unsigned char, char const*)+0x74>
   1bf54:	4e e3       	ldi	r20, 0x3E	; 62
   1bf56:	63 e0       	ldi	r22, 0x03	; 3
   1bf58:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
        lcd_puts_P(third_choice);
   1bf5c:	c8 01       	movw	r24, r16
    }
}
   1bf5e:	df 91       	pop	r29
   1bf60:	cf 91       	pop	r28
   1bf62:	1f 91       	pop	r17
   1bf64:	0f 91       	pop	r16
   1bf66:	ff 90       	pop	r15
   1bf68:	ef 90       	pop	r14
   1bf6a:	df 90       	pop	r13
   1bf6c:	cf 90       	pop	r12
        uint8_t second_col_end = second_col + strlen_P(second_choice) + 2;
        uint8_t third_col;
        if (uint8_t pos = 19 - third_choice_len; pos > second_col_end) {third_col = pos;} else {third_col = second_col_end;}
        if (third_col > 18) {third_col = 18;} //backwards compatability - make sure at least one character of the third selection is shown
        lcd_putc_at(third_col, 3, selected == LCD_RIGHT_BUTTON_CHOICE ? '>': ' ');
        lcd_puts_P(third_choice);
   1bf6e:	0c 94 1d 6f 	jmp	0xde3a	; 0xde3a <lcd_puts_P(char const*)>
    }
}
   1bf72:	df 91       	pop	r29
   1bf74:	cf 91       	pop	r28
   1bf76:	1f 91       	pop	r17
   1bf78:	0f 91       	pop	r16
   1bf7a:	ff 90       	pop	r15
   1bf7c:	ef 90       	pop	r14
   1bf7e:	df 90       	pop	r13
   1bf80:	cf 90       	pop	r12
   1bf82:	08 95       	ret

0001bf84 <lcd_wait_for_click_delay(unsigned int)>:
}

bool lcd_wait_for_click_delay(uint16_t nDelay)
// nDelay :: timeout [s] (0 ~ no timeout)
// true ~ clicked, false ~ delayed
{
   1bf84:	4f 92       	push	r4
   1bf86:	5f 92       	push	r5
   1bf88:	6f 92       	push	r6
   1bf8a:	7f 92       	push	r7
   1bf8c:	8f 92       	push	r8
   1bf8e:	9f 92       	push	r9
   1bf90:	af 92       	push	r10
   1bf92:	bf 92       	push	r11
   1bf94:	cf 92       	push	r12
   1bf96:	df 92       	push	r13
   1bf98:	ef 92       	push	r14
   1bf9a:	ff 92       	push	r15
   1bf9c:	0f 93       	push	r16
   1bf9e:	1f 93       	push	r17
   1bfa0:	cf 93       	push	r28
   1bfa2:	8c 01       	movw	r16, r24
bool bDelayed;
long nTime0 = _millis()/1000;
   1bfa4:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   1bfa8:	28 ee       	ldi	r18, 0xE8	; 232
   1bfaa:	33 e0       	ldi	r19, 0x03	; 3
   1bfac:	40 e0       	ldi	r20, 0x00	; 0
   1bfae:	50 e0       	ldi	r21, 0x00	; 0
   1bfb0:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
   1bfb4:	69 01       	movw	r12, r18
   1bfb6:	7a 01       	movw	r14, r20
	lcd_consume_click();
   1bfb8:	0e 94 70 73 	call	0xe6e0	; 0xe6e0 <lcd_consume_click()>
	KEEPALIVE_STATE(PAUSED_FOR_USER);
   1bfbc:	84 e0       	ldi	r24, 0x04	; 4
   1bfbe:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
    for (;;) {
        manage_heater();
        manage_inactivity(true);
        bDelayed = ((_millis()/1000-nTime0) > nDelay);
   1bfc2:	88 ee       	ldi	r24, 0xE8	; 232
   1bfc4:	88 2e       	mov	r8, r24
   1bfc6:	83 e0       	ldi	r24, 0x03	; 3
   1bfc8:	98 2e       	mov	r9, r24
   1bfca:	a1 2c       	mov	r10, r1
   1bfcc:	b1 2c       	mov	r11, r1
   1bfce:	28 01       	movw	r4, r16
   1bfd0:	71 2c       	mov	r7, r1
   1bfd2:	61 2c       	mov	r6, r1
bool bDelayed;
long nTime0 = _millis()/1000;
	lcd_consume_click();
	KEEPALIVE_STATE(PAUSED_FOR_USER);
    for (;;) {
        manage_heater();
   1bfd4:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
        manage_inactivity(true);
   1bfd8:	81 e0       	ldi	r24, 0x01	; 1
   1bfda:	0e 94 34 8c 	call	0x11868	; 0x11868 <manage_inactivity(bool)>
        bDelayed = ((_millis()/1000-nTime0) > nDelay);
   1bfde:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   1bfe2:	a5 01       	movw	r20, r10
   1bfe4:	94 01       	movw	r18, r8
   1bfe6:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
   1bfea:	2c 19       	sub	r18, r12
   1bfec:	3d 09       	sbc	r19, r13
   1bfee:	4e 09       	sbc	r20, r14
   1bff0:	5f 09       	sbc	r21, r15
        bDelayed = (bDelayed && (nDelay != 0));   // 0 ~ no timeout, always waiting for click
   1bff2:	42 16       	cp	r4, r18
   1bff4:	53 06       	cpc	r5, r19
   1bff6:	64 06       	cpc	r6, r20
   1bff8:	75 06       	cpc	r7, r21
   1bffa:	20 f4       	brcc	.+8      	; 0x1c004 <lcd_wait_for_click_delay(unsigned int)+0x80>
   1bffc:	c1 e0       	ldi	r28, 0x01	; 1
   1bffe:	01 15       	cp	r16, r1
   1c000:	11 05       	cpc	r17, r1
   1c002:	09 f4       	brne	.+2      	; 0x1c006 <lcd_wait_for_click_delay(unsigned int)+0x82>
   1c004:	c0 e0       	ldi	r28, 0x00	; 0
        if (lcd_clicked() || bDelayed) {
   1c006:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   1c00a:	81 11       	cpse	r24, r1
   1c00c:	02 c0       	rjmp	.+4      	; 0x1c012 <lcd_wait_for_click_delay(unsigned int)+0x8e>
   1c00e:	cc 23       	and	r28, r28
   1c010:	09 f3       	breq	.-62     	; 0x1bfd4 <lcd_wait_for_click_delay(unsigned int)+0x50>
			KEEPALIVE_STATE(IN_HANDLER);
   1c012:	82 e0       	ldi	r24, 0x02	; 2
   1c014:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
            return(!bDelayed);
        }
    }
}
   1c018:	81 e0       	ldi	r24, 0x01	; 1
   1c01a:	8c 27       	eor	r24, r28
   1c01c:	cf 91       	pop	r28
   1c01e:	1f 91       	pop	r17
   1c020:	0f 91       	pop	r16
   1c022:	ff 90       	pop	r15
   1c024:	ef 90       	pop	r14
   1c026:	df 90       	pop	r13
   1c028:	cf 90       	pop	r12
   1c02a:	bf 90       	pop	r11
   1c02c:	af 90       	pop	r10
   1c02e:	9f 90       	pop	r9
   1c030:	8f 90       	pop	r8
   1c032:	7f 90       	pop	r7
   1c034:	6f 90       	pop	r6
   1c036:	5f 90       	pop	r5
   1c038:	4f 90       	pop	r4
   1c03a:	08 95       	ret

0001c03c <lcd_display_message_fullscreen_nonBlocking_P(char const*) [clone .lto_priv.484]>:
 * This function is non-blocking
 * @param msg message to be displayed from PROGMEM
 * @return rest of the text (to be displayed on next page)
 */
static const char* lcd_display_message_fullscreen_nonBlocking_P(const char *msg)
{
   1c03c:	af 92       	push	r10
   1c03e:	bf 92       	push	r11
   1c040:	cf 92       	push	r12
   1c042:	df 92       	push	r13
   1c044:	ef 92       	push	r14
   1c046:	ff 92       	push	r15
   1c048:	0f 93       	push	r16
   1c04a:	1f 93       	push	r17
   1c04c:	cf 93       	push	r28
   1c04e:	df 93       	push	r29
   1c050:	6c 01       	movw	r12, r24
    const char *msgend = msg;
    bool multi_screen = false;
    lcd_frame_start();
   1c052:	0e 94 e6 6e 	call	0xddcc	; 0xddcc <lcd_frame_start()>
 * @param msg message to be displayed from PROGMEM
 * @return rest of the text (to be displayed on next page)
 */
static const char* lcd_display_message_fullscreen_nonBlocking_P(const char *msg)
{
    const char *msgend = msg;
   1c056:	e6 01       	movw	r28, r12
    bool multi_screen = false;
    lcd_frame_start();
    for (uint8_t row = 0; row < LCD_HEIGHT; ++ row) {
   1c058:	f1 2c       	mov	r15, r1
 * @return rest of the text (to be displayed on next page)
 */
static const char* lcd_display_message_fullscreen_nonBlocking_P(const char *msg)
{
    const char *msgend = msg;
    bool multi_screen = false;
   1c05a:	e1 2c       	mov	r14, r1
    lcd_frame_start();
    for (uint8_t row = 0; row < LCD_HEIGHT; ++ row) {
        lcd_set_cursor(0, row);
   1c05c:	6f 2d       	mov	r22, r15
   1c05e:	80 e0       	ldi	r24, 0x00	; 0
   1c060:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>

        // Previous row ended with a complete word, so the first character in the
        // next row is a whitespace. We can skip the whitespace on a new line.
        if (pgm_is_whitespace(msg) && ++msg == nullptr)
   1c064:	c6 01       	movw	r24, r12
   1c066:	0e 94 fa bd 	call	0x17bf4	; 0x17bf4 <pgm_is_whitespace(char const*)>
   1c06a:	88 23       	and	r24, r24
   1c06c:	29 f0       	breq	.+10     	; 0x1c078 <lcd_display_message_fullscreen_nonBlocking_P(char const*) [clone .lto_priv.484]+0x3c>
   1c06e:	8f ef       	ldi	r24, 0xFF	; 255
   1c070:	c8 1a       	sub	r12, r24
   1c072:	d8 0a       	sbc	r13, r24
   1c074:	09 f4       	brne	.+2      	; 0x1c078 <lcd_display_message_fullscreen_nonBlocking_P(char const*) [clone .lto_priv.484]+0x3c>
   1c076:	49 c0       	rjmp	.+146    	; 0x1c10a <lcd_display_message_fullscreen_nonBlocking_P(char const*) [clone .lto_priv.484]+0xce>
   1c078:	c6 01       	movw	r24, r12
   1c07a:	0f 94 9e a1 	call	0x3433c	; 0x3433c <__strlen_P>
        {
            // End of the message.
            break;
        }

        uint8_t linelen = min(strlen_P(msg), LCD_WIDTH);
   1c07e:	84 31       	cpi	r24, 0x14	; 20
   1c080:	91 05       	cpc	r25, r1
   1c082:	10 f0       	brcs	.+4      	; 0x1c088 <lcd_display_message_fullscreen_nonBlocking_P(char const*) [clone .lto_priv.484]+0x4c>
   1c084:	84 e1       	ldi	r24, 0x14	; 20
   1c086:	90 e0       	ldi	r25, 0x00	; 0
        const char *msgend2 = msg + linelen;
   1c088:	e6 01       	movw	r28, r12
   1c08a:	c8 0f       	add	r28, r24
   1c08c:	d9 1f       	adc	r29, r25
        msgend = msgend2;
        if (row == 3 && linelen == LCD_WIDTH) {
   1c08e:	e3 e0       	ldi	r30, 0x03	; 3
   1c090:	fe 12       	cpse	r15, r30
   1c092:	0a c0       	rjmp	.+20     	; 0x1c0a8 <lcd_display_message_fullscreen_nonBlocking_P(char const*) [clone .lto_priv.484]+0x6c>
   1c094:	84 31       	cpi	r24, 0x14	; 20
   1c096:	41 f4       	brne	.+16     	; 0x1c0a8 <lcd_display_message_fullscreen_nonBlocking_P(char const*) [clone .lto_priv.484]+0x6c>
            // Last line of the display, full line shall be displayed.
            // Find out, whether this message will be split into multiple screens.
            multi_screen = pgm_read_byte(msgend) != 0;
   1c098:	fe 01       	movw	r30, r28
   1c09a:	84 91       	lpm	r24, Z
   1c09c:	e1 2c       	mov	r14, r1
            if (multi_screen)
   1c09e:	88 23       	and	r24, r24
   1c0a0:	19 f0       	breq	.+6      	; 0x1c0a8 <lcd_display_message_fullscreen_nonBlocking_P(char const*) [clone .lto_priv.484]+0x6c>
                msgend = (msgend2 -= 2);
   1c0a2:	22 97       	sbiw	r28, 0x02	; 2
        const char *msgend2 = msg + linelen;
        msgend = msgend2;
        if (row == 3 && linelen == LCD_WIDTH) {
            // Last line of the display, full line shall be displayed.
            // Find out, whether this message will be split into multiple screens.
            multi_screen = pgm_read_byte(msgend) != 0;
   1c0a4:	ee 24       	eor	r14, r14
   1c0a6:	e3 94       	inc	r14
            if (multi_screen)
                msgend = (msgend2 -= 2);
        }
        if (pgm_read_byte(msgend) != 0 && ! pgm_is_whitespace(msgend) && ! pgm_is_interpunction(msgend)) {
   1c0a8:	fe 01       	movw	r30, r28
   1c0aa:	84 91       	lpm	r24, Z
   1c0ac:	88 23       	and	r24, r24
   1c0ae:	09 f4       	brne	.+2      	; 0x1c0b2 <lcd_display_message_fullscreen_nonBlocking_P(char const*) [clone .lto_priv.484]+0x76>
   1c0b0:	40 c0       	rjmp	.+128    	; 0x1c132 <lcd_display_message_fullscreen_nonBlocking_P(char const*) [clone .lto_priv.484]+0xf6>
   1c0b2:	ce 01       	movw	r24, r28
   1c0b4:	0e 94 fa bd 	call	0x17bf4	; 0x17bf4 <pgm_is_whitespace(char const*)>
   1c0b8:	81 11       	cpse	r24, r1
   1c0ba:	3b c0       	rjmp	.+118    	; 0x1c132 <lcd_display_message_fullscreen_nonBlocking_P(char const*) [clone .lto_priv.484]+0xf6>
    return c == ' ' || c == '\t' || c == '\r' || c == '\n';
}

static inline bool pgm_is_interpunction(const char *c_addr)
{
    const char c = pgm_read_byte(c_addr);
   1c0bc:	fe 01       	movw	r30, r28
   1c0be:	84 91       	lpm	r24, Z
    return c == '.' || c == ',' || c == ':'|| c == ';' || c == '?' || c == '!' || c == '/';
   1c0c0:	92 ed       	ldi	r25, 0xD2	; 210
   1c0c2:	98 0f       	add	r25, r24
   1c0c4:	92 30       	cpi	r25, 0x02	; 2
   1c0c6:	a8 f1       	brcs	.+106    	; 0x1c132 <lcd_display_message_fullscreen_nonBlocking_P(char const*) [clone .lto_priv.484]+0xf6>
   1c0c8:	8c 32       	cpi	r24, 0x2C	; 44
   1c0ca:	99 f1       	breq	.+102    	; 0x1c132 <lcd_display_message_fullscreen_nonBlocking_P(char const*) [clone .lto_priv.484]+0xf6>
   1c0cc:	96 ec       	ldi	r25, 0xC6	; 198
   1c0ce:	98 0f       	add	r25, r24
   1c0d0:	92 30       	cpi	r25, 0x02	; 2
   1c0d2:	78 f1       	brcs	.+94     	; 0x1c132 <lcd_display_message_fullscreen_nonBlocking_P(char const*) [clone .lto_priv.484]+0xf6>
   1c0d4:	8f 33       	cpi	r24, 0x3F	; 63
   1c0d6:	69 f1       	breq	.+90     	; 0x1c132 <lcd_display_message_fullscreen_nonBlocking_P(char const*) [clone .lto_priv.484]+0xf6>
   1c0d8:	81 32       	cpi	r24, 0x21	; 33
   1c0da:	59 f1       	breq	.+86     	; 0x1c132 <lcd_display_message_fullscreen_nonBlocking_P(char const*) [clone .lto_priv.484]+0xf6>
   1c0dc:	8e 01       	movw	r16, r28
            if (multi_screen)
                msgend = (msgend2 -= 2);
        }
        if (pgm_read_byte(msgend) != 0 && ! pgm_is_whitespace(msgend) && ! pgm_is_interpunction(msgend)) {
            // Splitting a word. Find the start of the current word.
            while (msgend > msg && ! pgm_is_whitespace(msgend - 1))
   1c0de:	c0 16       	cp	r12, r16
   1c0e0:	d1 06       	cpc	r13, r17
   1c0e2:	58 f4       	brcc	.+22     	; 0x1c0fa <lcd_display_message_fullscreen_nonBlocking_P(char const*) [clone .lto_priv.484]+0xbe>
   1c0e4:	58 01       	movw	r10, r16
   1c0e6:	f1 e0       	ldi	r31, 0x01	; 1
   1c0e8:	af 1a       	sub	r10, r31
   1c0ea:	b1 08       	sbc	r11, r1
   1c0ec:	c5 01       	movw	r24, r10
   1c0ee:	0e 94 fa bd 	call	0x17bf4	; 0x17bf4 <pgm_is_whitespace(char const*)>
   1c0f2:	81 11       	cpse	r24, r1
   1c0f4:	1d c0       	rjmp	.+58     	; 0x1c130 <lcd_display_message_fullscreen_nonBlocking_P(char const*) [clone .lto_priv.484]+0xf4>
                 -- msgend;
   1c0f6:	85 01       	movw	r16, r10
   1c0f8:	f2 cf       	rjmp	.-28     	; 0x1c0de <lcd_display_message_fullscreen_nonBlocking_P(char const*) [clone .lto_priv.484]+0xa2>
            if (msgend == msg)
   1c0fa:	c0 16       	cp	r12, r16
   1c0fc:	d1 06       	cpc	r13, r17
   1c0fe:	c9 f0       	breq	.+50     	; 0x1c132 <lcd_display_message_fullscreen_nonBlocking_P(char const*) [clone .lto_priv.484]+0xf6>
   1c100:	e8 01       	movw	r28, r16
static const char* lcd_display_message_fullscreen_nonBlocking_P(const char *msg)
{
    const char *msgend = msg;
    bool multi_screen = false;
    lcd_frame_start();
    for (uint8_t row = 0; row < LCD_HEIGHT; ++ row) {
   1c102:	f3 94       	inc	r15
   1c104:	84 e0       	ldi	r24, 0x04	; 4
   1c106:	f8 12       	cpse	r15, r24
   1c108:	a9 cf       	rjmp	.-174    	; 0x1c05c <lcd_display_message_fullscreen_nonBlocking_P(char const*) [clone .lto_priv.484]+0x20>
            }
            lcd_print(c);
        }
    }

    if (multi_screen) {
   1c10a:	ee 20       	and	r14, r14
   1c10c:	f9 f0       	breq	.+62     	; 0x1c14c <lcd_display_message_fullscreen_nonBlocking_P(char const*) [clone .lto_priv.484]+0x110>
        // Display the double down arrow.
        lcd_putc_at(19, 3, LCD_STR_ARROW_2_DOWN[0]);
   1c10e:	48 e8       	ldi	r20, 0x88	; 136
   1c110:	63 e0       	ldi	r22, 0x03	; 3
   1c112:	83 e1       	ldi	r24, 0x13	; 19
   1c114:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
    }

    return multi_screen ? msgend : NULL;
}
   1c118:	ce 01       	movw	r24, r28
   1c11a:	df 91       	pop	r29
   1c11c:	cf 91       	pop	r28
   1c11e:	1f 91       	pop	r17
   1c120:	0f 91       	pop	r16
   1c122:	ff 90       	pop	r15
   1c124:	ef 90       	pop	r14
   1c126:	df 90       	pop	r13
   1c128:	cf 90       	pop	r12
   1c12a:	bf 90       	pop	r11
   1c12c:	af 90       	pop	r10
   1c12e:	08 95       	ret
            if (multi_screen)
                msgend = (msgend2 -= 2);
        }
        if (pgm_read_byte(msgend) != 0 && ! pgm_is_whitespace(msgend) && ! pgm_is_interpunction(msgend)) {
            // Splitting a word. Find the start of the current word.
            while (msgend > msg && ! pgm_is_whitespace(msgend - 1))
   1c130:	e8 01       	movw	r28, r16
                 -- msgend;
            if (msgend == msg)
                // Found a single long word, which cannot be split. Just cut it.
                msgend = msgend2;
        }
        for (; msg < msgend; ++ msg) {
   1c132:	cc 16       	cp	r12, r28
   1c134:	dd 06       	cpc	r13, r29
   1c136:	28 f7       	brcc	.-54     	; 0x1c102 <lcd_display_message_fullscreen_nonBlocking_P(char const*) [clone .lto_priv.484]+0xc6>
            char c = char(pgm_read_byte(msg));
   1c138:	f6 01       	movw	r30, r12
   1c13a:	84 91       	lpm	r24, Z
            if (c == '\n') {
   1c13c:	8a 30       	cpi	r24, 0x0A	; 10
   1c13e:	09 f3       	breq	.-62     	; 0x1c102 <lcd_display_message_fullscreen_nonBlocking_P(char const*) [clone .lto_priv.484]+0xc6>
}

void lcd_print(long n, int base)
{
	if (base == 0)
		lcd_write(n);
   1c140:	0e 94 a2 70 	call	0xe144	; 0xe144 <lcd_write(unsigned char) [clone .lto_priv.402]>
                 -- msgend;
            if (msgend == msg)
                // Found a single long word, which cannot be split. Just cut it.
                msgend = msgend2;
        }
        for (; msg < msgend; ++ msg) {
   1c144:	ff ef       	ldi	r31, 0xFF	; 255
   1c146:	cf 1a       	sub	r12, r31
   1c148:	df 0a       	sbc	r13, r31
   1c14a:	f3 cf       	rjmp	.-26     	; 0x1c132 <lcd_display_message_fullscreen_nonBlocking_P(char const*) [clone .lto_priv.484]+0xf6>
    if (multi_screen) {
        // Display the double down arrow.
        lcd_putc_at(19, 3, LCD_STR_ARROW_2_DOWN[0]);
    }

    return multi_screen ? msgend : NULL;
   1c14c:	d0 e0       	ldi	r29, 0x00	; 0
   1c14e:	c0 e0       	ldi	r28, 0x00	; 0
   1c150:	e3 cf       	rjmp	.-58     	; 0x1c118 <lcd_display_message_fullscreen_nonBlocking_P(char const*) [clone .lto_priv.484]+0xdc>

0001c152 <lcd_display_message_fullscreen_P(char const*)>:
}

const char* lcd_display_message_fullscreen_P(const char *msg)
{
   1c152:	cf 93       	push	r28
   1c154:	df 93       	push	r29
   1c156:	ec 01       	movw	r28, r24
    // Disable update of the screen by the usual lcd_update(0) routine.
    lcd_update_enable(false);
   1c158:	80 e0       	ldi	r24, 0x00	; 0
   1c15a:	0e 94 38 70 	call	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>
    lcd_clear();
   1c15e:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
    return lcd_display_message_fullscreen_nonBlocking_P(msg);
   1c162:	ce 01       	movw	r24, r28
}
   1c164:	df 91       	pop	r29
   1c166:	cf 91       	pop	r28
const char* lcd_display_message_fullscreen_P(const char *msg)
{
    // Disable update of the screen by the usual lcd_update(0) routine.
    lcd_update_enable(false);
    lcd_clear();
    return lcd_display_message_fullscreen_nonBlocking_P(msg);
   1c168:	0c 94 1e e0 	jmp	0x1c03c	; 0x1c03c <lcd_display_message_fullscreen_nonBlocking_P(char const*) [clone .lto_priv.484]>

0001c16c <lcd_selftest()>:
{
	(void)lcd_selftest();
}

bool lcd_selftest()
{
   1c16c:	cf 92       	push	r12
   1c16e:	df 92       	push	r13
   1c170:	ef 92       	push	r14
   1c172:	ff 92       	push	r15
   1c174:	0f 93       	push	r16
   1c176:	1f 93       	push	r17
   1c178:	cf 93       	push	r28
   1c17a:	df 93       	push	r29
   1c17c:	00 d0       	rcall	.+0      	; 0x1c17e <lcd_selftest()+0x12>
   1c17e:	1f 92       	push	r1
   1c180:	cd b7       	in	r28, 0x3d	; 61
   1c182:	de b7       	in	r29, 0x3e	; 62
		lcd_printf_P(PSTR("%3d/%3d"), (int16_t)degHotend(active_extruder), (int16_t) degTargetHotend(active_extruder));
		lcd_putc(LCD_STR_DEGREE[0]);
}

void lcd_wait_for_cool_down() {
	disable_heater();
   1c184:	0f 94 05 11 	call	0x2220a	; 0x2220a <disable_heater()>
	uint8_t fanSpeedBckp = fanSpeed;
   1c188:	d0 90 55 12 	lds	r13, 0x1255	; 0x801255 <fanSpeed>
	fanSpeed = 255;
   1c18c:	8f ef       	ldi	r24, 0xFF	; 255
   1c18e:	80 93 55 12 	sts	0x1255, r24	; 0x801255 <fanSpeed>
	while ((degHotend(0)>MAX_HOTEND_TEMP_CALIBRATION) || (degBed() > MAX_BED_TEMP_CALIBRATION)) {
		lcd_display_message_fullscreen_P(_T(MSG_WAITING_TEMP));

		lcd_putc_at(0, 4, LCD_STR_THERMOMETER[0]);
		lcd_printf_P(PSTR("%3d/0"), (int16_t)degHotend(0));
   1c192:	8f ec       	ldi	r24, 0xCF	; 207
   1c194:	e8 2e       	mov	r14, r24
   1c196:	83 e8       	ldi	r24, 0x83	; 131
   1c198:	f8 2e       	mov	r15, r24
		lcd_putc(LCD_STR_DEGREE[0]);

		lcd_putc_at(9, 4, LCD_STR_BEDTEMP[0]);
		lcd_printf_P(PSTR("%3d/0"), (int16_t)degBed());
   1c19a:	09 ec       	ldi	r16, 0xC9	; 201
   1c19c:	13 e8       	ldi	r17, 0x83	; 131

void lcd_wait_for_cool_down() {
	disable_heater();
	uint8_t fanSpeedBckp = fanSpeed;
	fanSpeed = 255;
	while ((degHotend(0)>MAX_HOTEND_TEMP_CALIBRATION) || (degBed() > MAX_BED_TEMP_CALIBRATION)) {
   1c19e:	20 e0       	ldi	r18, 0x00	; 0
   1c1a0:	30 e0       	ldi	r19, 0x00	; 0
   1c1a2:	48 e4       	ldi	r20, 0x48	; 72
   1c1a4:	52 e4       	ldi	r21, 0x42	; 66
   1c1a6:	60 91 5a 0d 	lds	r22, 0x0D5A	; 0x800d5a <current_temperature>
   1c1aa:	70 91 5b 0d 	lds	r23, 0x0D5B	; 0x800d5b <current_temperature+0x1>
   1c1ae:	80 91 5c 0d 	lds	r24, 0x0D5C	; 0x800d5c <current_temperature+0x2>
   1c1b2:	90 91 5d 0d 	lds	r25, 0x0D5D	; 0x800d5d <current_temperature+0x3>
   1c1b6:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   1c1ba:	18 16       	cp	r1, r24
   1c1bc:	8c f0       	brlt	.+34     	; 0x1c1e0 <lcd_selftest()+0x74>
   1c1be:	20 e0       	ldi	r18, 0x00	; 0
   1c1c0:	30 e0       	ldi	r19, 0x00	; 0
   1c1c2:	48 e4       	ldi	r20, 0x48	; 72
   1c1c4:	52 e4       	ldi	r21, 0x42	; 66
   1c1c6:	60 91 bc 03 	lds	r22, 0x03BC	; 0x8003bc <current_temperature_bed>
   1c1ca:	70 91 bd 03 	lds	r23, 0x03BD	; 0x8003bd <current_temperature_bed+0x1>
   1c1ce:	80 91 be 03 	lds	r24, 0x03BE	; 0x8003be <current_temperature_bed+0x2>
   1c1d2:	90 91 bf 03 	lds	r25, 0x03BF	; 0x8003bf <current_temperature_bed+0x3>
   1c1d6:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   1c1da:	18 16       	cp	r1, r24
   1c1dc:	0c f0       	brlt	.+2      	; 0x1c1e0 <lcd_selftest()+0x74>
   1c1de:	42 c0       	rjmp	.+132    	; 0x1c264 <lcd_selftest()+0xf8>
		lcd_display_message_fullscreen_P(_T(MSG_WAITING_TEMP));
   1c1e0:	86 ee       	ldi	r24, 0xE6	; 230
   1c1e2:	98 e4       	ldi	r25, 0x48	; 72
   1c1e4:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1c1e8:	0e 94 a9 e0 	call	0x1c152	; 0x1c152 <lcd_display_message_fullscreen_P(char const*)>

		lcd_putc_at(0, 4, LCD_STR_THERMOMETER[0]);
   1c1ec:	42 e8       	ldi	r20, 0x82	; 130
   1c1ee:	64 e0       	ldi	r22, 0x04	; 4
   1c1f0:	80 e0       	ldi	r24, 0x00	; 0
   1c1f2:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
		lcd_printf_P(PSTR("%3d/0"), (int16_t)degHotend(0));
   1c1f6:	60 91 5a 0d 	lds	r22, 0x0D5A	; 0x800d5a <current_temperature>
   1c1fa:	70 91 5b 0d 	lds	r23, 0x0D5B	; 0x800d5b <current_temperature+0x1>
   1c1fe:	80 91 5c 0d 	lds	r24, 0x0D5C	; 0x800d5c <current_temperature+0x2>
   1c202:	90 91 5d 0d 	lds	r25, 0x0D5D	; 0x800d5d <current_temperature+0x3>
   1c206:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   1c20a:	7f 93       	push	r23
   1c20c:	6f 93       	push	r22
   1c20e:	ff 92       	push	r15
   1c210:	ef 92       	push	r14
   1c212:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
		lcd_putc(LCD_STR_DEGREE[0]);
   1c216:	81 e8       	ldi	r24, 0x81	; 129
   1c218:	0e 94 21 6f 	call	0xde42	; 0xde42 <lcd_putc(char)>

		lcd_putc_at(9, 4, LCD_STR_BEDTEMP[0]);
   1c21c:	40 e8       	ldi	r20, 0x80	; 128
   1c21e:	64 e0       	ldi	r22, 0x04	; 4
   1c220:	89 e0       	ldi	r24, 0x09	; 9
   1c222:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
		lcd_printf_P(PSTR("%3d/0"), (int16_t)degBed());
   1c226:	60 91 bc 03 	lds	r22, 0x03BC	; 0x8003bc <current_temperature_bed>
   1c22a:	70 91 bd 03 	lds	r23, 0x03BD	; 0x8003bd <current_temperature_bed+0x1>
   1c22e:	80 91 be 03 	lds	r24, 0x03BE	; 0x8003be <current_temperature_bed+0x2>
   1c232:	90 91 bf 03 	lds	r25, 0x03BF	; 0x8003bf <current_temperature_bed+0x3>
   1c236:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   1c23a:	7f 93       	push	r23
   1c23c:	6f 93       	push	r22
   1c23e:	1f 93       	push	r17
   1c240:	0f 93       	push	r16
   1c242:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
		lcd_putc(LCD_STR_DEGREE[0]);
   1c246:	81 e8       	ldi	r24, 0x81	; 129
   1c248:	0e 94 21 6f 	call	0xde42	; 0xde42 <lcd_putc(char)>
		delay_keep_alive(1000);
   1c24c:	88 ee       	ldi	r24, 0xE8	; 232
   1c24e:	93 e0       	ldi	r25, 0x03	; 3
   1c250:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
		serialecho_temperatures();
   1c254:	0e 94 d2 7a 	call	0xf5a4	; 0xf5a4 <serialecho_temperatures()>
   1c258:	0f b6       	in	r0, 0x3f	; 63
   1c25a:	f8 94       	cli
   1c25c:	de bf       	out	0x3e, r29	; 62
   1c25e:	0f be       	out	0x3f, r0	; 63
   1c260:	cd bf       	out	0x3d, r28	; 61
   1c262:	9d cf       	rjmp	.-198    	; 0x1c19e <lcd_selftest()+0x32>
	}
	fanSpeed = fanSpeedBckp;
   1c264:	d0 92 55 12 	sts	0x1255, r13	; 0x801255 <fanSpeed>
	lcd_update_enable(true);
   1c268:	81 e0       	ldi	r24, 0x01	; 1
   1c26a:	0e 94 38 70 	call	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>
			lcd_detect_IRsensor();
		}
	}
#endif
	lcd_wait_for_cool_down();
	lcd_clear();
   1c26e:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
	lcd_puts_at_P(0, 0, _T(MSG_SELFTEST_START));
   1c272:	89 e1       	ldi	r24, 0x19	; 25
   1c274:	99 e4       	ldi	r25, 0x49	; 73
   1c276:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1c27a:	ac 01       	movw	r20, r24
   1c27c:	60 e0       	ldi	r22, 0x00	; 0
   1c27e:	80 e0       	ldi	r24, 0x00	; 0
   1c280:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
	#ifdef TMC2130
	  FORCE_HIGH_POWER_START;
	#endif // TMC2130
	FORCE_BL_ON_START;
	_delay(2000);
   1c284:	60 ed       	ldi	r22, 0xD0	; 208
   1c286:	77 e0       	ldi	r23, 0x07	; 7
   1c288:	80 e0       	ldi	r24, 0x00	; 0
   1c28a:	90 e0       	ldi	r25, 0x00	; 0
   1c28c:	0f 94 bd 0d 	call	0x21b7a	; 0x21b7a <delay2>
	KEEPALIVE_STATE(IN_HANDLER);
   1c290:	82 e0       	ldi	r24, 0x02	; 2
   1c292:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>

	_progress = lcd_selftest_screen(TestScreen::ExtruderFan, _progress, 3, true, 2000);
   1c296:	00 ed       	ldi	r16, 0xD0	; 208
   1c298:	17 e0       	ldi	r17, 0x07	; 7
   1c29a:	21 e0       	ldi	r18, 0x01	; 1
   1c29c:	43 e0       	ldi	r20, 0x03	; 3
   1c29e:	60 e0       	ldi	r22, 0x00	; 0
   1c2a0:	80 e0       	ldi	r24, 0x00	; 0
   1c2a2:	0e 94 f8 c4 	call	0x189f0	; 0x189f0 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
   1c2a6:	f8 2e       	mov	r15, r24
    // speed threshold to mark a fan as failed
    static const int failThr = FANCHECK_AUTO_FAIL_THRS; // < FANCHECK_AUTO_FAIL_THRS RPM would mean either a faulty Noctua, Altfan or print fan

	switch (_fan) {
	case 0:
        setExtruderAutoFanState(3); // hotend fan
   1c2a8:	83 e0       	ldi	r24, 0x03	; 3
   1c2aa:	0e 94 af 77 	call	0xef5e	; 0xef5e <setExtruderAutoFanState(unsigned char)>
}

/// @brief Set print fan speed
/// @param speed ranges from 0 to 255
static void lcd_selftest_setfan(const uint8_t speed) {
    fanSpeed = speed;
   1c2ae:	10 92 55 12 	sts	0x1255, r1	; 0x801255 <fanSpeed>
#ifdef FAN_SOFT_PWM
    fanSpeedSoftPwm = speed;
   1c2b2:	10 92 1d 06 	sts	0x061D, r1	; 0x80061d <fanSpeedSoftPwm>
#endif
    manage_heater();
   1c2b6:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
    // spin-up delay
    static char symbols[] = {'-', '|'};
    static_assert(1000 / sizeof(symbols) * sizeof(symbols) == 1000);
    while(delay--) {
        for(uint8_t i = 0; i != sizeof(symbols); ++i) {
            lcd_putc_at(col, row, symbols[i]);
   1c2ba:	4d e2       	ldi	r20, 0x2D	; 45
   1c2bc:	62 e0       	ldi	r22, 0x02	; 2
   1c2be:	82 e1       	ldi	r24, 0x12	; 18
   1c2c0:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
            delay_keep_alive(1000 / sizeof(symbols));
   1c2c4:	84 ef       	ldi	r24, 0xF4	; 244
   1c2c6:	91 e0       	ldi	r25, 0x01	; 1
   1c2c8:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
    // spin-up delay
    static char symbols[] = {'-', '|'};
    static_assert(1000 / sizeof(symbols) * sizeof(symbols) == 1000);
    while(delay--) {
        for(uint8_t i = 0; i != sizeof(symbols); ++i) {
            lcd_putc_at(col, row, symbols[i]);
   1c2cc:	4c e7       	ldi	r20, 0x7C	; 124
   1c2ce:	62 e0       	ldi	r22, 0x02	; 2
   1c2d0:	82 e1       	ldi	r24, 0x12	; 18
   1c2d2:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
            delay_keep_alive(1000 / sizeof(symbols));
   1c2d6:	84 ef       	ldi	r24, 0xF4	; 244
   1c2d8:	91 e0       	ldi	r25, 0x01	; 1
   1c2da:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
    // spin-up delay
    static char symbols[] = {'-', '|'};
    static_assert(1000 / sizeof(symbols) * sizeof(symbols) == 1000);
    while(delay--) {
        for(uint8_t i = 0; i != sizeof(symbols); ++i) {
            lcd_putc_at(col, row, symbols[i]);
   1c2de:	4d e2       	ldi	r20, 0x2D	; 45
   1c2e0:	62 e0       	ldi	r22, 0x02	; 2
   1c2e2:	82 e1       	ldi	r24, 0x12	; 18
   1c2e4:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
            delay_keep_alive(1000 / sizeof(symbols));
   1c2e8:	84 ef       	ldi	r24, 0xF4	; 244
   1c2ea:	91 e0       	ldi	r25, 0x01	; 1
   1c2ec:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
    // spin-up delay
    static char symbols[] = {'-', '|'};
    static_assert(1000 / sizeof(symbols) * sizeof(symbols) == 1000);
    while(delay--) {
        for(uint8_t i = 0; i != sizeof(symbols); ++i) {
            lcd_putc_at(col, row, symbols[i]);
   1c2f0:	4c e7       	ldi	r20, 0x7C	; 124
   1c2f2:	62 e0       	ldi	r22, 0x02	; 2
   1c2f4:	82 e1       	ldi	r24, 0x12	; 18
   1c2f6:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
            delay_keep_alive(1000 / sizeof(symbols));
   1c2fa:	84 ef       	ldi	r24, 0xF4	; 244
   1c2fc:	91 e0       	ldi	r25, 0x01	; 1
   1c2fe:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
        }
    }

#ifdef FANCHECK
    extruder_autofan_last_check = _millis();
   1c302:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   1c306:	60 93 07 17 	sts	0x1707, r22	; 0x801707 <extruder_autofan_last_check>
   1c30a:	70 93 08 17 	sts	0x1708, r23	; 0x801708 <extruder_autofan_last_check+0x1>
   1c30e:	80 93 09 17 	sts	0x1709, r24	; 0x801709 <extruder_autofan_last_check+0x2>
   1c312:	90 93 0a 17 	sts	0x170A, r25	; 0x80170a <extruder_autofan_last_check+0x3>
#endif
    fan_measuring = true;
   1c316:	81 e0       	ldi	r24, 0x01	; 1
   1c318:	80 93 b6 03 	sts	0x03B6, r24	; 0x8003b6 <fan_measuring>
    while(fan_measuring) {
   1c31c:	80 91 b6 03 	lds	r24, 0x03B6	; 0x8003b6 <fan_measuring>
   1c320:	88 23       	and	r24, r24
   1c322:	29 f0       	breq	.+10     	; 0x1c32e <lcd_selftest()+0x1c2>
        delay_keep_alive(100);
   1c324:	84 e6       	ldi	r24, 0x64	; 100
   1c326:	90 e0       	ldi	r25, 0x00	; 0
   1c328:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
   1c32c:	f7 cf       	rjmp	.-18     	; 0x1c31c <lcd_selftest()+0x1b0>
    }

    gcode_M123();
   1c32e:	0e 94 15 65 	call	0xca2a	; 0xca2a <gcode_M123()>
	switch (_fan) {
	case 0:
        setExtruderAutoFanState(3); // hotend fan
        lcd_selftest_setfan(0); // print fan off
        lcd_selftest_measure_fans(2, 18, 2);
        setExtruderAutoFanState(0); // hotend fan off
   1c332:	80 e0       	ldi	r24, 0x00	; 0
   1c334:	0e 94 af 77 	call	0xef5e	; 0xef5e <setExtruderAutoFanState(unsigned char)>
		if (fan_speed[0] < failThr) {
   1c338:	c0 90 b7 03 	lds	r12, 0x03B7	; 0x8003b7 <fan_speed>
   1c33c:	d0 90 b8 03 	lds	r13, 0x03B8	; 0x8003b8 <fan_speed+0x1>
   1c340:	94 e1       	ldi	r25, 0x14	; 20
   1c342:	c9 16       	cp	r12, r25
   1c344:	d1 04       	cpc	r13, r1
   1c346:	54 f1       	brlt	.+84     	; 0x1c39c <lcd_selftest()+0x230>
		lcd_selftest_error(TestError::ExtruderFan, "", "");
	}

	if (_result)
	{
		_progress = lcd_selftest_screen(TestScreen::PrintFan, _progress, 3, true, 2000);
   1c348:	00 ed       	ldi	r16, 0xD0	; 208
   1c34a:	17 e0       	ldi	r17, 0x07	; 7
   1c34c:	21 e0       	ldi	r18, 0x01	; 1
   1c34e:	43 e0       	ldi	r20, 0x03	; 3
   1c350:	6f 2d       	mov	r22, r15
   1c352:	81 e0       	ldi	r24, 0x01	; 1
   1c354:	0e 94 f8 c4 	call	0x189f0	; 0x189f0 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
   1c358:	f8 2e       	mov	r15, r24
        default:
            _result = false;
            break;
        }
#else //defined(TACH_1)
		_result = lcd_selftest_manual_fan_check(1, false);
   1c35a:	60 e0       	ldi	r22, 0x00	; 0
   1c35c:	80 e0       	ldi	r24, 0x00	; 0
   1c35e:	0f 94 d1 8e 	call	0x31da2	; 0x31da2 <lcd_selftest_manual_fan_check(unsigned char, bool, bool) [clone .constprop.62]>
#endif //defined(TACH_1)
		if (!_result)
   1c362:	81 11       	cpse	r24, r1
   1c364:	3a c0       	rjmp	.+116    	; 0x1c3da <lcd_selftest()+0x26e>
		{
			lcd_selftest_error(TestError::PrintFan, "", ""); //print fan not spinning
   1c366:	4f ed       	ldi	r20, 0xDF	; 223
   1c368:	52 e0       	ldi	r21, 0x02	; 2
   1c36a:	ba 01       	movw	r22, r20
   1c36c:	85 e0       	ldi	r24, 0x05	; 5
   1c36e:	0e 94 5b da 	call	0x1b4b6	; 0x1b4b6 <lcd_selftest_error(TestError, char const*, char const*)>
		}
	}

	if (_swapped_fan) {
   1c372:	86 e4       	ldi	r24, 0x46	; 70
   1c374:	c8 16       	cp	r12, r24
   1c376:	d1 04       	cpc	r13, r1
   1c378:	bc f0       	brlt	.+46     	; 0x1c3a8 <lcd_selftest()+0x23c>
		//turn on print fan and check that left hotend fan is not spinning
		_result = lcd_selftest_manual_fan_check(1, true);
   1c37a:	60 e0       	ldi	r22, 0x00	; 0
   1c37c:	81 e0       	ldi	r24, 0x01	; 1
   1c37e:	0f 94 d1 8e 	call	0x31da2	; 0x31da2 <lcd_selftest_manual_fan_check(unsigned char, bool, bool) [clone .constprop.62]>
		if (_result) {
   1c382:	88 23       	and	r24, r24
   1c384:	d9 f0       	breq	.+54     	; 0x1c3bc <lcd_selftest()+0x250>
			//print fan is stil turned on; check that it is spinning
			_result = lcd_selftest_manual_fan_check(1, false, true);
   1c386:	61 e0       	ldi	r22, 0x01	; 1
   1c388:	80 e0       	ldi	r24, 0x00	; 0
   1c38a:	0f 94 d1 8e 	call	0x31da2	; 0x31da2 <lcd_selftest_manual_fan_check(unsigned char, bool, bool) [clone .constprop.62]>
			if (!_result){
   1c38e:	81 11       	cpse	r24, r1
   1c390:	28 c0       	rjmp	.+80     	; 0x1c3e2 <lcd_selftest()+0x276>
				lcd_selftest_error(TestError::PrintFan, "", "");
   1c392:	4f ed       	ldi	r20, 0xDF	; 223
   1c394:	52 e0       	ldi	r21, 0x02	; 2
   1c396:	ba 01       	movw	r22, r20
   1c398:	85 e0       	ldi	r24, 0x05	; 5
   1c39a:	04 c0       	rjmp	.+8      	; 0x1c3a4 <lcd_selftest()+0x238>
#else //defined(TACH_0)
	_result = lcd_selftest_manual_fan_check(0, false);
#endif //defined(TACH_0)
	if (!_result)
	{
		lcd_selftest_error(TestError::ExtruderFan, "", "");
   1c39c:	4f ed       	ldi	r20, 0xDF	; 223
   1c39e:	52 e0       	ldi	r21, 0x02	; 2
   1c3a0:	ba 01       	movw	r22, r20
   1c3a2:	86 e0       	ldi	r24, 0x06	; 6
				lcd_selftest_error(TestError::PrintFan, "", "");
			}
		}
		else {
			// fans are swapped
			lcd_selftest_error(TestError::SwappedFan, "", "");
   1c3a4:	0e 94 5b da 	call	0x1b4b6	; 0x1b4b6 <lcd_selftest_error(TestError, char const*, char const*)>
	{
		_progress = lcd_selftest_screen(TestScreen::AllCorrect, _progress, 3, true, 5000); //all correct
	}
	else
	{
		_progress = lcd_selftest_screen(TestScreen::Failed, _progress, 3, true, 5000);
   1c3a8:	08 e8       	ldi	r16, 0x88	; 136
   1c3aa:	13 e1       	ldi	r17, 0x13	; 19
   1c3ac:	21 e0       	ldi	r18, 0x01	; 1
   1c3ae:	43 e0       	ldi	r20, 0x03	; 3
   1c3b0:	6f 2d       	mov	r22, r15
   1c3b2:	8d e0       	ldi	r24, 0x0D	; 13
   1c3b4:	0e 94 f8 c4 	call	0x189f0	; 0x189f0 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
   1c3b8:	e1 2c       	mov	r14, r1
   1c3ba:	75 c1       	rjmp	.+746    	; 0x1c6a6 <lcd_selftest()+0x53a>
				lcd_selftest_error(TestError::PrintFan, "", "");
			}
		}
		else {
			// fans are swapped
			lcd_selftest_error(TestError::SwappedFan, "", "");
   1c3bc:	4f ed       	ldi	r20, 0xDF	; 223
   1c3be:	52 e0       	ldi	r21, 0x02	; 2
   1c3c0:	ba 01       	movw	r22, r20
   1c3c2:	89 e0       	ldi	r24, 0x09	; 9
   1c3c4:	ef cf       	rjmp	.-34     	; 0x1c3a4 <lcd_selftest()+0x238>
#endif //not defined TMC2130


static bool lcd_selfcheck_endstops()
{
	bool _result = true;
   1c3c6:	11 e0       	ldi	r17, 0x01	; 1
   1c3c8:	96 c0       	rjmp	.+300    	; 0x1c4f6 <lcd_selftest()+0x38a>
		lcd_setstatuspgm(_T(MSG_SELFTEST_OK));
		lcd_return_to_status();
	}
	else
	{
		LCD_ALERTMESSAGERPGM(_T(MSG_SELFTEST_FAILED));
   1c3ca:	8b e3       	ldi	r24, 0x3B	; 59
   1c3cc:	9a e4       	ldi	r25, 0x4A	; 74
   1c3ce:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1c3d2:	62 e0       	ldi	r22, 0x02	; 2
   1c3d4:	0e 94 2c da 	call	0x1b458	; 0x1b458 <lcd_setalertstatuspgm(char const*, unsigned char)>
   1c3d8:	7e c1       	rjmp	.+764    	; 0x1c6d6 <lcd_selftest()+0x56a>
		{
			lcd_selftest_error(TestError::PrintFan, "", ""); //print fan not spinning
		}
	}

	if (_swapped_fan) {
   1c3da:	96 e4       	ldi	r25, 0x46	; 70
   1c3dc:	c9 16       	cp	r12, r25
   1c3de:	d1 04       	cpc	r13, r1
   1c3e0:	64 f6       	brge	.-104    	; 0x1c37a <lcd_selftest()+0x20e>
		}
	}

	if (_result)
	{
		_progress = lcd_selftest_screen(TestScreen::FansOk, _progress, 3, true, 2000);
   1c3e2:	00 ed       	ldi	r16, 0xD0	; 208
   1c3e4:	17 e0       	ldi	r17, 0x07	; 7
   1c3e6:	21 e0       	ldi	r18, 0x01	; 1
   1c3e8:	43 e0       	ldi	r20, 0x03	; 3
   1c3ea:	6f 2d       	mov	r22, r15
   1c3ec:	82 e0       	ldi	r24, 0x02	; 2
   1c3ee:	0e 94 f8 c4 	call	0x189f0	; 0x189f0 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
   1c3f2:	f8 2e       	mov	r15, r24
	bool _result = true;

	if (
	#ifndef TMC2130
		((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) ||
		((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) ||
   1c3f4:	1e 99       	sbic	0x03, 6	; 3
   1c3f6:	04 c0       	rjmp	.+8      	; 0x1c400 <lcd_selftest()+0x294>
{
	bool _result = true;

	if (
	#ifndef TMC2130
		((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) ||
   1c3f8:	1d 99       	sbic	0x03, 5	; 3
   1c3fa:	02 c0       	rjmp	.+4      	; 0x1c400 <lcd_selftest()+0x294>
		((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) ||
   1c3fc:	1c 9b       	sbis	0x03, 4	; 3
   1c3fe:	48 c0       	rjmp	.+144    	; 0x1c490 <lcd_selftest()+0x324>
	#endif //!TMC2130
		((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING) == 1))
	{
	#ifndef TMC2130
		if ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) current_position[0] += 10;
   1c400:	1e 9b       	sbis	0x03, 6	; 3
   1c402:	16 c0       	rjmp	.+44     	; 0x1c430 <lcd_selftest()+0x2c4>
   1c404:	20 e0       	ldi	r18, 0x00	; 0
   1c406:	30 e0       	ldi	r19, 0x00	; 0
   1c408:	40 e2       	ldi	r20, 0x20	; 32
   1c40a:	51 e4       	ldi	r21, 0x41	; 65
   1c40c:	60 91 61 12 	lds	r22, 0x1261	; 0x801261 <current_position>
   1c410:	70 91 62 12 	lds	r23, 0x1262	; 0x801262 <current_position+0x1>
   1c414:	80 91 63 12 	lds	r24, 0x1263	; 0x801263 <current_position+0x2>
   1c418:	90 91 64 12 	lds	r25, 0x1264	; 0x801264 <current_position+0x3>
   1c41c:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   1c420:	60 93 61 12 	sts	0x1261, r22	; 0x801261 <current_position>
   1c424:	70 93 62 12 	sts	0x1262, r23	; 0x801262 <current_position+0x1>
   1c428:	80 93 63 12 	sts	0x1263, r24	; 0x801263 <current_position+0x2>
   1c42c:	90 93 64 12 	sts	0x1264, r25	; 0x801264 <current_position+0x3>
		if ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) current_position[1] += 10;
   1c430:	1d 9b       	sbis	0x03, 5	; 3
   1c432:	16 c0       	rjmp	.+44     	; 0x1c460 <lcd_selftest()+0x2f4>
   1c434:	20 e0       	ldi	r18, 0x00	; 0
   1c436:	30 e0       	ldi	r19, 0x00	; 0
   1c438:	40 e2       	ldi	r20, 0x20	; 32
   1c43a:	51 e4       	ldi	r21, 0x41	; 65
   1c43c:	60 91 65 12 	lds	r22, 0x1265	; 0x801265 <current_position+0x4>
   1c440:	70 91 66 12 	lds	r23, 0x1266	; 0x801266 <current_position+0x5>
   1c444:	80 91 67 12 	lds	r24, 0x1267	; 0x801267 <current_position+0x6>
   1c448:	90 91 68 12 	lds	r25, 0x1268	; 0x801268 <current_position+0x7>
   1c44c:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   1c450:	60 93 65 12 	sts	0x1265, r22	; 0x801265 <current_position+0x4>
   1c454:	70 93 66 12 	sts	0x1266, r23	; 0x801266 <current_position+0x5>
   1c458:	80 93 67 12 	sts	0x1267, r24	; 0x801267 <current_position+0x6>
   1c45c:	90 93 68 12 	sts	0x1268, r25	; 0x801268 <current_position+0x7>
	#endif //!TMC2130
		if ((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING) == 1) current_position[2] += 10;
   1c460:	1c 9b       	sbis	0x03, 4	; 3
   1c462:	16 c0       	rjmp	.+44     	; 0x1c490 <lcd_selftest()+0x324>
   1c464:	20 e0       	ldi	r18, 0x00	; 0
   1c466:	30 e0       	ldi	r19, 0x00	; 0
   1c468:	40 e2       	ldi	r20, 0x20	; 32
   1c46a:	51 e4       	ldi	r21, 0x41	; 65
   1c46c:	60 91 69 12 	lds	r22, 0x1269	; 0x801269 <current_position+0x8>
   1c470:	70 91 6a 12 	lds	r23, 0x126A	; 0x80126a <current_position+0x9>
   1c474:	80 91 6b 12 	lds	r24, 0x126B	; 0x80126b <current_position+0xa>
   1c478:	90 91 6c 12 	lds	r25, 0x126C	; 0x80126c <current_position+0xb>
   1c47c:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   1c480:	60 93 69 12 	sts	0x1269, r22	; 0x801269 <current_position+0x8>
   1c484:	70 93 6a 12 	sts	0x126A, r23	; 0x80126a <current_position+0x9>
   1c488:	80 93 6b 12 	sts	0x126B, r24	; 0x80126b <current_position+0xa>
   1c48c:	90 93 6c 12 	sts	0x126C, r25	; 0x80126c <current_position+0xb>
	}
	plan_buffer_line_curposXYZE(manual_feedrate[0] / 60);
   1c490:	60 e0       	ldi	r22, 0x00	; 0
   1c492:	70 e0       	ldi	r23, 0x00	; 0
   1c494:	84 e3       	ldi	r24, 0x34	; 52
   1c496:	92 e4       	ldi	r25, 0x42	; 66
   1c498:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
	st_synchronize();
   1c49c:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>

	if (
	#ifndef TMC2130
		((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) ||
		((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) ||
   1c4a0:	1e 99       	sbic	0x03, 6	; 3
   1c4a2:	04 c0       	rjmp	.+8      	; 0x1c4ac <lcd_selftest()+0x340>
	plan_buffer_line_curposXYZE(manual_feedrate[0] / 60);
	st_synchronize();

	if (
	#ifndef TMC2130
		((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) ||
   1c4a4:	1d 99       	sbic	0x03, 5	; 3
   1c4a6:	02 c0       	rjmp	.+4      	; 0x1c4ac <lcd_selftest()+0x340>
		((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) ||
   1c4a8:	1c 9b       	sbis	0x03, 4	; 3
   1c4aa:	8d cf       	rjmp	.-230    	; 0x1c3c6 <lcd_selftest()+0x25a>
	#endif //!TMC2130
		((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING) == 1))
	{
		_result = false;
		char _error[4] = "";
   1c4ac:	1a 82       	std	Y+2, r1	; 0x02
   1c4ae:	19 82       	std	Y+1, r1	; 0x01
   1c4b0:	1c 82       	std	Y+4, r1	; 0x04
   1c4b2:	1b 82       	std	Y+3, r1	; 0x03
	#ifndef TMC2130
		if ((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) strcat(_error, "X");
   1c4b4:	1e 9b       	sbis	0x03, 6	; 3
   1c4b6:	06 c0       	rjmp	.+12     	; 0x1c4c4 <lcd_selftest()+0x358>
   1c4b8:	68 ec       	ldi	r22, 0xC8	; 200
   1c4ba:	72 e0       	ldi	r23, 0x02	; 2
   1c4bc:	ce 01       	movw	r24, r28
   1c4be:	01 96       	adiw	r24, 0x01	; 1
   1c4c0:	0f 94 2c aa 	call	0x35458	; 0x35458 <strcat>
		if ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) strcat(_error, "Y");
   1c4c4:	1d 9b       	sbis	0x03, 5	; 3
   1c4c6:	06 c0       	rjmp	.+12     	; 0x1c4d4 <lcd_selftest()+0x368>
   1c4c8:	6a ec       	ldi	r22, 0xCA	; 202
   1c4ca:	72 e0       	ldi	r23, 0x02	; 2
   1c4cc:	ce 01       	movw	r24, r28
   1c4ce:	01 96       	adiw	r24, 0x01	; 1
   1c4d0:	0f 94 2c aa 	call	0x35458	; 0x35458 <strcat>
	#endif //!TMC2130
		if ((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING) == 1) strcat(_error, "Z");
   1c4d4:	1c 9b       	sbis	0x03, 4	; 3
   1c4d6:	06 c0       	rjmp	.+12     	; 0x1c4e4 <lcd_selftest()+0x378>
   1c4d8:	6c ec       	ldi	r22, 0xCC	; 204
   1c4da:	72 e0       	ldi	r23, 0x02	; 2
   1c4dc:	ce 01       	movw	r24, r28
   1c4de:	01 96       	adiw	r24, 0x01	; 1
   1c4e0:	0f 94 2c aa 	call	0x35458	; 0x35458 <strcat>
		lcd_selftest_error(TestError::Endstops, _error, "");
   1c4e4:	4f ed       	ldi	r20, 0xDF	; 223
   1c4e6:	52 e0       	ldi	r21, 0x02	; 2
   1c4e8:	be 01       	movw	r22, r28
   1c4ea:	6f 5f       	subi	r22, 0xFF	; 255
   1c4ec:	7f 4f       	sbci	r23, 0xFF	; 255
   1c4ee:	82 e0       	ldi	r24, 0x02	; 2
   1c4f0:	0e 94 5b da 	call	0x1b4b6	; 0x1b4b6 <lcd_selftest_error(TestError, char const*, char const*)>
		((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING) == 1) ||
		((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) ||
	#endif //!TMC2130
		((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING) == 1))
	{
		_result = false;
   1c4f4:	10 e0       	ldi	r17, 0x00	; 0
		if ((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING) == 1) strcat(_error, "Y");
	#endif //!TMC2130
		if ((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING) == 1) strcat(_error, "Z");
		lcd_selftest_error(TestError::Endstops, _error, "");
	}
	manage_heater();
   1c4f6:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
	manage_inactivity(true);
   1c4fa:	81 e0       	ldi	r24, 0x01	; 1
   1c4fc:	0e 94 34 8c 	call	0x11868	; 0x11868 <manage_inactivity(bool)>
	{
		_progress = lcd_selftest_screen(TestScreen::FansOk, _progress, 3, true, 2000);
		_result = lcd_selfcheck_endstops(); //With TMC2130, only the Z probe is tested.
	}

	if (_result)
   1c500:	11 23       	and	r17, r17
   1c502:	09 f4       	brne	.+2      	; 0x1c506 <lcd_selftest()+0x39a>
   1c504:	51 cf       	rjmp	.-350    	; 0x1c3a8 <lcd_selftest()+0x23c>
	{
		//current_position[Z_AXIS] += 15;									//move Z axis higher to avoid false triggering of Z end stop in case that we are very low - just above heatbed
		_progress = lcd_selftest_screen(TestScreen::AxisX, _progress, 3, true, 2000);
   1c506:	00 ed       	ldi	r16, 0xD0	; 208
   1c508:	17 e0       	ldi	r17, 0x07	; 7
   1c50a:	21 e0       	ldi	r18, 0x01	; 1
   1c50c:	43 e0       	ldi	r20, 0x03	; 3
   1c50e:	6f 2d       	mov	r22, r15
   1c510:	84 e0       	ldi	r24, 0x04	; 4
   1c512:	0e 94 f8 c4 	call	0x189f0	; 0x189f0 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
   1c516:	f8 2e       	mov	r15, r24
#ifdef TMC2130
        _result = lcd_selfcheck_axis_sg(X_AXIS);
#else
        _result = lcd_selfcheck_axis(X_AXIS, X_MAX_POS);
   1c518:	6a ef       	ldi	r22, 0xFA	; 250
   1c51a:	70 e0       	ldi	r23, 0x00	; 0
   1c51c:	90 e0       	ldi	r25, 0x00	; 0
   1c51e:	80 e0       	ldi	r24, 0x00	; 0
   1c520:	0e 94 42 dd 	call	0x1ba84	; 0x1ba84 <lcd_selfcheck_axis(int, int)>
	}




	if (_result)
   1c524:	88 23       	and	r24, r24
   1c526:	09 f4       	brne	.+2      	; 0x1c52a <lcd_selftest()+0x3be>
   1c528:	3f cf       	rjmp	.-386    	; 0x1c3a8 <lcd_selftest()+0x23c>
	{
		_progress = lcd_selftest_screen(TestScreen::AxisX, _progress, 3, true, 0);
   1c52a:	10 e0       	ldi	r17, 0x00	; 0
   1c52c:	00 e0       	ldi	r16, 0x00	; 0
   1c52e:	21 e0       	ldi	r18, 0x01	; 1
   1c530:	43 e0       	ldi	r20, 0x03	; 3
   1c532:	6f 2d       	mov	r22, r15
   1c534:	84 e0       	ldi	r24, 0x04	; 4
   1c536:	0e 94 f8 c4 	call	0x189f0	; 0x189f0 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
   1c53a:	f8 2e       	mov	r15, r24

#ifndef TMC2130
		_result = lcd_selfcheck_pulleys(X_AXIS);
   1c53c:	90 e0       	ldi	r25, 0x00	; 0
   1c53e:	80 e0       	ldi	r24, 0x00	; 0
   1c540:	0e 94 3f dc 	call	0x1b87e	; 0x1b87e <lcd_selfcheck_pulleys(int)>
#endif
	}


	if (_result)
   1c544:	88 23       	and	r24, r24
   1c546:	09 f4       	brne	.+2      	; 0x1c54a <lcd_selftest()+0x3de>
   1c548:	2f cf       	rjmp	.-418    	; 0x1c3a8 <lcd_selftest()+0x23c>
	{
		_progress = lcd_selftest_screen(TestScreen::AxisY, _progress, 3, true, 1500);
   1c54a:	0c ed       	ldi	r16, 0xDC	; 220
   1c54c:	15 e0       	ldi	r17, 0x05	; 5
   1c54e:	21 e0       	ldi	r18, 0x01	; 1
   1c550:	43 e0       	ldi	r20, 0x03	; 3
   1c552:	6f 2d       	mov	r22, r15
   1c554:	85 e0       	ldi	r24, 0x05	; 5
   1c556:	0e 94 f8 c4 	call	0x189f0	; 0x189f0 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
   1c55a:	f8 2e       	mov	r15, r24
#ifdef TMC2130
		_result = lcd_selfcheck_axis_sg(Y_AXIS);
#else
		_result = lcd_selfcheck_axis(Y_AXIS, Y_MAX_POS);
   1c55c:	62 ed       	ldi	r22, 0xD2	; 210
   1c55e:	70 e0       	ldi	r23, 0x00	; 0
   1c560:	81 e0       	ldi	r24, 0x01	; 1
   1c562:	90 e0       	ldi	r25, 0x00	; 0
   1c564:	0e 94 42 dd 	call	0x1ba84	; 0x1ba84 <lcd_selfcheck_axis(int, int)>
#endif // TMC2130
	}

	if (_result)
   1c568:	88 23       	and	r24, r24
   1c56a:	09 f4       	brne	.+2      	; 0x1c56e <lcd_selftest()+0x402>
   1c56c:	1d cf       	rjmp	.-454    	; 0x1c3a8 <lcd_selftest()+0x23c>
	{
		_progress = lcd_selftest_screen(TestScreen::AxisZ, _progress, 3, true, 0);
   1c56e:	10 e0       	ldi	r17, 0x00	; 0
   1c570:	00 e0       	ldi	r16, 0x00	; 0
   1c572:	21 e0       	ldi	r18, 0x01	; 1
   1c574:	43 e0       	ldi	r20, 0x03	; 3
   1c576:	6f 2d       	mov	r22, r15
   1c578:	86 e0       	ldi	r24, 0x06	; 6
   1c57a:	0e 94 f8 c4 	call	0x189f0	; 0x189f0 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
   1c57e:	f8 2e       	mov	r15, r24
#ifndef TMC2130
		_result = lcd_selfcheck_pulleys(Y_AXIS);
   1c580:	81 e0       	ldi	r24, 0x01	; 1
   1c582:	90 e0       	ldi	r25, 0x00	; 0
   1c584:	0e 94 3f dc 	call	0x1b87e	; 0x1b87e <lcd_selfcheck_pulleys(int)>
#endif // TMC2130
	}


	if (_result)
   1c588:	88 23       	and	r24, r24
   1c58a:	09 f4       	brne	.+2      	; 0x1c58e <lcd_selftest()+0x422>
   1c58c:	0d cf       	rjmp	.-486    	; 0x1c3a8 <lcd_selftest()+0x23c>
		enable_endstops(false);
#endif

		//homeaxis(X_AXIS);
		//homeaxis(Y_AXIS);
        current_position[X_AXIS] = pgm_read_float(bed_ref_points_4);
   1c58e:	e0 e0       	ldi	r30, 0x00	; 0
   1c590:	fc e9       	ldi	r31, 0x9C	; 156
   1c592:	85 91       	lpm	r24, Z+
   1c594:	95 91       	lpm	r25, Z+
   1c596:	a5 91       	lpm	r26, Z+
   1c598:	b4 91       	lpm	r27, Z
   1c59a:	80 93 61 12 	sts	0x1261, r24	; 0x801261 <current_position>
   1c59e:	90 93 62 12 	sts	0x1262, r25	; 0x801262 <current_position+0x1>
   1c5a2:	a0 93 63 12 	sts	0x1263, r26	; 0x801263 <current_position+0x2>
   1c5a6:	b0 93 64 12 	sts	0x1264, r27	; 0x801264 <current_position+0x3>
		current_position[Y_AXIS] = pgm_read_float(bed_ref_points_4+1);
   1c5aa:	e4 e0       	ldi	r30, 0x04	; 4
   1c5ac:	fc e9       	ldi	r31, 0x9C	; 156
   1c5ae:	85 91       	lpm	r24, Z+
   1c5b0:	95 91       	lpm	r25, Z+
   1c5b2:	a5 91       	lpm	r26, Z+
   1c5b4:	b4 91       	lpm	r27, Z
   1c5b6:	80 93 65 12 	sts	0x1265, r24	; 0x801265 <current_position+0x4>
   1c5ba:	90 93 66 12 	sts	0x1266, r25	; 0x801266 <current_position+0x5>
   1c5be:	a0 93 67 12 	sts	0x1267, r26	; 0x801267 <current_position+0x6>
   1c5c2:	b0 93 68 12 	sts	0x1268, r27	; 0x801268 <current_position+0x7>
#ifdef TMC2130
		//current_position[X_AXIS] += 0;
		current_position[Y_AXIS] += 4;
#endif //TMC2130
		raise_z(10);
   1c5c6:	60 e0       	ldi	r22, 0x00	; 0
   1c5c8:	70 e0       	ldi	r23, 0x00	; 0
   1c5ca:	80 e2       	ldi	r24, 0x20	; 32
   1c5cc:	91 e4       	ldi	r25, 0x41	; 65
   1c5ce:	0e 94 94 6c 	call	0xd928	; 0xd928 <raise_z(float)>
        set_destination_to_current();
   1c5d2:	0e 94 ae 66 	call	0xcd5c	; 0xcd5c <set_destination_to_current()>
		_progress = lcd_selftest_screen(TestScreen::AxisZ, _progress, 3, true, 1500);
   1c5d6:	0c ed       	ldi	r16, 0xDC	; 220
   1c5d8:	15 e0       	ldi	r17, 0x05	; 5
   1c5da:	21 e0       	ldi	r18, 0x01	; 1
   1c5dc:	43 e0       	ldi	r20, 0x03	; 3
   1c5de:	6f 2d       	mov	r22, r15
   1c5e0:	86 e0       	ldi	r24, 0x06	; 6
   1c5e2:	0e 94 f8 c4 	call	0x189f0	; 0x189f0 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
   1c5e6:	f8 2e       	mov	r15, r24
#ifdef TMC2130
		homeaxis(Z_AXIS); //In case of failure, the code gets stuck in this function.
#else
        _result = lcd_selfcheck_axis(Z_AXIS, Z_MAX_POS);
   1c5e8:	62 ed       	ldi	r22, 0xD2	; 210
   1c5ea:	70 e0       	ldi	r23, 0x00	; 0
   1c5ec:	82 e0       	ldi	r24, 0x02	; 2
   1c5ee:	90 e0       	ldi	r25, 0x00	; 0
   1c5f0:	0e 94 42 dd 	call	0x1ba84	; 0x1ba84 <lcd_selfcheck_axis(int, int)>
   1c5f4:	18 2f       	mov	r17, r24
#endif //TMC2130

		//raise Z to not damage the bed during and hotend testing
		raise_z(20);
   1c5f6:	60 e0       	ldi	r22, 0x00	; 0
   1c5f8:	70 e0       	ldi	r23, 0x00	; 0
   1c5fa:	80 ea       	ldi	r24, 0xA0	; 160
   1c5fc:	91 e4       	ldi	r25, 0x41	; 65
   1c5fe:	0e 94 94 6c 	call	0xd928	; 0xd928 <raise_z(float)>
			eeprom_update_byte_notify((uint8_t*)EEPROM_TMC2130_HOME_ENABLED, 1);
		_result = bres;
	}
#endif //TMC2130

	if (_result)
   1c602:	11 23       	and	r17, r17
   1c604:	09 f4       	brne	.+2      	; 0x1c608 <lcd_selftest()+0x49c>
   1c606:	d0 ce       	rjmp	.-608    	; 0x1c3a8 <lcd_selftest()+0x23c>
	{
		_progress = lcd_selftest_screen(TestScreen::Bed, _progress, 3, true, 2000);
   1c608:	00 ed       	ldi	r16, 0xD0	; 208
   1c60a:	17 e0       	ldi	r17, 0x07	; 7
   1c60c:	21 e0       	ldi	r18, 0x01	; 1
   1c60e:	43 e0       	ldi	r20, 0x03	; 3
   1c610:	6f 2d       	mov	r22, r15
   1c612:	87 e0       	ldi	r24, 0x07	; 7
   1c614:	0e 94 f8 c4 	call	0x189f0	; 0x189f0 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
   1c618:	f8 2e       	mov	r15, r24
		_result = lcd_selfcheck_check_heater(true);
   1c61a:	81 e0       	ldi	r24, 0x01	; 1
   1c61c:	0e 94 49 db 	call	0x1b692	; 0x1b692 <lcd_selfcheck_check_heater(bool)>
	}

    if (_result)
   1c620:	88 23       	and	r24, r24
   1c622:	09 f4       	brne	.+2      	; 0x1c626 <lcd_selftest()+0x4ba>
   1c624:	c1 ce       	rjmp	.-638    	; 0x1c3a8 <lcd_selftest()+0x23c>
    {
        _progress = lcd_selftest_screen(TestScreen::Hotend, _progress, 3, true, 1000);
   1c626:	08 ee       	ldi	r16, 0xE8	; 232
   1c628:	13 e0       	ldi	r17, 0x03	; 3
   1c62a:	21 e0       	ldi	r18, 0x01	; 1
   1c62c:	43 e0       	ldi	r20, 0x03	; 3
   1c62e:	6f 2d       	mov	r22, r15
   1c630:	88 e0       	ldi	r24, 0x08	; 8
   1c632:	0e 94 f8 c4 	call	0x189f0	; 0x189f0 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
   1c636:	f8 2e       	mov	r15, r24
        _result = lcd_selfcheck_check_heater(false);
   1c638:	80 e0       	ldi	r24, 0x00	; 0
   1c63a:	0e 94 49 db 	call	0x1b692	; 0x1b692 <lcd_selfcheck_check_heater(bool)>
   1c63e:	e8 2e       	mov	r14, r24
    }
	if (_result)
   1c640:	88 23       	and	r24, r24
   1c642:	09 f4       	brne	.+2      	; 0x1c646 <lcd_selftest()+0x4da>
   1c644:	b1 ce       	rjmp	.-670    	; 0x1c3a8 <lcd_selftest()+0x23c>
	{
		_progress = lcd_selftest_screen(TestScreen::HotendOk, _progress, 3, true, 2000); //nozzle ok
   1c646:	00 ed       	ldi	r16, 0xD0	; 208
   1c648:	17 e0       	ldi	r17, 0x07	; 7
   1c64a:	21 e0       	ldi	r18, 0x01	; 1
   1c64c:	43 e0       	ldi	r20, 0x03	; 3
   1c64e:	6f 2d       	mov	r22, r15
   1c650:	89 e0       	ldi	r24, 0x09	; 9
   1c652:	0e 94 f8 c4 	call	0x189f0	; 0x189f0 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
			}
        } else
#endif //(FILAMENT_SENSOR_TYPE == FSENSOR_IR) || (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
        {
#if FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125
			_progress = lcd_selftest_screen(TestScreen::Fsensor, _progress, 3, true, 2000); //check filaments sensor
   1c656:	21 e0       	ldi	r18, 0x01	; 1
   1c658:	43 e0       	ldi	r20, 0x03	; 3
   1c65a:	68 2f       	mov	r22, r24
   1c65c:	8a e0       	ldi	r24, 0x0A	; 10
   1c65e:	0e 94 f8 c4 	call	0x189f0	; 0x189f0 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
   1c662:	f8 2e       	mov	r15, r24

#ifdef FILAMENT_SENSOR
#if FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125
static bool lcd_selftest_fsensor(void)
{
	fsensor.init();
   1c664:	0f 94 dc 6d 	call	0x2dbb8	; 0x2dbb8 <PAT9125_sensor::init() [clone .constprop.206]>
	if (fsensor.isError())
   1c668:	80 91 f1 16 	lds	r24, 0x16F1	; 0x8016f1 <fsensor>
   1c66c:	83 30       	cpi	r24, 0x03	; 3
   1c66e:	31 f4       	brne	.+12     	; 0x1c67c <lcd_selftest()+0x510>
	{
		lcd_selftest_error(TestError::WiringFsensor, "", "");
   1c670:	4f ed       	ldi	r20, 0xDF	; 223
   1c672:	52 e0       	ldi	r21, 0x02	; 2
   1c674:	ba 01       	movw	r22, r20
   1c676:	8a e0       	ldi	r24, 0x0A	; 10
   1c678:	0e 94 5b da 	call	0x1b4b6	; 0x1b4b6 <lcd_selftest_error(TestError, char const*, char const*)>
#endif //(FILAMENT_SENSOR_TYPE == FSENSOR_IR) || (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
        {
#if FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125
			_progress = lcd_selftest_screen(TestScreen::Fsensor, _progress, 3, true, 2000); //check filaments sensor
               _result = lcd_selftest_fsensor();
			if (_result)
   1c67c:	80 91 f1 16 	lds	r24, 0x16F1	; 0x8016f1 <fsensor>
   1c680:	83 30       	cpi	r24, 0x03	; 3
   1c682:	09 f4       	brne	.+2      	; 0x1c686 <lcd_selftest()+0x51a>
   1c684:	91 ce       	rjmp	.-734    	; 0x1c3a8 <lcd_selftest()+0x23c>
			{
				_progress = lcd_selftest_screen(TestScreen::FsensorOk, _progress, 3, true, 2000); //fil sensor OK
   1c686:	00 ed       	ldi	r16, 0xD0	; 208
   1c688:	17 e0       	ldi	r17, 0x07	; 7
   1c68a:	21 e0       	ldi	r18, 0x01	; 1
   1c68c:	43 e0       	ldi	r20, 0x03	; 3
   1c68e:	6f 2d       	mov	r22, r15
   1c690:	8b e0       	ldi	r24, 0x0B	; 11
   1c692:	0e 94 f8 c4 	call	0x189f0	; 0x189f0 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
        }
    }
#endif //FILAMENT_SENSOR
	if (_result)
	{
		_progress = lcd_selftest_screen(TestScreen::AllCorrect, _progress, 3, true, 5000); //all correct
   1c696:	08 e8       	ldi	r16, 0x88	; 136
   1c698:	13 e1       	ldi	r17, 0x13	; 19
   1c69a:	21 e0       	ldi	r18, 0x01	; 1
   1c69c:	43 e0       	ldi	r20, 0x03	; 3
   1c69e:	68 2f       	mov	r22, r24
   1c6a0:	8c e0       	ldi	r24, 0x0C	; 12
   1c6a2:	0e 94 f8 c4 	call	0x189f0	; 0x189f0 <lcd_selftest_screen(TestScreen, unsigned char, unsigned char, bool, unsigned int)>
    lcd_setalertstatus_(message, severity, true);
}

void lcd_reset_alert_level()
{
    lcd_status_message_level = 0;
   1c6a6:	10 92 c0 03 	sts	0x03C0, r1	; 0x8003c0 <_ZL24lcd_status_message_level.lto_priv.422>
	else
	{
		_progress = lcd_selftest_screen(TestScreen::Failed, _progress, 3, true, 5000);
	}
	lcd_reset_alert_level();
	enquecommand_P(MSG_M84);
   1c6aa:	61 e0       	ldi	r22, 0x01	; 1
   1c6ac:	8e e8       	ldi	r24, 0x8E	; 142
   1c6ae:	98 e6       	ldi	r25, 0x68	; 104
   1c6b0:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
	lcd_update_enable(true);
   1c6b4:	81 e0       	ldi	r24, 0x01	; 1
   1c6b6:	0e 94 38 70 	call	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>

	if (_result)
   1c6ba:	ee 20       	and	r14, r14
   1c6bc:	09 f4       	brne	.+2      	; 0x1c6c0 <lcd_selftest()+0x554>
   1c6be:	85 ce       	rjmp	.-758    	; 0x1c3ca <lcd_selftest()+0x25e>
	{
		calibration_status_set(CALIBRATION_STATUS_SELFTEST);
   1c6c0:	81 e0       	ldi	r24, 0x01	; 1
   1c6c2:	0e 94 4e d7 	call	0x1ae9c	; 0x1ae9c <calibration_status_set(unsigned char)>
		lcd_setstatuspgm(_T(MSG_SELFTEST_OK));
   1c6c6:	8b e0       	ldi	r24, 0x0B	; 11
   1c6c8:	99 e4       	ldi	r25, 0x49	; 73
   1c6ca:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1c6ce:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
		lcd_return_to_status();
   1c6d2:	0f 94 d5 07 	call	0x20faa	; 0x20faa <lcd_return_to_status()>
	  FORCE_HIGH_POWER_END;
	#endif // TMC2130

    FORCE_BL_ON_END;

    KEEPALIVE_STATE(NOT_BUSY);
   1c6d6:	81 e0       	ldi	r24, 0x01	; 1
   1c6d8:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
	return(_result);
}
   1c6dc:	8e 2d       	mov	r24, r14
   1c6de:	0f 90       	pop	r0
   1c6e0:	0f 90       	pop	r0
   1c6e2:	0f 90       	pop	r0
   1c6e4:	0f 90       	pop	r0
   1c6e6:	df 91       	pop	r29
   1c6e8:	cf 91       	pop	r28
   1c6ea:	1f 91       	pop	r17
   1c6ec:	0f 91       	pop	r16
   1c6ee:	ff 90       	pop	r15
   1c6f0:	ef 90       	pop	r14
   1c6f2:	df 90       	pop	r13
   1c6f4:	cf 90       	pop	r12
   1c6f6:	08 95       	ret

0001c6f8 <lcd_selftest_v()>:
}
#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)

static void lcd_selftest_v()
{
	(void)lcd_selftest();
   1c6f8:	0c 94 b6 e0 	jmp	0x1c16c	; 0x1c16c <lcd_selftest()>

0001c6fc <unload_filament(float)>:
}

/// @brief unload filament for single material printer (used in M600 and M702)
/// @param unloadLength Retract distance for removal (manual reload)
void unload_filament(float unloadLength)
{
   1c6fc:	cf 92       	push	r12
   1c6fe:	df 92       	push	r13
   1c700:	ef 92       	push	r14
   1c702:	ff 92       	push	r15
   1c704:	cf 93       	push	r28
   1c706:	6b 01       	movw	r12, r22
   1c708:	7c 01       	movw	r14, r24
    custom_message_type = CustomMsg::FilamentLoading;
   1c70a:	82 e0       	ldi	r24, 0x02	; 2
   1c70c:	80 93 5d 06 	sts	0x065D, r24	; 0x80065d <custom_message_type>
    lcd_setstatuspgm(_T(MSG_UNLOADING_FILAMENT));
   1c710:	89 ea       	ldi	r24, 0xA9	; 169
   1c712:	99 e5       	ldi	r25, 0x59	; 89
   1c714:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1c718:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>

    FSensorBlockRunout fsBlockRunout;
   1c71c:	0f 94 2b 79 	call	0x2f256	; 0x2f256 <FSensorBlockRunout::FSensorBlockRunout() [clone .constprop.136]>

    current_position[E_AXIS] -= FILAMENT_UNLOAD_FAST_RETRACT_LENGTH;
   1c720:	20 e0       	ldi	r18, 0x00	; 0
   1c722:	30 e0       	ldi	r19, 0x00	; 0
   1c724:	44 e3       	ldi	r20, 0x34	; 52
   1c726:	52 e4       	ldi	r21, 0x42	; 66
   1c728:	60 91 6d 12 	lds	r22, 0x126D	; 0x80126d <current_position+0xc>
   1c72c:	70 91 6e 12 	lds	r23, 0x126E	; 0x80126e <current_position+0xd>
   1c730:	80 91 6f 12 	lds	r24, 0x126F	; 0x80126f <current_position+0xe>
   1c734:	90 91 70 12 	lds	r25, 0x1270	; 0x801270 <current_position+0xf>
   1c738:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   1c73c:	60 93 6d 12 	sts	0x126D, r22	; 0x80126d <current_position+0xc>
   1c740:	70 93 6e 12 	sts	0x126E, r23	; 0x80126e <current_position+0xd>
   1c744:	80 93 6f 12 	sts	0x126F, r24	; 0x80126f <current_position+0xe>
   1c748:	90 93 70 12 	sts	0x1270, r25	; 0x801270 <current_position+0xf>
    plan_buffer_line_curposXYZE(FILAMENT_UNLOAD_FAST_RETRACT_FEEDRATE);
   1c74c:	6a e0       	ldi	r22, 0x0A	; 10
   1c74e:	77 e5       	ldi	r23, 0x57	; 87
   1c750:	8d ea       	ldi	r24, 0xAD	; 173
   1c752:	92 e4       	ldi	r25, 0x42	; 66
   1c754:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
    st_synchronize();
   1c758:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>

    current_position[E_AXIS] -= FILAMENT_UNLOAD_SLOW_RETRACT_LENGTH;
   1c75c:	20 e0       	ldi	r18, 0x00	; 0
   1c75e:	30 e0       	ldi	r19, 0x00	; 0
   1c760:	4c e0       	ldi	r20, 0x0C	; 12
   1c762:	52 e4       	ldi	r21, 0x42	; 66
   1c764:	60 91 6d 12 	lds	r22, 0x126D	; 0x80126d <current_position+0xc>
   1c768:	70 91 6e 12 	lds	r23, 0x126E	; 0x80126e <current_position+0xd>
   1c76c:	80 91 6f 12 	lds	r24, 0x126F	; 0x80126f <current_position+0xe>
   1c770:	90 91 70 12 	lds	r25, 0x1270	; 0x801270 <current_position+0xf>
   1c774:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   1c778:	60 93 6d 12 	sts	0x126D, r22	; 0x80126d <current_position+0xc>
   1c77c:	70 93 6e 12 	sts	0x126E, r23	; 0x80126e <current_position+0xd>
   1c780:	80 93 6f 12 	sts	0x126F, r24	; 0x80126f <current_position+0xe>
   1c784:	90 93 70 12 	sts	0x1270, r25	; 0x801270 <current_position+0xf>
    plan_buffer_line_curposXYZE(FILAMENT_UNLOAD_SLOW_RETRACT_FEEDRATE);
   1c788:	69 e2       	ldi	r22, 0x29	; 41
   1c78a:	7c e5       	ldi	r23, 0x5C	; 92
   1c78c:	85 e8       	ldi	r24, 0x85	; 133
   1c78e:	91 e4       	ldi	r25, 0x41	; 65
   1c790:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
    st_synchronize();
   1c794:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>

    // Configurable length, by default it's 0.
    // only plan the move if the length is set to a non-zero value
    if (unloadLength)
   1c798:	20 e0       	ldi	r18, 0x00	; 0
   1c79a:	30 e0       	ldi	r19, 0x00	; 0
   1c79c:	a9 01       	movw	r20, r18
   1c79e:	c7 01       	movw	r24, r14
   1c7a0:	b6 01       	movw	r22, r12
   1c7a2:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   1c7a6:	88 23       	and	r24, r24
   1c7a8:	e1 f0       	breq	.+56     	; 0x1c7e2 <unload_filament(float)+0xe6>
    {
        current_position[E_AXIS] += unloadLength;
   1c7aa:	a7 01       	movw	r20, r14
   1c7ac:	96 01       	movw	r18, r12
   1c7ae:	60 91 6d 12 	lds	r22, 0x126D	; 0x80126d <current_position+0xc>
   1c7b2:	70 91 6e 12 	lds	r23, 0x126E	; 0x80126e <current_position+0xd>
   1c7b6:	80 91 6f 12 	lds	r24, 0x126F	; 0x80126f <current_position+0xe>
   1c7ba:	90 91 70 12 	lds	r25, 0x1270	; 0x801270 <current_position+0xf>
   1c7be:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   1c7c2:	60 93 6d 12 	sts	0x126D, r22	; 0x80126d <current_position+0xc>
   1c7c6:	70 93 6e 12 	sts	0x126E, r23	; 0x80126e <current_position+0xd>
   1c7ca:	80 93 6f 12 	sts	0x126F, r24	; 0x80126f <current_position+0xe>
   1c7ce:	90 93 70 12 	sts	0x1270, r25	; 0x801270 <current_position+0xf>
        plan_buffer_line_curposXYZE(FILAMENT_CHANGE_UNLOAD_FEEDRATE);
   1c7d2:	60 e0       	ldi	r22, 0x00	; 0
   1c7d4:	70 e0       	ldi	r23, 0x00	; 0
   1c7d6:	80 e2       	ldi	r24, 0x20	; 32
   1c7d8:	91 e4       	ldi	r25, 0x41	; 65
   1c7da:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
        st_synchronize();
   1c7de:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
    }

	lcd_display_message_fullscreen_P(_T(MSG_PULL_OUT_FILAMENT));
   1c7e2:	88 e8       	ldi	r24, 0x88	; 136
   1c7e4:	96 e4       	ldi	r25, 0x46	; 70
   1c7e6:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1c7ea:	0e 94 a9 e0 	call	0x1c152	; 0x1c152 <lcd_display_message_fullscreen_P(char const*)>

	//disable extruder steppers so filament can be removed
	disable_e0();
   1c7ee:	14 9a       	sbi	0x02, 4	; 2
	_delay(100);
   1c7f0:	64 e6       	ldi	r22, 0x64	; 100
   1c7f2:	70 e0       	ldi	r23, 0x00	; 0
   1c7f4:	80 e0       	ldi	r24, 0x00	; 0
   1c7f6:	90 e0       	ldi	r25, 0x00	; 0
   1c7f8:	0f 94 bd 0d 	call	0x21b7a	; 0x21b7a <delay2>

	Sound_MakeSound(e_SOUND_TYPE_StandardPrompt);
   1c7fc:	82 e0       	ldi	r24, 0x02	; 2
   1c7fe:	0f 94 ad 25 	call	0x24b5a	; 0x24b5a <Sound_MakeSound(eSOUND_TYPE)>
   1c802:	c3 e3       	ldi	r28, 0x33	; 51
	uint8_t counterBeep = 0;
	while (!lcd_clicked() && (counterBeep < 50)) {
   1c804:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   1c808:	81 11       	cpse	r24, r1
   1c80a:	07 c0       	rjmp	.+14     	; 0x1c81a <unload_filament(float)+0x11e>
   1c80c:	c1 50       	subi	r28, 0x01	; 1
   1c80e:	29 f0       	breq	.+10     	; 0x1c81a <unload_filament(float)+0x11e>
		delay_keep_alive(100);
   1c810:	84 e6       	ldi	r24, 0x64	; 100
   1c812:	90 e0       	ldi	r25, 0x00	; 0
   1c814:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
   1c818:	f5 cf       	rjmp	.-22     	; 0x1c804 <unload_filament(float)+0x108>
		counterBeep++;
	}
	st_synchronize();
   1c81a:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
	while (lcd_clicked()) delay_keep_alive(100);
   1c81e:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   1c822:	88 23       	and	r24, r24
   1c824:	29 f0       	breq	.+10     	; 0x1c830 <unload_filament(float)+0x134>
   1c826:	84 e6       	ldi	r24, 0x64	; 100
   1c828:	90 e0       	ldi	r25, 0x00	; 0
   1c82a:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
   1c82e:	f7 cf       	rjmp	.-18     	; 0x1c81e <unload_filament(float)+0x122>

	lcd_update_enable(true);
   1c830:	81 e0       	ldi	r24, 0x01	; 1
   1c832:	0e 94 38 70 	call	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>

	lcd_setstatuspgm(MSG_WELCOME);
   1c836:	86 ee       	ldi	r24, 0xE6	; 230
   1c838:	9b e6       	ldi	r25, 0x6B	; 107
   1c83a:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
	custom_message_type = CustomMsg::Status;
   1c83e:	10 92 5d 06 	sts	0x065D, r1	; 0x80065d <custom_message_type>
	clearFilamentAction();
   1c842:	0f 94 d6 0b 	call	0x217ac	; 0x217ac <clearFilamentAction() [clone .lto_priv.411]>
}
   1c846:	cf 91       	pop	r28
   1c848:	ff 90       	pop	r15
   1c84a:	ef 90       	pop	r14
   1c84c:	df 90       	pop	r13
   1c84e:	cf 90       	pop	r12
#endif //(FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
//    SERIAL_ECHOLNPGM("FSBlockRunout");
}

FSensorBlockRunout::~FSensorBlockRunout() {
    fsensor.settings_init(); // restore filament runout state.
   1c850:	0d 94 95 6d 	jmp	0x2db2a	; 0x2db2a <PAT9125_sensor::settings_init() [clone .constprop.207]>

0001c854 <wait_preheat()>:
		lang_select(LANG_ID_PRI);
}
#endif

static void wait_preheat()
{
   1c854:	cf 92       	push	r12
   1c856:	df 92       	push	r13
   1c858:	ef 92       	push	r14
   1c85a:	ff 92       	push	r15
    current_position[Z_AXIS] = 100; //move in z axis to make space for loading filament
   1c85c:	80 e0       	ldi	r24, 0x00	; 0
   1c85e:	90 e0       	ldi	r25, 0x00	; 0
   1c860:	a8 ec       	ldi	r26, 0xC8	; 200
   1c862:	b2 e4       	ldi	r27, 0x42	; 66
   1c864:	80 93 69 12 	sts	0x1269, r24	; 0x801269 <current_position+0x8>
   1c868:	90 93 6a 12 	sts	0x126A, r25	; 0x80126a <current_position+0x9>
   1c86c:	a0 93 6b 12 	sts	0x126B, r26	; 0x80126b <current_position+0xa>
   1c870:	b0 93 6c 12 	sts	0x126C, r27	; 0x80126c <current_position+0xb>
    plan_buffer_line_curposXYZE(homing_feedrate[Z_AXIS] / 60);
   1c874:	65 e5       	ldi	r22, 0x55	; 85
   1c876:	75 e5       	ldi	r23, 0x55	; 85
   1c878:	85 e5       	ldi	r24, 0x55	; 85
   1c87a:	91 e4       	ldi	r25, 0x41	; 65
   1c87c:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
    delay_keep_alive(2000);
   1c880:	80 ed       	ldi	r24, 0xD0	; 208
   1c882:	97 e0       	ldi	r25, 0x07	; 7
   1c884:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
    lcd_display_message_fullscreen_P(_T(MSG_WIZARD_HEATING));
   1c888:	89 e8       	ldi	r24, 0x89	; 137
   1c88a:	9d e3       	ldi	r25, 0x3D	; 61
   1c88c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1c890:	0e 94 a9 e0 	call	0x1c152	; 0x1c152 <lcd_display_message_fullscreen_P(char const*)>
  return current_temperature_bed;
};

// Doesn't save FLASH when FORCE_INLINE removed.
FORCE_INLINE float degTargetHotend(uint8_t extruder) {
  return target_temperature[extruder];
   1c894:	60 91 5d 12 	lds	r22, 0x125D	; 0x80125d <target_temperature>
   1c898:	70 91 5e 12 	lds	r23, 0x125E	; 0x80125e <target_temperature+0x1>
   1c89c:	07 2e       	mov	r0, r23
   1c89e:	00 0c       	add	r0, r0
   1c8a0:	88 0b       	sbc	r24, r24
   1c8a2:	99 0b       	sbc	r25, r25
   1c8a4:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   1c8a8:	9b 01       	movw	r18, r22
   1c8aa:	ac 01       	movw	r20, r24
    while (fabs(degHotend(0) - degTargetHotend(0)) > TEMP_HYSTERESIS) {
   1c8ac:	60 91 5a 0d 	lds	r22, 0x0D5A	; 0x800d5a <current_temperature>
   1c8b0:	70 91 5b 0d 	lds	r23, 0x0D5B	; 0x800d5b <current_temperature+0x1>
   1c8b4:	80 91 5c 0d 	lds	r24, 0x0D5C	; 0x800d5c <current_temperature+0x2>
   1c8b8:	90 91 5d 0d 	lds	r25, 0x0D5D	; 0x800d5d <current_temperature+0x3>
   1c8bc:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   1c8c0:	9f 77       	andi	r25, 0x7F	; 127
   1c8c2:	20 e0       	ldi	r18, 0x00	; 0
   1c8c4:	30 e0       	ldi	r19, 0x00	; 0
   1c8c6:	40 ea       	ldi	r20, 0xA0	; 160
   1c8c8:	50 e4       	ldi	r21, 0x40	; 64
   1c8ca:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   1c8ce:	18 16       	cp	r1, r24
   1c8d0:	b4 f5       	brge	.+108    	; 0x1c93e <wait_preheat()+0xea>
        lcd_display_message_fullscreen_P(_T(MSG_WIZARD_HEATING));
   1c8d2:	89 e8       	ldi	r24, 0x89	; 137
   1c8d4:	9d e3       	ldi	r25, 0x3D	; 61
   1c8d6:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1c8da:	0e 94 a9 e0 	call	0x1c152	; 0x1c152 <lcd_display_message_fullscreen_P(char const*)>

        lcd_set_cursor(0, 4);
   1c8de:	64 e0       	ldi	r22, 0x04	; 4
   1c8e0:	80 e0       	ldi	r24, 0x00	; 0
   1c8e2:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
   1c8e6:	60 91 5d 12 	lds	r22, 0x125D	; 0x80125d <target_temperature>
   1c8ea:	70 91 5e 12 	lds	r23, 0x125E	; 0x80125e <target_temperature+0x1>
   1c8ee:	07 2e       	mov	r0, r23
   1c8f0:	00 0c       	add	r0, r0
   1c8f2:	88 0b       	sbc	r24, r24
   1c8f4:	99 0b       	sbc	r25, r25
   1c8f6:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
	    //Print the hotend temperature (9 chars total)
		lcdui_print_temp(LCD_STR_THERMOMETER[0], (int)(degHotend(0) + 0.5), (int)(degTargetHotend(0) + 0.5));
   1c8fa:	20 e0       	ldi	r18, 0x00	; 0
   1c8fc:	30 e0       	ldi	r19, 0x00	; 0
   1c8fe:	40 e0       	ldi	r20, 0x00	; 0
   1c900:	5f e3       	ldi	r21, 0x3F	; 63
   1c902:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   1c906:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   1c90a:	6b 01       	movw	r12, r22
   1c90c:	20 e0       	ldi	r18, 0x00	; 0
   1c90e:	30 e0       	ldi	r19, 0x00	; 0
   1c910:	40 e0       	ldi	r20, 0x00	; 0
   1c912:	5f e3       	ldi	r21, 0x3F	; 63
   1c914:	60 91 5a 0d 	lds	r22, 0x0D5A	; 0x800d5a <current_temperature>
   1c918:	70 91 5b 0d 	lds	r23, 0x0D5B	; 0x800d5b <current_temperature+0x1>
   1c91c:	80 91 5c 0d 	lds	r24, 0x0D5C	; 0x800d5c <current_temperature+0x2>
   1c920:	90 91 5d 0d 	lds	r25, 0x0D5D	; 0x800d5d <current_temperature+0x3>
   1c924:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   1c928:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   1c92c:	a6 01       	movw	r20, r12
   1c92e:	82 e8       	ldi	r24, 0x82	; 130
   1c930:	0f 94 9b 0c 	call	0x21936	; 0x21936 <lcdui_print_temp(char, int, int)>
        delay_keep_alive(1000);
   1c934:	88 ee       	ldi	r24, 0xE8	; 232
   1c936:	93 e0       	ldi	r25, 0x03	; 3
   1c938:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
   1c93c:	ab cf       	rjmp	.-170    	; 0x1c894 <wait_preheat()+0x40>
    }

}
   1c93e:	ff 90       	pop	r15
   1c940:	ef 90       	pop	r14
   1c942:	df 90       	pop	r13
   1c944:	cf 90       	pop	r12
   1c946:	08 95       	ret

0001c948 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)>:
//! @retval 0xFF button timeout (only possible if allow_timeouting is true)
uint8_t lcd_show_multiscreen_message_with_choices_and_wait_P(
    const char *const msg, bool allow_timeouting, uint8_t default_selection,
    const char *const first_choice, const char *const second_choice, const char *const third_choice,
    uint8_t second_col
) {
   1c948:	2f 92       	push	r2
   1c94a:	3f 92       	push	r3
   1c94c:	4f 92       	push	r4
   1c94e:	5f 92       	push	r5
   1c950:	6f 92       	push	r6
   1c952:	7f 92       	push	r7
   1c954:	8f 92       	push	r8
   1c956:	9f 92       	push	r9
   1c958:	af 92       	push	r10
   1c95a:	bf 92       	push	r11
   1c95c:	cf 92       	push	r12
   1c95e:	df 92       	push	r13
   1c960:	ef 92       	push	r14
   1c962:	ff 92       	push	r15
   1c964:	0f 93       	push	r16
   1c966:	1f 93       	push	r17
   1c968:	cf 93       	push	r28
   1c96a:	df 93       	push	r29
   1c96c:	00 d0       	rcall	.+0      	; 0x1c96e <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x26>
   1c96e:	00 d0       	rcall	.+0      	; 0x1c970 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x28>
   1c970:	cd b7       	in	r28, 0x3d	; 61
   1c972:	de b7       	in	r29, 0x3e	; 62
   1c974:	5c 01       	movw	r10, r24
   1c976:	6c 83       	std	Y+4, r22	; 0x04
   1c978:	34 2e       	mov	r3, r20
   1c97a:	3b 83       	std	Y+3, r19	; 0x03
   1c97c:	2a 83       	std	Y+2, r18	; 0x02
   1c97e:	48 01       	movw	r8, r16
   1c980:	2c 2c       	mov	r2, r12
    const char *msg_next = msg ? lcd_display_message_fullscreen_P(msg) : NULL;
   1c982:	00 97       	sbiw	r24, 0x00	; 0
   1c984:	09 f0       	breq	.+2      	; 0x1c988 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x40>
   1c986:	51 c0       	rjmp	.+162    	; 0x1ca2a <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0xe2>
    bool multi_screen = msg_next != NULL;

    // Initial status/prompt on single-screen messages
    uint8_t current_selection = default_selection;
    if (!msg_next) {
        lcd_show_choices_prompt_P(current_selection, first_choice, second_choice, second_col, third_choice);
   1c988:	87 01       	movw	r16, r14
   1c98a:	22 2d       	mov	r18, r2
   1c98c:	a4 01       	movw	r20, r8
   1c98e:	6a 81       	ldd	r22, Y+2	; 0x02
   1c990:	7b 81       	ldd	r23, Y+3	; 0x03
   1c992:	83 2d       	mov	r24, r3
   1c994:	0e 94 71 df 	call	0x1bee2	; 0x1bee2 <lcd_show_choices_prompt_P(unsigned char, char const*, char const*, unsigned char, char const*)>
   1c998:	d1 2c       	mov	r13, r1
   1c99a:	c1 2c       	mov	r12, r1
    }
    // Wait for user confirmation or a timeout.
    unsigned long previous_millis_cmd = _millis();
   1c99c:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   1c9a0:	2b 01       	movw	r4, r22
   1c9a2:	3c 01       	movw	r6, r24
    lcd_consume_click();
   1c9a4:	0e 94 70 73 	call	0xe6e0	; 0xe6e0 <lcd_consume_click()>
    KEEPALIVE_STATE(PAUSED_FOR_USER);
   1c9a8:	84 e0       	ldi	r24, 0x04	; 4
   1c9aa:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
   1c9ae:	de 82       	std	Y+6, r13	; 0x06
   1c9b0:	cd 82       	std	Y+5, r12	; 0x05
   1c9b2:	24 e6       	ldi	r18, 0x64	; 100
   1c9b4:	29 83       	std	Y+1, r18	; 0x01
    for (;;) {
        for (uint8_t i = 0; i < 100; ++i) {
            delay_keep_alive(50);
   1c9b6:	82 e3       	ldi	r24, 0x32	; 50
   1c9b8:	90 e0       	ldi	r25, 0x00	; 0
   1c9ba:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
            if (allow_timeouting && _millis() - previous_millis_cmd > LCD_TIMEOUT_TO_STATUS) {
   1c9be:	3c 81       	ldd	r19, Y+4	; 0x04
   1c9c0:	31 11       	cpse	r19, r1
   1c9c2:	3a c0       	rjmp	.+116    	; 0x1ca38 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0xf0>
                current_selection = LCD_BUTTON_TIMEOUT;
                goto exit;
            }
            if (lcd_encoder) {
   1c9c4:	80 91 1e 06 	lds	r24, 0x061E	; 0x80061e <lcd_encoder>
   1c9c8:	90 91 1f 06 	lds	r25, 0x061F	; 0x80061f <lcd_encoder+0x1>
   1c9cc:	00 97       	sbiw	r24, 0x00	; 0
   1c9ce:	09 f0       	breq	.+2      	; 0x1c9d2 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x8a>
   1c9d0:	42 c0       	rjmp	.+132    	; 0x1ca56 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x10e>
                } else {
                    Sound_MakeSound(e_SOUND_TYPE_BlindAlert);
                    break; // turning knob skips waiting loop
                }
            }
            if (lcd_clicked()) {
   1c9d2:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   1c9d6:	88 23       	and	r24, r24
   1c9d8:	09 f4       	brne	.+2      	; 0x1c9dc <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x94>
   1c9da:	67 c0       	rjmp	.+206    	; 0x1caaa <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x162>
                if (msg_next == NULL) {
   1c9dc:	8d 81       	ldd	r24, Y+5	; 0x05
   1c9de:	9e 81       	ldd	r25, Y+6	; 0x06
   1c9e0:	89 2b       	or	r24, r25
   1c9e2:	09 f0       	breq	.+2      	; 0x1c9e6 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x9e>
   1c9e4:	5e c0       	rjmp	.+188    	; 0x1caa2 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x15a>
        if (msg_next == NULL) {
            lcd_show_choices_prompt_P(current_selection, first_choice, second_choice, second_col, third_choice);
        }
    }
exit:
    KEEPALIVE_STATE(IN_HANDLER);
   1c9e6:	82 e0       	ldi	r24, 0x02	; 2
   1c9e8:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
    // Enable LCD updates again. We may not call lcd_update_enable(true)
    // because it may create a recursion scenario when the caller of lcd_show_multiscreen_message_with_choices_and_wait_P
    // is a submenu lcd_update_enable(true) will cause another call to the submenu immediately
    // and so won't allow the user to exit the submenu
    lcd_update_enabled = true;
   1c9ec:	91 e0       	ldi	r25, 0x01	; 1
   1c9ee:	90 93 5a 02 	sts	0x025A, r25	; 0x80025a <lcd_update_enabled>
    lcd_draw_update = 2;
   1c9f2:	80 93 59 02 	sts	0x0259, r24	; 0x800259 <lcd_draw_update>
    return current_selection;
}
   1c9f6:	83 2d       	mov	r24, r3
   1c9f8:	26 96       	adiw	r28, 0x06	; 6
   1c9fa:	0f b6       	in	r0, 0x3f	; 63
   1c9fc:	f8 94       	cli
   1c9fe:	de bf       	out	0x3e, r29	; 62
   1ca00:	0f be       	out	0x3f, r0	; 63
   1ca02:	cd bf       	out	0x3d, r28	; 61
   1ca04:	df 91       	pop	r29
   1ca06:	cf 91       	pop	r28
   1ca08:	1f 91       	pop	r17
   1ca0a:	0f 91       	pop	r16
   1ca0c:	ff 90       	pop	r15
   1ca0e:	ef 90       	pop	r14
   1ca10:	df 90       	pop	r13
   1ca12:	cf 90       	pop	r12
   1ca14:	bf 90       	pop	r11
   1ca16:	af 90       	pop	r10
   1ca18:	9f 90       	pop	r9
   1ca1a:	8f 90       	pop	r8
   1ca1c:	7f 90       	pop	r7
   1ca1e:	6f 90       	pop	r6
   1ca20:	5f 90       	pop	r5
   1ca22:	4f 90       	pop	r4
   1ca24:	3f 90       	pop	r3
   1ca26:	2f 90       	pop	r2
   1ca28:	08 95       	ret
uint8_t lcd_show_multiscreen_message_with_choices_and_wait_P(
    const char *const msg, bool allow_timeouting, uint8_t default_selection,
    const char *const first_choice, const char *const second_choice, const char *const third_choice,
    uint8_t second_col
) {
    const char *msg_next = msg ? lcd_display_message_fullscreen_P(msg) : NULL;
   1ca2a:	0e 94 a9 e0 	call	0x1c152	; 0x1c152 <lcd_display_message_fullscreen_P(char const*)>
   1ca2e:	6c 01       	movw	r12, r24
    bool multi_screen = msg_next != NULL;

    // Initial status/prompt on single-screen messages
    uint8_t current_selection = default_selection;
    if (!msg_next) {
   1ca30:	89 2b       	or	r24, r25
   1ca32:	09 f0       	breq	.+2      	; 0x1ca36 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0xee>
   1ca34:	b3 cf       	rjmp	.-154    	; 0x1c99c <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x54>
   1ca36:	a8 cf       	rjmp	.-176    	; 0x1c988 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x40>
    lcd_consume_click();
    KEEPALIVE_STATE(PAUSED_FOR_USER);
    for (;;) {
        for (uint8_t i = 0; i < 100; ++i) {
            delay_keep_alive(50);
            if (allow_timeouting && _millis() - previous_millis_cmd > LCD_TIMEOUT_TO_STATUS) {
   1ca38:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   1ca3c:	64 19       	sub	r22, r4
   1ca3e:	75 09       	sbc	r23, r5
   1ca40:	86 09       	sbc	r24, r6
   1ca42:	97 09       	sbc	r25, r7
   1ca44:	61 33       	cpi	r22, 0x31	; 49
   1ca46:	75 47       	sbci	r23, 0x75	; 117
   1ca48:	81 05       	cpc	r24, r1
   1ca4a:	91 05       	cpc	r25, r1
   1ca4c:	08 f4       	brcc	.+2      	; 0x1ca50 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x108>
   1ca4e:	ba cf       	rjmp	.-140    	; 0x1c9c4 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x7c>
                current_selection = LCD_BUTTON_TIMEOUT;
   1ca50:	33 24       	eor	r3, r3
   1ca52:	3a 94       	dec	r3
   1ca54:	c8 cf       	rjmp	.-112    	; 0x1c9e6 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x9e>
                goto exit;
            }
            if (lcd_encoder) {
                if (msg_next == NULL) {
   1ca56:	2d 81       	ldd	r18, Y+5	; 0x05
   1ca58:	3e 81       	ldd	r19, Y+6	; 0x06
   1ca5a:	23 2b       	or	r18, r19
   1ca5c:	f9 f4       	brne	.+62     	; 0x1ca9c <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x154>
                    if (third_choice) { // third_choice is not nullptr, safe to dereference
   1ca5e:	e1 14       	cp	r14, r1
   1ca60:	f1 04       	cpc	r15, r1
   1ca62:	b1 f0       	breq	.+44     	; 0x1ca90 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x148>
                        if (lcd_encoder < 0 && current_selection != LCD_LEFT_BUTTON_CHOICE) {
   1ca64:	97 ff       	sbrs	r25, 7
   1ca66:	0f c0       	rjmp	.+30     	; 0x1ca86 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x13e>
   1ca68:	31 10       	cpse	r3, r1
                            // Rotating knob counter clockwise
                            current_selection--;
   1ca6a:	3a 94       	dec	r3
                        } else if (lcd_encoder > 0 && current_selection != LCD_MIDDLE_BUTTON_CHOICE) {
                            // Rotating knob clockwise
                            current_selection = LCD_MIDDLE_BUTTON_CHOICE;
                        }
                    }
                    lcd_show_choices_prompt_P(current_selection, first_choice, second_choice, second_col, third_choice);
   1ca6c:	87 01       	movw	r16, r14
   1ca6e:	22 2d       	mov	r18, r2
   1ca70:	a4 01       	movw	r20, r8
   1ca72:	6a 81       	ldd	r22, Y+2	; 0x02
   1ca74:	7b 81       	ldd	r23, Y+3	; 0x03
   1ca76:	83 2d       	mov	r24, r3
   1ca78:	0e 94 71 df 	call	0x1bee2	; 0x1bee2 <lcd_show_choices_prompt_P(unsigned char, char const*, char const*, unsigned char, char const*)>
                    lcd_encoder = 0;
   1ca7c:	10 92 1f 06 	sts	0x061F, r1	; 0x80061f <lcd_encoder+0x1>
   1ca80:	10 92 1e 06 	sts	0x061E, r1	; 0x80061e <lcd_encoder>
   1ca84:	a6 cf       	rjmp	.-180    	; 0x1c9d2 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x8a>
                if (msg_next == NULL) {
                    if (third_choice) { // third_choice is not nullptr, safe to dereference
                        if (lcd_encoder < 0 && current_selection != LCD_LEFT_BUTTON_CHOICE) {
                            // Rotating knob counter clockwise
                            current_selection--;
                        } else if (lcd_encoder > 0 && current_selection != LCD_RIGHT_BUTTON_CHOICE) {
   1ca86:	32 e0       	ldi	r19, 0x02	; 2
   1ca88:	33 16       	cp	r3, r19
   1ca8a:	81 f3       	breq	.-32     	; 0x1ca6c <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x124>
                            // Rotating knob clockwise
                            current_selection++;
   1ca8c:	33 94       	inc	r3
   1ca8e:	ee cf       	rjmp	.-36     	; 0x1ca6c <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x124>
                        }
                    } else {
                        if (lcd_encoder < 0 && current_selection != LCD_LEFT_BUTTON_CHOICE) {
   1ca90:	39 2e       	mov	r3, r25
   1ca92:	30 94       	com	r3
   1ca94:	33 1c       	adc	r3, r3
   1ca96:	33 24       	eor	r3, r3
   1ca98:	33 1c       	adc	r3, r3
   1ca9a:	e8 cf       	rjmp	.-48     	; 0x1ca6c <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x124>
                        }
                    }
                    lcd_show_choices_prompt_P(current_selection, first_choice, second_choice, second_col, third_choice);
                    lcd_encoder = 0;
                } else {
                    Sound_MakeSound(e_SOUND_TYPE_BlindAlert);
   1ca9c:	87 e0       	ldi	r24, 0x07	; 7
   1ca9e:	0f 94 ad 25 	call	0x24b5a	; 0x24b5a <Sound_MakeSound(eSOUND_TYPE)>
                    goto exit;
                } else
                    break;
            }
        }
        if (multi_screen) {
   1caa2:	c1 14       	cp	r12, r1
   1caa4:	d1 04       	cpc	r13, r1
   1caa6:	79 f4       	brne	.+30     	; 0x1cac6 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x17e>
   1caa8:	84 cf       	rjmp	.-248    	; 0x1c9b2 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x6a>
   1caaa:	99 81       	ldd	r25, Y+1	; 0x01
   1caac:	91 50       	subi	r25, 0x01	; 1
   1caae:	99 83       	std	Y+1, r25	; 0x01
    // Wait for user confirmation or a timeout.
    unsigned long previous_millis_cmd = _millis();
    lcd_consume_click();
    KEEPALIVE_STATE(PAUSED_FOR_USER);
    for (;;) {
        for (uint8_t i = 0; i < 100; ++i) {
   1cab0:	91 11       	cpse	r25, r1
   1cab2:	81 cf       	rjmp	.-254    	; 0x1c9b6 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x6e>
                    goto exit;
                } else
                    break;
            }
        }
        if (multi_screen) {
   1cab4:	c1 14       	cp	r12, r1
   1cab6:	d1 04       	cpc	r13, r1
   1cab8:	61 f0       	breq	.+24     	; 0x1cad2 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x18a>
            if (msg_next == NULL) {
   1caba:	2d 81       	ldd	r18, Y+5	; 0x05
   1cabc:	3e 81       	ldd	r19, Y+6	; 0x06
   1cabe:	23 2b       	or	r18, r19
   1cac0:	11 f4       	brne	.+4      	; 0x1cac6 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x17e>
   1cac2:	be 82       	std	Y+6, r11	; 0x06
   1cac4:	ad 82       	std	Y+5, r10	; 0x05
                msg_next = msg;
            }
            msg_next = lcd_display_message_fullscreen_P(msg_next);
   1cac6:	8d 81       	ldd	r24, Y+5	; 0x05
   1cac8:	9e 81       	ldd	r25, Y+6	; 0x06
   1caca:	0e 94 a9 e0 	call	0x1c152	; 0x1c152 <lcd_display_message_fullscreen_P(char const*)>
   1cace:	9e 83       	std	Y+6, r25	; 0x06
   1cad0:	8d 83       	std	Y+5, r24	; 0x05
        }
        if (msg_next == NULL) {
   1cad2:	8d 81       	ldd	r24, Y+5	; 0x05
   1cad4:	9e 81       	ldd	r25, Y+6	; 0x06
   1cad6:	89 2b       	or	r24, r25
   1cad8:	09 f0       	breq	.+2      	; 0x1cadc <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x194>
   1cada:	6b cf       	rjmp	.-298    	; 0x1c9b2 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x6a>
            lcd_show_choices_prompt_P(current_selection, first_choice, second_choice, second_col, third_choice);
   1cadc:	87 01       	movw	r16, r14
   1cade:	22 2d       	mov	r18, r2
   1cae0:	a4 01       	movw	r20, r8
   1cae2:	6a 81       	ldd	r22, Y+2	; 0x02
   1cae4:	7b 81       	ldd	r23, Y+3	; 0x03
   1cae6:	83 2d       	mov	r24, r3
   1cae8:	0e 94 71 df 	call	0x1bee2	; 0x1bee2 <lcd_show_choices_prompt_P(unsigned char, char const*, char const*, unsigned char, char const*)>
   1caec:	62 cf       	rjmp	.-316    	; 0x1c9b2 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)+0x6a>

0001caee <lcd_show_multiscreen_message_cont_cancel_and_wait_P(char const*, bool, unsigned char)>:
//! @param default_selection if 0, 'Yes' choice is selected by default, otherwise 'No' choice is preselected
//! @retval 0 cont choice selected by user
//! @retval 1 cancel choice selected by user
//! @retval 0xFF button timeout (only possible if allow_timeouting is true)
uint8_t lcd_show_multiscreen_message_cont_cancel_and_wait_P(const char *msg, bool allow_timeouting, uint8_t default_selection) //currently just max. n*4 + 3 lines supported (set in language header files)
{
   1caee:	bf 92       	push	r11
   1caf0:	cf 92       	push	r12
   1caf2:	df 92       	push	r13
   1caf4:	ef 92       	push	r14
   1caf6:	ff 92       	push	r15
   1caf8:	0f 93       	push	r16
   1cafa:	1f 93       	push	r17
   1cafc:	cf 93       	push	r28
   1cafe:	df 93       	push	r29
   1cb00:	ec 01       	movw	r28, r24
   1cb02:	d6 2e       	mov	r13, r22
   1cb04:	b4 2e       	mov	r11, r20
    return lcd_show_multiscreen_message_with_choices_and_wait_P(msg, allow_timeouting, default_selection, _T(MSG_CONTINUE_SHORT), _T(MSG_CANCEL), nullptr, 10);
   1cb06:	89 e2       	ldi	r24, 0x29	; 41
   1cb08:	9d e3       	ldi	r25, 0x3D	; 61
   1cb0a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1cb0e:	8c 01       	movw	r16, r24
   1cb10:	8a e7       	ldi	r24, 0x7A	; 122
   1cb12:	94 e4       	ldi	r25, 0x44	; 68
   1cb14:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1cb18:	2a e0       	ldi	r18, 0x0A	; 10
   1cb1a:	c2 2e       	mov	r12, r18
   1cb1c:	f1 2c       	mov	r15, r1
   1cb1e:	e1 2c       	mov	r14, r1
   1cb20:	9c 01       	movw	r18, r24
   1cb22:	4b 2d       	mov	r20, r11
   1cb24:	6d 2d       	mov	r22, r13
   1cb26:	ce 01       	movw	r24, r28
   1cb28:	0e 94 a4 e4 	call	0x1c948	; 0x1c948 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)>
}
   1cb2c:	df 91       	pop	r29
   1cb2e:	cf 91       	pop	r28
   1cb30:	1f 91       	pop	r17
   1cb32:	0f 91       	pop	r16
   1cb34:	ff 90       	pop	r15
   1cb36:	ef 90       	pop	r14
   1cb38:	df 90       	pop	r13
   1cb3a:	cf 90       	pop	r12
   1cb3c:	bf 90       	pop	r11
   1cb3e:	08 95       	ret

0001cb40 <lcd_sdcard_menu()>:
    MENU_ITEM_FUNCTION_P(_T(MSG_YES), lcd_print_stop);
    MENU_END();
}

void lcd_sdcard_menu()
{
   1cb40:	2f 92       	push	r2
   1cb42:	3f 92       	push	r3
   1cb44:	4f 92       	push	r4
   1cb46:	5f 92       	push	r5
   1cb48:	6f 92       	push	r6
   1cb4a:	7f 92       	push	r7
   1cb4c:	8f 92       	push	r8
   1cb4e:	9f 92       	push	r9
   1cb50:	af 92       	push	r10
   1cb52:	bf 92       	push	r11
   1cb54:	cf 92       	push	r12
   1cb56:	df 92       	push	r13
   1cb58:	ef 92       	push	r14
   1cb5a:	ff 92       	push	r15
   1cb5c:	0f 93       	push	r16
   1cb5e:	1f 93       	push	r17
   1cb60:	cf 93       	push	r28
   1cb62:	df 93       	push	r29
   1cb64:	cd b7       	in	r28, 0x3d	; 61
   1cb66:	de b7       	in	r29, 0x3e	; 62
   1cb68:	2d 97       	sbiw	r28, 0x0d	; 13
   1cb6a:	0f b6       	in	r0, 0x3f	; 63
   1cb6c:	f8 94       	cli
   1cb6e:	de bf       	out	0x3e, r29	; 62
   1cb70:	0f be       	out	0x3f, r0	; 63
   1cb72:	cd bf       	out	0x3d, r28	; 61
		ShortTimer lcd_scrollTimer;
	} _menu_data_sdcard_t;
	static_assert(sizeof(menu_data)>= sizeof(_menu_data_sdcard_t),"_menu_data_sdcard_t doesn't fit into menu_data");
	_menu_data_sdcard_t* _md = (_menu_data_sdcard_t*)&(menu_data[0]);

	switch(_md->menuState)
   1cb74:	80 91 96 03 	lds	r24, 0x0396	; 0x800396 <menu_data>
   1cb78:	81 30       	cpi	r24, 0x01	; 1
   1cb7a:	51 f1       	breq	.+84     	; 0x1cbd0 <lcd_sdcard_menu()+0x90>
   1cb7c:	30 f0       	brcs	.+12     	; 0x1cb8a <lcd_sdcard_menu()+0x4a>
   1cb7e:	82 30       	cpi	r24, 0x02	; 2
   1cb80:	09 f4       	brne	.+2      	; 0x1cb84 <lcd_sdcard_menu()+0x44>
   1cb82:	88 c2       	rjmp	.+1296   	; 0x1d094 <lcd_sdcard_menu()+0x554>
			{
				_md->lcd_scrollTimer.stop(); //forces redraw in _standard state
				_md->menuState = _standard;
			}
		} break;
		default: _md->menuState = _uninitialized; //shouldn't ever happen. Anyways, initialize the menu.
   1cb84:	10 92 96 03 	sts	0x0396, r1	; 0x800396 <menu_data>
   1cb88:	04 c1       	rjmp	.+520    	; 0x1cd92 <lcd_sdcard_menu()+0x252>

	switch(_md->menuState)
	{
		case _uninitialized: //Initialize menu data
		{
			if (card.presort_flag == true) //used to force resorting if sorting type is changed.
   1cb8a:	80 91 26 14 	lds	r24, 0x1426	; 0x801426 <card+0x51>
   1cb8e:	88 23       	and	r24, r24
   1cb90:	49 f0       	breq	.+18     	; 0x1cba4 <lcd_sdcard_menu()+0x64>
			{
				card.presort_flag = false;
   1cb92:	10 92 26 14 	sts	0x1426, r1	; 0x801426 <card+0x51>
				lcd_update_enabled = false;
   1cb96:	10 92 5a 02 	sts	0x025A, r1	; 0x80025a <lcd_update_enabled>
				card.presort();
   1cb9a:	0f 94 32 6f 	call	0x2de64	; 0x2de64 <CardReader::presort() [clone .constprop.194]>
				lcd_update_enabled = true;
   1cb9e:	81 e0       	ldi	r24, 0x01	; 1
   1cba0:	80 93 5a 02 	sts	0x025A, r24	; 0x80025a <lcd_update_enabled>
			}
			_md->fileCnt = card.getnrfilenames();
   1cba4:	0f 94 4f 6c 	call	0x2d89e	; 0x2d89e <CardReader::getnrfilenames() [clone .constprop.236]>
   1cba8:	90 93 9e 03 	sts	0x039E, r25	; 0x80039e <menu_data+0x8>
   1cbac:	80 93 9d 03 	sts	0x039D, r24	; 0x80039d <menu_data+0x7>
			_md->sdSort = farm_mode ? SD_SORT_NONE : eeprom_read_byte((uint8_t*)EEPROM_SD_SORT);
   1cbb0:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   1cbb4:	81 11       	cpse	r24, r1
   1cbb6:	e7 c0       	rjmp	.+462    	; 0x1cd86 <lcd_sdcard_menu()+0x246>
   1cbb8:	89 e0       	ldi	r24, 0x09	; 9
   1cbba:	9f e0       	ldi	r25, 0x0F	; 15
   1cbbc:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1cbc0:	80 93 a0 03 	sts	0x03A0, r24	; 0x8003a0 <menu_data+0xa>
			_md->menuState = _standard;
   1cbc4:	81 e0       	ldi	r24, 0x01	; 1
   1cbc6:	80 93 96 03 	sts	0x0396, r24	; 0x800396 <menu_data>
			_md->row = -1; // assume that no SD file/dir is currently selected. Once they are rendered, it will be changed to the correct row for the _scrolling state.
   1cbca:	8f ef       	ldi	r24, 0xFF	; 255
   1cbcc:	80 93 9f 03 	sts	0x039F, r24	; 0x80039f <menu_data+0x9>
		}
		// FALLTHRU
		case _standard: //normal menu structure.
		{
			if (!_md->lcd_scrollTimer.running()) //if the timer is not running, then the menu state was just switched, so redraw the screen.
   1cbd0:	80 91 a1 03 	lds	r24, 0x03A1	; 0x8003a1 <menu_data+0xb>
   1cbd4:	81 11       	cpse	r24, r1
   1cbd6:	07 c0       	rjmp	.+14     	; 0x1cbe6 <lcd_sdcard_menu()+0xa6>
			{
				_md->lcd_scrollTimer.start();
   1cbd8:	81 ea       	ldi	r24, 0xA1	; 161
   1cbda:	93 e0       	ldi	r25, 0x03	; 3
   1cbdc:	0f 94 4e 0e 	call	0x21c9c	; 0x21c9c <Timer<unsigned short>::start()>
				lcd_draw_update = 1;
   1cbe0:	81 e0       	ldi	r24, 0x01	; 1
   1cbe2:	80 93 59 02 	sts	0x0259, r24	; 0x800259 <lcd_draw_update>
			}
			if ((lcd_draw_update == 0) && _md->lcd_scrollTimer.expired(500) && (_md->row != -1)) //switch to the scrolling state on timeout if a file/dir is selected.
   1cbe6:	80 91 59 02 	lds	r24, 0x0259	; 0x800259 <lcd_draw_update>
   1cbea:	81 11       	cpse	r24, r1
   1cbec:	21 c0       	rjmp	.+66     	; 0x1cc30 <lcd_sdcard_menu()+0xf0>
   1cbee:	64 ef       	ldi	r22, 0xF4	; 244
   1cbf0:	71 e0       	ldi	r23, 0x01	; 1
   1cbf2:	81 ea       	ldi	r24, 0xA1	; 161
   1cbf4:	93 e0       	ldi	r25, 0x03	; 3
   1cbf6:	0f 94 1f 0e 	call	0x21c3e	; 0x21c3e <Timer<unsigned short>::expired(unsigned short)>
   1cbfa:	88 23       	and	r24, r24
   1cbfc:	a1 f0       	breq	.+40     	; 0x1cc26 <lcd_sdcard_menu()+0xe6>
   1cbfe:	80 91 9f 03 	lds	r24, 0x039F	; 0x80039f <menu_data+0x9>
   1cc02:	8f 3f       	cpi	r24, 0xFF	; 255
   1cc04:	81 f0       	breq	.+32     	; 0x1cc26 <lcd_sdcard_menu()+0xe6>
			{
				_md->menuState = _scrolling;
   1cc06:	82 e0       	ldi	r24, 0x02	; 2
   1cc08:	80 93 96 03 	sts	0x0396, r24	; 0x800396 <menu_data>
				_md->offset = 0;
   1cc0c:	10 92 97 03 	sts	0x0397, r1	; 0x800397 <menu_data+0x1>
				_md->scrollPointer = NULL;
   1cc10:	10 92 9a 03 	sts	0x039A, r1	; 0x80039a <menu_data+0x4>
   1cc14:	10 92 99 03 	sts	0x0399, r1	; 0x800399 <menu_data+0x3>
				_md->lcd_scrollTimer.start();
   1cc18:	81 ea       	ldi	r24, 0xA1	; 161
   1cc1a:	93 e0       	ldi	r25, 0x03	; 3
   1cc1c:	0f 94 4e 0e 	call	0x21c9c	; 0x21c9c <Timer<unsigned short>::start()>
				lcd_draw_update = 1; //forces last load before switching to scrolling.
   1cc20:	81 e0       	ldi	r24, 0x01	; 1
   1cc22:	80 93 59 02 	sts	0x0259, r24	; 0x800259 <lcd_draw_update>
			}
			if (lcd_draw_update == 0 && !lcd_clicked())
   1cc26:	80 91 59 02 	lds	r24, 0x0259	; 0x800259 <lcd_draw_update>
   1cc2a:	88 23       	and	r24, r24
   1cc2c:	09 f4       	brne	.+2      	; 0x1cc30 <lcd_sdcard_menu()+0xf0>
   1cc2e:	ad c0       	rjmp	.+346    	; 0x1cd8a <lcd_sdcard_menu()+0x24a>
				return; // nothing to do (so don't thrash the SD card)

			_md->row = -1; // assume that no SD file/dir is currently selected. Once they are rendered, it will be changed to the correct row for the _scrolling state.
   1cc30:	8f ef       	ldi	r24, 0xFF	; 255
   1cc32:	80 93 9f 03 	sts	0x039F, r24	; 0x80039f <menu_data+0x9>

			//if we reached this point it means that the encoder moved or clicked or the state is being switched. Reset the scrollTimer.
			_md->lcd_scrollTimer.start();
   1cc36:	81 ea       	ldi	r24, 0xA1	; 161
   1cc38:	93 e0       	ldi	r25, 0x03	; 3
   1cc3a:	0f 94 4e 0e 	call	0x21c9c	; 0x21c9c <Timer<unsigned short>::start()>

			MENU_BEGIN();
   1cc3e:	0e 94 0c 74 	call	0xe818	; 0xe818 <menu_start()>
   1cc42:	10 92 60 04 	sts	0x0460, r1	; 0x800460 <menu_row>
  if(eFilamentAction != FilamentAction::None) return;

    // Create a copy of card.filename on the stack since card.filename pointer
    // will be modified by the SD card library when searching for the file
    char selected_filename[FILENAME_LENGTH];
    strcpy(selected_filename, filename);
   1cc46:	ce 01       	movw	r24, r28
   1cc48:	01 96       	adiw	r24, 0x01	; 1
   1cc4a:	7c 01       	movw	r14, r24
  if (!check_file(selected_filename)) {
      result = !lcd_show_multiscreen_message_cont_cancel_and_wait_P(_T(MSG_FILE_INCOMPLETE), false);
      lcd_update_enable(true);
  }
  if (result) {
	  enquecommandf_P(MSG_M23, selected_filename);
   1cc4c:	f7 e6       	ldi	r31, 0x67	; 103
   1cc4e:	2f 2e       	mov	r2, r31
   1cc50:	fc e6       	ldi	r31, 0x6C	; 108
   1cc52:	3f 2e       	mov	r3, r31
			_md->row = -1; // assume that no SD file/dir is currently selected. Once they are rendered, it will be changed to the correct row for the _scrolling state.

			//if we reached this point it means that the encoder moved or clicked or the state is being switched. Reset the scrollTimer.
			_md->lcd_scrollTimer.start();

			MENU_BEGIN();
   1cc54:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   1cc58:	84 30       	cpi	r24, 0x04	; 4
   1cc5a:	08 f0       	brcs	.+2      	; 0x1cc5e <lcd_sdcard_menu()+0x11e>
   1cc5c:	9a c0       	rjmp	.+308    	; 0x1cd92 <lcd_sdcard_menu()+0x252>
   1cc5e:	10 92 63 04 	sts	0x0463, r1	; 0x800463 <menu_item>
			MENU_ITEM_BACK_P(_T(bMain?MSG_MAIN:MSG_BACK));  // i.e. default menu-item / menu-item after card insertion
   1cc62:	80 91 c9 03 	lds	r24, 0x03C9	; 0x8003c9 <bMain>
   1cc66:	88 23       	and	r24, r24
   1cc68:	09 f4       	brne	.+2      	; 0x1cc6c <lcd_sdcard_menu()+0x12c>
   1cc6a:	ac c0       	rjmp	.+344    	; 0x1cdc4 <lcd_sdcard_menu()+0x284>
   1cc6c:	8f ed       	ldi	r24, 0xDF	; 223
   1cc6e:	98 e4       	ldi	r25, 0x48	; 72
   1cc70:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1cc74:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
      sdpos = file.curPosition();
      return c;
  };
  void setIndex(long index) {sdpos = index;file.seekSetFilteredGcode(index);};
  FORCE_INLINE uint8_t percentDone(){if(!isFileOpen()) return 0; if(filesize) return sdpos/((filesize+99)/100); else return 0;};
  FORCE_INLINE char* getWorkDirName(){workDir.getFilename(filename);return filename;};
   1cc78:	69 ed       	ldi	r22, 0xD9	; 217
   1cc7a:	73 e1       	ldi	r23, 0x13	; 19
   1cc7c:	82 e8       	ldi	r24, 0x82	; 130
   1cc7e:	94 e1       	ldi	r25, 0x14	; 20
   1cc80:	0f 94 f2 2e 	call	0x25de4	; 0x25de4 <SdBaseFile::getFilename(char*)>
			card.getWorkDirName();
			if (card.filename[0] == '/')
   1cc84:	80 91 d9 13 	lds	r24, 0x13D9	; 0x8013d9 <card+0x4>
   1cc88:	8f 32       	cpi	r24, 0x2F	; 47
   1cc8a:	09 f0       	breq	.+2      	; 0x1cc8e <lcd_sdcard_menu()+0x14e>
   1cc8c:	9e c0       	rjmp	.+316    	; 0x1cdca <lcd_sdcard_menu()+0x28a>
			{
#if SDCARDDETECT == -1
				MENU_ITEM_FUNCTION_P(_T(MSG_REFRESH), lcd_sd_refresh);
#else
				if (card.ToshibaFlashAir_isEnabled())
   1cc8e:	80 91 48 16 	lds	r24, 0x1648	; 0x801648 <card+0x273>
   1cc92:	88 23       	and	r24, r24
   1cc94:	41 f0       	breq	.+16     	; 0x1cca6 <lcd_sdcard_menu()+0x166>
					MENU_ITEM_FUNCTION_P(_T(MSG_REFRESH), lcd_sd_refresh); //show the refresh option if in flashAir mode.
   1cc96:	84 ed       	ldi	r24, 0xD4	; 212
   1cc98:	98 e4       	ldi	r25, 0x48	; 72
   1cc9a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1cc9e:	6d e5       	ldi	r22, 0x5D	; 93
   1cca0:	7f ec       	ldi	r23, 0xCF	; 207
#endif
			}
			else
				MENU_ITEM_FUNCTION_P(PSTR(LCD_STR_FOLDER ".."), lcd_sd_updir); //Show the updir button if in a subdir.
   1cca2:	0e 94 9d 72 	call	0xe53a	; 0xe53a <menu_item_function_P(char const*, void (*)())>

			for (uint16_t i = _md->fileCnt; i-- > 0;) // Every file, from top to bottom.
   1cca6:	c0 90 9d 03 	lds	r12, 0x039D	; 0x80039d <menu_data+0x7>
   1ccaa:	d0 90 9e 03 	lds	r13, 0x039E	; 0x80039e <menu_data+0x8>
	}
	if (menu_clicked && (lcd_encoder == menu_item))
	{
		lcd_update_enabled = false;
		menu_action_sdfile(str_fn);
		lcd_update_enabled = true;
   1ccae:	01 e0       	ldi	r16, 0x01	; 1
#endif
			}
			else
				MENU_ITEM_FUNCTION_P(PSTR(LCD_STR_FOLDER ".."), lcd_sd_updir); //Show the updir button if in a subdir.

			for (uint16_t i = _md->fileCnt; i-- > 0;) // Every file, from top to bottom.
   1ccb0:	91 e0       	ldi	r25, 0x01	; 1
   1ccb2:	c9 1a       	sub	r12, r25
   1ccb4:	d1 08       	sbc	r13, r1
   1ccb6:	08 f4       	brcc	.+2      	; 0x1ccba <lcd_sdcard_menu()+0x17a>
   1ccb8:	e0 c1       	rjmp	.+960    	; 0x1d07a <lcd_sdcard_menu()+0x53a>
			{
				if (menu_item == menu_line) //If the file is on the screen.
   1ccba:	80 91 63 04 	lds	r24, 0x0463	; 0x800463 <menu_item>
   1ccbe:	90 91 62 04 	lds	r25, 0x0462	; 0x800462 <menu_line>
   1ccc2:	89 13       	cpse	r24, r25
   1ccc4:	d6 c1       	rjmp	.+940    	; 0x1d072 <lcd_sdcard_menu()+0x532>
				{
					//load filename to memory.
#ifdef SDCARD_SORT_ALPHA
					card.getfilename_sorted(i, _md->sdSort);
   1ccc6:	60 91 a0 03 	lds	r22, 0x03A0	; 0x8003a0 <menu_data+0xa>
   1ccca:	c6 01       	movw	r24, r12
   1cccc:	0f 94 a9 77 	call	0x2ef52	; 0x2ef52 <CardReader::getfilename_sorted(unsigned int, unsigned char) [clone .constprop.156]>
#else
					card.getfilename(i);
#endif
					if (lcd_encoder == menu_item) //If the file is selected.
   1ccd0:	80 91 63 04 	lds	r24, 0x0463	; 0x800463 <menu_item>
   1ccd4:	90 e0       	ldi	r25, 0x00	; 0
   1ccd6:	20 91 1e 06 	lds	r18, 0x061E	; 0x80061e <lcd_encoder>
   1ccda:	30 91 1f 06 	lds	r19, 0x061F	; 0x80061f <lcd_encoder+0x1>
   1ccde:	10 91 23 14 	lds	r17, 0x1423	; 0x801423 <card+0x4e>
   1cce2:	82 17       	cp	r24, r18
   1cce4:	93 07       	cpc	r25, r19
   1cce6:	51 f4       	brne	.+20     	; 0x1ccfc <lcd_sdcard_menu()+0x1bc>
					{

						_md->selectedFileID = i;
   1cce8:	d0 92 9c 03 	sts	0x039C, r13	; 0x80039c <menu_data+0x6>
   1ccec:	c0 92 9b 03 	sts	0x039B, r12	; 0x80039b <menu_data+0x5>
						_md->isDir = card.filenameIsDir;
   1ccf0:	10 93 98 03 	sts	0x0398, r17	; 0x800398 <menu_data+0x2>
						_md->row = menu_row;
   1ccf4:	40 91 60 04 	lds	r20, 0x0460	; 0x800460 <menu_row>
   1ccf8:	40 93 9f 03 	sts	0x039F, r20	; 0x80039f <menu_data+0x9>
   1ccfc:	40 91 59 02 	lds	r20, 0x0259	; 0x800259 <lcd_draw_update>
					}
					if (card.filenameIsDir)
   1cd00:	11 23       	and	r17, r17
   1cd02:	09 f4       	brne	.+2      	; 0x1cd06 <lcd_sdcard_menu()+0x1c6>
   1cd04:	67 c0       	rjmp	.+206    	; 0x1cdd4 <lcd_sdcard_menu()+0x294>
#define MENU_ITEM_SDFILE(str_fn, str_fnl) do { menu_item_sdfile(str_fn, str_fnl); } while (0)


static void menu_item_sddir(const char* str_fn, char* str_fnl)
{
	if (lcd_draw_update)
   1cd06:	44 23       	and	r20, r20
   1cd08:	e9 f0       	breq	.+58     	; 0x1cd44 <lcd_sdcard_menu()+0x204>
	{
		lcd_implementation_drawmenu_sddirectory(menu_row, (str_fnl[0] == '\0') ? str_fn : str_fnl);
   1cd0a:	40 91 ee 13 	lds	r20, 0x13EE	; 0x8013ee <card+0x19>
   1cd0e:	e9 ed       	ldi	r30, 0xD9	; 217
   1cd10:	ae 2e       	mov	r10, r30
   1cd12:	e3 e1       	ldi	r30, 0x13	; 19
   1cd14:	be 2e       	mov	r11, r30
   1cd16:	44 23       	and	r20, r20
   1cd18:	21 f0       	breq	.+8      	; 0x1cd22 <lcd_sdcard_menu()+0x1e2>
   1cd1a:	7e ee       	ldi	r23, 0xEE	; 238
   1cd1c:	a7 2e       	mov	r10, r23
   1cd1e:	73 e1       	ldi	r23, 0x13	; 19
   1cd20:	b7 2e       	mov	r11, r23
   1cd22:	60 91 60 04 	lds	r22, 0x0460	; 0x800460 <menu_row>
}

static void lcd_implementation_drawmenu_sddirectory(uint8_t row, const char* longFilename)
{
    uint8_t len = LCD_WIDTH - 2;
    lcd_putc_at(0, row, (lcd_encoder == menu_item)?'>':' ');
   1cd26:	4e e3       	ldi	r20, 0x3E	; 62
   1cd28:	82 17       	cp	r24, r18
   1cd2a:	93 07       	cpc	r25, r19
   1cd2c:	09 f0       	breq	.+2      	; 0x1cd30 <lcd_sdcard_menu()+0x1f0>
   1cd2e:	40 e2       	ldi	r20, 0x20	; 32
   1cd30:	80 e0       	ldi	r24, 0x00	; 0
   1cd32:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
    lcd_putc(LCD_STR_FOLDER[0]);
   1cd36:	85 e8       	ldi	r24, 0x85	; 133
   1cd38:	0e 94 21 6f 	call	0xde42	; 0xde42 <lcd_putc(char)>
    lcd_print_pad(longFilename, len);
   1cd3c:	62 e1       	ldi	r22, 0x12	; 18
   1cd3e:	c5 01       	movw	r24, r10
   1cd40:	0e 94 47 73 	call	0xe68e	; 0xe68e <lcd_print_pad(char const*, unsigned char)>
   1cd44:	80 91 63 04 	lds	r24, 0x0463	; 0x800463 <menu_item>
{
	if (lcd_draw_update)
	{
		lcd_implementation_drawmenu_sddirectory(menu_row, (str_fnl[0] == '\0') ? str_fn : str_fnl);
	}
	if (menu_clicked && (lcd_encoder == menu_item))
   1cd48:	90 91 61 04 	lds	r25, 0x0461	; 0x800461 <menu_clicked>
   1cd4c:	99 23       	and	r25, r25
   1cd4e:	09 f4       	brne	.+2      	; 0x1cd52 <lcd_sdcard_menu()+0x212>
   1cd50:	90 c1       	rjmp	.+800    	; 0x1d072 <lcd_sdcard_menu()+0x532>
   1cd52:	20 91 1e 06 	lds	r18, 0x061E	; 0x80061e <lcd_encoder>
   1cd56:	30 91 1f 06 	lds	r19, 0x061F	; 0x80061f <lcd_encoder+0x1>
   1cd5a:	82 17       	cp	r24, r18
   1cd5c:	13 06       	cpc	r1, r19
   1cd5e:	09 f0       	breq	.+2      	; 0x1cd62 <lcd_sdcard_menu()+0x222>
   1cd60:	88 c1       	rjmp	.+784    	; 0x1d072 <lcd_sdcard_menu()+0x532>
	{
		lcd_update_enabled = false;
   1cd62:	10 92 5a 02 	sts	0x025A, r1	; 0x80025a <lcd_update_enabled>
  lcd_return_to_status();
}

void menu_action_sddirectory(const char* filename)
{
	card.chdir(filename, true);
   1cd66:	61 e0       	ldi	r22, 0x01	; 1
   1cd68:	89 ed       	ldi	r24, 0xD9	; 217
   1cd6a:	93 e1       	ldi	r25, 0x13	; 19
   1cd6c:	0f 94 bc 70 	call	0x2e178	; 0x2e178 <CardReader::chdir(char const*, bool) [clone .constprop.200]>
	lcd_encoder = 0;
   1cd70:	10 92 1f 06 	sts	0x061F, r1	; 0x80061f <lcd_encoder+0x1>
   1cd74:	10 92 1e 06 	sts	0x061E, r1	; 0x80061e <lcd_encoder>
	menu_data_reset(); //Forces reloading of cached variables.
   1cd78:	0e 94 af 62 	call	0xc55e	; 0xc55e <menu_data_reset()>
	}
	if (menu_clicked && (lcd_encoder == menu_item))
	{
		lcd_update_enabled = false;
		menu_action_sdfile(str_fn);
		lcd_update_enabled = true;
   1cd7c:	00 93 5a 02 	sts	0x025A, r16	; 0x80025a <lcd_update_enabled>
		menu_item_ret();
   1cd80:	0e 94 73 62 	call	0xc4e6	; 0xc4e6 <menu_item_ret()>
   1cd84:	95 cf       	rjmp	.-214    	; 0x1ccb0 <lcd_sdcard_menu()+0x170>
				lcd_update_enabled = false;
				card.presort();
				lcd_update_enabled = true;
			}
			_md->fileCnt = card.getnrfilenames();
			_md->sdSort = farm_mode ? SD_SORT_NONE : eeprom_read_byte((uint8_t*)EEPROM_SD_SORT);
   1cd86:	82 e0       	ldi	r24, 0x02	; 2
   1cd88:	1b cf       	rjmp	.-458    	; 0x1cbc0 <lcd_sdcard_menu()+0x80>
				_md->offset = 0;
				_md->scrollPointer = NULL;
				_md->lcd_scrollTimer.start();
				lcd_draw_update = 1; //forces last load before switching to scrolling.
			}
			if (lcd_draw_update == 0 && !lcd_clicked())
   1cd8a:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   1cd8e:	81 11       	cpse	r24, r1
   1cd90:	4f cf       	rjmp	.-354    	; 0x1cc30 <lcd_sdcard_menu()+0xf0>
				_md->menuState = _standard;
			}
		} break;
		default: _md->menuState = _uninitialized; //shouldn't ever happen. Anyways, initialize the menu.
	}
}
   1cd92:	2d 96       	adiw	r28, 0x0d	; 13
   1cd94:	0f b6       	in	r0, 0x3f	; 63
   1cd96:	f8 94       	cli
   1cd98:	de bf       	out	0x3e, r29	; 62
   1cd9a:	0f be       	out	0x3f, r0	; 63
   1cd9c:	cd bf       	out	0x3d, r28	; 61
   1cd9e:	df 91       	pop	r29
   1cda0:	cf 91       	pop	r28
   1cda2:	1f 91       	pop	r17
   1cda4:	0f 91       	pop	r16
   1cda6:	ff 90       	pop	r15
   1cda8:	ef 90       	pop	r14
   1cdaa:	df 90       	pop	r13
   1cdac:	cf 90       	pop	r12
   1cdae:	bf 90       	pop	r11
   1cdb0:	af 90       	pop	r10
   1cdb2:	9f 90       	pop	r9
   1cdb4:	8f 90       	pop	r8
   1cdb6:	7f 90       	pop	r7
   1cdb8:	6f 90       	pop	r6
   1cdba:	5f 90       	pop	r5
   1cdbc:	4f 90       	pop	r4
   1cdbe:	3f 90       	pop	r3
   1cdc0:	2f 90       	pop	r2
   1cdc2:	08 95       	ret

			//if we reached this point it means that the encoder moved or clicked or the state is being switched. Reset the scrollTimer.
			_md->lcd_scrollTimer.start();

			MENU_BEGIN();
			MENU_ITEM_BACK_P(_T(bMain?MSG_MAIN:MSG_BACK));  // i.e. default menu-item / menu-item after card insertion
   1cdc4:	88 ee       	ldi	r24, 0xE8	; 232
   1cdc6:	9a e4       	ldi	r25, 0x4A	; 74
   1cdc8:	53 cf       	rjmp	.-346    	; 0x1cc70 <lcd_sdcard_menu()+0x130>
				if (card.ToshibaFlashAir_isEnabled())
					MENU_ITEM_FUNCTION_P(_T(MSG_REFRESH), lcd_sd_refresh); //show the refresh option if in flashAir mode.
#endif
			}
			else
				MENU_ITEM_FUNCTION_P(PSTR(LCD_STR_FOLDER ".."), lcd_sd_updir); //Show the updir button if in a subdir.
   1cdca:	67 e6       	ldi	r22, 0x67	; 103
   1cdcc:	7f ec       	ldi	r23, 0xCF	; 207
   1cdce:	85 ec       	ldi	r24, 0xC5	; 197
   1cdd0:	93 e8       	ldi	r25, 0x83	; 131
   1cdd2:	67 cf       	rjmp	.-306    	; 0x1cca2 <lcd_sdcard_menu()+0x162>
	menu_item++;
}

static void menu_item_sdfile(const char* str_fn, char* str_fnl)
{
	if (lcd_draw_update)
   1cdd4:	44 23       	and	r20, r20
   1cdd6:	d1 f0       	breq	.+52     	; 0x1ce0c <lcd_sdcard_menu()+0x2cc>
	{
		lcd_implementation_drawmenu_sdfile(menu_row, (str_fnl[0] == '\0') ? str_fn : str_fnl);
   1cdd8:	40 91 ee 13 	lds	r20, 0x13EE	; 0x8013ee <card+0x19>
   1cddc:	69 ed       	ldi	r22, 0xD9	; 217
   1cdde:	a6 2e       	mov	r10, r22
   1cde0:	63 e1       	ldi	r22, 0x13	; 19
   1cde2:	b6 2e       	mov	r11, r22
   1cde4:	44 23       	and	r20, r20
   1cde6:	21 f0       	breq	.+8      	; 0x1cdf0 <lcd_sdcard_menu()+0x2b0>
   1cde8:	5e ee       	ldi	r21, 0xEE	; 238
   1cdea:	a5 2e       	mov	r10, r21
   1cdec:	53 e1       	ldi	r21, 0x13	; 19
   1cdee:	b5 2e       	mov	r11, r21
   1cdf0:	60 91 60 04 	lds	r22, 0x0460	; 0x800460 <menu_row>
bool bSettings;                                   // flag (i.e. 'fake parameter') for 'lcd_hw_setup_menu()' function

static void lcd_implementation_drawmenu_sdfile(uint8_t row, const char* longFilename)
{
    uint8_t len = LCD_WIDTH - 1;
    lcd_putc_at(0, row, (lcd_encoder == menu_item)?'>':' ');
   1cdf4:	4e e3       	ldi	r20, 0x3E	; 62
   1cdf6:	82 17       	cp	r24, r18
   1cdf8:	93 07       	cpc	r25, r19
   1cdfa:	09 f0       	breq	.+2      	; 0x1cdfe <lcd_sdcard_menu()+0x2be>
   1cdfc:	40 e2       	ldi	r20, 0x20	; 32
   1cdfe:	80 e0       	ldi	r24, 0x00	; 0
   1ce00:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
    lcd_print_pad(longFilename, len);
   1ce04:	63 e1       	ldi	r22, 0x13	; 19
   1ce06:	c5 01       	movw	r24, r10
   1ce08:	0e 94 47 73 	call	0xe68e	; 0xe68e <lcd_print_pad(char const*, unsigned char)>
   1ce0c:	80 91 63 04 	lds	r24, 0x0463	; 0x800463 <menu_item>
{
	if (lcd_draw_update)
	{
		lcd_implementation_drawmenu_sdfile(menu_row, (str_fnl[0] == '\0') ? str_fn : str_fnl);
	}
	if (menu_clicked && (lcd_encoder == menu_item))
   1ce10:	90 91 61 04 	lds	r25, 0x0461	; 0x800461 <menu_clicked>
   1ce14:	99 23       	and	r25, r25
   1ce16:	09 f4       	brne	.+2      	; 0x1ce1a <lcd_sdcard_menu()+0x2da>
   1ce18:	2c c1       	rjmp	.+600    	; 0x1d072 <lcd_sdcard_menu()+0x532>
   1ce1a:	20 91 1e 06 	lds	r18, 0x061E	; 0x80061e <lcd_encoder>
   1ce1e:	30 91 1f 06 	lds	r19, 0x061F	; 0x80061f <lcd_encoder+0x1>
   1ce22:	82 17       	cp	r24, r18
   1ce24:	13 06       	cpc	r1, r19
   1ce26:	09 f0       	breq	.+2      	; 0x1ce2a <lcd_sdcard_menu()+0x2ea>
   1ce28:	24 c1       	rjmp	.+584    	; 0x1d072 <lcd_sdcard_menu()+0x532>
	{
		lcd_update_enabled = false;
   1ce2a:	10 92 5a 02 	sts	0x025A, r1	; 0x80025a <lcd_update_enabled>
	return result;
}

static void menu_action_sdfile(const char* filename)
{
  if(eFilamentAction != FilamentAction::None) return;
   1ce2e:	80 91 94 03 	lds	r24, 0x0394	; 0x800394 <eFilamentAction>
   1ce32:	81 11       	cpse	r24, r1
   1ce34:	a3 cf       	rjmp	.-186    	; 0x1cd7c <lcd_sdcard_menu()+0x23c>

    // Create a copy of card.filename on the stack since card.filename pointer
    // will be modified by the SD card library when searching for the file
    char selected_filename[FILENAME_LENGTH];
    strcpy(selected_filename, filename);
   1ce36:	69 ed       	ldi	r22, 0xD9	; 217
   1ce38:	73 e1       	ldi	r23, 0x13	; 19
   1ce3a:	c7 01       	movw	r24, r14
   1ce3c:	0f 94 4b aa 	call	0x35496	; 0x35496 <strcpy>
   1ce40:	47 01       	movw	r8, r14
   1ce42:	45 e9       	ldi	r20, 0x95	; 149
   1ce44:	a4 2e       	mov	r10, r20
   1ce46:	4f e0       	ldi	r20, 0x0F	; 15
   1ce48:	b4 2e       	mov	r11, r20

  bool result = true;

  //we are storing just first 8 characters of 8.3 filename assuming that extension is always ".gco"
  for (uint_least8_t i = 0; i < 8; i++) {
	  if (selected_filename[i] == '\0' || selected_filename[i] == '.') {
   1ce4a:	f4 01       	movw	r30, r8
   1ce4c:	61 91       	ld	r22, Z+
   1ce4e:	4f 01       	movw	r8, r30
   1ce50:	66 23       	and	r22, r22
   1ce52:	19 f0       	breq	.+6      	; 0x1ce5a <lcd_sdcard_menu()+0x31a>
   1ce54:	6e 32       	cpi	r22, 0x2E	; 46
   1ce56:	09 f0       	breq	.+2      	; 0x1ce5a <lcd_sdcard_menu()+0x31a>
   1ce58:	4b c0       	rjmp	.+150    	; 0x1cef0 <lcd_sdcard_menu()+0x3b0>
   1ce5a:	60 e0       	ldi	r22, 0x00	; 0
   1ce5c:	c5 01       	movw	r24, r10
   1ce5e:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
		  eeprom_update_byte_notify((uint8_t*)EEPROM_FILENAME + i, selected_filename[i]);
	  }
  }

    // Write the DOS 8.3 file extension into EEPROM
    char * extension_ptr = strchr(selected_filename, '.');
   1ce62:	6e e2       	ldi	r22, 0x2E	; 46
   1ce64:	70 e0       	ldi	r23, 0x00	; 0
   1ce66:	c7 01       	movw	r24, r14
   1ce68:	0f 94 37 aa 	call	0x3546e	; 0x3546e <strchr>
   1ce6c:	3c 01       	movw	r6, r24

    if (extension_ptr) {
   1ce6e:	89 2b       	or	r24, r25
   1ce70:	19 f0       	breq	.+6      	; 0x1ce78 <lcd_sdcard_menu()+0x338>
        extension_ptr++; // skip the '.'
   1ce72:	8f ef       	ldi	r24, 0xFF	; 255
   1ce74:	68 1a       	sub	r6, r24
   1ce76:	78 0a       	sbc	r7, r24
   1ce78:	43 01       	movw	r8, r6
  if(eFilamentAction != FilamentAction::None) return;

    // Create a copy of card.filename on the stack since card.filename pointer
    // will be modified by the SD card library when searching for the file
    char selected_filename[FILENAME_LENGTH];
    strcpy(selected_filename, filename);
   1ce7a:	31 e9       	ldi	r19, 0x91	; 145
   1ce7c:	a3 2e       	mov	r10, r19
   1ce7e:	3c e0       	ldi	r19, 0x0C	; 12
   1ce80:	b3 2e       	mov	r11, r19
        extension_ptr++; // skip the '.'
    }

    for (uint_least8_t i = 0; i < 3; i++)
    {
        if (extension_ptr == NULL || extension_ptr[i] == '\0') {
   1ce82:	61 14       	cp	r6, r1
   1ce84:	71 04       	cpc	r7, r1
   1ce86:	21 f0       	breq	.+8      	; 0x1ce90 <lcd_sdcard_menu()+0x350>
   1ce88:	f4 01       	movw	r30, r8
   1ce8a:	60 81       	ld	r22, Z
   1ce8c:	61 11       	cpse	r22, r1
   1ce8e:	01 c0       	rjmp	.+2      	; 0x1ce92 <lcd_sdcard_menu()+0x352>
   1ce90:	60 e0       	ldi	r22, 0x00	; 0
   1ce92:	c5 01       	movw	r24, r10
   1ce94:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
   1ce98:	ff ef       	ldi	r31, 0xFF	; 255
   1ce9a:	af 1a       	sub	r10, r31
   1ce9c:	bf 0a       	sbc	r11, r31
   1ce9e:	2f ef       	ldi	r18, 0xFF	; 255
   1cea0:	82 1a       	sub	r8, r18
   1cea2:	92 0a       	sbc	r9, r18

    if (extension_ptr) {
        extension_ptr++; // skip the '.'
    }

    for (uint_least8_t i = 0; i < 3; i++)
   1cea4:	84 e9       	ldi	r24, 0x94	; 148
   1cea6:	a8 16       	cp	r10, r24
   1cea8:	8c e0       	ldi	r24, 0x0C	; 12
   1ceaa:	b8 06       	cpc	r11, r24
   1ceac:	51 f7       	brne	.-44     	; 0x1ce82 <lcd_sdcard_menu()+0x342>
{
		workDirParents[level].getFilename(name);
}

uint8_t CardReader::getWorkDirDepth() {
	return workDirDepth;
   1ceae:	60 90 77 15 	lds	r6, 0x1577	; 0x801577 <card+0x1a2>
   1ceb2:	66 2d       	mov	r22, r6
   1ceb4:	8a e5       	ldi	r24, 0x5A	; 90
   1ceb6:	9f e0       	ldi	r25, 0x0F	; 15
   1ceb8:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
   1cebc:	85 ed       	ldi	r24, 0xD5	; 213
   1cebe:	93 e1       	ldi	r25, 0x13	; 19
   1cec0:	2a e0       	ldi	r18, 0x0A	; 10
   1cec2:	a2 2e       	mov	r10, r18
   1cec4:	2f e0       	ldi	r18, 0x0F	; 15
   1cec6:	b2 2e       	mov	r11, r18
    }

    const uint8_t depth = card.getWorkDirDepth();
    eeprom_update_byte_notify((uint8_t*)EEPROM_DIR_DEPTH, depth);

    for (uint_least8_t i = 0; i < depth; i++) {
   1cec8:	71 2c       	mov	r7, r1
   1ceca:	4c 01       	movw	r8, r24
   1cecc:	e9 e0       	ldi	r30, 0x09	; 9
   1cece:	8e 0e       	add	r8, r30
   1ced0:	91 1c       	adc	r9, r1
   1ced2:	76 14       	cp	r7, r6
   1ced4:	d1 f0       	breq	.+52     	; 0x1cf0a <lcd_sdcard_menu()+0x3ca>
#endif //DEBUG_EEPROM_CHANGES
}

#ifndef DEBUG_EEPROM_CHANGES
void eeprom_update_block_notify(const void *__src, void *__dst, size_t __n){
    eeprom_update_block(__src, __dst, __n);
   1ced6:	48 e0       	ldi	r20, 0x08	; 8
   1ced8:	50 e0       	ldi	r21, 0x00	; 0
   1ceda:	b5 01       	movw	r22, r10
   1cedc:	8e 5a       	subi	r24, 0xAE	; 174
   1cede:	9f 4f       	sbci	r25, 0xFF	; 255
   1cee0:	0f 94 f4 a3 	call	0x347e8	; 0x347e8 <eeprom_update_block>
   1cee4:	73 94       	inc	r7
   1cee6:	f8 e0       	ldi	r31, 0x08	; 8
   1cee8:	af 0e       	add	r10, r31
   1ceea:	b1 1c       	adc	r11, r1
   1ceec:	c4 01       	movw	r24, r8
   1ceee:	ed cf       	rjmp	.-38     	; 0x1ceca <lcd_sdcard_menu()+0x38a>
        if (previous_value != value) {
            eeprom_byte_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_byte(dst, value);
   1cef0:	c5 01       	movw	r24, r10
   1cef2:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
   1cef6:	ff ef       	ldi	r31, 0xFF	; 255
   1cef8:	af 1a       	sub	r10, r31
   1cefa:	bf 0a       	sbc	r11, r31
    strcpy(selected_filename, filename);

  bool result = true;

  //we are storing just first 8 characters of 8.3 filename assuming that extension is always ".gco"
  for (uint_least8_t i = 0; i < 8; i++) {
   1cefc:	2d e9       	ldi	r18, 0x9D	; 157
   1cefe:	a2 16       	cp	r10, r18
   1cf00:	2f e0       	ldi	r18, 0x0F	; 15
   1cf02:	b2 06       	cpc	r11, r18
   1cf04:	09 f0       	breq	.+2      	; 0x1cf08 <lcd_sdcard_menu()+0x3c8>
   1cf06:	a1 cf       	rjmp	.-190    	; 0x1ce4a <lcd_sdcard_menu()+0x30a>
   1cf08:	ac cf       	rjmp	.-168    	; 0x1ce62 <lcd_sdcard_menu()+0x322>
/** End of menus **/

/** Menu action functions **/

static bool check_file(const char* filename) {
	if (farm_mode) return true;
   1cf0a:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   1cf0e:	88 23       	and	r24, r24
   1cf10:	91 f0       	breq	.+36     	; 0x1cf36 <lcd_sdcard_menu()+0x3f6>
  if (!check_file(selected_filename)) {
      result = !lcd_show_multiscreen_message_cont_cancel_and_wait_P(_T(MSG_FILE_INCOMPLETE), false);
      lcd_update_enable(true);
  }
  if (result) {
	  enquecommandf_P(MSG_M23, selected_filename);
   1cf12:	ff 92       	push	r15
   1cf14:	ef 92       	push	r14
   1cf16:	3f 92       	push	r3
   1cf18:	2f 92       	push	r2
   1cf1a:	0e 94 b7 8f 	call	0x11f6e	; 0x11f6e <enquecommandf_P(char const*, ...)>
	  enquecommand_P(MSG_M24);
   1cf1e:	61 e0       	ldi	r22, 0x01	; 1
   1cf20:	83 e6       	ldi	r24, 0x63	; 99
   1cf22:	9c e6       	ldi	r25, 0x6C	; 108
   1cf24:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
   1cf28:	0f 90       	pop	r0
   1cf2a:	0f 90       	pop	r0
   1cf2c:	0f 90       	pop	r0
   1cf2e:	0f 90       	pop	r0
  }

  lcd_return_to_status();
   1cf30:	0f 94 d5 07 	call	0x20faa	; 0x20faa <lcd_return_to_status()>
   1cf34:	23 cf       	rjmp	.-442    	; 0x1cd7c <lcd_sdcard_menu()+0x23c>

/** Menu action functions **/

static bool check_file(const char* filename) {
	if (farm_mode) return true;
	card.openFileReadFilteredGcode(filename, true);
   1cf36:	61 e0       	ldi	r22, 0x01	; 1
   1cf38:	c7 01       	movw	r24, r14
   1cf3a:	0f 94 f3 71 	call	0x2e3e6	; 0x2e3e6 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]>

}

uint32_t CardReader::getFileSize()
{
	return filesize;
   1cf3e:	40 90 e4 16 	lds	r4, 0x16E4	; 0x8016e4 <card+0x30f>
   1cf42:	50 90 e5 16 	lds	r5, 0x16E5	; 0x8016e5 <card+0x310>
   1cf46:	60 90 e6 16 	lds	r6, 0x16E6	; 0x8016e6 <card+0x311>
   1cf4a:	70 90 e7 16 	lds	r7, 0x16E7	; 0x8016e7 <card+0x312>
	bool result = false;
	const uint32_t filesize = card.getFileSize();
	uint32_t startPos = 0;
	const uint16_t bytesToCheck = min(END_FILE_SECTION, filesize);
   1cf4e:	94 2d       	mov	r25, r4
   1cf50:	85 2d       	mov	r24, r5
   1cf52:	21 e0       	ldi	r18, 0x01	; 1
   1cf54:	42 16       	cp	r4, r18
   1cf56:	28 e7       	ldi	r18, 0x78	; 120
   1cf58:	52 06       	cpc	r5, r18
   1cf5a:	61 04       	cpc	r6, r1
   1cf5c:	71 04       	cpc	r7, r1
   1cf5e:	10 f0       	brcs	.+4      	; 0x1cf64 <lcd_sdcard_menu()+0x424>
   1cf60:	90 e0       	ldi	r25, 0x00	; 0
   1cf62:	88 e7       	ldi	r24, 0x78	; 120
   1cf64:	a9 2e       	mov	r10, r25
   1cf66:	b8 2e       	mov	r11, r24
	if (filesize > END_FILE_SECTION) {
   1cf68:	81 e0       	ldi	r24, 0x01	; 1
   1cf6a:	48 16       	cp	r4, r24
   1cf6c:	88 e7       	ldi	r24, 0x78	; 120
   1cf6e:	58 06       	cpc	r5, r24
   1cf70:	61 04       	cpc	r6, r1
   1cf72:	71 04       	cpc	r7, r1
   1cf74:	08 f4       	brcc	.+2      	; 0x1cf78 <lcd_sdcard_menu()+0x438>
   1cf76:	5d c0       	rjmp	.+186    	; 0x1d032 <lcd_sdcard_menu()+0x4f2>
		startPos = filesize - END_FILE_SECTION;
   1cf78:	98 e7       	ldi	r25, 0x78	; 120
   1cf7a:	59 1a       	sub	r5, r25
   1cf7c:	61 08       	sbc	r6, r1
   1cf7e:	71 08       	sbc	r7, r1
  {
      int16_t c = (int16_t)file.readFilteredGcode();
      sdpos = file.curPosition();
      return c;
  };
  void setIndex(long index) {sdpos = index;file.seekSetFilteredGcode(index);};
   1cf80:	40 92 eb 16 	sts	0x16EB, r4	; 0x8016eb <card+0x316>
   1cf84:	50 92 ec 16 	sts	0x16EC, r5	; 0x8016ec <card+0x317>
   1cf88:	60 92 ed 16 	sts	0x16ED, r6	; 0x8016ed <card+0x318>
   1cf8c:	70 92 ee 16 	sts	0x16EE, r7	; 0x8016ee <card+0x319>
   1cf90:	c3 01       	movw	r24, r6
   1cf92:	b2 01       	movw	r22, r4
   1cf94:	0f 94 17 68 	call	0x2d02e	; 0x2d02e <SdFile::seekSetFilteredGcode(unsigned long) [clone .constprop.289]>
		card.setIndex(startPos);
	}
	cmdqueue_reset();
   1cf98:	0e 94 3c 85 	call	0x10a78	; 0x10a78 <cmdqueue_reset()>
	cmdqueue_serial_disabled = true;
   1cf9c:	00 93 93 03 	sts	0x0393, r16	; 0x800393 <cmdqueue_serial_disabled>

	menu_progressbar_init(bytesToCheck, _T(MSG_CHECKING_FILE));
   1cfa0:	81 eb       	ldi	r24, 0xB1	; 177
   1cfa2:	98 e4       	ldi	r25, 0x48	; 72
   1cfa4:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1cfa8:	bc 01       	movw	r22, r24
   1cfaa:	c5 01       	movw	r24, r10
   1cfac:	0e 94 11 72 	call	0xe422	; 0xe422 <menu_progressbar_init(unsigned int, char const*)>
     void getfilename_sorted(const uint16_t nr, uint8_t sdSort);
     void getfilename_afterMaxSorting(uint16_t entry, const char * const match = NULL);
  #endif

  FORCE_INLINE bool isFileOpen() { return file.isOpen(); }
  bool eof() { return sdpos>=filesize; }
   1cfb0:	80 91 eb 16 	lds	r24, 0x16EB	; 0x8016eb <card+0x316>
   1cfb4:	90 91 ec 16 	lds	r25, 0x16EC	; 0x8016ec <card+0x317>
   1cfb8:	a0 91 ed 16 	lds	r26, 0x16ED	; 0x8016ed <card+0x318>
   1cfbc:	b0 91 ee 16 	lds	r27, 0x16EE	; 0x8016ee <card+0x319>
	while (!card.eof() && !result) {
   1cfc0:	40 91 e4 16 	lds	r20, 0x16E4	; 0x8016e4 <card+0x30f>
   1cfc4:	50 91 e5 16 	lds	r21, 0x16E5	; 0x8016e5 <card+0x310>
   1cfc8:	60 91 e6 16 	lds	r22, 0x16E6	; 0x8016e6 <card+0x311>
   1cfcc:	70 91 e7 16 	lds	r23, 0x16E7	; 0x8016e7 <card+0x312>
   1cfd0:	84 17       	cp	r24, r20
   1cfd2:	95 07       	cpc	r25, r21
   1cfd4:	a6 07       	cpc	r26, r22
   1cfd6:	b7 07       	cpc	r27, r23
   1cfd8:	80 f5       	brcc	.+96     	; 0x1d03a <lcd_sdcard_menu()+0x4fa>
   1cfda:	11 11       	cpse	r17, r1
   1cfdc:	2e c0       	rjmp	.+92     	; 0x1d03a <lcd_sdcard_menu()+0x4fa>
      return c;
  };
  void setIndex(long index) {sdpos = index;file.seekSetFilteredGcode(index);};
  FORCE_INLINE uint8_t percentDone(){if(!isFileOpen()) return 0; if(filesize) return sdpos/((filesize+99)/100); else return 0;};
  FORCE_INLINE char* getWorkDirName(){workDir.getFilename(filename);return filename;};
  FORCE_INLINE uint32_t get_sdpos() { if (!isFileOpen()) return 0; else return(sdpos); };
   1cfde:	20 91 6a 16 	lds	r18, 0x166A	; 0x80166a <card+0x295>
   1cfe2:	21 11       	cpse	r18, r1
   1cfe4:	03 c0       	rjmp	.+6      	; 0x1cfec <lcd_sdcard_menu()+0x4ac>
   1cfe6:	80 e0       	ldi	r24, 0x00	; 0
   1cfe8:	90 e0       	ldi	r25, 0x00	; 0
   1cfea:	dc 01       	movw	r26, r24
		menu_progressbar_update(card.get_sdpos() - startPos);
   1cfec:	84 19       	sub	r24, r4
   1cfee:	95 09       	sbc	r25, r5
   1cff0:	0e 94 47 71 	call	0xe28e	; 0xe28e <menu_progressbar_update(unsigned int)>
		card.sdprinting = true;
   1cff4:	00 93 d7 13 	sts	0x13D7, r16	; 0x8013d7 <card+0x2>
		get_command();
   1cff8:	0e 94 a5 87 	call	0x10f4a	; 0x10f4a <get_command()>
#endif // LIN_ADVANCE

bool check_commands() {
	bool end_command_found = false;

		while (buflen)
   1cffc:	80 91 3c 12 	lds	r24, 0x123C	; 0x80123c <buflen>
   1d000:	90 91 3d 12 	lds	r25, 0x123D	; 0x80123d <buflen+0x1>
   1d004:	89 2b       	or	r24, r25
   1d006:	a1 f2       	breq	.-88     	; 0x1cfb0 <lcd_sdcard_menu()+0x470>
		{
		if ((code_seen_P(MSG_M84)) || (code_seen_P(PSTR("M 84")))) end_command_found = true;
   1d008:	8e e8       	ldi	r24, 0x8E	; 142
   1d00a:	98 e6       	ldi	r25, 0x68	; 104
   1d00c:	0f 94 62 3c 	call	0x278c4	; 0x278c4 <code_seen_P(char const*) [clone .lto_priv.409]>
   1d010:	81 11       	cpse	r24, r1
   1d012:	05 c0       	rjmp	.+10     	; 0x1d01e <lcd_sdcard_menu()+0x4de>
   1d014:	80 ec       	ldi	r24, 0xC0	; 192
   1d016:	93 e8       	ldi	r25, 0x83	; 131
   1d018:	0f 94 62 3c 	call	0x278c4	; 0x278c4 <code_seen_P(char const*) [clone .lto_priv.409]>
   1d01c:	81 11       	cpse	r24, r1
   1d01e:	11 e0       	ldi	r17, 0x01	; 1
		if (!cmdbuffer_front_already_processed)
   1d020:	80 91 53 12 	lds	r24, 0x1253	; 0x801253 <cmdbuffer_front_already_processed>
   1d024:	81 11       	cpse	r24, r1
   1d026:	02 c0       	rjmp	.+4      	; 0x1d02c <lcd_sdcard_menu()+0x4ec>
			 cmdqueue_pop_front();
   1d028:	0e 94 43 79 	call	0xf286	; 0xf286 <cmdqueue_pop_front()>
		cmdbuffer_front_already_processed = false;
   1d02c:	10 92 53 12 	sts	0x1253, r1	; 0x801253 <cmdbuffer_front_already_processed>
   1d030:	e5 cf       	rjmp	.-54     	; 0x1cffc <lcd_sdcard_menu()+0x4bc>
static bool check_file(const char* filename) {
	if (farm_mode) return true;
	card.openFileReadFilteredGcode(filename, true);
	bool result = false;
	const uint32_t filesize = card.getFileSize();
	uint32_t startPos = 0;
   1d032:	41 2c       	mov	r4, r1
   1d034:	51 2c       	mov	r5, r1
   1d036:	32 01       	movw	r6, r4
   1d038:	af cf       	rjmp	.-162    	; 0x1cf98 <lcd_sdcard_menu()+0x458>
		// with the CMDBUFFER_DEBUG enabled
		manage_heater();
#endif // CMDBUFFER_DEBUG
	}

	menu_progressbar_finish();
   1d03a:	0e 94 68 71 	call	0xe2d0	; 0xe2d0 <menu_progressbar_finish()>

	cmdqueue_serial_disabled = false;
   1d03e:	10 92 93 03 	sts	0x0393, r1	; 0x800393 <cmdqueue_serial_disabled>
	card.printingHasFinished();
   1d042:	0f 94 2b 73 	call	0x2e656	; 0x2e656 <CardReader::printingHasFinished() [clone .constprop.196]>

	lcd_setstatuspgm(MSG_WELCOME);
   1d046:	86 ee       	ldi	r24, 0xE6	; 230
   1d048:	9b e6       	ldi	r25, 0x6B	; 107
   1d04a:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>

    for (uint_least8_t i = 0; i < depth; i++) {
        eeprom_update_block_notify(card.dir_names[i], (uint8_t*)EEPROM_DIRS + 8 * i, 8);
    }

  if (!check_file(selected_filename)) {
   1d04e:	11 11       	cpse	r17, r1
   1d050:	60 cf       	rjmp	.-320    	; 0x1cf12 <lcd_sdcard_menu()+0x3d2>
      result = !lcd_show_multiscreen_message_cont_cancel_and_wait_P(_T(MSG_FILE_INCOMPLETE), false);
   1d052:	81 ec       	ldi	r24, 0xC1	; 193
   1d054:	98 e4       	ldi	r25, 0x48	; 72
   1d056:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d05a:	41 e0       	ldi	r20, 0x01	; 1
   1d05c:	60 e0       	ldi	r22, 0x00	; 0
   1d05e:	0e 94 77 e5 	call	0x1caee	; 0x1caee <lcd_show_multiscreen_message_cont_cancel_and_wait_P(char const*, bool, unsigned char)>
   1d062:	18 2f       	mov	r17, r24
      lcd_update_enable(true);
   1d064:	81 e0       	ldi	r24, 0x01	; 1
   1d066:	0e 94 38 70 	call	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>
  }
  if (result) {
   1d06a:	11 23       	and	r17, r17
   1d06c:	09 f4       	brne	.+2      	; 0x1d070 <lcd_sdcard_menu()+0x530>
   1d06e:	51 cf       	rjmp	.-350    	; 0x1cf12 <lcd_sdcard_menu()+0x3d2>
   1d070:	5f cf       	rjmp	.-322    	; 0x1cf30 <lcd_sdcard_menu()+0x3f0>
    lcd_putc_at(LCD_WIDTH - 1, menu_row, type_char);
}

void menu_item_dummy(void)
{
	menu_item++;
   1d072:	8f 5f       	subi	r24, 0xFF	; 255
   1d074:	80 93 63 04 	sts	0x0463, r24	; 0x800463 <menu_item>
   1d078:	1b ce       	rjmp	.-970    	; 0x1ccb0 <lcd_sdcard_menu()+0x170>
					else
						MENU_ITEM_SDFILE(card.filename, card.longFilename);
				}
				else MENU_ITEM_DUMMY(); //dummy item that just increments the internal menu counters.
			}
			MENU_END();
   1d07a:	0e 94 83 62 	call	0xc506	; 0xc506 <menu_end()>
			_md->row = -1; // assume that no SD file/dir is currently selected. Once they are rendered, it will be changed to the correct row for the _scrolling state.

			//if we reached this point it means that the encoder moved or clicked or the state is being switched. Reset the scrollTimer.
			_md->lcd_scrollTimer.start();

			MENU_BEGIN();
   1d07e:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   1d082:	8f 5f       	subi	r24, 0xFF	; 255
   1d084:	80 93 60 04 	sts	0x0460, r24	; 0x800460 <menu_row>
   1d088:	80 91 62 04 	lds	r24, 0x0462	; 0x800462 <menu_line>
   1d08c:	8f 5f       	subi	r24, 0xFF	; 255
   1d08e:	80 93 62 04 	sts	0x0462, r24	; 0x800462 <menu_line>
   1d092:	e0 cd       	rjmp	.-1088   	; 0x1cc54 <lcd_sdcard_menu()+0x114>
			MENU_END();
		} break;
		case _scrolling: //scrolling filename
		{
            // LCD_CLICKED is used so that the click event is later consumed by the _standard state.
			const bool rewindFlag = LCD_CLICKED || lcd_draw_update; //flag that says whether the menu should return to _standard state.
   1d094:	80 91 95 03 	lds	r24, 0x0395	; 0x800395 <lcd_click_trigger>
   1d098:	11 e0       	ldi	r17, 0x01	; 1
   1d09a:	81 11       	cpse	r24, r1
   1d09c:	05 c0       	rjmp	.+10     	; 0x1d0a8 <lcd_sdcard_menu()+0x568>
   1d09e:	80 91 59 02 	lds	r24, 0x0259	; 0x800259 <lcd_draw_update>
   1d0a2:	81 11       	cpse	r24, r1
   1d0a4:	01 c0       	rjmp	.+2      	; 0x1d0a8 <lcd_sdcard_menu()+0x568>
   1d0a6:	10 e0       	ldi	r17, 0x00	; 0

			if (_md->scrollPointer == NULL)
   1d0a8:	80 91 99 03 	lds	r24, 0x0399	; 0x800399 <menu_data+0x3>
   1d0ac:	90 91 9a 03 	lds	r25, 0x039A	; 0x80039a <menu_data+0x4>
   1d0b0:	89 2b       	or	r24, r25
   1d0b2:	91 f4       	brne	.+36     	; 0x1d0d8 <lcd_sdcard_menu()+0x598>
			{
				//load filename to memory.
#ifdef SDCARD_SORT_ALPHA
				card.getfilename_sorted(_md->selectedFileID, _md->sdSort);
   1d0b4:	60 91 a0 03 	lds	r22, 0x03A0	; 0x8003a0 <menu_data+0xa>
   1d0b8:	80 91 9b 03 	lds	r24, 0x039B	; 0x80039b <menu_data+0x5>
   1d0bc:	90 91 9c 03 	lds	r25, 0x039C	; 0x80039c <menu_data+0x6>
   1d0c0:	0f 94 a9 77 	call	0x2ef52	; 0x2ef52 <CardReader::getfilename_sorted(unsigned int, unsigned char) [clone .constprop.156]>
#else
				card.getfilename(_md->selectedFileID);
#endif
				_md->scrollPointer = (card.longFilename[0] == '\0') ? card.filename : card.longFilename;
   1d0c4:	80 91 ee 13 	lds	r24, 0x13EE	; 0x8013ee <card+0x19>
   1d0c8:	81 11       	cpse	r24, r1
   1d0ca:	46 c0       	rjmp	.+140    	; 0x1d158 <lcd_sdcard_menu()+0x618>
   1d0cc:	89 ed       	ldi	r24, 0xD9	; 217
   1d0ce:	93 e1       	ldi	r25, 0x13	; 19
   1d0d0:	90 93 9a 03 	sts	0x039A, r25	; 0x80039a <menu_data+0x4>
   1d0d4:	80 93 99 03 	sts	0x0399, r24	; 0x800399 <menu_data+0x3>
			}

			if (rewindFlag)
   1d0d8:	11 11       	cpse	r17, r1
				_md->offset = 0; //redraw once again from the beginning.
   1d0da:	10 92 97 03 	sts	0x0397, r1	; 0x800397 <menu_data+0x1>
			if (_md->lcd_scrollTimer.expired(300) || rewindFlag)
   1d0de:	6c e2       	ldi	r22, 0x2C	; 44
   1d0e0:	71 e0       	ldi	r23, 0x01	; 1
   1d0e2:	81 ea       	ldi	r24, 0xA1	; 161
   1d0e4:	93 e0       	ldi	r25, 0x03	; 3
   1d0e6:	0f 94 1f 0e 	call	0x21c3e	; 0x21c3e <Timer<unsigned short>::expired(unsigned short)>
   1d0ea:	81 11       	cpse	r24, r1
   1d0ec:	03 c0       	rjmp	.+6      	; 0x1d0f4 <lcd_sdcard_menu()+0x5b4>
   1d0ee:	11 23       	and	r17, r17
   1d0f0:	09 f4       	brne	.+2      	; 0x1d0f4 <lcd_sdcard_menu()+0x5b4>
   1d0f2:	4f ce       	rjmp	.-866    	; 0x1cd92 <lcd_sdcard_menu()+0x252>
			{
				uint8_t len = LCD_WIDTH - ((_md->isDir)? 2 : 1);
   1d0f4:	80 91 98 03 	lds	r24, 0x0398	; 0x800398 <menu_data+0x2>
   1d0f8:	02 e1       	ldi	r16, 0x12	; 18
   1d0fa:	81 11       	cpse	r24, r1
   1d0fc:	01 c0       	rjmp	.+2      	; 0x1d100 <lcd_sdcard_menu()+0x5c0>
   1d0fe:	03 e1       	ldi	r16, 0x13	; 19
				lcd_putc_at(0, _md->row, '>');
   1d100:	4e e3       	ldi	r20, 0x3E	; 62
   1d102:	60 91 9f 03 	lds	r22, 0x039F	; 0x80039f <menu_data+0x9>
   1d106:	80 e0       	ldi	r24, 0x00	; 0
   1d108:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
				if (_md->isDir)
   1d10c:	80 91 98 03 	lds	r24, 0x0398	; 0x800398 <menu_data+0x2>
   1d110:	88 23       	and	r24, r24
   1d112:	19 f0       	breq	.+6      	; 0x1d11a <lcd_sdcard_menu()+0x5da>
   1d114:	85 e8       	ldi	r24, 0x85	; 133
   1d116:	0e 94 a2 70 	call	0xe144	; 0xe144 <lcd_write(unsigned char) [clone .lto_priv.402]>
					lcd_print(LCD_STR_FOLDER[0]);

				if( lcd_print_pad(&_md->scrollPointer[_md->offset], len) == 0)
   1d11a:	20 91 97 03 	lds	r18, 0x0397	; 0x800397 <menu_data+0x1>
   1d11e:	80 91 99 03 	lds	r24, 0x0399	; 0x800399 <menu_data+0x3>
   1d122:	90 91 9a 03 	lds	r25, 0x039A	; 0x80039a <menu_data+0x4>
   1d126:	60 2f       	mov	r22, r16
   1d128:	82 0f       	add	r24, r18
   1d12a:	91 1d       	adc	r25, r1
   1d12c:	0e 94 47 73 	call	0xe68e	; 0xe68e <lcd_print_pad(char const*, unsigned char)>
   1d130:	81 11       	cpse	r24, r1
   1d132:	15 c0       	rjmp	.+42     	; 0x1d15e <lcd_sdcard_menu()+0x61e>
				{
					_md->lcd_scrollTimer.start();
   1d134:	81 ea       	ldi	r24, 0xA1	; 161
   1d136:	93 e0       	ldi	r25, 0x03	; 3
   1d138:	0f 94 4e 0e 	call	0x21c9c	; 0x21c9c <Timer<unsigned short>::start()>
					_md->offset++;
   1d13c:	80 91 97 03 	lds	r24, 0x0397	; 0x800397 <menu_data+0x1>
   1d140:	8f 5f       	subi	r24, 0xFF	; 255
   1d142:	80 93 97 03 	sts	0x0397, r24	; 0x800397 <menu_data+0x1>
				} else {
					// stop at the end of the string
					_md->lcd_scrollTimer.stop();
				}
			}
			if (rewindFlag) //go back to sd_menu.
   1d146:	11 23       	and	r17, r17
   1d148:	09 f4       	brne	.+2      	; 0x1d14c <lcd_sdcard_menu()+0x60c>
   1d14a:	23 ce       	rjmp	.-954    	; 0x1cd92 <lcd_sdcard_menu()+0x252>
   1d14c:	10 92 a1 03 	sts	0x03A1, r1	; 0x8003a1 <menu_data+0xb>
			{
				_md->lcd_scrollTimer.stop(); //forces redraw in _standard state
				_md->menuState = _standard;
   1d150:	81 e0       	ldi	r24, 0x01	; 1
   1d152:	80 93 96 03 	sts	0x0396, r24	; 0x800396 <menu_data>
   1d156:	1d ce       	rjmp	.-966    	; 0x1cd92 <lcd_sdcard_menu()+0x252>
#ifdef SDCARD_SORT_ALPHA
				card.getfilename_sorted(_md->selectedFileID, _md->sdSort);
#else
				card.getfilename(_md->selectedFileID);
#endif
				_md->scrollPointer = (card.longFilename[0] == '\0') ? card.filename : card.longFilename;
   1d158:	8e ee       	ldi	r24, 0xEE	; 238
   1d15a:	93 e1       	ldi	r25, 0x13	; 19
   1d15c:	b9 cf       	rjmp	.-142    	; 0x1d0d0 <lcd_sdcard_menu()+0x590>
   1d15e:	10 92 a1 03 	sts	0x03A1, r1	; 0x8003a1 <menu_data+0xb>
   1d162:	f1 cf       	rjmp	.-30     	; 0x1d146 <lcd_sdcard_menu()+0x606>

0001d164 <lcd_show_multiscreen_message_yes_no_and_wait_P(char const*, bool, unsigned char)>:
//! @param default_selection if 0, 'Yes' choice is selected by default, otherwise 'No' choice is preselected
//! @retval 0 yes choice selected by user
//! @retval 1 no choice selected by user
//! @retval 0xFF button timeout (only possible if allow_timeouting is true)
uint8_t lcd_show_multiscreen_message_yes_no_and_wait_P(const char *msg, bool allow_timeouting, uint8_t default_selection) //currently just max. n*4 + 3 lines supported (set in language header files)
{
   1d164:	bf 92       	push	r11
   1d166:	cf 92       	push	r12
   1d168:	df 92       	push	r13
   1d16a:	ef 92       	push	r14
   1d16c:	ff 92       	push	r15
   1d16e:	0f 93       	push	r16
   1d170:	1f 93       	push	r17
   1d172:	cf 93       	push	r28
   1d174:	df 93       	push	r29
   1d176:	ec 01       	movw	r28, r24
   1d178:	d6 2e       	mov	r13, r22
   1d17a:	b4 2e       	mov	r11, r20
    return lcd_show_multiscreen_message_with_choices_and_wait_P(msg, allow_timeouting, default_selection, _T(MSG_YES), _T(MSG_NO), nullptr, 10);
   1d17c:	8f e9       	ldi	r24, 0x9F	; 159
   1d17e:	98 e4       	ldi	r25, 0x48	; 72
   1d180:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d184:	8c 01       	movw	r16, r24
   1d186:	89 e9       	ldi	r24, 0x99	; 153
   1d188:	98 e4       	ldi	r25, 0x48	; 72
   1d18a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d18e:	2a e0       	ldi	r18, 0x0A	; 10
   1d190:	c2 2e       	mov	r12, r18
   1d192:	f1 2c       	mov	r15, r1
   1d194:	e1 2c       	mov	r14, r1
   1d196:	9c 01       	movw	r18, r24
   1d198:	4b 2d       	mov	r20, r11
   1d19a:	6d 2d       	mov	r22, r13
   1d19c:	ce 01       	movw	r24, r28
   1d19e:	0e 94 a4 e4 	call	0x1c948	; 0x1c948 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)>
}
   1d1a2:	df 91       	pop	r29
   1d1a4:	cf 91       	pop	r28
   1d1a6:	1f 91       	pop	r17
   1d1a8:	0f 91       	pop	r16
   1d1aa:	ff 90       	pop	r15
   1d1ac:	ef 90       	pop	r14
   1d1ae:	df 90       	pop	r13
   1d1b0:	cf 90       	pop	r12
   1d1b2:	bf 90       	pop	r11
   1d1b4:	08 95       	ret

0001d1b6 <menu_setlang(unsigned char) [clone .part.48]>:
    crashdet_use_eeprom_setting();
}
#endif //TMC2130

#if (LANG_MODE != 0)
static void menu_setlang(uint8_t lang)
   1d1b6:	cf 93       	push	r28
   1d1b8:	c8 2f       	mov	r28, r24
{
	if (!lang_select(lang))
	{
		if (lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_COPY_SEL_LANG), false, LCD_LEFT_BUTTON_CHOICE) == LCD_LEFT_BUTTON_CHOICE)
   1d1ba:	8e ed       	ldi	r24, 0xDE	; 222
   1d1bc:	9b e4       	ldi	r25, 0x4B	; 75
   1d1be:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d1c2:	40 e0       	ldi	r20, 0x00	; 0
   1d1c4:	60 e0       	ldi	r22, 0x00	; 0
   1d1c6:	0e 94 b2 e8 	call	0x1d164	; 0x1d164 <lcd_show_multiscreen_message_yes_no_and_wait_P(char const*, bool, unsigned char)>
   1d1ca:	81 11       	cpse	r24, r1
   1d1cc:	20 c0       	rjmp	.+64     	; 0x1d20e <menu_setlang(unsigned char) [clone .part.48]+0x58>
#endif //(LANG_MODE == 0)


void lang_boot_update_start(uint8_t lang)
{
	uint8_t cnt = lang_get_count();
   1d1ce:	0e 94 ab 74 	call	0xe956	; 0xe956 <lang_get_count>
	if ((lang < 2) || (lang > cnt)) return; //only languages from xflash can be selected
   1d1d2:	c2 30       	cpi	r28, 0x02	; 2
   1d1d4:	e0 f0       	brcs	.+56     	; 0x1d20e <menu_setlang(unsigned char) [clone .part.48]+0x58>
   1d1d6:	8c 17       	cp	r24, r28
   1d1d8:	d0 f0       	brcs	.+52     	; 0x1d20e <menu_setlang(unsigned char) [clone .part.48]+0x58>
	softReset();
}

void bootapp_reboot_user0(uint8_t reserved)
{
	cli();
   1d1da:	f8 94       	cli
	boot_app_magic = BOOT_APP_MAGIC;
   1d1dc:	8a ea       	ldi	r24, 0xAA	; 170
   1d1de:	95 e5       	ldi	r25, 0x55	; 85
   1d1e0:	dc 01       	movw	r26, r24
   1d1e2:	80 93 fc 1f 	sts	0x1FFC, r24	; 0x801ffc <__bss_end+0x8e5>
   1d1e6:	90 93 fd 1f 	sts	0x1FFD, r25	; 0x801ffd <__bss_end+0x8e6>
   1d1ea:	a0 93 fe 1f 	sts	0x1FFE, r26	; 0x801ffe <__bss_end+0x8e7>
   1d1ee:	b0 93 ff 1f 	sts	0x1FFF, r27	; 0x801fff <__bss_end+0x8e8>
	boot_app_flags = BOOT_APP_FLG_USER0;
   1d1f2:	80 e8       	ldi	r24, 0x80	; 128
   1d1f4:	80 93 fb 1f 	sts	0x1FFB, r24	; 0x801ffb <__bss_end+0x8e4>
	boot_copy_size = 0;
   1d1f8:	10 92 f9 1f 	sts	0x1FF9, r1	; 0x801ff9 <__bss_end+0x8e2>
   1d1fc:	10 92 f8 1f 	sts	0x1FF8, r1	; 0x801ff8 <__bss_end+0x8e1>
	bootapp_reboot_user0(lang << 3);
   1d200:	cc 0f       	add	r28, r28
   1d202:	cc 0f       	add	r28, r28
   1d204:	cc 0f       	add	r28, r28
	boot_reserved = reserved;
   1d206:	c0 93 fa 1f 	sts	0x1FFA, r28	; 0x801ffa <__bss_end+0x8e3>
	// bootapp_print_vars();
	softReset();
   1d20a:	0e 94 1f 66 	call	0xcc3e	; 0xcc3e <softReset>
			lang_boot_update_start(lang);
		lcd_update_enable(true);
   1d20e:	81 e0       	ldi	r24, 0x01	; 1
   1d210:	0e 94 38 70 	call	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>
		menu_goto(lcd_language_menu, 0, true, true);
   1d214:	21 e0       	ldi	r18, 0x01	; 1
   1d216:	41 e0       	ldi	r20, 0x01	; 1
   1d218:	70 e0       	ldi	r23, 0x00	; 0
   1d21a:	60 e0       	ldi	r22, 0x00	; 0
   1d21c:	86 e1       	ldi	r24, 0x16	; 22
   1d21e:	99 ee       	ldi	r25, 0xE9	; 233
   1d220:	0e 94 b7 62 	call	0xc56e	; 0xc56e <menu_goto(void (*)(), int, bool, bool)>
   1d224:	10 92 e3 03 	sts	0x03E3, r1	; 0x8003e3 <lcd_timeoutToStatus>
		lcd_timeoutToStatus.stop(); //infinite timeout
	}
}
   1d228:	cf 91       	pop	r28
   1d22a:	08 95       	ret

0001d22c <lcd_language_menu()>:
}
#endif //XFLASH
#endif //COMMUNITY_LANGUAGE_SUPPORT && W52X20CL

static void lcd_language_menu()
{
   1d22c:	cf 93       	push	r28
   1d22e:	df 93       	push	r29
	MENU_BEGIN();
   1d230:	0e 94 0c 74 	call	0xe818	; 0xe818 <menu_start()>
   1d234:	10 92 60 04 	sts	0x0460, r1	; 0x800460 <menu_row>
   1d238:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   1d23c:	84 30       	cpi	r24, 0x04	; 4
   1d23e:	08 f0       	brcs	.+2      	; 0x1d242 <lcd_language_menu()+0x16>
   1d240:	5c c0       	rjmp	.+184    	; 0x1d2fa <lcd_language_menu()+0xce>
   1d242:	10 92 63 04 	sts	0x0463, r1	; 0x800463 <menu_item>
	if (lang_is_selected()) MENU_ITEM_BACK_P(_T(MSG_SETTINGS)); //
   1d246:	0e 94 2e 74 	call	0xe85c	; 0xe85c <lang_is_selected>
   1d24a:	88 23       	and	r24, r24
   1d24c:	31 f0       	breq	.+12     	; 0x1d25a <lcd_language_menu()+0x2e>
   1d24e:	8e e8       	ldi	r24, 0x8E	; 142
   1d250:	98 e4       	ldi	r25, 0x48	; 72
   1d252:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d256:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
	if (menu_item_text_P(lang_get_name_by_code(lang_get_code(0)))) //primary language
   1d25a:	8e e6       	ldi	r24, 0x6E	; 110
   1d25c:	95 e6       	ldi	r25, 0x65	; 101
   1d25e:	0e 94 44 74 	call	0xe888	; 0xe888 <lang_get_name_by_code>
   1d262:	0e 94 21 73 	call	0xe642	; 0xe642 <menu_item_text_P(char const*)>
   1d266:	88 23       	and	r24, r24
   1d268:	49 f0       	breq	.+18     	; 0x1d27c <lcd_language_menu()+0x50>
#endif //TMC2130

#if (LANG_MODE != 0)
static void menu_setlang(uint8_t lang)
{
	if (!lang_select(lang))
   1d26a:	80 e0       	ldi	r24, 0x00	; 0
   1d26c:	0e 94 ce 74 	call	0xe99c	; 0xe99c <lang_select>
   1d270:	81 11       	cpse	r24, r1
   1d272:	43 c0       	rjmp	.+134    	; 0x1d2fa <lcd_language_menu()+0xce>
		MENU_ITEM_SUBMENU_P(_T(MSG_COMMUNITY_MADE), lcd_community_language_menu);
#endif //XFLASH
#endif //COMMUNITY_LANGUAGE_SUPPORT && W52X20CL

	MENU_END();
}
   1d274:	df 91       	pop	r29
   1d276:	cf 91       	pop	r28
   1d278:	0c 94 db e8 	jmp	0x1d1b6	; 0x1d1b6 <menu_setlang(unsigned char) [clone .part.48]>
	if (menu_item_text_P(lang_get_name_by_code(lang_get_code(0)))) //primary language
	{
		menu_setlang(0);
		return;
	}
	uint8_t cnt = lang_get_count();
   1d27c:	0e 94 ab 74 	call	0xe956	; 0xe956 <lang_get_count>
   1d280:	d8 2f       	mov	r29, r24
		}
	}
	else
		for (uint8_t i = 2; i < 8; i++) //skip seconday language - solved in lang_select (MK3) 'i < 8'  for 7 official languages
#else //XFLASH
		for (uint8_t i = 1; i < cnt; i++) //all seconday languages (MK2/25)
   1d282:	c1 e0       	ldi	r28, 0x01	; 1
   1d284:	cd 17       	cp	r28, r29
   1d286:	60 f5       	brcc	.+88     	; 0x1d2e0 <lcd_language_menu()+0xb4>
		if (header.magic != LANG_MAGIC) break; //break if not valid
		if (--lang == 0) return header.code;
		addr += header.size; //calc address of next table
	}
#else //XFLASH
	uint16_t table = _SEC_LANG_TABLE;
   1d288:	80 e0       	ldi	r24, 0x00	; 0
   1d28a:	91 e0       	ldi	r25, 0x01	; 1
	uint8_t count = 1; //count = 1 (primary)
   1d28c:	21 e0       	ldi	r18, 0x01	; 1
	while (pgm_read_dword((uint32_t*)table) == LANG_MAGIC) //magic valid
   1d28e:	fc 01       	movw	r30, r24
   1d290:	45 91       	lpm	r20, Z+
   1d292:	55 91       	lpm	r21, Z+
   1d294:	65 91       	lpm	r22, Z+
   1d296:	74 91       	lpm	r23, Z
   1d298:	45 3a       	cpi	r20, 0xA5	; 165
   1d29a:	5a 45       	sbci	r21, 0x5A	; 90
   1d29c:	64 4b       	sbci	r22, 0xB4	; 180
   1d29e:	7b 44       	sbci	r23, 0x4B	; 75
   1d2a0:	19 f0       	breq	.+6      	; 0x1d2a8 <lcd_language_menu()+0x7c>
		if (count == lang) return pgm_read_word(((uint16_t*)(table + 10))); //read language code
		table += pgm_read_word((uint16_t*)(table + 4));
		count++;
	}
#endif //XFLASH
	return LANG_CODE_XX;
   1d2a2:	8f e3       	ldi	r24, 0x3F	; 63
   1d2a4:	9f e3       	ldi	r25, 0x3F	; 63
   1d2a6:	06 c0       	rjmp	.+12     	; 0x1d2b4 <lcd_language_menu()+0x88>
#else //XFLASH
	uint16_t table = _SEC_LANG_TABLE;
	uint8_t count = 1; //count = 1 (primary)
	while (pgm_read_dword((uint32_t*)table) == LANG_MAGIC) //magic valid
	{
		if (count == lang) return pgm_read_word(((uint16_t*)(table + 10))); //read language code
   1d2a8:	fc 01       	movw	r30, r24
   1d2aa:	c2 13       	cpse	r28, r18
   1d2ac:	10 c0       	rjmp	.+32     	; 0x1d2ce <lcd_language_menu()+0xa2>
   1d2ae:	3a 96       	adiw	r30, 0x0a	; 10
   1d2b0:	85 91       	lpm	r24, Z+
   1d2b2:	94 91       	lpm	r25, Z
#endif //XFLASH
			if (menu_item_text_P(lang_get_name_by_code(lang_get_code(i))))
   1d2b4:	0e 94 44 74 	call	0xe888	; 0xe888 <lang_get_name_by_code>
   1d2b8:	0e 94 21 73 	call	0xe642	; 0xe642 <menu_item_text_P(char const*)>
   1d2bc:	88 23       	and	r24, r24
   1d2be:	71 f0       	breq	.+28     	; 0x1d2dc <lcd_language_menu()+0xb0>
#endif //TMC2130

#if (LANG_MODE != 0)
static void menu_setlang(uint8_t lang)
{
	if (!lang_select(lang))
   1d2c0:	8c 2f       	mov	r24, r28
   1d2c2:	0e 94 ce 74 	call	0xe99c	; 0xe99c <lang_select>
   1d2c6:	81 11       	cpse	r24, r1
   1d2c8:	18 c0       	rjmp	.+48     	; 0x1d2fa <lcd_language_menu()+0xce>
   1d2ca:	8c 2f       	mov	r24, r28
   1d2cc:	d3 cf       	rjmp	.-90     	; 0x1d274 <lcd_language_menu()+0x48>
		table += pgm_read_word((uint16_t*)(table + 4));
   1d2ce:	34 96       	adiw	r30, 0x04	; 4
   1d2d0:	45 91       	lpm	r20, Z+
   1d2d2:	54 91       	lpm	r21, Z
   1d2d4:	84 0f       	add	r24, r20
   1d2d6:	95 1f       	adc	r25, r21
		count++;
   1d2d8:	2f 5f       	subi	r18, 0xFF	; 255
   1d2da:	d9 cf       	rjmp	.-78     	; 0x1d28e <lcd_language_menu()+0x62>
		}
	}
	else
		for (uint8_t i = 2; i < 8; i++) //skip seconday language - solved in lang_select (MK3) 'i < 8'  for 7 official languages
#else //XFLASH
		for (uint8_t i = 1; i < cnt; i++) //all seconday languages (MK2/25)
   1d2dc:	cf 5f       	subi	r28, 0xFF	; 255
   1d2de:	d2 cf       	rjmp	.-92     	; 0x1d284 <lcd_language_menu()+0x58>
#ifdef XFLASH
		MENU_ITEM_SUBMENU_P(_T(MSG_COMMUNITY_MADE), lcd_community_language_menu);
#endif //XFLASH
#endif //COMMUNITY_LANGUAGE_SUPPORT && W52X20CL

	MENU_END();
   1d2e0:	0e 94 83 62 	call	0xc506	; 0xc506 <menu_end()>
#endif //XFLASH
#endif //COMMUNITY_LANGUAGE_SUPPORT && W52X20CL

static void lcd_language_menu()
{
	MENU_BEGIN();
   1d2e4:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   1d2e8:	8f 5f       	subi	r24, 0xFF	; 255
   1d2ea:	80 93 60 04 	sts	0x0460, r24	; 0x800460 <menu_row>
   1d2ee:	80 91 62 04 	lds	r24, 0x0462	; 0x800462 <menu_line>
   1d2f2:	8f 5f       	subi	r24, 0xFF	; 255
   1d2f4:	80 93 62 04 	sts	0x0462, r24	; 0x800462 <menu_line>
   1d2f8:	9f cf       	rjmp	.-194    	; 0x1d238 <lcd_language_menu()+0xc>
		MENU_ITEM_SUBMENU_P(_T(MSG_COMMUNITY_MADE), lcd_community_language_menu);
#endif //XFLASH
#endif //COMMUNITY_LANGUAGE_SUPPORT && W52X20CL

	MENU_END();
}
   1d2fa:	df 91       	pop	r29
   1d2fc:	cf 91       	pop	r28
   1d2fe:	08 95       	ret

0001d300 <lcd_disable_farm_mode()>:

}

static void lcd_disable_farm_mode()
{
	uint8_t disable = lcd_show_multiscreen_message_yes_no_and_wait_P(PSTR("Disable farm mode?"), true); //allow timeouting, default no
   1d300:	41 e0       	ldi	r20, 0x01	; 1
   1d302:	61 e0       	ldi	r22, 0x01	; 1
   1d304:	86 ea       	ldi	r24, 0xA6	; 166
   1d306:	93 e8       	ldi	r25, 0x83	; 131
   1d308:	0e 94 b2 e8 	call	0x1d164	; 0x1d164 <lcd_show_multiscreen_message_yes_no_and_wait_P(char const*, bool, unsigned char)>
	if (disable == LCD_LEFT_BUTTON_CHOICE)
   1d30c:	81 11       	cpse	r24, r1
   1d30e:	07 c0       	rjmp	.+14     	; 0x1d31e <lcd_disable_farm_mode()+0x1e>
	{
		enquecommand_P(PSTR("G99"));
   1d310:	61 e0       	ldi	r22, 0x01	; 1
   1d312:	82 ea       	ldi	r24, 0xA2	; 162
   1d314:	93 e8       	ldi	r25, 0x83	; 131
   1d316:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
		lcd_return_to_status();
   1d31a:	0f 94 d5 07 	call	0x20faa	; 0x20faa <lcd_return_to_status()>
	}
	lcd_update_enable(true);
   1d31e:	81 e0       	ldi	r24, 0x01	; 1
   1d320:	0e 94 38 70 	call	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>
	lcd_draw_update = 2;
   1d324:	82 e0       	ldi	r24, 0x02	; 2
   1d326:	80 93 59 02 	sts	0x0259, r24	; 0x800259 <lcd_draw_update>

}
   1d32a:	08 95       	ret

0001d32c <lcd_v2_calibration()>:
    lcd_printf_P(_T(MSG_SHEET_OFFSET),
            sheet_name, offset, menuData->reset ? ' ' : '>', menuData->reset ? '>' : ' ');// \n denotes line break, %.7s is replaced by 7 character long sheet name, %+1.3f is replaced by 6 character long floating point number, %c is replaced by > or white space (one character) based on whether first or second option is selected. % denoted place holders can not be reordered.

}

void lcd_v2_calibration() {
   1d32c:	cf 93       	push	r28
   1d32e:	df 93       	push	r29
	if (MMU2::mmu2.Enabled()) {
   1d330:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   1d334:	81 30       	cpi	r24, 0x01	; 1
   1d336:	e9 f4       	brne	.+58     	; 0x1d372 <lcd_v2_calibration()+0x46>
		const uint8_t filament = choose_menu_P(
   1d338:	89 e2       	ldi	r24, 0x29	; 41
   1d33a:	9d e3       	ldi	r25, 0x3D	; 61
   1d33c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d340:	ec 01       	movw	r28, r24
   1d342:	86 e1       	ldi	r24, 0x16	; 22
   1d344:	9d e3       	ldi	r25, 0x3D	; 61
   1d346:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
			_T(MSG_SELECT_FILAMENT),
			MSG_FILAMENT,_T(MSG_CANCEL));
   1d34a:	be 01       	movw	r22, r28
   1d34c:	0e 94 c8 d1 	call	0x1a390	; 0x1a390 <choose_menu_P(char const*, char const*, char const*) [clone .constprop.38]>
		if (filament < MMU_FILAMENT_COUNT) {
   1d350:	85 30       	cpi	r24, 0x05	; 5
   1d352:	98 f5       	brcc	.+102    	; 0x1d3ba <lcd_v2_calibration()+0x8e>
			lay1cal_filament = filament;
   1d354:	80 93 e1 03 	sts	0x03E1, r24	; 0x8003e1 <lay1cal_filament>
			return;
		}
	}
#endif //FILAMENT_SENSOR

	eFilamentAction = FilamentAction::Lay1Cal;
   1d358:	8a e0       	ldi	r24, 0x0A	; 10
   1d35a:	80 93 94 03 	sts	0x0394, r24	; 0x800394 <eFilamentAction>
	menu_goto(lcd_generic_preheat_menu, 0, true);
   1d35e:	20 e0       	ldi	r18, 0x00	; 0
   1d360:	41 e0       	ldi	r20, 0x01	; 1
   1d362:	70 e0       	ldi	r23, 0x00	; 0
   1d364:	60 e0       	ldi	r22, 0x00	; 0
   1d366:	84 e7       	ldi	r24, 0x74	; 116
   1d368:	97 e3       	ldi	r25, 0x37	; 55
}
   1d36a:	df 91       	pop	r29
   1d36c:	cf 91       	pop	r28
		}
	}
#endif //FILAMENT_SENSOR

	eFilamentAction = FilamentAction::Lay1Cal;
	menu_goto(lcd_generic_preheat_menu, 0, true);
   1d36e:	0c 94 b7 62 	jmp	0xc56e	; 0xc56e <menu_goto(void (*)(), int, bool, bool)>
			menu_back();
			return;
		}
	}
#ifdef FILAMENT_SENSOR
	else if (!eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE))
   1d372:	8f e5       	ldi	r24, 0x5F	; 95
   1d374:	9f e0       	ldi	r25, 0x0F	; 15
   1d376:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1d37a:	81 11       	cpse	r24, r1
   1d37c:	ed cf       	rjmp	.-38     	; 0x1d358 <lcd_v2_calibration()+0x2c>
	{
		bool loaded = false;
		if (fsensor.isReady()) {
   1d37e:	80 91 f1 16 	lds	r24, 0x16F1	; 0x8016f1 <fsensor>
   1d382:	82 30       	cpi	r24, 0x02	; 2
   1d384:	f1 f4       	brne	.+60     	; 0x1d3c2 <lcd_v2_calibration()+0x96>
   1d386:	80 91 fe 16 	lds	r24, 0x16FE	; 0x8016fe <fsensor+0xd>
   1d38a:	81 11       	cpse	r24, r1
   1d38c:	e5 cf       	rjmp	.-54     	; 0x1d358 <lcd_v2_calibration()+0x2c>
			loaded = !lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_FILAMENT_LOADED), false, LCD_MIDDLE_BUTTON_CHOICE);
			lcd_update_enabled = true;
		}

		if (!loaded) {
			lcd_display_message_fullscreen_P(_T(MSG_PLEASE_LOAD_PLA));
   1d38e:	88 ef       	ldi	r24, 0xF8	; 248
   1d390:	9c e3       	ldi	r25, 0x3C	; 60
   1d392:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d396:	0e 94 a9 e0 	call	0x1c152	; 0x1c152 <lcd_display_message_fullscreen_P(char const*)>
			lcd_consume_click();
   1d39a:	0e 94 70 73 	call	0xe6e0	; 0xe6e0 <lcd_consume_click()>
   1d39e:	c4 e1       	ldi	r28, 0x14	; 20
			for (uint_least8_t i = 0; i < 20; i++) { //wait max. 2s
				delay_keep_alive(100);
   1d3a0:	84 e6       	ldi	r24, 0x64	; 100
   1d3a2:	90 e0       	ldi	r25, 0x00	; 0
   1d3a4:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
				if (lcd_clicked()) {
   1d3a8:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   1d3ac:	81 11       	cpse	r24, r1
   1d3ae:	02 c0       	rjmp	.+4      	; 0x1d3b4 <lcd_v2_calibration()+0x88>
   1d3b0:	c1 50       	subi	r28, 0x01	; 1
		}

		if (!loaded) {
			lcd_display_message_fullscreen_P(_T(MSG_PLEASE_LOAD_PLA));
			lcd_consume_click();
			for (uint_least8_t i = 0; i < 20; i++) { //wait max. 2s
   1d3b2:	b1 f7       	brne	.-20     	; 0x1d3a0 <lcd_v2_calibration()+0x74>
				delay_keep_alive(100);
				if (lcd_clicked()) {
					break;
				}
			}
			lcd_update_enabled = true;
   1d3b4:	81 e0       	ldi	r24, 0x01	; 1
   1d3b6:	80 93 5a 02 	sts	0x025A, r24	; 0x80025a <lcd_update_enabled>
	}
#endif //FILAMENT_SENSOR

	eFilamentAction = FilamentAction::Lay1Cal;
	menu_goto(lcd_generic_preheat_menu, 0, true);
}
   1d3ba:	df 91       	pop	r29
   1d3bc:	cf 91       	pop	r28
				if (lcd_clicked()) {
					break;
				}
			}
			lcd_update_enabled = true;
			menu_back();
   1d3be:	0c 94 1b 63 	jmp	0xc636	; 0xc636 <menu_back()>
	{
		bool loaded = false;
		if (fsensor.isReady()) {
			loaded = fsensor.getFilamentPresent();
		} else {
			loaded = !lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_FILAMENT_LOADED), false, LCD_MIDDLE_BUTTON_CHOICE);
   1d3c2:	84 e2       	ldi	r24, 0x24	; 36
   1d3c4:	92 e4       	ldi	r25, 0x42	; 66
   1d3c6:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d3ca:	41 e0       	ldi	r20, 0x01	; 1
   1d3cc:	60 e0       	ldi	r22, 0x00	; 0
   1d3ce:	0e 94 b2 e8 	call	0x1d164	; 0x1d164 <lcd_show_multiscreen_message_yes_no_and_wait_P(char const*, bool, unsigned char)>
   1d3d2:	91 e0       	ldi	r25, 0x01	; 1
   1d3d4:	81 11       	cpse	r24, r1
   1d3d6:	90 e0       	ldi	r25, 0x00	; 0
			lcd_update_enabled = true;
   1d3d8:	81 e0       	ldi	r24, 0x01	; 1
   1d3da:	80 93 5a 02 	sts	0x025A, r24	; 0x80025a <lcd_update_enabled>
		}

		if (!loaded) {
   1d3de:	91 11       	cpse	r25, r1
   1d3e0:	bb cf       	rjmp	.-138    	; 0x1d358 <lcd_v2_calibration()+0x2c>
   1d3e2:	d5 cf       	rjmp	.-86     	; 0x1d38e <lcd_v2_calibration()+0x62>

0001d3e4 <lcd_z_calibration_prompt(bool)>:
    }
    lcd_show_fullscreen_message_and_wait_P(
            _T(MSG_WIZARD_V2_CAL_2));
}

void lcd_z_calibration_prompt(bool allowTimeouting) {
   1d3e4:	cf 93       	push	r28
   1d3e6:	c8 2f       	mov	r28, r24
    uint8_t result = lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_Z_CALIBRATION_PROMPT), allowTimeouting, 0);
   1d3e8:	8a ec       	ldi	r24, 0xCA	; 202
   1d3ea:	9f e3       	ldi	r25, 0x3F	; 63
   1d3ec:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d3f0:	40 e0       	ldi	r20, 0x00	; 0
   1d3f2:	6c 2f       	mov	r22, r28
   1d3f4:	0e 94 b2 e8 	call	0x1d164	; 0x1d164 <lcd_show_multiscreen_message_yes_no_and_wait_P(char const*, bool, unsigned char)>
    if (result == LCD_LEFT_BUTTON_CHOICE) {
   1d3f8:	81 11       	cpse	r24, r1
   1d3fa:	03 c0       	rjmp	.+6      	; 0x1d402 <lcd_z_calibration_prompt(bool)+0x1e>
        lcd_mesh_calibration_z();
    }
}
   1d3fc:	cf 91       	pop	r28
}

void lcd_z_calibration_prompt(bool allowTimeouting) {
    uint8_t result = lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_Z_CALIBRATION_PROMPT), allowTimeouting, 0);
    if (result == LCD_LEFT_BUTTON_CHOICE) {
        lcd_mesh_calibration_z();
   1d3fe:	0c 94 7a c4 	jmp	0x188f4	; 0x188f4 <lcd_mesh_calibration_z()>
    }
}
   1d402:	cf 91       	pop	r28
   1d404:	08 95       	ret

0001d406 <lcd_mesh_bed_leveling_settings()>:
	}
	eeprom_update_byte_notify((uint8_t*)EEPROM_MBL_PROBE_NR, mbl_z_probe_nr);
}

static void lcd_mesh_bed_leveling_settings()
{
   1d406:	bf 92       	push	r11
   1d408:	cf 92       	push	r12
   1d40a:	df 92       	push	r13
   1d40c:	ef 92       	push	r14
   1d40e:	ff 92       	push	r15
   1d410:	0f 93       	push	r16
   1d412:	1f 93       	push	r17
   1d414:	cf 93       	push	r28
   1d416:	df 93       	push	r29
   1d418:	00 d0       	rcall	.+0      	; 0x1d41a <lcd_mesh_bed_leveling_settings()+0x14>
   1d41a:	1f 92       	push	r1
   1d41c:	cd b7       	in	r28, 0x3d	; 61
   1d41e:	de b7       	in	r29, 0x3e	; 62

	bool magnet_elimination = (eeprom_read_byte((uint8_t*)EEPROM_MBL_MAGNET_ELIMINATION) > 0);
   1d420:	8c ea       	ldi	r24, 0xAC	; 172
   1d422:	9d e0       	ldi	r25, 0x0D	; 13
   1d424:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1d428:	c8 2e       	mov	r12, r24
	uint8_t points_nr = eeprom_read_byte((uint8_t*)EEPROM_MBL_POINTS_NR);
   1d42a:	8b ea       	ldi	r24, 0xAB	; 171
   1d42c:	9d e0       	ldi	r25, 0x0D	; 13
   1d42e:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1d432:	f8 2e       	mov	r15, r24
	uint8_t mbl_z_probe_nr = eeprom_read_byte((uint8_t*)EEPROM_MBL_PROBE_NR);
   1d434:	8a ea       	ldi	r24, 0xAA	; 170
   1d436:	9d e0       	ldi	r25, 0x0D	; 13
   1d438:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1d43c:	18 2f       	mov	r17, r24
	char sToggle[4]; //enough for nxn format

	MENU_BEGIN();
   1d43e:	0e 94 0c 74 	call	0xe818	; 0xe818 <menu_start()>
   1d442:	10 92 60 04 	sts	0x0460, r1	; 0x800460 <menu_row>
		if (points_nr == 7) {
            lcd_z_calibration_prompt(true);
		}
	);
	MENU_ITEM_BACK_P(_T(MSG_SETTINGS));
	sToggle[0] = points_nr + '0';
   1d446:	80 e3       	ldi	r24, 0x30	; 48
   1d448:	d8 2e       	mov	r13, r24
   1d44a:	df 0c       	add	r13, r15
	sToggle[1] = 'x';
   1d44c:	98 e7       	ldi	r25, 0x78	; 120
   1d44e:	b9 2e       	mov	r11, r25
	sToggle[2] = points_nr + '0';
	sToggle[3] = 0;
	MENU_ITEM_TOGGLE(_T(MSG_MESH), sToggle, mbl_mesh_toggle);
	sToggle[0] = mbl_z_probe_nr + '0';
   1d450:	20 e3       	ldi	r18, 0x30	; 48
   1d452:	e2 2e       	mov	r14, r18
   1d454:	e1 0e       	add	r14, r17
	bool magnet_elimination = (eeprom_read_byte((uint8_t*)EEPROM_MBL_MAGNET_ELIMINATION) > 0);
	uint8_t points_nr = eeprom_read_byte((uint8_t*)EEPROM_MBL_POINTS_NR);
	uint8_t mbl_z_probe_nr = eeprom_read_byte((uint8_t*)EEPROM_MBL_PROBE_NR);
	char sToggle[4]; //enough for nxn format

	MENU_BEGIN();
   1d456:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   1d45a:	84 30       	cpi	r24, 0x04	; 4
   1d45c:	08 f0       	brcs	.+2      	; 0x1d460 <lcd_mesh_bed_leveling_settings()+0x5a>
   1d45e:	56 c0       	rjmp	.+172    	; 0x1d50c <lcd_mesh_bed_leveling_settings()+0x106>
   1d460:	10 92 63 04 	sts	0x0463, r1	; 0x800463 <menu_item>
	ON_MENU_LEAVE(
   1d464:	0e 94 4c 62 	call	0xc498	; 0xc498 <menu_item_leave()>
   1d468:	88 23       	and	r24, r24
   1d46a:	31 f0       	breq	.+12     	; 0x1d478 <lcd_mesh_bed_leveling_settings()+0x72>
   1d46c:	87 e0       	ldi	r24, 0x07	; 7
   1d46e:	f8 12       	cpse	r15, r24
   1d470:	03 c0       	rjmp	.+6      	; 0x1d478 <lcd_mesh_bed_leveling_settings()+0x72>
   1d472:	81 e0       	ldi	r24, 0x01	; 1
   1d474:	0e 94 f2 e9 	call	0x1d3e4	; 0x1d3e4 <lcd_z_calibration_prompt(bool)>
		// Prompt user to run Z calibration for best results with region MBL.
		if (points_nr == 7) {
            lcd_z_calibration_prompt(true);
		}
	);
	MENU_ITEM_BACK_P(_T(MSG_SETTINGS));
   1d478:	8e e8       	ldi	r24, 0x8E	; 142
   1d47a:	98 e4       	ldi	r25, 0x48	; 72
   1d47c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d480:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
	sToggle[0] = points_nr + '0';
   1d484:	d9 82       	std	Y+1, r13	; 0x01
	sToggle[1] = 'x';
   1d486:	ba 82       	std	Y+2, r11	; 0x02
	sToggle[2] = points_nr + '0';
   1d488:	db 82       	std	Y+3, r13	; 0x03
	sToggle[3] = 0;
   1d48a:	1c 82       	std	Y+4, r1	; 0x04
	MENU_ITEM_TOGGLE(_T(MSG_MESH), sToggle, mbl_mesh_toggle);
   1d48c:	87 e8       	ldi	r24, 0x87	; 135
   1d48e:	98 e4       	ldi	r25, 0x48	; 72
   1d490:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d494:	20 e0       	ldi	r18, 0x00	; 0
   1d496:	40 e2       	ldi	r20, 0x20	; 32
   1d498:	5f eb       	ldi	r21, 0xBF	; 191
   1d49a:	be 01       	movw	r22, r28
   1d49c:	6f 5f       	subi	r22, 0xFF	; 255
   1d49e:	7f 4f       	sbci	r23, 0xFF	; 255
   1d4a0:	0e 94 5e 75 	call	0xeabc	; 0xeabc <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
	sToggle[0] = mbl_z_probe_nr + '0';
   1d4a4:	e9 82       	std	Y+1, r14	; 0x01
	sToggle[1] = 0;
   1d4a6:	1a 82       	std	Y+2, r1	; 0x02
	MENU_ITEM_TOGGLE(_T(MSG_Z_PROBE_NR), sToggle, mbl_probe_nr_toggle);
   1d4a8:	89 e7       	ldi	r24, 0x79	; 121
   1d4aa:	98 e4       	ldi	r25, 0x48	; 72
   1d4ac:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d4b0:	20 e0       	ldi	r18, 0x00	; 0
   1d4b2:	41 e1       	ldi	r20, 0x11	; 17
   1d4b4:	5f eb       	ldi	r21, 0xBF	; 191
   1d4b6:	be 01       	movw	r22, r28
   1d4b8:	6f 5f       	subi	r22, 0xFF	; 255
   1d4ba:	7f 4f       	sbci	r23, 0xFF	; 255
   1d4bc:	0e 94 5e 75 	call	0xeabc	; 0xeabc <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
	MENU_ITEM_TOGGLE_P(_T(MSG_MAGNETS_COMP), (points_nr == 7) ? (magnet_elimination ? _T(MSG_ON): _T(MSG_OFF)) : _T(MSG_NA), mbl_magnets_elimination_toggle);
   1d4c0:	87 e0       	ldi	r24, 0x07	; 7
   1d4c2:	f8 12       	cpse	r15, r24
   1d4c4:	20 c0       	rjmp	.+64     	; 0x1d506 <lcd_mesh_bed_leveling_settings()+0x100>
   1d4c6:	8a e9       	ldi	r24, 0x9A	; 154
   1d4c8:	92 e6       	ldi	r25, 0x62	; 98
   1d4ca:	c1 10       	cpse	r12, r1
   1d4cc:	02 c0       	rjmp	.+4      	; 0x1d4d2 <lcd_mesh_bed_leveling_settings()+0xcc>
   1d4ce:	84 e9       	ldi	r24, 0x94	; 148
   1d4d0:	92 e6       	ldi	r25, 0x62	; 98
   1d4d2:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d4d6:	8c 01       	movw	r16, r24
   1d4d8:	83 e6       	ldi	r24, 0x63	; 99
   1d4da:	98 e4       	ldi	r25, 0x48	; 72
   1d4dc:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d4e0:	22 e0       	ldi	r18, 0x02	; 2
   1d4e2:	4c e2       	ldi	r20, 0x2C	; 44
   1d4e4:	5f eb       	ldi	r21, 0xBF	; 191
   1d4e6:	b8 01       	movw	r22, r16
   1d4e8:	0e 94 5e 75 	call	0xeabc	; 0xeabc <menu_item_toggle_P(char const*, char const*, void (*)(), unsigned char)>
	MENU_END();
   1d4ec:	0e 94 83 62 	call	0xc506	; 0xc506 <menu_end()>
	bool magnet_elimination = (eeprom_read_byte((uint8_t*)EEPROM_MBL_MAGNET_ELIMINATION) > 0);
	uint8_t points_nr = eeprom_read_byte((uint8_t*)EEPROM_MBL_POINTS_NR);
	uint8_t mbl_z_probe_nr = eeprom_read_byte((uint8_t*)EEPROM_MBL_PROBE_NR);
	char sToggle[4]; //enough for nxn format

	MENU_BEGIN();
   1d4f0:	90 91 60 04 	lds	r25, 0x0460	; 0x800460 <menu_row>
   1d4f4:	9f 5f       	subi	r25, 0xFF	; 255
   1d4f6:	90 93 60 04 	sts	0x0460, r25	; 0x800460 <menu_row>
   1d4fa:	90 91 62 04 	lds	r25, 0x0462	; 0x800462 <menu_line>
   1d4fe:	9f 5f       	subi	r25, 0xFF	; 255
   1d500:	90 93 62 04 	sts	0x0462, r25	; 0x800462 <menu_line>
   1d504:	a8 cf       	rjmp	.-176    	; 0x1d456 <lcd_mesh_bed_leveling_settings()+0x50>
	sToggle[3] = 0;
	MENU_ITEM_TOGGLE(_T(MSG_MESH), sToggle, mbl_mesh_toggle);
	sToggle[0] = mbl_z_probe_nr + '0';
	sToggle[1] = 0;
	MENU_ITEM_TOGGLE(_T(MSG_Z_PROBE_NR), sToggle, mbl_probe_nr_toggle);
	MENU_ITEM_TOGGLE_P(_T(MSG_MAGNETS_COMP), (points_nr == 7) ? (magnet_elimination ? _T(MSG_ON): _T(MSG_OFF)) : _T(MSG_NA), mbl_magnets_elimination_toggle);
   1d506:	83 e7       	ldi	r24, 0x73	; 115
   1d508:	98 e4       	ldi	r25, 0x48	; 72
   1d50a:	e3 cf       	rjmp	.-58     	; 0x1d4d2 <lcd_mesh_bed_leveling_settings()+0xcc>
	MENU_END();
}
   1d50c:	0f 90       	pop	r0
   1d50e:	0f 90       	pop	r0
   1d510:	0f 90       	pop	r0
   1d512:	0f 90       	pop	r0
   1d514:	df 91       	pop	r29
   1d516:	cf 91       	pop	r28
   1d518:	1f 91       	pop	r17
   1d51a:	0f 91       	pop	r16
   1d51c:	ff 90       	pop	r15
   1d51e:	ef 90       	pop	r14
   1d520:	df 90       	pop	r13
   1d522:	cf 90       	pop	r12
   1d524:	bf 90       	pop	r11
   1d526:	08 95       	ret

0001d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>:
 *
 * This function is blocking.
 * @param msg message to be displayed from PROGMEM
 */
void lcd_show_fullscreen_message_and_wait_P(const char *msg)
{
   1d528:	cf 92       	push	r12
   1d52a:	df 92       	push	r13
   1d52c:	ef 92       	push	r14
   1d52e:	ff 92       	push	r15
   1d530:	0f 93       	push	r16
   1d532:	1f 93       	push	r17
   1d534:	cf 93       	push	r28
   1d536:	df 93       	push	r29
   1d538:	d8 2e       	mov	r13, r24
   1d53a:	c9 2e       	mov	r12, r25
//! Do not call lcd_update_enable() to prevent calling lcd_update() in sensitive code.
//! in certain scenarios it will cause recursion e.g. in the menus.
class LcdUpdateDisabler
{
public:
    LcdUpdateDisabler(): m_updateEnabled(lcd_update_enabled)
   1d53c:	01 e0       	ldi	r16, 0x01	; 1
   1d53e:	80 91 5a 02 	lds	r24, 0x025A	; 0x80025a <lcd_update_enabled>
   1d542:	81 11       	cpse	r24, r1
   1d544:	01 c0       	rjmp	.+2      	; 0x1d548 <lcd_show_fullscreen_message_and_wait_P(char const*)+0x20>
   1d546:	00 e0       	ldi	r16, 0x00	; 0
    {
        lcd_update_enabled = false;
   1d548:	10 92 5a 02 	sts	0x025A, r1	; 0x80025a <lcd_update_enabled>
    LcdUpdateDisabler lcdUpdateDisabler;
    const char *msg_next = lcd_display_message_fullscreen_P(msg);
   1d54c:	8d 2d       	mov	r24, r13
   1d54e:	9c 2d       	mov	r25, r12
   1d550:	0e 94 a9 e0 	call	0x1c152	; 0x1c152 <lcd_display_message_fullscreen_P(char const*)>
   1d554:	7c 01       	movw	r14, r24
    bool multi_screen = msg_next != NULL;
	lcd_consume_click();
   1d556:	0e 94 70 73 	call	0xe6e0	; 0xe6e0 <lcd_consume_click()>
	KEEPALIVE_STATE(PAUSED_FOR_USER);
   1d55a:	84 e0       	ldi	r24, 0x04	; 4
   1d55c:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
 * @param msg message to be displayed from PROGMEM
 */
void lcd_show_fullscreen_message_and_wait_P(const char *msg)
{
    LcdUpdateDisabler lcdUpdateDisabler;
    const char *msg_next = lcd_display_message_fullscreen_P(msg);
   1d560:	e7 01       	movw	r28, r14
    bool multi_screen = msg_next != NULL;
	lcd_consume_click();
	KEEPALIVE_STATE(PAUSED_FOR_USER);
	// Until confirmed by a button click.
	for (;;) {
		if (msg_next == NULL) {
   1d562:	20 97       	sbiw	r28, 0x00	; 0
   1d564:	29 f4       	brne	.+10     	; 0x1d570 <lcd_show_fullscreen_message_and_wait_P(char const*)+0x48>
			// Display the confirm char.
			lcd_putc_at(19, 3, LCD_STR_CONFIRM[0]);
   1d566:	49 e8       	ldi	r20, 0x89	; 137
   1d568:	63 e0       	ldi	r22, 0x03	; 3
   1d56a:	83 e1       	ldi	r24, 0x13	; 19
   1d56c:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
 * @param msg message to be displayed from PROGMEM
 */
void lcd_show_fullscreen_message_and_wait_P(const char *msg)
{
    LcdUpdateDisabler lcdUpdateDisabler;
    const char *msg_next = lcd_display_message_fullscreen_P(msg);
   1d570:	14 e6       	ldi	r17, 0x64	; 100
			// Display the confirm char.
			lcd_putc_at(19, 3, LCD_STR_CONFIRM[0]);
		}
        // Wait for 5 seconds before displaying the next text.
        for (uint8_t i = 0; i < 100; ++ i) {
            delay_keep_alive(50);
   1d572:	82 e3       	ldi	r24, 0x32	; 50
   1d574:	90 e0       	ldi	r25, 0x00	; 0
   1d576:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
            if (lcd_clicked()) {
   1d57a:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   1d57e:	88 23       	and	r24, r24
   1d580:	81 f0       	breq	.+32     	; 0x1d5a2 <lcd_show_fullscreen_message_and_wait_P(char const*)+0x7a>
				if (msg_next == NULL) {
   1d582:	20 97       	sbiw	r28, 0x00	; 0
   1d584:	81 f4       	brne	.+32     	; 0x1d5a6 <lcd_show_fullscreen_message_and_wait_P(char const*)+0x7e>
					KEEPALIVE_STATE(IN_HANDLER);
   1d586:	82 e0       	ldi	r24, 0x02	; 2
   1d588:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
    }
    ~LcdUpdateDisabler()
    {
        lcd_update_enabled = m_updateEnabled;
   1d58c:	00 93 5a 02 	sts	0x025A, r16	; 0x80025a <lcd_update_enabled>
            if (msg_next == NULL)
                msg_next = msg;
            msg_next = lcd_display_message_fullscreen_P(msg_next);
        }
    }
}
   1d590:	df 91       	pop	r29
   1d592:	cf 91       	pop	r28
   1d594:	1f 91       	pop	r17
   1d596:	0f 91       	pop	r16
   1d598:	ff 90       	pop	r15
   1d59a:	ef 90       	pop	r14
   1d59c:	df 90       	pop	r13
   1d59e:	cf 90       	pop	r12
   1d5a0:	08 95       	ret
   1d5a2:	11 50       	subi	r17, 0x01	; 1
		if (msg_next == NULL) {
			// Display the confirm char.
			lcd_putc_at(19, 3, LCD_STR_CONFIRM[0]);
		}
        // Wait for 5 seconds before displaying the next text.
        for (uint8_t i = 0; i < 100; ++ i) {
   1d5a4:	31 f7       	brne	.-52     	; 0x1d572 <lcd_show_fullscreen_message_and_wait_P(char const*)+0x4a>
				else {
					break;
				}
            }
        }
        if (multi_screen) {
   1d5a6:	e1 14       	cp	r14, r1
   1d5a8:	f1 04       	cpc	r15, r1
   1d5aa:	d9 f2       	breq	.-74     	; 0x1d562 <lcd_show_fullscreen_message_and_wait_P(char const*)+0x3a>
            if (msg_next == NULL)
   1d5ac:	20 97       	sbiw	r28, 0x00	; 0
   1d5ae:	11 f4       	brne	.+4      	; 0x1d5b4 <lcd_show_fullscreen_message_and_wait_P(char const*)+0x8c>
                msg_next = msg;
   1d5b0:	cd 2d       	mov	r28, r13
   1d5b2:	dc 2d       	mov	r29, r12
            msg_next = lcd_display_message_fullscreen_P(msg_next);
   1d5b4:	ce 01       	movw	r24, r28
   1d5b6:	0e 94 a9 e0 	call	0x1c152	; 0x1c152 <lcd_display_message_fullscreen_P(char const*)>
   1d5ba:	ec 01       	movw	r28, r24
   1d5bc:	d2 cf       	rjmp	.-92     	; 0x1d562 <lcd_show_fullscreen_message_and_wait_P(char const*)+0x3a>

0001d5be <render_M862_warnings(char const*, char const*, unsigned char) [clone .lto_priv.521]>:
    oCheckFilament = (ClCheckMode)eeprom_init_default_byte((uint8_t *)EEPROM_CHECK_FILAMENT, (uint8_t)ClCheckMode::_Warn);
}

static void render_M862_warnings(const char* warning, const char* strict, uint8_t check)
{
    if (check == 1) { // Warning, stop print if user selects 'No'
   1d5be:	41 30       	cpi	r20, 0x01	; 1
   1d5c0:	41 f4       	brne	.+16     	; 0x1d5d2 <render_M862_warnings(char const*, char const*, unsigned char) [clone .lto_priv.521]+0x14>
        if (lcd_show_multiscreen_message_cont_cancel_and_wait_P(warning, true, LCD_LEFT_BUTTON_CHOICE) == LCD_MIDDLE_BUTTON_CHOICE) {
   1d5c2:	40 e0       	ldi	r20, 0x00	; 0
   1d5c4:	61 e0       	ldi	r22, 0x01	; 1
   1d5c6:	0e 94 77 e5 	call	0x1caee	; 0x1caee <lcd_show_multiscreen_message_cont_cancel_and_wait_P(char const*, bool, unsigned char)>
   1d5ca:	81 30       	cpi	r24, 0x01	; 1
   1d5cc:	41 f4       	brne	.+16     	; 0x1d5de <render_M862_warnings(char const*, char const*, unsigned char) [clone .lto_priv.521]+0x20>
            lcd_print_stop();
        }
    } else if (check == 2) { // Strict, always stop print
        lcd_show_fullscreen_message_and_wait_P(strict);
        lcd_print_stop();
   1d5ce:	0c 94 42 df 	jmp	0x1be84	; 0x1be84 <lcd_print_stop()>
{
    if (check == 1) { // Warning, stop print if user selects 'No'
        if (lcd_show_multiscreen_message_cont_cancel_and_wait_P(warning, true, LCD_LEFT_BUTTON_CHOICE) == LCD_MIDDLE_BUTTON_CHOICE) {
            lcd_print_stop();
        }
    } else if (check == 2) { // Strict, always stop print
   1d5d2:	42 30       	cpi	r20, 0x02	; 2
   1d5d4:	21 f4       	brne	.+8      	; 0x1d5de <render_M862_warnings(char const*, char const*, unsigned char) [clone .lto_priv.521]+0x20>
        lcd_show_fullscreen_message_and_wait_P(strict);
   1d5d6:	cb 01       	movw	r24, r22
   1d5d8:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
   1d5dc:	f8 cf       	rjmp	.-16     	; 0x1d5ce <render_M862_warnings(char const*, char const*, unsigned char) [clone .lto_priv.521]+0x10>
        lcd_print_stop();
    }
}
   1d5de:	08 95       	ret

0001d5e0 <filament_presence_check()>:
        ,_T(MSG_GCODE_NEWER_FIRMWARE_CANCELLED)
        ,(uint8_t)oCheckVersion
    );
}

bool filament_presence_check() {
   1d5e0:	0f 93       	push	r16
   1d5e2:	1f 93       	push	r17
   1d5e4:	cf 93       	push	r28
    // When MMU is enabled, this is not necessary and the G-code file
    // should always tell the MMU which filament to load.
    if (eeprom_read_byte((uint8_t *)EEPROM_MMU_ENABLED)) {
   1d5e6:	8c ea       	ldi	r24, 0xAC	; 172
   1d5e8:	9c e0       	ldi	r25, 0x0C	; 12
   1d5ea:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1d5ee:	81 11       	cpse	r24, r1
   1d5f0:	23 c0       	rjmp	.+70     	; 0x1d638 <filament_presence_check()+0x58>
        goto done;
    }

    if (fsensor.isEnabled() && !fsensor.getFilamentPresent()) {
   1d5f2:	80 91 f1 16 	lds	r24, 0x16F1	; 0x8016f1 <fsensor>
   1d5f6:	88 23       	and	r24, r24
   1d5f8:	f9 f0       	breq	.+62     	; 0x1d638 <filament_presence_check()+0x58>
   1d5fa:	80 91 fe 16 	lds	r24, 0x16FE	; 0x8016fe <fsensor+0xd>
   1d5fe:	81 11       	cpse	r24, r1
   1d600:	1b c0       	rjmp	.+54     	; 0x1d638 <filament_presence_check()+0x58>
        if (oCheckFilament == ClCheckMode::_None) {
   1d602:	c0 91 ee 03 	lds	r28, 0x03EE	; 0x8003ee <oCheckFilament>
   1d606:	cc 23       	and	r28, r28
   1d608:	b9 f0       	breq	.+46     	; 0x1d638 <filament_presence_check()+0x58>
            goto done;
        }

        render_M862_warnings(
   1d60a:	82 e7       	ldi	r24, 0x72	; 114
   1d60c:	9c e4       	ldi	r25, 0x4C	; 76
   1d60e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d612:	8c 01       	movw	r16, r24
   1d614:	82 e7       	ldi	r24, 0x72	; 114
   1d616:	9c e4       	ldi	r25, 0x4C	; 76
   1d618:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d61c:	4c 2f       	mov	r20, r28
   1d61e:	b8 01       	movw	r22, r16
   1d620:	0e 94 df ea 	call	0x1d5be	; 0x1d5be <render_M862_warnings(char const*, char const*, unsigned char) [clone .lto_priv.521]>
            _T(MSG_MISSING_FILAMENT)
            ,_T(MSG_MISSING_FILAMENT) //Identical messages
            ,(uint8_t)oCheckFilament
        );

        if (lcd_commands_type == LcdCommands::StopPrint) {
   1d624:	81 e0       	ldi	r24, 0x01	; 1
   1d626:	90 91 5e 0d 	lds	r25, 0x0D5E	; 0x800d5e <lcd_commands_type>
   1d62a:	91 30       	cpi	r25, 0x01	; 1
   1d62c:	09 f4       	brne	.+2      	; 0x1d630 <filament_presence_check()+0x50>
   1d62e:	80 e0       	ldi	r24, 0x00	; 0
        }
    }

done:
    return true;
}
   1d630:	cf 91       	pop	r28
   1d632:	1f 91       	pop	r17
   1d634:	0f 91       	pop	r16
   1d636:	08 95       	ret
            return false;
        }
    }

done:
    return true;
   1d638:	81 e0       	ldi	r24, 0x01	; 1
   1d63a:	fa cf       	rjmp	.-12     	; 0x1d630 <filament_presence_check()+0x50>

0001d63c <nozzle_diameter_check(unsigned int)>:
        lcd_show_fullscreen_message_and_wait_P(strict);
        lcd_print_stop();
    }
}

void nozzle_diameter_check(uint16_t nDiameter) {
   1d63c:	1f 93       	push	r17
   1d63e:	cf 93       	push	r28
   1d640:	df 93       	push	r29
    uint16_t nDiameter_um;

    if (oCheckMode == ClCheckMode::_None)
   1d642:	10 91 ed 03 	lds	r17, 0x03ED	; 0x8003ed <oCheckMode>
   1d646:	11 23       	and	r17, r17
   1d648:	19 f1       	breq	.+70     	; 0x1d690 <nozzle_diameter_check(unsigned int)+0x54>
   1d64a:	ec 01       	movw	r28, r24
        return;
    nDiameter_um = eeprom_read_word((uint16_t *)EEPROM_NOZZLE_DIAMETER_uM);
   1d64c:	85 ea       	ldi	r24, 0xA5	; 165
   1d64e:	9d e0       	ldi	r25, 0x0D	; 13
   1d650:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
    if (nDiameter == nDiameter_um)
   1d654:	8c 17       	cp	r24, r28
   1d656:	9d 07       	cpc	r25, r29
   1d658:	d9 f0       	breq	.+54     	; 0x1d690 <nozzle_diameter_check(unsigned int)+0x54>
    // SERIAL_ECHOPGM("actual  : ");
    // SERIAL_ECHOLN((float)(nDiameter_um/1000.0));
    // SERIAL_ECHOPGM("expected: ");
    // SERIAL_ECHOLN((float)(nDiameter/1000.0));

    render_M862_warnings(
   1d65a:	83 e2       	ldi	r24, 0x23	; 35
   1d65c:	9c e4       	ldi	r25, 0x4C	; 76
   1d65e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d662:	ec 01       	movw	r28, r24
   1d664:	88 ef       	ldi	r24, 0xF8	; 248
   1d666:	9b e4       	ldi	r25, 0x4B	; 75
   1d668:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d66c:	41 2f       	mov	r20, r17
   1d66e:	be 01       	movw	r22, r28
   1d670:	0e 94 df ea 	call	0x1d5be	; 0x1d5be <render_M862_warnings(char const*, char const*, unsigned char) [clone .lto_priv.521]>
        _T(MSG_NOZZLE_DIFFERS_CONTINUE)
        ,_T(MSG_NOZZLE_DIFFERS_CANCELLED)
        ,(uint8_t)oCheckMode
    );

    if (!farm_mode) {
   1d674:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   1d678:	81 11       	cpse	r24, r1
   1d67a:	0a c0       	rjmp	.+20     	; 0x1d690 <nozzle_diameter_check(unsigned int)+0x54>
        bSettings = false; // flag ('fake parameter') for 'lcd_hw_setup_menu()' function
   1d67c:	10 92 ec 03 	sts	0x03EC, r1	; 0x8003ec <bSettings>
        menu_submenu(lcd_hw_setup_menu);
   1d680:	60 e0       	ldi	r22, 0x00	; 0
   1d682:	8b e5       	ldi	r24, 0x5B	; 91
   1d684:	91 ec       	ldi	r25, 0xC1	; 193
    }
}
   1d686:	df 91       	pop	r29
   1d688:	cf 91       	pop	r28
   1d68a:	1f 91       	pop	r17
        ,(uint8_t)oCheckMode
    );

    if (!farm_mode) {
        bSettings = false; // flag ('fake parameter') for 'lcd_hw_setup_menu()' function
        menu_submenu(lcd_hw_setup_menu);
   1d68c:	0c 94 dd 62 	jmp	0xc5ba	; 0xc5ba <menu_submenu(void (*)(), bool)>
    }
}
   1d690:	df 91       	pop	r29
   1d692:	cf 91       	pop	r28
   1d694:	1f 91       	pop	r17
   1d696:	08 95       	ret

0001d698 <nozzle_change()>:
}

static void nozzle_change()
{
#ifdef FILAMENT_SENSOR
    if (fsensor.isEnabled() && fsensor.getFilamentPresent()) {
   1d698:	80 91 f1 16 	lds	r24, 0x16F1	; 0x8016f1 <fsensor>
   1d69c:	88 23       	and	r24, r24
   1d69e:	61 f0       	breq	.+24     	; 0x1d6b8 <nozzle_change()+0x20>
   1d6a0:	80 91 fe 16 	lds	r24, 0x16FE	; 0x8016fe <fsensor+0xd>
   1d6a4:	88 23       	and	r24, r24
   1d6a6:	41 f0       	breq	.+16     	; 0x1d6b8 <nozzle_change()+0x20>
        lcd_show_fullscreen_message_and_wait_P(_T(MSG_UNLOAD_FILAMENT_REPEAT));
   1d6a8:	85 ee       	ldi	r24, 0xE5	; 229
   1d6aa:	94 e4       	ldi	r25, 0x44	; 68
   1d6ac:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d6b0:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
        lcd_return_to_status();
        return;
    }
#endif //FILAMENT_SENSOR
    lcd_commands_type = LcdCommands::NozzleCNG;
    lcd_return_to_status();
   1d6b4:	0d 94 d5 07 	jmp	0x20faa	; 0x20faa <lcd_return_to_status()>
        lcd_show_fullscreen_message_and_wait_P(_T(MSG_UNLOAD_FILAMENT_REPEAT));
        lcd_return_to_status();
        return;
    }
#endif //FILAMENT_SENSOR
    lcd_commands_type = LcdCommands::NozzleCNG;
   1d6b8:	85 e0       	ldi	r24, 0x05	; 5
   1d6ba:	80 93 5e 0d 	sts	0x0D5E, r24	; 0x800d5e <lcd_commands_type>
   1d6be:	fa cf       	rjmp	.-12     	; 0x1d6b4 <nozzle_change()+0x1c>

0001d6c0 <prompt_steel_sheet_on_bed(bool)>:
    if (result == LCD_LEFT_BUTTON_CHOICE) {
        lcd_mesh_calibration_z();
    }
}

void prompt_steel_sheet_on_bed(bool wantedState) {
   1d6c0:	cf 93       	push	r28
   1d6c2:	c8 2f       	mov	r28, r24
#ifdef STEEL_SHEET
    bool sheetIsOnBed = !lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_STEEL_SHEET_CHECK), false, !wantedState);
   1d6c4:	8d e1       	ldi	r24, 0x1D	; 29
   1d6c6:	90 e4       	ldi	r25, 0x40	; 64
   1d6c8:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d6cc:	41 e0       	ldi	r20, 0x01	; 1
   1d6ce:	4c 27       	eor	r20, r28
   1d6d0:	60 e0       	ldi	r22, 0x00	; 0
   1d6d2:	0e 94 b2 e8 	call	0x1d164	; 0x1d164 <lcd_show_multiscreen_message_yes_no_and_wait_P(char const*, bool, unsigned char)>
   1d6d6:	91 e0       	ldi	r25, 0x01	; 1
   1d6d8:	81 11       	cpse	r24, r1
   1d6da:	90 e0       	ldi	r25, 0x00	; 0
    if (sheetIsOnBed != wantedState) {
   1d6dc:	c9 17       	cp	r28, r25
   1d6de:	59 f0       	breq	.+22     	; 0x1d6f6 <prompt_steel_sheet_on_bed(bool)+0x36>
        lcd_show_fullscreen_message_and_wait_P(_T(wantedState ? MSG_PLACE_STEEL_SHEET : MSG_REMOVE_STEEL_SHEET));
   1d6e0:	83 ef       	ldi	r24, 0xF3	; 243
   1d6e2:	9f e3       	ldi	r25, 0x3F	; 63
   1d6e4:	cc 23       	and	r28, r28
   1d6e6:	11 f0       	breq	.+4      	; 0x1d6ec <prompt_steel_sheet_on_bed(bool)+0x2c>
   1d6e8:	83 ed       	ldi	r24, 0xD3	; 211
   1d6ea:	9f e5       	ldi	r25, 0x5F	; 95
   1d6ec:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
    }
#endif //STEEL_SHEET
}
   1d6f0:	cf 91       	pop	r28

void prompt_steel_sheet_on_bed(bool wantedState) {
#ifdef STEEL_SHEET
    bool sheetIsOnBed = !lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_STEEL_SHEET_CHECK), false, !wantedState);
    if (sheetIsOnBed != wantedState) {
        lcd_show_fullscreen_message_and_wait_P(_T(wantedState ? MSG_PLACE_STEEL_SHEET : MSG_REMOVE_STEEL_SHEET));
   1d6f2:	0c 94 94 ea 	jmp	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
    }
#endif //STEEL_SHEET
}
   1d6f6:	cf 91       	pop	r28
   1d6f8:	08 95       	ret

0001d6fa <wizard_lay1cal_message(bool)>:
    // When MMU is disabled P parameter is ignored
    enquecommand_P(PSTR("M701 P0"));
}

static void wizard_lay1cal_message(bool cold)
{
   1d6fa:	cf 93       	push	r28
   1d6fc:	c8 2f       	mov	r28, r24
    lcd_show_fullscreen_message_and_wait_P(
   1d6fe:	8b e7       	ldi	r24, 0x7B	; 123
   1d700:	9f e3       	ldi	r25, 0x3F	; 63
   1d702:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d706:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
            _T(MSG_WIZARD_V2_CAL));
    if (MMU2::mmu2.Enabled())
   1d70a:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   1d70e:	81 30       	cpi	r24, 0x01	; 1
   1d710:	69 f4       	brne	.+26     	; 0x1d72c <wizard_lay1cal_message(bool)+0x32>
    {
        lcd_show_fullscreen_message_and_wait_P(
   1d712:	82 e2       	ldi	r24, 0x22	; 34
   1d714:	9f e3       	ldi	r25, 0x3F	; 63
                _T(MSG_SELECT_FIL_1ST_LAYERCAL));
    }
    else if (cold)
    {
        lcd_show_fullscreen_message_and_wait_P(
   1d716:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d71a:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
                _T(MSG_SELECT_TEMP_MATCHES_MATERIAL));
    }
    lcd_show_fullscreen_message_and_wait_P(
   1d71e:	80 e5       	ldi	r24, 0x50	; 80
   1d720:	9e e3       	ldi	r25, 0x3E	; 62
   1d722:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
            _T(MSG_WIZARD_V2_CAL_2));
}
   1d726:	cf 91       	pop	r28
    else if (cold)
    {
        lcd_show_fullscreen_message_and_wait_P(
                _T(MSG_SELECT_TEMP_MATCHES_MATERIAL));
    }
    lcd_show_fullscreen_message_and_wait_P(
   1d728:	0c 94 94 ea 	jmp	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
    if (MMU2::mmu2.Enabled())
    {
        lcd_show_fullscreen_message_and_wait_P(
                _T(MSG_SELECT_FIL_1ST_LAYERCAL));
    }
    else if (cold)
   1d72c:	cc 23       	and	r28, r28
   1d72e:	b9 f3       	breq	.-18     	; 0x1d71e <wizard_lay1cal_message(bool)+0x24>
    {
        lcd_show_fullscreen_message_and_wait_P(
   1d730:	80 ef       	ldi	r24, 0xF0	; 240
   1d732:	9e e3       	ldi	r25, 0x3E	; 62
   1d734:	f0 cf       	rjmp	.-32     	; 0x1d716 <wizard_lay1cal_message(bool)+0x1c>

0001d736 <lcd_wizard_load()>:
    }

}

static void lcd_wizard_load() {
    if (MMU2::mmu2.Enabled()) {
   1d736:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   1d73a:	81 30       	cpi	r24, 0x01	; 1
   1d73c:	71 f4       	brne	.+28     	; 0x1d75a <lcd_wizard_load()+0x24>
        lcd_show_fullscreen_message_and_wait_P(
   1d73e:	87 ef       	ldi	r24, 0xF7	; 247
   1d740:	9d e3       	ldi	r25, 0x3D	; 61
   1d742:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d746:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
            _T(MSG_MMU_INSERT_FILAMENT_FIRST_TUBE));
        // NOTE: a full screen message showing which filament is being inserted
        // is performed by M701. For this reason MSG_LOADING_FILAMENT is not
        // used here when a MMU is used.
        eFilamentAction = FilamentAction::MmuLoad;
   1d74a:	84 e0       	ldi	r24, 0x04	; 4
        lcd_show_fullscreen_message_and_wait_P(
            _T(MSG_WIZARD_LOAD_FILAMENT));
        lcd_update_enable(false);
        lcd_clear();
        lcd_puts_at_P(0, 2, _T(MSG_LOADING_FILAMENT));
        eFilamentAction = FilamentAction::Load;
   1d74c:	80 93 94 03 	sts	0x0394, r24	; 0x800394 <eFilamentAction>
    }

    // When MMU is disabled P parameter is ignored
    enquecommand_P(PSTR("M701 P0"));
   1d750:	61 e0       	ldi	r22, 0x01	; 1
   1d752:	83 e4       	ldi	r24, 0x43	; 67
   1d754:	93 e8       	ldi	r25, 0x83	; 131
   1d756:	0c 94 e9 8e 	jmp	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
        // NOTE: a full screen message showing which filament is being inserted
        // is performed by M701. For this reason MSG_LOADING_FILAMENT is not
        // used here when a MMU is used.
        eFilamentAction = FilamentAction::MmuLoad;
    } else {
        lcd_show_fullscreen_message_and_wait_P(
   1d75a:	8b ea       	ldi	r24, 0xAB	; 171
   1d75c:	9d e3       	ldi	r25, 0x3D	; 61
   1d75e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d762:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
            _T(MSG_WIZARD_LOAD_FILAMENT));
        lcd_update_enable(false);
   1d766:	80 e0       	ldi	r24, 0x00	; 0
   1d768:	0e 94 38 70 	call	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>
        lcd_clear();
   1d76c:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
        lcd_puts_at_P(0, 2, _T(MSG_LOADING_FILAMENT));
   1d770:	8d ee       	ldi	r24, 0xED	; 237
   1d772:	91 e6       	ldi	r25, 0x61	; 97
   1d774:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d778:	ac 01       	movw	r20, r24
   1d77a:	62 e0       	ldi	r22, 0x02	; 2
   1d77c:	80 e0       	ldi	r24, 0x00	; 0
   1d77e:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
        eFilamentAction = FilamentAction::Load;
   1d782:	81 e0       	ldi	r24, 0x01	; 1
   1d784:	e3 cf       	rjmp	.-58     	; 0x1d74c <lcd_wizard_load()+0x16>

0001d786 <lcd_wizard(WizState)>:
//!  ---------------------- | ----------------
//! WizState::Run           | Main entry point
//! WizState::RepeatLay1Cal | Entry point after passing 1st layer calibration
//! WizState::LoadFilHot    | Entry point after temporarily left for preheat before load filament
void lcd_wizard(WizState state)
{
   1d786:	af 92       	push	r10
   1d788:	bf 92       	push	r11
   1d78a:	cf 92       	push	r12
   1d78c:	df 92       	push	r13
   1d78e:	ef 92       	push	r14
   1d790:	ff 92       	push	r15
   1d792:	0f 93       	push	r16
   1d794:	1f 93       	push	r17
   1d796:	cf 93       	push	r28
   1d798:	c8 2f       	mov	r28, r24
    using S = WizState;
	bool end = false;
	uint8_t wizard_event;
	// Make sure EEPROM_WIZARD_ACTIVE is true if entering using different entry point
	// other than WizState::Run - it is useful for debugging wizard.
	if (state != S::Run) eeprom_update_byte_notify((uint8_t*)EEPROM_WIZARD_ACTIVE, 1);
   1d79a:	88 23       	and	r24, r24
   1d79c:	29 f0       	breq	.+10     	; 0x1d7a8 <lcd_wizard(WizState)+0x22>
   1d79e:	61 e0       	ldi	r22, 0x01	; 1
   1d7a0:	8f e5       	ldi	r24, 0x5F	; 95
   1d7a2:	9f e0       	ldi	r25, 0x0F	; 15
   1d7a4:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>

    FORCE_BL_ON_START;

    while (!end) {
		printf_P(PSTR("Wizard state: %d\n"), (uint8_t)state);
   1d7a8:	8b e4       	ldi	r24, 0x4B	; 75
   1d7aa:	e8 2e       	mov	r14, r24
   1d7ac:	83 e8       	ldi	r24, 0x83	; 131
   1d7ae:	f8 2e       	mov	r15, r24
  return target_temperature_bed;
};

// Doesn't save FLASH when FORCE_INLINE removed.
FORCE_INLINE void setTargetHotend(const float &celsius) {
  target_temperature[0] = celsius;
   1d7b0:	97 ed       	ldi	r25, 0xD7	; 215
   1d7b2:	c9 2e       	mov	r12, r25
   1d7b4:	d1 2c       	mov	r13, r1
  resetPID(0);
};

FORCE_INLINE void setTargetBed(const float &celsius) {
  target_temperature_bed = celsius;
   1d7b6:	2c e3       	ldi	r18, 0x3C	; 60
   1d7b8:	a2 2e       	mov	r10, r18
   1d7ba:	b1 2c       	mov	r11, r1
   1d7bc:	0c 2f       	mov	r16, r28
   1d7be:	10 e0       	ldi	r17, 0x00	; 0
   1d7c0:	1f 92       	push	r1
   1d7c2:	cf 93       	push	r28
   1d7c4:	ff 92       	push	r15
   1d7c6:	ef 92       	push	r14
   1d7c8:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
		switch (state) {
   1d7cc:	0f 90       	pop	r0
   1d7ce:	0f 90       	pop	r0
   1d7d0:	0f 90       	pop	r0
   1d7d2:	0f 90       	pop	r0
   1d7d4:	ef ef       	ldi	r30, 0xFF	; 255
   1d7d6:	ec 0f       	add	r30, r28
   1d7d8:	ed 30       	cpi	r30, 0x0D	; 13
   1d7da:	a0 f4       	brcc	.+40     	; 0x1d804 <lcd_wizard(WizState)+0x7e>
   1d7dc:	f0 e0       	ldi	r31, 0x00	; 0
   1d7de:	88 27       	eor	r24, r24
   1d7e0:	eb 50       	subi	r30, 0x0B	; 11
   1d7e2:	f4 41       	sbci	r31, 0x14	; 20
   1d7e4:	8f 4f       	sbci	r24, 0xFF	; 255
   1d7e6:	0d 94 f0 a4 	jmp	0x349e0	; 0x349e0 <__tablejump2__>
   1d7ea:	50 ec       	ldi	r21, 0xC0	; 192
   1d7ec:	70 ec       	ldi	r23, 0xC0	; 192
   1d7ee:	7c ec       	ldi	r23, 0xCC	; 204
   1d7f0:	86 ec       	ldi	r24, 0xC6	; 198
   1d7f2:	c0 ec       	ldi	r28, 0xC0	; 192
   1d7f4:	da ec       	ldi	r29, 0xCA	; 202
   1d7f6:	f1 ec       	ldi	r31, 0xC1	; 193
   1d7f8:	eb ec       	ldi	r30, 0xCB	; 203
   1d7fa:	f5 ec       	ldi	r31, 0xC5	; 197
   1d7fc:	03 ed       	ldi	r16, 0xD3	; 211
   1d7fe:	0c ed       	ldi	r16, 0xDC	; 220
   1d800:	20 ed       	ldi	r18, 0xD0	; 208
   1d802:	20 ed       	ldi	r18, 0xD0	; 208
			// which results in distorted print.
			// This primarily happens when the printer is new and parked in 0,0
			// So any new printer will fail the first layer calibration unless being reset or the Stop function gets called.
			// We really must find a way to prevent the crash from happening before the printer is started - that would be the correct solution.
			// Btw. the flag may even trigger the viper situation on normal start this way and the user won't be able to find out why.
			saved_printing = false;
   1d804:	10 92 73 12 	sts	0x1273, r1	; 0x801273 <saved_printing>

			if( eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE)==2){
   1d808:	8f e5       	ldi	r24, 0x5F	; 95
   1d80a:	9f e0       	ldi	r25, 0x0F	; 15
   1d80c:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1d810:	82 30       	cpi	r24, 0x02	; 2
   1d812:	39 f4       	brne	.+14     	; 0x1d822 <lcd_wizard(WizState)+0x9c>
				// printer pre-assembled: finish remaining steps
				lcd_show_fullscreen_message_and_wait_P(_T(MSG_WIZARD_WELCOME_SHIPPING));
   1d814:	81 ec       	ldi	r24, 0xC1	; 193
   1d816:	93 e4       	ldi	r25, 0x43	; 67
				lcd_show_fullscreen_message_and_wait_P(_T(MSG_WIZARD_CLEAN_HEATBED));
				state = S::Lay1CalCold;
			}
			else
			{
				lcd_show_fullscreen_message_and_wait_P(_T(MSG_ADDITIONAL_SHEETS));
   1d818:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d81c:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
   1d820:	0f c0       	rjmp	.+30     	; 0x1d840 <lcd_wizard(WizState)+0xba>
				// printer pre-assembled: finish remaining steps
				lcd_show_fullscreen_message_and_wait_P(_T(MSG_WIZARD_WELCOME_SHIPPING));
				state = S::Restore;
			} else {
				// new printer, factory reset or manual invocation
				wizard_event = lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_WIZARD_WELCOME), false, LCD_LEFT_BUTTON_CHOICE);
   1d822:	8c e5       	ldi	r24, 0x5C	; 92
   1d824:	93 e4       	ldi	r25, 0x43	; 67
   1d826:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d82a:	40 e0       	ldi	r20, 0x00	; 0
   1d82c:	60 e0       	ldi	r22, 0x00	; 0
   1d82e:	0e 94 b2 e8 	call	0x1d164	; 0x1d164 <lcd_show_multiscreen_message_yes_no_and_wait_P(char const*, bool, unsigned char)>
				if (wizard_event == LCD_LEFT_BUTTON_CHOICE) {
   1d832:	81 11       	cpse	r24, r1
   1d834:	07 c0       	rjmp	.+14     	; 0x1d844 <lcd_wizard(WizState)+0xbe>
   1d836:	61 e0       	ldi	r22, 0x01	; 1
   1d838:	8f e5       	ldi	r24, 0x5F	; 95
   1d83a:	9f e0       	ldi	r25, 0x0F	; 15
   1d83c:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
				state = S::Lay1CalCold;
			}
			else
			{
				lcd_show_fullscreen_message_and_wait_P(_T(MSG_ADDITIONAL_SHEETS));
				state = S::Restore;
   1d840:	c1 e0       	ldi	r28, 0x01	; 1
   1d842:	bc cf       	rjmp	.-136    	; 0x1d7bc <lcd_wizard(WizState)+0x36>
   1d844:	60 e0       	ldi	r22, 0x00	; 0
   1d846:	8f e5       	ldi	r24, 0x5F	; 95
   1d848:	9f e0       	ldi	r25, 0x0F	; 15
   1d84a:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
   1d84e:	c0 e0       	ldi	r28, 0x00	; 0
	if (state != S::Run) eeprom_update_byte_notify((uint8_t*)EEPROM_WIZARD_ACTIVE, 1);

    FORCE_BL_ON_START;

    while (!end) {
		printf_P(PSTR("Wizard state: %d\n"), (uint8_t)state);
   1d850:	10 e0       	ldi	r17, 0x00	; 0
   1d852:	00 e0       	ldi	r16, 0x00	; 0
	}

    FORCE_BL_ON_END;

    const char *msg = NULL;
	printf_P(_N("Wizard end state: %d\n"), (uint8_t)state);
   1d854:	1f 93       	push	r17
   1d856:	0f 93       	push	r16
   1d858:	8c ed       	ldi	r24, 0xDC	; 220
   1d85a:	97 e6       	ldi	r25, 0x67	; 103
   1d85c:	9f 93       	push	r25
   1d85e:	8f 93       	push	r24
   1d860:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
	switch (state) {
   1d864:	0f 90       	pop	r0
   1d866:	0f 90       	pop	r0
   1d868:	0f 90       	pop	r0
   1d86a:	0f 90       	pop	r0
   1d86c:	cc 30       	cpi	r28, 0x0C	; 12
   1d86e:	09 f4       	brne	.+2      	; 0x1d872 <lcd_wizard(WizState)+0xec>
   1d870:	ed c0       	rjmp	.+474    	; 0x1da4c <lcd_wizard(WizState)+0x2c6>
   1d872:	cd 30       	cpi	r28, 0x0D	; 13
   1d874:	09 f4       	brne	.+2      	; 0x1d878 <lcd_wizard(WizState)+0xf2>
   1d876:	ff c0       	rjmp	.+510    	; 0x1da76 <lcd_wizard(WizState)+0x2f0>
	case S::Run:
		// user interrupted
		msg = _T(MSG_WIZARD_QUIT);
   1d878:	8b eb       	ldi	r24, 0xBB	; 187
   1d87a:	90 e4       	ldi	r25, 0x40	; 64

    FORCE_BL_ON_END;

    const char *msg = NULL;
	printf_P(_N("Wizard end state: %d\n"), (uint8_t)state);
	switch (state) {
   1d87c:	cc 23       	and	r28, r28
   1d87e:	09 f4       	brne	.+2      	; 0x1d882 <lcd_wizard(WizState)+0xfc>
   1d880:	fc c0       	rjmp	.+504    	; 0x1da7a <lcd_wizard(WizState)+0x2f4>
		break;
	}
	if (msg) {
		lcd_show_fullscreen_message_and_wait_P(msg);
	}
	lcd_update_enable(true);
   1d882:	81 e0       	ldi	r24, 0x01	; 1
   1d884:	0e 94 38 70 	call	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>
	lcd_update(2);
   1d888:	82 e0       	ldi	r24, 0x02	; 2
}
   1d88a:	cf 91       	pop	r28
   1d88c:	1f 91       	pop	r17
   1d88e:	0f 91       	pop	r16
   1d890:	ff 90       	pop	r15
   1d892:	ef 90       	pop	r14
   1d894:	df 90       	pop	r13
   1d896:	cf 90       	pop	r12
   1d898:	bf 90       	pop	r11
   1d89a:	af 90       	pop	r10
	}
	if (msg) {
		lcd_show_fullscreen_message_and_wait_P(msg);
	}
	lcd_update_enable(true);
	lcd_update(2);
   1d89c:	0c 94 f9 6e 	jmp	0xddf2	; 0xddf2 <lcd_update(unsigned char)>
    lcd_setalertstatus_(message, severity, true);
}

void lcd_reset_alert_level()
{
    lcd_status_message_level = 0;
   1d8a0:	10 92 c0 03 	sts	0x03C0, r1	; 0x8003c0 <_ZL24lcd_status_message_level.lto_priv.422>
		case S::Restore:
			// clear any previous error for make _new_ errors visible
			lcd_reset_alert_level();

			// determine the next step in the required order
			if (!calibration_status_get(CALIBRATION_STATUS_SELFTEST)) {
   1d8a4:	81 e0       	ldi	r24, 0x01	; 1
   1d8a6:	0e 94 5b d7 	call	0x1aeb6	; 0x1aeb6 <calibration_status_get(unsigned char)>
				state = S::Selftest;
   1d8aa:	c2 e0       	ldi	r28, 0x02	; 2
		case S::Restore:
			// clear any previous error for make _new_ errors visible
			lcd_reset_alert_level();

			// determine the next step in the required order
			if (!calibration_status_get(CALIBRATION_STATUS_SELFTEST)) {
   1d8ac:	88 23       	and	r24, r24
   1d8ae:	09 f4       	brne	.+2      	; 0x1d8b2 <lcd_wizard(WizState)+0x12c>
   1d8b0:	85 cf       	rjmp	.-246    	; 0x1d7bc <lcd_wizard(WizState)+0x36>
				state = S::Selftest;
			} else if (!calibration_status_get(CALIBRATION_STATUS_XYZ)) {
   1d8b2:	82 e0       	ldi	r24, 0x02	; 2
   1d8b4:	0e 94 5b d7 	call	0x1aeb6	; 0x1aeb6 <calibration_status_get(unsigned char)>
				// S::Xyz *includes* S::Z so it needs to come before
				// to avoid repeating Z alignment
				state = S::Xyz;
   1d8b8:	c3 e0       	ldi	r28, 0x03	; 3
			lcd_reset_alert_level();

			// determine the next step in the required order
			if (!calibration_status_get(CALIBRATION_STATUS_SELFTEST)) {
				state = S::Selftest;
			} else if (!calibration_status_get(CALIBRATION_STATUS_XYZ)) {
   1d8ba:	88 23       	and	r24, r24
   1d8bc:	09 f4       	brne	.+2      	; 0x1d8c0 <lcd_wizard(WizState)+0x13a>
   1d8be:	7e cf       	rjmp	.-260    	; 0x1d7bc <lcd_wizard(WizState)+0x36>
				// S::Xyz *includes* S::Z so it needs to come before
				// to avoid repeating Z alignment
				state = S::Xyz;
			} else if (!calibration_status_get(CALIBRATION_STATUS_Z)) {
   1d8c0:	84 e0       	ldi	r24, 0x04	; 4
   1d8c2:	0e 94 5b d7 	call	0x1aeb6	; 0x1aeb6 <calibration_status_get(unsigned char)>
				state = S::Z;
   1d8c6:	c4 e0       	ldi	r28, 0x04	; 4
				state = S::Selftest;
			} else if (!calibration_status_get(CALIBRATION_STATUS_XYZ)) {
				// S::Xyz *includes* S::Z so it needs to come before
				// to avoid repeating Z alignment
				state = S::Xyz;
			} else if (!calibration_status_get(CALIBRATION_STATUS_Z)) {
   1d8c8:	88 23       	and	r24, r24
   1d8ca:	09 f4       	brne	.+2      	; 0x1d8ce <lcd_wizard(WizState)+0x148>
   1d8cc:	77 cf       	rjmp	.-274    	; 0x1d7bc <lcd_wizard(WizState)+0x36>
				state = S::Z;
#ifdef THERMAL_MODEL
			} else if (!calibration_status_get(CALIBRATION_STATUS_THERMAL_MODEL)) {
				state = S::ThermalModel;
#endif //THERMAL_MODEL
			} else if (!calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST)) {
   1d8ce:	80 e1       	ldi	r24, 0x10	; 16
   1d8d0:	0e 94 5b d7 	call	0x1aeb6	; 0x1aeb6 <calibration_status_get(unsigned char)>
				state = S::IsFil;
   1d8d4:	c5 e0       	ldi	r28, 0x05	; 5
				state = S::Z;
#ifdef THERMAL_MODEL
			} else if (!calibration_status_get(CALIBRATION_STATUS_THERMAL_MODEL)) {
				state = S::ThermalModel;
#endif //THERMAL_MODEL
			} else if (!calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST)) {
   1d8d6:	88 23       	and	r24, r24
   1d8d8:	09 f4       	brne	.+2      	; 0x1d8dc <lcd_wizard(WizState)+0x156>
   1d8da:	70 cf       	rjmp	.-288    	; 0x1d7bc <lcd_wizard(WizState)+0x36>
				state = S::IsFil;
			} else {
				// all required steps completed, finish successfully
				state = S::Finish;
   1d8dc:	cc e0       	ldi	r28, 0x0C	; 12
   1d8de:	6e cf       	rjmp	.-292    	; 0x1d7bc <lcd_wizard(WizState)+0x36>
			}
			break;
		case S::Selftest:
			lcd_show_fullscreen_message_and_wait_P(_T(MSG_WIZARD_SELFTEST));
   1d8e0:	83 e1       	ldi	r24, 0x13	; 19
   1d8e2:	93 e4       	ldi	r25, 0x43	; 67
   1d8e4:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d8e8:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
			wizard_event = lcd_selftest();
   1d8ec:	0e 94 b6 e0 	call	0x1c16c	; 0x1c16c <lcd_selftest()>
			state = (wizard_event ? S::Restore : S::Failed);
			break;
		case S::Xyz:
			lcd_show_fullscreen_message_and_wait_P(_T(MSG_WIZARD_XYZ_CAL));
			wizard_event = gcode_M45(false, 0);
			state = (wizard_event ? S::Restore : S::Failed);
   1d8f0:	81 11       	cpse	r24, r1
   1d8f2:	a6 cf       	rjmp	.-180    	; 0x1d840 <lcd_wizard(WizState)+0xba>
			}
			break;
		case S::Selftest:
			lcd_show_fullscreen_message_and_wait_P(_T(MSG_WIZARD_SELFTEST));
			wizard_event = lcd_selftest();
			state = (wizard_event ? S::Restore : S::Failed);
   1d8f4:	cd e0       	ldi	r28, 0x0D	; 13
   1d8f6:	62 cf       	rjmp	.-316    	; 0x1d7bc <lcd_wizard(WizState)+0x36>
			break;
		case S::Xyz:
			lcd_show_fullscreen_message_and_wait_P(_T(MSG_WIZARD_XYZ_CAL));
   1d8f8:	85 ed       	ldi	r24, 0xD5	; 213
   1d8fa:	92 e4       	ldi	r25, 0x42	; 66
   1d8fc:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d900:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
			wizard_event = gcode_M45(false, 0);
   1d904:	80 e0       	ldi	r24, 0x00	; 0
   1d906:	0f 94 1e 7d 	call	0x2fa3c	; 0x2fa3c <gcode_M45(bool, signed char) [clone .constprop.63]>
   1d90a:	f2 cf       	rjmp	.-28     	; 0x1d8f0 <lcd_wizard(WizState)+0x16a>
			state = (wizard_event ? S::Restore : S::Failed);
			break;
		case S::Z:
			lcd_show_fullscreen_message_and_wait_P(_T(MSG_REMOVE_SHIPPING_HELPERS));
   1d90c:	8d ea       	ldi	r24, 0xAD	; 173
   1d90e:	92 e4       	ldi	r25, 0x42	; 66
   1d910:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d914:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
			lcd_show_fullscreen_message_and_wait_P(_T(MSG_REMOVE_TEST_PRINT));
   1d918:	8f e7       	ldi	r24, 0x7F	; 127
   1d91a:	92 e4       	ldi	r25, 0x42	; 66
   1d91c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d920:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
			lcd_show_fullscreen_message_and_wait_P(_T(MSG_WIZARD_Z_CAL));
   1d924:	8f e5       	ldi	r24, 0x5F	; 95
   1d926:	92 e4       	ldi	r25, 0x42	; 66
   1d928:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d92c:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
			wizard_event = gcode_M45(true, 0);
   1d930:	81 e0       	ldi	r24, 0x01	; 1
   1d932:	0f 94 1e 7d 	call	0x2fa3c	; 0x2fa3c <gcode_M45(bool, signed char) [clone .constprop.63]>
			if (!wizard_event) {
   1d936:	88 23       	and	r24, r24
   1d938:	e9 f2       	breq	.-70     	; 0x1d8f4 <lcd_wizard(WizState)+0x16e>
				state = S::Failed;
			} else {
				raise_z_above(MIN_Z_FOR_SWAP);
   1d93a:	60 e0       	ldi	r22, 0x00	; 0
   1d93c:	70 e0       	ldi	r23, 0x00	; 0
   1d93e:	88 ed       	ldi	r24, 0xD8	; 216
   1d940:	91 e4       	ldi	r25, 0x41	; 65
   1d942:	0e 94 f6 6c 	call	0xd9ec	; 0xd9ec <raise_z_above(float)>
				if(!MMU2::mmu2.Enabled()) {
   1d946:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   1d94a:	81 30       	cpi	r24, 0x01	; 1
   1d94c:	09 f4       	brne	.+2      	; 0x1d950 <lcd_wizard(WizState)+0x1ca>
   1d94e:	78 cf       	rjmp	.-272    	; 0x1d840 <lcd_wizard(WizState)+0xba>
  return target_temperature_bed;
};

// Doesn't save FLASH when FORCE_INLINE removed.
FORCE_INLINE void setTargetHotend(const float &celsius) {
  target_temperature[0] = celsius;
   1d950:	d0 92 5e 12 	sts	0x125E, r13	; 0x80125e <target_temperature+0x1>
   1d954:	c0 92 5d 12 	sts	0x125D, r12	; 0x80125d <target_temperature>
					//current filament needs to be unloaded and then new filament should be loaded
					//start to preheat nozzle for unloading remaining PLA filament
					setTargetHotend(PLA_PREHEAT_HOTEND_TEMP);
					lcd_display_message_fullscreen_P(_T(MSG_WIZARD_WILL_PREHEAT));
   1d958:	8a e3       	ldi	r24, 0x3A	; 58
   1d95a:	92 e4       	ldi	r25, 0x42	; 66
   1d95c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d960:	0e 94 a9 e0 	call	0x1c152	; 0x1c152 <lcd_display_message_fullscreen_P(char const*)>
					wait_preheat();
   1d964:	0e 94 2a e4 	call	0x1c854	; 0x1c854 <wait_preheat()>
					unload_filament(FILAMENTCHANGE_FINALRETRACT); // unload current filament
   1d968:	60 e0       	ldi	r22, 0x00	; 0
   1d96a:	70 e0       	ldi	r23, 0x00	; 0
   1d96c:	cb 01       	movw	r24, r22
   1d96e:	0e 94 7e e3 	call	0x1c6fc	; 0x1c6fc <unload_filament(float)>
					lcd_wizard_load(); // load filament
   1d972:	0e 94 9b eb 	call	0x1d736	; 0x1d736 <lcd_wizard_load()>
   1d976:	10 92 5e 12 	sts	0x125E, r1	; 0x80125e <target_temperature+0x1>
   1d97a:	10 92 5d 12 	sts	0x125D, r1	; 0x80125d <target_temperature>
   1d97e:	60 cf       	rjmp	.-320    	; 0x1d840 <lcd_wizard(WizState)+0xba>
   1d980:	d0 92 5e 12 	sts	0x125E, r13	; 0x80125e <target_temperature+0x1>
   1d984:	c0 92 5d 12 	sts	0x125D, r12	; 0x80125d <target_temperature>
  resetPID(0);
};

FORCE_INLINE void setTargetBed(const float &celsius) {
  target_temperature_bed = celsius;
   1d988:	b0 92 5a 12 	sts	0x125A, r11	; 0x80125a <target_temperature_bed+0x1>
   1d98c:	a0 92 59 12 	sts	0x1259, r10	; 0x801259 <target_temperature_bed>
#endif //THERMAL_MODEL
		case S::IsFil:
		    //start to preheat nozzle and bed to save some time later
			setTargetHotend(PLA_PREHEAT_HOTEND_TEMP);
			setTargetBed(PLA_PREHEAT_HPB_TEMP);
			wizard_event = lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_FILAMENT_LOADED), false, LCD_MIDDLE_BUTTON_CHOICE);
   1d990:	84 e2       	ldi	r24, 0x24	; 36
   1d992:	92 e4       	ldi	r25, 0x42	; 66
   1d994:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d998:	41 e0       	ldi	r20, 0x01	; 1
   1d99a:	60 e0       	ldi	r22, 0x00	; 0
   1d99c:	0e 94 b2 e8 	call	0x1d164	; 0x1d164 <lcd_show_multiscreen_message_yes_no_and_wait_P(char const*, bool, unsigned char)>
			if (wizard_event == LCD_LEFT_BUTTON_CHOICE) {
   1d9a0:	88 23       	and	r24, r24
   1d9a2:	09 f1       	breq	.+66     	; 0x1d9e6 <lcd_wizard(WizState)+0x260>
				state = S::Lay1CalCold;
			} else { // MIDDLE_BUTTON_CHOICE
			    if(MMU2::mmu2.Enabled()) state = S::LoadFilCold;
   1d9a4:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   1d9a8:	c7 e0       	ldi	r28, 0x07	; 7
   1d9aa:	81 30       	cpi	r24, 0x01	; 1
   1d9ac:	09 f4       	brne	.+2      	; 0x1d9b0 <lcd_wizard(WizState)+0x22a>
   1d9ae:	06 cf       	rjmp	.-500    	; 0x1d7bc <lcd_wizard(WizState)+0x36>
			    else state = S::Preheat;
   1d9b0:	c6 e0       	ldi	r28, 0x06	; 6
   1d9b2:	04 cf       	rjmp	.-504    	; 0x1d7bc <lcd_wizard(WizState)+0x36>
			}
			break;
		case S::Preheat:
			menu_goto(lcd_preheat_menu, 0, true);
   1d9b4:	20 e0       	ldi	r18, 0x00	; 0
   1d9b6:	41 e0       	ldi	r20, 0x01	; 1
   1d9b8:	70 e0       	ldi	r23, 0x00	; 0
   1d9ba:	60 e0       	ldi	r22, 0x00	; 0
   1d9bc:	86 e7       	ldi	r24, 0x76	; 118
   1d9be:	97 e3       	ldi	r25, 0x37	; 55
   1d9c0:	0e 94 b7 62 	call	0xc56e	; 0xc56e <menu_goto(void (*)(), int, bool, bool)>
		    lcd_show_fullscreen_message_and_wait_P(_T(MSG_SEL_PREHEAT_TEMP));
   1d9c4:	83 ee       	ldi	r24, 0xE3	; 227
   1d9c6:	91 e4       	ldi	r25, 0x41	; 65
   1d9c8:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1d9cc:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
	if (state != S::Run) eeprom_update_byte_notify((uint8_t*)EEPROM_WIZARD_ACTIVE, 1);

    FORCE_BL_ON_START;

    while (!end) {
		printf_P(PSTR("Wizard state: %d\n"), (uint8_t)state);
   1d9d0:	06 e0       	ldi	r16, 0x06	; 6
   1d9d2:	10 e0       	ldi	r17, 0x00	; 0
   1d9d4:	3f cf       	rjmp	.-386    	; 0x1d854 <lcd_wizard(WizState)+0xce>
			menu_goto(lcd_preheat_menu, 0, true);
		    lcd_show_fullscreen_message_and_wait_P(_T(MSG_SEL_PREHEAT_TEMP));
		    end = true; // Leave wizard temporarily for lcd_preheat_menu
		    break;
		case S::LoadFilHot:
		    wait_preheat();
   1d9d6:	0e 94 2a e4 	call	0x1c854	; 0x1c854 <wait_preheat()>
			lcd_wizard_load();
   1d9da:	0e 94 9b eb 	call	0x1d736	; 0x1d736 <lcd_wizard_load()>
			state = S::Lay1CalHot;
   1d9de:	ca e0       	ldi	r28, 0x0A	; 10
   1d9e0:	ed ce       	rjmp	.-550    	; 0x1d7bc <lcd_wizard(WizState)+0x36>
			break;
        case S::LoadFilCold:
            lcd_wizard_load();
   1d9e2:	0e 94 9b eb 	call	0x1d736	; 0x1d736 <lcd_wizard_load()>
		case S::RepeatLay1Cal:
			wizard_event = lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_WIZARD_REPEAT_V2_CAL), false);
			if (wizard_event == LCD_LEFT_BUTTON_CHOICE)
			{
				lcd_show_fullscreen_message_and_wait_P(_T(MSG_WIZARD_CLEAN_HEATBED));
				state = S::Lay1CalCold;
   1d9e6:	c9 e0       	ldi	r28, 0x09	; 9
   1d9e8:	e9 ce       	rjmp	.-558    	; 0x1d7bc <lcd_wizard(WizState)+0x36>
        case S::LoadFilCold:
            lcd_wizard_load();
            state = S::Lay1CalCold;
            break;
		case S::Lay1CalCold:
            wizard_lay1cal_message(true);
   1d9ea:	81 e0       	ldi	r24, 0x01	; 1
   1d9ec:	0e 94 7d eb 	call	0x1d6fa	; 0x1d6fa <wizard_lay1cal_message(bool)>
			menu_goto(lcd_v2_calibration, 0, true);
   1d9f0:	20 e0       	ldi	r18, 0x00	; 0
   1d9f2:	41 e0       	ldi	r20, 0x01	; 1
   1d9f4:	70 e0       	ldi	r23, 0x00	; 0
   1d9f6:	60 e0       	ldi	r22, 0x00	; 0
   1d9f8:	86 e9       	ldi	r24, 0x96	; 150
   1d9fa:	99 ee       	ldi	r25, 0xE9	; 233
   1d9fc:	0e 94 b7 62 	call	0xc56e	; 0xc56e <menu_goto(void (*)(), int, bool, bool)>
	if (state != S::Run) eeprom_update_byte_notify((uint8_t*)EEPROM_WIZARD_ACTIVE, 1);

    FORCE_BL_ON_START;

    while (!end) {
		printf_P(PSTR("Wizard state: %d\n"), (uint8_t)state);
   1da00:	09 e0       	ldi	r16, 0x09	; 9
   1da02:	10 e0       	ldi	r17, 0x00	; 0
   1da04:	27 cf       	rjmp	.-434    	; 0x1d854 <lcd_wizard(WizState)+0xce>
            wizard_lay1cal_message(true);
			menu_goto(lcd_v2_calibration, 0, true);
			end = true; // Leave wizard temporarily for lcd_v2_calibration
			break;
        case S::Lay1CalHot:
            wizard_lay1cal_message(false);
   1da06:	80 e0       	ldi	r24, 0x00	; 0
   1da08:	0e 94 7d eb 	call	0x1d6fa	; 0x1d6fa <wizard_lay1cal_message(bool)>
            lcd_commands_type = LcdCommands::Layer1Cal;
   1da0c:	84 e0       	ldi	r24, 0x04	; 4
   1da0e:	80 93 5e 0d 	sts	0x0D5E, r24	; 0x800d5e <lcd_commands_type>
	if (state != S::Run) eeprom_update_byte_notify((uint8_t*)EEPROM_WIZARD_ACTIVE, 1);

    FORCE_BL_ON_START;

    while (!end) {
		printf_P(PSTR("Wizard state: %d\n"), (uint8_t)state);
   1da12:	0a e0       	ldi	r16, 0x0A	; 10
   1da14:	10 e0       	ldi	r17, 0x00	; 0
   1da16:	1e cf       	rjmp	.-452    	; 0x1d854 <lcd_wizard(WizState)+0xce>
            wizard_lay1cal_message(false);
            lcd_commands_type = LcdCommands::Layer1Cal;
            end = true; // Leave wizard temporarily for lcd_v2_calibration
            break;
		case S::RepeatLay1Cal:
			wizard_event = lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_WIZARD_REPEAT_V2_CAL), false);
   1da18:	80 e9       	ldi	r24, 0x90	; 144
   1da1a:	91 e4       	ldi	r25, 0x41	; 65
   1da1c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1da20:	41 e0       	ldi	r20, 0x01	; 1
   1da22:	60 e0       	ldi	r22, 0x00	; 0
   1da24:	0e 94 b2 e8 	call	0x1d164	; 0x1d164 <lcd_show_multiscreen_message_yes_no_and_wait_P(char const*, bool, unsigned char)>
			if (wizard_event == LCD_LEFT_BUTTON_CHOICE)
   1da28:	81 11       	cpse	r24, r1
   1da2a:	07 c0       	rjmp	.+14     	; 0x1da3a <lcd_wizard(WizState)+0x2b4>
			{
				lcd_show_fullscreen_message_and_wait_P(_T(MSG_WIZARD_CLEAN_HEATBED));
   1da2c:	80 e6       	ldi	r24, 0x60	; 96
   1da2e:	91 e4       	ldi	r25, 0x41	; 65
   1da30:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1da34:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
   1da38:	d6 cf       	rjmp	.-84     	; 0x1d9e6 <lcd_wizard(WizState)+0x260>
				state = S::Lay1CalCold;
			}
			else
			{
				lcd_show_fullscreen_message_and_wait_P(_T(MSG_ADDITIONAL_SHEETS));
   1da3a:	8a ef       	ldi	r24, 0xFA	; 250
   1da3c:	90 e4       	ldi	r25, 0x40	; 64
   1da3e:	ec ce       	rjmp	.-552    	; 0x1d818 <lcd_wizard(WizState)+0x92>
   1da40:	60 e0       	ldi	r22, 0x00	; 0
   1da42:	8f e5       	ldi	r24, 0x5F	; 95
   1da44:	9f e0       	ldi	r25, 0x0F	; 15
   1da46:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
   1da4a:	04 cf       	rjmp	.-504    	; 0x1d854 <lcd_wizard(WizState)+0xce>
		msg = _T(MSG_WIZARD_QUIT);
		break;

	case S::Finish:
		// we are successfully finished
		msg = _T(MSG_WIZARD_DONE);
   1da4c:	8c e9       	ldi	r24, 0x9C	; 156
   1da4e:	90 e4       	ldi	r25, 0x40	; 64
   1da50:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1da54:	8c 01       	movw	r16, r24
    lcd_setalertstatus_(message, severity, true);
}

void lcd_reset_alert_level()
{
    lcd_status_message_level = 0;
   1da56:	10 92 c0 03 	sts	0x03C0, r1	; 0x8003c0 <_ZL24lcd_status_message_level.lto_priv.422>

	case S::Finish:
		// we are successfully finished
		msg = _T(MSG_WIZARD_DONE);
		lcd_reset_alert_level();
		lcd_setstatuspgm(MSG_WELCOME);
   1da5a:	86 ee       	ldi	r24, 0xE6	; 230
   1da5c:	9b e6       	ldi	r25, 0x6B	; 107
   1da5e:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
		lcd_return_to_status();
   1da62:	0f 94 d5 07 	call	0x20faa	; 0x20faa <lcd_return_to_status()>

	default:
		// exiting for later re-entry
		break;
	}
	if (msg) {
   1da66:	01 15       	cp	r16, r1
   1da68:	11 05       	cpc	r17, r1
   1da6a:	09 f4       	brne	.+2      	; 0x1da6e <lcd_wizard(WizState)+0x2e8>
   1da6c:	0a cf       	rjmp	.-492    	; 0x1d882 <lcd_wizard(WizState)+0xfc>
		lcd_show_fullscreen_message_and_wait_P(msg);
   1da6e:	c8 01       	movw	r24, r16
   1da70:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
   1da74:	06 cf       	rjmp	.-500    	; 0x1d882 <lcd_wizard(WizState)+0xfc>
		lcd_return_to_status();
		break;

	case S::Failed:
		// aborted due to failure
		msg = _T(MSG_WIZARD_CALIBRATION_FAILED);
   1da76:	8a e3       	ldi	r24, 0x3A	; 58
   1da78:	90 e4       	ldi	r25, 0x40	; 64
   1da7a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1da7e:	8c 01       	movw	r16, r24
   1da80:	f2 cf       	rjmp	.-28     	; 0x1da66 <lcd_wizard(WizState)+0x2e0>

0001da82 <main>:

void setupUSB() __attribute__((weak));
void setupUSB() { }

int main(void)
{
   1da82:	cf 93       	push	r28
   1da84:	df 93       	push	r29
   1da86:	00 d0       	rcall	.+0      	; 0x1da88 <main+0x6>
   1da88:	00 d0       	rcall	.+0      	; 0x1da8a <main+0x8>
   1da8a:	00 d0       	rcall	.+0      	; 0x1da8c <main+0xa>
   1da8c:	1f 92       	push	r1
   1da8e:	cd b7       	in	r28, 0x3d	; 61
   1da90:	de b7       	in	r29, 0x3e	; 62

void init()
{
	// this needs to be called before setup() or some functions won't
	// work there
	sei();
   1da92:	78 94       	sei
	
	// on the ATmega168, timer 0 is also used for fast hardware pwm
	// (using phase-correct PWM would mean that timer 0 overflowed half as often
	// resulting in different millis() behavior on the ATmega8 and ATmega168)
#if defined(TCCR0A) && defined(WGM01)
	sbi(TCCR0A, WGM01);
   1da94:	84 b5       	in	r24, 0x24	; 36
   1da96:	82 60       	ori	r24, 0x02	; 2
   1da98:	84 bd       	out	0x24, r24	; 36
	sbi(TCCR0A, WGM00);
   1da9a:	84 b5       	in	r24, 0x24	; 36
   1da9c:	81 60       	ori	r24, 0x01	; 1
   1da9e:	84 bd       	out	0x24, r24	; 36
	// this combination is for the standard atmega8
	sbi(TCCR0, CS01);
	sbi(TCCR0, CS00);
#elif defined(TCCR0B) && defined(CS01) && defined(CS00)
	// this combination is for the standard 168/328/1280/2560
	sbi(TCCR0B, CS01);
   1daa0:	85 b5       	in	r24, 0x25	; 37
   1daa2:	82 60       	ori	r24, 0x02	; 2
   1daa4:	85 bd       	out	0x25, r24	; 37
	sbi(TCCR0B, CS00);
   1daa6:	85 b5       	in	r24, 0x25	; 37
   1daa8:	81 60       	ori	r24, 0x01	; 1
   1daaa:	85 bd       	out	0x25, r24	; 37

	// enable timer 0 overflow interrupt
#if defined(TIMSK) && defined(TOIE0)
	sbi(TIMSK, TOIE0);
#elif defined(TIMSK0) && defined(TOIE0)
	sbi(TIMSK0, TOIE0);
   1daac:	80 91 6e 00 	lds	r24, 0x006E	; 0x80006e <__TEXT_REGION_LENGTH__+0x7c206e>
   1dab0:	81 60       	ori	r24, 0x01	; 1
   1dab2:	80 93 6e 00 	sts	0x006E, r24	; 0x80006e <__TEXT_REGION_LENGTH__+0x7c206e>
	// this is better for motors as it ensures an even waveform
	// note, however, that fast pwm mode can achieve a frequency of up
	// 8 MHz (with a 16 MHz clock) at 50% duty cycle

#if defined(TCCR1B) && defined(CS11) && defined(CS10)
	TCCR1B = 0;
   1dab6:	10 92 81 00 	sts	0x0081, r1	; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081>

	// set timer 1 prescale factor to 64
	sbi(TCCR1B, CS11);
   1daba:	80 91 81 00 	lds	r24, 0x0081	; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081>
   1dabe:	82 60       	ori	r24, 0x02	; 2
   1dac0:	80 93 81 00 	sts	0x0081, r24	; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081>
#if F_CPU >= 8000000L
	sbi(TCCR1B, CS10);
   1dac4:	80 91 81 00 	lds	r24, 0x0081	; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081>
   1dac8:	81 60       	ori	r24, 0x01	; 1
   1daca:	80 93 81 00 	sts	0x0081, r24	; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081>
	sbi(TCCR1, CS10);
#endif
#endif
	// put timer 1 in 8-bit phase correct pwm mode
#if defined(TCCR1A) && defined(WGM10)
	sbi(TCCR1A, WGM10);
   1dace:	80 91 80 00 	lds	r24, 0x0080	; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080>
   1dad2:	81 60       	ori	r24, 0x01	; 1
   1dad4:	80 93 80 00 	sts	0x0080, r24	; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080>

	// set timer 2 prescale factor to 64
#if defined(TCCR2) && defined(CS22)
	sbi(TCCR2, CS22);
#elif defined(TCCR2B) && defined(CS22)
	sbi(TCCR2B, CS22);
   1dad8:	80 91 b1 00 	lds	r24, 0x00B1	; 0x8000b1 <__TEXT_REGION_LENGTH__+0x7c20b1>
   1dadc:	84 60       	ori	r24, 0x04	; 4
   1dade:	80 93 b1 00 	sts	0x00B1, r24	; 0x8000b1 <__TEXT_REGION_LENGTH__+0x7c20b1>

	// configure timer 2 for phase correct pwm (8-bit)
#if defined(TCCR2) && defined(WGM20)
	sbi(TCCR2, WGM20);
#elif defined(TCCR2A) && defined(WGM20)
	sbi(TCCR2A, WGM20);
   1dae2:	80 91 b0 00 	lds	r24, 0x00B0	; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0>
   1dae6:	81 60       	ori	r24, 0x01	; 1
   1dae8:	80 93 b0 00 	sts	0x00B0, r24	; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0>
//#else
	// Timer 2 not finished (may not be present on this CPU)
#endif

#if defined(TCCR3B) && defined(CS31) && defined(WGM30)
	sbi(TCCR3B, CS31);		// set timer 3 prescale factor to 64
   1daec:	80 91 91 00 	lds	r24, 0x0091	; 0x800091 <__TEXT_REGION_LENGTH__+0x7c2091>
   1daf0:	82 60       	ori	r24, 0x02	; 2
   1daf2:	80 93 91 00 	sts	0x0091, r24	; 0x800091 <__TEXT_REGION_LENGTH__+0x7c2091>
	sbi(TCCR3B, CS30);
   1daf6:	80 91 91 00 	lds	r24, 0x0091	; 0x800091 <__TEXT_REGION_LENGTH__+0x7c2091>
   1dafa:	81 60       	ori	r24, 0x01	; 1
   1dafc:	80 93 91 00 	sts	0x0091, r24	; 0x800091 <__TEXT_REGION_LENGTH__+0x7c2091>
	sbi(TCCR3A, WGM30);		// put timer 3 in 8-bit phase correct pwm mode
   1db00:	80 91 90 00 	lds	r24, 0x0090	; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090>
   1db04:	81 60       	ori	r24, 0x01	; 1
   1db06:	80 93 90 00 	sts	0x0090, r24	; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090>
	sbi(TCCR4D, WGM40);		// put timer 4 in phase- and frequency-correct PWM mode	
	sbi(TCCR4A, PWM4A);		// enable PWM mode for comparator OCR4A
	sbi(TCCR4C, PWM4D);		// enable PWM mode for comparator OCR4D
#else /* beginning of timer4 block for ATMEGA1280 and ATMEGA2560 */
#if defined(TCCR4B) && defined(CS41) && defined(WGM40)
	sbi(TCCR4B, CS41);		// set timer 4 prescale factor to 64
   1db0a:	80 91 a1 00 	lds	r24, 0x00A1	; 0x8000a1 <__TEXT_REGION_LENGTH__+0x7c20a1>
   1db0e:	82 60       	ori	r24, 0x02	; 2
   1db10:	80 93 a1 00 	sts	0x00A1, r24	; 0x8000a1 <__TEXT_REGION_LENGTH__+0x7c20a1>
	sbi(TCCR4B, CS40);
   1db14:	80 91 a1 00 	lds	r24, 0x00A1	; 0x8000a1 <__TEXT_REGION_LENGTH__+0x7c20a1>
   1db18:	81 60       	ori	r24, 0x01	; 1
   1db1a:	80 93 a1 00 	sts	0x00A1, r24	; 0x8000a1 <__TEXT_REGION_LENGTH__+0x7c20a1>
	sbi(TCCR4A, WGM40);		// put timer 4 in 8-bit phase correct pwm mode
   1db1e:	80 91 a0 00 	lds	r24, 0x00A0	; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0>
   1db22:	81 60       	ori	r24, 0x01	; 1
   1db24:	80 93 a0 00 	sts	0x00A0, r24	; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0>
#endif
#endif /* end timer4 block for ATMEGA1280/2560 and similar */	

#if defined(TCCR5B) && defined(CS51) && defined(WGM50)
	sbi(TCCR5B, CS51);		// set timer 5 prescale factor to 64
   1db28:	80 91 21 01 	lds	r24, 0x0121	; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121>
   1db2c:	82 60       	ori	r24, 0x02	; 2
   1db2e:	80 93 21 01 	sts	0x0121, r24	; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121>
	sbi(TCCR5B, CS50);
   1db32:	80 91 21 01 	lds	r24, 0x0121	; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121>
   1db36:	81 60       	ori	r24, 0x01	; 1
   1db38:	80 93 21 01 	sts	0x0121, r24	; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121>
	sbi(TCCR5A, WGM50);		// put timer 5 in 8-bit phase correct pwm mode
   1db3c:	80 91 20 01 	lds	r24, 0x0120	; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120>
   1db40:	81 60       	ori	r24, 0x01	; 1
   1db42:	80 93 20 01 	sts	0x0120, r24	; 0x800120 <__TEXT_REGION_LENGTH__+0x7c2120>
#endif

#if defined(ADCSRA)
	// set a2d prescaler so we are inside the desired 50-200 KHz range.
	#if F_CPU >= 16000000 // 16 MHz / 128 = 125 KHz
		sbi(ADCSRA, ADPS2);
   1db46:	80 91 7a 00 	lds	r24, 0x007A	; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a>
   1db4a:	84 60       	ori	r24, 0x04	; 4
   1db4c:	80 93 7a 00 	sts	0x007A, r24	; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a>
		sbi(ADCSRA, ADPS1);
   1db50:	80 91 7a 00 	lds	r24, 0x007A	; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a>
   1db54:	82 60       	ori	r24, 0x02	; 2
   1db56:	80 93 7a 00 	sts	0x007A, r24	; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a>
		sbi(ADCSRA, ADPS0);
   1db5a:	80 91 7a 00 	lds	r24, 0x007A	; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a>
   1db5e:	81 60       	ori	r24, 0x01	; 1
   1db60:	80 93 7a 00 	sts	0x007A, r24	; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a>
		cbi(ADCSRA, ADPS2);
		cbi(ADCSRA, ADPS1);
		sbi(ADCSRA, ADPS0);
	#endif
	// enable a2d conversions
	sbi(ADCSRA, ADEN);
   1db64:	80 91 7a 00 	lds	r24, 0x007A	; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a>
   1db68:	80 68       	ori	r24, 0x80	; 128
   1db6a:	80 93 7a 00 	sts	0x007A, r24	; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a>
	// here so they can be used as normal digital i/o; they will be
	// reconnected in Serial.begin()
#if defined(UCSRB)
	UCSRB = 0;
#elif defined(UCSR0B)
	UCSR0B = 0;
   1db6e:	10 92 c1 00 	sts	0x00C1, r1	; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7c20c1>
    // after the program starts since there's no danger in doing this.
    // The reason for this is because old bootloaders might not handle the watchdog timer at all,
    // leaving it enabled when jumping to the program. This could cause another watchdog reset
    // during setup() if not handled properly. So to avoid any issue of this kind, stop the
    // watchdog timer manually.
    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
   1db72:	9f b7       	in	r25, 0x3f	; 63
    return 1;
}

static __inline__ uint8_t __iCliRetVal(void)
{
    cli();
   1db74:	f8 94       	cli
      wdt_reset();
   1db76:	a8 95       	wdr
      MCUSR &= ~_BV(WDRF);
   1db78:	84 b7       	in	r24, 0x34	; 52
   1db7a:	87 7f       	andi	r24, 0xF7	; 247
   1db7c:	84 bf       	out	0x34, r24	; 52
				"out __SREG__,__tmp_reg__"   "\n\t"
				: [TEMPREG] "=d" (temp_reg)
				: [WDTREG]  "n"  (_SFR_MEM_ADDR(_WD_CONTROL_REG)),
				[WDCE_WDE]  "n"  ((uint8_t)(_BV(_WD_CHANGE_BIT) | _BV(WDE)))
				: "r0"
		);
   1db7e:	0f b6       	in	r0, 0x3f	; 63
   1db80:	f8 94       	cli
   1db82:	a8 95       	wdr
   1db84:	80 91 60 00 	lds	r24, 0x0060	; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060>
   1db88:	88 61       	ori	r24, 0x18	; 24
   1db8a:	80 93 60 00 	sts	0x0060, r24	; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060>
   1db8e:	10 92 60 00 	sts	0x0060, r1	; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060>
   1db92:	0f be       	out	0x3f, r0	; 63
    (void)__s;
}

static __inline__ void __iRestore(const  uint8_t *__s)
{
    SREG = *__s;
   1db94:	9f bf       	out	0x3f, r25	; 63
	CRITICAL_SECTION_END;
}

void timer2_init(void)
{
	CRITICAL_SECTION_START;
   1db96:	9f b7       	in	r25, 0x3f	; 63
   1db98:	f8 94       	cli

	// Everything, that used to be on timer0 was moved to timer2 (delay, beeping, millis etc.)
	//setup timer2
	TCCR2A = 0x00; //COM_A-B=00, WGM_0-1=00
   1db9a:	10 92 b0 00 	sts	0x00B0, r1	; 0x8000b0 <__TEXT_REGION_LENGTH__+0x7c20b0>
	TCCR2B = (4 << CS20); //WGM_2=0, CS_0-2=011
   1db9e:	84 e0       	ldi	r24, 0x04	; 4
   1dba0:	80 93 b1 00 	sts	0x00B1, r24	; 0x8000b1 <__TEXT_REGION_LENGTH__+0x7c20b1>
	//mask timer2 interrupts - enable OVF, disable others
	TIMSK2 |= (1<<TOIE2);
   1dba4:	80 91 70 00 	lds	r24, 0x0070	; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070>
   1dba8:	81 60       	ori	r24, 0x01	; 1
   1dbaa:	80 93 70 00 	sts	0x0070, r24	; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070>
	TIMSK2 &= ~(1<<OCIE2A);
   1dbae:	80 91 70 00 	lds	r24, 0x0070	; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070>
   1dbb2:	8d 7f       	andi	r24, 0xFD	; 253
   1dbb4:	80 93 70 00 	sts	0x0070, r24	; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070>
	TIMSK2 &= ~(1<<OCIE2B);
   1dbb8:	80 91 70 00 	lds	r24, 0x0070	; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070>
   1dbbc:	8b 7f       	andi	r24, 0xFB	; 251
   1dbbe:	80 93 70 00 	sts	0x0070, r24	; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070>
	//set timer2 OCR registers (OCRB interrupt generated 0.5ms after OVF interrupt)
	OCR2A = 0;
   1dbc2:	10 92 b3 00 	sts	0x00B3, r1	; 0x8000b3 <__TEXT_REGION_LENGTH__+0x7c20b3>

	CRITICAL_SECTION_END;
   1dbc6:	9f bf       	out	0x3f, r25	; 63
	return 0;
}

void lcd_init(void)
{
	WRITE(LCD_PINS_ENABLE,LOW);
   1dbc8:	5b 98       	cbi	0x0b, 3	; 11
	SET_OUTPUT(LCD_PINS_RS);
   1dbca:	55 9a       	sbi	0x0a, 5	; 10
	SET_OUTPUT(LCD_PINS_ENABLE);
   1dbcc:	53 9a       	sbi	0x0a, 3	; 10
	SET_OUTPUT(LCD_PINS_D0);
	SET_OUTPUT(LCD_PINS_D1);
	SET_OUTPUT(LCD_PINS_D2);
	SET_OUTPUT(LCD_PINS_D3);
#endif
	SET_OUTPUT(LCD_PINS_D4);
   1dbce:	52 9a       	sbi	0x0a, 2	; 10
	SET_OUTPUT(LCD_PINS_D5);
   1dbd0:	9c 9a       	sbi	0x13, 4	; 19
	SET_OUTPUT(LCD_PINS_D6);
   1dbd2:	80 91 01 01 	lds	r24, 0x0101	; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101>
   1dbd6:	80 68       	ori	r24, 0x80	; 128
   1dbd8:	80 93 01 01 	sts	0x0101, r24	; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101>
	SET_OUTPUT(LCD_PINS_D7);
   1dbdc:	9b 9a       	sbi	0x13, 3	; 19

#ifdef LCD_8BIT
	lcd_displayfunction |= LCD_8BITMODE;
#endif
	lcd_displayfunction |= LCD_2LINE;
   1dbde:	80 91 00 04 	lds	r24, 0x0400	; 0x800400 <_ZL19lcd_displayfunction.lto_priv.513>
   1dbe2:	88 60       	ori	r24, 0x08	; 8
   1dbe4:	80 93 00 04 	sts	0x0400, r24	; 0x800400 <_ZL19lcd_displayfunction.lto_priv.513>
   1dbe8:	2f ef       	ldi	r18, 0xFF	; 255
   1dbea:	30 e7       	ldi	r19, 0x70	; 112
   1dbec:	82 e0       	ldi	r24, 0x02	; 2
   1dbee:	21 50       	subi	r18, 0x01	; 1
   1dbf0:	30 40       	sbci	r19, 0x00	; 0
   1dbf2:	80 40       	sbci	r24, 0x00	; 0
   1dbf4:	e1 f7       	brne	.-8      	; 0x1dbee <main+0x16c>
   1dbf6:	00 c0       	rjmp	.+0      	; 0x1dbf8 <main+0x176>
   1dbf8:	00 00       	nop
	_delay_us(50000);
	lcd_begin(1); //first time init
   1dbfa:	81 e0       	ldi	r24, 0x01	; 1
   1dbfc:	0e 94 5e 70 	call	0xe0bc	; 0xe0bc <lcd_begin(unsigned char) [clone .lto_priv.405]>
	fdev_setup_stream(lcdout, lcd_putchar, NULL, _FDEV_SETUP_WRITE); //setup lcdout stream
   1dc00:	8b e6       	ldi	r24, 0x6B	; 107
   1dc02:	93 e7       	ldi	r25, 0x73	; 115
   1dc04:	90 93 fb 03 	sts	0x03FB, r25	; 0x8003fb <_lcdout+0x9>
   1dc08:	80 93 fa 03 	sts	0x03FA, r24	; 0x8003fa <_lcdout+0x8>
   1dc0c:	10 92 fd 03 	sts	0x03FD, r1	; 0x8003fd <_lcdout+0xb>
   1dc10:	10 92 fc 03 	sts	0x03FC, r1	; 0x8003fc <_lcdout+0xa>
   1dc14:	12 e0       	ldi	r17, 0x02	; 2
   1dc16:	10 93 f5 03 	sts	0x03F5, r17	; 0x8003f5 <_lcdout+0x3>
   1dc1a:	10 92 ff 03 	sts	0x03FF, r1	; 0x8003ff <_lcdout+0xd>
   1dc1e:	10 92 fe 03 	sts	0x03FE, r1	; 0x8003fe <_lcdout+0xc>

void ultralcd_init()
{
    backlight_init();
	lcd_init();
	lcd_refresh();
   1dc22:	0e 94 9f 70 	call	0xe13e	; 0xe13e <lcd_refresh()>
	lcd_longpress_func = menu_lcd_longpress_func;
   1dc26:	8b e6       	ldi	r24, 0x6B	; 107
   1dc28:	98 ec       	ldi	r25, 0xC8	; 200
   1dc2a:	90 93 07 04 	sts	0x0407, r25	; 0x800407 <lcd_longpress_func+0x1>
   1dc2e:	80 93 06 04 	sts	0x0406, r24	; 0x800406 <lcd_longpress_func>
	lcd_lcdupdate_func = menu_lcd_lcdupdate_func;
   1dc32:	88 ec       	ldi	r24, 0xC8	; 200
   1dc34:	9a ef       	ldi	r25, 0xFA	; 250
   1dc36:	90 93 05 04 	sts	0x0405, r25	; 0x800405 <lcd_lcdupdate_func+0x1>
   1dc3a:	80 93 04 04 	sts	0x0404, r24	; 0x800404 <lcd_lcdupdate_func>
	menu_menu = lcd_status_screen;
   1dc3e:	80 e2       	ldi	r24, 0x20	; 32
   1dc40:	97 e3       	ldi	r25, 0x37	; 55
   1dc42:	90 93 03 04 	sts	0x0403, r25	; 0x800403 <menu_menu+0x1>
   1dc46:	80 93 02 04 	sts	0x0402, r24	; 0x800402 <menu_menu>

  SET_INPUT(BTN_EN1);
   1dc4a:	80 91 04 01 	lds	r24, 0x0104	; 0x800104 <__TEXT_REGION_LENGTH__+0x7c2104>
   1dc4e:	8b 7f       	andi	r24, 0xFB	; 251
   1dc50:	80 93 04 01 	sts	0x0104, r24	; 0x800104 <__TEXT_REGION_LENGTH__+0x7c2104>
  SET_INPUT(BTN_EN2);
   1dc54:	80 91 04 01 	lds	r24, 0x0104	; 0x800104 <__TEXT_REGION_LENGTH__+0x7c2104>
   1dc58:	8d 7f       	andi	r24, 0xFD	; 253
   1dc5a:	80 93 04 01 	sts	0x0104, r24	; 0x800104 <__TEXT_REGION_LENGTH__+0x7c2104>
  WRITE(BTN_EN1, HIGH);
   1dc5e:	9f b7       	in	r25, 0x3f	; 63
   1dc60:	f8 94       	cli
   1dc62:	80 91 05 01 	lds	r24, 0x0105	; 0x800105 <__TEXT_REGION_LENGTH__+0x7c2105>
   1dc66:	84 60       	ori	r24, 0x04	; 4
   1dc68:	80 93 05 01 	sts	0x0105, r24	; 0x800105 <__TEXT_REGION_LENGTH__+0x7c2105>
   1dc6c:	9f bf       	out	0x3f, r25	; 63
  WRITE(BTN_EN2, HIGH);
   1dc6e:	9f b7       	in	r25, 0x3f	; 63
   1dc70:	f8 94       	cli
   1dc72:	80 91 05 01 	lds	r24, 0x0105	; 0x800105 <__TEXT_REGION_LENGTH__+0x7c2105>
   1dc76:	82 60       	ori	r24, 0x02	; 2
   1dc78:	80 93 05 01 	sts	0x0105, r24	; 0x800105 <__TEXT_REGION_LENGTH__+0x7c2105>
   1dc7c:	9f bf       	out	0x3f, r25	; 63
#if BTN_ENC > 0
  SET_INPUT(BTN_ENC);
   1dc7e:	80 91 01 01 	lds	r24, 0x0101	; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101>
   1dc82:	8f 7b       	andi	r24, 0xBF	; 191
   1dc84:	80 93 01 01 	sts	0x0101, r24	; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101>
  WRITE(BTN_ENC, HIGH);
   1dc88:	9f b7       	in	r25, 0x3f	; 63
   1dc8a:	f8 94       	cli
   1dc8c:	80 91 02 01 	lds	r24, 0x0102	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   1dc90:	80 64       	ori	r24, 0x40	; 64
   1dc92:	80 93 02 01 	sts	0x0102, r24	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   1dc96:	9f bf       	out	0x3f, r25	; 63
#endif

#if defined (SDSUPPORT) && defined(SDCARDDETECT) && (SDCARDDETECT > 0)
  SET_INPUT(SDCARDDETECT);
   1dc98:	80 91 04 01 	lds	r24, 0x0104	; 0x800104 <__TEXT_REGION_LENGTH__+0x7c2104>
   1dc9c:	8e 7f       	andi	r24, 0xFE	; 254
   1dc9e:	80 93 04 01 	sts	0x0104, r24	; 0x800104 <__TEXT_REGION_LENGTH__+0x7c2104>
  WRITE(SDCARDDETECT, HIGH);
   1dca2:	9f b7       	in	r25, 0x3f	; 63
   1dca4:	f8 94       	cli
   1dca6:	80 91 05 01 	lds	r24, 0x0105	; 0x800105 <__TEXT_REGION_LENGTH__+0x7c2105>
   1dcaa:	81 60       	ori	r24, 0x01	; 1
   1dcac:	80 93 05 01 	sts	0x0105, r24	; 0x800105 <__TEXT_REGION_LENGTH__+0x7c2105>
   1dcb0:	9f bf       	out	0x3f, r25	; 63
	#else
		//round up by default
		__ticks_dc = (uint32_t)(ceil(fabs(__tmp)));
	#endif

	__builtin_avr_delay_cycles(__ticks_dc);
   1dcb2:	af e9       	ldi	r26, 0x9F	; 159
   1dcb4:	bf e0       	ldi	r27, 0x0F	; 15
   1dcb6:	11 97       	sbiw	r26, 0x01	; 1
   1dcb8:	f1 f7       	brne	.-4      	; 0x1dcb6 <main+0x234>
   1dcba:	00 c0       	rjmp	.+0      	; 0x1dcbc <main+0x23a>
   1dcbc:	00 00       	nop
  _delay_ms(1); //wait for the pullups to raise the line
  lcd_oldcardstatus = IS_SD_INSERTED;
   1dcbe:	80 91 03 01 	lds	r24, 0x0103	; 0x800103 <__TEXT_REGION_LENGTH__+0x7c2103>
   1dcc2:	80 95       	com	r24
   1dcc4:	81 70       	andi	r24, 0x01	; 1
   1dcc6:	80 93 01 04 	sts	0x0401, r24	; 0x800401 <lcd_oldcardstatus>
#endif//(SDCARDDETECT > 0)

  // Initialise status line
  strncpy_P(lcd_status_message, MSG_WELCOME, LCD_WIDTH);
   1dcca:	44 e1       	ldi	r20, 0x14	; 20
   1dccc:	50 e0       	ldi	r21, 0x00	; 0
   1dcce:	66 ee       	ldi	r22, 0xE6	; 230
   1dcd0:	7b e6       	ldi	r23, 0x6B	; 107
   1dcd2:	85 e6       	ldi	r24, 0x65	; 101
   1dcd4:	94 e0       	ldi	r25, 0x04	; 4
   1dcd6:	0f 94 cd a1 	call	0x3439a	; 0x3439a <strncpy_P>
extern "C" {
#endif //defined(__cplusplus)

static inline void spi_init()
{
	DDRB &= ~((1 << DD_SCK) | (1 << DD_MOSI) | (1 << DD_MISO));
   1dcda:	84 b1       	in	r24, 0x04	; 4
   1dcdc:	81 7f       	andi	r24, 0xF1	; 241
   1dcde:	84 b9       	out	0x04, r24	; 4
	DDRB |= (1 << DD_SS) | (1 << DD_SCK) | (1 << DD_MOSI);
   1dce0:	84 b1       	in	r24, 0x04	; 4
   1dce2:	87 60       	ori	r24, 0x07	; 7
   1dce4:	84 b9       	out	0x04, r24	; 4
	PORTB &= ~((1 << DD_SCK) | (1 << DD_MOSI) | (1 << DD_MISO));
   1dce6:	85 b1       	in	r24, 0x05	; 5
   1dce8:	81 7f       	andi	r24, 0xF1	; 241
   1dcea:	85 b9       	out	0x05, r24	; 5
	PORTB |= (1 << DD_SS);
   1dcec:	28 9a       	sbi	0x05, 0	; 5
	SPCR = SPI_SPCR(0, 0, 0, 1, 0); //SPE=1, MSTR=1 (0x50)
   1dcee:	80 e5       	ldi	r24, 0x50	; 80
   1dcf0:	8c bd       	out	0x2c, r24	; 44
	SPSR = 0x00;
   1dcf2:	1d bc       	out	0x2d, r1	; 45
}


void lcd_splash()
{
	lcd_clear(); // clears display and homes screen
   1dcf4:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
	lcd_printf_P(PSTR("\n Original Prusa i3\n   Prusa Research\n%20.20S"), PSTR(FW_VERSION));
   1dcf8:	80 e8       	ldi	r24, 0x80	; 128
   1dcfa:	96 e8       	ldi	r25, 0x86	; 134
   1dcfc:	9f 93       	push	r25
   1dcfe:	8f 93       	push	r24
   1dd00:	87 e8       	ldi	r24, 0x87	; 135
   1dd02:	96 e8       	ldi	r25, 0x86	; 134
   1dd04:	9f 93       	push	r25
   1dd06:	8f 93       	push	r24
   1dd08:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
static void Sound_DoSound_Encoder_Move(void);
static void Sound_DoSound_Blind_Alert(void);

void Sound_Init(void)
{
     SET_OUTPUT(BEEPER);
   1dd0c:	80 91 01 01 	lds	r24, 0x0101	; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101>
   1dd10:	84 60       	ori	r24, 0x04	; 4
   1dd12:	80 93 01 01 	sts	0x0101, r24	; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101>
     eSoundMode = static_cast<eSOUND_MODE>(eeprom_init_default_byte((uint8_t*)EEPROM_SOUND_MODE, e_SOUND_MODE_DEFAULT));
   1dd16:	60 e0       	ldi	r22, 0x00	; 0
   1dd18:	87 ed       	ldi	r24, 0xD7	; 215
   1dd1a:	9e e0       	ldi	r25, 0x0E	; 14
   1dd1c:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
   1dd20:	80 93 47 04 	sts	0x0447, r24	; 0x800447 <eSoundMode>
	spi_init();

	lcd_splash();
    Sound_Init();                                // also guarantee "SET_OUTPUT(BEEPER)"

  selectedSerialPort = eeprom_init_default_byte((uint8_t *)EEPROM_SECOND_SERIAL_ACTIVE, 0);
   1dd24:	60 e0       	ldi	r22, 0x00	; 0
   1dd26:	88 e0       	ldi	r24, 0x08	; 8
   1dd28:	9f e0       	ldi	r25, 0x0F	; 15
   1dd2a:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
   1dd2e:	80 93 1c 06 	sts	0x061C, r24	; 0x80061c <selectedSerialPort>
	MYSERIAL.begin(BAUDRATE);
   1dd32:	0f 94 fb 8f 	call	0x31ff6	; 0x31ff6 <MarlinSerial::begin(long) [clone .constprop.57]>
	fdev_setup_stream(uartout, uart_putchar, NULL, _FDEV_SETUP_WRITE); //setup uart out stream
   1dd36:	8f eb       	ldi	r24, 0xBF	; 191
   1dd38:	9a e7       	ldi	r25, 0x7A	; 122
   1dd3a:	90 93 59 04 	sts	0x0459, r25	; 0x800459 <_uartout+0x9>
   1dd3e:	80 93 58 04 	sts	0x0458, r24	; 0x800458 <_uartout+0x8>
   1dd42:	10 92 5b 04 	sts	0x045B, r1	; 0x80045b <_uartout+0xb>
   1dd46:	10 92 5a 04 	sts	0x045A, r1	; 0x80045a <_uartout+0xa>
   1dd4a:	10 93 53 04 	sts	0x0453, r17	; 0x800453 <_uartout+0x3>
   1dd4e:	10 92 5d 04 	sts	0x045D, r1	; 0x80045d <_uartout+0xd>
   1dd52:	10 92 5c 04 	sts	0x045C, r1	; 0x80045c <_uartout+0xc>
	stdout = uartout;
   1dd56:	80 e5       	ldi	r24, 0x50	; 80
   1dd58:	94 e0       	ldi	r25, 0x04	; 4
   1dd5a:	90 93 14 17 	sts	0x1714, r25	; 0x801714 <__iob+0x3>
   1dd5e:	80 93 13 17 	sts	0x1713, r24	; 0x801713 <__iob+0x2>
void prusa_statistics_update_from_lcd_update() {
    lcd_send_status();
}

void farm_mode_init() {
    farm_mode = eeprom_init_default_byte((uint8_t*)EEPROM_FARM_MODE, 0);
   1dd62:	60 e0       	ldi	r22, 0x00	; 0
   1dd64:	84 ec       	ldi	r24, 0xC4	; 196
   1dd66:	9f e0       	ldi	r25, 0x0F	; 15
   1dd68:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
   1dd6c:	80 93 60 0d 	sts	0x0D60, r24	; 0x800d60 <farm_mode>
    if (farm_mode) {
   1dd70:	0f 90       	pop	r0
   1dd72:	0f 90       	pop	r0
   1dd74:	0f 90       	pop	r0
   1dd76:	0f 90       	pop	r0
   1dd78:	88 23       	and	r24, r24
   1dd7a:	79 f0       	breq	.+30     	; 0x1dd9a <main+0x318>
        no_response = true; //we need confirmation by recieving PRUSA thx
   1dd7c:	81 e0       	ldi	r24, 0x01	; 1
   1dd7e:	80 93 08 04 	sts	0x0408, r24	; 0x800408 <_ZL11no_response.lto_priv.493>
        prusa_statistics(8);
   1dd82:	88 e0       	ldi	r24, 0x08	; 8
   1dd84:	0f 94 79 32 	call	0x264f2	; 0x264f2 <prusa_statistics(unsigned char)>
#ifdef HAS_SECOND_SERIAL_PORT
        selectedSerialPort = 1;
#endif //HAS_SECOND_SERIAL_PORT
        MYSERIAL.begin(BAUDRATE);
   1dd88:	0f 94 fb 8f 	call	0x31ff6	; 0x31ff6 <MarlinSerial::begin(long) [clone .constprop.57]>
        fsensor.deinit();
    }
}

void Filament_sensor::setAutoLoadEnabled(bool state, bool updateEEPROM) {
    autoLoadEnabled = state;
   1dd8c:	10 92 f2 16 	sts	0x16F2, r1	; 0x8016f2 <fsensor+0x1>
   1dd90:	61 e0       	ldi	r22, 0x01	; 1
   1dd92:	87 e8       	ldi	r24, 0x87	; 135
   1dd94:	9f e0       	ldi	r25, 0x0F	; 15
   1dd96:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
    }
#endif //PRUSA_SN_SUPPORT


#ifndef XFLASH
	SERIAL_PROTOCOLLNPGM("start");
   1dd9a:	88 e7       	ldi	r24, 0x78	; 120
   1dd9c:	97 e8       	ldi	r25, 0x87	; 135
   1dd9e:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
#else
	if ((optiboot_status != 0) || (selectedSerialPort != 0))
		SERIAL_PROTOCOLLNPGM("start");
#endif
	SERIAL_ECHO_START;
   1dda2:	8e ec       	ldi	r24, 0xCE	; 206
   1dda4:	91 ea       	ldi	r25, 0xA1	; 161
   1dda6:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
	puts_P(PSTR(" " FW_VERSION_FULL "_" FW_COMMIT_HASH));
   1ddaa:	81 e6       	ldi	r24, 0x61	; 97
   1ddac:	97 e8       	ldi	r25, 0x87	; 135
   1ddae:	0f 94 c9 a2 	call	0x34592	; 0x34592 <puts_P>

	// by default the MMU shall remain disabled - PFW-1418
	if (eeprom_init_default_byte((uint8_t *)EEPROM_MMU_ENABLED, 0)) {
   1ddb2:	60 e0       	ldi	r22, 0x00	; 0
   1ddb4:	8c ea       	ldi	r24, 0xAC	; 172
   1ddb6:	9c e0       	ldi	r25, 0x0C	; 12
   1ddb8:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
   1ddbc:	81 11       	cpse	r24, r1
		MMU2::mmu2.Start();
   1ddbe:	0f 94 80 95 	call	0x32b00	; 0x32b00 <MMU2::MMU2::Start() [clone .constprop.178]>
	}
	MMU2::mmu2.Status();
   1ddc2:	0f 94 ad 65 	call	0x2cb5a	; 0x2cb5a <MMU2::MMU2::Status() [clone .constprop.340]>
}

void SpoolJoin::initSpoolJoinStatus()
{
    // Useful information to see during bootup
    SERIAL_ECHOPGM("SpoolJoin is ");
   1ddc6:	85 eb       	ldi	r24, 0xB5	; 181
   1ddc8:	96 e8       	ldi	r25, 0x86	; 134
   1ddca:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    uint8_t status = eeprom_init_default_byte((uint8_t*)EEPROM_SPOOL_JOIN, (uint8_t)EEPROM::Disabled);
   1ddce:	62 e0       	ldi	r22, 0x02	; 2
   1ddd0:	86 ed       	ldi	r24, 0xD6	; 214
   1ddd2:	9e e0       	ldi	r25, 0x0E	; 14
   1ddd4:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
    if (status == (uint8_t)EEPROM::Enabled)
   1ddd8:	81 30       	cpi	r24, 0x01	; 1
   1ddda:	09 f0       	breq	.+2      	; 0x1ddde <main+0x35c>
   1dddc:	74 c0       	rjmp	.+232    	; 0x1dec6 <main+0x444>
    {
        SERIAL_ECHOLNRPGM(_O(MSG_ON));
   1ddde:	8c e9       	ldi	r24, 0x9C	; 156
   1dde0:	92 e6       	ldi	r25, 0x62	; 98
    } else {
        SERIAL_ECHOLNRPGM(_O(MSG_OFF));
   1dde2:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
#endif

#endif //DEBUG_SEC_LANG

	// Check startup - does nothing if bootloader sets MCUSR to 0
	byte mcu = MCUSR;
   1dde6:	14 b7       	in	r17, 0x34	; 52
/*	if (mcu & 1) SERIAL_ECHOLNRPGM(MSG_POWERUP);
	if (mcu & 2) SERIAL_ECHOLNRPGM(MSG_EXTERNAL_RESET);
	if (mcu & 4) SERIAL_ECHOLNRPGM(MSG_BROWNOUT_RESET);
	if (mcu & 8) SERIAL_ECHOLNRPGM(MSG_WATCHDOG_RESET);
	if (mcu & 32) SERIAL_ECHOLNRPGM(MSG_SOFTWARE_RESET);*/
	if (mcu & 1) puts_P(MSG_POWERUP);
   1dde8:	10 ff       	sbrs	r17, 0
   1ddea:	04 c0       	rjmp	.+8      	; 0x1ddf4 <main+0x372>
   1ddec:	80 ec       	ldi	r24, 0xC0	; 192
   1ddee:	99 e6       	ldi	r25, 0x69	; 105
   1ddf0:	0f 94 c9 a2 	call	0x34592	; 0x34592 <puts_P>
	if (mcu & 2) puts_P(MSG_EXTERNAL_RESET);
   1ddf4:	11 ff       	sbrs	r17, 1
   1ddf6:	04 c0       	rjmp	.+8      	; 0x1de00 <main+0x37e>
   1ddf8:	80 eb       	ldi	r24, 0xB0	; 176
   1ddfa:	99 e6       	ldi	r25, 0x69	; 105
   1ddfc:	0f 94 c9 a2 	call	0x34592	; 0x34592 <puts_P>
	if (mcu & 4) puts_P(MSG_BROWNOUT_RESET);
   1de00:	12 ff       	sbrs	r17, 2
   1de02:	04 c0       	rjmp	.+8      	; 0x1de0c <main+0x38a>
   1de04:	8f e9       	ldi	r24, 0x9F	; 159
   1de06:	99 e6       	ldi	r25, 0x69	; 105
   1de08:	0f 94 c9 a2 	call	0x34592	; 0x34592 <puts_P>
	if (mcu & 8) puts_P(MSG_WATCHDOG_RESET);
   1de0c:	13 ff       	sbrs	r17, 3
   1de0e:	04 c0       	rjmp	.+8      	; 0x1de18 <main+0x396>
   1de10:	8f e8       	ldi	r24, 0x8F	; 143
   1de12:	99 e6       	ldi	r25, 0x69	; 105
   1de14:	0f 94 c9 a2 	call	0x34592	; 0x34592 <puts_P>
	if (mcu & 32) puts_P(MSG_SOFTWARE_RESET);
   1de18:	15 ff       	sbrs	r17, 5
   1de1a:	04 c0       	rjmp	.+8      	; 0x1de24 <main+0x3a2>
   1de1c:	8f e7       	ldi	r24, 0x7F	; 127
   1de1e:	99 e6       	ldi	r25, 0x69	; 105
   1de20:	0f 94 c9 a2 	call	0x34592	; 0x34592 <puts_P>
	MCUSR = 0;
   1de24:	14 be       	out	0x34, r1	; 52
	//SERIAL_ECHORPGM(MSG_MARLIN);
	//SERIAL_ECHOLNRPGM(VERSION_STRING);

#ifdef STRING_VERSION_CONFIG_H
#ifdef STRING_CONFIG_H_AUTHOR
	SERIAL_ECHO_START;
   1de26:	8e ec       	ldi	r24, 0xCE	; 206
   1de28:	91 ea       	ldi	r25, 0xA1	; 161
   1de2a:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
	SERIAL_ECHORPGM(_n(" Last Updated: "));////MSG_CONFIGURATION_VER
   1de2e:	8f e6       	ldi	r24, 0x6F	; 111
   1de30:	99 e6       	ldi	r25, 0x69	; 105
   1de32:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
	SERIAL_ECHOPGM(STRING_VERSION_CONFIG_H);
   1de36:	8d e4       	ldi	r24, 0x4D	; 77
   1de38:	97 e8       	ldi	r25, 0x87	; 135
   1de3a:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
	SERIAL_ECHORPGM(_n(" | Author: "));////MSG_AUTHOR
   1de3e:	83 e6       	ldi	r24, 0x63	; 99
   1de40:	99 e6       	ldi	r25, 0x69	; 105
   1de42:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
	SERIAL_ECHOLNPGM(STRING_CONFIG_H_AUTHOR);
   1de46:	85 e4       	ldi	r24, 0x45	; 69
   1de48:	97 e8       	ldi	r25, 0x87	; 135
   1de4a:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
#endif
#endif

	SERIAL_ECHO_START;
   1de4e:	8e ec       	ldi	r24, 0xCE	; 206
   1de50:	91 ea       	ldi	r25, 0xA1	; 161
   1de52:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
	SERIAL_ECHORPGM(_n(" Free Memory: "));////MSG_FREE_MEMORY
   1de56:	84 e5       	ldi	r24, 0x54	; 84
   1de58:	99 e6       	ldi	r25, 0x69	; 105
   1de5a:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
/** Amount of free RAM
 * \return The number of free bytes.
 */
int SdFatUtil::FreeRam() {
  char top;
  return __brkval ? &top - __brkval : &top - &__bss_end;
   1de5e:	80 91 0d 17 	lds	r24, 0x170D	; 0x80170d <__brkval>
   1de62:	90 91 0e 17 	lds	r25, 0x170E	; 0x80170e <__brkval+0x1>
   1de66:	fe 01       	movw	r30, r28
   1de68:	31 96       	adiw	r30, 0x01	; 1
   1de6a:	7f 01       	movw	r14, r30
   1de6c:	bf 01       	movw	r22, r30
   1de6e:	00 97       	sbiw	r24, 0x00	; 0
   1de70:	69 f1       	breq	.+90     	; 0x1decc <main+0x44a>
   1de72:	68 1b       	sub	r22, r24
   1de74:	79 0b       	sbc	r23, r25
  print((unsigned long) b, base);
}

void MarlinSerial::print(int n, int base)
{
  print((long) n, base);
   1de76:	07 2e       	mov	r0, r23
   1de78:	00 0c       	add	r0, r0
   1de7a:	88 0b       	sbc	r24, r24
   1de7c:	99 0b       	sbc	r25, r25
   1de7e:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
	SERIAL_ECHO(freeMemory());
	SERIAL_ECHORPGM(_n("  PlannerBufferBytes: "));////MSG_PLANNER_BUFFER_BYTES
   1de82:	8d e3       	ldi	r24, 0x3D	; 61
   1de84:	99 e6       	ldi	r25, 0x69	; 105
   1de86:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
	SERIAL_ECHOLN((int)sizeof(block_t)*BLOCK_BUFFER_SIZE);
   1de8a:	80 ee       	ldi	r24, 0xE0	; 224
   1de8c:	96 e0       	ldi	r25, 0x06	; 6
   1de8e:	0f 94 bf 65 	call	0x2cb7e	; 0x2cb7e <MarlinSerial::println(int, int) [clone .constprop.319]>
#endif //defined(FILAMENT_SENSOR) && defined(FSENSOR_PROBING)

uint8_t check_printer_version()
{
	uint8_t version_changed = 0;
	uint16_t printer_type = eeprom_init_default_word((uint16_t*)EEPROM_PRINTER_TYPE, PRINTER_TYPE);
   1de92:	6a ef       	ldi	r22, 0xFA	; 250
   1de94:	70 e0       	ldi	r23, 0x00	; 0
   1de96:	8e ee       	ldi	r24, 0xEE	; 238
   1de98:	9e e0       	ldi	r25, 0x0E	; 14
   1de9a:	0e 94 45 78 	call	0xf08a	; 0xf08a <eeprom_init_default_word(unsigned int*, unsigned int)>
   1de9e:	8c 01       	movw	r16, r24
	uint16_t motherboard = eeprom_init_default_word((uint16_t*)EEPROM_BOARD_TYPE, MOTHERBOARD);
   1dea0:	6b ec       	ldi	r22, 0xCB	; 203
   1dea2:	70 e0       	ldi	r23, 0x00	; 0
   1dea4:	8c ee       	ldi	r24, 0xEC	; 236
   1dea6:	9e e0       	ldi	r25, 0x0E	; 14
   1dea8:	0e 94 45 78 	call	0xf08a	; 0xf08a <eeprom_init_default_word(unsigned int*, unsigned int)>

	if (printer_type != PRINTER_TYPE) version_changed |= 0b10;
   1deac:	0a 3f       	cpi	r16, 0xFA	; 250
   1deae:	11 05       	cpc	r17, r1
   1deb0:	09 f0       	breq	.+2      	; 0x1deb4 <main+0x432>
   1deb2:	2c c6       	rjmp	.+3160   	; 0x1eb0c <main+0x108a>
	if (motherboard != MOTHERBOARD) version_changed |= 0b01;
   1deb4:	01 e0       	ldi	r16, 0x01	; 1
   1deb6:	8b 3c       	cpi	r24, 0xCB	; 203
   1deb8:	91 05       	cpc	r25, r1
   1deba:	09 f4       	brne	.+2      	; 0x1debe <main+0x43c>
   1debc:	00 e0       	ldi	r16, 0x00	; 0
	// loads data from EEPROM if available else uses defaults (and resets step acceleration rate)

	bool previous_settings_retrieved = false;
	uint8_t hw_changed = check_printer_version();
	if (!(hw_changed & 0b10)) { //if printer version wasn't changed, check for eeprom version and retrieve settings from eeprom in case that version wasn't changed
		previous_settings_retrieved = Config_RetrieveSettings();
   1debe:	0e 94 04 87 	call	0x10e08	; 0x10e08 <Config_RetrieveSettings()>
   1dec2:	b8 2e       	mov	r11, r24
   1dec4:	2b c6       	rjmp	.+3158   	; 0x1eb1c <main+0x109a>
   1dec6:	86 e9       	ldi	r24, 0x96	; 150
   1dec8:	92 e6       	ldi	r25, 0x62	; 98
   1deca:	8b cf       	rjmp	.-234    	; 0x1dde2 <main+0x360>
   1decc:	67 51       	subi	r22, 0x17	; 23
   1dece:	77 41       	sbci	r23, 0x17	; 23
   1ded0:	d2 cf       	rjmp	.-92     	; 0x1de76 <main+0x3f4>
    minttemp_raw[0] -= OVERSAMPLENR;
#endif
  }
#endif //MINTEMP
#ifdef HEATER_0_MAXTEMP
  maxttemp[0] = HEATER_0_MAXTEMP;
   1ded2:	81 e3       	ldi	r24, 0x31	; 49
   1ded4:	91 e0       	ldi	r25, 0x01	; 1
   1ded6:	90 93 55 02 	sts	0x0255, r25	; 0x800255 <_ZL8maxttemp.lto_priv.436+0x1>
   1deda:	80 93 54 02 	sts	0x0254, r24	; 0x800254 <_ZL8maxttemp.lto_priv.436>
  while(analog2temp(maxttemp_raw[0], 0) > HEATER_0_MAXTEMP) {
   1dede:	80 91 0b 04 	lds	r24, 0x040B	; 0x80040b <_ZL12maxttemp_raw.lto_priv.430>
   1dee2:	90 91 0c 04 	lds	r25, 0x040C	; 0x80040c <_ZL12maxttemp_raw.lto_priv.430+0x1>
   1dee6:	0f 94 66 8f 	call	0x31ecc	; 0x31ecc <analog2temp(int, unsigned char) [clone .constprop.59]>
   1deea:	20 e0       	ldi	r18, 0x00	; 0
   1deec:	30 e8       	ldi	r19, 0x80	; 128
   1deee:	48 e9       	ldi	r20, 0x98	; 152
   1def0:	53 e4       	ldi	r21, 0x43	; 67
   1def2:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   1def6:	18 16       	cp	r1, r24
   1def8:	54 f4       	brge	.+20     	; 0x1df0e <main+0x48c>
#if HEATER_0_RAW_LO_TEMP < HEATER_0_RAW_HI_TEMP
    maxttemp_raw[0] -= OVERSAMPLENR;
#else
    maxttemp_raw[0] += OVERSAMPLENR;
   1defa:	80 91 0b 04 	lds	r24, 0x040B	; 0x80040b <_ZL12maxttemp_raw.lto_priv.430>
   1defe:	90 91 0c 04 	lds	r25, 0x040C	; 0x80040c <_ZL12maxttemp_raw.lto_priv.430+0x1>
   1df02:	40 96       	adiw	r24, 0x10	; 16
   1df04:	90 93 0c 04 	sts	0x040C, r25	; 0x80040c <_ZL12maxttemp_raw.lto_priv.430+0x1>
   1df08:	80 93 0b 04 	sts	0x040B, r24	; 0x80040b <_ZL12maxttemp_raw.lto_priv.430>
   1df0c:	e8 cf       	rjmp	.-48     	; 0x1dede <main+0x45c>
#endif
  }
#endif //MAXTEMP

#ifdef BED_MINTEMP
  while(analog2tempBed(bed_minttemp_raw) < BED_MINTEMP) {
   1df0e:	80 91 50 02 	lds	r24, 0x0250	; 0x800250 <_ZL16bed_minttemp_raw.lto_priv.428>
   1df12:	90 91 51 02 	lds	r25, 0x0251	; 0x800251 <_ZL16bed_minttemp_raw.lto_priv.428+0x1>
   1df16:	0f 94 c2 14 	call	0x22984	; 0x22984 <analog2tempBed(int) [clone .lto_priv.404]>
   1df1a:	20 e0       	ldi	r18, 0x00	; 0
   1df1c:	30 e0       	ldi	r19, 0x00	; 0
   1df1e:	40 ef       	ldi	r20, 0xF0	; 240
   1df20:	51 e4       	ldi	r21, 0x41	; 65
   1df22:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   1df26:	87 ff       	sbrs	r24, 7
   1df28:	0a c0       	rjmp	.+20     	; 0x1df3e <main+0x4bc>
#if HEATER_BED_RAW_LO_TEMP < HEATER_BED_RAW_HI_TEMP
    bed_minttemp_raw += OVERSAMPLENR;
#else
    bed_minttemp_raw -= OVERSAMPLENR;
   1df2a:	80 91 50 02 	lds	r24, 0x0250	; 0x800250 <_ZL16bed_minttemp_raw.lto_priv.428>
   1df2e:	90 91 51 02 	lds	r25, 0x0251	; 0x800251 <_ZL16bed_minttemp_raw.lto_priv.428+0x1>
   1df32:	40 97       	sbiw	r24, 0x10	; 16
   1df34:	90 93 51 02 	sts	0x0251, r25	; 0x800251 <_ZL16bed_minttemp_raw.lto_priv.428+0x1>
   1df38:	80 93 50 02 	sts	0x0250, r24	; 0x800250 <_ZL16bed_minttemp_raw.lto_priv.428>
   1df3c:	e8 cf       	rjmp	.-48     	; 0x1df0e <main+0x48c>
#endif
  }
#endif //BED_MINTEMP
#ifdef BED_MAXTEMP
  while(analog2tempBed(bed_maxttemp_raw) > BED_MAXTEMP) {
   1df3e:	80 91 09 04 	lds	r24, 0x0409	; 0x800409 <_ZL16bed_maxttemp_raw.lto_priv.431>
   1df42:	90 91 0a 04 	lds	r25, 0x040A	; 0x80040a <_ZL16bed_maxttemp_raw.lto_priv.431+0x1>
   1df46:	0f 94 c2 14 	call	0x22984	; 0x22984 <analog2tempBed(int) [clone .lto_priv.404]>
   1df4a:	20 e0       	ldi	r18, 0x00	; 0
   1df4c:	30 e0       	ldi	r19, 0x00	; 0
   1df4e:	4a ef       	ldi	r20, 0xFA	; 250
   1df50:	52 e4       	ldi	r21, 0x42	; 66
   1df52:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   1df56:	18 16       	cp	r1, r24
   1df58:	54 f4       	brge	.+20     	; 0x1df6e <main+0x4ec>
#if HEATER_BED_RAW_LO_TEMP < HEATER_BED_RAW_HI_TEMP
    bed_maxttemp_raw -= OVERSAMPLENR;
#else
    bed_maxttemp_raw += OVERSAMPLENR;
   1df5a:	80 91 09 04 	lds	r24, 0x0409	; 0x800409 <_ZL16bed_maxttemp_raw.lto_priv.431>
   1df5e:	90 91 0a 04 	lds	r25, 0x040A	; 0x80040a <_ZL16bed_maxttemp_raw.lto_priv.431+0x1>
   1df62:	40 96       	adiw	r24, 0x10	; 16
   1df64:	90 93 0a 04 	sts	0x040A, r25	; 0x80040a <_ZL16bed_maxttemp_raw.lto_priv.431+0x1>
   1df68:	80 93 09 04 	sts	0x0409, r24	; 0x800409 <_ZL16bed_maxttemp_raw.lto_priv.431>
   1df6c:	e8 cf       	rjmp	.-48     	; 0x1df3e <main+0x4bc>
#include <avr/interrupt.h>
#include "macros.h"

void timer0_init(void)
{
	CRITICAL_SECTION_START;
   1df6e:	9f b7       	in	r25, 0x3f	; 63
   1df70:	f8 94       	cli

	TCNT0  = 0;
   1df72:	16 bc       	out	0x26, r1	; 38
	// Fast PWM duty (0-255).
	// Due to invert mode (following rows) the duty is set to 255, which means zero all the time (bed not heating)
	OCR0B = 255;
   1df74:	8f ef       	ldi	r24, 0xFF	; 255
   1df76:	88 bd       	out	0x28, r24	; 40
	// Set fast PWM mode and inverting mode.
	TCCR0A = (1 << WGM01) | (1 << WGM00) | (1 << COM0B1) | (1 << COM0B0);
   1df78:	83 e3       	ldi	r24, 0x33	; 51
   1df7a:	84 bd       	out	0x24, r24	; 36
	TCCR0B = (1 << CS01);    // CLK/8 prescaling
   1df7c:	12 e0       	ldi	r17, 0x02	; 2
   1df7e:	15 bd       	out	0x25, r17	; 37
	TIMSK0 |= (1 << TOIE0);  // enable timer overflow interrupt
   1df80:	80 91 6e 00 	lds	r24, 0x006E	; 0x80006e <__TEXT_REGION_LENGTH__+0x7c206e>
   1df84:	81 60       	ori	r24, 0x01	; 1
   1df86:	80 93 6e 00 	sts	0x006E, r24	; 0x80006e <__TEXT_REGION_LENGTH__+0x7c206e>

	CRITICAL_SECTION_END;
   1df8a:	9f bf       	out	0x3f, r25	; 63

  timer0_init(); //enables the heatbed timer.

  // timer2 already enabled earlier in the code
  // now enable the COMPB temperature interrupt
  OCR2B = 128;
   1df8c:	80 e8       	ldi	r24, 0x80	; 128
   1df8e:	80 93 b4 00 	sts	0x00B4, r24	; 0x8000b4 <__TEXT_REGION_LENGTH__+0x7c20b4>
  ENABLE_SOFT_PWM_INTERRUPT();
   1df92:	80 91 70 00 	lds	r24, 0x0070	; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070>
   1df96:	84 60       	ori	r24, 0x04	; 4
   1df98:	80 93 70 00 	sts	0x0070, r24	; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070>
#include "fastio.h"
#include "macros.h"

void timer4_init(void)
{
	CRITICAL_SECTION_START;
   1df9c:	2f b7       	in	r18, 0x3f	; 63
   1df9e:	f8 94       	cli

	SET_OUTPUT(BEEPER);
   1dfa0:	80 91 01 01 	lds	r24, 0x0101	; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101>
   1dfa4:	84 60       	ori	r24, 0x04	; 4
   1dfa6:	80 93 01 01 	sts	0x0101, r24	; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101>
	WRITE(BEEPER, LOW);
   1dfaa:	9f b7       	in	r25, 0x3f	; 63
   1dfac:	f8 94       	cli
   1dfae:	80 91 02 01 	lds	r24, 0x0102	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   1dfb2:	8b 7f       	andi	r24, 0xFB	; 251
   1dfb4:	80 93 02 01 	sts	0x0102, r24	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   1dfb8:	9f bf       	out	0x3f, r25	; 63

	SET_OUTPUT(EXTRUDER_0_AUTO_FAN_PIN);
   1dfba:	80 91 01 01 	lds	r24, 0x0101	; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101>
   1dfbe:	80 62       	ori	r24, 0x20	; 32
   1dfc0:	80 93 01 01 	sts	0x0101, r24	; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101>
	// Set timer mode 9 (PWM,Phase and Frequency Correct)
	// Prescaler is CLK/1024
	// Output compare is disabled on all timer pins
	// Input capture is disabled
	// All interrupts are disabled
	TCCR4A = _BV(WGM40);
   1dfc4:	81 e0       	ldi	r24, 0x01	; 1
   1dfc6:	80 93 a0 00 	sts	0x00A0, r24	; 0x8000a0 <__TEXT_REGION_LENGTH__+0x7c20a0>
	TCCR4B = _BV(WGM43) | _BV(CS42) | _BV(CS40);
   1dfca:	85 e1       	ldi	r24, 0x15	; 21
   1dfcc:	80 93 a1 00 	sts	0x00A1, r24	; 0x8000a1 <__TEXT_REGION_LENGTH__+0x7c20a1>
	OCR4A = 255U;
   1dfd0:	8f ef       	ldi	r24, 0xFF	; 255
   1dfd2:	90 e0       	ldi	r25, 0x00	; 0
   1dfd4:	90 93 a9 00 	sts	0x00A9, r25	; 0x8000a9 <__TEXT_REGION_LENGTH__+0x7c20a9>
   1dfd8:	80 93 a8 00 	sts	0x00A8, r24	; 0x8000a8 <__TEXT_REGION_LENGTH__+0x7c20a8>
	OCR4B = 255U;
   1dfdc:	90 93 ab 00 	sts	0x00AB, r25	; 0x8000ab <__TEXT_REGION_LENGTH__+0x7c20ab>
   1dfe0:	80 93 aa 00 	sts	0x00AA, r24	; 0x8000aa <__TEXT_REGION_LENGTH__+0x7c20aa>
	OCR4C = 255U;
   1dfe4:	90 93 ad 00 	sts	0x00AD, r25	; 0x8000ad <__TEXT_REGION_LENGTH__+0x7c20ad>
   1dfe8:	80 93 ac 00 	sts	0x00AC, r24	; 0x8000ac <__TEXT_REGION_LENGTH__+0x7c20ac>
	TIMSK4 = 0;
   1dfec:	10 92 72 00 	sts	0x0072, r1	; 0x800072 <__TEXT_REGION_LENGTH__+0x7c2072>

	CRITICAL_SECTION_END;
   1dff0:	2f bf       	out	0x3f, r18	; 63
static void adc_reset();
static void adc_setmux(uint8_t ch);

void adc_init()
{
	puts_P(PSTR("adc_init"));
   1dff2:	83 ec       	ldi	r24, 0xC3	; 195
   1dff4:	96 e8       	ldi	r25, 0x86	; 134
   1dff6:	0f 94 c9 a2 	call	0x34592	; 0x34592 <puts_P>
    DIDR0 = ((ADC_CHAN_MSK & ADC_DIDR_MSK) & 0xff); //disable digital inputs PORTF
   1dffa:	8f e5       	ldi	r24, 0x5F	; 95
   1dffc:	80 93 7e 00 	sts	0x007E, r24	; 0x80007e <__TEXT_REGION_LENGTH__+0x7c207e>
    DIDR2 = ((ADC_CHAN_MSK & ADC_DIDR_MSK) >> 8); //disable digital inputs PORTK
   1e000:	10 93 7d 00 	sts	0x007D, r17	; 0x80007d <__TEXT_REGION_LENGTH__+0x7c207d>
    ADMUX |= (1 << REFS0); //use AVCC as reference
   1e004:	80 91 7c 00 	lds	r24, 0x007C	; 0x80007c <__TEXT_REGION_LENGTH__+0x7c207c>
   1e008:	80 64       	ori	r24, 0x40	; 64
   1e00a:	80 93 7c 00 	sts	0x007C, r24	; 0x80007c <__TEXT_REGION_LENGTH__+0x7c207c>

    //enable ADC, set prescaler/128, enable interrupt
    ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0) | (1 << ADIF) | (1 << ADIE);
   1e00e:	8f e9       	ldi	r24, 0x9F	; 159
   1e010:	80 93 7a 00 	sts	0x007A, r24	; 0x80007a <__TEXT_REGION_LENGTH__+0x7c207a>

void temp_mgr_init()
{
    // initialize the ADC and start a conversion
    adc_init();
    adc_start_cycle();
   1e014:	0e 94 cf bc 	call	0x1799e	; 0x1799e <adc_start_cycle()>

    // initialize temperature timer
    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
   1e018:	9f b7       	in	r25, 0x3f	; 63
    return 1;
}

static __inline__ uint8_t __iCliRetVal(void)
{
    cli();
   1e01a:	f8 94       	cli

        // CTC
        TCCRxB &= ~(1<<WGMx3);
   1e01c:	80 91 91 00 	lds	r24, 0x0091	; 0x800091 <__TEXT_REGION_LENGTH__+0x7c2091>
   1e020:	8f 7e       	andi	r24, 0xEF	; 239
   1e022:	80 93 91 00 	sts	0x0091, r24	; 0x800091 <__TEXT_REGION_LENGTH__+0x7c2091>
        TCCRxB |=  (1<<WGMx2);
   1e026:	80 91 91 00 	lds	r24, 0x0091	; 0x800091 <__TEXT_REGION_LENGTH__+0x7c2091>
   1e02a:	88 60       	ori	r24, 0x08	; 8
   1e02c:	80 93 91 00 	sts	0x0091, r24	; 0x800091 <__TEXT_REGION_LENGTH__+0x7c2091>
        TCCRxA &= ~(1<<WGMx1);
   1e030:	80 91 90 00 	lds	r24, 0x0090	; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090>
   1e034:	8d 7f       	andi	r24, 0xFD	; 253
   1e036:	80 93 90 00 	sts	0x0090, r24	; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090>
        TCCRxA &= ~(1<<WGMx0);
   1e03a:	80 91 90 00 	lds	r24, 0x0090	; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090>
   1e03e:	8e 7f       	andi	r24, 0xFE	; 254
   1e040:	80 93 90 00 	sts	0x0090, r24	; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090>

        // output mode = 00 (disconnected)
        TCCRxA &= ~(3<<COMxA0);
   1e044:	80 91 90 00 	lds	r24, 0x0090	; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090>
   1e048:	8f 73       	andi	r24, 0x3F	; 63
   1e04a:	80 93 90 00 	sts	0x0090, r24	; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090>
        TCCRxA &= ~(3<<COMxB0);
   1e04e:	80 91 90 00 	lds	r24, 0x0090	; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090>
   1e052:	8f 7c       	andi	r24, 0xCF	; 207
   1e054:	80 93 90 00 	sts	0x0090, r24	; 0x800090 <__TEXT_REGION_LENGTH__+0x7c2090>

        // x/256 prescaler
        TCCRxB |=  (1<<CSx2);
   1e058:	80 91 91 00 	lds	r24, 0x0091	; 0x800091 <__TEXT_REGION_LENGTH__+0x7c2091>
   1e05c:	84 60       	ori	r24, 0x04	; 4
   1e05e:	80 93 91 00 	sts	0x0091, r24	; 0x800091 <__TEXT_REGION_LENGTH__+0x7c2091>
        TCCRxB &= ~(1<<CSx1);
   1e062:	80 91 91 00 	lds	r24, 0x0091	; 0x800091 <__TEXT_REGION_LENGTH__+0x7c2091>
   1e066:	8d 7f       	andi	r24, 0xFD	; 253
   1e068:	80 93 91 00 	sts	0x0091, r24	; 0x800091 <__TEXT_REGION_LENGTH__+0x7c2091>
        TCCRxB &= ~(1<<CSx0);
   1e06c:	80 91 91 00 	lds	r24, 0x0091	; 0x800091 <__TEXT_REGION_LENGTH__+0x7c2091>
   1e070:	8e 7f       	andi	r24, 0xFE	; 254
   1e072:	80 93 91 00 	sts	0x0091, r24	; 0x800091 <__TEXT_REGION_LENGTH__+0x7c2091>

        // reset counter
        TCNTx = 0;
   1e076:	10 92 95 00 	sts	0x0095, r1	; 0x800095 <__TEXT_REGION_LENGTH__+0x7c2095>
   1e07a:	10 92 94 00 	sts	0x0094, r1	; 0x800094 <__TEXT_REGION_LENGTH__+0x7c2094>
        OCRxA = TEMP_TIM_OCRA_OVF;
   1e07e:	2b ee       	ldi	r18, 0xEB	; 235
   1e080:	31 e4       	ldi	r19, 0x41	; 65
   1e082:	30 93 99 00 	sts	0x0099, r19	; 0x800099 <__TEXT_REGION_LENGTH__+0x7c2099>
   1e086:	20 93 98 00 	sts	0x0098, r18	; 0x800098 <__TEXT_REGION_LENGTH__+0x7c2098>

        // clear pending interrupts, enable COMPA
        TEMP_MGR_INT_FLAG_CLEAR();
   1e08a:	c1 9a       	sbi	0x18, 1	; 24
        ENABLE_TEMP_MGR_INTERRUPT();
   1e08c:	80 91 71 00 	lds	r24, 0x0071	; 0x800071 <__TEXT_REGION_LENGTH__+0x7c2071>
   1e090:	82 60       	ori	r24, 0x02	; 2
   1e092:	80 93 71 00 	sts	0x0071, r24	; 0x800071 <__TEXT_REGION_LENGTH__+0x7c2071>
    (void)__s;
}

static __inline__ void __iRestore(const  uint8_t *__s)
{
    SREG = *__s;
   1e096:	9f bf       	out	0x3f, r25	; 63

//    SERIAL_ECHOLNPGM("planner_recalculate - 4");
}

void plan_init() {
  block_buffer_head = 0;
   1e098:	10 92 3e 0d 	sts	0x0D3E, r1	; 0x800d3e <block_buffer_head>
  block_buffer_tail = 0;
   1e09c:	10 92 3f 0d 	sts	0x0D3F, r1	; 0x800d3f <block_buffer_tail>
  memset(position, 0, sizeof(position)); // clear position
   1e0a0:	80 e1       	ldi	r24, 0x10	; 16
   1e0a2:	ec e3       	ldi	r30, 0x3C	; 60
   1e0a4:	f6 e0       	ldi	r31, 0x06	; 6
   1e0a6:	df 01       	movw	r26, r30
   1e0a8:	28 2f       	mov	r18, r24
   1e0aa:	1d 92       	st	X+, r1
   1e0ac:	2a 95       	dec	r18
   1e0ae:	e9 f7       	brne	.-6      	; 0x1e0aa <main+0x628>
  #ifdef LIN_ADVANCE
  memset(position_float, 0, sizeof(position_float)); // clear position
   1e0b0:	e6 e3       	ldi	r30, 0x36	; 54
   1e0b2:	f4 e0       	ldi	r31, 0x04	; 4
   1e0b4:	df 01       	movw	r26, r30
   1e0b6:	28 2f       	mov	r18, r24
   1e0b8:	1d 92       	st	X+, r1
   1e0ba:	2a 95       	dec	r18
   1e0bc:	e9 f7       	brne	.-6      	; 0x1e0b8 <main+0x636>
  #endif
  memset(previous_speed, 0, sizeof(previous_speed));
   1e0be:	e6 e2       	ldi	r30, 0x26	; 38
   1e0c0:	f4 e0       	ldi	r31, 0x04	; 4
   1e0c2:	df 01       	movw	r26, r30
   1e0c4:	1d 92       	st	X+, r1
   1e0c6:	8a 95       	dec	r24
   1e0c8:	e9 f7       	brne	.-6      	; 0x1e0c4 <main+0x642>
  previous_nominal_speed = 0.0;
   1e0ca:	10 92 22 04 	sts	0x0422, r1	; 0x800422 <_ZL22previous_nominal_speed.lto_priv.445>
   1e0ce:	10 92 23 04 	sts	0x0423, r1	; 0x800423 <_ZL22previous_nominal_speed.lto_priv.445+0x1>
   1e0d2:	10 92 24 04 	sts	0x0424, r1	; 0x800424 <_ZL22previous_nominal_speed.lto_priv.445+0x2>
   1e0d6:	10 92 25 04 	sts	0x0425, r1	; 0x800425 <_ZL22previous_nominal_speed.lto_priv.445+0x3>
  plan_reset_next_e_queue = false;
   1e0da:	10 92 21 04 	sts	0x0421, r1	; 0x800421 <_ZL23plan_reset_next_e_queue.lto_priv.443>
  plan_reset_next_e_sched = false;
   1e0de:	10 92 20 04 	sts	0x0420, r1	; 0x800420 <_ZL23plan_reset_next_e_sched.lto_priv.444>
}


void factory_reset()
{
	KEEPALIVE_STATE(PAUSED_FOR_USER);
   1e0e2:	84 e0       	ldi	r24, 0x04	; 4
   1e0e4:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
	if (!READ(BTN_ENC))
   1e0e8:	80 91 00 01 	lds	r24, 0x0100	; 0x800100 <__TEXT_REGION_LENGTH__+0x7c2100>
   1e0ec:	86 fd       	sbrc	r24, 6
   1e0ee:	c6 c0       	rjmp	.+396    	; 0x1e27c <main+0x7fa>
   1e0f0:	bf ef       	ldi	r27, 0xFF	; 255
   1e0f2:	e3 ed       	ldi	r30, 0xD3	; 211
   1e0f4:	f0 e3       	ldi	r31, 0x30	; 48
   1e0f6:	b1 50       	subi	r27, 0x01	; 1
   1e0f8:	e0 40       	sbci	r30, 0x00	; 0
   1e0fa:	f0 40       	sbci	r31, 0x00	; 0
   1e0fc:	e1 f7       	brne	.-8      	; 0x1e0f6 <main+0x674>
   1e0fe:	00 c0       	rjmp	.+0      	; 0x1e100 <main+0x67e>
   1e100:	00 00       	nop
	{
		_delay_ms(1000);
		if (!READ(BTN_ENC))
   1e102:	80 91 00 01 	lds	r24, 0x0100	; 0x800100 <__TEXT_REGION_LENGTH__+0x7c2100>
   1e106:	86 fd       	sbrc	r24, 6
   1e108:	b9 c0       	rjmp	.+370    	; 0x1e27c <main+0x7fa>
		{
			lcd_clear();
   1e10a:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>

			lcd_puts_P(PSTR("Factory RESET"));
   1e10e:	8d e1       	ldi	r24, 0x1D	; 29
   1e110:	97 e8       	ldi	r25, 0x87	; 135
   1e112:	0e 94 1d 6f 	call	0xde3a	; 0xde3a <lcd_puts_P(char const*)>

			SET_OUTPUT(BEEPER);
   1e116:	80 91 01 01 	lds	r24, 0x0101	; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101>
   1e11a:	84 60       	ori	r24, 0x04	; 4
   1e11c:	80 93 01 01 	sts	0x0101, r24	; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101>
			if(eSoundMode!=e_SOUND_MODE_SILENT)
   1e120:	80 91 47 04 	lds	r24, 0x0447	; 0x800447 <eSoundMode>
   1e124:	82 30       	cpi	r24, 0x02	; 2
   1e126:	41 f0       	breq	.+16     	; 0x1e138 <main+0x6b6>
				WRITE(BEEPER, HIGH);
   1e128:	9f b7       	in	r25, 0x3f	; 63
   1e12a:	f8 94       	cli
   1e12c:	80 91 02 01 	lds	r24, 0x0102	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   1e130:	84 60       	ori	r24, 0x04	; 4
   1e132:	80 93 02 01 	sts	0x0102, r24	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   1e136:	9f bf       	out	0x3f, r25	; 63

			while (!READ(BTN_ENC));
   1e138:	80 91 00 01 	lds	r24, 0x0100	; 0x800100 <__TEXT_REGION_LENGTH__+0x7c2100>
   1e13c:	86 ff       	sbrs	r24, 6
   1e13e:	fc cf       	rjmp	.-8      	; 0x1e138 <main+0x6b6>

			WRITE(BEEPER, LOW);
   1e140:	9f b7       	in	r25, 0x3f	; 63
   1e142:	f8 94       	cli
   1e144:	80 91 02 01 	lds	r24, 0x0102	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   1e148:	8b 7f       	andi	r24, 0xFB	; 251
   1e14a:	80 93 02 01 	sts	0x0102, r24	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   1e14e:	9f bf       	out	0x3f, r25	; 63
   1e150:	2f ef       	ldi	r18, 0xFF	; 255
   1e152:	37 ea       	ldi	r19, 0xA7	; 167
   1e154:	81 e6       	ldi	r24, 0x61	; 97
   1e156:	21 50       	subi	r18, 0x01	; 1
   1e158:	30 40       	sbci	r19, 0x00	; 0
   1e15a:	80 40       	sbci	r24, 0x00	; 0
   1e15c:	e1 f7       	brne	.-8      	; 0x1e156 <main+0x6d4>
   1e15e:	00 c0       	rjmp	.+0      	; 0x1e160 <main+0x6de>
   1e160:	00 00       	nop
		PSTR("Language"),
		PSTR("Statistics"),
		PSTR("Shipping prep"),
		PSTR("Service prep"),
		PSTR("All Data"),
	};
   1e162:	83 e0       	ldi	r24, 0x03	; 3
   1e164:	97 e8       	ldi	r25, 0x87	; 135
   1e166:	9a 83       	std	Y+2, r25	; 0x02
   1e168:	89 83       	std	Y+1, r24	; 0x01
   1e16a:	88 ef       	ldi	r24, 0xF8	; 248
   1e16c:	96 e8       	ldi	r25, 0x86	; 134
   1e16e:	9c 83       	std	Y+4, r25	; 0x04
   1e170:	8b 83       	std	Y+3, r24	; 0x03
   1e172:	8a ee       	ldi	r24, 0xEA	; 234
   1e174:	96 e8       	ldi	r25, 0x86	; 134
   1e176:	9e 83       	std	Y+6, r25	; 0x06
   1e178:	8d 83       	std	Y+5, r24	; 0x05
   1e17a:	8d ed       	ldi	r24, 0xDD	; 221
   1e17c:	96 e8       	ldi	r25, 0x86	; 134
   1e17e:	98 87       	std	Y+8, r25	; 0x08
   1e180:	8f 83       	std	Y+7, r24	; 0x07
   1e182:	84 ed       	ldi	r24, 0xD4	; 212
   1e184:	96 e8       	ldi	r25, 0x86	; 134
   1e186:	9a 87       	std	Y+10, r25	; 0x0a
   1e188:	89 87       	std	Y+9, r24	; 0x09

	lcd_clear();
   1e18a:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
	lcd_putc_at(0, 0, '>');
   1e18e:	4e e3       	ldi	r20, 0x3E	; 62
   1e190:	60 e0       	ldi	r22, 0x00	; 0
   1e192:	80 e0       	ldi	r24, 0x00	; 0
   1e194:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
	lcd_consume_click();
   1e198:	0e 94 70 73 	call	0xe6e0	; 0xe6e0 <lcd_consume_click()>
	}
}

char reset_menu() {
	static int8_t first = 0;
	char cursor_pos = 0;
   1e19c:	10 e0       	ldi	r17, 0x00	; 0
   1e19e:	d1 2c       	mov	r13, r1
   1e1a0:	c1 2c       	mov	r12, r1
	lcd_putc_at(0, 0, '>');
	lcd_consume_click();
	while (1) {

		for (uint_least8_t i = 0; i < 4; i++) {
			lcd_puts_at_P(1, i, item[first + i]);
   1e1a2:	80 91 46 04 	lds	r24, 0x0446	; 0x800446 <reset_menu()::first>
   1e1a6:	f6 01       	movw	r30, r12
   1e1a8:	e8 0f       	add	r30, r24
   1e1aa:	f1 1d       	adc	r31, r1
   1e1ac:	87 fd       	sbrc	r24, 7
   1e1ae:	fa 95       	dec	r31
   1e1b0:	ee 0f       	add	r30, r30
   1e1b2:	ff 1f       	adc	r31, r31
   1e1b4:	ee 0d       	add	r30, r14
   1e1b6:	ff 1d       	adc	r31, r15
   1e1b8:	40 81       	ld	r20, Z
   1e1ba:	51 81       	ldd	r21, Z+1	; 0x01
   1e1bc:	6c 2d       	mov	r22, r12
   1e1be:	81 e0       	ldi	r24, 0x01	; 1
   1e1c0:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
   1e1c4:	9f ef       	ldi	r25, 0xFF	; 255
   1e1c6:	c9 1a       	sub	r12, r25
   1e1c8:	d9 0a       	sbc	r13, r25
	lcd_clear();
	lcd_putc_at(0, 0, '>');
	lcd_consume_click();
	while (1) {

		for (uint_least8_t i = 0; i < 4; i++) {
   1e1ca:	a4 e0       	ldi	r26, 0x04	; 4
   1e1cc:	ca 16       	cp	r12, r26
   1e1ce:	d1 04       	cpc	r13, r1
   1e1d0:	41 f7       	brne	.-48     	; 0x1e1a2 <main+0x720>
			lcd_puts_at_P(1, i, item[first + i]);
		}

		manage_heater();
   1e1d2:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
        manage_inactivity(true);
   1e1d6:	81 e0       	ldi	r24, 0x01	; 1
   1e1d8:	0e 94 34 8c 	call	0x11868	; 0x11868 <manage_inactivity(bool)>

		if (lcd_encoder) {
   1e1dc:	80 91 1e 06 	lds	r24, 0x061E	; 0x80061e <lcd_encoder>
   1e1e0:	90 91 1f 06 	lds	r25, 0x061F	; 0x80061f <lcd_encoder+0x1>
   1e1e4:	00 97       	sbiw	r24, 0x00	; 0
   1e1e6:	71 f1       	breq	.+92     	; 0x1e244 <main+0x7c2>
			if (lcd_encoder < 0) {
   1e1e8:	97 ff       	sbrs	r25, 7
   1e1ea:	12 c0       	rjmp	.+36     	; 0x1e210 <main+0x78e>
				cursor_pos--;
   1e1ec:	11 50       	subi	r17, 0x01	; 1

			if (lcd_encoder > 0) {
				cursor_pos++;
			}

			if (cursor_pos > 3) {
   1e1ee:	14 30       	cpi	r17, 0x04	; 4
   1e1f0:	0c f4       	brge	.+2      	; 0x1e1f4 <main+0x772>
   1e1f2:	3a c2       	rjmp	.+1140   	; 0x1e668 <main+0xbe6>
				cursor_pos = 3;
				Sound_MakeSound(e_SOUND_TYPE_BlindAlert);
   1e1f4:	87 e0       	ldi	r24, 0x07	; 7
   1e1f6:	0f 94 ad 25 	call	0x24b5a	; 0x24b5a <Sound_MakeSound(eSOUND_TYPE)>
				if (first < (uint8_t)(sizeof(item) / sizeof(item[0])) - 4) {
   1e1fa:	80 91 46 04 	lds	r24, 0x0446	; 0x800446 <reset_menu()::first>
   1e1fe:	18 16       	cp	r1, r24
   1e200:	2c f0       	brlt	.+10     	; 0x1e20c <main+0x78a>
					first++;
   1e202:	8f 5f       	subi	r24, 0xFF	; 255
   1e204:	80 93 46 04 	sts	0x0446, r24	; 0x800446 <reset_menu()::first>
					lcd_clear();
   1e208:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
			if (lcd_encoder > 0) {
				cursor_pos++;
			}

			if (cursor_pos > 3) {
				cursor_pos = 3;
   1e20c:	13 e0       	ldi	r17, 0x03	; 3
   1e20e:	03 c0       	rjmp	.+6      	; 0x1e216 <main+0x794>
			if (lcd_encoder < 0) {
				cursor_pos--;
			}

			if (lcd_encoder > 0) {
				cursor_pos++;
   1e210:	1f 5f       	subi	r17, 0xFF	; 255
			}

			if (cursor_pos > 3) {
   1e212:	14 30       	cpi	r17, 0x04	; 4
   1e214:	78 f7       	brcc	.-34     	; 0x1e1f4 <main+0x772>
				if (first > 0) {
					first--;
					lcd_clear();
				}
			}
			lcd_puts_at_P(0, 0, PSTR(" \n \n \n "));
   1e216:	4c ec       	ldi	r20, 0xCC	; 204
   1e218:	56 e8       	ldi	r21, 0x86	; 134
   1e21a:	60 e0       	ldi	r22, 0x00	; 0
   1e21c:	80 e0       	ldi	r24, 0x00	; 0
   1e21e:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
			lcd_set_cursor(0, cursor_pos);
   1e222:	61 2f       	mov	r22, r17
   1e224:	80 e0       	ldi	r24, 0x00	; 0
   1e226:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
			lcd_putc('>');
   1e22a:	8e e3       	ldi	r24, 0x3E	; 62
   1e22c:	0e 94 21 6f 	call	0xde42	; 0xde42 <lcd_putc(char)>
			lcd_encoder = 0;
   1e230:	10 92 1f 06 	sts	0x061F, r1	; 0x80061f <lcd_encoder+0x1>
   1e234:	10 92 1e 06 	sts	0x061E, r1	; 0x80061e <lcd_encoder>
			_delay(100);
   1e238:	64 e6       	ldi	r22, 0x64	; 100
   1e23a:	70 e0       	ldi	r23, 0x00	; 0
   1e23c:	80 e0       	ldi	r24, 0x00	; 0
   1e23e:	90 e0       	ldi	r25, 0x00	; 0
   1e240:	0f 94 bd 0d 	call	0x21b7a	; 0x21b7a <delay2>
		}

		if (lcd_clicked()) {
   1e244:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   1e248:	88 23       	and	r24, r24
   1e24a:	09 f4       	brne	.+2      	; 0x1e24e <main+0x7cc>
   1e24c:	a8 cf       	rjmp	.-176    	; 0x1e19e <main+0x71c>
			return(cursor_pos + first);
   1e24e:	80 91 46 04 	lds	r24, 0x0446	; 0x800446 <reset_menu()::first>
   1e252:	18 0f       	add	r17, r24
// Factory reset function
// This function is used to erase parts or whole EEPROM memory which is used for storing calibration and and so on.
// Level input parameter sets depth of reset
static void factory_reset(char level)
{
	lcd_clear();
   1e254:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
	Sound_MakeCustom(100,0,false);
   1e258:	40 e0       	ldi	r20, 0x00	; 0
   1e25a:	70 e0       	ldi	r23, 0x00	; 0
   1e25c:	60 e0       	ldi	r22, 0x00	; 0
   1e25e:	84 e6       	ldi	r24, 0x64	; 100
   1e260:	90 e0       	ldi	r25, 0x00	; 0
   1e262:	0f 94 be 27 	call	0x24f7c	; 0x24f7c <Sound_MakeCustom(unsigned int, unsigned int, bool)>
	switch (level) {
   1e266:	12 30       	cpi	r17, 0x02	; 2
   1e268:	09 f4       	brne	.+2      	; 0x1e26c <main+0x7ea>
   1e26a:	35 c2       	rjmp	.+1130   	; 0x1e6d6 <main+0xc54>
   1e26c:	08 f0       	brcs	.+2      	; 0x1e270 <main+0x7ee>
   1e26e:	0d c2       	rjmp	.+1050   	; 0x1e68a <main+0xc08>
   1e270:	11 23       	and	r17, r17
   1e272:	09 f4       	brne	.+2      	; 0x1e276 <main+0x7f4>
   1e274:	28 c2       	rjmp	.+1104   	; 0x1e6c6 <main+0xc44>
   1e276:	11 30       	cpi	r17, 0x01	; 1
   1e278:	09 f4       	brne	.+2      	; 0x1e27c <main+0x7fa>
   1e27a:	28 c2       	rjmp	.+1104   	; 0x1e6cc <main+0xc4a>
			case 4: _delay_ms(0); break;
			}

		}
	}
	KEEPALIVE_STATE(IN_HANDLER);
   1e27c:	82 e0       	ldi	r24, 0x02	; 2
   1e27e:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>

	plan_init();  // Initialize planner;

	factory_reset();

  eeprom_init_default_byte((uint8_t*)EEPROM_SILENT, SILENT_MODE_OFF);
   1e282:	60 e0       	ldi	r22, 0x00	; 0
   1e284:	8f ef       	ldi	r24, 0xFF	; 255
   1e286:	9f e0       	ldi	r25, 0x0F	; 15
   1e288:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
  eeprom_init_default_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 1); //run wizard if uninitialized
   1e28c:	61 e0       	ldi	r22, 0x01	; 1
   1e28e:	8f e5       	ldi	r24, 0x5F	; 95
   1e290:	9f e0       	ldi	r25, 0x0F	; 15
   1e292:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
void st_init()
{
#ifdef TMC2130
	tmc2130_init(TMCInitParams(false, FarmOrUserECool()));
#else
  st_current_init(); //Initialize Digipot Motor Current
   1e296:	0f 94 84 1a 	call	0x23508	; 0x23508 <st_current_init()>
  SET_OUTPUT(E1_MS1_PIN);
  SET_OUTPUT(E1_MS2_PIN);
  #endif

  #if defined(X_MS1_PIN) && X_MS1_PIN > -1
  const uint8_t microstep_modes[] = MICROSTEP_MODES;
   1e29a:	85 e0       	ldi	r24, 0x05	; 5
   1e29c:	e8 eb       	ldi	r30, 0xB8	; 184
   1e29e:	f2 e0       	ldi	r31, 0x02	; 2
   1e2a0:	d7 01       	movw	r26, r14
   1e2a2:	01 90       	ld	r0, Z+
   1e2a4:	0d 92       	st	X+, r0
   1e2a6:	8a 95       	dec	r24
   1e2a8:	e1 f7       	brne	.-8      	; 0x1e2a2 <main+0x820>
  SET_OUTPUT(X_MS1_PIN);
   1e2aa:	99 9a       	sbi	0x13, 1	; 19
  SET_OUTPUT(X_MS2_PIN);
   1e2ac:	98 9a       	sbi	0x13, 0	; 19
  SET_OUTPUT(Y_MS1_PIN);
   1e2ae:	80 91 07 01 	lds	r24, 0x0107	; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107>
   1e2b2:	80 68       	ori	r24, 0x80	; 128
   1e2b4:	80 93 07 01 	sts	0x0107, r24	; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107>
  SET_OUTPUT(Y_MS2_PIN);
   1e2b8:	9a 9a       	sbi	0x13, 2	; 19
  SET_OUTPUT(Z_MS1_PIN);
   1e2ba:	80 91 07 01 	lds	r24, 0x0107	; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107>
   1e2be:	80 64       	ori	r24, 0x40	; 64
   1e2c0:	80 93 07 01 	sts	0x0107, r24	; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107>
  SET_OUTPUT(Z_MS2_PIN);
   1e2c4:	80 91 07 01 	lds	r24, 0x0107	; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107>
   1e2c8:	80 62       	ori	r24, 0x20	; 32
   1e2ca:	80 93 07 01 	sts	0x0107, r24	; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107>
  SET_OUTPUT(E0_MS1_PIN);
   1e2ce:	80 91 07 01 	lds	r24, 0x0107	; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107>
   1e2d2:	88 60       	ori	r24, 0x08	; 8
   1e2d4:	80 93 07 01 	sts	0x0107, r24	; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107>
  SET_OUTPUT(E0_MS2_PIN);
   1e2d8:	80 91 07 01 	lds	r24, 0x0107	; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107>
   1e2dc:	80 61       	ori	r24, 0x10	; 16
   1e2de:	80 93 07 01 	sts	0x0107, r24	; 0x800107 <__TEXT_REGION_LENGTH__+0x7c2107>
   1e2e2:	67 01       	movw	r12, r14
   1e2e4:	10 e0       	ldi	r17, 0x00	; 0
  for(int i=0;i<=4;i++) microstep_mode(i,microstep_modes[i]);
   1e2e6:	f6 01       	movw	r30, r12
   1e2e8:	61 91       	ld	r22, Z+
   1e2ea:	6f 01       	movw	r12, r30
   1e2ec:	81 2f       	mov	r24, r17
   1e2ee:	0f 94 47 1a 	call	0x2348e	; 0x2348e <microstep_mode(unsigned char, unsigned char)>
   1e2f2:	1f 5f       	subi	r17, 0xFF	; 255
   1e2f4:	15 30       	cpi	r17, 0x05	; 5
   1e2f6:	b9 f7       	brne	.-18     	; 0x1e2e6 <main+0x864>
  microstep_init(); //Initialize Microstepping Pins
#endif //TMC2130

  //Initialize Dir Pins
  #if defined(X_DIR_PIN) && X_DIR_PIN > -1
    SET_OUTPUT(X_DIR_PIN);
   1e2f8:	80 91 0a 01 	lds	r24, 0x010A	; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a>
   1e2fc:	82 60       	ori	r24, 0x02	; 2
   1e2fe:	80 93 0a 01 	sts	0x010A, r24	; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a>
  #endif
  #if defined(X2_DIR_PIN) && X2_DIR_PIN > -1
    SET_OUTPUT(X2_DIR_PIN);
  #endif
  #if defined(Y_DIR_PIN) && Y_DIR_PIN > -1
    SET_OUTPUT(Y_DIR_PIN);
   1e302:	80 91 0a 01 	lds	r24, 0x010A	; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a>
   1e306:	81 60       	ori	r24, 0x01	; 1
   1e308:	80 93 0a 01 	sts	0x010A, r24	; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a>
  #endif
  #if defined(Z_DIR_PIN) && Z_DIR_PIN > -1
    SET_OUTPUT(Z_DIR_PIN);
   1e30c:	80 91 0a 01 	lds	r24, 0x010A	; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a>
   1e310:	84 60       	ori	r24, 0x04	; 4
   1e312:	80 93 0a 01 	sts	0x010A, r24	; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a>
  #endif
  #if defined(E0_DIR_PIN) && E0_DIR_PIN > -1
    SET_OUTPUT(E0_DIR_PIN);
   1e316:	80 91 0a 01 	lds	r24, 0x010A	; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a>
   1e31a:	80 64       	ori	r24, 0x40	; 64
   1e31c:	80 93 0a 01 	sts	0x010A, r24	; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a>
  #endif

  //Initialize Enable Pins - steppers default to disabled.

  #if defined(X_ENABLE_PIN) && X_ENABLE_PIN > -1
    SET_OUTPUT(X_ENABLE_PIN);
   1e320:	0f 9a       	sbi	0x01, 7	; 1
    if(!X_ENABLE_ON) WRITE(X_ENABLE_PIN,HIGH);
   1e322:	17 9a       	sbi	0x02, 7	; 2
  #if defined(X2_ENABLE_PIN) && X2_ENABLE_PIN > -1
    SET_OUTPUT(X2_ENABLE_PIN);
    if(!X_ENABLE_ON) WRITE(X2_ENABLE_PIN,HIGH);
  #endif
  #if defined(Y_ENABLE_PIN) && Y_ENABLE_PIN > -1
    SET_OUTPUT(Y_ENABLE_PIN);
   1e324:	0e 9a       	sbi	0x01, 6	; 1
    if(!Y_ENABLE_ON) WRITE(Y_ENABLE_PIN,HIGH);
   1e326:	16 9a       	sbi	0x02, 6	; 2
  #endif
  #if defined(Z_ENABLE_PIN) && Z_ENABLE_PIN > -1
    SET_OUTPUT(Z_ENABLE_PIN);
   1e328:	0d 9a       	sbi	0x01, 5	; 1
    if(!Z_ENABLE_ON) WRITE(Z_ENABLE_PIN,HIGH);
   1e32a:	15 9a       	sbi	0x02, 5	; 2
  #endif
  #if defined(E0_ENABLE_PIN) && (E0_ENABLE_PIN > -1)
    SET_OUTPUT(E0_ENABLE_PIN);
   1e32c:	0c 9a       	sbi	0x01, 4	; 1
    if(!E_ENABLE_ON) WRITE(E0_ENABLE_PIN,HIGH);
   1e32e:	14 9a       	sbi	0x02, 4	; 2
  #endif

  //endstops and pullups
  #if defined(X_MIN_PIN) && X_MIN_PIN > -1
    SET_INPUT(X_MIN_PIN);
   1e330:	26 98       	cbi	0x04, 6	; 4
    #ifdef ENDSTOPPULLUP_XMIN
      WRITE(X_MIN_PIN,HIGH);
   1e332:	2e 9a       	sbi	0x05, 6	; 5
    #endif
  #endif

  #if defined(Y_MIN_PIN) && Y_MIN_PIN > -1
    SET_INPUT(Y_MIN_PIN);
   1e334:	25 98       	cbi	0x04, 5	; 4
    #ifdef ENDSTOPPULLUP_YMIN
      WRITE(Y_MIN_PIN,HIGH);
   1e336:	2d 9a       	sbi	0x05, 5	; 5
    #endif
  #endif

  #if defined(Z_MIN_PIN) && Z_MIN_PIN > -1
    SET_INPUT(Z_MIN_PIN);
   1e338:	24 98       	cbi	0x04, 4	; 4
    #ifdef ENDSTOPPULLUP_ZMIN
      WRITE(Z_MIN_PIN,HIGH);
   1e33a:	2c 9a       	sbi	0x05, 4	; 5
      WRITE(Y_MAX_PIN,HIGH);
    #endif
  #endif

  #if defined(Z_MAX_PIN) && Z_MAX_PIN > -1
    SET_INPUT(Z_MAX_PIN);
   1e33c:	09 98       	cbi	0x01, 1	; 1
    #ifdef ENDSTOPPULLUP_ZMAX
      WRITE(Z_MAX_PIN,HIGH);
   1e33e:	11 9a       	sbi	0x02, 1	; 2
    #endif
  #endif

  #if (defined(FANCHECK) && defined(TACH_0) && (TACH_0 > -1))
	SET_INPUT(TACH_0);
   1e340:	3f 98       	cbi	0x07, 7	; 7
    #ifdef TACH0PULLUP
	  WRITE(TACH_0, HIGH);
   1e342:	47 9a       	sbi	0x08, 7	; 8
  #endif


  //Initialize Step Pins
#if defined(X_STEP_PIN) && (X_STEP_PIN > -1)
    SET_OUTPUT(X_STEP_PIN);
   1e344:	38 9a       	sbi	0x07, 0	; 7
    WRITE(X_STEP_PIN,INVERT_X_STEP_PIN);
   1e346:	40 98       	cbi	0x08, 0	; 8
#ifdef DEBUG_XSTEP_DUP_PIN
    SET_OUTPUT(DEBUG_XSTEP_DUP_PIN);
    WRITE(DEBUG_XSTEP_DUP_PIN,INVERT_X_STEP_PIN);
#endif //DEBUG_XSTEP_DUP_PIN
    disable_x();
   1e348:	17 9a       	sbi	0x02, 7	; 2
   1e34a:	10 92 39 06 	sts	0x0639, r1	; 0x800639 <axis_known_position>
    SET_OUTPUT(X2_STEP_PIN);
    WRITE(X2_STEP_PIN,INVERT_X_STEP_PIN);
    disable_x();
  #endif
  #if defined(Y_STEP_PIN) && (Y_STEP_PIN > -1)
    SET_OUTPUT(Y_STEP_PIN);
   1e34e:	39 9a       	sbi	0x07, 1	; 7
    WRITE(Y_STEP_PIN,INVERT_Y_STEP_PIN);
   1e350:	41 98       	cbi	0x08, 1	; 8
#ifdef DEBUG_YSTEP_DUP_PIN
    SET_OUTPUT(DEBUG_YSTEP_DUP_PIN);
    WRITE(DEBUG_YSTEP_DUP_PIN,INVERT_Y_STEP_PIN);
#endif //DEBUG_YSTEP_DUP_PIN
    disable_y();
   1e352:	16 9a       	sbi	0x02, 6	; 2
   1e354:	10 92 3a 06 	sts	0x063A, r1	; 0x80063a <axis_known_position+0x1>
  #endif
  #if defined(Z_STEP_PIN) && (Z_STEP_PIN > -1)
    SET_OUTPUT(Z_STEP_PIN);
   1e358:	3a 9a       	sbi	0x07, 2	; 7
    WRITE(Z_STEP_PIN,INVERT_Z_STEP_PIN);
   1e35a:	42 98       	cbi	0x08, 2	; 8
      init_force_z();
    #endif // PSU_Delta
    disable_z();
  #endif
  #if defined(E0_STEP_PIN) && (E0_STEP_PIN > -1)
    SET_OUTPUT(E0_STEP_PIN);
   1e35c:	3b 9a       	sbi	0x07, 3	; 7
    WRITE(E0_STEP_PIN,INVERT_E_STEP_PIN);
   1e35e:	43 98       	cbi	0x08, 3	; 8
    disable_e0();
   1e360:	14 9a       	sbi	0x02, 4	; 2
  #endif

  // waveform generation = 0100 = CTC
  TCCR1B &= ~(1<<WGM13);
   1e362:	80 91 81 00 	lds	r24, 0x0081	; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081>
   1e366:	8f 7e       	andi	r24, 0xEF	; 239
   1e368:	80 93 81 00 	sts	0x0081, r24	; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081>
  TCCR1B |=  (1<<WGM12);
   1e36c:	80 91 81 00 	lds	r24, 0x0081	; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081>
   1e370:	88 60       	ori	r24, 0x08	; 8
   1e372:	80 93 81 00 	sts	0x0081, r24	; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081>
  TCCR1A &= ~(1<<WGM11);
   1e376:	80 91 80 00 	lds	r24, 0x0080	; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080>
   1e37a:	8d 7f       	andi	r24, 0xFD	; 253
   1e37c:	80 93 80 00 	sts	0x0080, r24	; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080>
  TCCR1A &= ~(1<<WGM10);
   1e380:	80 91 80 00 	lds	r24, 0x0080	; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080>
   1e384:	8e 7f       	andi	r24, 0xFE	; 254
   1e386:	80 93 80 00 	sts	0x0080, r24	; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080>

  // output mode = 00 (disconnected)
  TCCR1A &= ~(3<<COM1A0);
   1e38a:	80 91 80 00 	lds	r24, 0x0080	; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080>
   1e38e:	8f 73       	andi	r24, 0x3F	; 63
   1e390:	80 93 80 00 	sts	0x0080, r24	; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080>
  TCCR1A &= ~(3<<COM1B0);
   1e394:	80 91 80 00 	lds	r24, 0x0080	; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080>
   1e398:	8f 7c       	andi	r24, 0xCF	; 207
   1e39a:	80 93 80 00 	sts	0x0080, r24	; 0x800080 <__TEXT_REGION_LENGTH__+0x7c2080>
  // Set the timer pre-scaler
  // Generally we use a divider of 8, resulting in a 2MHz timer
  // frequency on a 16MHz MCU. If you are going to change this, be
  // sure to regenerate speed_lookuptable.h with
  // create_speed_lookuptable.py
  TCCR1B = (TCCR1B & ~(0x07<<CS10)) | (2<<CS10);
   1e39e:	80 91 81 00 	lds	r24, 0x0081	; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081>
   1e3a2:	88 7f       	andi	r24, 0xF8	; 248
   1e3a4:	82 60       	ori	r24, 0x02	; 2
   1e3a6:	80 93 81 00 	sts	0x0081, r24	; 0x800081 <__TEXT_REGION_LENGTH__+0x7c2081>

  // Plan the first interrupt after 8ms from now.
  OCR1A = 0x4000;
   1e3aa:	80 e0       	ldi	r24, 0x00	; 0
   1e3ac:	90 e4       	ldi	r25, 0x40	; 64
   1e3ae:	90 93 89 00 	sts	0x0089, r25	; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089>
   1e3b2:	80 93 88 00 	sts	0x0088, r24	; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088>
  TCNT1 = 0;
   1e3b6:	10 92 85 00 	sts	0x0085, r1	; 0x800085 <__TEXT_REGION_LENGTH__+0x7c2085>
   1e3ba:	10 92 84 00 	sts	0x0084, r1	; 0x800084 <__TEXT_REGION_LENGTH__+0x7c2084>
  WRITE_NC(LOGIC_ANALYZER_CH0, false);
  WRITE_NC(LOGIC_ANALYZER_CH1, false);
#endif

  // Initialize state for the linear advance scheduler
  nextMainISR = 0;
   1e3be:	10 92 4f 04 	sts	0x044F, r1	; 0x80044f <_ZL11nextMainISR.lto_priv.438+0x1>
   1e3c2:	10 92 4e 04 	sts	0x044E, r1	; 0x80044e <_ZL11nextMainISR.lto_priv.438>
  nextAdvanceISR = ADV_NEVER;
   1e3c6:	8f ef       	ldi	r24, 0xFF	; 255
   1e3c8:	9f ef       	ldi	r25, 0xFF	; 255
   1e3ca:	90 93 4d 04 	sts	0x044D, r25	; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1>
   1e3ce:	80 93 4c 04 	sts	0x044C, r24	; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439>
  main_Rate = ADV_NEVER;
   1e3d2:	90 93 4b 04 	sts	0x044B, r25	; 0x80044b <_ZL9main_Rate.lto_priv.440+0x1>
   1e3d6:	80 93 4a 04 	sts	0x044A, r24	; 0x80044a <_ZL9main_Rate.lto_priv.440>
  current_adv_steps = 0;
   1e3da:	10 92 49 04 	sts	0x0449, r1	; 0x800449 <_ZL17current_adv_steps.lto_priv.441+0x1>
   1e3de:	10 92 48 04 	sts	0x0448, r1	; 0x800448 <_ZL17current_adv_steps.lto_priv.441>
}

bool enable_endstops(bool check)
{
  bool old = check_endstops;
  check_endstops = check;
   1e3e2:	81 e0       	ldi	r24, 0x01	; 1
   1e3e4:	80 93 77 02 	sts	0x0277, r24	; 0x800277 <_ZL14check_endstops.lto_priv.387>
  current_adv_steps = 0;
#endif

  enable_endstops(true); // Start with endstops active. After homing they can be disabled

  ENABLE_STEPPER_DRIVER_INTERRUPT();
   1e3e8:	80 91 6f 00 	lds	r24, 0x006F	; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f>
   1e3ec:	82 60       	ori	r24, 0x02	; 2
   1e3ee:	80 93 6f 00 	sts	0x006F, r24	; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f>
  sei();
   1e3f2:	78 94       	sei

	setup_photpin();

	// Reset the machine correction matrix.
	// It does not make sense to load the correction matrix until the machine is homed.
	world2machine_reset();
   1e3f4:	0e 94 f4 61 	call	0xc3e8	; 0xc3e8 <world2machine_reset()>

    // Initialize current_position accounting for software endstops to
    // avoid unexpected initial shifts on the first move
    clamp_to_software_endstops(current_position);
   1e3f8:	81 e6       	ldi	r24, 0x61	; 97
   1e3fa:	92 e1       	ldi	r25, 0x12	; 18
   1e3fc:	0e 94 7c 6a 	call	0xd4f8	; 0xd4f8 <clamp_to_software_endstops(float*)>
    plan_set_position_curposXYZE();
   1e400:	0f 94 41 4b 	call	0x29682	; 0x29682 <plan_set_position_curposXYZE()>
}

#define KILL_PENDING_FLAG 0x42

static void fw_kill_init() {
    if (eeprom_read_byte((uint8_t*)EEPROM_KILL_PENDING_FLAG) == KILL_PENDING_FLAG) {
   1e404:	84 e9       	ldi	r24, 0x94	; 148
   1e406:	9c e0       	ldi	r25, 0x0C	; 12
   1e408:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1e40c:	82 34       	cpi	r24, 0x42	; 66
   1e40e:	59 f4       	brne	.+22     	; 0x1e426 <main+0x9a4>
    if (active) {
        uint8_t previous_value = eeprom_read_byte(dst);
        eeprom_byte_notify(dst, previous_value, value, true);
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_write_byte(dst, value);
   1e410:	6f ef       	ldi	r22, 0xFF	; 255
   1e412:	84 e9       	ldi	r24, 0x94	; 148
   1e414:	9c e0       	ldi	r25, 0x0C	; 12
   1e416:	0f 94 28 a4 	call	0x34850	; 0x34850 <eeprom_write_byte>
        // clear pending message event
        eeprom_write_byte_notify((uint8_t*)EEPROM_KILL_PENDING_FLAG, EEPROM_EMPTY_VALUE);

        // display the kill message
        PGM_P kill_msg = (PGM_P)eeprom_read_word((uint16_t*)EEPROM_KILL_MESSAGE);
   1e41a:	85 e9       	ldi	r24, 0x95	; 149
   1e41c:	9c e0       	ldi	r25, 0x0C	; 12
   1e41e:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
        lcd_show_fullscreen_message_and_wait_P(kill_msg);
   1e422:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>

    // report kill() events
    fw_kill_init();

#ifdef FILAMENT_SENSOR
    fsensor.init();
   1e426:	0f 94 dc 6d 	call	0x2dbb8	; 0x2dbb8 <PAT9125_sensor::init() [clone .constprop.206]>
#endif

	setup_homepin();

#if defined(Z_AXIS_ALWAYS_ON)
    enable_z();
   1e42a:	15 98       	cbi	0x02, 5	; 2
#endif

    // The farm monitoring SW may accidentally expect
    // 2 messages of "printer started" to consider a printer working.
    prusa_statistics(8);
   1e42c:	88 e0       	ldi	r24, 0x08	; 8
   1e42e:	0f 94 79 32 	call	0x264f2	; 0x264f2 <prusa_statistics(unsigned char)>

	// Enable Toshiba FlashAir SD card / WiFi enahanced card.
	card.ToshibaFlashAir_enable(eeprom_read_byte((unsigned char*)EEPROM_TOSHIBA_FLASH_AIR_COMPATIBLITY) == 1);
   1e432:	8b eb       	ldi	r24, 0xBB	; 187
   1e434:	9f e0       	ldi	r25, 0x0F	; 15
   1e436:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1e43a:	91 e0       	ldi	r25, 0x01	; 1
   1e43c:	81 30       	cpi	r24, 0x01	; 1
   1e43e:	09 f0       	breq	.+2      	; 0x1e442 <main+0x9c0>
   1e440:	90 e0       	ldi	r25, 0x00	; 0
   1e442:	90 93 48 16 	sts	0x1648, r25	; 0x801648 <card+0x273>

	// Force SD card update. Otherwise the SD card update is done from loop() on card.checkautostart(false),
	// but this times out if a blocking dialog is shown in setup().
	card.mount();
   1e446:	81 e0       	ldi	r24, 0x01	; 1
   1e448:	0f 94 6a 73 	call	0x2e6d4	; 0x2e6d4 <CardReader::mount(bool) [clone .constprop.192]>
#include <avr/eeprom.h>
#include <stdint.h>

void eeprom_init()
{
    eeprom_init_default_byte((uint8_t*)EEPROM_POWER_COUNT, 0);
   1e44c:	60 e0       	ldi	r22, 0x00	; 0
   1e44e:	84 e6       	ldi	r24, 0x64	; 100
   1e450:	9f e0       	ldi	r25, 0x0F	; 15
   1e452:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
    eeprom_init_default_byte((uint8_t*)EEPROM_CRASH_COUNT_X, 0);
   1e456:	60 e0       	ldi	r22, 0x00	; 0
   1e458:	86 e6       	ldi	r24, 0x66	; 102
   1e45a:	9f e0       	ldi	r25, 0x0F	; 15
   1e45c:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
    eeprom_init_default_byte((uint8_t*)EEPROM_CRASH_COUNT_Y, 0);
   1e460:	60 e0       	ldi	r22, 0x00	; 0
   1e462:	88 e6       	ldi	r24, 0x68	; 104
   1e464:	9f e0       	ldi	r25, 0x0F	; 15
   1e466:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
    eeprom_init_default_byte((uint8_t*)EEPROM_FERROR_COUNT, 0);
   1e46a:	60 e0       	ldi	r22, 0x00	; 0
   1e46c:	85 e6       	ldi	r24, 0x65	; 101
   1e46e:	9f e0       	ldi	r25, 0x0F	; 15
   1e470:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
    eeprom_init_default_word((uint16_t*)EEPROM_POWER_COUNT_TOT, 0);
   1e474:	70 e0       	ldi	r23, 0x00	; 0
   1e476:	60 e0       	ldi	r22, 0x00	; 0
   1e478:	8f ef       	ldi	r24, 0xFF	; 255
   1e47a:	9e e0       	ldi	r25, 0x0E	; 14
   1e47c:	0e 94 45 78 	call	0xf08a	; 0xf08a <eeprom_init_default_word(unsigned int*, unsigned int)>
    eeprom_init_default_word((uint16_t*)EEPROM_CRASH_COUNT_X_TOT, 0);
   1e480:	70 e0       	ldi	r23, 0x00	; 0
   1e482:	60 e0       	ldi	r22, 0x00	; 0
   1e484:	85 e0       	ldi	r24, 0x05	; 5
   1e486:	9f e0       	ldi	r25, 0x0F	; 15
   1e488:	0e 94 45 78 	call	0xf08a	; 0xf08a <eeprom_init_default_word(unsigned int*, unsigned int)>
    eeprom_init_default_word((uint16_t*)EEPROM_CRASH_COUNT_Y_TOT, 0);
   1e48c:	70 e0       	ldi	r23, 0x00	; 0
   1e48e:	60 e0       	ldi	r22, 0x00	; 0
   1e490:	83 e0       	ldi	r24, 0x03	; 3
   1e492:	9f e0       	ldi	r25, 0x0F	; 15
   1e494:	0e 94 45 78 	call	0xf08a	; 0xf08a <eeprom_init_default_word(unsigned int*, unsigned int)>
    eeprom_init_default_word((uint16_t*)EEPROM_FERROR_COUNT_TOT, 0);
   1e498:	70 e0       	ldi	r23, 0x00	; 0
   1e49a:	60 e0       	ldi	r22, 0x00	; 0
   1e49c:	81 e0       	ldi	r24, 0x01	; 1
   1e49e:	9f e0       	ldi	r25, 0x0F	; 15
   1e4a0:	0e 94 45 78 	call	0xf08a	; 0xf08a <eeprom_init_default_word(unsigned int*, unsigned int)>

    eeprom_init_default_word((uint16_t*)EEPROM_MMU_FAIL_TOT, 0);
   1e4a4:	70 e0       	ldi	r23, 0x00	; 0
   1e4a6:	60 e0       	ldi	r22, 0x00	; 0
   1e4a8:	83 ed       	ldi	r24, 0xD3	; 211
   1e4aa:	9e e0       	ldi	r25, 0x0E	; 14
   1e4ac:	0e 94 45 78 	call	0xf08a	; 0xf08a <eeprom_init_default_word(unsigned int*, unsigned int)>
    eeprom_init_default_word((uint16_t*)EEPROM_MMU_LOAD_FAIL_TOT, 0);
   1e4b0:	70 e0       	ldi	r23, 0x00	; 0
   1e4b2:	60 e0       	ldi	r22, 0x00	; 0
   1e4b4:	80 ed       	ldi	r24, 0xD0	; 208
   1e4b6:	9e e0       	ldi	r25, 0x0E	; 14
   1e4b8:	0e 94 45 78 	call	0xf08a	; 0xf08a <eeprom_init_default_word(unsigned int*, unsigned int)>
    eeprom_init_default_byte((uint8_t*)EEPROM_MMU_FAIL, 0);
   1e4bc:	60 e0       	ldi	r22, 0x00	; 0
   1e4be:	82 ed       	ldi	r24, 0xD2	; 210
   1e4c0:	9e e0       	ldi	r25, 0x0E	; 14
   1e4c2:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
    eeprom_init_default_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL, 0);
   1e4c6:	60 e0       	ldi	r22, 0x00	; 0
   1e4c8:	8f ec       	ldi	r24, 0xCF	; 207
   1e4ca:	9e e0       	ldi	r25, 0x0E	; 14
   1e4cc:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
    eeprom_init_default_dword((uint32_t*)EEPROM_MMU_MATERIAL_CHANGES, 0);
   1e4d0:	88 ea       	ldi	r24, 0xA8	; 168
   1e4d2:	9c e0       	ldi	r25, 0x0C	; 12
   1e4d4:	0f 94 d8 6c 	call	0x2d9b0	; 0x2d9b0 <eeprom_init_default_dword(unsigned long*, unsigned long) [clone .constprop.222]>
    if (eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)) == EEPROM_EMPTY_VALUE)
   1e4d8:	81 ea       	ldi	r24, 0xA1	; 161
   1e4da:	9d e0       	ldi	r25, 0x0D	; 13
   1e4dc:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1e4e0:	8f 3f       	cpi	r24, 0xFF	; 255
   1e4e2:	71 f4       	brne	.+28     	; 0x1e500 <main+0xa7e>
        if (previous_value != value) {
            eeprom_byte_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_byte(dst, value);
   1e4e4:	60 e0       	ldi	r22, 0x00	; 0
   1e4e6:	81 ea       	ldi	r24, 0xA1	; 161
   1e4e8:	9d e0       	ldi	r25, 0x0D	; 13
   1e4ea:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
    if (eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)) == EEPROM_EMPTY_VALUE)
    {
        eeprom_update_byte_notify(&(EEPROM_Sheets_base->active_sheet), 0);
        // When upgrading from version older version (before multiple sheets were implemented in v3.8.0)
        // Sheet 1 uses the previous Live adjust Z (@EEPROM_BABYSTEP_Z)
        int last_babystep = eeprom_read_word((uint16_t *)EEPROM_BABYSTEP_Z);
   1e4ee:	88 ef       	ldi	r24, 0xF8	; 248
   1e4f0:	9f e0       	ldi	r25, 0x0F	; 15
   1e4f2:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
        eeprom_update_word(reinterpret_cast<uint16_t *>(&(EEPROM_Sheets_base->s[0].z_offset)), last_babystep);
   1e4f6:	bc 01       	movw	r22, r24
   1e4f8:	80 e5       	ldi	r24, 0x50	; 80
   1e4fa:	9d e0       	ldi	r25, 0x0D	; 13
   1e4fc:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>
  SET_OUTPUT(Y_MS1_PIN);
  SET_OUTPUT(Y_MS2_PIN);
  SET_OUTPUT(Z_MS1_PIN);
  SET_OUTPUT(Z_MS2_PIN);
  SET_OUTPUT(E0_MS1_PIN);
  SET_OUTPUT(E0_MS2_PIN);
   1e500:	49 e4       	ldi	r20, 0x49	; 73
   1e502:	c4 2e       	mov	r12, r20
   1e504:	4d e0       	ldi	r20, 0x0D	; 13
   1e506:	d4 2e       	mov	r13, r20
   1e508:	10 e0       	ldi	r17, 0x00	; 0
    }

    // initialize the sheet names in eeprom
    for (uint_least8_t i = 0; i < (sizeof(Sheets::s)/sizeof(Sheets::s[0])); i++) {
        SheetName sheetName;
        eeprom_default_sheet_name(i, sheetName);
   1e50a:	b7 01       	movw	r22, r14
   1e50c:	81 2f       	mov	r24, r17
   1e50e:	0e 94 b8 78 	call	0xf170	; 0xf170 <eeprom_default_sheet_name(unsigned char, SheetName&)>
        eeprom_init_default_block(EEPROM_Sheets_base->s[i].name, (sizeof(Sheet::name)/sizeof(Sheet::name[0])), sheetName.c);
   1e512:	a7 01       	movw	r20, r14
   1e514:	67 e0       	ldi	r22, 0x07	; 7
   1e516:	70 e0       	ldi	r23, 0x00	; 0
   1e518:	c6 01       	movw	r24, r12
   1e51a:	0e 94 26 78 	call	0xf04c	; 0xf04c <eeprom_init_default_block(void*, unsigned int, void const*)>
        int last_babystep = eeprom_read_word((uint16_t *)EEPROM_BABYSTEP_Z);
        eeprom_update_word(reinterpret_cast<uint16_t *>(&(EEPROM_Sheets_base->s[0].z_offset)), last_babystep);
    }

    // initialize the sheet names in eeprom
    for (uint_least8_t i = 0; i < (sizeof(Sheets::s)/sizeof(Sheets::s[0])); i++) {
   1e51e:	1f 5f       	subi	r17, 0xFF	; 255
   1e520:	fb e0       	ldi	r31, 0x0B	; 11
   1e522:	cf 0e       	add	r12, r31
   1e524:	d1 1c       	adc	r13, r1
   1e526:	18 30       	cpi	r17, 0x08	; 8
   1e528:	81 f7       	brne	.-32     	; 0x1e50a <main+0xa88>
        SheetName sheetName;
        eeprom_default_sheet_name(i, sheetName);
        eeprom_init_default_block(EEPROM_Sheets_base->s[i].name, (sizeof(Sheet::name)/sizeof(Sheet::name[0])), sheetName.c);
    }

    if(!eeprom_is_sheet_initialized(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet))))
   1e52a:	81 ea       	ldi	r24, 0xA1	; 161
   1e52c:	9d e0       	ldi	r25, 0x0D	; 13
   1e52e:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1e532:	0e 94 88 78 	call	0xf110	; 0xf110 <eeprom_is_sheet_initialized(unsigned char)>
   1e536:	81 11       	cpse	r24, r1
   1e538:	02 c0       	rjmp	.+4      	; 0x1e53e <main+0xabc>
    {
        eeprom_switch_to_next_sheet();
   1e53a:	0e 94 aa 78 	call	0xf154	; 0xf154 <eeprom_switch_to_next_sheet()>
    }
    check_babystep();
   1e53e:	0e 94 1c 7d 	call	0xfa38	; 0xfa38 <check_babystep()>

    // initialize custom mendel name in eeprom
    if (eeprom_read_byte((uint8_t*)EEPROM_CUSTOM_MENDEL_NAME) == EEPROM_EMPTY_VALUE) {
   1e542:	80 e8       	ldi	r24, 0x80	; 128
   1e544:	9c e0       	ldi	r25, 0x0C	; 12
   1e546:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1e54a:	8f 3f       	cpi	r24, 0xFF	; 255
   1e54c:	41 f4       	brne	.+16     	; 0x1e55e <main+0xadc>
#endif //DEBUG_EEPROM_CHANGES
}

#ifndef DEBUG_EEPROM_CHANGES
void eeprom_update_block_notify(const void *__src, void *__dst, size_t __n){
    eeprom_update_block(__src, __dst, __n);
   1e54e:	4f e0       	ldi	r20, 0x0F	; 15
   1e550:	50 e0       	ldi	r21, 0x00	; 0
   1e552:	60 e8       	ldi	r22, 0x80	; 128
   1e554:	7c e0       	ldi	r23, 0x0C	; 12
   1e556:	8e ec       	ldi	r24, 0xCE	; 206
   1e558:	92 e0       	ldi	r25, 0x02	; 2
   1e55a:	0f 94 f4 a3 	call	0x347e8	; 0x347e8 <eeprom_update_block>
        //SERIAL_ECHOLN("Init Custom Mendel Name");
        eeprom_update_block_notify(CUSTOM_MENDEL_NAME, (uint8_t*)EEPROM_CUSTOM_MENDEL_NAME, sizeof(CUSTOM_MENDEL_NAME));
    } //else SERIAL_ECHOLN("Found Custom Mendel Name");

#ifdef PINDA_TEMP_COMP
    eeprom_init_default_byte((uint8_t*)EEPROM_PINDA_TEMP_COMPENSATION, 0);
   1e55e:	60 e0       	ldi	r22, 0x00	; 0
   1e560:	89 e2       	ldi	r24, 0x29	; 41
   1e562:	9d e0       	ldi	r25, 0x0D	; 13
   1e564:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
#endif //PINDA_TEMP_COMP

    eeprom_init_default_dword((uint32_t*)EEPROM_JOB_ID, 0);
   1e568:	85 e0       	ldi	r24, 0x05	; 5
   1e56a:	9d e0       	ldi	r25, 0x0D	; 13
   1e56c:	0f 94 d8 6c 	call	0x2d9b0	; 0x2d9b0 <eeprom_init_default_dword(unsigned long*, unsigned long) [clone .constprop.222]>
    eeprom_init_default_dword((uint32_t*)EEPROM_TOTALTIME, 0);
   1e570:	8d ee       	ldi	r24, 0xED	; 237
   1e572:	9f e0       	ldi	r25, 0x0F	; 15
   1e574:	0f 94 d8 6c 	call	0x2d9b0	; 0x2d9b0 <eeprom_init_default_dword(unsigned long*, unsigned long) [clone .constprop.222]>
    eeprom_init_default_dword((uint32_t*)EEPROM_FILAMENTUSED, 0);
   1e578:	81 ef       	ldi	r24, 0xF1	; 241
   1e57a:	9f e0       	ldi	r25, 0x0F	; 15
   1e57c:	0f 94 d8 6c 	call	0x2d9b0	; 0x2d9b0 <eeprom_init_default_dword(unsigned long*, unsigned long) [clone .constprop.222]>
    eeprom_init_default_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED, 0);
   1e580:	60 e0       	ldi	r22, 0x00	; 0
   1e582:	8e ec       	ldi	r24, 0xCE	; 206
   1e584:	9e e0       	ldi	r25, 0x0E	; 14
   1e586:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>

    eeprom_init_default_byte((uint8_t*)EEPROM_HEAT_BED_ON_LOAD_FILAMENT, 1);
   1e58a:	61 e0       	ldi	r22, 0x01	; 1
   1e58c:	87 ea       	ldi	r24, 0xA7	; 167
   1e58e:	9c e0       	ldi	r25, 0x0C	; 12
   1e590:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
	putchar('\n');
	list_sec_lang_from_external_flash();
#endif //DEBUG_XFLASH

//	lang_reset();
	if (!lang_select(eeprom_read_byte((uint8_t*)EEPROM_LANG)))
   1e594:	8e ef       	ldi	r24, 0xFE	; 254
   1e596:	9f e0       	ldi	r25, 0x0F	; 15
   1e598:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1e59c:	0e 94 ce 74 	call	0xe99c	; 0xe99c <lang_select>
   1e5a0:	81 11       	cpse	r24, r1
   1e5a2:	02 c0       	rjmp	.+4      	; 0x1e5a8 <main+0xb26>
		lcd_language();
   1e5a4:	0e 94 49 c4 	call	0x18892	; 0x18892 <lcd_language()>
	lang_print_sec_lang();
#endif //DEBUG_SEC_LANG

#endif //(LANG_MODE != 0)

	eeprom_init_default_byte((uint8_t*)EEPROM_TEMP_CAL_ACTIVE, 0);
   1e5a8:	60 e0       	ldi	r22, 0x00	; 0
   1e5aa:	8f ea       	ldi	r24, 0xAF	; 175
   1e5ac:	9f e0       	ldi	r25, 0x0F	; 15
   1e5ae:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>

	if (eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_PINDA) == 255) {
   1e5b2:	86 ea       	ldi	r24, 0xA6	; 166
   1e5b4:	9f e0       	ldi	r25, 0x0F	; 15
   1e5b6:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1e5ba:	8f 3f       	cpi	r24, 0xFF	; 255
   1e5bc:	d9 f4       	brne	.+54     	; 0x1e5f4 <main+0xb72>
        if (previous_value != value) {
            eeprom_byte_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_byte(dst, value);
   1e5be:	61 e0       	ldi	r22, 0x01	; 1
   1e5c0:	86 ea       	ldi	r24, 0xA6	; 166
   1e5c2:	9f e0       	ldi	r25, 0x0F	; 15
   1e5c4:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
   1e5c8:	30 eb       	ldi	r19, 0xB0	; 176
   1e5ca:	e3 2e       	mov	r14, r19
   1e5cc:	3f e0       	ldi	r19, 0x0F	; 15
   1e5ce:	f3 2e       	mov	r15, r19
        if (previous_value != value) {
            eeprom_word_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_word(dst, value);
   1e5d0:	70 e0       	ldi	r23, 0x00	; 0
   1e5d2:	60 e0       	ldi	r22, 0x00	; 0
   1e5d4:	c7 01       	movw	r24, r14
   1e5d6:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>
   1e5da:	22 e0       	ldi	r18, 0x02	; 2
   1e5dc:	e2 0e       	add	r14, r18
   1e5de:	f1 1c       	adc	r15, r1
		//eeprom_write_byte_notify((uint8_t*)EEPROM_CALIBRATION_STATUS_PINDA, 0);
		eeprom_update_byte_notify((uint8_t*)EEPROM_CALIBRATION_STATUS_PINDA, 1);
		int16_t z_shift = 0;
		for (uint8_t i = 0; i < 5; i++) {
   1e5e0:	3a eb       	ldi	r19, 0xBA	; 186
   1e5e2:	e3 16       	cp	r14, r19
   1e5e4:	3f e0       	ldi	r19, 0x0F	; 15
   1e5e6:	f3 06       	cpc	r15, r19
   1e5e8:	99 f7       	brne	.-26     	; 0x1e5d0 <main+0xb4e>
        if (previous_value != value) {
            eeprom_byte_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_byte(dst, value);
   1e5ea:	60 e0       	ldi	r22, 0x00	; 0
   1e5ec:	8f ea       	ldi	r24, 0xAF	; 175
   1e5ee:	9f e0       	ldi	r25, 0x0F	; 15
   1e5f0:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
			eeprom_update_word_notify((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + i, z_shift);
		}
		eeprom_update_byte_notify((uint8_t*)EEPROM_TEMP_CAL_ACTIVE, 0);
	}
	eeprom_init_default_byte((uint8_t*)EEPROM_UVLO, PowerPanic::NO_PENDING_RECOVERY);
   1e5f4:	60 e0       	ldi	r22, 0x00	; 0
   1e5f6:	85 ea       	ldi	r24, 0xA5	; 165
   1e5f8:	9f e0       	ldi	r25, 0x0F	; 15
   1e5fa:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
	eeprom_init_default_byte((uint8_t*)EEPROM_UVLO_Z_LIFTED, 0);
   1e5fe:	60 e0       	ldi	r22, 0x00	; 0
   1e600:	8f e7       	ldi	r24, 0x7F	; 127
   1e602:	9c e0       	ldi	r25, 0x0C	; 12
   1e604:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
	eeprom_init_default_byte((uint8_t*)EEPROM_SD_SORT, 0);
   1e608:	60 e0       	ldi	r22, 0x00	; 0
   1e60a:	89 e0       	ldi	r24, 0x09	; 9
   1e60c:	9f e0       	ldi	r25, 0x0F	; 15
   1e60e:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
}

void mbl_settings_init() {
//3x3 mesh; 3 Z-probes on each point, magnet elimination on
//magnet elimination: use aaproximate Z-coordinate instead of measured values for points which are near magnets
	eeprom_init_default_byte((uint8_t*)EEPROM_MBL_MAGNET_ELIMINATION, 1);
   1e612:	61 e0       	ldi	r22, 0x01	; 1
   1e614:	8c ea       	ldi	r24, 0xAC	; 172
   1e616:	9d e0       	ldi	r25, 0x0D	; 13
   1e618:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
	eeprom_init_default_byte((uint8_t*)EEPROM_MBL_POINTS_NR, 3);
   1e61c:	63 e0       	ldi	r22, 0x03	; 3
   1e61e:	8b ea       	ldi	r24, 0xAB	; 171
   1e620:	9d e0       	ldi	r25, 0x0D	; 13
   1e622:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
	eeprom_init_default_byte((uint8_t*)EEPROM_MBL_PROBE_NR, 3);
   1e626:	63 e0       	ldi	r22, 0x03	; 3
   1e628:	8a ea       	ldi	r24, 0xAA	; 170
   1e62a:	9d e0       	ldi	r25, 0x0D	; 13
   1e62c:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>

	//mbl_mode_init();
	mbl_settings_init();
	eeprom_init_default_byte((uint8_t*)EEPROM_MMU_STEALTH, 1);
   1e630:	61 e0       	ldi	r22, 0x01	; 1
   1e632:	89 ea       	ldi	r24, 0xA9	; 169
   1e634:	9d e0       	ldi	r25, 0x0D	; 13
   1e636:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
#if (!defined(DEBUG_DISABLE_FANCHECK) && defined(FANCHECK) && defined(TACH_1) && (TACH_1 >-1))
	setup_fan_interrupt();
#endif //DEBUG_DISABLE_FANCHECK

#ifndef DEBUG_DISABLE_STARTMSGS
  KEEPALIVE_STATE(PAUSED_FOR_USER);
   1e63a:	84 e0       	ldi	r24, 0x04	; 4
   1e63c:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
#if defined(FILAMENT_SENSOR) && defined(FSENSOR_PROBING)
    check_if_fw_is_on_right_printer();
#endif //defined(FILAMENT_SENSOR) && defined(FSENSOR_PROBING)
  }

  switch (hw_changed) {
   1e640:	02 30       	cpi	r16, 0x02	; 2
   1e642:	09 f4       	brne	.+2      	; 0x1e646 <main+0xbc4>
   1e644:	81 c0       	rjmp	.+258    	; 0x1e748 <main+0xcc6>
   1e646:	03 30       	cpi	r16, 0x03	; 3
   1e648:	09 f4       	brne	.+2      	; 0x1e64c <main+0xbca>
   1e64a:	22 c1       	rjmp	.+580    	; 0x1e890 <main+0xe0e>
   1e64c:	01 30       	cpi	r16, 0x01	; 1
   1e64e:	09 f0       	breq	.+2      	; 0x1e652 <main+0xbd0>
   1e650:	87 c0       	rjmp	.+270    	; 0x1e760 <main+0xcde>
	  //if motherboard or printer type was changed inform user as it can indicate flashing wrong firmware version
	  //if user confirms with knob, new hw version (printer and/or motherboard) is written to eeprom and message will be not shown next time
	case(0b01):
		lcd_show_fullscreen_message_and_wait_P(_T(MSG_CHANGED_MOTHERBOARD));
   1e652:	83 e5       	ldi	r24, 0x53	; 83
   1e654:	9e e4       	ldi	r25, 0x4E	; 78
   1e656:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1e65a:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
    if (active) {
        uint16_t previous_value = eeprom_read_word(dst);
        eeprom_word_notify(dst, previous_value, value, true);
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_write_word(dst, value);
   1e65e:	6b ec       	ldi	r22, 0xCB	; 203
   1e660:	70 e0       	ldi	r23, 0x00	; 0
   1e662:	8c ee       	ldi	r24, 0xEC	; 236
   1e664:	9e e0       	ldi	r25, 0x0E	; 14
   1e666:	7a c0       	rjmp	.+244    	; 0x1e75c <main+0xcda>
					first++;
					lcd_clear();
				}
			}

			if (cursor_pos < 0) {
   1e668:	1f 3f       	cpi	r17, 0xFF	; 255
   1e66a:	09 f0       	breq	.+2      	; 0x1e66e <main+0xbec>
   1e66c:	d4 cd       	rjmp	.-1112   	; 0x1e216 <main+0x794>
				cursor_pos = 0;
				Sound_MakeSound(e_SOUND_TYPE_BlindAlert);
   1e66e:	87 e0       	ldi	r24, 0x07	; 7
   1e670:	0f 94 ad 25 	call	0x24b5a	; 0x24b5a <Sound_MakeSound(eSOUND_TYPE)>
				if (first > 0) {
   1e674:	80 91 46 04 	lds	r24, 0x0446	; 0x800446 <reset_menu()::first>
   1e678:	18 16       	cp	r1, r24
   1e67a:	2c f4       	brge	.+10     	; 0x1e686 <main+0xc04>
					first--;
   1e67c:	81 50       	subi	r24, 0x01	; 1
   1e67e:	80 93 46 04 	sts	0x0446, r24	; 0x800446 <reset_menu()::first>
					lcd_clear();
   1e682:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
					lcd_clear();
				}
			}

			if (cursor_pos < 0) {
				cursor_pos = 0;
   1e686:	10 e0       	ldi	r17, 0x00	; 0
   1e688:	c6 cd       	rjmp	.-1140   	; 0x1e216 <main+0x794>
// Level input parameter sets depth of reset
static void factory_reset(char level)
{
	lcd_clear();
	Sound_MakeCustom(100,0,false);
	switch (level) {
   1e68a:	13 30       	cpi	r17, 0x03	; 3
   1e68c:	31 f1       	breq	.+76     	; 0x1e6da <main+0xc58>
   1e68e:	14 30       	cpi	r17, 0x04	; 4
   1e690:	09 f0       	breq	.+2      	; 0x1e694 <main+0xc12>
   1e692:	f4 cd       	rjmp	.-1048   	; 0x1e27c <main+0x7fa>
#endif //(FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
#endif //FILAMENT_SENSOR
		break;

	case 4:
		menu_progressbar_init(EEPROM_TOP, PSTR("ERASING all data"));
   1e694:	6c e0       	ldi	r22, 0x0C	; 12
   1e696:	77 e8       	ldi	r23, 0x87	; 135
   1e698:	80 e0       	ldi	r24, 0x00	; 0
   1e69a:	90 e1       	ldi	r25, 0x10	; 16
   1e69c:	0e 94 11 72 	call	0xe422	; 0xe422 <menu_progressbar_init(unsigned int, char const*)>
		// Erase EEPROM
		for (uint16_t i = 0; i < EEPROM_TOP; i++) {
   1e6a0:	10 e0       	ldi	r17, 0x00	; 0
   1e6a2:	00 e0       	ldi	r16, 0x00	; 0
        if (previous_value != value) {
            eeprom_byte_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_byte(dst, value);
   1e6a4:	6f ef       	ldi	r22, 0xFF	; 255
   1e6a6:	c8 01       	movw	r24, r16
   1e6a8:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
			eeprom_update_byte_notify((uint8_t*)i, 0xFF);
			menu_progressbar_update(i);
   1e6ac:	c8 01       	movw	r24, r16
   1e6ae:	0e 94 47 71 	call	0xe28e	; 0xe28e <menu_progressbar_update(unsigned int)>
		break;

	case 4:
		menu_progressbar_init(EEPROM_TOP, PSTR("ERASING all data"));
		// Erase EEPROM
		for (uint16_t i = 0; i < EEPROM_TOP; i++) {
   1e6b2:	0f 5f       	subi	r16, 0xFF	; 255
   1e6b4:	1f 4f       	sbci	r17, 0xFF	; 255
   1e6b6:	01 15       	cp	r16, r1
   1e6b8:	b0 e1       	ldi	r27, 0x10	; 16
   1e6ba:	1b 07       	cpc	r17, r27
   1e6bc:	99 f7       	brne	.-26     	; 0x1e6a4 <main+0xc22>
			eeprom_update_byte_notify((uint8_t*)i, 0xFF);
			menu_progressbar_update(i);
		}
		menu_progressbar_finish();
   1e6be:	0e 94 68 71 	call	0xe2d0	; 0xe2d0 <menu_progressbar_finish()>
		softReset();
   1e6c2:	0e 94 1f 66 	call	0xcc3e	; 0xcc3e <softReset>
	lcd_clear();
	Sound_MakeCustom(100,0,false);
	switch (level) {

	case 0: // Level 0: Language reset
		lang_reset();
   1e6c6:	0e 94 3d 74 	call	0xe87a	; 0xe87a <lang_reset>
   1e6ca:	d8 cd       	rjmp	.-1104   	; 0x1e27c <main+0x7fa>
		break;

	case 1: //Level 1: Reset statistics
		factory_reset_stats();
   1e6cc:	0e 94 e4 65 	call	0xcbc8	; 0xcbc8 <factory_reset_stats() [clone .lto_priv.403]>
		lcd_menu_statistics();
   1e6d0:	0f 94 9f 17 	call	0x22f3e	; 0x22f3e <lcd_menu_statistics()>
   1e6d4:	d3 cd       	rjmp	.-1114   	; 0x1e27c <main+0x7fa>
		break;

	case 2: // Level 2: Prepare for shipping
		factory_reset_stats();
   1e6d6:	0e 94 e4 65 	call	0xcbc8	; 0xcbc8 <factory_reset_stats() [clone .lto_priv.403]>
		// FALLTHRU

	case 3: // Level 3: Preparation after being serviced
		// Force language selection at the next boot up.
		lang_reset();
   1e6da:	0e 94 3d 74 	call	0xe87a	; 0xe87a <lang_reset>

		// Force the wizard in "Follow calibration flow" mode at the next boot up
		calibration_status_clear(CALIBRATION_FORCE_PREP);
   1e6de:	84 e0       	ldi	r24, 0x04	; 4
   1e6e0:	0e 94 f9 d6 	call	0x1adf2	; 0x1adf2 <calibration_status_clear(unsigned char)>
    if (active) {
        uint8_t previous_value = eeprom_read_byte(dst);
        eeprom_byte_notify(dst, previous_value, value, true);
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_write_byte(dst, value);
   1e6e4:	62 e0       	ldi	r22, 0x02	; 2
   1e6e6:	8f e5       	ldi	r24, 0x5F	; 95
   1e6e8:	9f e0       	ldi	r25, 0x0F	; 15
   1e6ea:	0f 94 28 a4 	call	0x34850	; 0x34850 <eeprom_write_byte>
    lcd_update(2);
    fCheckModeInit(); // alternatively invoke printer reset
}

void farm_disable() {
    farm_mode = false;
   1e6ee:	10 92 60 0d 	sts	0x0D60, r1	; 0x800d60 <farm_mode>
        if (previous_value != value) {
            eeprom_byte_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_byte(dst, value);
   1e6f2:	60 e0       	ldi	r22, 0x00	; 0
   1e6f4:	84 ec       	ldi	r24, 0xC4	; 196
   1e6f6:	9f e0       	ldi	r25, 0x0F	; 15
   1e6f8:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
		eeprom_write_byte_notify((uint8_t*)EEPROM_WIZARD_ACTIVE, 2);
		farm_disable();

#ifdef FILAMENT_SENSOR
		fsensor.setEnabled(true);
   1e6fc:	81 e0       	ldi	r24, 0x01	; 1
   1e6fe:	0e 94 90 77 	call	0xef20	; 0xef20 <Filament_sensor::setEnabled(bool)>
   1e702:	11 e0       	ldi	r17, 0x01	; 1
   1e704:	10 93 f2 16 	sts	0x16F2, r17	; 0x8016f2 <fsensor+0x1>
   1e708:	61 e0       	ldi	r22, 0x01	; 1
   1e70a:	87 e0       	ldi	r24, 0x07	; 7
   1e70c:	9f e0       	ldi	r25, 0x0F	; 15
   1e70e:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
        eeprom_update_byte_notify((uint8_t *)EEPROM_FSENS_AUTOLOAD_ENABLED, state);
    }
}

void Filament_sensor::setRunoutEnabled(bool state, bool updateEEPROM) {
    runoutEnabled = state;
   1e712:	10 93 f3 16 	sts	0x16F3, r17	; 0x8016f3 <fsensor+0x2>
   1e716:	61 e0       	ldi	r22, 0x01	; 1
   1e718:	85 ed       	ldi	r24, 0xD5	; 213
   1e71a:	9e e0       	ldi	r25, 0x0E	; 14
   1e71c:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
    return fsensorDetected;
}
#endif

void PAT9125_sensor::setJamDetectionEnabled(bool state, bool updateEEPROM) {
    jamDetection = state;
   1e720:	10 93 ff 16 	sts	0x16FF, r17	; 0x8016ff <fsensor+0xe>
    oldPos = pat9125_y;
   1e724:	80 91 38 0e 	lds	r24, 0x0E38	; 0x800e38 <pat9125_y>
   1e728:	90 91 39 0e 	lds	r25, 0x0E39	; 0x800e39 <pat9125_y+0x1>
   1e72c:	90 93 01 17 	sts	0x1701, r25	; 0x801701 <fsensor+0x10>
   1e730:	80 93 00 17 	sts	0x1700, r24	; 0x801700 <fsensor+0xf>
    resetStepCount();
   1e734:	0f 94 8d 6d 	call	0x2db1a	; 0x2db1a <PAT9125_sensor::resetStepCount() [clone .constprop.210]>
    jamErrCnt = 0;
   1e738:	10 92 06 17 	sts	0x1706, r1	; 0x801706 <fsensor+0x15>
   1e73c:	61 e0       	ldi	r22, 0x01	; 1
   1e73e:	8d ea       	ldi	r24, 0xAD	; 173
   1e740:	9c e0       	ldi	r25, 0x0C	; 12
   1e742:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
   1e746:	9a cd       	rjmp	.-1228   	; 0x1e27c <main+0x7fa>
	case(0b01):
		lcd_show_fullscreen_message_and_wait_P(_T(MSG_CHANGED_MOTHERBOARD));
		eeprom_write_word_notify((uint16_t*)EEPROM_BOARD_TYPE, MOTHERBOARD);
		break;
	case(0b10):
		lcd_show_fullscreen_message_and_wait_P(_T(MSG_CHANGED_PRINTER));
   1e748:	82 e3       	ldi	r24, 0x32	; 50
   1e74a:	9e e4       	ldi	r25, 0x4E	; 78
   1e74c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1e750:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
    if (active) {
        uint16_t previous_value = eeprom_read_word(dst);
        eeprom_word_notify(dst, previous_value, value, true);
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_write_word(dst, value);
   1e754:	6a ef       	ldi	r22, 0xFA	; 250
   1e756:	70 e0       	ldi	r23, 0x00	; 0
   1e758:	8e ee       	ldi	r24, 0xEE	; 238
   1e75a:	9e e0       	ldi	r25, 0x0E	; 14
   1e75c:	0f 94 3e a4 	call	0x3487c	; 0x3487c <eeprom_write_word>
		eeprom_write_word_notify((uint16_t*)EEPROM_BOARD_TYPE, MOTHERBOARD);
		break;
	default: break; //no change, show no message
  }

  if (!previous_settings_retrieved) {
   1e760:	b1 10       	cpse	r11, r1
   1e762:	08 c0       	rjmp	.+16     	; 0x1e774 <main+0xcf2>
	  lcd_show_fullscreen_message_and_wait_P(_T(MSG_DEFAULT_SETTINGS_LOADED)); //if EEPROM version or printer type was changed, inform user that default setting were loaded
   1e764:	8b eb       	ldi	r24, 0xBB	; 187
   1e766:	9d e4       	ldi	r25, 0x4D	; 77
   1e768:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1e76c:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
	  Config_StoreSettings();
   1e770:	0e 94 7f 87 	call	0x10efe	; 0x10efe <Config_StoreSettings()>
  }

  // handle FW and calibration status upgrade
  bool run_wizard = false;
  if (calibration_status_get(CALIBRATION_STATUS_UNKNOWN)) {
   1e774:	80 e8       	ldi	r24, 0x80	; 128
   1e776:	0e 94 5b d7 	call	0x1aeb6	; 0x1aeb6 <calibration_status_get(unsigned char)>
   1e77a:	88 23       	and	r24, r24
   1e77c:	c9 f0       	breq	.+50     	; 0x1e7b0 <main+0xd2e>
      CalibrationStatus calibration_status = 0;
      if (eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_V1) == 1) {
   1e77e:	87 ef       	ldi	r24, 0xF7	; 247
   1e780:	9f e0       	ldi	r25, 0x0F	; 15
   1e782:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
  }

  // handle FW and calibration status upgrade
  bool run_wizard = false;
  if (calibration_status_get(CALIBRATION_STATUS_UNKNOWN)) {
      CalibrationStatus calibration_status = 0;
   1e786:	60 e0       	ldi	r22, 0x00	; 0
      if (eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_V1) == 1) {
   1e788:	81 30       	cpi	r24, 0x01	; 1
   1e78a:	71 f4       	brne	.+28     	; 0x1e7a8 <main+0xd26>
          // calibrated printer upgraded from FW<3.12
          calibration_status |= (CALIBRATION_STATUS_SELFTEST | CALIBRATION_STATUS_XYZ | CALIBRATION_STATUS_Z | CALIBRATION_STATUS_LIVE_ADJUST);

          static const uint16_t v3_2_0_4[] PROGMEM = {3, 2, 0, 4};
          if (eeprom_fw_version_older_than_p(v3_2_0_4)) {
   1e78c:	8d e3       	ldi	r24, 0x3D	; 61
   1e78e:	97 e8       	ldi	r25, 0x87	; 135
   1e790:	0e 94 ec bf 	call	0x17fd8	; 0x17fd8 <eeprom_fw_version_older_than_p(unsigned int const (&) [4])>
  bool run_wizard = false;
  if (calibration_status_get(CALIBRATION_STATUS_UNKNOWN)) {
      CalibrationStatus calibration_status = 0;
      if (eeprom_read_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_V1) == 1) {
          // calibrated printer upgraded from FW<3.12
          calibration_status |= (CALIBRATION_STATUS_SELFTEST | CALIBRATION_STATUS_XYZ | CALIBRATION_STATUS_Z | CALIBRATION_STATUS_LIVE_ADJUST);
   1e794:	67 e1       	ldi	r22, 0x17	; 23

          static const uint16_t v3_2_0_4[] PROGMEM = {3, 2, 0, 4};
          if (eeprom_fw_version_older_than_p(v3_2_0_4)) {
   1e796:	88 23       	and	r24, r24
   1e798:	39 f0       	breq	.+14     	; 0x1e7a8 <main+0xd26>
              // printer upgraded from FW<3.2.0.4 and requires re-running selftest
              lcd_show_fullscreen_message_and_wait_P(_T(MSG_FORCE_SELFTEST));
   1e79a:	89 e7       	ldi	r24, 0x79	; 121
   1e79c:	9d e4       	ldi	r25, 0x4D	; 77
   1e79e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1e7a2:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
              calibration_status &= ~CALIBRATION_STATUS_SELFTEST;
   1e7a6:	66 e1       	ldi	r22, 0x16	; 22
        if (previous_value != value) {
            eeprom_byte_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_byte(dst, value);
   1e7a8:	86 ea       	ldi	r24, 0xA6	; 166
   1e7aa:	9c e0       	ldi	r25, 0x0C	; 12
   1e7ac:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
          }
      }
      eeprom_update_byte_notify((uint8_t*)EEPROM_CALIBRATION_STATUS_V2, calibration_status);
  }
  if (eeprom_fw_version_older_than_p(FW_VERSION_NR)) {
   1e7b0:	85 e3       	ldi	r24, 0x35	; 53
   1e7b2:	97 e8       	ldi	r25, 0x87	; 135
   1e7b4:	0e 94 ec bf 	call	0x17fd8	; 0x17fd8 <eeprom_fw_version_older_than_p(unsigned int const (&) [4])>
   1e7b8:	18 2f       	mov	r17, r24
   1e7ba:	88 23       	and	r24, r24
   1e7bc:	29 f0       	breq	.+10     	; 0x1e7c8 <main+0xd46>
      if (!calibration_status_get(CALIBRATION_WIZARD_STEPS)) {
   1e7be:	87 e1       	ldi	r24, 0x17	; 23
   1e7c0:	0e 94 5b d7 	call	0x1aeb6	; 0x1aeb6 <calibration_status_get(unsigned char)>
   1e7c4:	11 e0       	ldi	r17, 0x01	; 1
   1e7c6:	18 27       	eor	r17, r24

          static const uint16_t v3_2_0_4[] PROGMEM = {3, 2, 0, 4};
          if (eeprom_fw_version_older_than_p(v3_2_0_4)) {
              // printer upgraded from FW<3.2.0.4 and requires re-running selftest
              lcd_show_fullscreen_message_and_wait_P(_T(MSG_FORCE_SELFTEST));
              calibration_status &= ~CALIBRATION_STATUS_SELFTEST;
   1e7c8:	f1 2c       	mov	r15, r1
   1e7ca:	e1 2c       	mov	r14, r1
}

void update_current_firmware_version_to_eeprom()
{
    for (int8_t i = 0; i < FW_PRUSA3D_MAGIC_LEN; ++ i){
        eeprom_update_byte_notify((uint8_t*)(EEPROM_FIRMWARE_PRUSA_MAGIC+i), pgm_read_byte(FW_PRUSA3D_MAGIC_STR+i));
   1e7cc:	f7 01       	movw	r30, r14
   1e7ce:	e5 5d       	subi	r30, 0xD5	; 213
   1e7d0:	f8 47       	sbci	r31, 0x78	; 120
   1e7d2:	64 91       	lpm	r22, Z
   1e7d4:	c7 01       	movw	r24, r14
   1e7d6:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
   1e7da:	8f ef       	ldi	r24, 0xFF	; 255
   1e7dc:	e8 1a       	sub	r14, r24
   1e7de:	f8 0a       	sbc	r15, r24
    return true;
}

void update_current_firmware_version_to_eeprom()
{
    for (int8_t i = 0; i < FW_PRUSA3D_MAGIC_LEN; ++ i){
   1e7e0:	9a e0       	ldi	r25, 0x0A	; 10
   1e7e2:	e9 16       	cp	r14, r25
   1e7e4:	f1 04       	cpc	r15, r1
   1e7e6:	91 f7       	brne	.-28     	; 0x1e7cc <main+0xd4a>
        eeprom_update_byte_notify((uint8_t*)(EEPROM_FIRMWARE_PRUSA_MAGIC+i), pgm_read_byte(FW_PRUSA3D_MAGIC_STR+i));
    }
    eeprom_update_word_notify((uint16_t*)EEPROM_FIRMWARE_VERSION_MAJOR,    (uint16_t)pgm_read_word(&FW_VERSION_NR[0]));
   1e7e8:	e5 e3       	ldi	r30, 0x35	; 53
   1e7ea:	f7 e8       	ldi	r31, 0x87	; 135
   1e7ec:	65 91       	lpm	r22, Z+
   1e7ee:	74 91       	lpm	r23, Z
        if (previous_value != value) {
            eeprom_word_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_word(dst, value);
   1e7f0:	8a e0       	ldi	r24, 0x0A	; 10
   1e7f2:	90 e0       	ldi	r25, 0x00	; 0
   1e7f4:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>
    eeprom_update_word_notify((uint16_t*)EEPROM_FIRMWARE_VERSION_MINOR,    (uint16_t)pgm_read_word(&FW_VERSION_NR[1]));
   1e7f8:	e7 e3       	ldi	r30, 0x37	; 55
   1e7fa:	f7 e8       	ldi	r31, 0x87	; 135
   1e7fc:	65 91       	lpm	r22, Z+
   1e7fe:	74 91       	lpm	r23, Z
   1e800:	8c e0       	ldi	r24, 0x0C	; 12
   1e802:	90 e0       	ldi	r25, 0x00	; 0
   1e804:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>
    eeprom_update_word_notify((uint16_t*)EEPROM_FIRMWARE_VERSION_REVISION, (uint16_t)pgm_read_word(&FW_VERSION_NR[2]));
   1e808:	e9 e3       	ldi	r30, 0x39	; 57
   1e80a:	f7 e8       	ldi	r31, 0x87	; 135
   1e80c:	65 91       	lpm	r22, Z+
   1e80e:	74 91       	lpm	r23, Z
   1e810:	8e e0       	ldi	r24, 0x0E	; 14
   1e812:	90 e0       	ldi	r25, 0x00	; 0
   1e814:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>
    // See FirmwareRevisionFlavorType for the definition of firmware flavors.
    eeprom_update_word_notify((uint16_t*)EEPROM_FIRMWARE_VERSION_FLAVOR,   (uint16_t)pgm_read_word(&FW_VERSION_NR[3]));
   1e818:	eb e3       	ldi	r30, 0x3B	; 59
   1e81a:	f7 e8       	ldi	r31, 0x87	; 135
   1e81c:	65 91       	lpm	r22, Z+
   1e81e:	74 91       	lpm	r23, Z
   1e820:	80 e1       	ldi	r24, 0x10	; 16
   1e822:	90 e0       	ldi	r25, 0x00	; 0
   1e824:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>
          run_wizard = true;
      }
  }
  update_current_firmware_version_to_eeprom();

  if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE)) {
   1e828:	8f e5       	ldi	r24, 0x5F	; 95
   1e82a:	9f e0       	ldi	r25, 0x0F	; 15
   1e82c:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1e830:	88 23       	and	r24, r24
   1e832:	d9 f1       	breq	.+118    	; 0x1e8aa <main+0xe28>
      // first time run of wizard or service prep
      lcd_wizard(WizState::Run);
   1e834:	80 e0       	ldi	r24, 0x00	; 0
  }
  else if (run_wizard) {
      // some wizard steps required by the upgrade checks
      lcd_wizard(WizState::Restore);
   1e836:	0e 94 c3 eb 	call	0x1d786	; 0x1d786 <lcd_wizard(WizState)>
              lcd_show_fullscreen_message_and_wait_P(_T(MSG_TM_NOT_CAL));
#endif //THERMAL_MODEL
      }
  }

  KEEPALIVE_STATE(IN_PROCESS);
   1e83a:	83 e0       	ldi	r24, 0x03	; 3
   1e83c:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
#endif //DEBUG_DISABLE_STARTMSGS
  lcd_update_enable(true);
   1e840:	81 e0       	ldi	r24, 0x01	; 1
   1e842:	0e 94 38 70 	call	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>
  lcd_clear();
   1e846:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
  lcd_update(2);
   1e84a:	82 e0       	ldi	r24, 0x02	; 2
   1e84c:	0e 94 f9 6e 	call	0xddf2	; 0xddf2 <lcd_update(unsigned char)>
                       "Contact support to submit details."));
        }
#endif
    }
#else //XFLASH_DUMP
    dump_crash_reason crash_reason = (dump_crash_reason)eeprom_read_byte((uint8_t*)EEPROM_FW_CRASH_FLAG);
   1e850:	83 e0       	ldi	r24, 0x03	; 3
   1e852:	9d e0       	ldi	r25, 0x0D	; 13
   1e854:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1e858:	18 2f       	mov	r17, r24
    if(crash_reason != dump_crash_reason::manual && (uint8_t)crash_reason != 0xFF)
   1e85a:	8f ef       	ldi	r24, 0xFF	; 255
   1e85c:	81 0f       	add	r24, r17
   1e85e:	8e 3f       	cpi	r24, 0xFE	; 254
   1e860:	08 f0       	brcs	.+2      	; 0x1e864 <main+0xde2>
   1e862:	49 c0       	rjmp	.+146    	; 0x1e8f6 <main+0xe74>
	}
    return clicked;
}

void lcd_beeper_quick_feedback(void) {
	Sound_MakeSound(e_SOUND_TYPE_ButtonEcho);
   1e864:	80 e0       	ldi	r24, 0x00	; 0
   1e866:	0f 94 ad 25 	call	0x24b5a	; 0x24b5a <Sound_MakeSound(eSOUND_TYPE)>
    {
        lcd_beeper_quick_feedback();
        lcd_clear();
   1e86a:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>

        lcd_puts_P(_n("FIRMWARE CRASH!\nCrash reason:\n"));
   1e86e:	8e e1       	ldi	r24, 0x1E	; 30
   1e870:	99 e6       	ldi	r25, 0x69	; 105
   1e872:	0e 94 1d 6f 	call	0xde3a	; 0xde3a <lcd_puts_P(char const*)>
        switch(crash_reason)
   1e876:	12 30       	cpi	r17, 0x02	; 2
   1e878:	b1 f1       	breq	.+108    	; 0x1e8e6 <main+0xe64>
   1e87a:	13 30       	cpi	r17, 0x03	; 3
   1e87c:	09 f4       	brne	.+2      	; 0x1e880 <main+0xdfe>
   1e87e:	16 c1       	rjmp	.+556    	; 0x1eaac <main+0x102a>
        {
        case dump_crash_reason::stack_error:
            lcd_puts_P(_n("Static memory has\nbeen overwritten"));
   1e880:	8b ef       	ldi	r24, 0xFB	; 251
   1e882:	98 e6       	ldi	r25, 0x68	; 104
    {
        lcd_beeper_quick_feedback();
        lcd_clear();

        lcd_puts_P(_n("FIRMWARE CRASH!\nCrash reason:\n"));
        switch(crash_reason)
   1e884:	11 30       	cpi	r17, 0x01	; 1
   1e886:	89 f1       	breq	.+98     	; 0x1e8ea <main+0xe68>
}

void lcd_print(unsigned long n, int base)
{
	if (base == 0)
		lcd_write(n);
   1e888:	81 2f       	mov	r24, r17
   1e88a:	0e 94 a2 70 	call	0xe144	; 0xe144 <lcd_write(unsigned char) [clone .lto_priv.402]>
   1e88e:	2f c0       	rjmp	.+94     	; 0x1e8ee <main+0xe6c>
	case(0b10):
		lcd_show_fullscreen_message_and_wait_P(_T(MSG_CHANGED_PRINTER));
		eeprom_write_word_notify((uint16_t*)EEPROM_PRINTER_TYPE, PRINTER_TYPE);
		break;
	case(0b11):
		lcd_show_fullscreen_message_and_wait_P(_T(MSG_CHANGED_BOTH));
   1e890:	87 ef       	ldi	r24, 0xF7	; 247
   1e892:	9d e4       	ldi	r25, 0x4D	; 77
   1e894:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1e898:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
    if (active) {
        uint16_t previous_value = eeprom_read_word(dst);
        eeprom_word_notify(dst, previous_value, value, true);
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_write_word(dst, value);
   1e89c:	6a ef       	ldi	r22, 0xFA	; 250
   1e89e:	70 e0       	ldi	r23, 0x00	; 0
   1e8a0:	8e ee       	ldi	r24, 0xEE	; 238
   1e8a2:	9e e0       	ldi	r25, 0x0E	; 14
   1e8a4:	0f 94 3e a4 	call	0x3487c	; 0x3487c <eeprom_write_word>
   1e8a8:	da ce       	rjmp	.-588    	; 0x1e65e <main+0xbdc>
      // first time run of wizard or service prep
      lcd_wizard(WizState::Run);
  }
  else if (run_wizard) {
      // some wizard steps required by the upgrade checks
      lcd_wizard(WizState::Restore);
   1e8aa:	81 e0       	ldi	r24, 0x01	; 1

  if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE)) {
      // first time run of wizard or service prep
      lcd_wizard(WizState::Run);
  }
  else if (run_wizard) {
   1e8ac:	11 11       	cpse	r17, r1
   1e8ae:	c3 cf       	rjmp	.-122    	; 0x1e836 <main+0xdb4>
      // some wizard steps required by the upgrade checks
      lcd_wizard(WizState::Restore);
  }
  else {
      if (!calibration_status_get(CALIBRATION_STATUS_SELFTEST)) {
   1e8b0:	0e 94 5b d7 	call	0x1aeb6	; 0x1aeb6 <calibration_status_get(unsigned char)>
   1e8b4:	81 11       	cpse	r24, r1
   1e8b6:	07 c0       	rjmp	.+14     	; 0x1e8c6 <main+0xe44>
          // aborted or missing wizard: show a single warning
          lcd_show_fullscreen_message_and_wait_P(_T(MSG_FOLLOW_CALIBRATION_FLOW));
   1e8b8:	89 e0       	ldi	r24, 0x09	; 9
   1e8ba:	9d e4       	ldi	r25, 0x4D	; 77
          // wizard reset after service prep
          lcd_show_fullscreen_message_and_wait_P(_T(MSG_FOLLOW_Z_CALIBRATION_FLOW));
      } else {
          // warn about other important steps individually
          if (!calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST))
              lcd_show_fullscreen_message_and_wait_P(_T(MSG_BABYSTEP_Z_NOT_SET));
   1e8bc:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1e8c0:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
   1e8c4:	ba cf       	rjmp	.-140    	; 0x1e83a <main+0xdb8>
  else {
      if (!calibration_status_get(CALIBRATION_STATUS_SELFTEST)) {
          // aborted or missing wizard: show a single warning
          lcd_show_fullscreen_message_and_wait_P(_T(MSG_FOLLOW_CALIBRATION_FLOW));
      }
      else if (!calibration_status_get(CALIBRATION_STATUS_Z)) {
   1e8c6:	84 e0       	ldi	r24, 0x04	; 4
   1e8c8:	0e 94 5b d7 	call	0x1aeb6	; 0x1aeb6 <calibration_status_get(unsigned char)>
   1e8cc:	81 11       	cpse	r24, r1
   1e8ce:	03 c0       	rjmp	.+6      	; 0x1e8d6 <main+0xe54>
          // wizard reset after service prep
          lcd_show_fullscreen_message_and_wait_P(_T(MSG_FOLLOW_Z_CALIBRATION_FLOW));
   1e8d0:	81 e9       	ldi	r24, 0x91	; 145
   1e8d2:	9c e4       	ldi	r25, 0x4C	; 76
   1e8d4:	f3 cf       	rjmp	.-26     	; 0x1e8bc <main+0xe3a>
      } else {
          // warn about other important steps individually
          if (!calibration_status_get(CALIBRATION_STATUS_LIVE_ADJUST))
   1e8d6:	80 e1       	ldi	r24, 0x10	; 16
   1e8d8:	0e 94 5b d7 	call	0x1aeb6	; 0x1aeb6 <calibration_status_get(unsigned char)>
   1e8dc:	81 11       	cpse	r24, r1
   1e8de:	ad cf       	rjmp	.-166    	; 0x1e83a <main+0xdb8>
              lcd_show_fullscreen_message_and_wait_P(_T(MSG_BABYSTEP_Z_NOT_SET));
   1e8e0:	8a ef       	ldi	r24, 0xFA	; 250
   1e8e2:	9f e5       	ldi	r25, 0x5F	; 95
   1e8e4:	eb cf       	rjmp	.-42     	; 0x1e8bc <main+0xe3a>
        {
        case dump_crash_reason::stack_error:
            lcd_puts_P(_n("Static memory has\nbeen overwritten"));
            break;
        case dump_crash_reason::watchdog:
            lcd_puts_P(_n("Watchdog timeout"));
   1e8e6:	8a ee       	ldi	r24, 0xEA	; 234
   1e8e8:	98 e6       	ldi	r25, 0x68	; 104
   1e8ea:	0e 94 1d 6f 	call	0xde3a	; 0xde3a <lcd_puts_P(char const*)>
    }
}

void lcd_wait_for_click()
{
lcd_wait_for_click_delay(0);
   1e8ee:	90 e0       	ldi	r25, 0x00	; 0
   1e8f0:	80 e0       	ldi	r24, 0x00	; 0
   1e8f2:	0e 94 c2 df 	call	0x1bf84	; 0x1bf84 <lcd_wait_for_click_delay(unsigned int)>
        if (previous_value != value) {
            eeprom_byte_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_byte(dst, value);
   1e8f6:	6f ef       	ldi	r22, 0xFF	; 255
   1e8f8:	83 e0       	ldi	r24, 0x03	; 3
   1e8fa:	9d e0       	ldi	r25, 0x0D	; 13
   1e8fc:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
  // Only arm the uvlo interrupt _after_ a recovering print has been initialized and
  // the entire state machine initialized.
  setup_uvlo_interrupt();
#endif //UVLO_SUPPORT

  fCheckModeInit();
   1e900:	0e 94 5e d9 	call	0x1b2bc	; 0x1b2bc <fCheckModeInit()>
  KEEPALIVE_STATE(NOT_BUSY);
   1e904:	81 e0       	ldi	r24, 0x01	; 1
   1e906:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
				: "n" (_SFR_MEM_ADDR(_WD_CONTROL_REG)),
				"r" ((uint8_t)(_BV(_WD_CHANGE_BIT) | _BV(WDE))),
				"r" ((uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00) |
						_BV(WDE) | (value & 0x07)) )
				: "r0"
		);
   1e90a:	88 e1       	ldi	r24, 0x18	; 24
   1e90c:	98 e2       	ldi	r25, 0x28	; 40
   1e90e:	0f b6       	in	r0, 0x3f	; 63
   1e910:	f8 94       	cli
   1e912:	a8 95       	wdr
   1e914:	80 93 60 00 	sts	0x0060, r24	; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060>
   1e918:	0f be       	out	0x3f, r0	; 63
   1e91a:	90 93 60 00 	sts	0x0060, r25	; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060>
#ifdef WATCHDOG
  wdt_enable(WDTO_4S);
#ifdef EMERGENCY_HANDLERS
  WDTCSR |= (1 << WDIE);
   1e91e:	80 91 60 00 	lds	r24, 0x0060	; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060>
   1e922:	80 64       	ori	r24, 0x40	; 64
   1e924:	80 93 60 00 	sts	0x0060, r24	; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060>
          sei();
        }
	  }
	  else if((*ptr == CMDBUFFER_CURRENT_TYPE_USB_WITH_LINENR) && !IS_SD_PRINTING){
		  cli();
          *ptr ++ = CMDBUFFER_CURRENT_TYPE_TO_BE_REMOVED;
   1e928:	85 e0       	ldi	r24, 0x05	; 5
   1e92a:	d8 2e       	mov	r13, r24
	
	setup();
    
	for (;;) {
		loop();
		if (serialEventRun) serialEventRun();
   1e92c:	90 e0       	ldi	r25, 0x00	; 0
   1e92e:	e9 2e       	mov	r14, r25
   1e930:	90 e0       	ldi	r25, 0x00	; 0
   1e932:	f9 2e       	mov	r15, r25
        // Currently Stopped (possibly due to an error) and not accepting new serial commands.
        // Signal to the host that we're currently busy waiting for supervision.
        KEEPALIVE_STATE(PAUSED_FOR_USER);
    } else {
        // Printer is available for processing, reset state
        KEEPALIVE_STATE(NOT_BUSY);
   1e934:	cc 24       	eor	r12, r12
   1e936:	c3 94       	inc	r12
    planner_aborted = false;

    if(Stopped) {
        // Currently Stopped (possibly due to an error) and not accepting new serial commands.
        // Signal to the host that we're currently busy waiting for supervision.
        KEEPALIVE_STATE(PAUSED_FOR_USER);
   1e938:	24 e0       	ldi	r18, 0x04	; 4
   1e93a:	b2 2e       	mov	r11, r18
// The loop() function is called in an endless loop by the Arduino framework from the default main() routine.
// Before loop(), the setup() function is called by the main() routine.
void loop()
{
    // Reset a previously aborted command, we can now start processing motion again
    planner_aborted = false;
   1e93c:	10 92 42 0d 	sts	0x0D42, r1	; 0x800d42 <planner_aborted>

    if(Stopped) {
   1e940:	80 91 3b 12 	lds	r24, 0x123B	; 0x80123b <Stopped>
   1e944:	88 23       	and	r24, r24
   1e946:	09 f4       	brne	.+2      	; 0x1e94a <main+0xec8>
   1e948:	b4 c0       	rjmp	.+360    	; 0x1eab2 <main+0x1030>
        // Currently Stopped (possibly due to an error) and not accepting new serial commands.
        // Signal to the host that we're currently busy waiting for supervision.
        KEEPALIVE_STATE(PAUSED_FOR_USER);
   1e94a:	b0 92 78 02 	sts	0x0278, r11	; 0x800278 <busy_state>
    } else {
        // Printer is available for processing, reset state
        KEEPALIVE_STATE(NOT_BUSY);
    }

	if (printingIsPaused() && saved_printing_type == PowerPanic::PRINT_TYPE_HOST) { //keep believing that usb is being printed. Prevents accessing dangerous menus while pausing.
   1e94e:	0e 94 35 66 	call	0xcc6a	; 0xcc6a <printingIsPaused()>
   1e952:	88 23       	and	r24, r24
   1e954:	09 f4       	brne	.+2      	; 0x1e958 <main+0xed6>
   1e956:	b0 c0       	rjmp	.+352    	; 0x1eab8 <main+0x1036>
   1e958:	80 91 79 02 	lds	r24, 0x0279	; 0x800279 <saved_printing_type>
   1e95c:	81 30       	cpi	r24, 0x01	; 1
   1e95e:	09 f0       	breq	.+2      	; 0x1e962 <main+0xee0>
   1e960:	ab c0       	rjmp	.+342    	; 0x1eab8 <main+0x1036>
		usb_timer.start();
   1e962:	82 e4       	ldi	r24, 0x42	; 66
   1e964:	92 e1       	ldi	r25, 0x12	; 18
   1e966:	0f 94 4e 0e 	call	0x21c9c	; 0x21c9c <Timer<unsigned short>::start()>
    }
    else
#endif
    {

        get_command();
   1e96a:	0e 94 a5 87 	call	0x10f4a	; 0x10f4a <get_command()>
  // The SD start is delayed because otherwise the serial cannot answer
  // fast enough to make contact with the host software.
  static bool autostart_stilltocheck = true;
  if(!force)
  {
    if(!autostart_stilltocheck)
   1e96e:	80 91 56 02 	lds	r24, 0x0256	; 0x800256 <_ZZN10CardReader14checkautostartEbE22autostart_stilltocheck.lto_priv.515>
   1e972:	88 23       	and	r24, r24
   1e974:	89 f0       	breq	.+34     	; 0x1e998 <main+0xf16>
      return;
    if(autostart_atmillis.expired(5000))
   1e976:	68 e8       	ldi	r22, 0x88	; 136
   1e978:	73 e1       	ldi	r23, 0x13	; 19
   1e97a:	88 ee       	ldi	r24, 0xE8	; 232
   1e97c:	96 e1       	ldi	r25, 0x16	; 22
   1e97e:	0f 94 1f 0e 	call	0x21c3e	; 0x21c3e <Timer<unsigned short>::expired(unsigned short)>
   1e982:	81 11       	cpse	r24, r1
   1e984:	09 c0       	rjmp	.+18     	; 0x1e998 <main+0xf16>
      return;
  }
  autostart_stilltocheck = false;
   1e986:	10 92 56 02 	sts	0x0256, r1	; 0x800256 <_ZZN10CardReader14checkautostartEbE22autostart_stilltocheck.lto_priv.515>
  if(!mounted)
   1e98a:	80 91 d8 13 	lds	r24, 0x13D8	; 0x8013d8 <card+0x3>
   1e98e:	88 23       	and	r24, r24
   1e990:	09 f4       	brne	.+2      	; 0x1e994 <main+0xf12>
   1e992:	9e c0       	rjmp	.+316    	; 0x1ead0 <main+0x104e>
   1e994:	0f 94 32 68 	call	0x2d064	; 0x2d064 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.242]>

  #ifdef SDSUPPORT
  card.checkautostart(false);
  #endif
  if(buflen)
   1e998:	80 91 3c 12 	lds	r24, 0x123C	; 0x80123c <buflen>
   1e99c:	90 91 3d 12 	lds	r25, 0x123D	; 0x80123d <buflen+0x1>
   1e9a0:	89 2b       	or	r24, r25
   1e9a2:	09 f4       	brne	.+2      	; 0x1e9a6 <main+0xf24>
   1e9a4:	63 c0       	rjmp	.+198    	; 0x1ea6c <main+0xfea>
  {
    cmdbuffer_front_already_processed = false;
   1e9a6:	10 92 53 12 	sts	0x1253, r1	; 0x801253 <cmdbuffer_front_already_processed>
    #ifdef SDSUPPORT
      if(card.saving)
   1e9aa:	80 91 d5 13 	lds	r24, 0x13D5	; 0x8013d5 <card>
   1e9ae:	88 23       	and	r24, r24
   1e9b0:	c1 f1       	breq	.+112    	; 0x1ea22 <main+0xfa0>
      {
        // Saving a G-code file onto an SD-card is in progress.
        // Saving starts with M28, saving until M29 is seen.
        if(strstr_P(CMDBUFFER_CURRENT_STRING, PSTR("M29")) == NULL) {
   1e9b2:	00 91 38 12 	lds	r16, 0x1238	; 0x801238 <bufindr>
   1e9b6:	10 91 39 12 	lds	r17, 0x1239	; 0x801239 <bufindr+0x1>
   1e9ba:	02 5b       	subi	r16, 0xB2	; 178
   1e9bc:	1f 4e       	sbci	r17, 0xEF	; 239
   1e9be:	6e e7       	ldi	r22, 0x7E	; 126
   1e9c0:	77 e8       	ldi	r23, 0x87	; 135
   1e9c2:	c8 01       	movw	r24, r16
   1e9c4:	0f 94 e7 a1 	call	0x343ce	; 0x343ce <strstr_P>
   1e9c8:	89 2b       	or	r24, r25
   1e9ca:	09 f0       	breq	.+2      	; 0x1e9ce <main+0xf4c>
   1e9cc:	8e c0       	rjmp	.+284    	; 0x1eaea <main+0x1068>
    else
        SERIAL_PROTOCOLLNPGM("Not SD printing");
}
void CardReader::write_command(char *buf)
{
  file.writeError = false;
   1e9ce:	10 92 67 16 	sts	0x1667, r1	; 0x801667 <card+0x292>
/** Write a string to a file. Used by the Arduino Print class.
 * \param[in] str Pointer to the string.
 * Use writeError to check for errors.
 */
void SdFile::write(const char* str) {
  SdBaseFile::write(str, strlen(str));
   1e9d2:	f8 01       	movw	r30, r16
   1e9d4:	01 90       	ld	r0, Z+
   1e9d6:	00 20       	and	r0, r0
   1e9d8:	e9 f7       	brne	.-6      	; 0x1e9d4 <main+0xf52>
   1e9da:	31 97       	sbiw	r30, 0x01	; 1
   1e9dc:	bf 01       	movw	r22, r30
   1e9de:	60 1b       	sub	r22, r16
   1e9e0:	71 0b       	sbc	r23, r17
   1e9e2:	c8 01       	movw	r24, r16
   1e9e4:	0f 94 09 76 	call	0x2ec12	; 0x2ec12 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]>
   1e9e8:	62 e0       	ldi	r22, 0x02	; 2
   1e9ea:	70 e0       	ldi	r23, 0x00	; 0
   1e9ec:	8d ed       	ldi	r24, 0xDD	; 221
   1e9ee:	92 e0       	ldi	r25, 0x02	; 2
   1e9f0:	0f 94 09 76 	call	0x2ec12	; 0x2ec12 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]>
  file.write(buf); //write command
  file.write("\r\n"); //write line termination
  if (file.writeError)
   1e9f4:	80 91 67 16 	lds	r24, 0x1667	; 0x801667 <card+0x292>
   1e9f8:	88 23       	and	r24, r24
   1e9fa:	41 f0       	breq	.+16     	; 0x1ea0c <main+0xf8a>
  {
    SERIAL_ERROR_START;
   1e9fc:	81 eb       	ldi	r24, 0xB1	; 177
   1e9fe:	91 ea       	ldi	r25, 0xA1	; 161
   1ea00:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    SERIAL_ERRORLNRPGM(MSG_SD_ERR_WRITE_TO_FILE);
   1ea04:	88 ec       	ldi	r24, 0xC8	; 200
   1ea06:	99 e6       	ldi	r25, 0x69	; 105
   1ea08:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
          card.write_command(CMDBUFFER_CURRENT_STRING);
          if(card.logging)
   1ea0c:	80 91 d6 13 	lds	r24, 0x13D6	; 0x8013d6 <card+0x1>
   1ea10:	88 23       	and	r24, r24
   1ea12:	09 f4       	brne	.+2      	; 0x1ea16 <main+0xf94>
   1ea14:	65 c0       	rjmp	.+202    	; 0x1eae0 <main+0x105e>
*/


void process_commands()
{
	if (!buflen) return; //empty command
   1ea16:	80 91 3c 12 	lds	r24, 0x123C	; 0x80123c <buflen>
   1ea1a:	90 91 3d 12 	lds	r25, 0x123D	; 0x80123d <buflen+0x1>
   1ea1e:	89 2b       	or	r24, r25
   1ea20:	11 f0       	breq	.+4      	; 0x1ea26 <main+0xfa4>
   1ea22:	0e 94 dc 8f 	call	0x11fb8	; 0x11fb8 <process_commands() [clone .part.46]>
      }
    #else
      process_commands();
    #endif //SDSUPPORT

    if (! cmdbuffer_front_already_processed && buflen)
   1ea26:	80 91 53 12 	lds	r24, 0x1253	; 0x801253 <cmdbuffer_front_already_processed>
   1ea2a:	81 11       	cpse	r24, r1
   1ea2c:	19 c0       	rjmp	.+50     	; 0x1ea60 <main+0xfde>
   1ea2e:	80 91 3c 12 	lds	r24, 0x123C	; 0x80123c <buflen>
   1ea32:	90 91 3d 12 	lds	r25, 0x123D	; 0x80123d <buflen+0x1>
   1ea36:	89 2b       	or	r24, r25
   1ea38:	99 f0       	breq	.+38     	; 0x1ea60 <main+0xfde>
    {
      // ptr points to the start of the block currently being processed.
      // The first character in the block is the block type.
      char *ptr = cmdbuffer + bufindr;
   1ea3a:	e0 91 38 12 	lds	r30, 0x1238	; 0x801238 <bufindr>
   1ea3e:	f0 91 39 12 	lds	r31, 0x1239	; 0x801239 <bufindr+0x1>
   1ea42:	e5 5b       	subi	r30, 0xB5	; 181
   1ea44:	ff 4e       	sbci	r31, 0xEF	; 239
      if (*ptr == CMDBUFFER_CURRENT_TYPE_SDCARD) {
   1ea46:	80 81       	ld	r24, Z
   1ea48:	82 30       	cpi	r24, 0x02	; 2
   1ea4a:	09 f0       	breq	.+2      	; 0x1ea4e <main+0xfcc>
   1ea4c:	53 c0       	rjmp	.+166    	; 0x1eaf4 <main+0x1072>
        {
          // This block locks the interrupts globally for 3.25 us,
          // which corresponds to a maximum repeat frequency of 307.69 kHz.
          // This blocking is safe in the context of a 10kHz stepper driver interrupt
          // or a 115200 Bd serial line receive interrupt, which will not trigger faster than 12kHz.
          cli();
   1ea4e:	f8 94       	cli
          // Reset the command to something, which will be ignored by the power panic routine,
          // so this buffer length will not be counted twice.
          *ptr ++ = CMDBUFFER_CURRENT_TYPE_TO_BE_REMOVED;
   1ea50:	d0 82       	st	Z, r13
          // Extract the current buffer length.
          sdlen.lohi.lo = *ptr ++;
          sdlen.lohi.hi = *ptr;
          // and pass it to the planner queue.
          planner_add_sd_length(sdlen.value);
   1ea52:	81 81       	ldd	r24, Z+1	; 0x01
   1ea54:	92 81       	ldd	r25, Z+2	; 0x02
	  }
	  else if((*ptr == CMDBUFFER_CURRENT_TYPE_USB_WITH_LINENR) && !IS_SD_PRINTING){
		  cli();
          *ptr ++ = CMDBUFFER_CURRENT_TYPE_TO_BE_REMOVED;
          // and one for each command to previous block in the planner queue.
          planner_add_sd_length(1);
   1ea56:	0f 94 8d 3c 	call	0x2791a	; 0x2791a <planner_add_sd_length(unsigned int)>
          sei();
   1ea5a:	78 94       	sei
	  }
      // Now it is safe to release the already processed command block. If interrupted by the power panic now,
      // this block's SD card length will not be counted twice as its command type has been replaced
      // by CMDBUFFER_CURRENT_TYPE_TO_BE_REMOVED.
      cmdqueue_pop_front();
   1ea5c:	0e 94 43 79 	call	0xf286	; 0xf286 <cmdqueue_pop_front()>
*/
void host_keepalive() {
#ifndef HOST_KEEPALIVE_FEATURE
  return;
#endif //HOST_KEEPALIVE_FEATURE
  if (farm_mode) return;
   1ea60:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   1ea64:	81 11       	cpse	r24, r1
   1ea66:	02 c0       	rjmp	.+4      	; 0x1ea6c <main+0xfea>
   1ea68:	0e 94 c1 7c 	call	0xf982	; 0xf982 <host_keepalive() [clone .part.30]>
    }
	host_keepalive();
  }
}
  //check heater every n milliseconds
  manage_heater();
   1ea6c:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
  manage_inactivity(printingIsPaused());
   1ea70:	0e 94 35 66 	call	0xcc6a	; 0xcc6a <printingIsPaused()>
   1ea74:	0e 94 34 8c 	call	0x11868	; 0x11868 <manage_inactivity(bool)>
//=============================functions         ============================
//===========================================================================

void checkHitEndstops()
{
 if(endstop_hit) {
   1ea78:	80 91 5e 04 	lds	r24, 0x045E	; 0x80045e <_ZL11endstop_hit.lto_priv.442>
   1ea7c:	81 11       	cpse	r24, r1
            SERIAL_ECHO(float(endstops_trigsteps[axis]) / cs.axis_steps_per_mm[axis]);
        }
    }
   SERIAL_ECHOLN("");
#endif //VERBOSE_CHECK_HIT_ENDSTOPS
   endstop_hit = 0;
   1ea7e:	10 92 5e 04 	sts	0x045E, r1	; 0x80045e <_ZL11endstop_hit.lto_priv.442>
  checkHitEndstops();
  lcd_update(0);
   1ea82:	80 e0       	ldi	r24, 0x00	; 0
   1ea84:	0e 94 f9 6e 	call	0xddf2	; 0xddf2 <lcd_update(unsigned char)>
void MMU2::mmu_loop() {
    // We only leave this method if the current command was successfully completed - that's the Marlin's way of blocking operation
    // Atomic compare_exchange would have been the most appropriate solution here, but this gets called only in Marlin's task,
    // so thread safety should be kept
    static bool avoidRecursion = false;
    if (avoidRecursion) {
   1ea88:	80 91 5f 04 	lds	r24, 0x045F	; 0x80045f <_ZZN4MMU24MMU28mmu_loopEvE14avoidRecursion.lto_priv.503>
   1ea8c:	81 11       	cpse	r24, r1
   1ea8e:	07 c0       	rjmp	.+14     	; 0x1ea9e <main+0x101c>
        return;
    }
    avoidRecursion = true;
   1ea90:	c0 92 5f 04 	sts	0x045F, r12	; 0x80045f <_ZZN4MMU24MMU28mmu_loopEvE14avoidRecursion.lto_priv.503>
    mmu_loop_inner(true);
   1ea94:	81 e0       	ldi	r24, 0x01	; 1
   1ea96:	0f 94 38 97 	call	0x32e70	; 0x32e70 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]>
    avoidRecursion = false;
   1ea9a:	10 92 5f 04 	sts	0x045F, r1	; 0x80045f <_ZZN4MMU24MMU28mmu_loopEvE14avoidRecursion.lto_priv.503>
   1ea9e:	e1 14       	cp	r14, r1
   1eaa0:	f1 04       	cpc	r15, r1
   1eaa2:	09 f4       	brne	.+2      	; 0x1eaa6 <main+0x1024>
   1eaa4:	4b cf       	rjmp	.-362    	; 0x1e93c <main+0xeba>
   1eaa6:	0e 94 00 00 	call	0	; 0x0 <__vectors>
   1eaaa:	48 cf       	rjmp	.-368    	; 0x1e93c <main+0xeba>
            break;
        case dump_crash_reason::watchdog:
            lcd_puts_P(_n("Watchdog timeout"));
            break;
        case dump_crash_reason::bad_isr:
            lcd_puts_P(_n("Bad interrupt"));
   1eaac:	8c ed       	ldi	r24, 0xDC	; 220
   1eaae:	98 e6       	ldi	r25, 0x68	; 104
   1eab0:	1c cf       	rjmp	.-456    	; 0x1e8ea <main+0xe68>
        // Currently Stopped (possibly due to an error) and not accepting new serial commands.
        // Signal to the host that we're currently busy waiting for supervision.
        KEEPALIVE_STATE(PAUSED_FOR_USER);
    } else {
        // Printer is available for processing, reset state
        KEEPALIVE_STATE(NOT_BUSY);
   1eab2:	c0 92 78 02 	sts	0x0278, r12	; 0x800278 <busy_state>
   1eab6:	4b cf       	rjmp	.-362    	; 0x1e94e <main+0xecc>
    }

	if (printingIsPaused() && saved_printing_type == PowerPanic::PRINT_TYPE_HOST) { //keep believing that usb is being printed. Prevents accessing dangerous menus while pausing.
		usb_timer.start();
	}
	else if (usb_timer.expired(USB_TIMER_TIMEOUT)) { //just need to check if it expired. Nothing else is needed to be done.
   1eab8:	60 e1       	ldi	r22, 0x10	; 16
   1eaba:	77 e2       	ldi	r23, 0x27	; 39
   1eabc:	82 e4       	ldi	r24, 0x42	; 66
   1eabe:	92 e1       	ldi	r25, 0x12	; 18
   1eac0:	0f 94 1f 0e 	call	0x21c3e	; 0x21c3e <Timer<unsigned short>::expired(unsigned short)>
   1eac4:	88 23       	and	r24, r24
   1eac6:	09 f4       	brne	.+2      	; 0x1eaca <main+0x1048>
   1eac8:	50 cf       	rjmp	.-352    	; 0x1e96a <main+0xee8>
   1eaca:	b0 92 61 0d 	sts	0x0D61, r11	; 0x800d61 <_ZL13printer_state.lto_priv.386>
   1eace:	4d cf       	rjmp	.-358    	; 0x1e96a <main+0xee8>
      return;
  }
  autostart_stilltocheck = false;
  if(!mounted)
  {
    mount();
   1ead0:	81 e0       	ldi	r24, 0x01	; 1
   1ead2:	0f 94 6a 73 	call	0x2e6d4	; 0x2e6d4 <CardReader::mount(bool) [clone .constprop.192]>
    if(!mounted) //fail
   1ead6:	80 91 d8 13 	lds	r24, 0x13D8	; 0x8013d8 <card+0x3>
   1eada:	81 11       	cpse	r24, r1
   1eadc:	5b cf       	rjmp	.-330    	; 0x1e994 <main+0xf12>
   1eade:	5c cf       	rjmp	.-328    	; 0x1e998 <main+0xf16>
        if(strstr_P(CMDBUFFER_CURRENT_STRING, PSTR("M29")) == NULL) {
          card.write_command(CMDBUFFER_CURRENT_STRING);
          if(card.logging)
            process_commands();
          else
           SERIAL_PROTOCOLLNRPGM(MSG_OK);
   1eae0:	80 ef       	ldi	r24, 0xF0	; 240
   1eae2:	99 e6       	ldi	r25, 0x69	; 105
        } else {
          card.closefile();
          SERIAL_PROTOCOLLNRPGM(MSG_FILE_SAVED);
   1eae4:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   1eae8:	9e cf       	rjmp	.-196    	; 0x1ea26 <main+0xfa4>
          if(card.logging)
            process_commands();
          else
           SERIAL_PROTOCOLLNRPGM(MSG_OK);
        } else {
          card.closefile();
   1eaea:	0f 94 f9 65 	call	0x2cbf2	; 0x2cbf2 <CardReader::closefile(bool) [clone .constprop.307]>
          SERIAL_PROTOCOLLNRPGM(MSG_FILE_SAVED);
   1eaee:	8e ed       	ldi	r24, 0xDE	; 222
   1eaf0:	99 e6       	ldi	r25, 0x69	; 105
   1eaf2:	f8 cf       	rjmp	.-16     	; 0x1eae4 <main+0x1062>
          // and pass it to the planner queue.
          planner_add_sd_length(sdlen.value);
          sei();
        }
	  }
	  else if((*ptr == CMDBUFFER_CURRENT_TYPE_USB_WITH_LINENR) && !IS_SD_PRINTING){
   1eaf4:	86 30       	cpi	r24, 0x06	; 6
   1eaf6:	09 f0       	breq	.+2      	; 0x1eafa <main+0x1078>
   1eaf8:	b1 cf       	rjmp	.-158    	; 0x1ea5c <main+0xfda>
   1eafa:	80 91 d7 13 	lds	r24, 0x13D7	; 0x8013d7 <card+0x2>
   1eafe:	81 11       	cpse	r24, r1
   1eb00:	ad cf       	rjmp	.-166    	; 0x1ea5c <main+0xfda>
		  cli();
   1eb02:	f8 94       	cli
          *ptr ++ = CMDBUFFER_CURRENT_TYPE_TO_BE_REMOVED;
   1eb04:	d0 82       	st	Z, r13
          // and one for each command to previous block in the planner queue.
          planner_add_sd_length(1);
   1eb06:	81 e0       	ldi	r24, 0x01	; 1
   1eb08:	90 e0       	ldi	r25, 0x00	; 0
   1eb0a:	a5 cf       	rjmp	.-182    	; 0x1ea56 <main+0xfd4>
{
	uint8_t version_changed = 0;
	uint16_t printer_type = eeprom_init_default_word((uint16_t*)EEPROM_PRINTER_TYPE, PRINTER_TYPE);
	uint16_t motherboard = eeprom_init_default_word((uint16_t*)EEPROM_BOARD_TYPE, MOTHERBOARD);

	if (printer_type != PRINTER_TYPE) version_changed |= 0b10;
   1eb0c:	02 e0       	ldi	r16, 0x02	; 2
	if (motherboard != MOTHERBOARD) version_changed |= 0b01;
   1eb0e:	8b 3c       	cpi	r24, 0xCB	; 203
   1eb10:	91 05       	cpc	r25, r1
   1eb12:	09 f0       	breq	.+2      	; 0x1eb16 <main+0x1094>
   1eb14:	03 e0       	ldi	r16, 0x03	; 3
	uint8_t hw_changed = check_printer_version();
	if (!(hw_changed & 0b10)) { //if printer version wasn't changed, check for eeprom version and retrieve settings from eeprom in case that version wasn't changed
		previous_settings_retrieved = Config_RetrieveSettings();
	}
	else { //printer version was changed so use default settings
		Config_ResetDefault();
   1eb16:	0e 94 ee 86 	call	0x10ddc	; 0x10ddc <Config_ResetDefault()>
	SERIAL_ECHORPGM(_n("  PlannerBufferBytes: "));////MSG_PLANNER_BUFFER_BYTES
	SERIAL_ECHOLN((int)sizeof(block_t)*BLOCK_BUFFER_SIZE);
	//lcd_update_enable(false); // why do we need this?? - andre
	// loads data from EEPROM if available else uses defaults (and resets step acceleration rate)

	bool previous_settings_retrieved = false;
   1eb1a:	b1 2c       	mov	r11, r1
void SdFatUtil::set_stack_guard()
{
	uint32_t *stack_guard;

	stack_guard = (uint32_t*)(&__bss_end + STACK_GUARD_MARGIN);
    *stack_guard = STACK_GUARD_TEST_VALUE;
   1eb1c:	82 ea       	ldi	r24, 0xA2	; 162
   1eb1e:	92 ea       	ldi	r25, 0xA2	; 162
   1eb20:	a0 e0       	ldi	r26, 0x00	; 0
   1eb22:	b0 e0       	ldi	r27, 0x00	; 0
   1eb24:	80 93 37 17 	sts	0x1737, r24	; 0x801737 <__bss_end+0x20>
   1eb28:	90 93 38 17 	sts	0x1738, r25	; 0x801738 <__bss_end+0x21>
   1eb2c:	a0 93 39 17 	sts	0x1739, r26	; 0x801739 <__bss_end+0x22>
   1eb30:	b0 93 3a 17 	sts	0x173A, r27	; 0x80173a <__bss_end+0x23>
  // Finish init of mult extruder arrays
  for(int e = 0; e < EXTRUDERS; e++) {
    // populate with the first value
    maxttemp[e] = maxttemp[0];
#ifdef PIDTEMP
    iState_sum_min[e] = 0.0;
   1eb34:	10 92 1c 04 	sts	0x041C, r1	; 0x80041c <_ZL14iState_sum_min.lto_priv.434>
   1eb38:	10 92 1d 04 	sts	0x041D, r1	; 0x80041d <_ZL14iState_sum_min.lto_priv.434+0x1>
   1eb3c:	10 92 1e 04 	sts	0x041E, r1	; 0x80041e <_ZL14iState_sum_min.lto_priv.434+0x2>
   1eb40:	10 92 1f 04 	sts	0x041F, r1	; 0x80041f <_ZL14iState_sum_min.lto_priv.434+0x3>
    iState_sum_max[e] = PID_INTEGRAL_DRIVE_MAX / cs.Ki;
   1eb44:	20 91 d3 0d 	lds	r18, 0x0DD3	; 0x800dd3 <cs+0x6c>
   1eb48:	30 91 d4 0d 	lds	r19, 0x0DD4	; 0x800dd4 <cs+0x6d>
   1eb4c:	40 91 d5 0d 	lds	r20, 0x0DD5	; 0x800dd5 <cs+0x6e>
   1eb50:	50 91 d6 0d 	lds	r21, 0x0DD6	; 0x800dd6 <cs+0x6f>
   1eb54:	60 e0       	ldi	r22, 0x00	; 0
   1eb56:	70 e0       	ldi	r23, 0x00	; 0
   1eb58:	8f e7       	ldi	r24, 0x7F	; 127
   1eb5a:	93 e4       	ldi	r25, 0x43	; 67
   1eb5c:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   1eb60:	60 93 18 04 	sts	0x0418, r22	; 0x800418 <_ZL14iState_sum_max.lto_priv.435>
   1eb64:	70 93 19 04 	sts	0x0419, r23	; 0x800419 <_ZL14iState_sum_max.lto_priv.435+0x1>
   1eb68:	80 93 1a 04 	sts	0x041A, r24	; 0x80041a <_ZL14iState_sum_max.lto_priv.435+0x2>
   1eb6c:	90 93 1b 04 	sts	0x041B, r25	; 0x80041b <_ZL14iState_sum_max.lto_priv.435+0x3>
#endif //PIDTEMP
#ifdef PIDTEMPBED
    temp_iState_min_bed = 0.0;
   1eb70:	10 92 14 04 	sts	0x0414, r1	; 0x800414 <_ZL19temp_iState_min_bed.lto_priv.432>
   1eb74:	10 92 15 04 	sts	0x0415, r1	; 0x800415 <_ZL19temp_iState_min_bed.lto_priv.432+0x1>
   1eb78:	10 92 16 04 	sts	0x0416, r1	; 0x800416 <_ZL19temp_iState_min_bed.lto_priv.432+0x2>
   1eb7c:	10 92 17 04 	sts	0x0417, r1	; 0x800417 <_ZL19temp_iState_min_bed.lto_priv.432+0x3>
    temp_iState_max_bed = PID_INTEGRAL_DRIVE_MAX / cs.bedKi;
   1eb80:	20 91 df 0d 	lds	r18, 0x0DDF	; 0x800ddf <cs+0x78>
   1eb84:	30 91 e0 0d 	lds	r19, 0x0DE0	; 0x800de0 <cs+0x79>
   1eb88:	40 91 e1 0d 	lds	r20, 0x0DE1	; 0x800de1 <cs+0x7a>
   1eb8c:	50 91 e2 0d 	lds	r21, 0x0DE2	; 0x800de2 <cs+0x7b>
   1eb90:	60 e0       	ldi	r22, 0x00	; 0
   1eb92:	70 e0       	ldi	r23, 0x00	; 0
   1eb94:	8f e7       	ldi	r24, 0x7F	; 127
   1eb96:	93 e4       	ldi	r25, 0x43	; 67
   1eb98:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   1eb9c:	60 93 10 04 	sts	0x0410, r22	; 0x800410 <_ZL19temp_iState_max_bed.lto_priv.433>
   1eba0:	70 93 11 04 	sts	0x0411, r23	; 0x800411 <_ZL19temp_iState_max_bed.lto_priv.433+0x1>
   1eba4:	80 93 12 04 	sts	0x0412, r24	; 0x800412 <_ZL19temp_iState_max_bed.lto_priv.433+0x2>
   1eba8:	90 93 13 04 	sts	0x0413, r25	; 0x800413 <_ZL19temp_iState_max_bed.lto_priv.433+0x3>
#endif //PIDTEMPBED
  }

  #if defined(HEATER_0_PIN) && (HEATER_0_PIN > -1)
    SET_OUTPUT(HEATER_0_PIN);
   1ebac:	6d 9a       	sbi	0x0d, 5	; 13
  #endif
  #if defined(HEATER_BED_PIN) && (HEATER_BED_PIN > -1)
    SET_OUTPUT(HEATER_BED_PIN);
   1ebae:	9d 9a       	sbi	0x13, 5	; 19
  #endif
  #if defined(FAN_PIN) && (FAN_PIN > -1)
    SET_OUTPUT(FAN_PIN);
   1ebb0:	80 91 01 01 	lds	r24, 0x0101	; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101>
   1ebb4:	88 60       	ori	r24, 0x08	; 8
   1ebb6:	80 93 01 01 	sts	0x0101, r24	; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101>
    #ifdef FAST_PWM_FAN
    setPwmFrequency(FAN_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8
    #endif
    #ifdef FAN_SOFT_PWM
    soft_pwm_fan = fanSpeedSoftPwm / (1 << (8 - FAN_SOFT_PWM_BITS));
   1ebba:	80 91 1d 06 	lds	r24, 0x061D	; 0x80061d <fanSpeedSoftPwm>
   1ebbe:	90 e0       	ldi	r25, 0x00	; 0
   1ebc0:	64 e0       	ldi	r22, 0x04	; 4
   1ebc2:	95 95       	asr	r25
   1ebc4:	87 95       	ror	r24
   1ebc6:	6a 95       	dec	r22
   1ebc8:	e1 f7       	brne	.-8      	; 0x1ebc2 <main+0x1140>
   1ebca:	80 93 0f 04 	sts	0x040F, r24	; 0x80040f <_ZL12soft_pwm_fan.lto_priv.437>
	pinMode(MAX6675_SS, OUTPUT);
	digitalWrite(MAX6675_SS,1);
  #endif

#ifdef HEATER_0_MINTEMP
  minttemp[0] = HEATER_0_MINTEMP;
   1ebce:	8e e1       	ldi	r24, 0x1E	; 30
   1ebd0:	90 e0       	ldi	r25, 0x00	; 0
   1ebd2:	90 93 0e 04 	sts	0x040E, r25	; 0x80040e <_ZL8minttemp.lto_priv.427+0x1>
   1ebd6:	80 93 0d 04 	sts	0x040D, r24	; 0x80040d <_ZL8minttemp.lto_priv.427>
  while(analog2temp(minttemp_raw[0], 0) < HEATER_0_MINTEMP) {
   1ebda:	80 91 52 02 	lds	r24, 0x0252	; 0x800252 <_ZL12minttemp_raw.lto_priv.429>
   1ebde:	90 91 53 02 	lds	r25, 0x0253	; 0x800253 <_ZL12minttemp_raw.lto_priv.429+0x1>
   1ebe2:	0f 94 66 8f 	call	0x31ecc	; 0x31ecc <analog2temp(int, unsigned char) [clone .constprop.59]>
   1ebe6:	20 e0       	ldi	r18, 0x00	; 0
   1ebe8:	30 e0       	ldi	r19, 0x00	; 0
   1ebea:	40 ef       	ldi	r20, 0xF0	; 240
   1ebec:	51 e4       	ldi	r21, 0x41	; 65
   1ebee:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   1ebf2:	87 ff       	sbrs	r24, 7
   1ebf4:	6e c9       	rjmp	.-3364   	; 0x1ded2 <main+0x450>
#if HEATER_0_RAW_LO_TEMP < HEATER_0_RAW_HI_TEMP
    minttemp_raw[0] += OVERSAMPLENR;
#else
    minttemp_raw[0] -= OVERSAMPLENR;
   1ebf6:	80 91 52 02 	lds	r24, 0x0252	; 0x800252 <_ZL12minttemp_raw.lto_priv.429>
   1ebfa:	90 91 53 02 	lds	r25, 0x0253	; 0x800253 <_ZL12minttemp_raw.lto_priv.429+0x1>
   1ebfe:	40 97       	sbiw	r24, 0x10	; 16
   1ec00:	90 93 53 02 	sts	0x0253, r25	; 0x800253 <_ZL12minttemp_raw.lto_priv.429+0x1>
   1ec04:	80 93 52 02 	sts	0x0252, r24	; 0x800252 <_ZL12minttemp_raw.lto_priv.429>
   1ec08:	e8 cf       	rjmp	.-48     	; 0x1ebda <main+0x1158>

0001ec0a <lcd_commands() [clone .part.42]>:
	}
}

void lcd_print_stop_finish();

void lcd_commands()
   1ec0a:	2f 92       	push	r2
   1ec0c:	3f 92       	push	r3
   1ec0e:	4f 92       	push	r4
   1ec10:	5f 92       	push	r5
   1ec12:	6f 92       	push	r6
   1ec14:	7f 92       	push	r7
   1ec16:	8f 92       	push	r8
   1ec18:	9f 92       	push	r9
   1ec1a:	af 92       	push	r10
   1ec1c:	bf 92       	push	r11
   1ec1e:	cf 92       	push	r12
   1ec20:	df 92       	push	r13
   1ec22:	ef 92       	push	r14
   1ec24:	ff 92       	push	r15
   1ec26:	0f 93       	push	r16
   1ec28:	1f 93       	push	r17
   1ec2a:	cf 93       	push	r28
   1ec2c:	df 93       	push	r29
    if (planner_aborted) {
        // we are still within an aborted command. do not process any LCD command until we return
        return;
    }

    if (lcd_commands_type == LcdCommands::StopPrint)
   1ec2e:	80 91 5e 0d 	lds	r24, 0x0D5E	; 0x800d5e <lcd_commands_type>
   1ec32:	81 30       	cpi	r24, 0x01	; 1
   1ec34:	09 f0       	breq	.+2      	; 0x1ec38 <lcd_commands() [clone .part.42]+0x2e>
   1ec36:	61 c0       	rjmp	.+194    	; 0x1ecfa <lcd_commands() [clone .part.42]+0xf0>
  return(block);
}

// Returns true if the buffer has a queued block, false otherwise
FORCE_INLINE bool blocks_queued() {
	return (block_buffer_head != block_buffer_tail);
   1ec38:	90 91 3e 0d 	lds	r25, 0x0D3E	; 0x800d3e <block_buffer_head>
   1ec3c:	80 91 3f 0d 	lds	r24, 0x0D3F	; 0x800d3f <block_buffer_tail>
    {
        if (!blocks_queued() && !homing_flag)
   1ec40:	98 13       	cpse	r25, r24
   1ec42:	5b c0       	rjmp	.+182    	; 0x1ecfa <lcd_commands() [clone .part.42]+0xf0>
   1ec44:	80 91 71 12 	lds	r24, 0x1271	; 0x801271 <homing_flag>
   1ec48:	81 11       	cpse	r24, r1
   1ec4a:	57 c0       	rjmp	.+174    	; 0x1ecfa <lcd_commands() [clone .part.42]+0xf0>
        {
            custom_message_type = CustomMsg::Status;
   1ec4c:	10 92 5d 06 	sts	0x065D, r1	; 0x80065d <custom_message_type>
            lcd_setstatuspgm(_T(MSG_PRINT_ABORTED));
   1ec50:	8e ec       	ldi	r24, 0xCE	; 206
   1ec52:	9b e4       	ldi	r25, 0x4B	; 75
   1ec54:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1ec58:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
            lcd_commands_type = LcdCommands::Idle;
   1ec5c:	10 92 5e 0d 	sts	0x0D5E, r1	; 0x800d5e <lcd_commands_type>
   1ec60:	82 e0       	ldi	r24, 0x02	; 2
   1ec62:	80 93 61 0d 	sts	0x0D61, r24	; 0x800d61 <_ZL13printer_state.lto_priv.386>
            SetPrinterState(PrinterState::Idle);
            lcd_commands_step = 0;
   1ec66:	10 92 e2 03 	sts	0x03E2, r1	; 0x8003e2 <lcd_commands_step>
#endif //COMMUNITY_PREVENT_OOZE

// continue stopping the print from the main loop after lcd_print_stop() is called
void lcd_print_stop_finish()
{
    print_job_timer.stop();
   1ec6a:	0f 94 49 19 	call	0x23292	; 0x23292 <Stopwatch::stop()>
    save_statistics();
   1ec6e:	0e 94 b0 64 	call	0xc960	; 0xc960 <save_statistics()>

    // lift Z
    raise_z(10);
   1ec72:	60 e0       	ldi	r22, 0x00	; 0
   1ec74:	70 e0       	ldi	r23, 0x00	; 0
   1ec76:	80 e2       	ldi	r24, 0x20	; 32
   1ec78:	91 e4       	ldi	r25, 0x41	; 65
   1ec7a:	0e 94 94 6c 	call	0xd928	; 0xd928 <raise_z(float)>

    // if axis are homed, move to parking position.
    if (axis_known_position[X_AXIS] && axis_known_position[Y_AXIS]) {
   1ec7e:	80 91 39 06 	lds	r24, 0x0639	; 0x800639 <axis_known_position>
   1ec82:	88 23       	and	r24, r24
   1ec84:	21 f1       	breq	.+72     	; 0x1ecce <lcd_commands() [clone .part.42]+0xc4>
   1ec86:	80 91 3a 06 	lds	r24, 0x063A	; 0x80063a <axis_known_position+0x1>
   1ec8a:	88 23       	and	r24, r24
   1ec8c:	01 f1       	breq	.+64     	; 0x1ecce <lcd_commands() [clone .part.42]+0xc4>
        current_position[X_AXIS] = X_CANCEL_POS;
   1ec8e:	80 e0       	ldi	r24, 0x00	; 0
   1ec90:	90 e0       	ldi	r25, 0x00	; 0
   1ec92:	a8 e4       	ldi	r26, 0x48	; 72
   1ec94:	b2 e4       	ldi	r27, 0x42	; 66
   1ec96:	80 93 61 12 	sts	0x1261, r24	; 0x801261 <current_position>
   1ec9a:	90 93 62 12 	sts	0x1262, r25	; 0x801262 <current_position+0x1>
   1ec9e:	a0 93 63 12 	sts	0x1263, r26	; 0x801263 <current_position+0x2>
   1eca2:	b0 93 64 12 	sts	0x1264, r27	; 0x801264 <current_position+0x3>
        current_position[Y_AXIS] = Y_CANCEL_POS;
   1eca6:	80 e0       	ldi	r24, 0x00	; 0
   1eca8:	90 e0       	ldi	r25, 0x00	; 0
   1ecaa:	ae e3       	ldi	r26, 0x3E	; 62
   1ecac:	b3 e4       	ldi	r27, 0x43	; 67
   1ecae:	80 93 65 12 	sts	0x1265, r24	; 0x801265 <current_position+0x4>
   1ecb2:	90 93 66 12 	sts	0x1266, r25	; 0x801266 <current_position+0x5>
   1ecb6:	a0 93 67 12 	sts	0x1267, r26	; 0x801267 <current_position+0x6>
   1ecba:	b0 93 68 12 	sts	0x1268, r27	; 0x801268 <current_position+0x7>
        plan_buffer_line_curposXYZE(manual_feedrate[0] / 60);
   1ecbe:	60 e0       	ldi	r22, 0x00	; 0
   1ecc0:	70 e0       	ldi	r23, 0x00	; 0
   1ecc2:	84 e3       	ldi	r24, 0x34	; 52
   1ecc4:	92 e4       	ldi	r25, 0x42	; 66
   1ecc6:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
        st_synchronize();
   1ecca:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
    temp_error_state.assert = true;
}

bool get_temp_error()
{
    return temp_error_state.v;
   1ecce:	80 91 cc 03 	lds	r24, 0x03CC	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
    // Retract filament to prevent oozing
    retract_for_ooze_prevention();
    #endif //COMMUNITY_PREVENT_OOZE

    // did we come here from a thermal error?
    if(get_temp_error()) {
   1ecd2:	88 23       	and	r24, r24
   1ecd4:	09 f4       	brne	.+2      	; 0x1ecd8 <lcd_commands() [clone .part.42]+0xce>
   1ecd6:	c8 c0       	rjmp	.+400    	; 0x1ee68 <lcd_commands() [clone .part.42]+0x25e>
        // time to stop the error beep
        WRITE(BEEPER, LOW);
   1ecd8:	9f b7       	in	r25, 0x3f	; 63
   1ecda:	f8 94       	cli
   1ecdc:	80 91 02 01 	lds	r24, 0x0102	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   1ece0:	8b 7f       	andi	r24, 0xFB	; 251
   1ece2:	80 93 02 01 	sts	0x0102, r24	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   1ece6:	9f bf       	out	0x3f, r25	; 63
                MMU2::mmu2.unload(); // M702
            }
        }
    }

    lcd_cooldown(); //turns off heaters and fan; goes to status screen.
   1ece8:	0f 94 1a 11 	call	0x22234	; 0x22234 <lcd_cooldown() [clone .lto_priv.406]>

    finishAndDisableSteppers(); //M84
   1ecec:	0e 94 55 86 	call	0x10caa	; 0x10caa <finishAndDisableSteppers()>
    axis_relative_modes = E_AXIS_MASK; //XYZ absolute, E relative
   1ecf0:	88 e0       	ldi	r24, 0x08	; 8
   1ecf2:	80 93 57 12 	sts	0x1257, r24	; 0x801257 <axis_relative_modes>
    did_pause_print = false; // Clear pause state in case the print was aborted while paused
   1ecf6:	10 92 cd 03 	sts	0x03CD, r1	; 0x8003cd <did_pause_print>
            lcd_commands_step = 0;
            lcd_print_stop_finish();
        }
    }

	if (lcd_commands_type == LcdCommands::LongPause)
   1ecfa:	80 91 5e 0d 	lds	r24, 0x0D5E	; 0x800d5e <lcd_commands_type>
   1ecfe:	82 30       	cpi	r24, 0x02	; 2
   1ed00:	09 f0       	breq	.+2      	; 0x1ed04 <lcd_commands() [clone .part.42]+0xfa>
   1ed02:	6a c0       	rjmp	.+212    	; 0x1edd8 <lcd_commands() [clone .part.42]+0x1ce>
   1ed04:	90 91 3e 0d 	lds	r25, 0x0D3E	; 0x800d3e <block_buffer_head>
   1ed08:	80 91 3f 0d 	lds	r24, 0x0D3F	; 0x800d3f <block_buffer_tail>
	{
		if (!blocks_queued() && !homing_flag)
   1ed0c:	98 13       	cpse	r25, r24
   1ed0e:	64 c0       	rjmp	.+200    	; 0x1edd8 <lcd_commands() [clone .part.42]+0x1ce>
   1ed10:	80 91 71 12 	lds	r24, 0x1271	; 0x801271 <homing_flag>
   1ed14:	81 11       	cpse	r24, r1
   1ed16:	60 c0       	rjmp	.+192    	; 0x1edd8 <lcd_commands() [clone .part.42]+0x1ce>
		{
			if (custom_message_type != CustomMsg::M117)
   1ed18:	80 91 5d 06 	lds	r24, 0x065D	; 0x80065d <custom_message_type>
   1ed1c:	87 30       	cpi	r24, 0x07	; 7
   1ed1e:	41 f0       	breq	.+16     	; 0x1ed30 <lcd_commands() [clone .part.42]+0x126>
			{
				custom_message_type = CustomMsg::Status;
   1ed20:	10 92 5d 06 	sts	0x065D, r1	; 0x80065d <custom_message_type>
				lcd_setstatuspgm(_T(MSG_PRINT_PAUSED));
   1ed24:	8f eb       	ldi	r24, 0xBF	; 191
   1ed26:	9b e4       	ldi	r25, 0x4B	; 75
   1ed28:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1ed2c:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
			}
			lcd_commands_type = LcdCommands::Idle;
   1ed30:	10 92 5e 0d 	sts	0x0D5E, r1	; 0x800d5e <lcd_commands_type>
   1ed34:	82 e0       	ldi	r24, 0x02	; 2
   1ed36:	80 93 61 0d 	sts	0x0D61, r24	; 0x800d61 <_ZL13printer_state.lto_priv.386>
			SetPrinterState(PrinterState::Idle);
			lcd_commands_step = 0;
   1ed3a:	10 92 e2 03 	sts	0x03E2, r1	; 0x8003e2 <lcd_commands_step>
}
#endif //PINDA_THERMISTOR

void long_pause() //long pause print
{
	st_synchronize();
   1ed3e:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>

    // Stop heaters
    heating_status = HeatingStatus::NO_HEATING;
   1ed42:	10 92 cb 03 	sts	0x03CB, r1	; 0x8003cb <heating_status>
  return target_temperature_bed;
};

// Doesn't save FLASH when FORCE_INLINE removed.
FORCE_INLINE void setTargetHotend(const float &celsius) {
  target_temperature[0] = celsius;
   1ed46:	10 92 5e 12 	sts	0x125E, r1	; 0x80125e <target_temperature+0x1>
   1ed4a:	10 92 5d 12 	sts	0x125D, r1	; 0x80125d <target_temperature>
    setTargetHotend(0);

    // Lift z
    raise_z(pause_position[Z_AXIS]);
   1ed4e:	60 91 4a 02 	lds	r22, 0x024A	; 0x80024a <_ZL14pause_position.lto_priv.491+0x8>
   1ed52:	70 91 4b 02 	lds	r23, 0x024B	; 0x80024b <_ZL14pause_position.lto_priv.491+0x9>
   1ed56:	80 91 4c 02 	lds	r24, 0x024C	; 0x80024c <_ZL14pause_position.lto_priv.491+0xa>
   1ed5a:	90 91 4d 02 	lds	r25, 0x024D	; 0x80024d <_ZL14pause_position.lto_priv.491+0xb>
   1ed5e:	0e 94 94 6c 	call	0xd928	; 0xd928 <raise_z(float)>

    // Move XY to side
    if (axis_known_position[X_AXIS] && axis_known_position[Y_AXIS]) {
   1ed62:	80 91 39 06 	lds	r24, 0x0639	; 0x800639 <axis_known_position>
   1ed66:	88 23       	and	r24, r24
   1ed68:	51 f1       	breq	.+84     	; 0x1edbe <lcd_commands() [clone .part.42]+0x1b4>
   1ed6a:	80 91 3a 06 	lds	r24, 0x063A	; 0x80063a <axis_known_position+0x1>
   1ed6e:	88 23       	and	r24, r24
   1ed70:	31 f1       	breq	.+76     	; 0x1edbe <lcd_commands() [clone .part.42]+0x1b4>
        current_position[X_AXIS] = pause_position[X_AXIS];
   1ed72:	80 91 42 02 	lds	r24, 0x0242	; 0x800242 <_ZL14pause_position.lto_priv.491>
   1ed76:	90 91 43 02 	lds	r25, 0x0243	; 0x800243 <_ZL14pause_position.lto_priv.491+0x1>
   1ed7a:	a0 91 44 02 	lds	r26, 0x0244	; 0x800244 <_ZL14pause_position.lto_priv.491+0x2>
   1ed7e:	b0 91 45 02 	lds	r27, 0x0245	; 0x800245 <_ZL14pause_position.lto_priv.491+0x3>
   1ed82:	80 93 61 12 	sts	0x1261, r24	; 0x801261 <current_position>
   1ed86:	90 93 62 12 	sts	0x1262, r25	; 0x801262 <current_position+0x1>
   1ed8a:	a0 93 63 12 	sts	0x1263, r26	; 0x801263 <current_position+0x2>
   1ed8e:	b0 93 64 12 	sts	0x1264, r27	; 0x801264 <current_position+0x3>
        current_position[Y_AXIS] = pause_position[Y_AXIS];
   1ed92:	80 91 46 02 	lds	r24, 0x0246	; 0x800246 <_ZL14pause_position.lto_priv.491+0x4>
   1ed96:	90 91 47 02 	lds	r25, 0x0247	; 0x800247 <_ZL14pause_position.lto_priv.491+0x5>
   1ed9a:	a0 91 48 02 	lds	r26, 0x0248	; 0x800248 <_ZL14pause_position.lto_priv.491+0x6>
   1ed9e:	b0 91 49 02 	lds	r27, 0x0249	; 0x800249 <_ZL14pause_position.lto_priv.491+0x7>
   1eda2:	80 93 65 12 	sts	0x1265, r24	; 0x801265 <current_position+0x4>
   1eda6:	90 93 66 12 	sts	0x1266, r25	; 0x801266 <current_position+0x5>
   1edaa:	a0 93 67 12 	sts	0x1267, r26	; 0x801267 <current_position+0x6>
   1edae:	b0 93 68 12 	sts	0x1268, r27	; 0x801268 <current_position+0x7>
        plan_buffer_line_curposXYZE(50);
   1edb2:	60 e0       	ldi	r22, 0x00	; 0
   1edb4:	70 e0       	ldi	r23, 0x00	; 0
   1edb6:	88 e4       	ldi	r24, 0x48	; 72
   1edb8:	92 e4       	ldi	r25, 0x42	; 66
   1edba:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
   1edbe:	80 91 cc 03 	lds	r24, 0x03CC	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
    }

    // did we come here from a thermal error?
    if(get_temp_error()) {
   1edc2:	88 23       	and	r24, r24
   1edc4:	09 f4       	brne	.+2      	; 0x1edc8 <lcd_commands() [clone .part.42]+0x1be>
   1edc6:	7a c0       	rjmp	.+244    	; 0x1eebc <lcd_commands() [clone .part.42]+0x2b2>
        // time to stop the error beep
        WRITE(BEEPER, LOW);
   1edc8:	9f b7       	in	r25, 0x3f	; 63
   1edca:	f8 94       	cli
   1edcc:	80 91 02 01 	lds	r24, 0x0102	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   1edd0:	8b 7f       	andi	r24, 0xFB	; 251
   1edd2:	80 93 02 01 	sts	0x0102, r24	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   1edd6:	9f bf       	out	0x3f, r25	; 63
			long_pause();
		}
	}

	if (lcd_commands_type == LcdCommands::Layer1Cal)
   1edd8:	80 91 5e 0d 	lds	r24, 0x0D5E	; 0x800d5e <lcd_commands_type>
   1eddc:	84 30       	cpi	r24, 0x04	; 4
   1edde:	09 f0       	breq	.+2      	; 0x1ede2 <lcd_commands() [clone .part.42]+0x1d8>
   1ede0:	a7 c0       	rjmp	.+334    	; 0x1ef30 <lcd_commands() [clone .part.42]+0x326>
	{
		const uint16_t nozzle_dia = eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM);
   1ede2:	85 ea       	ldi	r24, 0xA5	; 165
   1ede4:	9d e0       	ldi	r25, 0x0D	; 13
   1ede6:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
   1edea:	30 91 3e 0d 	lds	r19, 0x0D3E	; 0x800d3e <block_buffer_head>
   1edee:	20 91 3f 0d 	lds	r18, 0x0D3F	; 0x800d3f <block_buffer_tail>
		const float extrusion_width = (nozzle_dia + 20)/1000.0f;
		const float layer_height = 0.2f;

        if (!blocks_queued() && cmd_buffer_empty() && !saved_printing)
   1edf2:	32 13       	cpse	r19, r18
   1edf4:	74 c1       	rjmp	.+744    	; 0x1f0de <lcd_commands() [clone .part.42]+0x4d4>
   1edf6:	20 91 3c 12 	lds	r18, 0x123C	; 0x80123c <buflen>
   1edfa:	30 91 3d 12 	lds	r19, 0x123D	; 0x80123d <buflen+0x1>
   1edfe:	23 2b       	or	r18, r19
   1ee00:	09 f0       	breq	.+2      	; 0x1ee04 <lcd_commands() [clone .part.42]+0x1fa>
   1ee02:	6d c1       	rjmp	.+730    	; 0x1f0de <lcd_commands() [clone .part.42]+0x4d4>
   1ee04:	c0 91 73 12 	lds	r28, 0x1273	; 0x801273 <saved_printing>
   1ee08:	c1 11       	cpse	r28, r1
   1ee0a:	69 c1       	rjmp	.+722    	; 0x1f0de <lcd_commands() [clone .part.42]+0x4d4>
        {
            if (lcd_commands_step == 0)
   1ee0c:	20 91 e2 03 	lds	r18, 0x03E2	; 0x8003e2 <lcd_commands_step>
   1ee10:	21 11       	cpse	r18, r1
   1ee12:	57 c0       	rjmp	.+174    	; 0x1eec2 <lcd_commands() [clone .part.42]+0x2b8>
                lcd_commands_step = 12;
   1ee14:	2c e0       	ldi	r18, 0x0C	; 12
            else
                lcd_commands_step--;
   1ee16:	20 93 e2 03 	sts	0x03E2, r18	; 0x8003e2 <lcd_commands_step>
	}

	if (lcd_commands_type == LcdCommands::Layer1Cal)
	{
		const uint16_t nozzle_dia = eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM);
		const float extrusion_width = (nozzle_dia + 20)/1000.0f;
   1ee1a:	44 96       	adiw	r24, 0x14	; 20
   1ee1c:	bc 01       	movw	r22, r24
   1ee1e:	90 e0       	ldi	r25, 0x00	; 0
   1ee20:	80 e0       	ldi	r24, 0x00	; 0
   1ee22:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   1ee26:	20 e0       	ldi	r18, 0x00	; 0
   1ee28:	30 e0       	ldi	r19, 0x00	; 0
   1ee2a:	4a e7       	ldi	r20, 0x7A	; 122
   1ee2c:	54 e4       	ldi	r21, 0x44	; 68
   1ee2e:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   1ee32:	4b 01       	movw	r8, r22
   1ee34:	5c 01       	movw	r10, r24
            if (lcd_commands_step == 0)
                lcd_commands_step = 12;
            else
                lcd_commands_step--;

            switch(lcd_commands_step)
   1ee36:	e0 91 e2 03 	lds	r30, 0x03E2	; 0x8003e2 <lcd_commands_step>
   1ee3a:	e1 50       	subi	r30, 0x01	; 1
   1ee3c:	ec 30       	cpi	r30, 0x0C	; 12
   1ee3e:	08 f0       	brcs	.+2      	; 0x1ee42 <lcd_commands() [clone .part.42]+0x238>
   1ee40:	77 c0       	rjmp	.+238    	; 0x1ef30 <lcd_commands() [clone .part.42]+0x326>
   1ee42:	f0 e0       	ldi	r31, 0x00	; 0
   1ee44:	88 27       	eor	r24, r24
   1ee46:	e8 5d       	subi	r30, 0xD8	; 216
   1ee48:	f8 40       	sbci	r31, 0x08	; 8
   1ee4a:	8f 4f       	sbci	r24, 0xFF	; 255
   1ee4c:	0d 94 f0 a4 	jmp	0x349e0	; 0x349e0 <__tablejump2__>
   1ee50:	6a fa       	.word	0xfa6a	; ????
   1ee52:	66 fa       	bst	r6, 6
   1ee54:	fc f9       	.word	0xf9fc	; ????
   1ee56:	fc f9       	.word	0xf9fc	; ????
   1ee58:	fc f9       	.word	0xf9fc	; ????
   1ee5a:	fc f9       	.word	0xf9fc	; ????
   1ee5c:	a5 f9       	bld	r26, 5
   1ee5e:	14 f9       	bld	r17, 4
   1ee60:	10 f9       	bld	r17, 0
   1ee62:	a3 f8       	bld	r10, 3
   1ee64:	69 f7       	brne	.-38     	; 0x1ee40 <lcd_commands() [clone .part.42]+0x236>
   1ee66:	63 f7       	brvc	.-40     	; 0x1ee40 <lcd_commands() [clone .part.42]+0x236>
    if(get_temp_error()) {
        // time to stop the error beep
        WRITE(BEEPER, LOW);
    } else {
        // Turn off the print fan
        fanSpeed = 0;
   1ee68:	10 92 55 12 	sts	0x1255, r1	; 0x801255 <fanSpeed>
{
#if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1)
#ifdef EXTRUDER_ALTFAN_DETECT
    altfanStatus.altfanOverride = eeprom_read_byte((uint8_t*)EEPROM_ALTFAN_OVERRIDE);
#endif
    resetFanCheck();
   1ee6c:	0e 94 a2 77 	call	0xef44	; 0xef44 <resetFanCheck()>
    setExtruderAutoFanState(1);
   1ee70:	81 e0       	ldi	r24, 0x01	; 1
   1ee72:	0e 94 af 77 	call	0xef5e	; 0xef5e <setExtruderAutoFanState(unsigned char)>
        // restore the auto hotend state
        hotendDefaultAutoFanState();

        if (MMU2::mmu2.Enabled() && MMU2::mmu2.FindaDetectsFilament()
#ifdef FANCHECK
            && fan_check_error != EFCE_REPORTED
   1ee76:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   1ee7a:	81 30       	cpi	r24, 0x01	; 1
   1ee7c:	09 f0       	breq	.+2      	; 0x1ee80 <lcd_commands() [clone .part.42]+0x276>
   1ee7e:	34 cf       	rjmp	.-408    	; 0x1ece8 <lcd_commands() [clone .part.42]+0xde>
        fanSpeed = 0;

        // restore the auto hotend state
        hotendDefaultAutoFanState();

        if (MMU2::mmu2.Enabled() && MMU2::mmu2.FindaDetectsFilament()
   1ee80:	80 91 d7 12 	lds	r24, 0x12D7	; 0x8012d7 <MMU2::mmu2+0x45>
   1ee84:	88 23       	and	r24, r24
   1ee86:	09 f4       	brne	.+2      	; 0x1ee8a <lcd_commands() [clone .part.42]+0x280>
   1ee88:	2f cf       	rjmp	.-418    	; 0x1ece8 <lcd_commands() [clone .part.42]+0xde>
#ifdef FANCHECK
            && fan_check_error != EFCE_REPORTED
   1ee8a:	80 91 ce 03 	lds	r24, 0x03CE	; 0x8003ce <fan_check_error>
   1ee8e:	82 30       	cpi	r24, 0x02	; 2
   1ee90:	09 f4       	brne	.+2      	; 0x1ee94 <lcd_commands() [clone .part.42]+0x28a>
   1ee92:	2a cf       	rjmp	.-428    	; 0x1ece8 <lcd_commands() [clone .part.42]+0xde>
#endif //FANCHECK
        ) {
            // The print was aborted while when the nozzle was cold:
            //     1. in a paused state                      => a partial backup in RAM is always available
            //     2. after a recoverable thermal/fan error had paused the print => only extruder temperature is saved to RAM
            if (printingIsPaused())
   1ee94:	0e 94 35 66 	call	0xcc6a	; 0xcc6a <printingIsPaused()>
   1ee98:	81 11       	cpse	r24, r1
            {
                // Restore temperature saved in ram after pausing print
                restore_extruder_temperature_from_ram();
   1ee9a:	0e 94 23 64 	call	0xc846	; 0xc846 <restore_extruder_temperature_from_ram()>
            }

            // If the pause state was cleared previously or the target temperature is 0°C in the case
            // of an unconditional stop. In that scenario we do not want to unload.
            if (target_temperature[0] >= extrude_min_temp) {
   1ee9e:	20 91 5d 12 	lds	r18, 0x125D	; 0x80125d <target_temperature>
   1eea2:	30 91 5e 12 	lds	r19, 0x125E	; 0x80125e <target_temperature+0x1>
   1eea6:	80 91 57 02 	lds	r24, 0x0257	; 0x800257 <extrude_min_temp>
   1eeaa:	90 91 58 02 	lds	r25, 0x0258	; 0x800258 <extrude_min_temp+0x1>
   1eeae:	28 17       	cp	r18, r24
   1eeb0:	39 07       	cpc	r19, r25
   1eeb2:	0c f4       	brge	.+2      	; 0x1eeb6 <lcd_commands() [clone .part.42]+0x2ac>
   1eeb4:	19 cf       	rjmp	.-462    	; 0x1ece8 <lcd_commands() [clone .part.42]+0xde>
                MMU2::mmu2.unload(); // M702
   1eeb6:	0f 94 71 9d 	call	0x33ae2	; 0x33ae2 <MMU2::MMU2::unload() [clone .constprop.105]>
   1eeba:	16 cf       	rjmp	.-468    	; 0x1ece8 <lcd_commands() [clone .part.42]+0xde>
    } else {
        // Turn off the print fan
        fanSpeed = 0;
   1eebc:	10 92 55 12 	sts	0x1255, r1	; 0x801255 <fanSpeed>
   1eec0:	8b cf       	rjmp	.-234    	; 0x1edd8 <lcd_commands() [clone .part.42]+0x1ce>
        if (!blocks_queued() && cmd_buffer_empty() && !saved_printing)
        {
            if (lcd_commands_step == 0)
                lcd_commands_step = 12;
            else
                lcd_commands_step--;
   1eec2:	21 50       	subi	r18, 0x01	; 1
   1eec4:	a8 cf       	rjmp	.-176    	; 0x1ee16 <lcd_commands() [clone .part.42]+0x20c>
        preheat_cmd_3,
        preheat_cmd_4,
        zero_extrusion
    };

    lay1cal_common_enqueue_loop(preheat_cmd, sizeof(preheat_cmd)/sizeof(preheat_cmd[0]));
   1eec6:	65 e0       	ldi	r22, 0x05	; 5
   1eec8:	8c e9       	ldi	r24, 0x9C	; 156
   1eeca:	94 e8       	ldi	r25, 0x84	; 132
        MSG_M702,         // Unload filament (MMU only)
        cmd_cal_finish_8, // Turn off hotend heater
        MSG_M84           // Disable stepper motors
    };

    lay1cal_common_enqueue_loop(cmd_cal_finish, (sizeof(cmd_cal_finish)/sizeof(cmd_cal_finish[0])));
   1eecc:	0e 94 98 8f 	call	0x11f30	; 0x11f30 <lay1cal_common_enqueue_loop(char const* const*, unsigned char) [clone .lto_priv.407]>
   1eed0:	2f c0       	rjmp	.+94     	; 0x1ef30 <lcd_commands() [clone .part.42]+0x326>
//! @param cmd_buffer character buffer needed to format gcodes
//! @param filament filament to use (applies for MMU only)
//! @returns true if extra purge distance is needed in case of MMU prints (after a toolchange), otherwise false
bool lay1cal_load_filament(uint8_t filament)
{
    if (MMU2::mmu2.Enabled())
   1eed2:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   1eed6:	81 30       	cpi	r24, 0x01	; 1
   1eed8:	49 f5       	brne	.+82     	; 0x1ef2c <lcd_commands() [clone .part.42]+0x322>
            {
            case 12:
                lay1cal_wait_preheat();
                break;
            case 11:
                extraPurgeNeeded = lay1cal_load_filament(lay1cal_filament);
   1eeda:	d0 91 e1 03 	lds	r29, 0x03E1	; 0x8003e1 <lay1cal_filament>
    {
        enquecommand_P(MSG_M83);
   1eede:	61 e0       	ldi	r22, 0x01	; 1
   1eee0:	83 eb       	ldi	r24, 0xB3	; 179
   1eee2:	9c e6       	ldi	r25, 0x6C	; 108
   1eee4:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
        enquecommand_P(PSTR("G1Y-3F1000"));
   1eee8:	61 e0       	ldi	r22, 0x01	; 1
   1eeea:	81 e9       	ldi	r24, 0x91	; 145
   1eeec:	94 e8       	ldi	r25, 0x84	; 132
   1eeee:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
        enquecommand_P(PSTR("G1Z0.4"));
   1eef2:	61 e0       	ldi	r22, 0x01	; 1
   1eef4:	8a e8       	ldi	r24, 0x8A	; 138
   1eef6:	94 e8       	ldi	r25, 0x84	; 132
   1eef8:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>

        uint8_t currentTool = MMU2::mmu2.get_current_tool();
   1eefc:	0f 94 a7 65 	call	0x2cb4e	; 0x2cb4e <MMU2::MMU2::get_current_tool() const [clone .constprop.351]>
        if(currentTool == filament ){
   1ef00:	d8 17       	cp	r29, r24
   1ef02:	a1 f0       	breq	.+40     	; 0x1ef2c <lcd_commands() [clone .part.42]+0x322>
            // already have the correct tool loaded - do nothing
            return false;
        } else if( currentTool != (uint8_t)MMU2::FILAMENT_UNKNOWN){
   1ef04:	8f 3f       	cpi	r24, 0xFF	; 255
   1ef06:	29 f0       	breq	.+10     	; 0x1ef12 <lcd_commands() [clone .part.42]+0x308>
            // some other slot is loaded, perform an unload first
            enquecommand_P(MSG_M702);
   1ef08:	61 e0       	ldi	r22, 0x01	; 1
   1ef0a:	8c ec       	ldi	r24, 0xCC	; 204
   1ef0c:	98 e6       	ldi	r25, 0x68	; 104
   1ef0e:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
        }
        // perform a toolchange
        enquecommandf_P(PSTR("T%d"), filament);
   1ef12:	1f 92       	push	r1
   1ef14:	df 93       	push	r29
   1ef16:	86 e8       	ldi	r24, 0x86	; 134
   1ef18:	94 e8       	ldi	r25, 0x84	; 132
   1ef1a:	9f 93       	push	r25
   1ef1c:	8f 93       	push	r24
   1ef1e:	0e 94 b7 8f 	call	0x11f6e	; 0x11f6e <enquecommandf_P(char const*, ...)>
   1ef22:	0f 90       	pop	r0
   1ef24:	0f 90       	pop	r0
   1ef26:	0f 90       	pop	r0
   1ef28:	0f 90       	pop	r0
        return true;
   1ef2a:	c1 e0       	ldi	r28, 0x01	; 1
   1ef2c:	c0 93 e0 03 	sts	0x03E0, r28	; 0x8003e0 <extraPurgeNeeded>
                break;
            }
        }
    }

	if (lcd_commands_type == LcdCommands::PidExtruder) {
   1ef30:	80 91 5e 0d 	lds	r24, 0x0D5E	; 0x800d5e <lcd_commands_type>
   1ef34:	83 30       	cpi	r24, 0x03	; 3
   1ef36:	09 f0       	breq	.+2      	; 0x1ef3a <lcd_commands() [clone .part.42]+0x330>
   1ef38:	d2 c0       	rjmp	.+420    	; 0x1f0de <lcd_commands() [clone .part.42]+0x4d4>
		if (lcd_commands_step == 0) {
   1ef3a:	90 91 e2 03 	lds	r25, 0x03E2	; 0x8003e2 <lcd_commands_step>
   1ef3e:	91 11       	cpse	r25, r1
   1ef40:	09 c0       	rjmp	.+18     	; 0x1ef54 <lcd_commands() [clone .part.42]+0x34a>
			custom_message_type = CustomMsg::PidCal;
   1ef42:	80 93 5d 06 	sts	0x065D, r24	; 0x80065d <custom_message_type>
			custom_message_state = 1;
   1ef46:	91 e0       	ldi	r25, 0x01	; 1
   1ef48:	90 93 de 03 	sts	0x03DE, r25	; 0x8003de <custom_message_state>
			lcd_draw_update = 3;
   1ef4c:	80 93 59 02 	sts	0x0259, r24	; 0x800259 <lcd_draw_update>
			lcd_commands_step = 3;
   1ef50:	80 93 e2 03 	sts	0x03E2, r24	; 0x8003e2 <lcd_commands_step>
		}
		if (lcd_commands_step == 3 && !blocks_queued()) { //PID calibration
   1ef54:	80 91 e2 03 	lds	r24, 0x03E2	; 0x8003e2 <lcd_commands_step>
   1ef58:	83 30       	cpi	r24, 0x03	; 3
   1ef5a:	19 f5       	brne	.+70     	; 0x1efa2 <lcd_commands() [clone .part.42]+0x398>
   1ef5c:	90 91 3e 0d 	lds	r25, 0x0D3E	; 0x800d3e <block_buffer_head>
   1ef60:	80 91 3f 0d 	lds	r24, 0x0D3F	; 0x800d3f <block_buffer_tail>
   1ef64:	98 13       	cpse	r25, r24
   1ef66:	1d c0       	rjmp	.+58     	; 0x1efa2 <lcd_commands() [clone .part.42]+0x398>
      return !pid_tuning_finished;
  }

  void preparePidTuning() {
      // ensure heaters are disabled before we switch off PID management!
      disable_heater();
   1ef68:	0f 94 05 11 	call	0x2220a	; 0x2220a <disable_heater()>
      pid_tuning_finished = false;
   1ef6c:	10 92 41 02 	sts	0x0241, r1	; 0x800241 <_ZL19pid_tuning_finished.lto_priv.426>
			preparePidTuning(); // ensure we don't move to the next step early
			// setting the correct target temperature (for visualization) is done in PID_autotune
			enquecommandf_P(PSTR("M303 E0 S%3u"), pid_temp);
   1ef70:	80 91 4f 02 	lds	r24, 0x024F	; 0x80024f <pid_temp+0x1>
   1ef74:	8f 93       	push	r24
   1ef76:	80 91 4e 02 	lds	r24, 0x024E	; 0x80024e <pid_temp>
   1ef7a:	8f 93       	push	r24
   1ef7c:	81 e1       	ldi	r24, 0x11	; 17
   1ef7e:	95 e8       	ldi	r25, 0x85	; 133
   1ef80:	9f 93       	push	r25
   1ef82:	8f 93       	push	r24
   1ef84:	0e 94 b7 8f 	call	0x11f6e	; 0x11f6e <enquecommandf_P(char const*, ...)>
			lcd_setstatuspgm(_T(MSG_PID_RUNNING));
   1ef88:	84 eb       	ldi	r24, 0xB4	; 180
   1ef8a:	9b e4       	ldi	r25, 0x4B	; 75
   1ef8c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1ef90:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
			lcd_commands_step = 2;
   1ef94:	82 e0       	ldi	r24, 0x02	; 2
   1ef96:	80 93 e2 03 	sts	0x03E2, r24	; 0x8003e2 <lcd_commands_step>
   1ef9a:	0f 90       	pop	r0
   1ef9c:	0f 90       	pop	r0
   1ef9e:	0f 90       	pop	r0
   1efa0:	0f 90       	pop	r0
		}
		if (lcd_commands_step == 2 && !pidTuningRunning()) { //saving to eeprom
   1efa2:	80 91 e2 03 	lds	r24, 0x03E2	; 0x8003e2 <lcd_commands_step>
   1efa6:	82 30       	cpi	r24, 0x02	; 2
   1efa8:	09 f0       	breq	.+2      	; 0x1efac <lcd_commands() [clone .part.42]+0x3a2>
   1efaa:	7a c0       	rjmp	.+244    	; 0x1f0a0 <lcd_commands() [clone .part.42]+0x496>
   1efac:	80 91 41 02 	lds	r24, 0x0241	; 0x800241 <_ZL19pid_tuning_finished.lto_priv.426>
   1efb0:	88 23       	and	r24, r24
   1efb2:	09 f4       	brne	.+2      	; 0x1efb6 <lcd_commands() [clone .part.42]+0x3ac>
   1efb4:	75 c0       	rjmp	.+234    	; 0x1f0a0 <lcd_commands() [clone .part.42]+0x496>
			custom_message_state = 0;
   1efb6:	10 92 de 03 	sts	0x03DE, r1	; 0x8003de <custom_message_state>
			lcd_setstatuspgm(_T(MSG_PID_FINISHED));
   1efba:	80 ea       	ldi	r24, 0xA0	; 160
   1efbc:	9b e4       	ldi	r25, 0x4B	; 75
   1efbe:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1efc2:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
   1efc6:	10 92 5e 12 	sts	0x125E, r1	; 0x80125e <target_temperature+0x1>
   1efca:	10 92 5d 12 	sts	0x125D, r1	; 0x80125d <target_temperature>
			setTargetHotend(0);
			if (_Kp != 0 || _Ki != 0 || _Kd != 0) {
   1efce:	c0 91 da 03 	lds	r28, 0x03DA	; 0x8003da <_Kp>
   1efd2:	d0 91 db 03 	lds	r29, 0x03DB	; 0x8003db <_Kp+0x1>
   1efd6:	10 91 dc 03 	lds	r17, 0x03DC	; 0x8003dc <_Kp+0x2>
   1efda:	00 91 dd 03 	lds	r16, 0x03DD	; 0x8003dd <_Kp+0x3>
   1efde:	20 e0       	ldi	r18, 0x00	; 0
   1efe0:	30 e0       	ldi	r19, 0x00	; 0
   1efe2:	a9 01       	movw	r20, r18
   1efe4:	f8 01       	movw	r30, r16
   1efe6:	6c 2f       	mov	r22, r28
   1efe8:	7d 2f       	mov	r23, r29
   1efea:	8f 2f       	mov	r24, r31
   1efec:	9e 2f       	mov	r25, r30
   1efee:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   1eff2:	81 11       	cpse	r24, r1
   1eff4:	1f c0       	rjmp	.+62     	; 0x1f034 <lcd_commands() [clone .part.42]+0x42a>
   1eff6:	20 e0       	ldi	r18, 0x00	; 0
   1eff8:	30 e0       	ldi	r19, 0x00	; 0
   1effa:	a9 01       	movw	r20, r18
   1effc:	60 91 d6 03 	lds	r22, 0x03D6	; 0x8003d6 <_Ki>
   1f000:	70 91 d7 03 	lds	r23, 0x03D7	; 0x8003d7 <_Ki+0x1>
   1f004:	80 91 d8 03 	lds	r24, 0x03D8	; 0x8003d8 <_Ki+0x2>
   1f008:	90 91 d9 03 	lds	r25, 0x03D9	; 0x8003d9 <_Ki+0x3>
   1f00c:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   1f010:	81 11       	cpse	r24, r1
   1f012:	10 c0       	rjmp	.+32     	; 0x1f034 <lcd_commands() [clone .part.42]+0x42a>
   1f014:	20 e0       	ldi	r18, 0x00	; 0
   1f016:	30 e0       	ldi	r19, 0x00	; 0
   1f018:	a9 01       	movw	r20, r18
   1f01a:	60 91 d2 03 	lds	r22, 0x03D2	; 0x8003d2 <_Kd>
   1f01e:	70 91 d3 03 	lds	r23, 0x03D3	; 0x8003d3 <_Kd+0x1>
   1f022:	80 91 d4 03 	lds	r24, 0x03D4	; 0x8003d4 <_Kd+0x2>
   1f026:	90 91 d5 03 	lds	r25, 0x03D5	; 0x8003d5 <_Kd+0x3>
   1f02a:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   1f02e:	88 23       	and	r24, r24
   1f030:	09 f4       	brne	.+2      	; 0x1f034 <lcd_commands() [clone .part.42]+0x42a>
   1f032:	66 c2       	rjmp	.+1228   	; 0x1f500 <lcd_commands() [clone .part.42]+0x8f6>
				enquecommandf_P(PSTR("M301 P%.2f I%.2f D%.2f"), _Kp, _Ki, _Kd);
   1f034:	80 91 d5 03 	lds	r24, 0x03D5	; 0x8003d5 <_Kd+0x3>
   1f038:	8f 93       	push	r24
   1f03a:	80 91 d4 03 	lds	r24, 0x03D4	; 0x8003d4 <_Kd+0x2>
   1f03e:	8f 93       	push	r24
   1f040:	80 91 d3 03 	lds	r24, 0x03D3	; 0x8003d3 <_Kd+0x1>
   1f044:	8f 93       	push	r24
   1f046:	80 91 d2 03 	lds	r24, 0x03D2	; 0x8003d2 <_Kd>
   1f04a:	8f 93       	push	r24
   1f04c:	80 91 d9 03 	lds	r24, 0x03D9	; 0x8003d9 <_Ki+0x3>
   1f050:	8f 93       	push	r24
   1f052:	80 91 d8 03 	lds	r24, 0x03D8	; 0x8003d8 <_Ki+0x2>
   1f056:	8f 93       	push	r24
   1f058:	80 91 d7 03 	lds	r24, 0x03D7	; 0x8003d7 <_Ki+0x1>
   1f05c:	8f 93       	push	r24
   1f05e:	80 91 d6 03 	lds	r24, 0x03D6	; 0x8003d6 <_Ki>
   1f062:	8f 93       	push	r24
   1f064:	0f 93       	push	r16
   1f066:	1f 93       	push	r17
   1f068:	df 93       	push	r29
   1f06a:	cf 93       	push	r28
   1f06c:	8a ef       	ldi	r24, 0xFA	; 250
   1f06e:	94 e8       	ldi	r25, 0x84	; 132
   1f070:	9f 93       	push	r25
   1f072:	8f 93       	push	r24
   1f074:	0e 94 b7 8f 	call	0x11f6e	; 0x11f6e <enquecommandf_P(char const*, ...)>
				enquecommand_P(MSG_M500);
   1f078:	61 e0       	ldi	r22, 0x01	; 1
   1f07a:	87 ed       	ldi	r24, 0xD7	; 215
   1f07c:	98 e6       	ldi	r25, 0x68	; 104
   1f07e:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
   1f082:	8d b7       	in	r24, 0x3d	; 61
   1f084:	9e b7       	in	r25, 0x3e	; 62
   1f086:	0e 96       	adiw	r24, 0x0e	; 14
   1f088:	0f b6       	in	r0, 0x3f	; 63
   1f08a:	f8 94       	cli
   1f08c:	9e bf       	out	0x3e, r25	; 62
   1f08e:	0f be       	out	0x3f, r0	; 63
   1f090:	8d bf       	out	0x3d, r24	; 61
			}
			else {
				SERIAL_ECHOPGM("Invalid PID cal. results. Not stored to EEPROM.");
			}
			display_time.start();
   1f092:	8f ec       	ldi	r24, 0xCF	; 207
   1f094:	93 e0       	ldi	r25, 0x03	; 3
   1f096:	0f 94 4e 0e 	call	0x21c9c	; 0x21c9c <Timer<unsigned short>::start()>
			lcd_commands_step = 1;
   1f09a:	81 e0       	ldi	r24, 0x01	; 1
   1f09c:	80 93 e2 03 	sts	0x03E2, r24	; 0x8003e2 <lcd_commands_step>
		}
		if ((lcd_commands_step == 1) && display_time.expired(2000)) { //calibration finished message
   1f0a0:	80 91 e2 03 	lds	r24, 0x03E2	; 0x8003e2 <lcd_commands_step>
   1f0a4:	81 30       	cpi	r24, 0x01	; 1
   1f0a6:	d9 f4       	brne	.+54     	; 0x1f0de <lcd_commands() [clone .part.42]+0x4d4>
   1f0a8:	60 ed       	ldi	r22, 0xD0	; 208
   1f0aa:	77 e0       	ldi	r23, 0x07	; 7
   1f0ac:	8f ec       	ldi	r24, 0xCF	; 207
   1f0ae:	93 e0       	ldi	r25, 0x03	; 3
   1f0b0:	0f 94 1f 0e 	call	0x21c3e	; 0x21c3e <Timer<unsigned short>::expired(unsigned short)>
   1f0b4:	88 23       	and	r24, r24
   1f0b6:	99 f0       	breq	.+38     	; 0x1f0de <lcd_commands() [clone .part.42]+0x4d4>
			lcd_setstatuspgm(MSG_WELCOME);
   1f0b8:	86 ee       	ldi	r24, 0xE6	; 230
   1f0ba:	9b e6       	ldi	r25, 0x6B	; 107
   1f0bc:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
			custom_message_type = CustomMsg::Status;
   1f0c0:	10 92 5d 06 	sts	0x065D, r1	; 0x80065d <custom_message_type>
			pid_temp = DEFAULT_PID_TEMP;
   1f0c4:	82 ed       	ldi	r24, 0xD2	; 210
   1f0c6:	90 e0       	ldi	r25, 0x00	; 0
   1f0c8:	90 93 4f 02 	sts	0x024F, r25	; 0x80024f <pid_temp+0x1>
   1f0cc:	80 93 4e 02 	sts	0x024E, r24	; 0x80024e <pid_temp>
			lcd_commands_step = 0;
   1f0d0:	10 92 e2 03 	sts	0x03E2, r1	; 0x8003e2 <lcd_commands_step>
			lcd_commands_type = LcdCommands::Idle;
   1f0d4:	10 92 5e 0d 	sts	0x0D5E, r1	; 0x800d5e <lcd_commands_type>
   1f0d8:	82 e0       	ldi	r24, 0x02	; 2
   1f0da:	80 93 61 0d 	sts	0x0D61, r24	; 0x800d61 <_ZL13printer_state.lto_priv.386>
            break;
        }
    }
#endif //THERMAL_MODEL

	if (lcd_commands_type == LcdCommands::NozzleCNG)
   1f0de:	80 91 5e 0d 	lds	r24, 0x0D5E	; 0x800d5e <lcd_commands_type>
   1f0e2:	85 30       	cpi	r24, 0x05	; 5
   1f0e4:	e9 f4       	brne	.+58     	; 0x1f120 <lcd_commands() [clone .part.42]+0x516>
   1f0e6:	90 91 3e 0d 	lds	r25, 0x0D3E	; 0x800d3e <block_buffer_head>
   1f0ea:	80 91 3f 0d 	lds	r24, 0x0D3F	; 0x800d3f <block_buffer_tail>
	{
        if (!blocks_queued() && cmd_buffer_empty() && !saved_printing)
   1f0ee:	98 13       	cpse	r25, r24
   1f0f0:	17 c0       	rjmp	.+46     	; 0x1f120 <lcd_commands() [clone .part.42]+0x516>
   1f0f2:	80 91 3c 12 	lds	r24, 0x123C	; 0x80123c <buflen>
   1f0f6:	90 91 3d 12 	lds	r25, 0x123D	; 0x80123d <buflen+0x1>
   1f0fa:	89 2b       	or	r24, r25
   1f0fc:	89 f4       	brne	.+34     	; 0x1f120 <lcd_commands() [clone .part.42]+0x516>
   1f0fe:	80 91 73 12 	lds	r24, 0x1273	; 0x801273 <saved_printing>
   1f102:	81 11       	cpse	r24, r1
   1f104:	0d c0       	rjmp	.+26     	; 0x1f120 <lcd_commands() [clone .part.42]+0x516>
#ifndef QUICK_NOZZLE_CHANGE //thermal model can be ignored if a quickchange nozzle is in use, no heatup necessary
#ifdef THERMAL_MODEL
            static bool was_enabled;
#endif //THERMAL_MODEL
#endif //QUICK_NOZZLE_CHANGE
            switch(lcd_commands_step)
   1f106:	80 91 e2 03 	lds	r24, 0x03E2	; 0x8003e2 <lcd_commands_step>
   1f10a:	81 30       	cpi	r24, 0x01	; 1
   1f10c:	09 f4       	brne	.+2      	; 0x1f110 <lcd_commands() [clone .part.42]+0x506>
   1f10e:	2d c2       	rjmp	.+1114   	; 0x1f56a <lcd_commands() [clone .part.42]+0x960>
   1f110:	08 f4       	brcc	.+2      	; 0x1f114 <lcd_commands() [clone .part.42]+0x50a>
   1f112:	fb c1       	rjmp	.+1014   	; 0x1f50a <lcd_commands() [clone .part.42]+0x900>
   1f114:	82 30       	cpi	r24, 0x02	; 2
   1f116:	09 f4       	brne	.+2      	; 0x1f11a <lcd_commands() [clone .part.42]+0x510>
   1f118:	13 c2       	rjmp	.+1062   	; 0x1f540 <lcd_commands() [clone .part.42]+0x936>
   1f11a:	83 30       	cpi	r24, 0x03	; 3
   1f11c:	09 f4       	brne	.+2      	; 0x1f120 <lcd_commands() [clone .part.42]+0x516>
   1f11e:	f9 c1       	rjmp	.+1010   	; 0x1f512 <lcd_commands() [clone .part.42]+0x908>
                menu_depth = 3;
                break;
            }
        }
    }
}
   1f120:	df 91       	pop	r29
   1f122:	cf 91       	pop	r28
   1f124:	1f 91       	pop	r17
   1f126:	0f 91       	pop	r16
   1f128:	ff 90       	pop	r15
   1f12a:	ef 90       	pop	r14
   1f12c:	df 90       	pop	r13
   1f12e:	cf 90       	pop	r12
   1f130:	bf 90       	pop	r11
   1f132:	af 90       	pop	r10
   1f134:	9f 90       	pop	r9
   1f136:	8f 90       	pop	r8
   1f138:	7f 90       	pop	r7
   1f13a:	6f 90       	pop	r6
   1f13c:	5f 90       	pop	r5
   1f13e:	4f 90       	pop	r4
   1f140:	3f 90       	pop	r3
   1f142:	2f 90       	pop	r2
   1f144:	08 95       	ret
                break;
            case 11:
                extraPurgeNeeded = lay1cal_load_filament(lay1cal_filament);
                break;
            case 10:
                lcd_clear();
   1f146:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
                menu_depth = 0;
   1f14a:	10 92 df 03 	sts	0x03DF, r1	; 0x8003df <menu_depth>
                menu_submenu(lcd_babystep_z, true);
   1f14e:	61 e0       	ldi	r22, 0x01	; 1
   1f150:	88 e6       	ldi	r24, 0x68	; 104
   1f152:	97 ed       	ldi	r25, 0xD7	; 215
   1f154:	0e 94 dd 62 	call	0xc5ba	; 0xc5ba <menu_submenu(void (*)(), bool)>
        cmd_intro_mmu_9,
        cmd_intro_mmu_10,
        cmd_intro_mmu_11,
    };

    if (MMU2::mmu2.Enabled())
   1f158:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   1f15c:	81 30       	cpi	r24, 0x01	; 1
   1f15e:	b9 f4       	brne	.+46     	; 0x1f18e <lcd_commands() [clone .part.42]+0x584>
    {
        for (uint8_t i = (extraPurgeNeeded ? 0 : 2); i < (sizeof(cmd_intro_mmu)/sizeof(cmd_intro_mmu[0])); ++i)
   1f160:	80 91 e0 03 	lds	r24, 0x03E0	; 0x8003e0 <extraPurgeNeeded>
   1f164:	10 e0       	ldi	r17, 0x00	; 0
   1f166:	81 11       	cpse	r24, r1
   1f168:	01 c0       	rjmp	.+2      	; 0x1f16c <lcd_commands() [clone .part.42]+0x562>
   1f16a:	12 e0       	ldi	r17, 0x02	; 2
   1f16c:	c1 2f       	mov	r28, r17
   1f16e:	d0 e0       	ldi	r29, 0x00	; 0
   1f170:	cc 0f       	add	r28, r28
   1f172:	dd 1f       	adc	r29, r29
   1f174:	cc 58       	subi	r28, 0x8C	; 140
   1f176:	db 47       	sbci	r29, 0x7B	; 123
        {
            enquecommand_P(static_cast<char*>(pgm_read_ptr(&cmd_intro_mmu[i])));
   1f178:	fe 01       	movw	r30, r28
   1f17a:	85 91       	lpm	r24, Z+
   1f17c:	94 91       	lpm	r25, Z
   1f17e:	61 e0       	ldi	r22, 0x01	; 1
   1f180:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
        cmd_intro_mmu_11,
    };

    if (MMU2::mmu2.Enabled())
    {
        for (uint8_t i = (extraPurgeNeeded ? 0 : 2); i < (sizeof(cmd_intro_mmu)/sizeof(cmd_intro_mmu[0])); ++i)
   1f184:	1f 5f       	subi	r17, 0xFF	; 255
   1f186:	22 96       	adiw	r28, 0x02	; 2
   1f188:	19 30       	cpi	r17, 0x09	; 9
   1f18a:	b1 f7       	brne	.-20     	; 0x1f178 <lcd_commands() [clone .part.42]+0x56e>
   1f18c:	d1 ce       	rjmp	.-606    	; 0x1ef30 <lcd_commands() [clone .part.42]+0x326>
            enquecommand_P(static_cast<char*>(pgm_read_ptr(&cmd_intro_mmu[i])));
        }
    }
    else
    {
        enquecommand_P(feedrate_F1080); //fixed velocity for the intro line
   1f18e:	61 e0       	ldi	r22, 0x01	; 1
   1f190:	8c e6       	ldi	r24, 0x6C	; 108
   1f192:	94 e8       	ldi	r25, 0x84	; 132
   1f194:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
        enquecommandf_P(extrude_fmt_X, 60.f, count_e(layer_height, extrusion_width * 4.f, 60));
   1f198:	20 e0       	ldi	r18, 0x00	; 0
   1f19a:	30 e0       	ldi	r19, 0x00	; 0
   1f19c:	40 e8       	ldi	r20, 0x80	; 128
   1f19e:	50 e4       	ldi	r21, 0x40	; 64
   1f1a0:	c5 01       	movw	r24, r10
   1f1a2:	b4 01       	movw	r22, r8
   1f1a4:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   1f1a8:	20 e0       	ldi	r18, 0x00	; 0
   1f1aa:	30 e0       	ldi	r19, 0x00	; 0
   1f1ac:	40 e7       	ldi	r20, 0x70	; 112
   1f1ae:	52 e4       	ldi	r21, 0x42	; 66
   1f1b0:	0f 94 3e 79 	call	0x2f27c	; 0x2f27c <count_e(float, float, float, float) [clone .constprop.134]>
   1f1b4:	9f 93       	push	r25
   1f1b6:	8f 93       	push	r24
   1f1b8:	7f 93       	push	r23
   1f1ba:	6f 93       	push	r22
   1f1bc:	82 e4       	ldi	r24, 0x42	; 66
   1f1be:	8f 93       	push	r24
   1f1c0:	80 e7       	ldi	r24, 0x70	; 112
   1f1c2:	8f 93       	push	r24
   1f1c4:	1f 92       	push	r1
   1f1c6:	1f 92       	push	r1
   1f1c8:	cf e5       	ldi	r28, 0x5F	; 95
   1f1ca:	d4 e8       	ldi	r29, 0x84	; 132
   1f1cc:	df 93       	push	r29
   1f1ce:	cf 93       	push	r28
   1f1d0:	0e 94 b7 8f 	call	0x11f6e	; 0x11f6e <enquecommandf_P(char const*, ...)>
        enquecommandf_P(extrude_fmt_X, 202.5f, count_e(layer_height, extrusion_width * 8.f, 142.5));
   1f1d4:	20 e0       	ldi	r18, 0x00	; 0
   1f1d6:	30 e0       	ldi	r19, 0x00	; 0
   1f1d8:	40 e0       	ldi	r20, 0x00	; 0
   1f1da:	51 e4       	ldi	r21, 0x41	; 65
   1f1dc:	c5 01       	movw	r24, r10
   1f1de:	b4 01       	movw	r22, r8
   1f1e0:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   1f1e4:	20 e0       	ldi	r18, 0x00	; 0
   1f1e6:	30 e8       	ldi	r19, 0x80	; 128
   1f1e8:	4e e0       	ldi	r20, 0x0E	; 14
   1f1ea:	53 e4       	ldi	r21, 0x43	; 67
   1f1ec:	0f 94 3e 79 	call	0x2f27c	; 0x2f27c <count_e(float, float, float, float) [clone .constprop.134]>
   1f1f0:	9f 93       	push	r25
   1f1f2:	8f 93       	push	r24
   1f1f4:	7f 93       	push	r23
   1f1f6:	6f 93       	push	r22
   1f1f8:	83 e4       	ldi	r24, 0x43	; 67
   1f1fa:	8f 93       	push	r24
   1f1fc:	8a e4       	ldi	r24, 0x4A	; 74
   1f1fe:	8f 93       	push	r24
   1f200:	80 e8       	ldi	r24, 0x80	; 128
   1f202:	8f 93       	push	r24
   1f204:	1f 92       	push	r1
   1f206:	df 93       	push	r29
   1f208:	cf 93       	push	r28
   1f20a:	0e 94 b7 8f 	call	0x11f6e	; 0x11f6e <enquecommandf_P(char const*, ...)>
   1f20e:	8d b7       	in	r24, 0x3d	; 61
   1f210:	9e b7       	in	r25, 0x3e	; 62
   1f212:	44 96       	adiw	r24, 0x14	; 20
   1f214:	0f b6       	in	r0, 0x3f	; 63
   1f216:	f8 94       	cli
   1f218:	9e bf       	out	0x3e, r25	; 62
   1f21a:	0f be       	out	0x3f, r0	; 63
   1f21c:	8d bf       	out	0x3d, r24	; 61
   1f21e:	88 ce       	rjmp	.-752    	; 0x1ef30 <lcd_commands() [clone .part.42]+0x326>
            cmd_pre_meander_5,
#endif //NEW_FIRST_LAYER_CAL
            cmd_pre_meander_6,
    };

    lay1cal_common_enqueue_loop(cmd_pre_meander, (sizeof(cmd_pre_meander)/sizeof(cmd_pre_meander[0])));
   1f220:	66 e0       	ldi	r22, 0x06	; 6
   1f222:	83 e5       	ldi	r24, 0x53	; 83
   1f224:	94 e8       	ldi	r25, 0x84	; 132
   1f226:	52 ce       	rjmp	.-860    	; 0x1eecc <lcd_commands() [clone .part.42]+0x2c2>

//! @brief Print meander start
void lay1cal_meander_start(float layer_height, float extrusion_width)
{
#ifndef NEW_FIRST_LAYER_CAL
    enquecommand_P(PSTR("G1X50Y155"));
   1f228:	61 e0       	ldi	r22, 0x01	; 1
   1f22a:	89 e4       	ldi	r24, 0x49	; 73
   1f22c:	94 e8       	ldi	r25, 0x84	; 132
   1f22e:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
#endif //_NEW_FIRST_LAYER_CAL
    static const char fmt1[] PROGMEM = "G1Z%.2f";
    enquecommandf_P(fmt1, layer_height);
   1f232:	8e e3       	ldi	r24, 0x3E	; 62
   1f234:	8f 93       	push	r24
   1f236:	8c e4       	ldi	r24, 0x4C	; 76
   1f238:	8f 93       	push	r24
   1f23a:	8c ec       	ldi	r24, 0xCC	; 204
   1f23c:	8f 93       	push	r24
   1f23e:	8d ec       	ldi	r24, 0xCD	; 205
   1f240:	8f 93       	push	r24
   1f242:	81 e4       	ldi	r24, 0x41	; 65
   1f244:	94 e8       	ldi	r25, 0x84	; 132
   1f246:	9f 93       	push	r25
   1f248:	8f 93       	push	r24
   1f24a:	0e 94 b7 8f 	call	0x11f6e	; 0x11f6e <enquecommandf_P(char const*, ...)>
    enquecommand_P(feedrate_F1080);
   1f24e:	61 e0       	ldi	r22, 0x01	; 1
   1f250:	8c e6       	ldi	r24, 0x6C	; 108
   1f252:	94 e8       	ldi	r25, 0x84	; 132
   1f254:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
    enquecommand_P(MSG_G91); //enable relative XYZ
   1f258:	61 e0       	ldi	r22, 0x01	; 1
   1f25a:	88 ec       	ldi	r24, 0xC8	; 200
   1f25c:	98 e6       	ldi	r25, 0x68	; 104
   1f25e:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
#ifdef NEW_FIRST_LAYER_CAL
    enquecommandf_P(extrude_fmt_Y, short_length, count_e(layer_height, extrusion_width, short_length));
    enquecommandf_P(extrude_fmt_X, long_length*invert, count_e(layer_height, extrusion_width, long_length));
    enquecommandf_P(extrude_fmt_Y, -short_length*invert, count_e(layer_height, extrusion_width, short_length));
#else
    enquecommandf_P(extrude_fmt_X, 25.f*invert, count_e(layer_height, extrusion_width * 4.f, 25));
   1f262:	20 e0       	ldi	r18, 0x00	; 0
   1f264:	30 e0       	ldi	r19, 0x00	; 0
   1f266:	40 e8       	ldi	r20, 0x80	; 128
   1f268:	50 e4       	ldi	r21, 0x40	; 64
   1f26a:	c5 01       	movw	r24, r10
   1f26c:	b4 01       	movw	r22, r8
   1f26e:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   1f272:	20 e0       	ldi	r18, 0x00	; 0
   1f274:	30 e0       	ldi	r19, 0x00	; 0
   1f276:	48 ec       	ldi	r20, 0xC8	; 200
   1f278:	51 e4       	ldi	r21, 0x41	; 65
   1f27a:	0f 94 3e 79 	call	0x2f27c	; 0x2f27c <count_e(float, float, float, float) [clone .constprop.134]>
   1f27e:	9f 93       	push	r25
   1f280:	8f 93       	push	r24
   1f282:	7f 93       	push	r23
   1f284:	6f 93       	push	r22
   1f286:	01 e4       	ldi	r16, 0x41	; 65
   1f288:	0f 93       	push	r16
   1f28a:	18 ec       	ldi	r17, 0xC8	; 200
   1f28c:	1f 93       	push	r17
   1f28e:	1f 92       	push	r1
   1f290:	1f 92       	push	r1
   1f292:	cf e5       	ldi	r28, 0x5F	; 95
   1f294:	d4 e8       	ldi	r29, 0x84	; 132
   1f296:	df 93       	push	r29
   1f298:	cf 93       	push	r28
   1f29a:	0e 94 b7 8f 	call	0x11f6e	; 0x11f6e <enquecommandf_P(char const*, ...)>
    enquecommandf_P(extrude_fmt_X, 25.f*invert, count_e(layer_height, extrusion_width * 2.f, 25));
   1f29e:	a5 01       	movw	r20, r10
   1f2a0:	94 01       	movw	r18, r8
   1f2a2:	c5 01       	movw	r24, r10
   1f2a4:	b4 01       	movw	r22, r8
   1f2a6:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   1f2aa:	20 e0       	ldi	r18, 0x00	; 0
   1f2ac:	30 e0       	ldi	r19, 0x00	; 0
   1f2ae:	48 ec       	ldi	r20, 0xC8	; 200
   1f2b0:	51 e4       	ldi	r21, 0x41	; 65
   1f2b2:	0f 94 3e 79 	call	0x2f27c	; 0x2f27c <count_e(float, float, float, float) [clone .constprop.134]>
   1f2b6:	9f 93       	push	r25
   1f2b8:	8f 93       	push	r24
   1f2ba:	7f 93       	push	r23
   1f2bc:	6f 93       	push	r22
   1f2be:	0f 93       	push	r16
   1f2c0:	1f 93       	push	r17
   1f2c2:	1f 92       	push	r1
   1f2c4:	1f 92       	push	r1
   1f2c6:	df 93       	push	r29
   1f2c8:	cf 93       	push	r28
   1f2ca:	0e 94 b7 8f 	call	0x11f6e	; 0x11f6e <enquecommandf_P(char const*, ...)>
    enquecommandf_P(extrude_fmt_X, 100.f*invert, count_e(layer_height, extrusion_width, 100));
   1f2ce:	20 e0       	ldi	r18, 0x00	; 0
   1f2d0:	30 e0       	ldi	r19, 0x00	; 0
   1f2d2:	48 ec       	ldi	r20, 0xC8	; 200
   1f2d4:	52 e4       	ldi	r21, 0x42	; 66
   1f2d6:	c5 01       	movw	r24, r10
   1f2d8:	b4 01       	movw	r22, r8
   1f2da:	0f 94 3e 79 	call	0x2f27c	; 0x2f27c <count_e(float, float, float, float) [clone .constprop.134]>
   1f2de:	9f 93       	push	r25
   1f2e0:	8f 93       	push	r24
   1f2e2:	7f 93       	push	r23
   1f2e4:	6f 93       	push	r22
   1f2e6:	82 e4       	ldi	r24, 0x42	; 66
   1f2e8:	8f 93       	push	r24
   1f2ea:	1f 93       	push	r17
   1f2ec:	1f 92       	push	r1
   1f2ee:	1f 92       	push	r1
   1f2f0:	df 93       	push	r29
   1f2f2:	cf 93       	push	r28
   1f2f4:	0e 94 b7 8f 	call	0x11f6e	; 0x11f6e <enquecommandf_P(char const*, ...)>
    enquecommandf_P(extrude_fmt_Y, -20.f*invert, count_e(layer_height, extrusion_width, 20));
   1f2f8:	8d b7       	in	r24, 0x3d	; 61
   1f2fa:	9e b7       	in	r25, 0x3e	; 62
   1f2fc:	84 96       	adiw	r24, 0x24	; 36
   1f2fe:	0f b6       	in	r0, 0x3f	; 63
   1f300:	f8 94       	cli
   1f302:	9e bf       	out	0x3e, r25	; 62
   1f304:	0f be       	out	0x3f, r0	; 63
   1f306:	8d bf       	out	0x3d, r24	; 61
   1f308:	20 e0       	ldi	r18, 0x00	; 0
   1f30a:	30 e0       	ldi	r19, 0x00	; 0
   1f30c:	40 ea       	ldi	r20, 0xA0	; 160
   1f30e:	51 e4       	ldi	r21, 0x41	; 65
   1f310:	c5 01       	movw	r24, r10
   1f312:	b4 01       	movw	r22, r8
   1f314:	0f 94 3e 79 	call	0x2f27c	; 0x2f27c <count_e(float, float, float, float) [clone .constprop.134]>
   1f318:	9f 93       	push	r25
   1f31a:	8f 93       	push	r24
   1f31c:	7f 93       	push	r23
   1f31e:	6f 93       	push	r22
   1f320:	81 ec       	ldi	r24, 0xC1	; 193
   1f322:	8f 93       	push	r24
   1f324:	80 ea       	ldi	r24, 0xA0	; 160
   1f326:	8f 93       	push	r24
   1f328:	1f 92       	push	r1
   1f32a:	1f 92       	push	r1
   1f32c:	84 e3       	ldi	r24, 0x34	; 52
   1f32e:	94 e8       	ldi	r25, 0x84	; 132
   1f330:	9f 93       	push	r25
   1f332:	8f 93       	push	r24
   1f334:	0e 94 b7 8f 	call	0x11f6e	; 0x11f6e <enquecommandf_P(char const*, ...)>
   1f338:	8d b7       	in	r24, 0x3d	; 61
   1f33a:	9e b7       	in	r25, 0x3e	; 62
   1f33c:	0a 96       	adiw	r24, 0x0a	; 10
   1f33e:	0f b6       	in	r0, 0x3f	; 63
   1f340:	f8 94       	cli
   1f342:	9e bf       	out	0x3e, r25	; 62
   1f344:	0f be       	out	0x3f, r0	; 63
   1f346:	8d bf       	out	0x3d, r24	; 61
   1f348:	f3 cd       	rjmp	.-1050   	; 0x1ef30 <lcd_commands() [clone .part.42]+0x326>

//! @brief Print meander
//! @param cmd_buffer character buffer needed to format gcodes
void lay1cal_meander(float layer_height, float extrusion_width)
{
    const float long_extrusion = count_e(layer_height, extrusion_width, long_length);
   1f34a:	20 e0       	ldi	r18, 0x00	; 0
   1f34c:	30 e0       	ldi	r19, 0x00	; 0
   1f34e:	46 e1       	ldi	r20, 0x16	; 22
   1f350:	53 e4       	ldi	r21, 0x43	; 67
   1f352:	c5 01       	movw	r24, r10
   1f354:	b4 01       	movw	r22, r8
   1f356:	0f 94 3e 79 	call	0x2f27c	; 0x2f27c <count_e(float, float, float, float) [clone .constprop.134]>
   1f35a:	76 2e       	mov	r7, r22
   1f35c:	67 2e       	mov	r6, r23
   1f35e:	58 2e       	mov	r5, r24
   1f360:	49 2e       	mov	r4, r25
    const float short_extrusion = count_e(layer_height, extrusion_width, short_length);
   1f362:	20 e0       	ldi	r18, 0x00	; 0
   1f364:	30 e0       	ldi	r19, 0x00	; 0
   1f366:	40 ea       	ldi	r20, 0xA0	; 160
   1f368:	51 e4       	ldi	r21, 0x41	; 65
   1f36a:	c5 01       	movw	r24, r10
   1f36c:	b4 01       	movw	r22, r8
   1f36e:	0f 94 3e 79 	call	0x2f27c	; 0x2f27c <count_e(float, float, float, float) [clone .constprop.134]>
   1f372:	b6 2e       	mov	r11, r22
   1f374:	a7 2e       	mov	r10, r23
   1f376:	98 2e       	mov	r9, r24
   1f378:	89 2e       	mov	r8, r25
   1f37a:	c5 e0       	ldi	r28, 0x05	; 5

    for(int8_t i = 0, xdir = -invert; i <= 4; i++, xdir = -xdir)
   1f37c:	df ef       	ldi	r29, 0xFF	; 255
    {
        enquecommandf_P(extrude_fmt_X, xdir * long_length, long_extrusion);
   1f37e:	2f e5       	ldi	r18, 0x5F	; 95
   1f380:	e2 2e       	mov	r14, r18
   1f382:	24 e8       	ldi	r18, 0x84	; 132
   1f384:	f2 2e       	mov	r15, r18
        enquecommandf_P(extrude_fmt_Y, invert * -short_length, short_extrusion);
   1f386:	31 ec       	ldi	r19, 0xC1	; 193
   1f388:	c3 2e       	mov	r12, r19
   1f38a:	40 ea       	ldi	r20, 0xA0	; 160
   1f38c:	d4 2e       	mov	r13, r20
   1f38e:	04 e3       	ldi	r16, 0x34	; 52
   1f390:	14 e8       	ldi	r17, 0x84	; 132
    const float long_extrusion = count_e(layer_height, extrusion_width, long_length);
    const float short_extrusion = count_e(layer_height, extrusion_width, short_length);

    for(int8_t i = 0, xdir = -invert; i <= 4; i++, xdir = -xdir)
    {
        enquecommandf_P(extrude_fmt_X, xdir * long_length, long_extrusion);
   1f392:	4f 92       	push	r4
   1f394:	5f 92       	push	r5
   1f396:	6f 92       	push	r6
   1f398:	7f 92       	push	r7
   1f39a:	6d 2f       	mov	r22, r29
   1f39c:	0d 2e       	mov	r0, r29
   1f39e:	00 0c       	add	r0, r0
   1f3a0:	77 0b       	sbc	r23, r23
   1f3a2:	88 0b       	sbc	r24, r24
   1f3a4:	99 0b       	sbc	r25, r25
   1f3a6:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   1f3aa:	20 e0       	ldi	r18, 0x00	; 0
   1f3ac:	30 e0       	ldi	r19, 0x00	; 0
   1f3ae:	46 e1       	ldi	r20, 0x16	; 22
   1f3b0:	53 e4       	ldi	r21, 0x43	; 67
   1f3b2:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   1f3b6:	9f 93       	push	r25
   1f3b8:	8f 93       	push	r24
   1f3ba:	7f 93       	push	r23
   1f3bc:	6f 93       	push	r22
   1f3be:	ff 92       	push	r15
   1f3c0:	ef 92       	push	r14
   1f3c2:	0e 94 b7 8f 	call	0x11f6e	; 0x11f6e <enquecommandf_P(char const*, ...)>
        enquecommandf_P(extrude_fmt_Y, invert * -short_length, short_extrusion);
   1f3c6:	8f 92       	push	r8
   1f3c8:	9f 92       	push	r9
   1f3ca:	af 92       	push	r10
   1f3cc:	bf 92       	push	r11
   1f3ce:	cf 92       	push	r12
   1f3d0:	df 92       	push	r13
   1f3d2:	1f 92       	push	r1
   1f3d4:	1f 92       	push	r1
   1f3d6:	1f 93       	push	r17
   1f3d8:	0f 93       	push	r16
   1f3da:	0e 94 b7 8f 	call	0x11f6e	; 0x11f6e <enquecommandf_P(char const*, ...)>
void lay1cal_meander(float layer_height, float extrusion_width)
{
    const float long_extrusion = count_e(layer_height, extrusion_width, long_length);
    const float short_extrusion = count_e(layer_height, extrusion_width, short_length);

    for(int8_t i = 0, xdir = -invert; i <= 4; i++, xdir = -xdir)
   1f3de:	d1 95       	neg	r29
   1f3e0:	c1 50       	subi	r28, 0x01	; 1
   1f3e2:	8d b7       	in	r24, 0x3d	; 61
   1f3e4:	9e b7       	in	r25, 0x3e	; 62
   1f3e6:	44 96       	adiw	r24, 0x14	; 20
   1f3e8:	0f b6       	in	r0, 0x3f	; 63
   1f3ea:	f8 94       	cli
   1f3ec:	9e bf       	out	0x3e, r25	; 62
   1f3ee:	0f be       	out	0x3f, r0	; 63
   1f3f0:	8d bf       	out	0x3d, r24	; 61
   1f3f2:	c1 11       	cpse	r28, r1
   1f3f4:	ce cf       	rjmp	.-100    	; 0x1f392 <lcd_commands() [clone .part.42]+0x788>
   1f3f6:	9c cd       	rjmp	.-1224   	; 0x1ef30 <lcd_commands() [clone .part.42]+0x326>
//! @param layer_height layer height in mm
//! @param extrusion_width extrusion width in mm
//! @return filament length in mm which needs to be extruded to form line
static constexpr float spacing(float layer_height, float extrusion_width, float overlap_factor=1.f)
{
    return extrusion_width - layer_height * (overlap_factor - M_PI/4);
   1f3f8:	23 e4       	ldi	r18, 0x43	; 67
   1f3fa:	3d ec       	ldi	r19, 0xCD	; 205
   1f3fc:	4f e2       	ldi	r20, 0x2F	; 47
   1f3fe:	5d e3       	ldi	r21, 0x3D	; 61
   1f400:	c5 01       	movw	r24, r10
   1f402:	b4 01       	movw	r22, r8
   1f404:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   1f408:	6b 01       	movw	r12, r22
   1f40a:	7c 01       	movw	r14, r24
//!
//! @param cmd_buffer character buffer needed to format gcodes
void lay1cal_square(float layer_height, float extrusion_width)
{
    const float Y_spacing = spacing(layer_height, extrusion_width);
    const float long_extrusion = count_e(layer_height, extrusion_width, square_width);
   1f40c:	20 e0       	ldi	r18, 0x00	; 0
   1f40e:	30 e0       	ldi	r19, 0x00	; 0
   1f410:	40 ea       	ldi	r20, 0xA0	; 160
   1f412:	51 e4       	ldi	r21, 0x41	; 65
   1f414:	c5 01       	movw	r24, r10
   1f416:	b4 01       	movw	r22, r8
   1f418:	0f 94 3e 79 	call	0x2f27c	; 0x2f27c <count_e(float, float, float, float) [clone .constprop.134]>
   1f41c:	66 2e       	mov	r6, r22
   1f41e:	57 2e       	mov	r5, r23
   1f420:	48 2e       	mov	r4, r24
   1f422:	39 2e       	mov	r3, r25
    const float short_extrusion = count_e(layer_height, extrusion_width, Y_spacing);
   1f424:	a7 01       	movw	r20, r14
   1f426:	96 01       	movw	r18, r12
   1f428:	c5 01       	movw	r24, r10
   1f42a:	b4 01       	movw	r22, r8
   1f42c:	0f 94 3e 79 	call	0x2f27c	; 0x2f27c <count_e(float, float, float, float) [clone .constprop.134]>
   1f430:	26 2e       	mov	r2, r22
   1f432:	a7 2e       	mov	r10, r23
   1f434:	98 2e       	mov	r9, r24
   1f436:	89 2e       	mov	r8, r25
   1f438:	84 e0       	ldi	r24, 0x04	; 4
   1f43a:	b8 2e       	mov	r11, r24

    for (uint8_t i = 0; i < 4; i++)
    {
        enquecommandf_P(extrude_fmt_X, square_width*invert, long_extrusion);
   1f43c:	90 ea       	ldi	r25, 0xA0	; 160
   1f43e:	79 2e       	mov	r7, r25
   1f440:	0f e5       	ldi	r16, 0x5F	; 95
   1f442:	14 e8       	ldi	r17, 0x84	; 132
        enquecommandf_P(extrude_fmt_Y, -Y_spacing*invert, short_extrusion);
   1f444:	f7 fa       	bst	r15, 7
   1f446:	f0 94       	com	r15
   1f448:	f7 f8       	bld	r15, 7
   1f44a:	f0 94       	com	r15
   1f44c:	c4 e3       	ldi	r28, 0x34	; 52
   1f44e:	d4 e8       	ldi	r29, 0x84	; 132
    const float long_extrusion = count_e(layer_height, extrusion_width, square_width);
    const float short_extrusion = count_e(layer_height, extrusion_width, Y_spacing);

    for (uint8_t i = 0; i < 4; i++)
    {
        enquecommandf_P(extrude_fmt_X, square_width*invert, long_extrusion);
   1f450:	3f 92       	push	r3
   1f452:	4f 92       	push	r4
   1f454:	5f 92       	push	r5
   1f456:	6f 92       	push	r6
   1f458:	91 e4       	ldi	r25, 0x41	; 65
   1f45a:	9f 93       	push	r25
   1f45c:	7f 92       	push	r7
   1f45e:	1f 92       	push	r1
   1f460:	1f 92       	push	r1
   1f462:	1f 93       	push	r17
   1f464:	0f 93       	push	r16
   1f466:	0e 94 b7 8f 	call	0x11f6e	; 0x11f6e <enquecommandf_P(char const*, ...)>
        enquecommandf_P(extrude_fmt_Y, -Y_spacing*invert, short_extrusion);
   1f46a:	8f 92       	push	r8
   1f46c:	9f 92       	push	r9
   1f46e:	af 92       	push	r10
   1f470:	2f 92       	push	r2
   1f472:	ff 92       	push	r15
   1f474:	ef 92       	push	r14
   1f476:	df 92       	push	r13
   1f478:	cf 92       	push	r12
   1f47a:	df 93       	push	r29
   1f47c:	cf 93       	push	r28
   1f47e:	0e 94 b7 8f 	call	0x11f6e	; 0x11f6e <enquecommandf_P(char const*, ...)>
        enquecommandf_P(extrude_fmt_X, -square_width*invert, long_extrusion);
   1f482:	3f 92       	push	r3
   1f484:	4f 92       	push	r4
   1f486:	5f 92       	push	r5
   1f488:	6f 92       	push	r6
   1f48a:	81 ec       	ldi	r24, 0xC1	; 193
   1f48c:	8f 93       	push	r24
   1f48e:	7f 92       	push	r7
   1f490:	1f 92       	push	r1
   1f492:	1f 92       	push	r1
   1f494:	1f 93       	push	r17
   1f496:	0f 93       	push	r16
   1f498:	0e 94 b7 8f 	call	0x11f6e	; 0x11f6e <enquecommandf_P(char const*, ...)>
        enquecommandf_P(extrude_fmt_Y, -Y_spacing*invert, short_extrusion);
   1f49c:	8f 92       	push	r8
   1f49e:	9f 92       	push	r9
   1f4a0:	af 92       	push	r10
   1f4a2:	2f 92       	push	r2
   1f4a4:	ff 92       	push	r15
   1f4a6:	ef 92       	push	r14
   1f4a8:	df 92       	push	r13
   1f4aa:	cf 92       	push	r12
   1f4ac:	df 93       	push	r29
   1f4ae:	cf 93       	push	r28
   1f4b0:	0e 94 b7 8f 	call	0x11f6e	; 0x11f6e <enquecommandf_P(char const*, ...)>
   1f4b4:	ba 94       	dec	r11
{
    const float Y_spacing = spacing(layer_height, extrusion_width);
    const float long_extrusion = count_e(layer_height, extrusion_width, square_width);
    const float short_extrusion = count_e(layer_height, extrusion_width, Y_spacing);

    for (uint8_t i = 0; i < 4; i++)
   1f4b6:	8d b7       	in	r24, 0x3d	; 61
   1f4b8:	9e b7       	in	r25, 0x3e	; 62
   1f4ba:	88 96       	adiw	r24, 0x28	; 40
   1f4bc:	0f b6       	in	r0, 0x3f	; 63
   1f4be:	f8 94       	cli
   1f4c0:	9e bf       	out	0x3e, r25	; 62
   1f4c2:	0f be       	out	0x3f, r0	; 63
   1f4c4:	8d bf       	out	0x3d, r24	; 61
   1f4c6:	b1 10       	cpse	r11, r1
   1f4c8:	c3 cf       	rjmp	.-122    	; 0x1f450 <lcd_commands() [clone .part.42]+0x846>
   1f4ca:	32 cd       	rjmp	.-1436   	; 0x1ef30 <lcd_commands() [clone .part.42]+0x326>
        MSG_M702,         // Unload filament (MMU only)
        cmd_cal_finish_8, // Turn off hotend heater
        MSG_M84           // Disable stepper motors
    };

    lay1cal_common_enqueue_loop(cmd_cal_finish, (sizeof(cmd_cal_finish)/sizeof(cmd_cal_finish[0])));
   1f4cc:	69 e0       	ldi	r22, 0x09	; 9
   1f4ce:	82 e2       	ldi	r24, 0x22	; 34
   1f4d0:	94 e8       	ldi	r25, 0x84	; 132
   1f4d2:	fc cc       	rjmp	.-1544   	; 0x1eecc <lcd_commands() [clone .part.42]+0x2c2>
                break;
            case 2:
                lay1cal_finish();
                break;
            case 1:
                lcd_setstatuspgm(MSG_WELCOME);
   1f4d4:	86 ee       	ldi	r24, 0xE6	; 230
   1f4d6:	9b e6       	ldi	r25, 0x6B	; 107
   1f4d8:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
                lcd_commands_step = 0;
   1f4dc:	10 92 e2 03 	sts	0x03E2, r1	; 0x8003e2 <lcd_commands_step>
                lcd_commands_type = LcdCommands::Idle;
   1f4e0:	10 92 5e 0d 	sts	0x0D5E, r1	; 0x800d5e <lcd_commands_type>
   1f4e4:	82 e0       	ldi	r24, 0x02	; 2
   1f4e6:	80 93 61 0d 	sts	0x0D61, r24	; 0x800d61 <_ZL13printer_state.lto_priv.386>
                SetPrinterState(PrinterState::Idle);
                if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE))
   1f4ea:	8f e5       	ldi	r24, 0x5F	; 95
   1f4ec:	9f e0       	ldi	r25, 0x0F	; 15
   1f4ee:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1f4f2:	88 23       	and	r24, r24
   1f4f4:	09 f4       	brne	.+2      	; 0x1f4f8 <lcd_commands() [clone .part.42]+0x8ee>
   1f4f6:	f3 cd       	rjmp	.-1050   	; 0x1f0de <lcd_commands() [clone .part.42]+0x4d4>
                    lcd_wizard(WizState::RepeatLay1Cal);
   1f4f8:	8b e0       	ldi	r24, 0x0B	; 11
   1f4fa:	0e 94 c3 eb 	call	0x1d786	; 0x1d786 <lcd_wizard(WizState)>
   1f4fe:	18 cd       	rjmp	.-1488   	; 0x1ef30 <lcd_commands() [clone .part.42]+0x326>
			if (_Kp != 0 || _Ki != 0 || _Kd != 0) {
				enquecommandf_P(PSTR("M301 P%.2f I%.2f D%.2f"), _Kp, _Ki, _Kd);
				enquecommand_P(MSG_M500);
			}
			else {
				SERIAL_ECHOPGM("Invalid PID cal. results. Not stored to EEPROM.");
   1f500:	8a ec       	ldi	r24, 0xCA	; 202
   1f502:	94 e8       	ldi	r25, 0x84	; 132
   1f504:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   1f508:	c4 cd       	rjmp	.-1144   	; 0x1f092 <lcd_commands() [clone .part.42]+0x488>
#endif //THERMAL_MODEL
#endif //QUICK_NOZZLE_CHANGE
            switch(lcd_commands_step)
            {
            case 0:
                lcd_commands_step = 3;
   1f50a:	83 e0       	ldi	r24, 0x03	; 3
                    thermal_model_set_enabled(was_enabled);
#endif //THERMAL_MODEL
#else
                    fanSpeed = 0; //turn off fan
#endif //QUICK_NOZZLE_CHANGE
                    lcd_commands_step = 1;
   1f50c:	80 93 e2 03 	sts	0x03E2, r24	; 0x8003e2 <lcd_commands_step>
   1f510:	07 ce       	rjmp	.-1010   	; 0x1f120 <lcd_commands() [clone .part.42]+0x516>
            case 0:
                lcd_commands_step = 3;
                break;
            case 3:
#ifndef QUICK_NOZZLE_CHANGE
                lcd_show_fullscreen_message_and_wait_P(_T(MSG_NOZZLE_CNG_READ_HELP));
   1f512:	89 e6       	ldi	r24, 0x69	; 105
   1f514:	9b e4       	ldi	r25, 0x4B	; 75
   1f516:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1f51a:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
                enquecommand_P(G28W);
   1f51e:	61 e0       	ldi	r22, 0x01	; 1
   1f520:	81 ed       	ldi	r24, 0xD1	; 209
   1f522:	98 e6       	ldi	r25, 0x68	; 104
   1f524:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
                enquecommand_P(PSTR("G1 X125 Z200 F1000"));
   1f528:	61 e0       	ldi	r22, 0x01	; 1
   1f52a:	87 eb       	ldi	r24, 0xB7	; 183
   1f52c:	94 e8       	ldi	r25, 0x84	; 132
   1f52e:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
                enquecommand_P(PSTR("M109 S280"));
   1f532:	61 e0       	ldi	r22, 0x01	; 1
   1f534:	8d ea       	ldi	r24, 0xAD	; 173
   1f536:	94 e8       	ldi	r25, 0x84	; 132
   1f538:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
                    }
                }
                enquecommand_P(G28W); //home
                enquecommand_P(PSTR("G1 X125 Z200 F1000")); //move to top center
#endif //QUICK_NOZZLE_CHANGE
                lcd_commands_step = 2;
   1f53c:	82 e0       	ldi	r24, 0x02	; 2
   1f53e:	e6 cf       	rjmp	.-52     	; 0x1f50c <lcd_commands() [clone .part.42]+0x902>
                break;
            case 2:
                enquecommand_P(PSTR("M84 XY"));
   1f540:	61 e0       	ldi	r22, 0x01	; 1
   1f542:	86 ea       	ldi	r24, 0xA6	; 166
   1f544:	94 e8       	ldi	r25, 0x84	; 132
   1f546:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
                if (lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_NOZZLE_CNG_CHANGED), false) == LCD_LEFT_BUTTON_CHOICE) {
   1f54a:	80 e3       	ldi	r24, 0x30	; 48
   1f54c:	9b e4       	ldi	r25, 0x4B	; 75
   1f54e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1f552:	41 e0       	ldi	r20, 0x01	; 1
   1f554:	60 e0       	ldi	r22, 0x00	; 0
   1f556:	0e 94 b2 e8 	call	0x1d164	; 0x1d164 <lcd_show_multiscreen_message_yes_no_and_wait_P(char const*, bool, unsigned char)>
   1f55a:	81 11       	cpse	r24, r1
   1f55c:	e1 cd       	rjmp	.-1086   	; 0x1f120 <lcd_commands() [clone .part.42]+0x516>
   1f55e:	10 92 5e 12 	sts	0x125E, r1	; 0x80125e <target_temperature+0x1>
   1f562:	10 92 5d 12 	sts	0x125D, r1	; 0x80125d <target_temperature>
                    thermal_model_set_enabled(was_enabled);
#endif //THERMAL_MODEL
#else
                    fanSpeed = 0; //turn off fan
#endif //QUICK_NOZZLE_CHANGE
                    lcd_commands_step = 1;
   1f566:	81 e0       	ldi	r24, 0x01	; 1
   1f568:	d1 cf       	rjmp	.-94     	; 0x1f50c <lcd_commands() [clone .part.42]+0x902>
                }
                break;
            case 1:
                lcd_commands_step = 0;
   1f56a:	10 92 e2 03 	sts	0x03E2, r1	; 0x8003e2 <lcd_commands_step>
                lcd_commands_type = LcdCommands::Idle;
   1f56e:	10 92 5e 0d 	sts	0x0D5E, r1	; 0x800d5e <lcd_commands_type>
   1f572:	82 e0       	ldi	r24, 0x02	; 2
   1f574:	80 93 61 0d 	sts	0x0D61, r24	; 0x800d61 <_ZL13printer_state.lto_priv.386>
                SetPrinterState(PrinterState::Idle);
                menu_goto(lcd_hw_setup_menu, 2, true);
   1f578:	20 e0       	ldi	r18, 0x00	; 0
   1f57a:	41 e0       	ldi	r20, 0x01	; 1
   1f57c:	62 e0       	ldi	r22, 0x02	; 2
   1f57e:	70 e0       	ldi	r23, 0x00	; 0
   1f580:	8b e5       	ldi	r24, 0x5B	; 91
   1f582:	91 ec       	ldi	r25, 0xC1	; 193
   1f584:	0e 94 b7 62 	call	0xc56e	; 0xc56e <menu_goto(void (*)(), int, bool, bool)>
                menu_depth = 3;
   1f588:	83 e0       	ldi	r24, 0x03	; 3
   1f58a:	80 93 df 03 	sts	0x03DF, r24	; 0x8003df <menu_depth>
   1f58e:	c8 cd       	rjmp	.-1136   	; 0x1f120 <lcd_commands() [clone .part.42]+0x516>

0001f590 <menu_lcd_lcdupdate_func()>:
            && menu_menu != lcd_babystep_z
            && lcd_timeoutToStatus.expired(LCD_TIMEOUT_TO_STATUS));
}

void menu_lcd_lcdupdate_func(void)
{
   1f590:	0f 93       	push	r16
   1f592:	1f 93       	push	r17
#if (SDCARDDETECT > 0)
	if ((IS_SD_INSERTED != lcd_oldcardstatus))
   1f594:	80 91 03 01 	lds	r24, 0x0103	; 0x800103 <__TEXT_REGION_LENGTH__+0x7c2103>
   1f598:	80 95       	com	r24
   1f59a:	81 70       	andi	r24, 0x01	; 1
   1f59c:	90 91 01 04 	lds	r25, 0x0401	; 0x800401 <lcd_oldcardstatus>
   1f5a0:	89 17       	cp	r24, r25
   1f5a2:	89 f1       	breq	.+98     	; 0x1f606 <menu_lcd_lcdupdate_func()+0x76>
	{
		if(menu_menu == lcd_sdcard_menu) {
   1f5a4:	80 91 02 04 	lds	r24, 0x0402	; 0x800402 <menu_menu>
   1f5a8:	90 91 03 04 	lds	r25, 0x0403	; 0x800403 <menu_menu+0x1>
   1f5ac:	80 5a       	subi	r24, 0xA0	; 160
   1f5ae:	95 4e       	sbci	r25, 0xE5	; 229
   1f5b0:	11 f4       	brne	.+4      	; 0x1f5b6 <menu_lcd_lcdupdate_func()+0x26>
			//    to back out of this submenu. Not only to show
			//    'Print from SD' submenu title but also because the user
			//    will be prompted with another menu with the sorted list of files.
			//    Without backing out of the menu, the list will appear empty and
			//    The user will need to back out of two nested submenus.
			menu_back();
   1f5b2:	0e 94 1b 63 	call	0xc636	; 0xc636 <menu_back()>
		}
		lcd_draw_update = 2;
   1f5b6:	82 e0       	ldi	r24, 0x02	; 2
   1f5b8:	80 93 59 02 	sts	0x0259, r24	; 0x800259 <lcd_draw_update>
		lcd_oldcardstatus = IS_SD_INSERTED;
   1f5bc:	80 91 03 01 	lds	r24, 0x0103	; 0x800103 <__TEXT_REGION_LENGTH__+0x7c2103>
   1f5c0:	80 95       	com	r24
   1f5c2:	81 70       	andi	r24, 0x01	; 1
   1f5c4:	80 93 01 04 	sts	0x0401, r24	; 0x800401 <lcd_oldcardstatus>
		lcd_refresh(); // to maybe revive the LCD if static electricity killed it.
   1f5c8:	0e 94 9f 70 	call	0xe13e	; 0xe13e <lcd_refresh()>
		backlight_wake();
		if (lcd_oldcardstatus)
   1f5cc:	80 91 01 04 	lds	r24, 0x0401	; 0x800401 <lcd_oldcardstatus>
   1f5d0:	88 23       	and	r24, r24
   1f5d2:	09 f4       	brne	.+2      	; 0x1f5d6 <menu_lcd_lcdupdate_func()+0x46>
   1f5d4:	88 c0       	rjmp	.+272    	; 0x1f6e6 <menu_lcd_lcdupdate_func()+0x156>
		{
			if (!card.mounted)
   1f5d6:	80 91 d8 13 	lds	r24, 0x13D8	; 0x8013d8 <card+0x3>
   1f5da:	81 11       	cpse	r24, r1
   1f5dc:	05 c0       	rjmp	.+10     	; 0x1f5e8 <menu_lcd_lcdupdate_func()+0x58>
			{
				card.mount(false); //delay the sorting to the sd menu. Otherwise, removing the SD card while sorting will not menu_back()
   1f5de:	0f 94 6a 73 	call	0x2e6d4	; 0x2e6d4 <CardReader::mount(bool) [clone .constprop.192]>
				card.presort_flag = true; //force sorting of the SD menu
   1f5e2:	81 e0       	ldi	r24, 0x01	; 1
   1f5e4:	80 93 26 14 	sts	0x1426, r24	; 0x801426 <card+0x51>
			}
			LCD_MESSAGERPGM(MSG_WELCOME);
   1f5e8:	86 ee       	ldi	r24, 0xE6	; 230
   1f5ea:	9b e6       	ldi	r25, 0x6B	; 107
   1f5ec:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
			bMain=false;                       // flag (i.e. 'fake parameter') for 'lcd_sdcard_menu()' function
   1f5f0:	10 92 c9 03 	sts	0x03C9, r1	; 0x8003c9 <bMain>
			menu_submenu(lcd_sdcard_menu, true);
   1f5f4:	61 e0       	ldi	r22, 0x01	; 1
   1f5f6:	80 ea       	ldi	r24, 0xA0	; 160
   1f5f8:	95 ee       	ldi	r25, 0xE5	; 229
   1f5fa:	0e 94 dd 62 	call	0xc5ba	; 0xc5ba <menu_submenu(void (*)(), bool)>
			lcd_timeoutToStatus.start();
   1f5fe:	83 ee       	ldi	r24, 0xE3	; 227
   1f600:	93 e0       	ldi	r25, 0x03	; 3
   1f602:	0f 94 47 10 	call	0x2208e	; 0x2208e <Timer<unsigned long>::start()>
			card.release();
			LCD_MESSAGERPGM(_T(MSG_SD_REMOVED));
		}
	}
#endif//CARDINSERTED
	if (lcd_next_update_millis < _millis())
   1f606:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   1f60a:	00 91 c5 03 	lds	r16, 0x03C5	; 0x8003c5 <lcd_next_update_millis>
   1f60e:	10 91 c6 03 	lds	r17, 0x03C6	; 0x8003c6 <lcd_next_update_millis+0x1>
   1f612:	20 91 c7 03 	lds	r18, 0x03C7	; 0x8003c7 <lcd_next_update_millis+0x2>
   1f616:	30 91 c8 03 	lds	r19, 0x03C8	; 0x8003c8 <lcd_next_update_millis+0x3>
   1f61a:	06 17       	cp	r16, r22
   1f61c:	17 07       	cpc	r17, r23
   1f61e:	28 07       	cpc	r18, r24
   1f620:	39 07       	cpc	r19, r25
   1f622:	e8 f5       	brcc	.+122    	; 0x1f69e <menu_lcd_lcdupdate_func()+0x10e>
	{
		if (lcd_draw_update) {
   1f624:	80 91 59 02 	lds	r24, 0x0259	; 0x800259 <lcd_draw_update>
   1f628:	88 23       	and	r24, r24
   1f62a:	31 f0       	breq	.+12     	; 0x1f638 <menu_lcd_lcdupdate_func()+0xa8>
			lcd_timeoutToStatus.start();
   1f62c:	83 ee       	ldi	r24, 0xE3	; 227
   1f62e:	93 e0       	ldi	r25, 0x03	; 3
   1f630:	0f 94 47 10 	call	0x2208e	; 0x2208e <Timer<unsigned long>::start()>
            lcd_frame_start();
   1f634:	0e 94 e6 6e 	call	0xddcc	; 0xddcc <lcd_frame_start()>
		}

		(*menu_menu)();
   1f638:	e0 91 02 04 	lds	r30, 0x0402	; 0x800402 <menu_menu>
   1f63c:	f0 91 03 04 	lds	r31, 0x0403	; 0x800403 <menu_menu+0x1>
   1f640:	19 95       	eicall
// we should ignore lcd_timeoutToStatus. Example use case is
// when running first layer calibration.
static inline bool z_menu_expired()
{
    return (menu_menu == lcd_babystep_z
        && (!babystep_allowed() || (lcd_commands_type == LcdCommands::Idle && lcd_timeoutToStatus.expired(LCD_TIMEOUT_TO_STATUS_BABYSTEP_Z))));
   1f642:	80 91 02 04 	lds	r24, 0x0402	; 0x800402 <menu_menu>
   1f646:	90 91 03 04 	lds	r25, 0x0403	; 0x800403 <menu_menu+0x1>
   1f64a:	88 56       	subi	r24, 0x68	; 104
   1f64c:	97 4d       	sbci	r25, 0xD7	; 215
   1f64e:	09 f4       	brne	.+2      	; 0x1f652 <menu_lcd_lcdupdate_func()+0xc2>
   1f650:	5d c0       	rjmp	.+186    	; 0x1f70c <menu_lcd_lcdupdate_func()+0x17c>
}
static inline bool other_menu_expired()
{
    return (menu_menu != lcd_status_screen
   1f652:	80 91 02 04 	lds	r24, 0x0402	; 0x800402 <menu_menu>
   1f656:	90 91 03 04 	lds	r25, 0x0403	; 0x800403 <menu_menu+0x1>
            && menu_menu != lcd_babystep_z
            && lcd_timeoutToStatus.expired(LCD_TIMEOUT_TO_STATUS));
   1f65a:	27 e3       	ldi	r18, 0x37	; 55
   1f65c:	80 32       	cpi	r24, 0x20	; 32
   1f65e:	92 07       	cpc	r25, r18
   1f660:	09 f0       	breq	.+2      	; 0x1f664 <menu_lcd_lcdupdate_func()+0xd4>
   1f662:	75 c0       	rjmp	.+234    	; 0x1f74e <menu_lcd_lcdupdate_func()+0x1be>
			}
			lcd_clear();
			lcd_return_to_status();
			lcd_draw_update = 2;
		}
		if (lcd_draw_update == 2) lcdui_refresh();
   1f664:	80 91 59 02 	lds	r24, 0x0259	; 0x800259 <lcd_draw_update>
   1f668:	82 30       	cpi	r24, 0x02	; 2
   1f66a:	21 f4       	brne	.+8      	; 0x1f674 <menu_lcd_lcdupdate_func()+0xe4>
#endif //DEBUG_DISABLE_LCD_STATUS_LINE
}

static void lcdui_refresh(uint8_t clear = true)
{
    clear ? lcd_refresh() : lcd_refresh_noclear();
   1f66c:	0e 94 9f 70 	call	0xe13e	; 0xe13e <lcd_refresh()>
    lcd_status_message_idx = 0; // Re-draw message from beginning
   1f670:	10 92 64 04 	sts	0x0464, r1	; 0x800464 <_ZL22lcd_status_message_idx.lto_priv.419>
			lcd_clear();
			lcd_return_to_status();
			lcd_draw_update = 2;
		}
		if (lcd_draw_update == 2) lcdui_refresh();
		if (lcd_draw_update) lcd_draw_update--;
   1f674:	80 91 59 02 	lds	r24, 0x0259	; 0x800259 <lcd_draw_update>
   1f678:	88 23       	and	r24, r24
   1f67a:	19 f0       	breq	.+6      	; 0x1f682 <menu_lcd_lcdupdate_func()+0xf2>
   1f67c:	81 50       	subi	r24, 0x01	; 1
   1f67e:	80 93 59 02 	sts	0x0259, r24	; 0x800259 <lcd_draw_update>
		lcd_next_update_millis = _millis() + LCD_UPDATE_INTERVAL;
   1f682:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   1f686:	6c 59       	subi	r22, 0x9C	; 156
   1f688:	7f 4f       	sbci	r23, 0xFF	; 255
   1f68a:	8f 4f       	sbci	r24, 0xFF	; 255
   1f68c:	9f 4f       	sbci	r25, 0xFF	; 255
   1f68e:	60 93 c5 03 	sts	0x03C5, r22	; 0x8003c5 <lcd_next_update_millis>
   1f692:	70 93 c6 03 	sts	0x03C6, r23	; 0x8003c6 <lcd_next_update_millis+0x1>
   1f696:	80 93 c7 03 	sts	0x03C7, r24	; 0x8003c7 <lcd_next_update_millis+0x2>
   1f69a:	90 93 c8 03 	sts	0x03C8, r25	; 0x8003c8 <lcd_next_update_millis+0x3>
    SERIAL_ECHO(']');
    prusa_stat_diameter();
}

static void lcd_send_status() {
    if (farm_mode && no_response && (NcTime.expired(NC_TIME * 1000))) {
   1f69e:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   1f6a2:	88 23       	and	r24, r24
   1f6a4:	99 f0       	breq	.+38     	; 0x1f6cc <menu_lcd_lcdupdate_func()+0x13c>
   1f6a6:	80 91 08 04 	lds	r24, 0x0408	; 0x800408 <_ZL11no_response.lto_priv.493>
   1f6aa:	88 23       	and	r24, r24
   1f6ac:	79 f0       	breq	.+30     	; 0x1f6cc <menu_lcd_lcdupdate_func()+0x13c>
   1f6ae:	60 e1       	ldi	r22, 0x10	; 16
   1f6b0:	77 e2       	ldi	r23, 0x27	; 39
   1f6b2:	81 ec       	ldi	r24, 0xC1	; 193
   1f6b4:	93 e0       	ldi	r25, 0x03	; 3
   1f6b6:	0f 94 1f 0e 	call	0x21c3e	; 0x21c3e <Timer<unsigned short>::expired(unsigned short)>
   1f6ba:	88 23       	and	r24, r24
   1f6bc:	39 f0       	breq	.+14     	; 0x1f6cc <menu_lcd_lcdupdate_func()+0x13c>
        //send important status messages periodicaly
        prusa_statistics(8);
   1f6be:	88 e0       	ldi	r24, 0x08	; 8
   1f6c0:	0f 94 79 32 	call	0x264f2	; 0x264f2 <prusa_statistics(unsigned char)>
        NcTime.start();
   1f6c4:	81 ec       	ldi	r24, 0xC1	; 193
   1f6c6:	93 e0       	ldi	r25, 0x03	; 3
   1f6c8:	0f 94 4e 0e 	call	0x21c9c	; 0x21c9c <Timer<unsigned short>::start()>
	}
	prusa_statistics_update_from_lcd_update();
	if (lcd_commands_type == LcdCommands::Layer1Cal) lcd_commands();
   1f6cc:	80 91 5e 0d 	lds	r24, 0x0D5E	; 0x800d5e <lcd_commands_type>
   1f6d0:	84 30       	cpi	r24, 0x04	; 4
   1f6d2:	09 f0       	breq	.+2      	; 0x1f6d6 <menu_lcd_lcdupdate_func()+0x146>
   1f6d4:	53 c0       	rjmp	.+166    	; 0x1f77c <menu_lcd_lcdupdate_func()+0x1ec>
void lcd_print_stop_finish();

void lcd_commands()
{
    // printf_P(PSTR("lcd_commands begin, lcd_commands_type=%u, lcd_commands_step=%u\n"), (uint8_t)lcd_commands_type, lcd_commands_step);
    if (planner_aborted) {
   1f6d6:	80 91 42 0d 	lds	r24, 0x0D42	; 0x800d42 <planner_aborted>
   1f6da:	81 11       	cpse	r24, r1
   1f6dc:	4f c0       	rjmp	.+158    	; 0x1f77c <menu_lcd_lcdupdate_func()+0x1ec>
		if (lcd_draw_update) lcd_draw_update--;
		lcd_next_update_millis = _millis() + LCD_UPDATE_INTERVAL;
	}
	prusa_statistics_update_from_lcd_update();
	if (lcd_commands_type == LcdCommands::Layer1Cal) lcd_commands();
}
   1f6de:	1f 91       	pop	r17
   1f6e0:	0f 91       	pop	r16
   1f6e2:	0c 94 05 f6 	jmp	0x1ec0a	; 0x1ec0a <lcd_commands() [clone .part.42]>
		presort_flag = true;
#endif
}
void CardReader::release()
{
  sdprinting = false;
   1f6e6:	10 92 d7 13 	sts	0x13D7, r1	; 0x8013d7 <card+0x2>
  mounted = false;
   1f6ea:	10 92 d8 13 	sts	0x13D8, r1	; 0x8013d8 <card+0x3>
  SERIAL_ECHO_START;
   1f6ee:	8e ec       	ldi	r24, 0xCE	; 206
   1f6f0:	91 ea       	ldi	r25, 0xA1	; 161
   1f6f2:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
  SERIAL_ECHOLNRPGM(_n("SD card released"));////MSG_SD_CARD_RELEASED
   1f6f6:	88 ea       	ldi	r24, 0xA8	; 168
   1f6f8:	98 e6       	ldi	r25, 0x68	; 104
   1f6fa:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
			lcd_timeoutToStatus.start();
		}
		else
		{
			card.release();
			LCD_MESSAGERPGM(_T(MSG_SD_REMOVED));
   1f6fe:	89 ed       	ldi	r24, 0xD9	; 217
   1f700:	9a e4       	ldi	r25, 0x4A	; 74
   1f702:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1f706:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
   1f70a:	7d cf       	rjmp	.-262    	; 0x1f606 <menu_lcd_lcdupdate_func()+0x76>
// we should ignore lcd_timeoutToStatus. Example use case is
// when running first layer calibration.
static inline bool z_menu_expired()
{
    return (menu_menu == lcd_babystep_z
        && (!babystep_allowed() || (lcd_commands_type == LcdCommands::Idle && lcd_timeoutToStatus.expired(LCD_TIMEOUT_TO_STATUS_BABYSTEP_Z))));
   1f70c:	0e 94 4f 66 	call	0xcc9e	; 0xcc9e <babystep_allowed()>
   1f710:	81 11       	cpse	r24, r1
   1f712:	0e c0       	rjmp	.+28     	; 0x1f730 <menu_lcd_lcdupdate_func()+0x1a0>
		if (z_menu_expired() || other_menu_expired())
		{
		// Exiting a menu. Let's call the menu function the last time with menu_leaving flag set to true
		// to give it a chance to save its state.
		// This is useful for example, when the babystep value has to be written into EEPROM.
			if (menu_menu != NULL)
   1f714:	e0 91 02 04 	lds	r30, 0x0402	; 0x800402 <menu_menu>
   1f718:	f0 91 03 04 	lds	r31, 0x0403	; 0x800403 <menu_menu+0x1>
   1f71c:	30 97       	sbiw	r30, 0x00	; 0
   1f71e:	39 f5       	brne	.+78     	; 0x1f76e <menu_lcd_lcdupdate_func()+0x1de>
			{
				menu_leaving = 1;
				(*menu_menu)();
				menu_leaving = 0;
			}
			lcd_clear();
   1f720:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
			lcd_return_to_status();
   1f724:	0f 94 d5 07 	call	0x20faa	; 0x20faa <lcd_return_to_status()>
			lcd_draw_update = 2;
   1f728:	82 e0       	ldi	r24, 0x02	; 2
   1f72a:	80 93 59 02 	sts	0x0259, r24	; 0x800259 <lcd_draw_update>
   1f72e:	9a cf       	rjmp	.-204    	; 0x1f664 <menu_lcd_lcdupdate_func()+0xd4>
// we should ignore lcd_timeoutToStatus. Example use case is
// when running first layer calibration.
static inline bool z_menu_expired()
{
    return (menu_menu == lcd_babystep_z
        && (!babystep_allowed() || (lcd_commands_type == LcdCommands::Idle && lcd_timeoutToStatus.expired(LCD_TIMEOUT_TO_STATUS_BABYSTEP_Z))));
   1f730:	80 91 5e 0d 	lds	r24, 0x0D5E	; 0x800d5e <lcd_commands_type>
   1f734:	81 11       	cpse	r24, r1
   1f736:	8d cf       	rjmp	.-230    	; 0x1f652 <menu_lcd_lcdupdate_func()+0xc2>
   1f738:	40 e9       	ldi	r20, 0x90	; 144
   1f73a:	5f e5       	ldi	r21, 0x5F	; 95
   1f73c:	61 e0       	ldi	r22, 0x01	; 1
   1f73e:	70 e0       	ldi	r23, 0x00	; 0
   1f740:	83 ee       	ldi	r24, 0xE3	; 227
   1f742:	93 e0       	ldi	r25, 0x03	; 3
   1f744:	0f 94 88 0e 	call	0x21d10	; 0x21d10 <Timer<unsigned long>::expired(unsigned long)>
   1f748:	81 11       	cpse	r24, r1
   1f74a:	e4 cf       	rjmp	.-56     	; 0x1f714 <menu_lcd_lcdupdate_func()+0x184>
   1f74c:	82 cf       	rjmp	.-252    	; 0x1f652 <menu_lcd_lcdupdate_func()+0xc2>
}
static inline bool other_menu_expired()
{
    return (menu_menu != lcd_status_screen
            && menu_menu != lcd_babystep_z
   1f74e:	88 56       	subi	r24, 0x68	; 104
   1f750:	97 4d       	sbci	r25, 0xD7	; 215
   1f752:	09 f4       	brne	.+2      	; 0x1f756 <menu_lcd_lcdupdate_func()+0x1c6>
   1f754:	87 cf       	rjmp	.-242    	; 0x1f664 <menu_lcd_lcdupdate_func()+0xd4>
            && lcd_timeoutToStatus.expired(LCD_TIMEOUT_TO_STATUS));
   1f756:	40 e3       	ldi	r20, 0x30	; 48
   1f758:	55 e7       	ldi	r21, 0x75	; 117
   1f75a:	60 e0       	ldi	r22, 0x00	; 0
   1f75c:	70 e0       	ldi	r23, 0x00	; 0
   1f75e:	83 ee       	ldi	r24, 0xE3	; 227
   1f760:	93 e0       	ldi	r25, 0x03	; 3
   1f762:	0f 94 88 0e 	call	0x21d10	; 0x21d10 <Timer<unsigned long>::expired(unsigned long)>
   1f766:	88 23       	and	r24, r24
   1f768:	09 f4       	brne	.+2      	; 0x1f76c <menu_lcd_lcdupdate_func()+0x1dc>
   1f76a:	7c cf       	rjmp	.-264    	; 0x1f664 <menu_lcd_lcdupdate_func()+0xd4>
   1f76c:	d3 cf       	rjmp	.-90     	; 0x1f714 <menu_lcd_lcdupdate_func()+0x184>
		// Exiting a menu. Let's call the menu function the last time with menu_leaving flag set to true
		// to give it a chance to save its state.
		// This is useful for example, when the babystep value has to be written into EEPROM.
			if (menu_menu != NULL)
			{
				menu_leaving = 1;
   1f76e:	81 e0       	ldi	r24, 0x01	; 1
   1f770:	80 93 c4 03 	sts	0x03C4, r24	; 0x8003c4 <menu_leaving>
				(*menu_menu)();
   1f774:	19 95       	eicall
				menu_leaving = 0;
   1f776:	10 92 c4 03 	sts	0x03C4, r1	; 0x8003c4 <menu_leaving>
   1f77a:	d2 cf       	rjmp	.-92     	; 0x1f720 <menu_lcd_lcdupdate_func()+0x190>
		if (lcd_draw_update) lcd_draw_update--;
		lcd_next_update_millis = _millis() + LCD_UPDATE_INTERVAL;
	}
	prusa_statistics_update_from_lcd_update();
	if (lcd_commands_type == LcdCommands::Layer1Cal) lcd_commands();
}
   1f77c:	1f 91       	pop	r17
   1f77e:	0f 91       	pop	r16
   1f780:	08 95       	ret

0001f782 <lcd_wizard()>:
	menu_goto(lcd_generic_preheat_menu, 0, true);
}

void lcd_wizard() {
	bool result = true;
	if (calibration_status_get(CALIBRATION_WIZARD_STEPS)) {
   1f782:	87 e1       	ldi	r24, 0x17	; 23
   1f784:	0e 94 5b d7 	call	0x1aeb6	; 0x1aeb6 <calibration_status_get(unsigned char)>
   1f788:	81 11       	cpse	r24, r1
   1f78a:	06 c0       	rjmp	.+12     	; 0x1f798 <lcd_wizard()+0x16>
		// calibration already performed: ask before clearing the previous status
		result = !lcd_show_multiscreen_message_cont_cancel_and_wait_P(_T(MSG_WIZARD_RERUN), false);
	}
	if (result) {
		calibration_status_clear(CALIBRATION_WIZARD_STEPS);
   1f78c:	87 e1       	ldi	r24, 0x17	; 23
   1f78e:	0e 94 f9 d6 	call	0x1adf2	; 0x1adf2 <calibration_status_clear(unsigned char)>
		lcd_wizard(WizState::Run);
   1f792:	80 e0       	ldi	r24, 0x00	; 0
   1f794:	0c 94 c3 eb 	jmp	0x1d786	; 0x1d786 <lcd_wizard(WizState)>

void lcd_wizard() {
	bool result = true;
	if (calibration_status_get(CALIBRATION_WIZARD_STEPS)) {
		// calibration already performed: ask before clearing the previous status
		result = !lcd_show_multiscreen_message_cont_cancel_and_wait_P(_T(MSG_WIZARD_RERUN), false);
   1f798:	82 e3       	ldi	r24, 0x32	; 50
   1f79a:	9d e3       	ldi	r25, 0x3D	; 61
   1f79c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1f7a0:	41 e0       	ldi	r20, 0x01	; 1
   1f7a2:	60 e0       	ldi	r22, 0x00	; 0
   1f7a4:	0e 94 77 e5 	call	0x1caee	; 0x1caee <lcd_show_multiscreen_message_cont_cancel_and_wait_P(char const*, bool, unsigned char)>
	}
	if (result) {
   1f7a8:	88 23       	and	r24, r24
   1f7aa:	81 f3       	breq	.-32     	; 0x1f78c <lcd_wizard()+0xa>
		calibration_status_clear(CALIBRATION_WIZARD_STEPS);
		lcd_wizard(WizState::Run);
	} else {
		lcd_return_to_status();
   1f7ac:	0f 94 d5 07 	call	0x20faa	; 0x20faa <lcd_return_to_status()>
		lcd_update_enable(true);
   1f7b0:	81 e0       	ldi	r24, 0x01	; 1
   1f7b2:	0e 94 38 70 	call	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>
		lcd_update(2);
   1f7b6:	82 e0       	ldi	r24, 0x02	; 2
   1f7b8:	0c 94 f9 6e 	jmp	0xddf2	; 0xddf2 <lcd_update(unsigned char)>

0001f7bc <lcd_temp_cal_show_result(bool)>:
            lcd_show_fullscreen_message_and_wait_P(msg);
        }
    }
}

void lcd_temp_cal_show_result(bool result) {
   1f7bc:	cf 93       	push	r28
   1f7be:	c8 2f       	mov	r28, r24

	custom_message_type = CustomMsg::Status;
   1f7c0:	10 92 5d 06 	sts	0x065D, r1	; 0x80065d <custom_message_type>
	disable_x();
   1f7c4:	17 9a       	sbi	0x02, 7	; 2
   1f7c6:	10 92 39 06 	sts	0x0639, r1	; 0x800639 <axis_known_position>
	disable_y();
   1f7ca:	16 9a       	sbi	0x02, 6	; 2
   1f7cc:	10 92 3a 06 	sts	0x063A, r1	; 0x80063a <axis_known_position+0x1>
	disable_z();
	disable_e0();
   1f7d0:	14 9a       	sbi	0x02, 4	; 2
  resetPID(0);
};

FORCE_INLINE void setTargetBed(const float &celsius) {
  target_temperature_bed = celsius;
   1f7d2:	10 92 5a 12 	sts	0x125A, r1	; 0x80125a <target_temperature_bed+0x1>
   1f7d6:	10 92 59 12 	sts	0x1259, r1	; 0x801259 <target_temperature_bed>
   1f7da:	68 2f       	mov	r22, r24
   1f7dc:	86 ea       	ldi	r24, 0xA6	; 166
   1f7de:	9f e0       	ldi	r25, 0x0F	; 15
   1f7e0:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
   1f7e4:	6c 2f       	mov	r22, r28
   1f7e6:	8f ea       	ldi	r24, 0xAF	; 175
   1f7e8:	9f e0       	ldi	r25, 0x0F	; 15
   1f7ea:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>

	// Store boolean result
	eeprom_update_byte_notify((uint8_t*)EEPROM_CALIBRATION_STATUS_PINDA, result);
	eeprom_update_byte_notify((uint8_t*)EEPROM_TEMP_CAL_ACTIVE, result);

	if (result) {
   1f7ee:	cc 23       	and	r28, r28
   1f7f0:	89 f0       	breq	.+34     	; 0x1f814 <lcd_temp_cal_show_result(bool)+0x58>
		SERIAL_ECHOLNPGM("PINDA calibration done. Continue with pressing the knob.");
   1f7f2:	87 ed       	ldi	r24, 0xD7	; 215
   1f7f4:	92 e8       	ldi	r25, 0x82	; 130
   1f7f6:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
		lcd_show_fullscreen_message_and_wait_P(_T(MSG_PINDA_CALIBRATION_DONE));
   1f7fa:	83 e4       	ldi	r24, 0x43	; 67
   1f7fc:	9c e3       	ldi	r25, 0x3C	; 60
	} else {
		SERIAL_ECHOLNPGM("PINDA calibration failed. Continue with pressing the knob.");
		lcd_show_fullscreen_message_and_wait_P(_T(MSG_PINDA_CAL_FAILED));
   1f7fe:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1f802:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
	}
	lcd_update_enable(true);
   1f806:	81 e0       	ldi	r24, 0x01	; 1
   1f808:	0e 94 38 70 	call	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>
	lcd_update(2);
   1f80c:	82 e0       	ldi	r24, 0x02	; 2
}
   1f80e:	cf 91       	pop	r28
	} else {
		SERIAL_ECHOLNPGM("PINDA calibration failed. Continue with pressing the knob.");
		lcd_show_fullscreen_message_and_wait_P(_T(MSG_PINDA_CAL_FAILED));
	}
	lcd_update_enable(true);
	lcd_update(2);
   1f810:	0c 94 f9 6e 	jmp	0xddf2	; 0xddf2 <lcd_update(unsigned char)>

	if (result) {
		SERIAL_ECHOLNPGM("PINDA calibration done. Continue with pressing the knob.");
		lcd_show_fullscreen_message_and_wait_P(_T(MSG_PINDA_CALIBRATION_DONE));
	} else {
		SERIAL_ECHOLNPGM("PINDA calibration failed. Continue with pressing the knob.");
   1f814:	8c e9       	ldi	r24, 0x9C	; 156
   1f816:	92 e8       	ldi	r25, 0x82	; 130
   1f818:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
		lcd_show_fullscreen_message_and_wait_P(_T(MSG_PINDA_CAL_FAILED));
   1f81c:	88 e2       	ldi	r24, 0x28	; 40
   1f81e:	9c e3       	ldi	r25, 0x3C	; 60
   1f820:	ee cf       	rjmp	.-36     	; 0x1f7fe <lcd_temp_cal_show_result(bool)+0x42>

0001f822 <lcd_calibrate_z_end_stop_manual(bool)>:
// When done, it sets the current Z to Z_MAX_POS and returns true.
// Otherwise the Z calibration is not changed and false is returned.

#ifndef TMC2130
bool lcd_calibrate_z_end_stop_manual(bool only_z)
{
   1f822:	9f 92       	push	r9
   1f824:	af 92       	push	r10
   1f826:	bf 92       	push	r11
   1f828:	cf 92       	push	r12
   1f82a:	df 92       	push	r13
   1f82c:	ef 92       	push	r14
   1f82e:	ff 92       	push	r15
   1f830:	0f 93       	push	r16
   1f832:	1f 93       	push	r17
   1f834:	cf 93       	push	r28
   1f836:	df 93       	push	r29
   1f838:	98 2e       	mov	r9, r24
    // Don't know where we are. Let's claim we are Z=0, so the soft end stops will not be triggered when moving up.
    current_position[Z_AXIS] = 0;
   1f83a:	10 92 69 12 	sts	0x1269, r1	; 0x801269 <current_position+0x8>
   1f83e:	10 92 6a 12 	sts	0x126A, r1	; 0x80126a <current_position+0x9>
   1f842:	10 92 6b 12 	sts	0x126B, r1	; 0x80126b <current_position+0xa>
   1f846:	10 92 6c 12 	sts	0x126C, r1	; 0x80126c <current_position+0xb>
    plan_set_position_curposXYZE();
   1f84a:	0f 94 41 4b 	call	0x29682	; 0x29682 <plan_set_position_curposXYZE()>

    // Until confirmed by the confirmation dialog.
    for (;;) {
        const char *msg = only_z
            ? _T(MSG_MOVE_CARRIAGE_TO_THE_TOP_Z)
   1f84e:	87 ec       	ldi	r24, 0xC7	; 199
   1f850:	9b e3       	ldi	r25, 0x3B	; 59
   1f852:	91 10       	cpse	r9, r1
   1f854:	02 c0       	rjmp	.+4      	; 0x1f85a <lcd_calibrate_z_end_stop_manual(bool)+0x38>
   1f856:	84 e6       	ldi	r24, 0x64	; 100
   1f858:	9b e3       	ldi	r25, 0x3B	; 59
   1f85a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1f85e:	b8 2e       	mov	r11, r24
   1f860:	a9 2e       	mov	r10, r25
            : _T(MSG_MOVE_CARRIAGE_TO_THE_TOP);
        const char   *msg_next            = lcd_display_message_fullscreen_P(msg);
   1f862:	0e 94 a9 e0 	call	0x1c152	; 0x1c152 <lcd_display_message_fullscreen_P(char const*)>
   1f866:	8c 01       	movw	r16, r24
        const bool    multi_screen        = msg_next != NULL;
        unsigned long previous_millis_msg = _millis();
   1f868:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   1f86c:	6b 01       	movw	r12, r22
   1f86e:	7c 01       	movw	r14, r24
        // Until the user finishes the z up movement.
        lcd_encoder = 0;
   1f870:	10 92 1f 06 	sts	0x061F, r1	; 0x80061f <lcd_encoder+0x1>
   1f874:	10 92 1e 06 	sts	0x061E, r1	; 0x80061e <lcd_encoder>
    // Until confirmed by the confirmation dialog.
    for (;;) {
        const char *msg = only_z
            ? _T(MSG_MOVE_CARRIAGE_TO_THE_TOP_Z)
            : _T(MSG_MOVE_CARRIAGE_TO_THE_TOP);
        const char   *msg_next            = lcd_display_message_fullscreen_P(msg);
   1f878:	e8 01       	movw	r28, r16
        const bool    multi_screen        = msg_next != NULL;
        unsigned long previous_millis_msg = _millis();
        // Until the user finishes the z up movement.
        lcd_encoder = 0;
        for (;;) {
            manage_heater();
   1f87a:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
            manage_inactivity(true);
   1f87e:	81 e0       	ldi	r24, 0x01	; 1
   1f880:	0e 94 34 8c 	call	0x11868	; 0x11868 <manage_inactivity(bool)>
            if (lcd_encoder) {
   1f884:	80 91 1e 06 	lds	r24, 0x061E	; 0x80061e <lcd_encoder>
   1f888:	90 91 1f 06 	lds	r25, 0x061F	; 0x80061f <lcd_encoder+0x1>
   1f88c:	89 2b       	or	r24, r25
   1f88e:	d9 f1       	breq	.+118    	; 0x1f906 <lcd_calibrate_z_end_stop_manual(bool)+0xe4>
                _delay(50);
   1f890:	62 e3       	ldi	r22, 0x32	; 50
   1f892:	70 e0       	ldi	r23, 0x00	; 0
   1f894:	80 e0       	ldi	r24, 0x00	; 0
   1f896:	90 e0       	ldi	r25, 0x00	; 0
   1f898:	0f 94 bd 0d 	call	0x21b7a	; 0x21b7a <delay2>
FORCE_INLINE uint8_t moves_planned() {
    return (block_buffer_head + BLOCK_BUFFER_SIZE - block_buffer_tail) & (BLOCK_BUFFER_SIZE - 1);
}

FORCE_INLINE bool planner_queue_full() {
    uint8_t next_block_index = block_buffer_head;
   1f89c:	80 91 3e 0d 	lds	r24, 0x0D3E	; 0x800d3e <block_buffer_head>
    if (++ next_block_index == BLOCK_BUFFER_SIZE)
   1f8a0:	8f 5f       	subi	r24, 0xFF	; 255
   1f8a2:	80 31       	cpi	r24, 0x10	; 16
   1f8a4:	09 f4       	brne	.+2      	; 0x1f8a8 <lcd_calibrate_z_end_stop_manual(bool)+0x86>
        next_block_index = 0;
   1f8a6:	80 e0       	ldi	r24, 0x00	; 0
    return block_buffer_tail == next_block_index;
   1f8a8:	90 91 3f 0d 	lds	r25, 0x0D3F	; 0x800d3f <block_buffer_tail>
                if (! planner_queue_full()) {
   1f8ac:	98 17       	cp	r25, r24
   1f8ae:	59 f1       	breq	.+86     	; 0x1f906 <lcd_calibrate_z_end_stop_manual(bool)+0xe4>
                    // Only move up, whatever direction the user rotates the encoder.
                    current_position[Z_AXIS] += abs(lcd_encoder);
   1f8b0:	60 91 1e 06 	lds	r22, 0x061E	; 0x80061e <lcd_encoder>
   1f8b4:	70 91 1f 06 	lds	r23, 0x061F	; 0x80061f <lcd_encoder+0x1>
   1f8b8:	77 ff       	sbrs	r23, 7
   1f8ba:	03 c0       	rjmp	.+6      	; 0x1f8c2 <lcd_calibrate_z_end_stop_manual(bool)+0xa0>
   1f8bc:	71 95       	neg	r23
   1f8be:	61 95       	neg	r22
   1f8c0:	71 09       	sbc	r23, r1
   1f8c2:	07 2e       	mov	r0, r23
   1f8c4:	00 0c       	add	r0, r0
   1f8c6:	88 0b       	sbc	r24, r24
   1f8c8:	99 0b       	sbc	r25, r25
   1f8ca:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   1f8ce:	20 91 69 12 	lds	r18, 0x1269	; 0x801269 <current_position+0x8>
   1f8d2:	30 91 6a 12 	lds	r19, 0x126A	; 0x80126a <current_position+0x9>
   1f8d6:	40 91 6b 12 	lds	r20, 0x126B	; 0x80126b <current_position+0xa>
   1f8da:	50 91 6c 12 	lds	r21, 0x126C	; 0x80126c <current_position+0xb>
   1f8de:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   1f8e2:	60 93 69 12 	sts	0x1269, r22	; 0x801269 <current_position+0x8>
   1f8e6:	70 93 6a 12 	sts	0x126A, r23	; 0x80126a <current_position+0x9>
   1f8ea:	80 93 6b 12 	sts	0x126B, r24	; 0x80126b <current_position+0xa>
   1f8ee:	90 93 6c 12 	sts	0x126C, r25	; 0x80126c <current_position+0xb>
                    lcd_encoder = 0;
   1f8f2:	10 92 1f 06 	sts	0x061F, r1	; 0x80061f <lcd_encoder+0x1>
   1f8f6:	10 92 1e 06 	sts	0x061E, r1	; 0x80061e <lcd_encoder>
                    plan_buffer_line_curposXYZE(manual_feedrate[Z_AXIS] / 60);
   1f8fa:	65 e5       	ldi	r22, 0x55	; 85
   1f8fc:	75 e5       	ldi	r23, 0x55	; 85
   1f8fe:	85 e8       	ldi	r24, 0x85	; 133
   1f900:	91 e4       	ldi	r25, 0x41	; 65
   1f902:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
                }
            }
            if (lcd_clicked()) {
   1f906:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   1f90a:	88 23       	and	r24, r24
   1f90c:	c9 f1       	breq	.+114    	; 0x1f980 <lcd_calibrate_z_end_stop_manual(bool)+0x15e>
                // Abort a move if in progress.
                planner_abort_hard();
   1f90e:	0f 94 fb 4e 	call	0x29df6	; 0x29df6 <planner_abort_hard()>
                planner_aborted = false;
   1f912:	10 92 42 0d 	sts	0x0D42, r1	; 0x800d42 <planner_aborted>
                while (lcd_clicked()) ;
   1f916:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   1f91a:	81 11       	cpse	r24, r1
   1f91c:	fc cf       	rjmp	.-8      	; 0x1f916 <lcd_calibrate_z_end_stop_manual(bool)+0xf4>
                _delay(10);
   1f91e:	6a e0       	ldi	r22, 0x0A	; 10
   1f920:	70 e0       	ldi	r23, 0x00	; 0
   1f922:	80 e0       	ldi	r24, 0x00	; 0
   1f924:	90 e0       	ldi	r25, 0x00	; 0
   1f926:	0f 94 bd 0d 	call	0x21b7a	; 0x21b7a <delay2>
                while (lcd_clicked()) ;
   1f92a:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   1f92e:	81 11       	cpse	r24, r1
   1f930:	fc cf       	rjmp	.-8      	; 0x1f92a <lcd_calibrate_z_end_stop_manual(bool)+0x108>
                msg_next = lcd_display_message_fullscreen_P(msg_next);
                previous_millis_msg = _millis();
            }
        }
        // Let the user confirm, that the Z carriage is at the top end stoppers.
        uint8_t result = lcd_show_multiscreen_message_yes_no_and_wait_P(_T(MSG_CONFIRM_CARRIAGE_AT_THE_TOP), false);
   1f932:	8b e3       	ldi	r24, 0x3B	; 59
   1f934:	9b e3       	ldi	r25, 0x3B	; 59
   1f936:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1f93a:	41 e0       	ldi	r20, 0x01	; 1
   1f93c:	60 e0       	ldi	r22, 0x00	; 0
   1f93e:	0e 94 b2 e8 	call	0x1d164	; 0x1d164 <lcd_show_multiscreen_message_yes_no_and_wait_P(char const*, bool, unsigned char)>
        if (result == LCD_BUTTON_TIMEOUT)
   1f942:	8f 3f       	cpi	r24, 0xFF	; 255
   1f944:	d1 f1       	breq	.+116    	; 0x1f9ba <lcd_calibrate_z_end_stop_manual(bool)+0x198>
            goto canceled;
        else if (result == LCD_LEFT_BUTTON_CHOICE)
   1f946:	81 11       	cpse	r24, r1
   1f948:	82 cf       	rjmp	.-252    	; 0x1f84e <lcd_calibrate_z_end_stop_manual(bool)+0x2c>

calibrated:
    // Let the machine think the Z axis is a bit higher than it is, so it will not home into the bed
    // during the search for the induction points.
	if ((PRINTER_TYPE == PRINTER_MK25) || (PRINTER_TYPE == PRINTER_MK2) || (PRINTER_TYPE == PRINTER_MK2_SNMM)) {
		current_position[Z_AXIS] = Z_MAX_POS-3.f;
   1f94a:	80 e0       	ldi	r24, 0x00	; 0
   1f94c:	90 e0       	ldi	r25, 0x00	; 0
   1f94e:	af e4       	ldi	r26, 0x4F	; 79
   1f950:	b3 e4       	ldi	r27, 0x43	; 67
   1f952:	80 93 69 12 	sts	0x1269, r24	; 0x801269 <current_position+0x8>
   1f956:	90 93 6a 12 	sts	0x126A, r25	; 0x80126a <current_position+0x9>
   1f95a:	a0 93 6b 12 	sts	0x126B, r26	; 0x80126b <current_position+0xa>
   1f95e:	b0 93 6c 12 	sts	0x126C, r27	; 0x80126c <current_position+0xb>
	}
	else {
		current_position[Z_AXIS] = Z_MAX_POS+4.f;
	}
    plan_set_position_curposXYZE();
   1f962:	0f 94 41 4b 	call	0x29682	; 0x29682 <plan_set_position_curposXYZE()>
    return true;
   1f966:	81 e0       	ldi	r24, 0x01	; 1

canceled:
    return false;
}
   1f968:	df 91       	pop	r29
   1f96a:	cf 91       	pop	r28
   1f96c:	1f 91       	pop	r17
   1f96e:	0f 91       	pop	r16
   1f970:	ff 90       	pop	r15
   1f972:	ef 90       	pop	r14
   1f974:	df 90       	pop	r13
   1f976:	cf 90       	pop	r12
   1f978:	bf 90       	pop	r11
   1f97a:	af 90       	pop	r10
   1f97c:	9f 90       	pop	r9
   1f97e:	08 95       	ret
                while (lcd_clicked()) ;
                _delay(10);
                while (lcd_clicked()) ;
                break;
            }
            if (multi_screen && _millis() - previous_millis_msg > 5000) {
   1f980:	01 15       	cp	r16, r1
   1f982:	11 05       	cpc	r17, r1
   1f984:	09 f4       	brne	.+2      	; 0x1f988 <lcd_calibrate_z_end_stop_manual(bool)+0x166>
   1f986:	79 cf       	rjmp	.-270    	; 0x1f87a <lcd_calibrate_z_end_stop_manual(bool)+0x58>
   1f988:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   1f98c:	6c 19       	sub	r22, r12
   1f98e:	7d 09       	sbc	r23, r13
   1f990:	8e 09       	sbc	r24, r14
   1f992:	9f 09       	sbc	r25, r15
   1f994:	69 38       	cpi	r22, 0x89	; 137
   1f996:	73 41       	sbci	r23, 0x13	; 19
   1f998:	81 05       	cpc	r24, r1
   1f99a:	91 05       	cpc	r25, r1
   1f99c:	08 f4       	brcc	.+2      	; 0x1f9a0 <lcd_calibrate_z_end_stop_manual(bool)+0x17e>
   1f99e:	6d cf       	rjmp	.-294    	; 0x1f87a <lcd_calibrate_z_end_stop_manual(bool)+0x58>
                if (msg_next == NULL)
   1f9a0:	20 97       	sbiw	r28, 0x00	; 0
   1f9a2:	11 f4       	brne	.+4      	; 0x1f9a8 <lcd_calibrate_z_end_stop_manual(bool)+0x186>
                    msg_next = msg;
   1f9a4:	cb 2d       	mov	r28, r11
   1f9a6:	da 2d       	mov	r29, r10
                msg_next = lcd_display_message_fullscreen_P(msg_next);
   1f9a8:	ce 01       	movw	r24, r28
   1f9aa:	0e 94 a9 e0 	call	0x1c152	; 0x1c152 <lcd_display_message_fullscreen_P(char const*)>
   1f9ae:	ec 01       	movw	r28, r24
                previous_millis_msg = _millis();
   1f9b0:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   1f9b4:	6b 01       	movw	r12, r22
   1f9b6:	7c 01       	movw	r14, r24
   1f9b8:	60 cf       	rjmp	.-320    	; 0x1f87a <lcd_calibrate_z_end_stop_manual(bool)+0x58>
	}
    plan_set_position_curposXYZE();
    return true;

canceled:
    return false;
   1f9ba:	80 e0       	ldi	r24, 0x00	; 0
   1f9bc:	d5 cf       	rjmp	.-86     	; 0x1f968 <lcd_calibrate_z_end_stop_manual(bool)+0x146>

0001f9be <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]>:
        }
    }
    return false; // couldn't accomplish the task
}

void MMU2::ToolChangeCommon(uint8_t slot) {
   1f9be:	2f 92       	push	r2
   1f9c0:	3f 92       	push	r3
   1f9c2:	4f 92       	push	r4
   1f9c4:	5f 92       	push	r5
   1f9c6:	6f 92       	push	r6
   1f9c8:	7f 92       	push	r7
   1f9ca:	8f 92       	push	r8
   1f9cc:	9f 92       	push	r9
   1f9ce:	af 92       	push	r10
   1f9d0:	bf 92       	push	r11
   1f9d2:	cf 92       	push	r12
   1f9d4:	df 92       	push	r13
   1f9d6:	ef 92       	push	r14
   1f9d8:	ff 92       	push	r15
   1f9da:	0f 93       	push	r16
   1f9dc:	1f 93       	push	r17
   1f9de:	cf 93       	push	r28
   1f9e0:	df 93       	push	r29
   1f9e2:	cd b7       	in	r28, 0x3d	; 61
   1f9e4:	de b7       	in	r29, 0x3e	; 62
   1f9e6:	67 97       	sbiw	r28, 0x17	; 23
   1f9e8:	0f b6       	in	r0, 0x3f	; 63
   1f9ea:	f8 94       	cli
   1f9ec:	de bf       	out	0x3e, r29	; 62
   1f9ee:	0f be       	out	0x3f, r0	; 63
   1f9f0:	cd bf       	out	0x3d, r28	; 61
   1f9f2:	08 2f       	mov	r16, r24
   1f9f4:	ce 01       	movw	r24, r28
   1f9f6:	46 96       	adiw	r24, 0x16	; 22
   1f9f8:	9f 8b       	std	Y+23, r25	; 0x17
   1f9fa:	8e 8b       	std	Y+22, r24	; 0x16
   1f9fc:	83 e0       	ldi	r24, 0x03	; 3
   1f9fe:	f8 2e       	mov	r15, r24
    lcd_draw_update = 1; // force redraw
}

void lcd_clearstatus()
{
    memset(lcd_status_message, 0, sizeof(lcd_status_message));
   1fa00:	95 e1       	ldi	r25, 0x15	; 21
   1fa02:	29 2e       	mov	r2, r25

bool MMU2::ToolChangeCommonOnce(uint8_t slot) {
    static_assert(MAX_RETRIES > 1); // need >1 retries to do the cut in the last attempt
    for (uint8_t retries = MAX_RETRIES; retries; --retries) {
        for (;;) {
            Disable_E0(); // it may seem counterintuitive to disable the E-motor, but it gets enabled in the planner whenever the E-motor is to move
   1fa04:	0f 94 d4 50 	call	0x2a1a8	; 0x2a1a8 <MMU2::Disable_E0()>
            tool_change_extruder = slot;
   1fa08:	00 93 e9 12 	sts	0x12E9, r16	; 0x8012e9 <MMU2::mmu2+0x57>
    state = State::Stopped;
    currentScope = Scope::Stopped;
}

void ProtocolLogic::ToolChange(uint8_t slot) {
    PlanGenericRequest(RequestMsg(RequestMsgCodes::Tool, slot));
   1fa0c:	40 2f       	mov	r20, r16
   1fa0e:	64 e5       	ldi	r22, 0x54	; 84
   1fa10:	ce 01       	movw	r24, r28
   1fa12:	01 96       	adiw	r24, 0x01	; 1
   1fa14:	0f 94 c7 50 	call	0x2a18e	; 0x2a18e <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   1fa18:	49 81       	ldd	r20, Y+1	; 0x01
   1fa1a:	5a 81       	ldd	r21, Y+2	; 0x02
   1fa1c:	6b 81       	ldd	r22, Y+3	; 0x03
   1fa1e:	7c 81       	ldd	r23, Y+4	; 0x04
   1fa20:	8d 81       	ldd	r24, Y+5	; 0x05
   1fa22:	0f 94 19 95 	call	0x32a32	; 0x32a32 <MMU2::ProtocolLogic::PlanGenericRequest(modules::protocol::RequestMsg) [clone .constprop.327]>
            logic.ToolChange(slot); // let the MMU pull the filament out and push a new one in
            if (manage_response(true, true)) {
   1fa26:	61 e0       	ldi	r22, 0x01	; 1
   1fa28:	81 e0       	ldi	r24, 0x01	; 1
   1fa2a:	0f 94 aa 9c 	call	0x33954	; 0x33954 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]>
   1fa2e:	18 2f       	mov	r17, r24
   1fa30:	81 11       	cpse	r24, r1
   1fa32:	07 c0       	rjmp	.+14     	; 0x1fa42 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0x84>
                break;
            }
            // otherwise: failed to perform the command - unload first and then let it run again
            IncrementMMUFails();
   1fa34:	0f 94 28 50 	call	0x2a050	; 0x2a050 <MMU2::IncrementMMUFails()>

            // just in case we stood in an error screen for too long and the hotend got cold
            ResumeHotendTemp();
   1fa38:	0f 94 48 9c 	call	0x33890	; 0x33890 <MMU2::MMU2::ResumeHotendTemp() [clone .constprop.180]>
            // if the extruder has been parked, it will get unparked once the ToolChange command finishes OK
            // - so no ResumeUnpark() at this spot

            UnloadInner();
   1fa3c:	0f 94 38 9d 	call	0x33a70	; 0x33a70 <MMU2::MMU2::UnloadInner() [clone .constprop.109]>
   1fa40:	e1 cf       	rjmp	.-62     	; 0x1fa04 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0x46>
bool planner_draining() {
    return planner_aborted;
}

void planner_synchronize() {
    st_synchronize();
   1fa42:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
}

bool MMU2::VerifyFilamentEnteredPTFE() {
    planner_synchronize();

    if (WhereIsFilament() != FilamentState::AT_FSENSOR)
   1fa46:	0f 94 0a 51 	call	0x2a214	; 0x2a214 <MMU2::WhereIsFilament()>
   1fa4a:	81 30       	cpi	r24, 0x01	; 1
   1fa4c:	79 f1       	breq	.+94     	; 0x1faac <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0xee>
            // something else is seriously broken and stopping a print is probably our best option.
        }
        if (VerifyFilamentEnteredPTFE()) {
            return true; // success
        } else { // Prepare a retry attempt
            UnloadInner();
   1fa4e:	0f 94 38 9d 	call	0x33a70	; 0x33a70 <MMU2::MMU2::UnloadInner() [clone .constprop.109]>
            if (retries == 2 && cutter_enabled()) {
   1fa52:	92 e0       	ldi	r25, 0x02	; 2
   1fa54:	f9 12       	cpse	r15, r25
   1fa56:	09 c0       	rjmp	.+18     	; 0x1fa6a <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0xac>
    eeprom_increment_byte((uint8_t *)EEPROM_MMU_FAIL);
    eeprom_increment_word((uint16_t *)EEPROM_MMU_FAIL_TOT);
}

bool cutter_enabled(){
    return eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED) == EEPROM_MMU_CUTTER_ENABLED_enabled;
   1fa58:	8e ec       	ldi	r24, 0xCE	; 206
   1fa5a:	9e e0       	ldi	r25, 0x0E	; 14
   1fa5c:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   1fa60:	81 30       	cpi	r24, 0x01	; 1
   1fa62:	19 f4       	brne	.+6      	; 0x1fa6a <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0xac>
                CutFilamentInner(slot); // try cutting filament tip at the last attempt
   1fa64:	80 2f       	mov	r24, r16
   1fa66:	0f 94 1f 9e 	call	0x33c3e	; 0x33c3e <MMU2::MMU2::CutFilamentInner(unsigned char) [clone .constprop.97]>
   1fa6a:	fa 94       	dec	r15
    return filament_inserted;
}

bool MMU2::ToolChangeCommonOnce(uint8_t slot) {
    static_assert(MAX_RETRIES > 1); // need >1 retries to do the cut in the last attempt
    for (uint8_t retries = MAX_RETRIES; retries; --retries) {
   1fa6c:	f1 10       	cpse	r15, r1
   1fa6e:	ca cf       	rjmp	.-108    	; 0x1fa04 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0x46>
    return false; // couldn't accomplish the task
}

void MMU2::ToolChangeCommon(uint8_t slot) {
    while (!ToolChangeCommonOnce(slot)) { // while not successfully fed into extruder's PTFE tube
        if (planner_draining()) {
   1fa70:	80 91 42 0d 	lds	r24, 0x0D42	; 0x800d42 <planner_aborted>
   1fa74:	88 23       	and	r24, r24
   1fa76:	09 f4       	brne	.+2      	; 0x1fa7a <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0xbc>
   1fa78:	ef c0       	rjmp	.+478    	; 0x1fc58 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0x29a>

    SetCurrentTool(slot); // filament change is finished
    SpoolJoin::spooljoin.setSlot(slot);

    ++toolchange_counter;
}
   1fa7a:	67 96       	adiw	r28, 0x17	; 23
   1fa7c:	0f b6       	in	r0, 0x3f	; 63
   1fa7e:	f8 94       	cli
   1fa80:	de bf       	out	0x3e, r29	; 62
   1fa82:	0f be       	out	0x3f, r0	; 63
   1fa84:	cd bf       	out	0x3d, r28	; 61
   1fa86:	df 91       	pop	r29
   1fa88:	cf 91       	pop	r28
   1fa8a:	1f 91       	pop	r17
   1fa8c:	0f 91       	pop	r16
   1fa8e:	ff 90       	pop	r15
   1fa90:	ef 90       	pop	r14
   1fa92:	df 90       	pop	r13
   1fa94:	cf 90       	pop	r12
   1fa96:	bf 90       	pop	r11
   1fa98:	af 90       	pop	r10
   1fa9a:	9f 90       	pop	r9
   1fa9c:	8f 90       	pop	r8
   1fa9e:	7f 90       	pop	r7
   1faa0:	6f 90       	pop	r6
   1faa2:	5f 90       	pop	r5
   1faa4:	4f 90       	pop	r4
   1faa6:	3f 90       	pop	r3
   1faa8:	2f 90       	pop	r2
   1faaa:	08 95       	ret
    if (WhereIsFilament() != FilamentState::AT_FSENSOR)
        return false;

    // MMU has finished its load, push the filament further by some defined constant length
    // If the filament sensor reads 0 at any moment, then report FAILURE
    const float tryload_length = MMU2_CHECK_FILAMENT_PRESENCE_EXTRUSION_LENGTH - logic.ExtraLoadDistance();
   1faac:	60 91 de 12 	lds	r22, 0x12DE	; 0x8012de <MMU2::mmu2+0x4c>
   1fab0:	70 e0       	ldi	r23, 0x00	; 0
   1fab2:	90 e0       	ldi	r25, 0x00	; 0
   1fab4:	80 e0       	ldi	r24, 0x00	; 0
   1fab6:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   1faba:	9b 01       	movw	r18, r22
   1fabc:	ac 01       	movw	r20, r24
   1fabe:	66 e6       	ldi	r22, 0x66	; 102
   1fac0:	76 e6       	ldi	r23, 0x66	; 102
   1fac2:	8d e9       	ldi	r24, 0x9D	; 157
   1fac4:	92 e4       	ldi	r25, 0x42	; 66
   1fac6:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   1faca:	36 2e       	mov	r3, r22
   1facc:	87 2e       	mov	r8, r23
   1face:	98 2e       	mov	r9, r24
   1fad0:	e9 2e       	mov	r14, r25

TryLoadUnloadReporter::TryLoadUnloadReporter(float delta_mm)
: dpixel0(0)
, dpixel1(0)
, lcd_cursor_col(0)
, pixel_per_mm(0.5F * float(LCD_WIDTH) / (delta_mm))
   1fad2:	26 2f       	mov	r18, r22
   1fad4:	37 2f       	mov	r19, r23
   1fad6:	48 2f       	mov	r20, r24
   1fad8:	59 2f       	mov	r21, r25
   1fada:	60 e0       	ldi	r22, 0x00	; 0
   1fadc:	70 e0       	ldi	r23, 0x00	; 0
   1fade:	80 e2       	ldi	r24, 0x20	; 32
   1fae0:	91 e4       	ldi	r25, 0x41	; 65
   1fae2:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   1fae6:	2b 01       	movw	r4, r22
   1fae8:	3c 01       	movw	r6, r24
   1faea:	e5 e6       	ldi	r30, 0x65	; 101
   1faec:	f4 e0       	ldi	r31, 0x04	; 4
   1faee:	82 2d       	mov	r24, r2
   1faf0:	11 92       	st	Z+, r1
   1faf2:	8a 95       	dec	r24
   1faf4:	e9 f7       	brne	.-6      	; 0x1faf0 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0x132>
    lcd_status_message_idx = 0;
   1faf6:	10 92 64 04 	sts	0x0464, r1	; 0x800464 <_ZL22lcd_status_message_idx.lto_priv.419>
    bool filament_inserted = true; // expect success
    // Pixel index will go from 0 to 10, then back from 10 to 0
    // The change in this number is used to indicate a new pixel
    // should be drawn on the display
    for (uint8_t move = 0; move < 2; move++) {
        extruder_move(move == 0 ? tryload_length : -tryload_length, MMU2_VERIFY_LOAD_TO_NOZZLE_FEED_RATE);
   1fafa:	83 2d       	mov	r24, r3
   1fafc:	98 2d       	mov	r25, r8
   1fafe:	a9 2d       	mov	r26, r9
   1fb00:	be 2d       	mov	r27, r14
   1fb02:	bc 01       	movw	r22, r24
   1fb04:	cd 01       	movw	r24, r26

    bool filament_inserted = true; // expect success
    // Pixel index will go from 0 to 10, then back from 10 to 0
    // The change in this number is used to indicate a new pixel
    // should be drawn on the display
    for (uint8_t move = 0; move < 2; move++) {
   1fb06:	91 2c       	mov	r9, r1
   1fb08:	31 2c       	mov	r3, r1
   1fb0a:	e1 2c       	mov	r14, r1
        extruder_move(move == 0 ? tryload_length : -tryload_length, MMU2_VERIFY_LOAD_TO_NOZZLE_FEED_RATE);
   1fb0c:	5b 01       	movw	r10, r22
   1fb0e:	6c 01       	movw	r12, r24
   1fb10:	d7 fa       	bst	r13, 7
   1fb12:	d0 94       	com	r13
   1fb14:	d7 f8       	bld	r13, 7
   1fb16:	d0 94       	com	r13
   1fb18:	20 e0       	ldi	r18, 0x00	; 0
   1fb1a:	30 e0       	ldi	r19, 0x00	; 0
   1fb1c:	48 e4       	ldi	r20, 0x48	; 72
   1fb1e:	52 e4       	ldi	r21, 0x42	; 66
   1fb20:	0f 94 d6 50 	call	0x2a1ac	; 0x2a1ac <MMU2::extruder_move(float, float)>
  return(block);
}

// Returns true if the buffer has a queued block, false otherwise
FORCE_INLINE bool blocks_queued() {
	return (block_buffer_head != block_buffer_tail);
   1fb24:	90 91 3e 0d 	lds	r25, 0x0D3E	; 0x800d3e <block_buffer_head>
   1fb28:	80 91 3f 0d 	lds	r24, 0x0D3F	; 0x800d3f <block_buffer_tail>
        while (planner_any_moves()) {
   1fb2c:	98 17       	cp	r25, r24
   1fb2e:	09 f4       	brne	.+2      	; 0x1fb32 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0x174>
   1fb30:	49 c0       	rjmp	.+146    	; 0x1fbc4 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0x206>
            filament_inserted = filament_inserted && (WhereIsFilament() == FilamentState::AT_FSENSOR);
   1fb32:	11 23       	and	r17, r17
   1fb34:	31 f0       	breq	.+12     	; 0x1fb42 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0x184>
   1fb36:	0f 94 0a 51 	call	0x2a214	; 0x2a214 <MMU2::WhereIsFilament()>
   1fb3a:	11 e0       	ldi	r17, 0x01	; 1
   1fb3c:	81 30       	cpi	r24, 0x01	; 1
   1fb3e:	09 f0       	breq	.+2      	; 0x1fb42 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0x184>
   1fb40:	10 e0       	ldi	r17, 0x00	; 0
float planner_get_machine_position_E_mm() {
    return current_position[E_AXIS];
}

float stepper_get_machine_position_E_mm() {
    return st_get_position_mm(E_AXIS);
   1fb42:	83 e0       	ldi	r24, 0x03	; 3
   1fb44:	0f 94 e7 1a 	call	0x235ce	; 0x235ce <st_get_position_mm(unsigned char)>
    if (!lcd_update_enabled) lcdui_print_status_line();
}

void TryLoadUnloadReporter::Progress(bool sensorState){
    // Always round up, you can only have 'whole' pixels. (floor is also an option)
    dpixel1 = ceil((stepper_get_machine_position_E_mm() - planner_get_current_position_E()) * pixel_per_mm);
   1fb48:	20 91 6d 12 	lds	r18, 0x126D	; 0x80126d <current_position+0xc>
   1fb4c:	30 91 6e 12 	lds	r19, 0x126E	; 0x80126e <current_position+0xd>
   1fb50:	40 91 6f 12 	lds	r20, 0x126F	; 0x80126f <current_position+0xe>
   1fb54:	50 91 70 12 	lds	r21, 0x1270	; 0x801270 <current_position+0xf>
   1fb58:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   1fb5c:	a3 01       	movw	r20, r6
   1fb5e:	92 01       	movw	r18, r4
   1fb60:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   1fb64:	0f 94 e6 a5 	call	0x34bcc	; 0x34bcc <ceil>
   1fb68:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   1fb6c:	86 2e       	mov	r8, r22
    if (dpixel1 - dpixel0) {
   1fb6e:	e6 16       	cp	r14, r22
   1fb70:	c1 f0       	breq	.+48     	; 0x1fba2 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0x1e4>
   1fb72:	e3 2d       	mov	r30, r3
   1fb74:	e4 31       	cpi	r30, 0x14	; 20
   1fb76:	08 f0       	brcs	.+2      	; 0x1fb7a <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0x1bc>
   1fb78:	e3 e1       	ldi	r30, 0x13	; 19
        dpixel0 = dpixel1;
        if (lcd_cursor_col > (LCD_WIDTH - 1)) lcd_cursor_col = LCD_WIDTH - 1;
        Render(lcd_cursor_col++, sensorState);
   1fb7a:	33 24       	eor	r3, r3
   1fb7c:	33 94       	inc	r3
   1fb7e:	3e 0e       	add	r3, r30
}

void TryLoadUnloadReporter::Render(uint8_t col, bool sensorState) {
    // Set the cursor position each time in case some other
    // part of the firmware changes the cursor position
    lcd_insert_char_into_status(col, sensorState ? LCD_STR_SOLID_BLOCK[0] : '-');
   1fb80:	8f ef       	ldi	r24, 0xFF	; 255
   1fb82:	11 11       	cpse	r17, r1
   1fb84:	01 c0       	rjmp	.+2      	; 0x1fb88 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0x1ca>
   1fb86:	8d e2       	ldi	r24, 0x2D	; 45
}

void lcd_insert_char_into_status(uint8_t position, const char message)
{
    if (position > LCD_WIDTH - 1) return;
    lcd_status_message[position] = message;
   1fb88:	f0 e0       	ldi	r31, 0x00	; 0
   1fb8a:	eb 59       	subi	r30, 0x9B	; 155
   1fb8c:	fb 4f       	sbci	r31, 0xFB	; 251
   1fb8e:	80 83       	st	Z, r24
    lcd_draw_update = 1; // force redraw
   1fb90:	91 e0       	ldi	r25, 0x01	; 1
   1fb92:	90 93 59 02 	sts	0x0259, r25	; 0x800259 <lcd_draw_update>
    if (!lcd_update_enabled) lcdui_print_status_line();
   1fb96:	80 91 5a 02 	lds	r24, 0x025A	; 0x80025a <lcd_update_enabled>
   1fb9a:	81 11       	cpse	r24, r1
   1fb9c:	02 c0       	rjmp	.+4      	; 0x1fba2 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0x1e4>
   1fb9e:	0f 94 cb 0e 	call	0x21d96	; 0x21d96 <lcdui_print_status_line()>
void thermal_setTargetHotend(int16_t t) {
    setTargetHotend(t);
}

void safe_delay_keep_alive(uint16_t t) {
    delay_keep_alive(t);
   1fba2:	90 e0       	ldi	r25, 0x00	; 0
   1fba4:	80 e0       	ldi	r24, 0x00	; 0
   1fba6:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
}

void TryLoadUnloadReporter::Progress(bool sensorState){
    // Always round up, you can only have 'whole' pixels. (floor is also an option)
    dpixel1 = ceil((stepper_get_machine_position_E_mm() - planner_get_current_position_E()) * pixel_per_mm);
   1fbaa:	e8 2c       	mov	r14, r8
            tlur.Progress(filament_inserted);
            safe_delay_keep_alive(0);
            if (planner_draining()) {
   1fbac:	80 91 42 0d 	lds	r24, 0x0D42	; 0x800d42 <planner_aborted>
   1fbb0:	88 23       	and	r24, r24
   1fbb2:	09 f4       	brne	.+2      	; 0x1fbb6 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0x1f8>
   1fbb4:	b7 cf       	rjmp	.-146    	; 0x1fb24 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0x166>
                return false; // power panic or a similar issue happened, bail out fast
   1fbb6:	10 e0       	ldi	r17, 0x00	; 0
   1fbb8:	37 c0       	rjmp	.+110    	; 0x1fc28 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0x26a>
    bool filament_inserted = true; // expect success
    // Pixel index will go from 0 to 10, then back from 10 to 0
    // The change in this number is used to indicate a new pixel
    // should be drawn on the display
    for (uint8_t move = 0; move < 2; move++) {
        extruder_move(move == 0 ? tryload_length : -tryload_length, MMU2_VERIFY_LOAD_TO_NOZZLE_FEED_RATE);
   1fbba:	c6 01       	movw	r24, r12
   1fbbc:	b5 01       	movw	r22, r10
   1fbbe:	99 24       	eor	r9, r9
   1fbc0:	93 94       	inc	r9
   1fbc2:	aa cf       	rjmp	.-172    	; 0x1fb18 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0x15a>

    bool filament_inserted = true; // expect success
    // Pixel index will go from 0 to 10, then back from 10 to 0
    // The change in this number is used to indicate a new pixel
    // should be drawn on the display
    for (uint8_t move = 0; move < 2; move++) {
   1fbc4:	91 e0       	ldi	r25, 0x01	; 1
   1fbc6:	99 12       	cpse	r9, r25
   1fbc8:	f8 cf       	rjmp	.-16     	; 0x1fbba <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0x1fc>
                return false; // power panic or a similar issue happened, bail out fast
            }
        }
    }

    Disable_E0();
   1fbca:	0f 94 d4 50 	call	0x2a1a8	; 0x2a1a8 <MMU2::Disable_E0()>
    if (!filament_inserted) {
   1fbce:	11 11       	cpse	r17, r1
   1fbd0:	08 c0       	rjmp	.+16     	; 0x1fbe2 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0x224>
    eeprom_update_byte_notify((uint8_t *)EEPROM_MMU_ENABLED, false);
    mmu2.Status();
}

void IncrementLoadFails(){
    eeprom_increment_byte((uint8_t *)EEPROM_MMU_LOAD_FAIL);
   1fbd2:	8f ec       	ldi	r24, 0xCF	; 207
   1fbd4:	9e e0       	ldi	r25, 0x0E	; 14
   1fbd6:	0e 94 7c 78 	call	0xf0f8	; 0xf0f8 <eeprom_increment_byte(unsigned char*)>
    eeprom_increment_word((uint16_t *)EEPROM_MMU_LOAD_FAIL_TOT);
   1fbda:	80 ed       	ldi	r24, 0xD0	; 208
   1fbdc:	9e e0       	ldi	r25, 0x0E	; 14
   1fbde:	0e 94 6f 78 	call	0xf0de	; 0xf0de <eeprom_increment_word(unsigned int*)>
    memset(lcd_status_message, 0, sizeof(lcd_status_message));
    lcd_status_message_idx = 0;
}

void lcd_getstatus(char buf[LCD_WIDTH]) {
    strncpy(buf, lcd_status_message, LCD_WIDTH);
   1fbe2:	44 e1       	ldi	r20, 0x14	; 20
   1fbe4:	50 e0       	ldi	r21, 0x00	; 0
   1fbe6:	65 e6       	ldi	r22, 0x65	; 101
   1fbe8:	74 e0       	ldi	r23, 0x04	; 4
   1fbea:	ce 01       	movw	r24, r28
   1fbec:	01 96       	adiw	r24, 0x01	; 1
   1fbee:	0f 94 60 aa 	call	0x354c0	; 0x354c0 <strncpy>
   1fbf2:	fe 01       	movw	r30, r28
   1fbf4:	31 96       	adiw	r30, 0x01	; 1
    char buf[LCD_WIDTH + 1];
    lcd_getstatus(buf);
    for (uint8_t i = 0; i < sizeof(buf); i++) {
        // 0xFF is -1 when converting from unsigned to signed char
        // If the number is negative, that means filament is present
        buf[i] = (buf[i] < 0) ? '1' : '0';
   1fbf6:	81 91       	ld	r24, Z+
   1fbf8:	87 fd       	sbrc	r24, 7
   1fbfa:	2c c0       	rjmp	.+88     	; 0x1fc54 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0x296>
   1fbfc:	80 e3       	ldi	r24, 0x30	; 48
   1fbfe:	df 01       	movw	r26, r30
   1fc00:	11 97       	sbiw	r26, 0x01	; 1
   1fc02:	8c 93       	st	X, r24
}

void TryLoadUnloadReporter::DumpToSerial(){
    char buf[LCD_WIDTH + 1];
    lcd_getstatus(buf);
    for (uint8_t i = 0; i < sizeof(buf); i++) {
   1fc04:	8e 89       	ldd	r24, Y+22	; 0x16
   1fc06:	9f 89       	ldd	r25, Y+23	; 0x17
   1fc08:	8e 17       	cp	r24, r30
   1fc0a:	9f 07       	cpc	r25, r31
   1fc0c:	a1 f7       	brne	.-24     	; 0x1fbf6 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0x238>
        // 0xFF is -1 when converting from unsigned to signed char
        // If the number is negative, that means filament is present
        buf[i] = (buf[i] < 0) ? '1' : '0';
    }
    buf[LCD_WIDTH] = 0;
   1fc0e:	1d 8a       	std	Y+21, r1	; 0x15
    MMU2_ECHO_MSGLN(buf);
   1fc10:	8e ec       	ldi	r24, 0xCE	; 206
   1fc12:	91 ea       	ldi	r25, 0xA1	; 161
   1fc14:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   1fc18:	80 ea       	ldi	r24, 0xA0	; 160
   1fc1a:	97 e8       	ldi	r25, 0x87	; 135
   1fc1c:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   1fc20:	ce 01       	movw	r24, r28
   1fc22:	01 96       	adiw	r24, 0x01	; 1
   1fc24:	0e 94 a1 87 	call	0x10f42	; 0x10f42 <MarlinSerial::println(char const*)>
    SERIAL_ECHOLN(message);
}

void lcd_reset_status_message_timeout()
{
    lcd_status_message_timeout.start();
   1fc28:	8a e7       	ldi	r24, 0x7A	; 122
   1fc2a:	94 e0       	ldi	r25, 0x04	; 4
   1fc2c:	0f 94 47 10 	call	0x2208e	; 0x2208e <Timer<unsigned long>::start()>
            UnloadInner();
            // if we run out of retries, we must do something ... may be raise an error screen and allow the user to do something
            // but honestly - if the MMU restarts during every toolchange,
            // something else is seriously broken and stopping a print is probably our best option.
        }
        if (VerifyFilamentEnteredPTFE()) {
   1fc30:	11 23       	and	r17, r17
   1fc32:	09 f4       	brne	.+2      	; 0x1fc36 <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0x278>
   1fc34:	0c cf       	rjmp	.-488    	; 0x1fa4e <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0x90>
        // If manage_response returns false at this spot (MMU operation interrupted aka MMU reset)
        // we can safely continue because the MMU is not doing an operation now.
        static_cast<void>(manage_response(true, true)); // yes, I'd like to silence [[nodiscard]] warning at this spot by casting to void
    }

    SetCurrentTool(slot); // filament change is finished
   1fc36:	80 2f       	mov	r24, r16
   1fc38:	0f 94 c7 65 	call	0x2cb8e	; 0x2cb8e <MMU2::MMU2::SetCurrentTool(unsigned char) [clone .constprop.318]>
    }
}

void SpoolJoin::setSlot(uint8_t slot)
{
    currentMMUSlot = slot;
   1fc3c:	00 93 90 12 	sts	0x1290, r16	; 0x801290 <SpoolJoin::spooljoin>
    SpoolJoin::spooljoin.setSlot(slot);

    ++toolchange_counter;
   1fc40:	80 91 05 13 	lds	r24, 0x1305	; 0x801305 <MMU2::mmu2+0x73>
   1fc44:	90 91 06 13 	lds	r25, 0x1306	; 0x801306 <MMU2::mmu2+0x74>
   1fc48:	01 96       	adiw	r24, 0x01	; 1
   1fc4a:	90 93 06 13 	sts	0x1306, r25	; 0x801306 <MMU2::mmu2+0x74>
   1fc4e:	80 93 05 13 	sts	0x1305, r24	; 0x801305 <MMU2::mmu2+0x73>
   1fc52:	13 cf       	rjmp	.-474    	; 0x1fa7a <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0xbc>
    char buf[LCD_WIDTH + 1];
    lcd_getstatus(buf);
    for (uint8_t i = 0; i < sizeof(buf); i++) {
        // 0xFF is -1 when converting from unsigned to signed char
        // If the number is negative, that means filament is present
        buf[i] = (buf[i] < 0) ? '1' : '0';
   1fc54:	81 e3       	ldi	r24, 0x31	; 49
   1fc56:	d3 cf       	rjmp	.-90     	; 0x1fbfe <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0x240>
    void SetInAutoRetry(bool iar) {
        inAutoRetry = iar;
    }

    inline void SetPrinterError(ErrorCode ec) {
        explicitPrinterError = ec;
   1fc58:	8a e2       	ldi	r24, 0x2A	; 42
   1fc5a:	90 e8       	ldi	r25, 0x80	; 128
   1fc5c:	90 93 93 12 	sts	0x1293, r25	; 0x801293 <MMU2::mmu2+0x1>
   1fc60:	80 93 92 12 	sts	0x1292, r24	; 0x801292 <MMU2::mmu2>
        logic.SetPrinterError(ErrorCode::LOAD_TO_EXTRUDER_FAILED);
        // We only have to wait for the user to fix the issue and press "Retry".
        // Please see CheckUserInput() for details how we "leave" manage_response.
        // If manage_response returns false at this spot (MMU operation interrupted aka MMU reset)
        // we can safely continue because the MMU is not doing an operation now.
        static_cast<void>(manage_response(true, true)); // yes, I'd like to silence [[nodiscard]] warning at this spot by casting to void
   1fc64:	61 e0       	ldi	r22, 0x01	; 1
   1fc66:	81 e0       	ldi	r24, 0x01	; 1
   1fc68:	0f 94 aa 9c 	call	0x33954	; 0x33954 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]>
   1fc6c:	c7 ce       	rjmp	.-626    	; 0x1f9fc <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]+0x3e>

0001fc6e <MMU2::MMU2::load_filament_to_nozzle(unsigned char) [clone .constprop.39]>:
    }
    ScreenUpdateEnable();
    return true;
}

bool MMU2::load_filament_to_nozzle(uint8_t slot) {
   1fc6e:	cf 93       	push	r28
   1fc70:	df 93       	push	r29
   1fc72:	d8 2f       	mov	r29, r24
    if (!WaitForMMUReady()) {
   1fc74:	0f 94 a6 79 	call	0x2f34c	; 0x2f34c <MMU2::MMU2::WaitForMMUReady() [clone .constprop.106]>
   1fc78:	c8 2f       	mov	r28, r24
   1fc7a:	88 23       	and	r24, r24
   1fc7c:	49 f1       	breq	.+82     	; 0x1fcd0 <MMU2::MMU2::load_filament_to_nozzle(unsigned char) [clone .constprop.39]+0x62>
        safe_delay_keep_alive(delay);
    }
}

void WaitForHotendTargetTempBeep() {
    waitForHotendTargetTemp(200, [] {});
   1fc7e:	88 ec       	ldi	r24, 0xC8	; 200
   1fc80:	90 e0       	ldi	r25, 0x00	; 0
   1fc82:	0f 94 58 54 	call	0x2a8b0	; 0x2a8b0 <void MMU2::waitForHotendTargetTemp<MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}>(unsigned int, MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}) [clone .isra.0] [clone .lto_priv.374]>
bool cutter_enabled(){
    return eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED) == EEPROM_MMU_CUTTER_ENABLED_enabled;
}

void MakeSound(SoundType s){
    Sound_MakeSound( (eSOUND_TYPE)s);
   1fc86:	82 e0       	ldi	r24, 0x02	; 2
   1fc88:	0f 94 ad 25 	call	0x24b5a	; 0x24b5a <Sound_MakeSound(eSOUND_TYPE)>
void FullScreenMsgTest(uint8_t slot){
    FullScreenMsg(_T(MSG_TESTING_FILAMENT), slot);
}

void FullScreenMsgLoad(uint8_t slot){
    FullScreenMsg(_T(MSG_LOADING_FILAMENT), slot);
   1fc8c:	8d ee       	ldi	r24, 0xED	; 237
   1fc8e:	91 e6       	ldi	r25, 0x61	; 97
   1fc90:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1fc94:	6d 2f       	mov	r22, r29
   1fc96:	0f 94 09 50 	call	0x2a012	; 0x2a012 <MMU2::FullScreenMsg(char const*, unsigned char) [clone .lto_priv.375]>

struct ReportingRAII {
    CommandInProgress cip;
    explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip)
        : cip(cip) {
        BeginReport(cip, ProgressCode::EngagingIdler);
   1fc9a:	0f 94 72 79 	call	0x2f2e4	; 0x2f2e4 <MMU2::BeginReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.123]>

    FullScreenMsgLoad(slot);
    {
        // used for MMU-menu operation "Load to Nozzle"
        ReportingRAII rep(CommandInProgress::ToolChange);
        FSensorBlockRunout blockRunout;
   1fc9e:	0f 94 2b 79 	call	0x2f256	; 0x2f256 <FSensorBlockRunout::FSensorBlockRunout() [clone .constprop.136]>

        if (extruder != MMU2_NO_TOOL) { // we already have some filament loaded - free it + shape its tip properly
   1fca2:	80 91 e8 12 	lds	r24, 0x12E8	; 0x8012e8 <MMU2::mmu2+0x56>
   1fca6:	83 36       	cpi	r24, 0x63	; 99
   1fca8:	29 f0       	breq	.+10     	; 0x1fcb4 <MMU2::MMU2::load_filament_to_nozzle(unsigned char) [clone .constprop.39]+0x46>

    return ss;
}

void MMU2::filament_ramming() {
    execute_extruder_sequence(ramming_sequence, sizeof(ramming_sequence) / sizeof(E_Step));
   1fcaa:	62 e1       	ldi	r22, 0x12	; 18
   1fcac:	8c e1       	ldi	r24, 0x1C	; 28
   1fcae:	9d e9       	ldi	r25, 0x9D	; 157
   1fcb0:	0f 94 7d 79 	call	0x2f2fa	; 0x2f2fa <MMU2::MMU2::execute_extruder_sequence(E_Step const*, unsigned char) [clone .constprop.111]>

        if (extruder != MMU2_NO_TOOL) { // we already have some filament loaded - free it + shape its tip properly
            filament_ramming();
        }

        ToolChangeCommon(slot);
   1fcb4:	8d 2f       	mov	r24, r29
   1fcb6:	0e 94 df fc 	call	0x1f9be	; 0x1f9be <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]>

        // Finish loading to the nozzle with finely tuned steps.
        execute_load_to_nozzle_sequence();
   1fcba:	0e 94 09 be 	call	0x17c12	; 0x17c12 <MMU2::MMU2::execute_load_to_nozzle_sequence() [clone .constprop.41]>
bool cutter_enabled(){
    return eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED) == EEPROM_MMU_CUTTER_ENABLED_enabled;
}

void MakeSound(SoundType s){
    Sound_MakeSound( (eSOUND_TYPE)s);
   1fcbe:	83 e0       	ldi	r24, 0x03	; 3
   1fcc0:	0f 94 ad 25 	call	0x24b5a	; 0x24b5a <Sound_MakeSound(eSOUND_TYPE)>
#endif //(FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
//    SERIAL_ECHOLNPGM("FSBlockRunout");
}

FSensorBlockRunout::~FSensorBlockRunout() {
    fsensor.settings_init(); // restore filament runout state.
   1fcc4:	0f 94 95 6d 	call	0x2db2a	; 0x2db2a <PAT9125_sensor::settings_init() [clone .constprop.207]>
    explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip)
        : cip(cip) {
        BeginReport(cip, ProgressCode::EngagingIdler);
    }
    inline __attribute__((always_inline)) ~ReportingRAII() {
        EndReport(cip, ProgressCode::OK);
   1fcc8:	0f 94 9b 79 	call	0x2f336	; 0x2f336 <MMU2::EndReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.108]>

        // Finish loading to the nozzle with finely tuned steps.
        execute_load_to_nozzle_sequence();
        MakeSound(Confirm);
    }
    ScreenUpdateEnable();
   1fccc:	0f 94 06 50 	call	0x2a00c	; 0x2a00c <MMU2::ScreenUpdateEnable()>
    return true;
}
   1fcd0:	8c 2f       	mov	r24, r28
   1fcd2:	df 91       	pop	r29
   1fcd4:	cf 91       	pop	r28
   1fcd6:	08 95       	ret

0001fcd8 <lcd_mmu_load_to_nozzle_wrapper(unsigned char)>:
        MENU_ITEM_FUNCTION_NR_P(_T(MSG_LOAD_FILAMENT), i + '1', load_filament_wrapper, i);
    MENU_END();
}

static inline void lcd_mmu_load_to_nozzle_wrapper(uint8_t index){
    MMU2::mmu2.load_filament_to_nozzle(index);
   1fcd8:	0e 94 37 fe 	call	0x1fc6e	; 0x1fc6e <MMU2::MMU2::load_filament_to_nozzle(unsigned char) [clone .constprop.39]>

    // Extrude a little bit of filament so the user
    // can see the color is correct
    load_filament_final_feed();
   1fcdc:	0e 94 ed 63 	call	0xc7da	; 0xc7da <load_filament_final_feed()>
    st_synchronize();
   1fce0:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>

    // Ask user if the extruded color is correct:
    lcd_return_to_status();
   1fce4:	0f 94 d5 07 	call	0x20faa	; 0x20faa <lcd_return_to_status()>
    lcd_load_filament_color_check();
   1fce8:	0f 94 07 1b 	call	0x2360e	; 0x2360e <lcd_load_filament_color_check()>
    lcd_setstatuspgm(MSG_WELCOME);
   1fcec:	86 ee       	ldi	r24, 0xE6	; 230
   1fcee:	9b e6       	ldi	r25, 0x6B	; 107
   1fcf0:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
    custom_message_type = CustomMsg::Status;
   1fcf4:	10 92 5d 06 	sts	0x065D, r1	; 0x80065d <custom_message_type>

    // Clear the filament action
    clearFilamentAction();
   1fcf8:	0d 94 d6 0b 	jmp	0x217ac	; 0x217ac <clearFilamentAction() [clone .lto_priv.411]>

0001fcfc <MMU2::MMU2::tool_change(unsigned char) [clone .constprop.26]>:
    SpoolJoin::spooljoin.setSlot(slot);

    ++toolchange_counter;
}

bool MMU2::tool_change(uint8_t slot) {
   1fcfc:	cf 93       	push	r28
   1fcfe:	df 93       	push	r29
   1fd00:	d8 2f       	mov	r29, r24
    if (!WaitForMMUReady()) {
   1fd02:	0f 94 a6 79 	call	0x2f34c	; 0x2f34c <MMU2::MMU2::WaitForMMUReady() [clone .constprop.106]>
   1fd06:	c8 2f       	mov	r28, r24
   1fd08:	88 23       	and	r24, r24
   1fd0a:	b9 f0       	breq	.+46     	; 0x1fd3a <MMU2::MMU2::tool_change(unsigned char) [clone .constprop.26]+0x3e>
        return false;
    }

    if (slot != extruder) {
   1fd0c:	80 91 e8 12 	lds	r24, 0x12E8	; 0x8012e8 <MMU2::mmu2+0x56>
   1fd10:	8d 17       	cp	r24, r29
   1fd12:	99 f0       	breq	.+38     	; 0x1fd3a <MMU2::MMU2::tool_change(unsigned char) [clone .constprop.26]+0x3e>
    current_position[Y_AXIS] = MMU_ERR_Y_PAUSE_POS;
    planner_line_to_current_position_sync(NOZZLE_PARK_XY_FEEDRATE);
}

bool marlin_printingIsActive() {
    return printer_active();
   1fd14:	0e 94 91 66 	call	0xcd22	; 0xcd22 <printer_active()>
        if (/*FindaDetectsFilament()*/
   1fd18:	81 11       	cpse	r24, r1
   1fd1a:	02 c0       	rjmp	.+4      	; 0x1fd20 <MMU2::MMU2::tool_change(unsigned char) [clone .constprop.26]+0x24>
            /*!IS_SD_PRINTING && !usb_timer.running()*/
            !marlin_printingIsActive()) {
            // If Tcodes are used manually through the serial
            // we need to unload manually as well -- but only if FINDA detects filament
            unload();
   1fd1c:	0f 94 71 9d 	call	0x33ae2	; 0x33ae2 <MMU2::MMU2::unload() [clone .constprop.105]>

struct ReportingRAII {
    CommandInProgress cip;
    explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip)
        : cip(cip) {
        BeginReport(cip, ProgressCode::EngagingIdler);
   1fd20:	0f 94 72 79 	call	0x2f2e4	; 0x2f2e4 <MMU2::BeginReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.123]>
            // we need to unload manually as well -- but only if FINDA detects filament
            unload();
        }

        ReportingRAII rep(CommandInProgress::ToolChange);
        FSensorBlockRunout blockRunout;
   1fd24:	0f 94 2b 79 	call	0x2f256	; 0x2f256 <FSensorBlockRunout::FSensorBlockRunout() [clone .constprop.136]>
bool planner_draining() {
    return planner_aborted;
}

void planner_synchronize() {
    st_synchronize();
   1fd28:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
        planner_synchronize();
        ToolChangeCommon(slot);
   1fd2c:	8d 2f       	mov	r24, r29
   1fd2e:	0e 94 df fc 	call	0x1f9be	; 0x1f9be <MMU2::MMU2::ToolChangeCommon(unsigned char) [clone .constprop.42]>
   1fd32:	0f 94 95 6d 	call	0x2db2a	; 0x2db2a <PAT9125_sensor::settings_init() [clone .constprop.207]>
    explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip)
        : cip(cip) {
        BeginReport(cip, ProgressCode::EngagingIdler);
    }
    inline __attribute__((always_inline)) ~ReportingRAII() {
        EndReport(cip, ProgressCode::OK);
   1fd36:	0f 94 9b 79 	call	0x2f336	; 0x2f336 <MMU2::EndReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.108]>
        FSensorBlockRunout blockRunout;
        planner_synchronize();
        ToolChangeCommon(slot);
    }
    return true;
}
   1fd3a:	8c 2f       	mov	r24, r28
   1fd3c:	df 91       	pop	r29
   1fd3e:	cf 91       	pop	r28
   1fd40:	08 95       	ret

0001fd42 <MMU2::MMU2::tool_change(char, unsigned char) [clone .constprop.24]>:
/// Handle special T?/Tx/Tc commands
///
///- T? Gcode to extrude shouldn't have to follow, load to extruder wheels is done automatically
///- Tx Same as T?, except nozzle doesn't have to be preheated. Tc must be placed after extruder nozzle is preheated to finish filament load.
///- Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated.
bool MMU2::tool_change(char code, uint8_t slot) {
   1fd42:	1f 93       	push	r17
   1fd44:	cf 93       	push	r28
   1fd46:	df 93       	push	r29
   1fd48:	c8 2f       	mov	r28, r24
   1fd4a:	16 2f       	mov	r17, r22
    if (!WaitForMMUReady()) {
   1fd4c:	0f 94 a6 79 	call	0x2f34c	; 0x2f34c <MMU2::MMU2::WaitForMMUReady() [clone .constprop.106]>
   1fd50:	d8 2f       	mov	r29, r24
   1fd52:	88 23       	and	r24, r24
   1fd54:	89 f0       	breq	.+34     	; 0x1fd78 <MMU2::MMU2::tool_change(char, unsigned char) [clone .constprop.24]+0x36>
        return false;
    }

    FSensorBlockRunout blockRunout;
   1fd56:	0f 94 2b 79 	call	0x2f256	; 0x2f256 <FSensorBlockRunout::FSensorBlockRunout() [clone .constprop.136]>

    switch (code) {
   1fd5a:	c3 36       	cpi	r28, 0x63	; 99
   1fd5c:	01 f1       	breq	.+64     	; 0x1fd9e <MMU2::MMU2::tool_change(char, unsigned char) [clone .constprop.24]+0x5c>
   1fd5e:	c8 37       	cpi	r28, 0x78	; 120
   1fd60:	81 f0       	breq	.+32     	; 0x1fd82 <MMU2::MMU2::tool_change(char, unsigned char) [clone .constprop.24]+0x40>
   1fd62:	cf 33       	cpi	r28, 0x3F	; 63
   1fd64:	39 f4       	brne	.+14     	; 0x1fd74 <MMU2::MMU2::tool_change(char, unsigned char) [clone .constprop.24]+0x32>
    case '?': {
        waitForHotendTargetTemp(100, [] {});
   1fd66:	84 e6       	ldi	r24, 0x64	; 100
   1fd68:	90 e0       	ldi	r25, 0x00	; 0
   1fd6a:	0f 94 58 54 	call	0x2a8b0	; 0x2a8b0 <void MMU2::waitForHotendTargetTemp<MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}>(unsigned int, MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}) [clone .isra.0] [clone .lto_priv.374]>
        load_filament_to_nozzle(slot);
   1fd6e:	81 2f       	mov	r24, r17
   1fd70:	0e 94 37 fe 	call	0x1fc6e	; 0x1fc6e <MMU2::MMU2::load_filament_to_nozzle(unsigned char) [clone .constprop.39]>
   1fd74:	0f 94 95 6d 	call	0x2db2a	; 0x2db2a <PAT9125_sensor::settings_init() [clone .constprop.207]>
        execute_load_to_nozzle_sequence();
    } break;
    }

    return true;
}
   1fd78:	8d 2f       	mov	r24, r29
   1fd7a:	df 91       	pop	r29
   1fd7c:	cf 91       	pop	r28
   1fd7e:	1f 91       	pop	r17
   1fd80:	08 95       	ret
}

#ifdef PREVENT_DANGEROUS_EXTRUDE
void set_extrude_min_temp(int temp)
{
  extrude_min_temp = temp;
   1fd82:	10 92 58 02 	sts	0x0258, r1	; 0x800258 <extrude_min_temp+0x1>
   1fd86:	10 92 57 02 	sts	0x0257, r1	; 0x800257 <extrude_min_temp>
        load_filament_to_nozzle(slot);
    } break;

    case 'x': {
        thermal_setExtrudeMintemp(0); // Allow cold extrusion since Tx only loads to the gears not nozzle
        tool_change(slot);
   1fd8a:	81 2f       	mov	r24, r17
   1fd8c:	0e 94 7e fe 	call	0x1fcfc	; 0x1fcfc <MMU2::MMU2::tool_change(unsigned char) [clone .constprop.26]>
   1fd90:	8f ea       	ldi	r24, 0xAF	; 175
   1fd92:	90 e0       	ldi	r25, 0x00	; 0
   1fd94:	90 93 58 02 	sts	0x0258, r25	; 0x800258 <extrude_min_temp+0x1>
   1fd98:	80 93 57 02 	sts	0x0257, r24	; 0x800257 <extrude_min_temp>
   1fd9c:	eb cf       	rjmp	.-42     	; 0x1fd74 <MMU2::MMU2::tool_change(char, unsigned char) [clone .constprop.24]+0x32>
        thermal_setExtrudeMintemp(EXTRUDE_MINTEMP);
    } break;

    case 'c': {
        waitForHotendTargetTemp(100, [] {});
   1fd9e:	84 e6       	ldi	r24, 0x64	; 100
   1fda0:	90 e0       	ldi	r25, 0x00	; 0
   1fda2:	0f 94 58 54 	call	0x2a8b0	; 0x2a8b0 <void MMU2::waitForHotendTargetTemp<MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}>(unsigned int, MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}) [clone .isra.0] [clone .lto_priv.374]>
        execute_load_to_nozzle_sequence();
   1fda6:	0e 94 09 be 	call	0x17c12	; 0x17c12 <MMU2::MMU2::execute_load_to_nozzle_sequence() [clone .constprop.41]>
   1fdaa:	e4 cf       	rjmp	.-56     	; 0x1fd74 <MMU2::MMU2::tool_change(char, unsigned char) [clone .constprop.24]+0x32>

0001fdac <loading_test_wrapper(unsigned char)>:

    // Clear the filament action
    clearFilamentAction();
}

static inline void loading_test_wrapper(uint8_t i){
   1fdac:	cf 93       	push	r28
   1fdae:	c8 2f       	mov	r28, r24
void FullScreenMsgEject(uint8_t slot){
    FullScreenMsg(_T(MSG_EJECT_FROM_MMU), slot);
}

void FullScreenMsgTest(uint8_t slot){
    FullScreenMsg(_T(MSG_TESTING_FILAMENT), slot);
   1fdb0:	8a e6       	ldi	r24, 0x6A	; 106
   1fdb2:	96 e4       	ldi	r25, 0x46	; 70
   1fdb4:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1fdb8:	6c 2f       	mov	r22, r28
   1fdba:	0f 94 09 50 	call	0x2a012	; 0x2a012 <MMU2::FullScreenMsg(char const*, unsigned char) [clone .lto_priv.375]>
    return true;
}

bool MMU2::loading_test(uint8_t slot) {
    FullScreenMsgTest(slot);
    tool_change(slot);
   1fdbe:	8c 2f       	mov	r24, r28
   1fdc0:	0e 94 7e fe 	call	0x1fcfc	; 0x1fcfc <MMU2::MMU2::tool_change(unsigned char) [clone .constprop.26]>
   1fdc4:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
    planner_synchronize();
    unload();
   1fdc8:	0f 94 71 9d 	call	0x33ae2	; 0x33ae2 <MMU2::MMU2::unload() [clone .constprop.105]>
    ScreenUpdateEnable();
   1fdcc:	0f 94 06 50 	call	0x2a00c	; 0x2a00c <MMU2::ScreenUpdateEnable()>
    MMU2::mmu2.loading_test(i);

    // Clear the filament action
    clearFilamentAction();
}
   1fdd0:	cf 91       	pop	r28

static inline void loading_test_wrapper(uint8_t i){
    MMU2::mmu2.loading_test(i);

    // Clear the filament action
    clearFilamentAction();
   1fdd2:	0d 94 d6 0b 	jmp	0x217ac	; 0x217ac <clearFilamentAction() [clone .lto_priv.411]>

0001fdd6 <loading_test_all_wrapper()>:
static void mmu_cut_filament_menu() {
    mmu_common_choose_filament_menu(_T(MSG_CUT_FILAMENT), mmu_cut_filament_wrapper);
}
#endif //MMU_HAS_CUTTER

static inline void loading_test_all_wrapper(){
   1fdd6:	cf 93       	push	r28
    for(uint8_t i = 0; i < MMU_FILAMENT_COUNT; ++i){
   1fdd8:	c0 e0       	ldi	r28, 0x00	; 0
   1fdda:	8a e6       	ldi	r24, 0x6A	; 106
   1fddc:	96 e4       	ldi	r25, 0x46	; 70
   1fdde:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   1fde2:	6c 2f       	mov	r22, r28
   1fde4:	0f 94 09 50 	call	0x2a012	; 0x2a012 <MMU2::FullScreenMsg(char const*, unsigned char) [clone .lto_priv.375]>
    return true;
}

bool MMU2::loading_test(uint8_t slot) {
    FullScreenMsgTest(slot);
    tool_change(slot);
   1fde8:	8c 2f       	mov	r24, r28
   1fdea:	0e 94 7e fe 	call	0x1fcfc	; 0x1fcfc <MMU2::MMU2::tool_change(unsigned char) [clone .constprop.26]>
   1fdee:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
    planner_synchronize();
    unload();
   1fdf2:	0f 94 71 9d 	call	0x33ae2	; 0x33ae2 <MMU2::MMU2::unload() [clone .constprop.105]>
    ScreenUpdateEnable();
   1fdf6:	0f 94 06 50 	call	0x2a00c	; 0x2a00c <MMU2::ScreenUpdateEnable()>
   1fdfa:	cf 5f       	subi	r28, 0xFF	; 255
   1fdfc:	c5 30       	cpi	r28, 0x05	; 5
   1fdfe:	69 f7       	brne	.-38     	; 0x1fdda <loading_test_all_wrapper()+0x4>
        MMU2::mmu2.loading_test(i);
    }

    // Clear the filament action
    clearFilamentAction();
}
   1fe00:	cf 91       	pop	r28
    for(uint8_t i = 0; i < MMU_FILAMENT_COUNT; ++i){
        MMU2::mmu2.loading_test(i);
    }

    // Clear the filament action
    clearFilamentAction();
   1fe02:	0d 94 d6 0b 	jmp	0x217ac	; 0x217ac <clearFilamentAction() [clone .lto_priv.411]>

0001fe06 <MMU2::MMU2::ReadRegister(unsigned char) [clone .constprop.30]>:

void MMU2::PowerOn() {
    power_on();
}

bool MMU2::ReadRegister(uint8_t address) {
   1fe06:	1f 93       	push	r17
   1fe08:	cf 93       	push	r28
   1fe0a:	df 93       	push	r29
   1fe0c:	00 d0       	rcall	.+0      	; 0x1fe0e <MMU2::MMU2::ReadRegister(unsigned char) [clone .constprop.30]+0x8>
   1fe0e:	1f 92       	push	r1
   1fe10:	1f 92       	push	r1
   1fe12:	cd b7       	in	r28, 0x3d	; 61
   1fe14:	de b7       	in	r29, 0x3e	; 62
   1fe16:	18 2f       	mov	r17, r24
    if (!WaitForMMUReady()) {
   1fe18:	0f 94 a6 79 	call	0x2f34c	; 0x2f34c <MMU2::MMU2::WaitForMMUReady() [clone .constprop.106]>
   1fe1c:	88 23       	and	r24, r24
   1fe1e:	d9 f0       	breq	.+54     	; 0x1fe56 <MMU2::MMU2::ReadRegister(unsigned char) [clone .constprop.30]+0x50>
void ProtocolLogic::Home(uint8_t mode) {
    PlanGenericRequest(RequestMsg(RequestMsgCodes::Home, mode));
}

void ProtocolLogic::ReadRegister(uint8_t address) {
    PlanGenericRequest(RequestMsg(RequestMsgCodes::Read, address));
   1fe20:	41 2f       	mov	r20, r17
   1fe22:	62 e5       	ldi	r22, 0x52	; 82
   1fe24:	ce 01       	movw	r24, r28
   1fe26:	01 96       	adiw	r24, 0x01	; 1
   1fe28:	0f 94 c7 50 	call	0x2a18e	; 0x2a18e <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   1fe2c:	49 81       	ldd	r20, Y+1	; 0x01
   1fe2e:	5a 81       	ldd	r21, Y+2	; 0x02
   1fe30:	6b 81       	ldd	r22, Y+3	; 0x03
   1fe32:	7c 81       	ldd	r23, Y+4	; 0x04
   1fe34:	8d 81       	ldd	r24, Y+5	; 0x05
   1fe36:	0f 94 19 95 	call	0x32a32	; 0x32a32 <MMU2::ProtocolLogic::PlanGenericRequest(modules::protocol::RequestMsg) [clone .constprop.327]>
        return false;
    }
    do {
        logic.ReadRegister(address); // we may signal the accepted/rejected status of the response as return value of this function
    } while (!manage_response(false, false));
   1fe3a:	60 e0       	ldi	r22, 0x00	; 0
   1fe3c:	80 e0       	ldi	r24, 0x00	; 0
   1fe3e:	0f 94 aa 9c 	call	0x33954	; 0x33954 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]>
   1fe42:	88 23       	and	r24, r24
   1fe44:	69 f3       	breq	.-38     	; 0x1fe20 <MMU2::MMU2::ReadRegister(unsigned char) [clone .constprop.30]+0x1a>

    // Update cached value
    lastReadRegisterValue = logic.rsp.paramValue;
   1fe46:	20 91 ad 12 	lds	r18, 0x12AD	; 0x8012ad <MMU2::mmu2+0x1b>
   1fe4a:	30 91 ae 12 	lds	r19, 0x12AE	; 0x8012ae <MMU2::mmu2+0x1c>
   1fe4e:	30 93 fe 12 	sts	0x12FE, r19	; 0x8012fe <MMU2::mmu2+0x6c>
   1fe52:	20 93 fd 12 	sts	0x12FD, r18	; 0x8012fd <MMU2::mmu2+0x6b>
    return true;
}
   1fe56:	0f 90       	pop	r0
   1fe58:	0f 90       	pop	r0
   1fe5a:	0f 90       	pop	r0
   1fe5c:	0f 90       	pop	r0
   1fe5e:	0f 90       	pop	r0
   1fe60:	df 91       	pop	r29
   1fe62:	cf 91       	pop	r28
   1fe64:	1f 91       	pop	r17
   1fe66:	08 95       	ret

0001fe68 <clamp999(unsigned int)>:
	lcd_printf_P(PSTR("%-15.15S%-5d\n" "%-15.15S%-5d\n"), _T(MSG_HOTEND_FAN_SPEED), 60*fan_speed[0], _T(MSG_PRINT_FAN_SPEED), 60*fan_speed[1] );
    menu_back_if_clicked();
}

static uint16_t __attribute__((noinline)) clamp999(uint16_t v){
    return v > 999 ? 999 : v;
   1fe68:	88 3e       	cpi	r24, 0xE8	; 232
   1fe6a:	23 e0       	ldi	r18, 0x03	; 3
   1fe6c:	92 07       	cpc	r25, r18
   1fe6e:	10 f0       	brcs	.+4      	; 0x1fe74 <clamp999(unsigned int)+0xc>
   1fe70:	87 ee       	ldi	r24, 0xE7	; 231
   1fe72:	93 e0       	ldi	r25, 0x03	; 3
}
   1fe74:	08 95       	ret

0001fe76 <uart2_getchar(__file*) [clone .lto_priv.365]>:
	return 0;
}

static int uart2_getchar(_UNUSED FILE *stream)
{
	if (rbuf_empty(uart2_ibuf)) return -1;
   1fe76:	90 91 47 0d 	lds	r25, 0x0D47	; 0x800d47 <uart2_ibuf+0x2>
   1fe7a:	80 91 46 0d 	lds	r24, 0x0D46	; 0x800d46 <uart2_ibuf+0x1>
   1fe7e:	2f ef       	ldi	r18, 0xFF	; 255
   1fe80:	3f ef       	ldi	r19, 0xFF	; 255
   1fe82:	89 17       	cp	r24, r25
   1fe84:	71 f0       	breq	.+28     	; 0x1fea2 <uart2_getchar(__file*) [clone .lto_priv.365]+0x2c>
	_lock();                         //lock
	uint8_t buf_w = ptr[1];          //get write index
	uint8_t buf_r = ptr[2];          //get read index
	_unlock();                       //unlock
	if (buf_r == buf_w) return -1;   //return -1 to signal buffer empty
	int ret = ptr[4 + buf_r];        //get byte from buffer
   1fe86:	e9 2f       	mov	r30, r25
   1fe88:	f0 e0       	ldi	r31, 0x00	; 0
   1fe8a:	e7 5b       	subi	r30, 0xB7	; 183
   1fe8c:	f2 4f       	sbci	r31, 0xF2	; 242
   1fe8e:	20 81       	ld	r18, Z
   1fe90:	30 e0       	ldi	r19, 0x00	; 0
	buf_r++;                         //increment read index
   1fe92:	9f 5f       	subi	r25, 0xFF	; 255
	uint8_t buf_l = ptr[0];          //get length
	if (buf_r >= buf_l) buf_r = 0;   //rotate read index
   1fe94:	80 91 45 0d 	lds	r24, 0x0D45	; 0x800d45 <uart2_ibuf>
   1fe98:	98 17       	cp	r25, r24
   1fe9a:	08 f0       	brcs	.+2      	; 0x1fe9e <uart2_getchar(__file*) [clone .lto_priv.365]+0x28>
   1fe9c:	90 e0       	ldi	r25, 0x00	; 0
	ptr[2] = buf_r;                  //store read index
   1fe9e:	90 93 47 0d 	sts	0x0D47, r25	; 0x800d47 <uart2_ibuf+0x2>
	return rbuf_get(uart2_ibuf);
}
   1fea2:	c9 01       	movw	r24, r18
   1fea4:	08 95       	ret

0001fea6 <uart2_putchar(char, __file*) [clone .lto_priv.364]>:
uint8_t uart2_ibuf[20] = {0, 0};
FILE _uart2io;

static int uart2_putchar(char c, _UNUSED FILE *stream)
{
	while (!uart2_txready);
   1fea6:	90 91 d0 00 	lds	r25, 0x00D0	; 0x8000d0 <__TEXT_REGION_LENGTH__+0x7c20d0>
   1feaa:	95 ff       	sbrs	r25, 5
   1feac:	fc cf       	rjmp	.-8      	; 0x1fea6 <uart2_putchar(char, __file*) [clone .lto_priv.364]>

	UDR2 = c; // transmit byte
   1feae:	80 93 d6 00 	sts	0x00D6, r24	; 0x8000d6 <__TEXT_REGION_LENGTH__+0x7c20d6>

	return 0;
}
   1feb2:	90 e0       	ldi	r25, 0x00	; 0
   1feb4:	80 e0       	ldi	r24, 0x00	; 0
   1feb6:	08 95       	ret

0001feb8 <micros2>:
}

unsigned long micros2(void)
{
	unsigned long m;
	uint8_t oldSREG = SREG, t;
   1feb8:	3f b7       	in	r19, 0x3f	; 63
	cli();
   1feba:	f8 94       	cli
	m = timer2_overflow_count;
   1febc:	80 91 fc 05 	lds	r24, 0x05FC	; 0x8005fc <timer2_overflow_count>
   1fec0:	90 91 fd 05 	lds	r25, 0x05FD	; 0x8005fd <timer2_overflow_count+0x1>
   1fec4:	a0 91 fe 05 	lds	r26, 0x05FE	; 0x8005fe <timer2_overflow_count+0x2>
   1fec8:	b0 91 ff 05 	lds	r27, 0x05FF	; 0x8005ff <timer2_overflow_count+0x3>
#if defined(TCNT2)
	t = TCNT2;
   1fecc:	20 91 b2 00 	lds	r18, 0x00B2	; 0x8000b2 <__TEXT_REGION_LENGTH__+0x7c20b2>
	t = TCNT2L;
#else
	#error TIMER 2 not defined
#endif
#ifdef TIFR2
	if ((TIFR2 & _BV(TOV2)) && (t < 255))
   1fed0:	b8 9b       	sbis	0x17, 0	; 23
   1fed2:	05 c0       	rjmp	.+10     	; 0x1fede <micros2+0x26>
   1fed4:	2f 3f       	cpi	r18, 0xFF	; 255
   1fed6:	19 f0       	breq	.+6      	; 0x1fede <micros2+0x26>
		m++;
   1fed8:	01 96       	adiw	r24, 0x01	; 1
   1feda:	a1 1d       	adc	r26, r1
   1fedc:	b1 1d       	adc	r27, r1
#else
	if ((TIFR & _BV(TOV2)) && (t < 255))
		m++;
#endif
	SREG = oldSREG;
   1fede:	3f bf       	out	0x3f, r19	; 63
	return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond());
   1fee0:	ba 2f       	mov	r27, r26
   1fee2:	a9 2f       	mov	r26, r25
   1fee4:	98 2f       	mov	r25, r24
   1fee6:	88 27       	eor	r24, r24
   1fee8:	bc 01       	movw	r22, r24
   1feea:	cd 01       	movw	r24, r26
   1feec:	62 0f       	add	r22, r18
   1feee:	71 1d       	adc	r23, r1
   1fef0:	81 1d       	adc	r24, r1
   1fef2:	91 1d       	adc	r25, r1
   1fef4:	42 e0       	ldi	r20, 0x02	; 2
   1fef6:	66 0f       	add	r22, r22
   1fef8:	77 1f       	adc	r23, r23
   1fefa:	88 1f       	adc	r24, r24
   1fefc:	99 1f       	adc	r25, r25
   1fefe:	4a 95       	dec	r20
   1ff00:	d1 f7       	brne	.-12     	; 0x1fef6 <micros2+0x3e>
}
   1ff02:	08 95       	ret

0001ff04 <temp_mgr_pid()>:
#endif
    temp_meas_ready = true;
}

static void temp_mgr_pid()
{
   1ff04:	2f 92       	push	r2
   1ff06:	3f 92       	push	r3
   1ff08:	4f 92       	push	r4
   1ff0a:	5f 92       	push	r5
   1ff0c:	6f 92       	push	r6
   1ff0e:	7f 92       	push	r7
   1ff10:	8f 92       	push	r8
   1ff12:	9f 92       	push	r9
   1ff14:	af 92       	push	r10
   1ff16:	bf 92       	push	r11
   1ff18:	cf 92       	push	r12
   1ff1a:	df 92       	push	r13
   1ff1c:	ef 92       	push	r14
   1ff1e:	ff 92       	push	r15
   1ff20:	0f 93       	push	r16
   1ff22:	1f 93       	push	r17
   1ff24:	cf 93       	push	r28
   1ff26:	df 93       	push	r29
   1ff28:	cd b7       	in	r28, 0x3d	; 61
   1ff2a:	de b7       	in	r29, 0x3e	; 62
   1ff2c:	2e 97       	sbiw	r28, 0x0e	; 14
   1ff2e:	0f b6       	in	r0, 0x3f	; 63
   1ff30:	f8 94       	cli
   1ff32:	de bf       	out	0x3e, r29	; 62
   1ff34:	0f be       	out	0x3f, r0	; 63
   1ff36:	cd bf       	out	0x3d, r28	; 61
    for(uint8_t e = 0; e < EXTRUDERS; e++)
        pid_heater(e, current_temperature_isr[e], target_temperature_isr[e]);
   1ff38:	20 90 ef 05 	lds	r2, 0x05EF	; 0x8005ef <target_temperature_isr>
   1ff3c:	30 90 f0 05 	lds	r3, 0x05F0	; 0x8005f0 <target_temperature_isr+0x1>
   1ff40:	40 90 f1 05 	lds	r4, 0x05F1	; 0x8005f1 <current_temperature_isr>
   1ff44:	50 90 f2 05 	lds	r5, 0x05F2	; 0x8005f2 <current_temperature_isr+0x1>
   1ff48:	60 90 f3 05 	lds	r6, 0x05F3	; 0x8005f3 <current_temperature_isr+0x2>
   1ff4c:	70 90 f4 05 	lds	r7, 0x05F4	; 0x8005f4 <current_temperature_isr+0x3>

#ifdef PIDTEMP
    pid_input = current;

#ifndef PID_OPENLOOP
    if(target == 0) {
   1ff50:	21 14       	cp	r2, r1
   1ff52:	31 04       	cpc	r3, r1
   1ff54:	39 f4       	brne	.+14     	; 0x1ff64 <temp_mgr_pid()+0x60>
        pid_output = 0;
        pid_reset[e] = true;
   1ff56:	81 e0       	ldi	r24, 0x01	; 1
   1ff58:	80 93 c8 05 	sts	0x05C8, r24	; 0x8005c8 <pid_reset>
        if (pid_output > PID_MAX) {
            if (pid_error[e] > 0 ) iState_sum[e] -= pid_error[e]; // conditional un-integration
            pid_output=PID_MAX;
        } else if (pid_output < 0) {
            if (pid_error[e] < 0 ) iState_sum[e] -= pid_error[e]; // conditional un-integration
            pid_output=0;
   1ff5c:	81 2c       	mov	r8, r1
   1ff5e:	91 2c       	mov	r9, r1
   1ff60:	54 01       	movw	r10, r8
   1ff62:	f9 c0       	rjmp	.+498    	; 0x20156 <temp_mgr_pid()+0x252>
#ifndef PID_OPENLOOP
    if(target == 0) {
        pid_output = 0;
        pid_reset[e] = true;
    } else {
        pid_error[e] = target - pid_input;
   1ff64:	b1 01       	movw	r22, r2
   1ff66:	03 2c       	mov	r0, r3
   1ff68:	00 0c       	add	r0, r0
   1ff6a:	88 0b       	sbc	r24, r24
   1ff6c:	99 0b       	sbc	r25, r25
   1ff6e:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   1ff72:	a3 01       	movw	r20, r6
   1ff74:	92 01       	movw	r18, r4
   1ff76:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   1ff7a:	6b 01       	movw	r12, r22
   1ff7c:	7c 01       	movw	r14, r24
        if(pid_reset[e]) {
   1ff7e:	80 91 c8 05 	lds	r24, 0x05C8	; 0x8005c8 <pid_reset>
   1ff82:	88 23       	and	r24, r24
   1ff84:	91 f0       	breq	.+36     	; 0x1ffaa <temp_mgr_pid()+0xa6>
            iState_sum[e] = 0.0;
   1ff86:	10 92 c4 05 	sts	0x05C4, r1	; 0x8005c4 <iState_sum>
   1ff8a:	10 92 c5 05 	sts	0x05C5, r1	; 0x8005c5 <iState_sum+0x1>
   1ff8e:	10 92 c6 05 	sts	0x05C6, r1	; 0x8005c6 <iState_sum+0x2>
   1ff92:	10 92 c7 05 	sts	0x05C7, r1	; 0x8005c7 <iState_sum+0x3>
            dTerm[e] = 0.0;                       // 'dState_last[e]' initial setting is not necessary (see end of if-statement)
   1ff96:	10 92 c0 05 	sts	0x05C0, r1	; 0x8005c0 <dTerm>
   1ff9a:	10 92 c1 05 	sts	0x05C1, r1	; 0x8005c1 <dTerm+0x1>
   1ff9e:	10 92 c2 05 	sts	0x05C2, r1	; 0x8005c2 <dTerm+0x2>
   1ffa2:	10 92 c3 05 	sts	0x05C3, r1	; 0x8005c3 <dTerm+0x3>
            pid_reset[e] = false;
   1ffa6:	10 92 c8 05 	sts	0x05C8, r1	; 0x8005c8 <pid_reset>
        }
#ifndef PonM
        pTerm[e] = cs.Kp * pid_error[e];
   1ffaa:	20 91 cf 0d 	lds	r18, 0x0DCF	; 0x800dcf <cs+0x68>
   1ffae:	30 91 d0 0d 	lds	r19, 0x0DD0	; 0x800dd0 <cs+0x69>
   1ffb2:	40 91 d1 0d 	lds	r20, 0x0DD1	; 0x800dd1 <cs+0x6a>
   1ffb6:	50 91 d2 0d 	lds	r21, 0x0DD2	; 0x800dd2 <cs+0x6b>
   1ffba:	c7 01       	movw	r24, r14
   1ffbc:	b6 01       	movw	r22, r12
   1ffbe:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   1ffc2:	69 83       	std	Y+1, r22	; 0x01
   1ffc4:	7a 83       	std	Y+2, r23	; 0x02
   1ffc6:	8b 83       	std	Y+3, r24	; 0x03
   1ffc8:	9c 83       	std	Y+4, r25	; 0x04
        iState_sum[e] += pid_error[e];
   1ffca:	20 91 c4 05 	lds	r18, 0x05C4	; 0x8005c4 <iState_sum>
   1ffce:	30 91 c5 05 	lds	r19, 0x05C5	; 0x8005c5 <iState_sum+0x1>
   1ffd2:	40 91 c6 05 	lds	r20, 0x05C6	; 0x8005c6 <iState_sum+0x2>
   1ffd6:	50 91 c7 05 	lds	r21, 0x05C7	; 0x8005c7 <iState_sum+0x3>
   1ffda:	c7 01       	movw	r24, r14
   1ffdc:	b6 01       	movw	r22, r12
   1ffde:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   1ffe2:	4b 01       	movw	r8, r22
   1ffe4:	5c 01       	movw	r10, r24
        iState_sum[e] = constrain(iState_sum[e], iState_sum_min[e], iState_sum_max[e]);
   1ffe6:	20 91 1c 04 	lds	r18, 0x041C	; 0x80041c <_ZL14iState_sum_min.lto_priv.434>
   1ffea:	2d 87       	std	Y+13, r18	; 0x0d
   1ffec:	30 91 1d 04 	lds	r19, 0x041D	; 0x80041d <_ZL14iState_sum_min.lto_priv.434+0x1>
   1fff0:	39 87       	std	Y+9, r19	; 0x09
   1fff2:	10 91 1e 04 	lds	r17, 0x041E	; 0x80041e <_ZL14iState_sum_min.lto_priv.434+0x2>
   1fff6:	00 91 1f 04 	lds	r16, 0x041F	; 0x80041f <_ZL14iState_sum_min.lto_priv.434+0x3>
   1fffa:	41 2f       	mov	r20, r17
   1fffc:	50 2f       	mov	r21, r16
   1fffe:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   20002:	87 fd       	sbrc	r24, 7
   20004:	17 c0       	rjmp	.+46     	; 0x20034 <temp_mgr_pid()+0x130>
   20006:	80 91 18 04 	lds	r24, 0x0418	; 0x800418 <_ZL14iState_sum_max.lto_priv.435>
   2000a:	8d 87       	std	Y+13, r24	; 0x0d
   2000c:	90 91 19 04 	lds	r25, 0x0419	; 0x800419 <_ZL14iState_sum_max.lto_priv.435+0x1>
   20010:	99 87       	std	Y+9, r25	; 0x09
   20012:	10 91 1a 04 	lds	r17, 0x041A	; 0x80041a <_ZL14iState_sum_max.lto_priv.435+0x2>
   20016:	00 91 1b 04 	lds	r16, 0x041B	; 0x80041b <_ZL14iState_sum_max.lto_priv.435+0x3>
   2001a:	9c 01       	movw	r18, r24
   2001c:	41 2f       	mov	r20, r17
   2001e:	50 2f       	mov	r21, r16
   20020:	b4 01       	movw	r22, r8
   20022:	c5 01       	movw	r24, r10
   20024:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   20028:	18 16       	cp	r1, r24
   2002a:	24 f0       	brlt	.+8      	; 0x20034 <temp_mgr_pid()+0x130>
   2002c:	8d 86       	std	Y+13, r8	; 0x0d
   2002e:	99 86       	std	Y+9, r9	; 0x09
   20030:	1a 2d       	mov	r17, r10
   20032:	0b 2d       	mov	r16, r11
   20034:	8d 85       	ldd	r24, Y+13	; 0x0d
   20036:	99 85       	ldd	r25, Y+9	; 0x09
   20038:	a1 2f       	mov	r26, r17
   2003a:	b0 2f       	mov	r27, r16
   2003c:	80 93 c4 05 	sts	0x05C4, r24	; 0x8005c4 <iState_sum>
   20040:	90 93 c5 05 	sts	0x05C5, r25	; 0x8005c5 <iState_sum+0x1>
   20044:	a0 93 c6 05 	sts	0x05C6, r26	; 0x8005c6 <iState_sum+0x2>
   20048:	b0 93 c7 05 	sts	0x05C7, r27	; 0x8005c7 <iState_sum+0x3>
        iTerm[e] = cs.Ki * iState_sum[e];
   2004c:	20 91 d3 0d 	lds	r18, 0x0DD3	; 0x800dd3 <cs+0x6c>
   20050:	30 91 d4 0d 	lds	r19, 0x0DD4	; 0x800dd4 <cs+0x6d>
   20054:	40 91 d5 0d 	lds	r20, 0x0DD5	; 0x800dd5 <cs+0x6e>
   20058:	50 91 d6 0d 	lds	r21, 0x0DD6	; 0x800dd6 <cs+0x6f>
   2005c:	bc 01       	movw	r22, r24
   2005e:	81 2f       	mov	r24, r17
   20060:	90 2f       	mov	r25, r16
   20062:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   20066:	6d 83       	std	Y+5, r22	; 0x05
   20068:	7e 83       	std	Y+6, r23	; 0x06
   2006a:	8f 83       	std	Y+7, r24	; 0x07
   2006c:	98 87       	std	Y+8, r25	; 0x08
        // PID_K1 defined in Configuration.h in the PID settings
#define K2 (1.0-PID_K1)
        dTerm[e] = (cs.Kd * (pid_input - dState_last[e]))*K2 + (PID_K1 * dTerm[e]); // e.g. digital filtration of derivative term changes
   2006e:	20 91 bc 05 	lds	r18, 0x05BC	; 0x8005bc <dState_last>
   20072:	30 91 bd 05 	lds	r19, 0x05BD	; 0x8005bd <dState_last+0x1>
   20076:	40 91 be 05 	lds	r20, 0x05BE	; 0x8005be <dState_last+0x2>
   2007a:	50 91 bf 05 	lds	r21, 0x05BF	; 0x8005bf <dState_last+0x3>
   2007e:	c3 01       	movw	r24, r6
   20080:	b2 01       	movw	r22, r4
   20082:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   20086:	20 91 d7 0d 	lds	r18, 0x0DD7	; 0x800dd7 <cs+0x70>
   2008a:	30 91 d8 0d 	lds	r19, 0x0DD8	; 0x800dd8 <cs+0x71>
   2008e:	40 91 d9 0d 	lds	r20, 0x0DD9	; 0x800dd9 <cs+0x72>
   20092:	50 91 da 0d 	lds	r21, 0x0DDA	; 0x800dda <cs+0x73>
   20096:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2009a:	20 ed       	ldi	r18, 0xD0	; 208
   2009c:	3c ec       	ldi	r19, 0xCC	; 204
   2009e:	4c e4       	ldi	r20, 0x4C	; 76
   200a0:	5d e3       	ldi	r21, 0x3D	; 61
   200a2:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   200a6:	4b 01       	movw	r8, r22
   200a8:	5c 01       	movw	r10, r24
   200aa:	23 e3       	ldi	r18, 0x33	; 51
   200ac:	33 e3       	ldi	r19, 0x33	; 51
   200ae:	43 e7       	ldi	r20, 0x73	; 115
   200b0:	5f e3       	ldi	r21, 0x3F	; 63
   200b2:	60 91 c0 05 	lds	r22, 0x05C0	; 0x8005c0 <dTerm>
   200b6:	70 91 c1 05 	lds	r23, 0x05C1	; 0x8005c1 <dTerm+0x1>
   200ba:	80 91 c2 05 	lds	r24, 0x05C2	; 0x8005c2 <dTerm+0x2>
   200be:	90 91 c3 05 	lds	r25, 0x05C3	; 0x8005c3 <dTerm+0x3>
   200c2:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   200c6:	9b 01       	movw	r18, r22
   200c8:	ac 01       	movw	r20, r24
   200ca:	c5 01       	movw	r24, r10
   200cc:	b4 01       	movw	r22, r8
   200ce:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   200d2:	4b 01       	movw	r8, r22
   200d4:	5c 01       	movw	r10, r24
   200d6:	80 92 c0 05 	sts	0x05C0, r8	; 0x8005c0 <dTerm>
   200da:	90 92 c1 05 	sts	0x05C1, r9	; 0x8005c1 <dTerm+0x1>
   200de:	a0 92 c2 05 	sts	0x05C2, r10	; 0x8005c2 <dTerm+0x2>
   200e2:	b0 92 c3 05 	sts	0x05C3, r11	; 0x8005c3 <dTerm+0x3>
        pid_output = pTerm[e] + iTerm[e] - dTerm[e]; // subtraction due to "Derivative on Measurement" method (i.e. derivative of input instead derivative of error is used)
   200e6:	2d 81       	ldd	r18, Y+5	; 0x05
   200e8:	3e 81       	ldd	r19, Y+6	; 0x06
   200ea:	4f 81       	ldd	r20, Y+7	; 0x07
   200ec:	58 85       	ldd	r21, Y+8	; 0x08
   200ee:	69 81       	ldd	r22, Y+1	; 0x01
   200f0:	7a 81       	ldd	r23, Y+2	; 0x02
   200f2:	8b 81       	ldd	r24, Y+3	; 0x03
   200f4:	9c 81       	ldd	r25, Y+4	; 0x04
   200f6:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   200fa:	a5 01       	movw	r20, r10
   200fc:	94 01       	movw	r18, r8
   200fe:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   20102:	4b 01       	movw	r8, r22
   20104:	5c 01       	movw	r10, r24
        if (pid_output > PID_MAX) {
   20106:	20 e0       	ldi	r18, 0x00	; 0
   20108:	30 e0       	ldi	r19, 0x00	; 0
   2010a:	4f e7       	ldi	r20, 0x7F	; 127
   2010c:	53 e4       	ldi	r21, 0x43	; 67
   2010e:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
            if (pid_error[e] > 0 ) iState_sum[e] -= pid_error[e]; // conditional un-integration
   20112:	20 e0       	ldi	r18, 0x00	; 0
   20114:	30 e0       	ldi	r19, 0x00	; 0
   20116:	a9 01       	movw	r20, r18
        iTerm[e] = cs.Ki * iState_sum[e];
        // PID_K1 defined in Configuration.h in the PID settings
#define K2 (1.0-PID_K1)
        dTerm[e] = (cs.Kd * (pid_input - dState_last[e]))*K2 + (PID_K1 * dTerm[e]); // e.g. digital filtration of derivative term changes
        pid_output = pTerm[e] + iTerm[e] - dTerm[e]; // subtraction due to "Derivative on Measurement" method (i.e. derivative of input instead derivative of error is used)
        if (pid_output > PID_MAX) {
   20118:	18 16       	cp	r1, r24
   2011a:	0c f0       	brlt	.+2      	; 0x2011e <temp_mgr_pid()+0x21a>
   2011c:	6d c1       	rjmp	.+730    	; 0x203f8 <temp_mgr_pid()+0x4f4>
            if (pid_error[e] > 0 ) iState_sum[e] -= pid_error[e]; // conditional un-integration
   2011e:	c7 01       	movw	r24, r14
   20120:	b6 01       	movw	r22, r12
   20122:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   20126:	18 16       	cp	r1, r24
   20128:	84 f4       	brge	.+32     	; 0x2014a <temp_mgr_pid()+0x246>
   2012a:	a7 01       	movw	r20, r14
   2012c:	96 01       	movw	r18, r12
   2012e:	6d 85       	ldd	r22, Y+13	; 0x0d
   20130:	79 85       	ldd	r23, Y+9	; 0x09
   20132:	81 2f       	mov	r24, r17
   20134:	90 2f       	mov	r25, r16
   20136:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   2013a:	60 93 c4 05 	sts	0x05C4, r22	; 0x8005c4 <iState_sum>
   2013e:	70 93 c5 05 	sts	0x05C5, r23	; 0x8005c5 <iState_sum+0x1>
   20142:	80 93 c6 05 	sts	0x05C6, r24	; 0x8005c6 <iState_sum+0x2>
   20146:	90 93 c7 05 	sts	0x05C7, r25	; 0x8005c7 <iState_sum+0x3>
            pid_output=PID_MAX;
   2014a:	81 2c       	mov	r8, r1
   2014c:	91 2c       	mov	r9, r1
   2014e:	3f e7       	ldi	r19, 0x7F	; 127
   20150:	a3 2e       	mov	r10, r19
   20152:	33 e4       	ldi	r19, 0x43	; 67
   20154:	b3 2e       	mov	r11, r19
        dTerm[e] = cs.Kd * (pid_input - dState_last[e]);
        pid_output = iState_sum[e] - dTerm[e];  // subtraction due to "Derivative on Measurement" method (i.e. derivative of input instead derivative of error is used)
        pid_output = constrain(pid_output, 0, PID_MAX);
#endif // PonM
    }
    dState_last[e] = pid_input;
   20156:	40 92 bc 05 	sts	0x05BC, r4	; 0x8005bc <dState_last>
   2015a:	50 92 bd 05 	sts	0x05BD, r5	; 0x8005bd <dState_last+0x1>
   2015e:	60 92 be 05 	sts	0x05BE, r6	; 0x8005be <dState_last+0x2>
   20162:	70 92 bf 05 	sts	0x05BF, r7	; 0x8005bf <dState_last+0x3>
        pid_output = PID_MAX;
    }
#endif

    // Check if temperature is within the correct range
    if((current < maxttemp[e]) && (target != 0))
   20166:	60 91 54 02 	lds	r22, 0x0254	; 0x800254 <_ZL8maxttemp.lto_priv.436>
   2016a:	70 91 55 02 	lds	r23, 0x0255	; 0x800255 <_ZL8maxttemp.lto_priv.436+0x1>
   2016e:	07 2e       	mov	r0, r23
   20170:	00 0c       	add	r0, r0
   20172:	88 0b       	sbc	r24, r24
   20174:	99 0b       	sbc	r25, r25
   20176:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   2017a:	9b 01       	movw	r18, r22
   2017c:	ac 01       	movw	r20, r24
   2017e:	c3 01       	movw	r24, r6
   20180:	b2 01       	movw	r22, r4
   20182:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   20186:	87 ff       	sbrs	r24, 7
   20188:	57 c1       	rjmp	.+686    	; 0x20438 <temp_mgr_pid()+0x534>
   2018a:	23 28       	or	r2, r3
   2018c:	09 f4       	brne	.+2      	; 0x20190 <temp_mgr_pid()+0x28c>
   2018e:	54 c1       	rjmp	.+680    	; 0x20438 <temp_mgr_pid()+0x534>
        soft_pwm[e] = (int)pid_output >> 1;
   20190:	c5 01       	movw	r24, r10
   20192:	b4 01       	movw	r22, r8
   20194:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   20198:	75 95       	asr	r23
   2019a:	67 95       	ror	r22
   2019c:	60 93 f5 05 	sts	0x05F5, r22	; 0x8005f5 <_ZL8soft_pwm.lto_priv.504>

static void temp_mgr_pid()
{
    for(uint8_t e = 0; e < EXTRUDERS; e++)
        pid_heater(e, current_temperature_isr[e], target_temperature_isr[e]);
    pid_bed(current_temperature_bed_isr, target_temperature_bed_isr);
   201a0:	20 91 e8 05 	lds	r18, 0x05E8	; 0x8005e8 <target_temperature_bed_isr>
   201a4:	30 91 e9 05 	lds	r19, 0x05E9	; 0x8005e9 <target_temperature_bed_isr+0x1>
   201a8:	3a 83       	std	Y+2, r19	; 0x02
   201aa:	29 83       	std	Y+1, r18	; 0x01
   201ac:	40 90 ea 05 	lds	r4, 0x05EA	; 0x8005ea <current_temperature_bed_isr>
   201b0:	50 90 eb 05 	lds	r5, 0x05EB	; 0x8005eb <current_temperature_bed_isr+0x1>
   201b4:	60 90 ec 05 	lds	r6, 0x05EC	; 0x8005ec <current_temperature_bed_isr+0x2>
   201b8:	70 90 ed 05 	lds	r7, 0x05ED	; 0x8005ed <current_temperature_bed_isr+0x3>

#ifdef PIDTEMPBED
    pid_input = current;

#ifndef PID_OPENLOOP
    pid_error_bed = target - pid_input;
   201bc:	b9 01       	movw	r22, r18
   201be:	33 0f       	add	r19, r19
   201c0:	88 0b       	sbc	r24, r24
   201c2:	99 0b       	sbc	r25, r25
   201c4:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   201c8:	a3 01       	movw	r20, r6
   201ca:	92 01       	movw	r18, r4
   201cc:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   201d0:	6b 01       	movw	r12, r22
   201d2:	7c 01       	movw	r14, r24
    pTerm_bed = cs.bedKp * pid_error_bed;
   201d4:	20 91 db 0d 	lds	r18, 0x0DDB	; 0x800ddb <cs+0x74>
   201d8:	30 91 dc 0d 	lds	r19, 0x0DDC	; 0x800ddc <cs+0x75>
   201dc:	40 91 dd 0d 	lds	r20, 0x0DDD	; 0x800ddd <cs+0x76>
   201e0:	50 91 de 0d 	lds	r21, 0x0DDE	; 0x800dde <cs+0x77>
   201e4:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   201e8:	6d 83       	std	Y+5, r22	; 0x05
   201ea:	7e 83       	std	Y+6, r23	; 0x06
   201ec:	8f 83       	std	Y+7, r24	; 0x07
   201ee:	98 87       	std	Y+8, r25	; 0x08
    temp_iState_bed += pid_error_bed;
   201f0:	20 91 d1 05 	lds	r18, 0x05D1	; 0x8005d1 <temp_iState_bed>
   201f4:	30 91 d2 05 	lds	r19, 0x05D2	; 0x8005d2 <temp_iState_bed+0x1>
   201f8:	40 91 d3 05 	lds	r20, 0x05D3	; 0x8005d3 <temp_iState_bed+0x2>
   201fc:	50 91 d4 05 	lds	r21, 0x05D4	; 0x8005d4 <temp_iState_bed+0x3>
   20200:	c7 01       	movw	r24, r14
   20202:	b6 01       	movw	r22, r12
   20204:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   20208:	5b 01       	movw	r10, r22
   2020a:	8c 01       	movw	r16, r24
    temp_iState_bed = constrain(temp_iState_bed, temp_iState_min_bed, temp_iState_max_bed);
   2020c:	30 91 14 04 	lds	r19, 0x0414	; 0x800414 <_ZL19temp_iState_min_bed.lto_priv.432>
   20210:	3e 87       	std	Y+14, r19	; 0x0e
   20212:	80 91 15 04 	lds	r24, 0x0415	; 0x800415 <_ZL19temp_iState_min_bed.lto_priv.432+0x1>
   20216:	8d 87       	std	Y+13, r24	; 0x0d
   20218:	30 90 16 04 	lds	r3, 0x0416	; 0x800416 <_ZL19temp_iState_min_bed.lto_priv.432+0x2>
   2021c:	20 90 17 04 	lds	r2, 0x0417	; 0x800417 <_ZL19temp_iState_min_bed.lto_priv.432+0x3>
   20220:	23 2f       	mov	r18, r19
   20222:	38 2f       	mov	r19, r24
   20224:	43 2d       	mov	r20, r3
   20226:	52 2d       	mov	r21, r2
   20228:	b5 01       	movw	r22, r10
   2022a:	c8 01       	movw	r24, r16
   2022c:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   20230:	87 fd       	sbrc	r24, 7
   20232:	18 c0       	rjmp	.+48     	; 0x20264 <temp_mgr_pid()+0x360>
   20234:	90 91 10 04 	lds	r25, 0x0410	; 0x800410 <_ZL19temp_iState_max_bed.lto_priv.433>
   20238:	9e 87       	std	Y+14, r25	; 0x0e
   2023a:	20 91 11 04 	lds	r18, 0x0411	; 0x800411 <_ZL19temp_iState_max_bed.lto_priv.433+0x1>
   2023e:	2d 87       	std	Y+13, r18	; 0x0d
   20240:	30 90 12 04 	lds	r3, 0x0412	; 0x800412 <_ZL19temp_iState_max_bed.lto_priv.433+0x2>
   20244:	20 90 13 04 	lds	r2, 0x0413	; 0x800413 <_ZL19temp_iState_max_bed.lto_priv.433+0x3>
   20248:	29 2f       	mov	r18, r25
   2024a:	3d 85       	ldd	r19, Y+13	; 0x0d
   2024c:	43 2d       	mov	r20, r3
   2024e:	52 2d       	mov	r21, r2
   20250:	b5 01       	movw	r22, r10
   20252:	c8 01       	movw	r24, r16
   20254:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   20258:	18 16       	cp	r1, r24
   2025a:	24 f0       	brlt	.+8      	; 0x20264 <temp_mgr_pid()+0x360>
   2025c:	ae 86       	std	Y+14, r10	; 0x0e
   2025e:	bd 86       	std	Y+13, r11	; 0x0d
   20260:	30 2e       	mov	r3, r16
   20262:	21 2e       	mov	r2, r17
   20264:	8e 85       	ldd	r24, Y+14	; 0x0e
   20266:	9d 85       	ldd	r25, Y+13	; 0x0d
   20268:	a3 2d       	mov	r26, r3
   2026a:	b2 2d       	mov	r27, r2
   2026c:	80 93 d1 05 	sts	0x05D1, r24	; 0x8005d1 <temp_iState_bed>
   20270:	90 93 d2 05 	sts	0x05D2, r25	; 0x8005d2 <temp_iState_bed+0x1>
   20274:	a0 93 d3 05 	sts	0x05D3, r26	; 0x8005d3 <temp_iState_bed+0x2>
   20278:	b0 93 d4 05 	sts	0x05D4, r27	; 0x8005d4 <temp_iState_bed+0x3>
    iTerm_bed = cs.bedKi * temp_iState_bed;
   2027c:	20 91 df 0d 	lds	r18, 0x0DDF	; 0x800ddf <cs+0x78>
   20280:	30 91 e0 0d 	lds	r19, 0x0DE0	; 0x800de0 <cs+0x79>
   20284:	40 91 e1 0d 	lds	r20, 0x0DE1	; 0x800de1 <cs+0x7a>
   20288:	50 91 e2 0d 	lds	r21, 0x0DE2	; 0x800de2 <cs+0x7b>
   2028c:	bc 01       	movw	r22, r24
   2028e:	83 2d       	mov	r24, r3
   20290:	92 2d       	mov	r25, r2
   20292:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   20296:	69 87       	std	Y+9, r22	; 0x09
   20298:	7a 87       	std	Y+10, r23	; 0x0a
   2029a:	8b 87       	std	Y+11, r24	; 0x0b
   2029c:	9c 87       	std	Y+12, r25	; 0x0c

    //PID_K1 defined in Configuration.h in the PID settings
#define K2 (1.0-PID_K1)
    dTerm_bed= (cs.bedKd * (pid_input - temp_dState_bed))*K2 + (PID_K1 * dTerm_bed);
   2029e:	20 91 cd 05 	lds	r18, 0x05CD	; 0x8005cd <temp_dState_bed>
   202a2:	30 91 ce 05 	lds	r19, 0x05CE	; 0x8005ce <temp_dState_bed+0x1>
   202a6:	40 91 cf 05 	lds	r20, 0x05CF	; 0x8005cf <temp_dState_bed+0x2>
   202aa:	50 91 d0 05 	lds	r21, 0x05D0	; 0x8005d0 <temp_dState_bed+0x3>
   202ae:	c3 01       	movw	r24, r6
   202b0:	b2 01       	movw	r22, r4
   202b2:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   202b6:	20 91 e3 0d 	lds	r18, 0x0DE3	; 0x800de3 <cs+0x7c>
   202ba:	30 91 e4 0d 	lds	r19, 0x0DE4	; 0x800de4 <cs+0x7d>
   202be:	40 91 e5 0d 	lds	r20, 0x0DE5	; 0x800de5 <cs+0x7e>
   202c2:	50 91 e6 0d 	lds	r21, 0x0DE6	; 0x800de6 <cs+0x7f>
   202c6:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   202ca:	20 ed       	ldi	r18, 0xD0	; 208
   202cc:	3c ec       	ldi	r19, 0xCC	; 204
   202ce:	4c e4       	ldi	r20, 0x4C	; 76
   202d0:	5d e3       	ldi	r21, 0x3D	; 61
   202d2:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   202d6:	4b 01       	movw	r8, r22
   202d8:	5c 01       	movw	r10, r24
   202da:	23 e3       	ldi	r18, 0x33	; 51
   202dc:	33 e3       	ldi	r19, 0x33	; 51
   202de:	43 e7       	ldi	r20, 0x73	; 115
   202e0:	5f e3       	ldi	r21, 0x3F	; 63
   202e2:	60 91 c9 05 	lds	r22, 0x05C9	; 0x8005c9 <dTerm_bed>
   202e6:	70 91 ca 05 	lds	r23, 0x05CA	; 0x8005ca <dTerm_bed+0x1>
   202ea:	80 91 cb 05 	lds	r24, 0x05CB	; 0x8005cb <dTerm_bed+0x2>
   202ee:	90 91 cc 05 	lds	r25, 0x05CC	; 0x8005cc <dTerm_bed+0x3>
   202f2:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   202f6:	9b 01       	movw	r18, r22
   202f8:	ac 01       	movw	r20, r24
   202fa:	c5 01       	movw	r24, r10
   202fc:	b4 01       	movw	r22, r8
   202fe:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   20302:	4b 01       	movw	r8, r22
   20304:	5c 01       	movw	r10, r24
   20306:	80 92 c9 05 	sts	0x05C9, r8	; 0x8005c9 <dTerm_bed>
   2030a:	90 92 ca 05 	sts	0x05CA, r9	; 0x8005ca <dTerm_bed+0x1>
   2030e:	a0 92 cb 05 	sts	0x05CB, r10	; 0x8005cb <dTerm_bed+0x2>
   20312:	b0 92 cc 05 	sts	0x05CC, r11	; 0x8005cc <dTerm_bed+0x3>
    temp_dState_bed = pid_input;
   20316:	40 92 cd 05 	sts	0x05CD, r4	; 0x8005cd <temp_dState_bed>
   2031a:	50 92 ce 05 	sts	0x05CE, r5	; 0x8005ce <temp_dState_bed+0x1>
   2031e:	60 92 cf 05 	sts	0x05CF, r6	; 0x8005cf <temp_dState_bed+0x2>
   20322:	70 92 d0 05 	sts	0x05D0, r7	; 0x8005d0 <temp_dState_bed+0x3>

    pid_output = pTerm_bed + iTerm_bed - dTerm_bed;
   20326:	29 85       	ldd	r18, Y+9	; 0x09
   20328:	3a 85       	ldd	r19, Y+10	; 0x0a
   2032a:	4b 85       	ldd	r20, Y+11	; 0x0b
   2032c:	5c 85       	ldd	r21, Y+12	; 0x0c
   2032e:	6d 81       	ldd	r22, Y+5	; 0x05
   20330:	7e 81       	ldd	r23, Y+6	; 0x06
   20332:	8f 81       	ldd	r24, Y+7	; 0x07
   20334:	98 85       	ldd	r25, Y+8	; 0x08
   20336:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   2033a:	a5 01       	movw	r20, r10
   2033c:	94 01       	movw	r18, r8
   2033e:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   20342:	4b 01       	movw	r8, r22
   20344:	5c 01       	movw	r10, r24
    if (pid_output > MAX_BED_POWER) {
   20346:	20 e0       	ldi	r18, 0x00	; 0
   20348:	30 e0       	ldi	r19, 0x00	; 0
   2034a:	4f e7       	ldi	r20, 0x7F	; 127
   2034c:	53 e4       	ldi	r21, 0x43	; 67
   2034e:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
        if (pid_error_bed > 0 )  temp_iState_bed -= pid_error_bed; // conditional un-integration
   20352:	20 e0       	ldi	r18, 0x00	; 0
   20354:	30 e0       	ldi	r19, 0x00	; 0
   20356:	a9 01       	movw	r20, r18
#define K2 (1.0-PID_K1)
    dTerm_bed= (cs.bedKd * (pid_input - temp_dState_bed))*K2 + (PID_K1 * dTerm_bed);
    temp_dState_bed = pid_input;

    pid_output = pTerm_bed + iTerm_bed - dTerm_bed;
    if (pid_output > MAX_BED_POWER) {
   20358:	18 16       	cp	r1, r24
   2035a:	0c f0       	brlt	.+2      	; 0x2035e <temp_mgr_pid()+0x45a>
   2035c:	70 c0       	rjmp	.+224    	; 0x2043e <temp_mgr_pid()+0x53a>
        if (pid_error_bed > 0 )  temp_iState_bed -= pid_error_bed; // conditional un-integration
   2035e:	c7 01       	movw	r24, r14
   20360:	b6 01       	movw	r22, r12
   20362:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   20366:	18 16       	cp	r1, r24
   20368:	84 f4       	brge	.+32     	; 0x2038a <temp_mgr_pid()+0x486>
   2036a:	a7 01       	movw	r20, r14
   2036c:	96 01       	movw	r18, r12
   2036e:	6e 85       	ldd	r22, Y+14	; 0x0e
   20370:	7d 85       	ldd	r23, Y+13	; 0x0d
   20372:	83 2d       	mov	r24, r3
   20374:	92 2d       	mov	r25, r2
   20376:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   2037a:	60 93 d1 05 	sts	0x05D1, r22	; 0x8005d1 <temp_iState_bed>
   2037e:	70 93 d2 05 	sts	0x05D2, r23	; 0x8005d2 <temp_iState_bed+0x1>
   20382:	80 93 d3 05 	sts	0x05D3, r24	; 0x8005d3 <temp_iState_bed+0x2>
   20386:	90 93 d4 05 	sts	0x05D4, r25	; 0x8005d4 <temp_iState_bed+0x3>
        pid_output=MAX_BED_POWER;
   2038a:	81 2c       	mov	r8, r1
   2038c:	91 2c       	mov	r9, r1
   2038e:	9f e7       	ldi	r25, 0x7F	; 127
   20390:	a9 2e       	mov	r10, r25
   20392:	93 e4       	ldi	r25, 0x43	; 67
   20394:	b9 2e       	mov	r11, r25

#else
    pid_output = constrain(target, 0, MAX_BED_POWER);
#endif //PID_OPENLOOP

    if(current < BED_MAXTEMP)
   20396:	20 e0       	ldi	r18, 0x00	; 0
   20398:	30 e0       	ldi	r19, 0x00	; 0
   2039a:	4a ef       	ldi	r20, 0xFA	; 250
   2039c:	52 e4       	ldi	r21, 0x42	; 66
   2039e:	c3 01       	movw	r24, r6
   203a0:	b2 01       	movw	r22, r4
   203a2:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   203a6:	87 ff       	sbrs	r24, 7
   203a8:	6d c0       	rjmp	.+218    	; 0x20484 <temp_mgr_pid()+0x580>
    {
        soft_pwm_bed = (int)pid_output >> 1;
   203aa:	c5 01       	movw	r24, r10
   203ac:	b4 01       	movw	r22, r8
   203ae:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   203b2:	75 95       	asr	r23
   203b4:	67 95       	ror	r22
   203b6:	60 93 ee 05 	sts	0x05EE, r22	; 0x8005ee <soft_pwm_bed>
        soft_pwm_bed = 0;
        WRITE(HEATER_BED_PIN,LOW);
    }
#endif //BED_LIMIT_SWITCHING

    if(target==0)
   203ba:	89 81       	ldd	r24, Y+1	; 0x01
   203bc:	9a 81       	ldd	r25, Y+2	; 0x02
   203be:	89 2b       	or	r24, r25
   203c0:	11 f4       	brne	.+4      	; 0x203c6 <temp_mgr_pid()+0x4c2>
    {
        soft_pwm_bed = 0;
   203c2:	10 92 ee 05 	sts	0x05EE, r1	; 0x8005ee <soft_pwm_bed>
static void temp_mgr_pid()
{
    for(uint8_t e = 0; e < EXTRUDERS; e++)
        pid_heater(e, current_temperature_isr[e], target_temperature_isr[e]);
    pid_bed(current_temperature_bed_isr, target_temperature_bed_isr);
}
   203c6:	2e 96       	adiw	r28, 0x0e	; 14
   203c8:	0f b6       	in	r0, 0x3f	; 63
   203ca:	f8 94       	cli
   203cc:	de bf       	out	0x3e, r29	; 62
   203ce:	0f be       	out	0x3f, r0	; 63
   203d0:	cd bf       	out	0x3d, r28	; 61
   203d2:	df 91       	pop	r29
   203d4:	cf 91       	pop	r28
   203d6:	1f 91       	pop	r17
   203d8:	0f 91       	pop	r16
   203da:	ff 90       	pop	r15
   203dc:	ef 90       	pop	r14
   203de:	df 90       	pop	r13
   203e0:	cf 90       	pop	r12
   203e2:	bf 90       	pop	r11
   203e4:	af 90       	pop	r10
   203e6:	9f 90       	pop	r9
   203e8:	8f 90       	pop	r8
   203ea:	7f 90       	pop	r7
   203ec:	6f 90       	pop	r6
   203ee:	5f 90       	pop	r5
   203f0:	4f 90       	pop	r4
   203f2:	3f 90       	pop	r3
   203f4:	2f 90       	pop	r2
   203f6:	08 95       	ret
        dTerm[e] = (cs.Kd * (pid_input - dState_last[e]))*K2 + (PID_K1 * dTerm[e]); // e.g. digital filtration of derivative term changes
        pid_output = pTerm[e] + iTerm[e] - dTerm[e]; // subtraction due to "Derivative on Measurement" method (i.e. derivative of input instead derivative of error is used)
        if (pid_output > PID_MAX) {
            if (pid_error[e] > 0 ) iState_sum[e] -= pid_error[e]; // conditional un-integration
            pid_output=PID_MAX;
        } else if (pid_output < 0) {
   203f8:	c5 01       	movw	r24, r10
   203fa:	b4 01       	movw	r22, r8
   203fc:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   20400:	87 ff       	sbrs	r24, 7
   20402:	a9 ce       	rjmp	.-686    	; 0x20156 <temp_mgr_pid()+0x252>
            if (pid_error[e] < 0 ) iState_sum[e] -= pid_error[e]; // conditional un-integration
   20404:	20 e0       	ldi	r18, 0x00	; 0
   20406:	30 e0       	ldi	r19, 0x00	; 0
   20408:	a9 01       	movw	r20, r18
   2040a:	c7 01       	movw	r24, r14
   2040c:	b6 01       	movw	r22, r12
   2040e:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   20412:	87 ff       	sbrs	r24, 7
   20414:	a3 cd       	rjmp	.-1210   	; 0x1ff5c <temp_mgr_pid()+0x58>
   20416:	a7 01       	movw	r20, r14
   20418:	96 01       	movw	r18, r12
   2041a:	6d 85       	ldd	r22, Y+13	; 0x0d
   2041c:	79 85       	ldd	r23, Y+9	; 0x09
   2041e:	81 2f       	mov	r24, r17
   20420:	90 2f       	mov	r25, r16
   20422:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   20426:	60 93 c4 05 	sts	0x05C4, r22	; 0x8005c4 <iState_sum>
   2042a:	70 93 c5 05 	sts	0x05C5, r23	; 0x8005c5 <iState_sum+0x1>
   2042e:	80 93 c6 05 	sts	0x05C6, r24	; 0x8005c6 <iState_sum+0x2>
   20432:	90 93 c7 05 	sts	0x05C7, r25	; 0x8005c7 <iState_sum+0x3>
   20436:	92 cd       	rjmp	.-1244   	; 0x1ff5c <temp_mgr_pid()+0x58>

    // Check if temperature is within the correct range
    if((current < maxttemp[e]) && (target != 0))
        soft_pwm[e] = (int)pid_output >> 1;
    else
        soft_pwm[e] = 0;
   20438:	10 92 f5 05 	sts	0x05F5, r1	; 0x8005f5 <_ZL8soft_pwm.lto_priv.504>
   2043c:	b1 ce       	rjmp	.-670    	; 0x201a0 <temp_mgr_pid()+0x29c>

    pid_output = pTerm_bed + iTerm_bed - dTerm_bed;
    if (pid_output > MAX_BED_POWER) {
        if (pid_error_bed > 0 )  temp_iState_bed -= pid_error_bed; // conditional un-integration
        pid_output=MAX_BED_POWER;
    } else if (pid_output < 0){
   2043e:	c5 01       	movw	r24, r10
   20440:	b4 01       	movw	r22, r8
   20442:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   20446:	87 ff       	sbrs	r24, 7
   20448:	a6 cf       	rjmp	.-180    	; 0x20396 <temp_mgr_pid()+0x492>
        if (pid_error_bed < 0 )  temp_iState_bed -= pid_error_bed; // conditional un-integration
   2044a:	20 e0       	ldi	r18, 0x00	; 0
   2044c:	30 e0       	ldi	r19, 0x00	; 0
   2044e:	a9 01       	movw	r20, r18
   20450:	c7 01       	movw	r24, r14
   20452:	b6 01       	movw	r22, r12
   20454:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   20458:	87 ff       	sbrs	r24, 7
   2045a:	10 c0       	rjmp	.+32     	; 0x2047c <temp_mgr_pid()+0x578>
   2045c:	a7 01       	movw	r20, r14
   2045e:	96 01       	movw	r18, r12
   20460:	6e 85       	ldd	r22, Y+14	; 0x0e
   20462:	7d 85       	ldd	r23, Y+13	; 0x0d
   20464:	83 2d       	mov	r24, r3
   20466:	92 2d       	mov	r25, r2
   20468:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   2046c:	60 93 d1 05 	sts	0x05D1, r22	; 0x8005d1 <temp_iState_bed>
   20470:	70 93 d2 05 	sts	0x05D2, r23	; 0x8005d2 <temp_iState_bed+0x1>
   20474:	80 93 d3 05 	sts	0x05D3, r24	; 0x8005d3 <temp_iState_bed+0x2>
   20478:	90 93 d4 05 	sts	0x05D4, r25	; 0x8005d4 <temp_iState_bed+0x3>
        pid_output=0;
   2047c:	81 2c       	mov	r8, r1
   2047e:	91 2c       	mov	r9, r1
   20480:	54 01       	movw	r10, r8
   20482:	89 cf       	rjmp	.-238    	; 0x20396 <temp_mgr_pid()+0x492>
    {
        soft_pwm_bed = (int)pid_output >> 1;
    }
    else
    {
        soft_pwm_bed = 0;
   20484:	10 92 ee 05 	sts	0x05EE, r1	; 0x8005ee <soft_pwm_bed>
   20488:	98 cf       	rjmp	.-208    	; 0x203ba <temp_mgr_pid()+0x4b6>

0002048a <setIsrTargetTemperatures()>:
}

static void setIsrTargetTemperatures()
{
    for(uint8_t e=0;e<EXTRUDERS;e++)
        target_temperature_isr[e] = target_temperature[e];
   2048a:	80 91 5d 12 	lds	r24, 0x125D	; 0x80125d <target_temperature>
   2048e:	90 91 5e 12 	lds	r25, 0x125E	; 0x80125e <target_temperature+0x1>
   20492:	90 93 f0 05 	sts	0x05F0, r25	; 0x8005f0 <target_temperature_isr+0x1>
   20496:	80 93 ef 05 	sts	0x05EF, r24	; 0x8005ef <target_temperature_isr>
    target_temperature_bed_isr = target_temperature_bed;
   2049a:	80 91 59 12 	lds	r24, 0x1259	; 0x801259 <target_temperature_bed>
   2049e:	90 91 5a 12 	lds	r25, 0x125A	; 0x80125a <target_temperature_bed+0x1>
   204a2:	90 93 e9 05 	sts	0x05E9, r25	; 0x8005e9 <target_temperature_bed_isr+0x1>
   204a6:	80 93 e8 05 	sts	0x05E8, r24	; 0x8005e8 <target_temperature_bed_isr>
}
   204aa:	08 95       	ret

000204ac <updateTemperatures()>:
/* Synchronize temperatures:
   - fetch updated values from temp_mgr_isr to current values
   - update target temperatures for temp_mgr_isr regulation *if* no temperature error is set
   This function is blocking: check temp_meas_ready before calling! */
static void updateTemperatures()
{
   204ac:	cf 93       	push	r28
{
    bool temp_mgr_state;

public:
    TempMgrGuard() {
        ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
   204ae:	9f b7       	in	r25, 0x3f	; 63
    return 1;
}

static __inline__ uint8_t __iCliRetVal(void)
{
    cli();
   204b0:	f8 94       	cli
            temp_mgr_state = TEMP_MGR_INTERRUPT_STATE();
   204b2:	c0 91 71 00 	lds	r28, 0x0071	; 0x800071 <__TEXT_REGION_LENGTH__+0x7c2071>
   204b6:	c2 70       	andi	r28, 0x02	; 2
            DISABLE_TEMP_MGR_INTERRUPT();
   204b8:	80 91 71 00 	lds	r24, 0x0071	; 0x800071 <__TEXT_REGION_LENGTH__+0x7c2071>
   204bc:	8d 7f       	andi	r24, 0xFD	; 253
   204be:	80 93 71 00 	sts	0x0071, r24	; 0x800071 <__TEXT_REGION_LENGTH__+0x7c2071>
    (void)__s;
}

static __inline__ void __iRestore(const  uint8_t *__s)
{
    SREG = *__s;
   204c2:	9f bf       	out	0x3f, r25	; 63
}

static void setCurrentTemperaturesFromIsr()
{
    for(uint8_t e=0;e<EXTRUDERS;e++)
        current_temperature[e] = current_temperature_isr[e];
   204c4:	80 91 f1 05 	lds	r24, 0x05F1	; 0x8005f1 <current_temperature_isr>
   204c8:	90 91 f2 05 	lds	r25, 0x05F2	; 0x8005f2 <current_temperature_isr+0x1>
   204cc:	a0 91 f3 05 	lds	r26, 0x05F3	; 0x8005f3 <current_temperature_isr+0x2>
   204d0:	b0 91 f4 05 	lds	r27, 0x05F4	; 0x8005f4 <current_temperature_isr+0x3>
   204d4:	80 93 5a 0d 	sts	0x0D5A, r24	; 0x800d5a <current_temperature>
   204d8:	90 93 5b 0d 	sts	0x0D5B, r25	; 0x800d5b <current_temperature+0x1>
   204dc:	a0 93 5c 0d 	sts	0x0D5C, r26	; 0x800d5c <current_temperature+0x2>
   204e0:	b0 93 5d 0d 	sts	0x0D5D, r27	; 0x800d5d <current_temperature+0x3>
    current_temperature_bed = current_temperature_bed_isr;
   204e4:	80 91 ea 05 	lds	r24, 0x05EA	; 0x8005ea <current_temperature_bed_isr>
   204e8:	90 91 eb 05 	lds	r25, 0x05EB	; 0x8005eb <current_temperature_bed_isr+0x1>
   204ec:	a0 91 ec 05 	lds	r26, 0x05EC	; 0x8005ec <current_temperature_bed_isr+0x2>
   204f0:	b0 91 ed 05 	lds	r27, 0x05ED	; 0x8005ed <current_temperature_bed_isr+0x3>
   204f4:	80 93 bc 03 	sts	0x03BC, r24	; 0x8003bc <current_temperature_bed>
   204f8:	90 93 bd 03 	sts	0x03BD, r25	; 0x8003bd <current_temperature_bed+0x1>
   204fc:	a0 93 be 03 	sts	0x03BE, r26	; 0x8003be <current_temperature_bed+0x2>
   20500:	b0 93 bf 03 	sts	0x03BF, r27	; 0x8003bf <current_temperature_bed+0x3>
#ifdef PINDA_THERMISTOR
    current_temperature_pinda = current_temperature_pinda_isr;
   20504:	80 91 d6 05 	lds	r24, 0x05D6	; 0x8005d6 <current_temperature_pinda_isr>
   20508:	90 91 d7 05 	lds	r25, 0x05D7	; 0x8005d7 <current_temperature_pinda_isr+0x1>
   2050c:	a0 91 d8 05 	lds	r26, 0x05D8	; 0x8005d8 <current_temperature_pinda_isr+0x2>
   20510:	b0 91 d9 05 	lds	r27, 0x05D9	; 0x8005d9 <current_temperature_pinda_isr+0x3>
   20514:	80 93 85 03 	sts	0x0385, r24	; 0x800385 <current_temperature_pinda>
   20518:	90 93 86 03 	sts	0x0386, r25	; 0x800386 <current_temperature_pinda+0x1>
   2051c:	a0 93 87 03 	sts	0x0387, r26	; 0x800387 <current_temperature_pinda+0x2>
   20520:	b0 93 88 03 	sts	0x0388, r27	; 0x800388 <current_temperature_pinda+0x3>
   This function is blocking: check temp_meas_ready before calling! */
static void updateTemperatures()
{
    TempMgrGuard temp_mgr_guard;
    setCurrentTemperaturesFromIsr();
    if(!temp_error_state.v) {
   20524:	80 91 cc 03 	lds	r24, 0x03CC	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
   20528:	81 11       	cpse	r24, r1
   2052a:	02 c0       	rjmp	.+4      	; 0x20530 <updateTemperatures()+0x84>
        // refuse to update target temperatures in any error condition!
        setIsrTargetTemperatures();
   2052c:	0f 94 45 02 	call	0x2048a	; 0x2048a <setIsrTargetTemperatures()>
    }
    temp_meas_ready = false;
   20530:	10 92 d5 05 	sts	0x05D5, r1	; 0x8005d5 <temp_meas_ready>
            DISABLE_TEMP_MGR_INTERRUPT();
        }
    }

    ~TempMgrGuard() throw() {
        ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
   20534:	9f b7       	in	r25, 0x3f	; 63
    return 1;
}

static __inline__ uint8_t __iCliRetVal(void)
{
    cli();
   20536:	f8 94       	cli
            if(temp_mgr_state) ENABLE_TEMP_MGR_INTERRUPT();
   20538:	cc 23       	and	r28, r28
   2053a:	29 f0       	breq	.+10     	; 0x20546 <updateTemperatures()+0x9a>
   2053c:	80 91 71 00 	lds	r24, 0x0071	; 0x800071 <__TEXT_REGION_LENGTH__+0x7c2071>
   20540:	82 60       	ori	r24, 0x02	; 2
   20542:	80 93 71 00 	sts	0x0071, r24	; 0x800071 <__TEXT_REGION_LENGTH__+0x7c2071>
    (void)__s;
}

static __inline__ void __iRestore(const  uint8_t *__s)
{
    SREG = *__s;
   20546:	9f bf       	out	0x3f, r25	; 63
    if(!temp_error_state.v) {
        // refuse to update target temperatures in any error condition!
        setIsrTargetTemperatures();
    }
    temp_meas_ready = false;
}
   20548:	cf 91       	pop	r28
   2054a:	08 95       	ret

0002054c <babystep(unsigned char, bool)>:
{
    // MUST ONLY BE CALLED BY A ISR as stepper pins are manipulated directly.
    // note: when switching direction no delay is inserted at the end when the
    //       original is restored. We assume enough time passes as the function
    //       returns and the stepper is manipulated again (to avoid dead times)
    switch(axis)
   2054c:	81 30       	cpi	r24, 0x01	; 1
   2054e:	61 f1       	breq	.+88     	; 0x205a8 <babystep(unsigned char, bool)+0x5c>
   20550:	20 f0       	brcs	.+8      	; 0x2055a <babystep(unsigned char, bool)+0xe>
   20552:	82 30       	cpi	r24, 0x02	; 2
   20554:	09 f4       	brne	.+2      	; 0x20558 <babystep(unsigned char, bool)+0xc>
   20556:	4b c0       	rjmp	.+150    	; 0x205ee <babystep(unsigned char, bool)+0xa2>
   20558:	08 95       	ret
    {
    case X_AXIS:
    {
        enable_x();
   2055a:	17 98       	cbi	0x02, 7	; 2
        uint8_t old_x_dir_pin = READ(X_DIR_PIN);
   2055c:	90 91 09 01 	lds	r25, 0x0109	; 0x800109 <__TEXT_REGION_LENGTH__+0x7c2109>
   20560:	81 e0       	ldi	r24, 0x01	; 1
   20562:	29 2f       	mov	r18, r25
   20564:	22 70       	andi	r18, 0x02	; 2
   20566:	91 ff       	sbrs	r25, 1
   20568:	80 e0       	ldi	r24, 0x00	; 0
        uint8_t new_x_dir_pin = (INVERT_X_DIR)^direction;

        //setup new step
        if (new_x_dir_pin != old_x_dir_pin) {
   2056a:	86 17       	cp	r24, r22
   2056c:	59 f0       	breq	.+22     	; 0x20584 <babystep(unsigned char, bool)+0x38>
            WRITE_NC(X_DIR_PIN, new_x_dir_pin);
   2056e:	80 91 0b 01 	lds	r24, 0x010B	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
   20572:	66 23       	and	r22, r22
   20574:	a9 f0       	breq	.+42     	; 0x205a0 <babystep(unsigned char, bool)+0x54>
   20576:	82 60       	ori	r24, 0x02	; 2
   20578:	80 93 0b 01 	sts	0x010B, r24	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
	

#endif

	// busy wait
	__asm__ __volatile__ (
   2057c:	8b e8       	ldi	r24, 0x8B	; 139
   2057e:	91 e0       	ldi	r25, 0x01	; 1
   20580:	01 97       	sbiw	r24, 0x01	; 1
   20582:	f1 f7       	brne	.-4      	; 0x20580 <babystep(unsigned char, bool)+0x34>
            delayMicroseconds(STEPPER_SET_DIR_DELAY);
        }

        //perform step
        STEP_NC_HI(X_AXIS);
   20584:	40 9a       	sbi	0x08, 0	; 8
   20586:	83 e0       	ldi	r24, 0x03	; 3
   20588:	90 e0       	ldi	r25, 0x00	; 0
   2058a:	01 97       	sbiw	r24, 0x01	; 1
   2058c:	f1 f7       	brne	.-4      	; 0x2058a <babystep(unsigned char, bool)+0x3e>
#ifdef DEBUG_XSTEP_DUP_PIN
        STEP_NC_HI(X_DUP_AXIS);
#endif
        STEPPER_MINIMUM_DELAY;
        STEP_NC_LO(X_AXIS);
   2058e:	40 98       	cbi	0x08, 0	; 8
#ifdef DEBUG_XSTEP_DUP_PIN
        STEP_NC_LO(X_DUP_AXIS);
#endif

        //get old pin state back.
        WRITE_NC(X_DIR_PIN, old_x_dir_pin);
   20590:	80 91 0b 01 	lds	r24, 0x010B	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
   20594:	22 23       	and	r18, r18
   20596:	31 f0       	breq	.+12     	; 0x205a4 <babystep(unsigned char, bool)+0x58>
   20598:	82 60       	ori	r24, 0x02	; 2
        STEPPER_MINIMUM_DELAY;
        STEP_NC_LO(Z_AXIS);

        //get old pin state back.
        if (new_z_dir_pin != old_z_dir_pin) {
            WRITE_NC(Z_DIR_PIN, old_z_dir_pin);
   2059a:	80 93 0b 01 	sts	0x010B, r24	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
    }
    break;

    default: break;
    }
}
   2059e:	08 95       	ret
        uint8_t old_x_dir_pin = READ(X_DIR_PIN);
        uint8_t new_x_dir_pin = (INVERT_X_DIR)^direction;

        //setup new step
        if (new_x_dir_pin != old_x_dir_pin) {
            WRITE_NC(X_DIR_PIN, new_x_dir_pin);
   205a0:	8d 7f       	andi	r24, 0xFD	; 253
   205a2:	ea cf       	rjmp	.-44     	; 0x20578 <babystep(unsigned char, bool)+0x2c>
#ifdef DEBUG_XSTEP_DUP_PIN
        STEP_NC_LO(X_DUP_AXIS);
#endif

        //get old pin state back.
        WRITE_NC(X_DIR_PIN, old_x_dir_pin);
   205a4:	8d 7f       	andi	r24, 0xFD	; 253
   205a6:	f9 cf       	rjmp	.-14     	; 0x2059a <babystep(unsigned char, bool)+0x4e>
    }
    break;

    case Y_AXIS:
    {
        enable_y();
   205a8:	16 98       	cbi	0x02, 6	; 2
        uint8_t old_y_dir_pin = READ(Y_DIR_PIN);
   205aa:	80 91 09 01 	lds	r24, 0x0109	; 0x800109 <__TEXT_REGION_LENGTH__+0x7c2109>
   205ae:	81 70       	andi	r24, 0x01	; 1
        uint8_t new_y_dir_pin = (INVERT_Y_DIR)^direction;

        //setup new step
        if (new_y_dir_pin != old_y_dir_pin) {
   205b0:	86 17       	cp	r24, r22
   205b2:	59 f0       	breq	.+22     	; 0x205ca <babystep(unsigned char, bool)+0x7e>
            WRITE_NC(Y_DIR_PIN, new_y_dir_pin);
   205b4:	90 91 0b 01 	lds	r25, 0x010B	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
   205b8:	66 23       	and	r22, r22
   205ba:	99 f0       	breq	.+38     	; 0x205e2 <babystep(unsigned char, bool)+0x96>
   205bc:	91 60       	ori	r25, 0x01	; 1
   205be:	90 93 0b 01 	sts	0x010B, r25	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
   205c2:	eb e8       	ldi	r30, 0x8B	; 139
   205c4:	f1 e0       	ldi	r31, 0x01	; 1
   205c6:	31 97       	sbiw	r30, 0x01	; 1
   205c8:	f1 f7       	brne	.-4      	; 0x205c6 <babystep(unsigned char, bool)+0x7a>
            delayMicroseconds(STEPPER_SET_DIR_DELAY);
        }

        //perform step
        STEP_NC_HI(Y_AXIS);
   205ca:	41 9a       	sbi	0x08, 1	; 8
   205cc:	e3 e0       	ldi	r30, 0x03	; 3
   205ce:	f0 e0       	ldi	r31, 0x00	; 0
   205d0:	31 97       	sbiw	r30, 0x01	; 1
   205d2:	f1 f7       	brne	.-4      	; 0x205d0 <babystep(unsigned char, bool)+0x84>
#ifdef DEBUG_YSTEP_DUP_PIN
        STEP_NC_HI(Y_DUP_AXIS);
#endif
        STEPPER_MINIMUM_DELAY;
        STEP_NC_LO(Y_AXIS);
   205d4:	41 98       	cbi	0x08, 1	; 8
#ifdef DEBUG_YSTEP_DUP_PIN
        STEP_NC_LO(Y_DUP_AXIS);
#endif

        //get old pin state back.
        WRITE_NC(Y_DIR_PIN, old_y_dir_pin);
   205d6:	88 23       	and	r24, r24
   205d8:	31 f0       	breq	.+12     	; 0x205e6 <babystep(unsigned char, bool)+0x9a>
   205da:	80 91 0b 01 	lds	r24, 0x010B	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
   205de:	81 60       	ori	r24, 0x01	; 1
   205e0:	dc cf       	rjmp	.-72     	; 0x2059a <babystep(unsigned char, bool)+0x4e>
        uint8_t old_y_dir_pin = READ(Y_DIR_PIN);
        uint8_t new_y_dir_pin = (INVERT_Y_DIR)^direction;

        //setup new step
        if (new_y_dir_pin != old_y_dir_pin) {
            WRITE_NC(Y_DIR_PIN, new_y_dir_pin);
   205e2:	9e 7f       	andi	r25, 0xFE	; 254
   205e4:	ec cf       	rjmp	.-40     	; 0x205be <babystep(unsigned char, bool)+0x72>
#ifdef DEBUG_YSTEP_DUP_PIN
        STEP_NC_LO(Y_DUP_AXIS);
#endif

        //get old pin state back.
        WRITE_NC(Y_DIR_PIN, old_y_dir_pin);
   205e6:	80 91 0b 01 	lds	r24, 0x010B	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
   205ea:	8e 7f       	andi	r24, 0xFE	; 254
   205ec:	d6 cf       	rjmp	.-84     	; 0x2059a <babystep(unsigned char, bool)+0x4e>
    }
    break;

    case Z_AXIS:
    {
        enable_z();
   205ee:	15 98       	cbi	0x02, 5	; 2
        uint8_t old_z_dir_pin = READ(Z_DIR_PIN);
   205f0:	90 91 09 01 	lds	r25, 0x0109	; 0x800109 <__TEXT_REGION_LENGTH__+0x7c2109>
   205f4:	81 e0       	ldi	r24, 0x01	; 1
   205f6:	29 2f       	mov	r18, r25
   205f8:	24 70       	andi	r18, 0x04	; 4
   205fa:	92 ff       	sbrs	r25, 2
   205fc:	80 e0       	ldi	r24, 0x00	; 0
        uint8_t new_z_dir_pin = (INVERT_Z_DIR)^direction^BABYSTEP_INVERT_Z;

        //setup new step
        if (new_z_dir_pin != old_z_dir_pin) {
   205fe:	68 17       	cp	r22, r24
   20600:	59 f0       	breq	.+22     	; 0x20618 <babystep(unsigned char, bool)+0xcc>
            WRITE_NC(Z_DIR_PIN, new_z_dir_pin);
   20602:	90 91 0b 01 	lds	r25, 0x010B	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
   20606:	66 23       	and	r22, r22
   20608:	b1 f0       	breq	.+44     	; 0x20636 <babystep(unsigned char, bool)+0xea>
   2060a:	94 60       	ori	r25, 0x04	; 4
   2060c:	90 93 0b 01 	sts	0x010B, r25	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
   20610:	eb e8       	ldi	r30, 0x8B	; 139
   20612:	f1 e0       	ldi	r31, 0x01	; 1
   20614:	31 97       	sbiw	r30, 0x01	; 1
   20616:	f1 f7       	brne	.-4      	; 0x20614 <babystep(unsigned char, bool)+0xc8>
            delayMicroseconds(STEPPER_SET_DIR_DELAY);
        }

        //perform step
        STEP_NC_HI(Z_AXIS);
   20618:	42 9a       	sbi	0x08, 2	; 8
   2061a:	e3 e0       	ldi	r30, 0x03	; 3
   2061c:	f0 e0       	ldi	r31, 0x00	; 0
   2061e:	31 97       	sbiw	r30, 0x01	; 1
   20620:	f1 f7       	brne	.-4      	; 0x2061e <babystep(unsigned char, bool)+0xd2>
        STEPPER_MINIMUM_DELAY;
        STEP_NC_LO(Z_AXIS);
   20622:	42 98       	cbi	0x08, 2	; 8

        //get old pin state back.
        if (new_z_dir_pin != old_z_dir_pin) {
   20624:	68 17       	cp	r22, r24
   20626:	09 f4       	brne	.+2      	; 0x2062a <babystep(unsigned char, bool)+0xde>
   20628:	ba cf       	rjmp	.-140    	; 0x2059e <babystep(unsigned char, bool)+0x52>
            WRITE_NC(Z_DIR_PIN, old_z_dir_pin);
   2062a:	80 91 0b 01 	lds	r24, 0x010B	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
   2062e:	22 23       	and	r18, r18
   20630:	21 f0       	breq	.+8      	; 0x2063a <babystep(unsigned char, bool)+0xee>
   20632:	84 60       	ori	r24, 0x04	; 4
   20634:	b2 cf       	rjmp	.-156    	; 0x2059a <babystep(unsigned char, bool)+0x4e>
        uint8_t old_z_dir_pin = READ(Z_DIR_PIN);
        uint8_t new_z_dir_pin = (INVERT_Z_DIR)^direction^BABYSTEP_INVERT_Z;

        //setup new step
        if (new_z_dir_pin != old_z_dir_pin) {
            WRITE_NC(Z_DIR_PIN, new_z_dir_pin);
   20636:	9b 7f       	andi	r25, 0xFB	; 251
   20638:	e9 cf       	rjmp	.-46     	; 0x2060c <babystep(unsigned char, bool)+0xc0>
        STEPPER_MINIMUM_DELAY;
        STEP_NC_LO(Z_AXIS);

        //get old pin state back.
        if (new_z_dir_pin != old_z_dir_pin) {
            WRITE_NC(Z_DIR_PIN, old_z_dir_pin);
   2063a:	8b 7f       	andi	r24, 0xFB	; 251
   2063c:	ae cf       	rjmp	.-164    	; 0x2059a <babystep(unsigned char, bool)+0x4e>

0002063e <MarlinSerial::checkRx()>:
		}
	}

    static void checkRx(void)
    {
        if (selectedSerialPort == 0) {
   2063e:	80 91 1c 06 	lds	r24, 0x061C	; 0x80061c <selectedSerialPort>
   20642:	81 11       	cpse	r24, r1
   20644:	25 c0       	rjmp	.+74     	; 0x20690 <MarlinSerial::checkRx()+0x52>
            if((M_UCSRxA & (1<<M_RXCx)) != 0) {
   20646:	80 91 c0 00 	lds	r24, 0x00C0	; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7c20c0>
   2064a:	87 ff       	sbrs	r24, 7
   2064c:	3d c0       	rjmp	.+122    	; 0x206c8 <MarlinSerial::checkRx()+0x8a>
                // Test for a framing error.
                if (M_UCSRxA & (1<<M_FEx)) {
   2064e:	80 91 c0 00 	lds	r24, 0x00C0	; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7c20c0>
   20652:	84 ff       	sbrs	r24, 4
   20654:	03 c0       	rjmp	.+6      	; 0x2065c <MarlinSerial::checkRx()+0x1e>
                    // Characters received with the framing errors will be ignored.
                    // The temporary variable "c" was made volatile, so the compiler does not optimize this out.
                    (void)(*(char *)M_UDRx);
   20656:	80 91 c6 00 	lds	r24, 0x00C6	; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7c20c6>
   2065a:	08 95       	ret
                } else {
                    unsigned char c  =  M_UDRx;
   2065c:	40 91 c6 00 	lds	r20, 0x00C6	; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7c20c6>
                    int i = (unsigned int)(rx_buffer.head + 1) % RX_BUFFER_SIZE;
   20660:	20 91 42 05 	lds	r18, 0x0542	; 0x800542 <rx_buffer+0x80>
   20664:	30 91 43 05 	lds	r19, 0x0543	; 0x800543 <rx_buffer+0x81>
   20668:	c9 01       	movw	r24, r18
   2066a:	01 96       	adiw	r24, 0x01	; 1
   2066c:	8f 77       	andi	r24, 0x7F	; 127
   2066e:	99 27       	eor	r25, r25
                    // if we should be storing the received character into the location
                    // just before the tail (meaning that the head would advance to the
                    // current location of the tail), we're about to overflow the buffer
                    // and so we don't write the character or advance the head.
                    if (i != rx_buffer.tail) {
   20670:	60 91 44 05 	lds	r22, 0x0544	; 0x800544 <rx_buffer+0x82>
   20674:	70 91 45 05 	lds	r23, 0x0545	; 0x800545 <rx_buffer+0x83>
   20678:	86 17       	cp	r24, r22
   2067a:	97 07       	cpc	r25, r23
   2067c:	29 f1       	breq	.+74     	; 0x206c8 <MarlinSerial::checkRx()+0x8a>
                    // if we should be storing the received character into the location
                    // just before the tail (meaning that the head would advance to the
                    // current location of the tail), we're about to overflow the buffer
                    // and so we don't write the character or advance the head.
                    if (i != rx_buffer.tail) {
                        rx_buffer.buffer[rx_buffer.head] = c;
   2067e:	2e 53       	subi	r18, 0x3E	; 62
   20680:	3b 4f       	sbci	r19, 0xFB	; 251
   20682:	f9 01       	movw	r30, r18
   20684:	40 83       	st	Z, r20
                        rx_buffer.head = i;
   20686:	90 93 43 05 	sts	0x0543, r25	; 0x800543 <rx_buffer+0x81>
   2068a:	80 93 42 05 	sts	0x0542, r24	; 0x800542 <rx_buffer+0x80>
   2068e:	1c c0       	rjmp	.+56     	; 0x206c8 <MarlinSerial::checkRx()+0x8a>
					UDR1 = c;
#endif //DEBUG_DUMP_TO_2ND_SERIAL
                }
            }
        } else { // if(selectedSerialPort == 1) {
            if((UCSR1A & (1<<RXC1)) != 0) {
   20690:	80 91 c8 00 	lds	r24, 0x00C8	; 0x8000c8 <__TEXT_REGION_LENGTH__+0x7c20c8>
   20694:	87 ff       	sbrs	r24, 7
   20696:	18 c0       	rjmp	.+48     	; 0x206c8 <MarlinSerial::checkRx()+0x8a>
                // Test for a framing error.
                if (UCSR1A & (1<<FE1)) {
   20698:	80 91 c8 00 	lds	r24, 0x00C8	; 0x8000c8 <__TEXT_REGION_LENGTH__+0x7c20c8>
   2069c:	84 ff       	sbrs	r24, 4
   2069e:	03 c0       	rjmp	.+6      	; 0x206a6 <MarlinSerial::checkRx()+0x68>
                    // Characters received with the framing errors will be ignored.
                    // The temporary variable "c" was made volatile, so the compiler does not optimize this out.
                    (void)(*(char *)UDR1);
   206a0:	80 91 ce 00 	lds	r24, 0x00CE	; 0x8000ce <__TEXT_REGION_LENGTH__+0x7c20ce>
   206a4:	08 95       	ret
                } else {
                    unsigned char c  =  UDR1;
   206a6:	40 91 ce 00 	lds	r20, 0x00CE	; 0x8000ce <__TEXT_REGION_LENGTH__+0x7c20ce>
                    int i = (unsigned int)(rx_buffer.head + 1) % RX_BUFFER_SIZE;
   206aa:	20 91 42 05 	lds	r18, 0x0542	; 0x800542 <rx_buffer+0x80>
   206ae:	30 91 43 05 	lds	r19, 0x0543	; 0x800543 <rx_buffer+0x81>
   206b2:	c9 01       	movw	r24, r18
   206b4:	01 96       	adiw	r24, 0x01	; 1
   206b6:	8f 77       	andi	r24, 0x7F	; 127
   206b8:	99 27       	eor	r25, r25
                    // if we should be storing the received character into the location
                    // just before the tail (meaning that the head would advance to the
                    // current location of the tail), we're about to overflow the buffer
                    // and so we don't write the character or advance the head.
                    if (i != rx_buffer.tail) {
   206ba:	60 91 44 05 	lds	r22, 0x0544	; 0x800544 <rx_buffer+0x82>
   206be:	70 91 45 05 	lds	r23, 0x0545	; 0x800545 <rx_buffer+0x83>
   206c2:	68 17       	cp	r22, r24
   206c4:	79 07       	cpc	r23, r25
   206c6:	d9 f6       	brne	.-74     	; 0x2067e <MarlinSerial::checkRx()+0x40>
					M_UDRx = c;
#endif //DEBUG_DUMP_TO_2ND_SERIAL
                }
            }
        }
    }
   206c8:	08 95       	ret

000206ca <Sound_DoSound_Alert(bool)>:

static void Sound_DoSound_Alert(bool bOnce)
{
uint8_t nI,nMax;

nMax=bOnce?1:3;
   206ca:	23 e0       	ldi	r18, 0x03	; 3
   206cc:	81 11       	cpse	r24, r1
   206ce:	21 e0       	ldi	r18, 0x01	; 1
for(nI=0;nI<nMax;nI++)
   206d0:	80 e0       	ldi	r24, 0x00	; 0
   206d2:	6b e1       	ldi	r22, 0x1B	; 27
   206d4:	73 e0       	ldi	r23, 0x03	; 3
   206d6:	4b ec       	ldi	r20, 0xCB	; 203
   206d8:	57 e0       	ldi	r21, 0x07	; 7
     {
     WRITE(BEEPER,HIGH);
   206da:	3f b7       	in	r19, 0x3f	; 63
   206dc:	f8 94       	cli
   206de:	90 91 02 01 	lds	r25, 0x0102	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   206e2:	94 60       	ori	r25, 0x04	; 4
   206e4:	90 93 02 01 	sts	0x0102, r25	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   206e8:	3f bf       	out	0x3f, r19	; 63
   206ea:	fb 01       	movw	r30, r22
   206ec:	31 97       	sbiw	r30, 0x01	; 1
   206ee:	f1 f7       	brne	.-4      	; 0x206ec <Sound_DoSound_Alert(bool)+0x22>
     delayMicroseconds(200);
     WRITE(BEEPER,LOW);
   206f0:	3f b7       	in	r19, 0x3f	; 63
   206f2:	f8 94       	cli
   206f4:	90 91 02 01 	lds	r25, 0x0102	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   206f8:	9b 7f       	andi	r25, 0xFB	; 251
   206fa:	90 93 02 01 	sts	0x0102, r25	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   206fe:	3f bf       	out	0x3f, r19	; 63
   20700:	fa 01       	movw	r30, r20
   20702:	31 97       	sbiw	r30, 0x01	; 1
   20704:	f1 f7       	brne	.-4      	; 0x20702 <Sound_DoSound_Alert(bool)+0x38>
static void Sound_DoSound_Alert(bool bOnce)
{
uint8_t nI,nMax;

nMax=bOnce?1:3;
for(nI=0;nI<nMax;nI++)
   20706:	8f 5f       	subi	r24, 0xFF	; 255
   20708:	82 13       	cpse	r24, r18
   2070a:	e7 cf       	rjmp	.-50     	; 0x206da <Sound_DoSound_Alert(bool)+0x10>
     WRITE(BEEPER,HIGH);
     delayMicroseconds(200);
     WRITE(BEEPER,LOW);
     delayMicroseconds(500);
     }
}
   2070c:	08 95       	ret

0002070e <Sound_DoSound_Echo()>:
     delayMicroseconds(75);
     }
}

static void Sound_DoSound_Echo(void)
{
   2070e:	8a e0       	ldi	r24, 0x0A	; 10
   20710:	2b e8       	ldi	r18, 0x8B	; 139
   20712:	31 e0       	ldi	r19, 0x01	; 1
uint8_t nI;

for(nI=0;nI<10;nI++)
     {
     WRITE(BEEPER,HIGH);
   20714:	4f b7       	in	r20, 0x3f	; 63
   20716:	f8 94       	cli
   20718:	90 91 02 01 	lds	r25, 0x0102	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   2071c:	94 60       	ori	r25, 0x04	; 4
   2071e:	90 93 02 01 	sts	0x0102, r25	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   20722:	4f bf       	out	0x3f, r20	; 63
   20724:	f9 01       	movw	r30, r18
   20726:	31 97       	sbiw	r30, 0x01	; 1
   20728:	f1 f7       	brne	.-4      	; 0x20726 <Sound_DoSound_Echo()+0x18>
     delayMicroseconds(100);
     WRITE(BEEPER,LOW);
   2072a:	4f b7       	in	r20, 0x3f	; 63
   2072c:	f8 94       	cli
   2072e:	90 91 02 01 	lds	r25, 0x0102	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   20732:	9b 7f       	andi	r25, 0xFB	; 251
   20734:	90 93 02 01 	sts	0x0102, r25	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   20738:	4f bf       	out	0x3f, r20	; 63
   2073a:	f9 01       	movw	r30, r18
   2073c:	31 97       	sbiw	r30, 0x01	; 1
   2073e:	f1 f7       	brne	.-4      	; 0x2073c <Sound_DoSound_Echo()+0x2e>
   20740:	81 50       	subi	r24, 0x01	; 1

static void Sound_DoSound_Echo(void)
{
uint8_t nI;

for(nI=0;nI<10;nI++)
   20742:	41 f7       	brne	.-48     	; 0x20714 <Sound_DoSound_Echo()+0x6>
     WRITE(BEEPER,HIGH);
     delayMicroseconds(100);
     WRITE(BEEPER,LOW);
     delayMicroseconds(100);
     }
}
   20744:	08 95       	ret

00020746 <modules::crc::CRC8::CCITT_updateCX(unsigned char, unsigned char)>:
    /// Compute/update CRC8 CCIIT from 8bits.
    /// Details: https://www.nongnu.org/avr-libc/user-manual/group__util__crc.html
    static uint8_t CCITT_update(uint8_t crc, uint8_t b);

    static constexpr uint8_t CCITT_updateCX(uint8_t crc, uint8_t b) {
        uint8_t data = crc ^ b;
   20746:	86 27       	eor	r24, r22
   20748:	98 e0       	ldi	r25, 0x08	; 8
        for (uint8_t i = 0; i < 8; i++) {
            if ((data & 0x80U) != 0) {
                data <<= 1U;
                data ^= 0x07U;
   2074a:	27 e0       	ldi	r18, 0x07	; 7
    static uint8_t CCITT_update(uint8_t crc, uint8_t b);

    static constexpr uint8_t CCITT_updateCX(uint8_t crc, uint8_t b) {
        uint8_t data = crc ^ b;
        for (uint8_t i = 0; i < 8; i++) {
            if ((data & 0x80U) != 0) {
   2074c:	38 2f       	mov	r19, r24
   2074e:	88 0f       	add	r24, r24
   20750:	37 fd       	sbrc	r19, 7
                data <<= 1U;
                data ^= 0x07U;
   20752:	82 27       	eor	r24, r18
   20754:	91 50       	subi	r25, 0x01	; 1
    /// Details: https://www.nongnu.org/avr-libc/user-manual/group__util__crc.html
    static uint8_t CCITT_update(uint8_t crc, uint8_t b);

    static constexpr uint8_t CCITT_updateCX(uint8_t crc, uint8_t b) {
        uint8_t data = crc ^ b;
        for (uint8_t i = 0; i < 8; i++) {
   20756:	d1 f7       	brne	.-12     	; 0x2074c <modules::crc::CRC8::CCITT_updateCX(unsigned char, unsigned char)+0x6>
            } else {
                data <<= 1U;
            }
        }
        return data;
    }
   20758:	08 95       	ret

0002075a <lcd_menu_temperatures_line(char const*, int)>:
#endif /* DEBUG_BUILD */

//! @brief common line print for lcd_menu_temperatures
//! @param [in] ipgmLabel pointer to string in PROGMEM
//! @param [in] value to be printed behind the label
static void lcd_menu_temperatures_line(const char *ipgmLabel, int value){
   2075a:	cf 93       	push	r28
   2075c:	df 93       	push	r29
   2075e:	cd b7       	in	r28, 0x3d	; 61
   20760:	de b7       	in	r29, 0x3e	; 62
   20762:	2f 97       	sbiw	r28, 0x0f	; 15
   20764:	0f b6       	in	r0, 0x3f	; 63
   20766:	f8 94       	cli
   20768:	de bf       	out	0x3e, r29	; 62
   2076a:	0f be       	out	0x3f, r0	; 63
   2076c:	cd bf       	out	0x3d, r28	; 61
   2076e:	fc 01       	movw	r30, r24
   20770:	de 01       	movw	r26, r28
   20772:	11 96       	adiw	r26, 0x01	; 1
//! it is better to reuse these texts even though it requires some extra formatting code.
//! @param [in] ipgmLabel pointer to string in PROGMEM
//! @param [out] pointer to string in RAM which will receive the formatted text. Must be allocated to appropriate size
//! @param [in] dstSize allocated length of dst
static void pgmtext_with_colon(const char *ipgmLabel, char *dst, uint8_t dstSize){
    uint8_t i = 0;
   20774:	90 e0       	ldi	r25, 0x00	; 0
   20776:	9d 01       	movw	r18, r26
    for(; i < dstSize - 2; ++i){ // 2 byte less than buffer, we'd be adding a ':' to the end
        uint8_t b = pgm_read_byte(ipgmLabel + i);
   20778:	84 91       	lpm	r24, Z
   2077a:	41 e0       	ldi	r20, 0x01	; 1
   2077c:	49 0f       	add	r20, r25
        if( ! b )
   2077e:	88 23       	and	r24, r24
   20780:	29 f0       	breq	.+10     	; 0x2078c <lcd_menu_temperatures_line(char const*, int)+0x32>
            break;
        dst[i] = b;
   20782:	8d 93       	st	X+, r24
   20784:	31 96       	adiw	r30, 0x01	; 1
   20786:	94 2f       	mov	r25, r20
//! @param [in] ipgmLabel pointer to string in PROGMEM
//! @param [out] pointer to string in RAM which will receive the formatted text. Must be allocated to appropriate size
//! @param [in] dstSize allocated length of dst
static void pgmtext_with_colon(const char *ipgmLabel, char *dst, uint8_t dstSize){
    uint8_t i = 0;
    for(; i < dstSize - 2; ++i){ // 2 byte less than buffer, we'd be adding a ':' to the end
   20788:	4d 30       	cpi	r20, 0x0D	; 13
   2078a:	b1 f7       	brne	.-20     	; 0x20778 <lcd_menu_temperatures_line(char const*, int)+0x1e>
        uint8_t b = pgm_read_byte(ipgmLabel + i);
        if( ! b )
            break;
        dst[i] = b;
    }
    dst[i] = ':';               // append the colon
   2078c:	f9 01       	movw	r30, r18
   2078e:	e9 0f       	add	r30, r25
   20790:	f1 1d       	adc	r31, r1
   20792:	8a e3       	ldi	r24, 0x3A	; 58
   20794:	80 83       	st	Z, r24
    ++i;
   20796:	9f 5f       	subi	r25, 0xFF	; 255
   20798:	f9 01       	movw	r30, r18
   2079a:	e9 0f       	add	r30, r25
   2079c:	f1 1d       	adc	r31, r1
    for(; i < dstSize - 1; ++i) // fill the rest with spaces
        dst[i] = ' ';
   2079e:	80 e2       	ldi	r24, 0x20	; 32
            break;
        dst[i] = b;
    }
    dst[i] = ':';               // append the colon
    ++i;
    for(; i < dstSize - 1; ++i) // fill the rest with spaces
   207a0:	9e 30       	cpi	r25, 0x0E	; 14
   207a2:	19 f0       	breq	.+6      	; 0x207aa <lcd_menu_temperatures_line(char const*, int)+0x50>
        dst[i] = ' ';
   207a4:	81 93       	st	Z+, r24
            break;
        dst[i] = b;
    }
    dst[i] = ':';               // append the colon
    ++i;
    for(; i < dstSize - 1; ++i) // fill the rest with spaces
   207a6:	9f 5f       	subi	r25, 0xFF	; 255
   207a8:	fb cf       	rjmp	.-10     	; 0x207a0 <lcd_menu_temperatures_line(char const*, int)+0x46>
        dst[i] = ' ';
    dst[dstSize-1] = '\0';      // terminate the string properly
   207aa:	1f 86       	std	Y+15, r1	; 0x0f
//! @param [in] value to be printed behind the label
static void lcd_menu_temperatures_line(const char *ipgmLabel, int value){
    static const size_t maxChars = 15;
    char tmp[maxChars];
    pgmtext_with_colon(ipgmLabel, tmp, maxChars);
    lcd_printf_P(PSTR(" %s%3d" LCD_STR_DEGREE " \n"), tmp, value); // no need to add -14.14 to string alignment
   207ac:	7f 93       	push	r23
   207ae:	6f 93       	push	r22
   207b0:	3f 93       	push	r19
   207b2:	2f 93       	push	r18
   207b4:	86 e1       	ldi	r24, 0x16	; 22
   207b6:	98 e9       	ldi	r25, 0x98	; 152
   207b8:	9f 93       	push	r25
   207ba:	8f 93       	push	r24
   207bc:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
   207c0:	0f 90       	pop	r0
   207c2:	0f 90       	pop	r0
   207c4:	0f 90       	pop	r0
   207c6:	0f 90       	pop	r0
   207c8:	0f 90       	pop	r0
   207ca:	0f 90       	pop	r0
}
   207cc:	2f 96       	adiw	r28, 0x0f	; 15
   207ce:	0f b6       	in	r0, 0x3f	; 63
   207d0:	f8 94       	cli
   207d2:	de bf       	out	0x3e, r29	; 62
   207d4:	0f be       	out	0x3f, r0	; 63
   207d6:	cd bf       	out	0x3d, r28	; 61
   207d8:	df 91       	pop	r29
   207da:	cf 91       	pop	r28
   207dc:	08 95       	ret

000207de <lcd_menu_extruder_info()>:
//! |                    |
//! |                    |
//! ----------------------
//! @endcode
void lcd_menu_extruder_info()                     // NOT static due to using inside "Marlin_main" module ("manage_inactivity()")
{
   207de:	df 92       	push	r13
   207e0:	ef 92       	push	r14
   207e2:	ff 92       	push	r15
   207e4:	0f 93       	push	r16
   207e6:	1f 93       	push	r17
   207e8:	cf 93       	push	r28
   207ea:	df 93       	push	r29
   207ec:	10 92 e3 03 	sts	0x03E3, r1	; 0x8003e3 <lcd_timeoutToStatus>

    lcd_timeoutToStatus.stop(); //infinite timeout
    lcd_home();
   207f0:	0e 94 1f 70 	call	0xe03e	; 0xe03e <lcd_home()>
	lcd_printf_P(PSTR("%-15.15S%-5d\n" "%-15.15S%-5d\n"), _T(MSG_HOTEND_FAN_SPEED), 60*fan_speed[0], _T(MSG_PRINT_FAN_SPEED), 60*fan_speed[1] );
   207f4:	c7 eb       	ldi	r28, 0xB7	; 183
   207f6:	d3 e0       	ldi	r29, 0x03	; 3
   207f8:	8a 81       	ldd	r24, Y+2	; 0x02
   207fa:	9b 81       	ldd	r25, Y+3	; 0x03
   207fc:	2c e3       	ldi	r18, 0x3C	; 60
   207fe:	f2 2e       	mov	r15, r18
   20800:	f8 9e       	mul	r15, r24
   20802:	80 01       	movw	r16, r0
   20804:	f9 9e       	mul	r15, r25
   20806:	10 0d       	add	r17, r0
   20808:	11 24       	eor	r1, r1
   2080a:	8d e0       	ldi	r24, 0x0D	; 13
   2080c:	9a e4       	ldi	r25, 0x4A	; 74
   2080e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   20812:	e8 2e       	mov	r14, r24
   20814:	d9 2e       	mov	r13, r25
   20816:	88 81       	ld	r24, Y
   20818:	99 81       	ldd	r25, Y+1	; 0x01
   2081a:	f8 9e       	mul	r15, r24
   2081c:	e0 01       	movw	r28, r0
   2081e:	f9 9e       	mul	r15, r25
   20820:	d0 0d       	add	r29, r0
   20822:	11 24       	eor	r1, r1
   20824:	8a e1       	ldi	r24, 0x1A	; 26
   20826:	9a e4       	ldi	r25, 0x4A	; 74
   20828:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   2082c:	1f 93       	push	r17
   2082e:	0f 93       	push	r16
   20830:	df 92       	push	r13
   20832:	ef 92       	push	r14
   20834:	df 93       	push	r29
   20836:	cf 93       	push	r28
   20838:	9f 93       	push	r25
   2083a:	8f 93       	push	r24
   2083c:	8c e8       	ldi	r24, 0x8C	; 140
   2083e:	97 e9       	ldi	r25, 0x97	; 151
   20840:	9f 93       	push	r25
   20842:	8f 93       	push	r24
   20844:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
    menu_back_if_clicked();
   20848:	8d b7       	in	r24, 0x3d	; 61
   2084a:	9e b7       	in	r25, 0x3e	; 62
   2084c:	0a 96       	adiw	r24, 0x0a	; 10
   2084e:	0f b6       	in	r0, 0x3f	; 63
   20850:	f8 94       	cli
   20852:	9e bf       	out	0x3e, r25	; 62
   20854:	0f be       	out	0x3f, r0	; 63
   20856:	8d bf       	out	0x3d, r24	; 61
}
   20858:	df 91       	pop	r29
   2085a:	cf 91       	pop	r28
   2085c:	1f 91       	pop	r17
   2085e:	0f 91       	pop	r16
   20860:	ff 90       	pop	r15
   20862:	ef 90       	pop	r14
   20864:	df 90       	pop	r13
{

    lcd_timeoutToStatus.stop(); //infinite timeout
    lcd_home();
	lcd_printf_P(PSTR("%-15.15S%-5d\n" "%-15.15S%-5d\n"), _T(MSG_HOTEND_FAN_SPEED), 60*fan_speed[0], _T(MSG_PRINT_FAN_SPEED), 60*fan_speed[1] );
    menu_back_if_clicked();
   20866:	0c 94 06 74 	jmp	0xe80c	; 0xe80c <menu_back_if_clicked()>

0002086a <lcd_menu_temperatures()>:
//! | PINDA:         000D|	MSG_PINDA c=14
//! ----------------------
//! D - Degree sysmbol		LCD_STR_DEGREE
//! @endcode
static void lcd_menu_temperatures()
{
   2086a:	cf 92       	push	r12
   2086c:	df 92       	push	r13
   2086e:	ef 92       	push	r14
   20870:	ff 92       	push	r15
   20872:	10 92 e3 03 	sts	0x03E3, r1	; 0x8003e3 <lcd_timeoutToStatus>
    lcd_timeoutToStatus.stop(); //infinite timeout
    lcd_home();
   20876:	0e 94 1f 70 	call	0xe03e	; 0xe03e <lcd_home()>
    lcd_menu_temperatures_line( _T(MSG_NOZZLE), (int)current_temperature[0] );
   2087a:	60 91 5a 0d 	lds	r22, 0x0D5A	; 0x800d5a <current_temperature>
   2087e:	70 91 5b 0d 	lds	r23, 0x0D5B	; 0x800d5b <current_temperature+0x1>
   20882:	80 91 5c 0d 	lds	r24, 0x0D5C	; 0x800d5c <current_temperature+0x2>
   20886:	90 91 5d 0d 	lds	r25, 0x0D5D	; 0x800d5d <current_temperature+0x3>
   2088a:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   2088e:	6b 01       	movw	r12, r22
   20890:	8c ed       	ldi	r24, 0xDC	; 220
   20892:	94 e4       	ldi	r25, 0x44	; 68
   20894:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   20898:	b6 01       	movw	r22, r12
   2089a:	0f 94 ad 03 	call	0x2075a	; 0x2075a <lcd_menu_temperatures_line(char const*, int)>
    lcd_menu_temperatures_line( _T(MSG_BED), (int)current_temperature_bed );
   2089e:	60 91 bc 03 	lds	r22, 0x03BC	; 0x8003bc <current_temperature_bed>
   208a2:	70 91 bd 03 	lds	r23, 0x03BD	; 0x8003bd <current_temperature_bed+0x1>
   208a6:	80 91 be 03 	lds	r24, 0x03BE	; 0x8003be <current_temperature_bed+0x2>
   208aa:	90 91 bf 03 	lds	r25, 0x03BF	; 0x8003bf <current_temperature_bed+0x3>
   208ae:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   208b2:	6b 01       	movw	r12, r22
   208b4:	81 ec       	ldi	r24, 0xC1	; 193
   208b6:	94 e4       	ldi	r25, 0x44	; 68
   208b8:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   208bc:	b6 01       	movw	r22, r12
   208be:	0f 94 ad 03 	call	0x2075a	; 0x2075a <lcd_menu_temperatures_line(char const*, int)>
#ifdef AMBIENT_THERMISTOR
    lcd_menu_temperatures_line( _T(MSG_AMBIENT), (int)current_temperature_ambient );
#endif //AMBIENT_THERMISTOR
#ifdef PINDA_THERMISTOR
    lcd_menu_temperatures_line(MSG_PINDA, (int)current_temperature_pinda );  ////MSG_PINDA
   208c2:	60 91 85 03 	lds	r22, 0x0385	; 0x800385 <current_temperature_pinda>
   208c6:	70 91 86 03 	lds	r23, 0x0386	; 0x800386 <current_temperature_pinda+0x1>
   208ca:	80 91 87 03 	lds	r24, 0x0387	; 0x800387 <current_temperature_pinda+0x2>
   208ce:	90 91 88 03 	lds	r25, 0x0388	; 0x800388 <current_temperature_pinda+0x3>
   208d2:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   208d6:	86 ed       	ldi	r24, 0xD6	; 214
   208d8:	97 e6       	ldi	r25, 0x67	; 103
   208da:	0f 94 ad 03 	call	0x2075a	; 0x2075a <lcd_menu_temperatures_line(char const*, int)>
#endif //PINDA_THERMISTOR
    menu_back_if_clicked();
}
   208de:	ff 90       	pop	r15
   208e0:	ef 90       	pop	r14
   208e2:	df 90       	pop	r13
   208e4:	cf 90       	pop	r12
    lcd_menu_temperatures_line( _T(MSG_AMBIENT), (int)current_temperature_ambient );
#endif //AMBIENT_THERMISTOR
#ifdef PINDA_THERMISTOR
    lcd_menu_temperatures_line(MSG_PINDA, (int)current_temperature_pinda );  ////MSG_PINDA
#endif //PINDA_THERMISTOR
    menu_back_if_clicked();
   208e6:	0c 94 06 74 	jmp	0xe80c	; 0xe80c <menu_back_if_clicked()>

000208ea <lcd_menu_AutoLoadFilament() [clone .lto_priv.394]>:
}

#if defined(FILAMENT_SENSOR) && !defined(REMOVE_AUTOLOAD_FILAMENT_MENU_ENTRY)
static void lcd_menu_AutoLoadFilament()
{
    lcd_display_message_fullscreen_nonBlocking_P(_T(MSG_AUTOLOADING_ENABLED));
   208ea:	8e e4       	ldi	r24, 0x4E	; 78
   208ec:	98 e5       	ldi	r25, 0x58	; 88
   208ee:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   208f2:	0e 94 1e e0 	call	0x1c03c	; 0x1c03c <lcd_display_message_fullscreen_nonBlocking_P(char const*) [clone .lto_priv.484]>
    menu_back_if_clicked();
   208f6:	0c 94 06 74 	jmp	0xe80c	; 0xe80c <menu_back_if_clicked()>

000208fa <shouldPreheatOnlyNozzle()>:
    }
}
#endif //MMU_HAS_CUTTER

bool shouldPreheatOnlyNozzle() {
    uint8_t eeprom_setting = eeprom_read_byte((uint8_t*)EEPROM_HEAT_BED_ON_LOAD_FILAMENT);
   208fa:	87 ea       	ldi	r24, 0xA7	; 167
   208fc:	9c e0       	ldi	r25, 0x0C	; 12
   208fe:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
    if (eeprom_setting != 0)
   20902:	81 11       	cpse	r24, r1
   20904:	05 c0       	rjmp	.+10     	; 0x20910 <shouldPreheatOnlyNozzle()+0x16>
        return false;

    switch(eFilamentAction) {
   20906:	80 91 94 03 	lds	r24, 0x0394	; 0x800394 <eFilamentAction>
   2090a:	81 50       	subi	r24, 0x01	; 1
   2090c:	88 30       	cpi	r24, 0x08	; 8
   2090e:	10 f0       	brcs	.+4      	; 0x20914 <shouldPreheatOnlyNozzle()+0x1a>
#endif //MMU_HAS_CUTTER

bool shouldPreheatOnlyNozzle() {
    uint8_t eeprom_setting = eeprom_read_byte((uint8_t*)EEPROM_HEAT_BED_ON_LOAD_FILAMENT);
    if (eeprom_setting != 0)
        return false;
   20910:	80 e0       	ldi	r24, 0x00	; 0
   20912:	08 95       	ret
        case FilamentAction::MmuLoad:
        case FilamentAction::MmuUnLoad:
        case FilamentAction::MmuLoadingTest:
        case FilamentAction::MmuEject:
        case FilamentAction::MmuCut:
            return true;
   20914:	81 e0       	ldi	r24, 0x01	; 1
        default:
            return false;
    }
}
   20916:	08 95       	ret

00020918 <lcd_menu_fails_stats_mmu_print()>:
//! | MMU fails       000|	MSG_MMU_FAILS c=15
//! | MMU load fails  000|	MSG_MMU_LOAD_FAILS c=15
//! |                    |
//! ----------------------
//! @endcode
static void lcd_menu_fails_stats_mmu_print() {
   20918:	cf 92       	push	r12
   2091a:	df 92       	push	r13
   2091c:	ef 92       	push	r14
   2091e:	ff 92       	push	r15
   20920:	0f 93       	push	r16
   20922:	1f 93       	push	r17
   20924:	cf 93       	push	r28
   20926:	df 93       	push	r29
   20928:	10 92 e3 03 	sts	0x03E3, r1	; 0x8003e3 <lcd_timeoutToStatus>
    lcd_timeoutToStatus.stop(); //infinite timeout
    lcd_home();
   2092c:	0e 94 1f 70 	call	0xe03e	; 0xe03e <lcd_home()>
             " %-16.16S%-3d\n"
             " %-16.16S%-3d"
        ),
        _T(MSG_LAST_PRINT_FAILURES),
        _T(MSG_MMU_FAILS), clamp999( eeprom_read_byte((uint8_t*)EEPROM_MMU_FAIL) ),
        _T(MSG_MMU_LOAD_FAILS), clamp999( eeprom_read_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL) ));
   20930:	8f ec       	ldi	r24, 0xCF	; 207
   20932:	9e e0       	ldi	r25, 0x0E	; 14
   20934:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
//! ----------------------
//! @endcode
static void lcd_menu_fails_stats_mmu_print() {
    lcd_timeoutToStatus.stop(); //infinite timeout
    lcd_home();
    lcd_printf_P(
   20938:	90 e0       	ldi	r25, 0x00	; 0
   2093a:	0e 94 34 ff 	call	0x1fe68	; 0x1fe68 <clamp999(unsigned int)>
   2093e:	d8 2e       	mov	r13, r24
   20940:	c9 2e       	mov	r12, r25
   20942:	80 ea       	ldi	r24, 0xA0	; 160
   20944:	96 e5       	ldi	r25, 0x56	; 86
   20946:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   2094a:	f8 2e       	mov	r15, r24
   2094c:	e9 2e       	mov	r14, r25
        PSTR("%S\n"
             " %-16.16S%-3d\n"
             " %-16.16S%-3d"
        ),
        _T(MSG_LAST_PRINT_FAILURES),
        _T(MSG_MMU_FAILS), clamp999( eeprom_read_byte((uint8_t*)EEPROM_MMU_FAIL) ),
   2094e:	82 ed       	ldi	r24, 0xD2	; 210
   20950:	9e e0       	ldi	r25, 0x0E	; 14
   20952:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
//! ----------------------
//! @endcode
static void lcd_menu_fails_stats_mmu_print() {
    lcd_timeoutToStatus.stop(); //infinite timeout
    lcd_home();
    lcd_printf_P(
   20956:	90 e0       	ldi	r25, 0x00	; 0
   20958:	0e 94 34 ff 	call	0x1fe68	; 0x1fe68 <clamp999(unsigned int)>
   2095c:	18 2f       	mov	r17, r24
   2095e:	09 2f       	mov	r16, r25
   20960:	84 e9       	ldi	r24, 0x94	; 148
   20962:	96 e5       	ldi	r25, 0x56	; 86
   20964:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   20968:	ec 01       	movw	r28, r24
   2096a:	86 ed       	ldi	r24, 0xD6	; 214
   2096c:	96 e5       	ldi	r25, 0x56	; 86
   2096e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   20972:	cf 92       	push	r12
   20974:	df 92       	push	r13
   20976:	ef 92       	push	r14
   20978:	ff 92       	push	r15
   2097a:	0f 93       	push	r16
   2097c:	1f 93       	push	r17
   2097e:	df 93       	push	r29
   20980:	cf 93       	push	r28
   20982:	9f 93       	push	r25
   20984:	8f 93       	push	r24
   20986:	87 ea       	ldi	r24, 0xA7	; 167
   20988:	97 e9       	ldi	r25, 0x97	; 151
   2098a:	9f 93       	push	r25
   2098c:	8f 93       	push	r24
   2098e:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
             " %-16.16S%-3d"
        ),
        _T(MSG_LAST_PRINT_FAILURES),
        _T(MSG_MMU_FAILS), clamp999( eeprom_read_byte((uint8_t*)EEPROM_MMU_FAIL) ),
        _T(MSG_MMU_LOAD_FAILS), clamp999( eeprom_read_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL) ));
    menu_back_if_clicked();
   20992:	8d b7       	in	r24, 0x3d	; 61
   20994:	9e b7       	in	r25, 0x3e	; 62
   20996:	0c 96       	adiw	r24, 0x0c	; 12
   20998:	0f b6       	in	r0, 0x3f	; 63
   2099a:	f8 94       	cli
   2099c:	9e bf       	out	0x3e, r25	; 62
   2099e:	0f be       	out	0x3f, r0	; 63
   209a0:	8d bf       	out	0x3d, r24	; 61
}
   209a2:	df 91       	pop	r29
   209a4:	cf 91       	pop	r28
   209a6:	1f 91       	pop	r17
   209a8:	0f 91       	pop	r16
   209aa:	ff 90       	pop	r15
   209ac:	ef 90       	pop	r14
   209ae:	df 90       	pop	r13
   209b0:	cf 90       	pop	r12
             " %-16.16S%-3d"
        ),
        _T(MSG_LAST_PRINT_FAILURES),
        _T(MSG_MMU_FAILS), clamp999( eeprom_read_byte((uint8_t*)EEPROM_MMU_FAIL) ),
        _T(MSG_MMU_LOAD_FAILS), clamp999( eeprom_read_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL) ));
    menu_back_if_clicked();
   209b2:	0c 94 06 74 	jmp	0xe80c	; 0xe80c <menu_back_if_clicked()>

000209b6 <lcd_menu_fails_stats_mmu() [clone .lto_priv.396]>:
//! | Material changes   |  MSG_MATERIAL_CHANGES c=18
//! ----------------------
//! @endcode
static void lcd_menu_fails_stats_mmu()
{
	MENU_BEGIN();
   209b6:	0e 94 0c 74 	call	0xe818	; 0xe818 <menu_start()>
   209ba:	10 92 60 04 	sts	0x0460, r1	; 0x800460 <menu_row>
   209be:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   209c2:	84 30       	cpi	r24, 0x04	; 4
   209c4:	68 f5       	brcc	.+90     	; 0x20a20 <lcd_menu_fails_stats_mmu() [clone .lto_priv.396]+0x6a>
   209c6:	10 92 63 04 	sts	0x0463, r1	; 0x800463 <menu_item>
	MENU_ITEM_BACK_P(_T(MSG_MAIN));
   209ca:	8f ed       	ldi	r24, 0xDF	; 223
   209cc:	98 e4       	ldi	r25, 0x48	; 72
   209ce:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   209d2:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
	MENU_ITEM_SUBMENU_P(_T(MSG_LAST_PRINT), lcd_menu_fails_stats_mmu_print);
   209d6:	87 e8       	ldi	r24, 0x87	; 135
   209d8:	96 e5       	ldi	r25, 0x56	; 86
   209da:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   209de:	68 e3       	ldi	r22, 0x38	; 56
   209e0:	77 e3       	ldi	r23, 0x37	; 55
   209e2:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
	MENU_ITEM_SUBMENU_P(_T(MSG_TOTAL), lcd_menu_fails_stats_mmu_total);
   209e6:	8f e7       	ldi	r24, 0x7F	; 127
   209e8:	96 e5       	ldi	r25, 0x56	; 86
   209ea:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   209ee:	66 ef       	ldi	r22, 0xF6	; 246
   209f0:	76 e3       	ldi	r23, 0x36	; 54
   209f2:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
	MENU_ITEM_SUBMENU_P(_T(MSG_MATERIAL_CHANGES), lcd_menu_toolchange_stats_mmu_total);
   209f6:	83 ec       	ldi	r24, 0xC3	; 195
   209f8:	96 e5       	ldi	r25, 0x56	; 86
   209fa:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   209fe:	64 ef       	ldi	r22, 0xF4	; 244
   20a00:	77 e3       	ldi	r23, 0x37	; 55
   20a02:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
	MENU_END();
   20a06:	0e 94 83 62 	call	0xc506	; 0xc506 <menu_end()>
//! | Material changes   |  MSG_MATERIAL_CHANGES c=18
//! ----------------------
//! @endcode
static void lcd_menu_fails_stats_mmu()
{
	MENU_BEGIN();
   20a0a:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   20a0e:	8f 5f       	subi	r24, 0xFF	; 255
   20a10:	80 93 60 04 	sts	0x0460, r24	; 0x800460 <menu_row>
   20a14:	80 91 62 04 	lds	r24, 0x0462	; 0x800462 <menu_line>
   20a18:	8f 5f       	subi	r24, 0xFF	; 255
   20a1a:	80 93 62 04 	sts	0x0462, r24	; 0x800462 <menu_line>
   20a1e:	cf cf       	rjmp	.-98     	; 0x209be <lcd_menu_fails_stats_mmu() [clone .lto_priv.396]+0x8>
	MENU_ITEM_BACK_P(_T(MSG_MAIN));
	MENU_ITEM_SUBMENU_P(_T(MSG_LAST_PRINT), lcd_menu_fails_stats_mmu_print);
	MENU_ITEM_SUBMENU_P(_T(MSG_TOTAL), lcd_menu_fails_stats_mmu_total);
	MENU_ITEM_SUBMENU_P(_T(MSG_MATERIAL_CHANGES), lcd_menu_toolchange_stats_mmu_total);
	MENU_END();
}
   20a20:	08 95       	ret

00020a22 <mFilamentResetMenuStack()>:
    setFilamentAction(FilamentAction::None);
}

/// Reset the menu stack and clear the planned filament action flag
static void __attribute__((noinline)) mFilamentResetMenuStack() {
    menu_back(bFilamentPreheatState ? 1 : 2);
   20a22:	80 91 15 06 	lds	r24, 0x0615	; 0x800615 <bFilamentPreheatState>
   20a26:	81 11       	cpse	r24, r1
   20a28:	03 c0       	rjmp	.+6      	; 0x20a30 <mFilamentResetMenuStack()+0xe>
   20a2a:	82 e0       	ldi	r24, 0x02	; 2
   20a2c:	0c 94 ff 62 	jmp	0xc5fe	; 0xc5fe <menu_back(unsigned char)>
   20a30:	81 e0       	ldi	r24, 0x01	; 1
   20a32:	fc cf       	rjmp	.-8      	; 0x20a2c <mFilamentResetMenuStack()+0xa>

00020a34 <lcd_cutter_enabled() [clone .lto_priv.398]>:
}

#ifdef MMU_HAS_CUTTER
void lcd_cutter_enabled()
{
    if (EEPROM_MMU_CUTTER_ENABLED_enabled == eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED))
   20a34:	8e ec       	ldi	r24, 0xCE	; 206
   20a36:	9e e0       	ldi	r25, 0x0E	; 14
   20a38:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   20a3c:	60 e0       	ldi	r22, 0x00	; 0
   20a3e:	81 30       	cpi	r24, 0x01	; 1
   20a40:	09 f0       	breq	.+2      	; 0x20a44 <lcd_cutter_enabled() [clone .lto_priv.398]+0x10>
   20a42:	61 e0       	ldi	r22, 0x01	; 1
   20a44:	8e ec       	ldi	r24, 0xCE	; 206
   20a46:	9e e0       	ldi	r25, 0x0E	; 14
   20a48:	0d 94 04 a4 	jmp	0x34808	; 0x34808 <eeprom_update_byte>

00020a4c <lcd_set_fan_check() [clone .lto_priv.397]>:

  MENU_END();
}

void lcd_set_fan_check() {
	fans_check_enabled = !fans_check_enabled;
   20a4c:	60 91 40 02 	lds	r22, 0x0240	; 0x800240 <fans_check_enabled>
   20a50:	81 e0       	ldi	r24, 0x01	; 1
   20a52:	68 27       	eor	r22, r24
   20a54:	60 93 40 02 	sts	0x0240, r22	; 0x800240 <fans_check_enabled>
   20a58:	87 e8       	ldi	r24, 0x87	; 135
   20a5a:	9f e0       	ldi	r25, 0x0F	; 15
   20a5c:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
	eeprom_update_byte_notify((unsigned char *)EEPROM_FAN_CHECK_ENABLED, fans_check_enabled);
#ifdef FANCHECK
	if (fans_check_enabled == false) fan_check_error = EFCE_OK; //reset error if fanCheck is disabled during error. Allows resuming print.
   20a60:	80 91 40 02 	lds	r24, 0x0240	; 0x800240 <fans_check_enabled>
   20a64:	81 11       	cpse	r24, r1
   20a66:	02 c0       	rjmp	.+4      	; 0x20a6c <lcd_set_fan_check() [clone .lto_priv.397]+0x20>
   20a68:	10 92 ce 03 	sts	0x03CE, r1	; 0x8003ce <fan_check_error>
#endif //FANCHECK
}
   20a6c:	08 95       	ret

00020a6e <SpoolJoin::SpoolJoin::toggleSpoolJoin()>:
    }
}

void SpoolJoin::toggleSpoolJoin()
{
    if (eeprom_read_byte((uint8_t*)EEPROM_SPOOL_JOIN) == (uint8_t)EEPROM::Disabled)
   20a6e:	86 ed       	ldi	r24, 0xD6	; 214
   20a70:	9e e0       	ldi	r25, 0x0E	; 14
   20a72:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   20a76:	61 e0       	ldi	r22, 0x01	; 1
   20a78:	82 30       	cpi	r24, 0x02	; 2
   20a7a:	09 f0       	breq	.+2      	; 0x20a7e <SpoolJoin::SpoolJoin::toggleSpoolJoin()+0x10>
   20a7c:	62 e0       	ldi	r22, 0x02	; 2
   20a7e:	86 ed       	ldi	r24, 0xD6	; 214
   20a80:	9e e0       	ldi	r25, 0x0E	; 14
   20a82:	0d 94 04 a4 	jmp	0x34808	; 0x34808 <eeprom_update_byte>

00020a86 <lcd_serial_dump()>:
#ifdef MENU_SERIAL_DUMP
#include "Dcodes.h"

static void lcd_serial_dump()
{
    serial_dump_and_reset(dump_crash_reason::manual);
   20a86:	80 e0       	ldi	r24, 0x00	; 0
   20a88:	0c 94 79 86 	jmp	0x10cf2	; 0x10cf2 <serial_dump_and_reset(dump_crash_reason)>

00020a8c <lcd_support_menu() [clone .lto_priv.389]>:
//! | Debug              |	c=18
//! @endcode
//! ----------------------
//! @endcode
static void lcd_support_menu()
{
   20a8c:	ef 92       	push	r14
   20a8e:	ff 92       	push	r15
   20a90:	0f 93       	push	r16
   20a92:	1f 93       	push	r17
   20a94:	cf 93       	push	r28
   20a96:	df 93       	push	r29
		uint32_t ip;                   // 4bytes
		char ip_str[IP4_STR_SIZE];     // 16bytes
	} _menu_data_t;
    static_assert(sizeof(menu_data)>= sizeof(_menu_data_t),"_menu_data_t doesn't fit into menu_data");
	_menu_data_t* _md = (_menu_data_t*)&(menu_data[0]);
    if (_md->status == 0 || lcd_draw_update == 2)
   20a98:	80 91 96 03 	lds	r24, 0x0396	; 0x800396 <menu_data>
   20a9c:	88 23       	and	r24, r24
   20a9e:	29 f0       	breq	.+10     	; 0x20aaa <lcd_support_menu() [clone .lto_priv.389]+0x1e>
   20aa0:	90 91 59 02 	lds	r25, 0x0259	; 0x800259 <lcd_draw_update>
   20aa4:	92 30       	cpi	r25, 0x02	; 2
   20aa6:	09 f0       	breq	.+2      	; 0x20aaa <lcd_support_menu() [clone .lto_priv.389]+0x1e>
   20aa8:	74 c1       	rjmp	.+744    	; 0x20d92 <lcd_support_menu() [clone .lto_priv.389]+0x306>
	{
        // Menu was entered or SD card status has changed (plugged in or removed).
        // Initialize its status.
        _md->status = 1;
   20aaa:	81 e0       	ldi	r24, 0x01	; 1
   20aac:	80 93 96 03 	sts	0x0396, r24	; 0x800396 <menu_data>
   20ab0:	80 91 48 16 	lds	r24, 0x1648	; 0x801648 <card+0x273>
        _md->is_flash_air = card.ToshibaFlashAir_isEnabled();
   20ab4:	80 93 97 03 	sts	0x0397, r24	; 0x800397 <menu_data+0x1>
        if (_md->is_flash_air) {
   20ab8:	88 23       	and	r24, r24
   20aba:	21 f0       	breq	.+8      	; 0x20ac4 <lcd_support_menu() [clone .lto_priv.389]+0x38>
            card.ToshibaFlashAir_GetIP((uint8_t*)(&_md->ip)); // ip == 0 if it failed
   20abc:	88 e9       	ldi	r24, 0x98	; 152
   20abe:	93 e0       	ldi	r25, 0x03	; 3
   20ac0:	0f 94 77 78 	call	0x2f0ee	; 0x2f0ee <CardReader::ToshibaFlashAir_GetIP(unsigned char*) [clone .constprop.147]>
    {
        // Waiting for the FlashAir card to get an IP address from a router. Force an update.
        _md->status = 0;
    }

  MENU_BEGIN();
   20ac4:	0e 94 0c 74 	call	0xe818	; 0xe818 <menu_start()>
   20ac8:	10 92 60 04 	sts	0x0460, r1	; 0x800460 <menu_row>
		if (((menu_item - 1) == menu_line) && lcd_draw_update)
		{
			lcd_set_cursor(6, menu_row);
			MMU2::Version mmu_version = MMU2::mmu2.GetMMUFWVersion();
			if (mmu_version.major > 0)
				lcd_printf_P(PSTR("%d.%d.%d"), mmu_version.major, mmu_version.minor, mmu_version.build);
   20acc:	81 e5       	ldi	r24, 0x51	; 81
   20ace:	e8 2e       	mov	r14, r24
   20ad0:	88 e9       	ldi	r24, 0x98	; 152
   20ad2:	f8 2e       	mov	r15, r24
    }
}

void ip4_to_str(char* dest, uint8_t* IP)
{
    sprintf_P(dest, PSTR("%u.%u.%u.%u"), IP[0], IP[1], IP[2], IP[3]);
   20ad4:	c0 e2       	ldi	r28, 0x20	; 32
   20ad6:	d8 e9       	ldi	r29, 0x98	; 152
   20ad8:	0c e9       	ldi	r16, 0x9C	; 156
   20ada:	13 e0       	ldi	r17, 0x03	; 3
    {
        // Waiting for the FlashAir card to get an IP address from a router. Force an update.
        _md->status = 0;
    }

  MENU_BEGIN();
   20adc:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   20ae0:	84 30       	cpi	r24, 0x04	; 4
   20ae2:	08 f0       	brcs	.+2      	; 0x20ae6 <lcd_support_menu() [clone .lto_priv.389]+0x5a>
   20ae4:	7d c1       	rjmp	.+762    	; 0x20de0 <lcd_support_menu() [clone .lto_priv.389]+0x354>
   20ae6:	10 92 63 04 	sts	0x0463, r1	; 0x800463 <menu_item>

  MENU_ITEM_BACK_P(_T(MSG_MAIN));
   20aea:	8f ed       	ldi	r24, 0xDF	; 223
   20aec:	98 e4       	ldi	r25, 0x48	; 72
   20aee:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   20af2:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>

  MENU_ITEM_BACK_P(PSTR("Firmware:"));
   20af6:	84 eb       	ldi	r24, 0xB4	; 180
   20af8:	98 e9       	ldi	r25, 0x98	; 152
   20afa:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
  MENU_ITEM_BACK_P(PSTR(" " FW_VERSION_FULL));
   20afe:	87 ea       	ldi	r24, 0xA7	; 167
   20b00:	98 e9       	ldi	r25, 0x98	; 152
   20b02:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
  MENU_ITEM_BACK_P(PSTR(" Repo:" FW_REPOSITORY));
   20b06:	89 e9       	ldi	r24, 0x99	; 153
   20b08:	98 e9       	ldi	r25, 0x98	; 152
   20b0a:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
  MENU_ITEM_BACK_P(PSTR(" Hash:" FW_COMMIT_HASH));
   20b0e:	89 e8       	ldi	r24, 0x89	; 137
   20b10:	98 e9       	ldi	r25, 0x98	; 152
   20b12:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
  MENU_ITEM_BACK_P(_n("prusa3d.com"));////MSG_PRUSA3D c=18
   20b16:	8c e0       	ldi	r24, 0x0C	; 12
   20b18:	9b e6       	ldi	r25, 0x6B	; 107
   20b1a:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
  MENU_ITEM_BACK_P(_n("forum.prusa3d.com"));////MSG_PRUSA3D_FORUM c=18
   20b1e:	8a ef       	ldi	r24, 0xFA	; 250
   20b20:	9a e6       	ldi	r25, 0x6A	; 106
   20b22:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
  MENU_ITEM_BACK_P(_n("help.prusa3d.com"));////MSG_PRUSA3D_HELP c=18
   20b26:	89 ee       	ldi	r24, 0xE9	; 233
   20b28:	9a e6       	ldi	r25, 0x6A	; 106
   20b2a:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
  MENU_ITEM_BACK_P(STR_SEPARATOR);
   20b2e:	81 e0       	ldi	r24, 0x01	; 1
   20b30:	94 e8       	ldi	r25, 0x84	; 132
   20b32:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
  MENU_ITEM_BACK_P(PSTR(FILAMENT_SIZE));
   20b36:	8d e7       	ldi	r24, 0x7D	; 125
   20b38:	98 e9       	ldi	r25, 0x98	; 152
   20b3a:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
  MENU_ITEM_BACK_P(PSTR(ELECTRONICS));
   20b3e:	84 e7       	ldi	r24, 0x74	; 116
   20b40:	98 e9       	ldi	r25, 0x98	; 152
   20b42:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
  MENU_ITEM_BACK_P(PSTR(NOZZLE_TYPE));
   20b46:	8a e6       	ldi	r24, 0x6A	; 106
   20b48:	98 e9       	ldi	r25, 0x98	; 152
   20b4a:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
  MENU_ITEM_BACK_P(STR_SEPARATOR);
   20b4e:	81 e0       	ldi	r24, 0x01	; 1
   20b50:	94 e8       	ldi	r25, 0x84	; 132
   20b52:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
  MENU_ITEM_BACK_P(_T(MSG_DATE));
   20b56:	89 e7       	ldi	r24, 0x79	; 121
   20b58:	97 e5       	ldi	r25, 0x57	; 87
   20b5a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   20b5e:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
  MENU_ITEM_BACK_P(PSTR(SOURCE_DATE_EPOCH));
   20b62:	8f e5       	ldi	r24, 0x5F	; 95
   20b64:	98 e9       	ldi	r25, 0x98	; 152
   20b66:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
  MENU_ITEM_BACK_P(STR_SEPARATOR);
  MENU_ITEM_BACK_P(PSTR("Fil. sensor v.:"));
  MENU_ITEM_BACK_P(fsensor.getIRVersionText());
#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)

	MENU_ITEM_BACK_P(STR_SEPARATOR);
   20b6a:	81 e0       	ldi	r24, 0x01	; 1
   20b6c:	94 e8       	ldi	r25, 0x84	; 132
   20b6e:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
	if (MMU2::mmu2.Enabled())
   20b72:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   20b76:	81 30       	cpi	r24, 0x01	; 1
   20b78:	09 f0       	breq	.+2      	; 0x20b7c <lcd_support_menu() [clone .lto_priv.389]+0xf0>
   20b7a:	2d c1       	rjmp	.+602    	; 0x20dd6 <lcd_support_menu() [clone .lto_priv.389]+0x34a>
	{
		MENU_ITEM_BACK_P(_T(MSG_MMU_CONNECTED));
   20b7c:	89 e6       	ldi	r24, 0x69	; 105
   20b7e:	97 e5       	ldi	r25, 0x57	; 87
   20b80:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   20b84:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
		MENU_ITEM_BACK_P(PSTR(" FW:"));  ////c=17
   20b88:	8a e5       	ldi	r24, 0x5A	; 90
   20b8a:	98 e9       	ldi	r25, 0x98	; 152
   20b8c:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
		if (((menu_item - 1) == menu_line) && lcd_draw_update)
   20b90:	80 91 63 04 	lds	r24, 0x0463	; 0x800463 <menu_item>
   20b94:	81 50       	subi	r24, 0x01	; 1
   20b96:	99 0b       	sbc	r25, r25
   20b98:	20 91 62 04 	lds	r18, 0x0462	; 0x800462 <menu_line>
   20b9c:	28 17       	cp	r18, r24
   20b9e:	19 06       	cpc	r1, r25
   20ba0:	49 f5       	brne	.+82     	; 0x20bf4 <lcd_support_menu() [clone .lto_priv.389]+0x168>
   20ba2:	80 91 59 02 	lds	r24, 0x0259	; 0x800259 <lcd_draw_update>
   20ba6:	88 23       	and	r24, r24
   20ba8:	29 f1       	breq	.+74     	; 0x20bf4 <lcd_support_menu() [clone .lto_priv.389]+0x168>
		{
			lcd_set_cursor(6, menu_row);
   20baa:	60 91 60 04 	lds	r22, 0x0460	; 0x800460 <menu_row>
   20bae:	86 e0       	ldi	r24, 0x06	; 6
   20bb0:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
    inline ErrorCode GetLastErrorCode() const { return lastErrorCode; }

    /// @returns the version of the connected MMU FW.
    /// In the future we'll return the trully detected FW version
    Version GetMMUFWVersion() const {
        if (State() == xState::Active) {
   20bb4:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   20bb8:	81 30       	cpi	r24, 0x01	; 1
   20bba:	09 f0       	breq	.+2      	; 0x20bbe <lcd_support_menu() [clone .lto_priv.389]+0x132>
   20bbc:	05 c1       	rjmp	.+522    	; 0x20dc8 <lcd_support_menu() [clone .lto_priv.389]+0x33c>
   20bbe:	80 91 e1 12 	lds	r24, 0x12E1	; 0x8012e1 <MMU2::mmu2+0x4f>
   20bc2:	90 91 e2 12 	lds	r25, 0x12E2	; 0x8012e2 <MMU2::mmu2+0x50>
   20bc6:	20 91 e3 12 	lds	r18, 0x12E3	; 0x8012e3 <MMU2::mmu2+0x51>
			MMU2::Version mmu_version = MMU2::mmu2.GetMMUFWVersion();
			if (mmu_version.major > 0)
   20bca:	88 23       	and	r24, r24
   20bcc:	09 f4       	brne	.+2      	; 0x20bd0 <lcd_support_menu() [clone .lto_priv.389]+0x144>
   20bce:	fc c0       	rjmp	.+504    	; 0x20dc8 <lcd_support_menu() [clone .lto_priv.389]+0x33c>
				lcd_printf_P(PSTR("%d.%d.%d"), mmu_version.major, mmu_version.minor, mmu_version.build);
   20bd0:	1f 92       	push	r1
   20bd2:	2f 93       	push	r18
   20bd4:	1f 92       	push	r1
   20bd6:	9f 93       	push	r25
   20bd8:	1f 92       	push	r1
   20bda:	8f 93       	push	r24
   20bdc:	ff 92       	push	r15
   20bde:	ef 92       	push	r14
   20be0:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
   20be4:	8d b7       	in	r24, 0x3d	; 61
   20be6:	9e b7       	in	r25, 0x3e	; 62
   20be8:	08 96       	adiw	r24, 0x08	; 8
   20bea:	0f b6       	in	r0, 0x3f	; 63
   20bec:	f8 94       	cli
   20bee:	9e bf       	out	0x3e, r25	; 62
   20bf0:	0f be       	out	0x3f, r0	; 63
   20bf2:	8d bf       	out	0x3d, r24	; 61
	else
		MENU_ITEM_BACK_P(PSTR("MMU        N/A"));


  // Show the FlashAir IP address, if the card is available.
  if (_md->is_flash_air) {
   20bf4:	80 91 97 03 	lds	r24, 0x0397	; 0x800397 <menu_data+0x1>
   20bf8:	88 23       	and	r24, r24
   20bfa:	09 f4       	brne	.+2      	; 0x20bfe <lcd_support_menu() [clone .lto_priv.389]+0x172>
   20bfc:	40 c0       	rjmp	.+128    	; 0x20c7e <lcd_support_menu() [clone .lto_priv.389]+0x1f2>
      MENU_ITEM_BACK_P(STR_SEPARATOR);
   20bfe:	81 e0       	ldi	r24, 0x01	; 1
   20c00:	94 e8       	ldi	r25, 0x84	; 132
   20c02:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
      MENU_ITEM_BACK_P(PSTR("FlashAir IP Addr:"));  ////MSG_FLASHAIR c=18
   20c06:	80 e3       	ldi	r24, 0x30	; 48
   20c08:	98 e9       	ldi	r25, 0x98	; 152
   20c0a:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
      MENU_ITEM_BACK_P(PSTR(" "));
   20c0e:	8e e2       	ldi	r24, 0x2E	; 46
   20c10:	98 e9       	ldi	r25, 0x98	; 152
   20c12:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
      if (((menu_item - 1) == menu_line) && lcd_draw_update) {
   20c16:	80 91 63 04 	lds	r24, 0x0463	; 0x800463 <menu_item>
   20c1a:	81 50       	subi	r24, 0x01	; 1
   20c1c:	99 0b       	sbc	r25, r25
   20c1e:	20 91 62 04 	lds	r18, 0x0462	; 0x800462 <menu_line>
   20c22:	28 17       	cp	r18, r24
   20c24:	19 06       	cpc	r1, r25
   20c26:	59 f5       	brne	.+86     	; 0x20c7e <lcd_support_menu() [clone .lto_priv.389]+0x1f2>
   20c28:	80 91 59 02 	lds	r24, 0x0259	; 0x800259 <lcd_draw_update>
   20c2c:	88 23       	and	r24, r24
   20c2e:	39 f1       	breq	.+78     	; 0x20c7e <lcd_support_menu() [clone .lto_priv.389]+0x1f2>
          lcd_set_cursor(2, menu_row);
   20c30:	60 91 60 04 	lds	r22, 0x0460	; 0x800460 <menu_row>
   20c34:	82 e0       	ldi	r24, 0x02	; 2
   20c36:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
   20c3a:	80 91 9b 03 	lds	r24, 0x039B	; 0x80039b <menu_data+0x5>
   20c3e:	1f 92       	push	r1
   20c40:	8f 93       	push	r24
   20c42:	80 91 9a 03 	lds	r24, 0x039A	; 0x80039a <menu_data+0x4>
   20c46:	1f 92       	push	r1
   20c48:	8f 93       	push	r24
   20c4a:	80 91 99 03 	lds	r24, 0x0399	; 0x800399 <menu_data+0x3>
   20c4e:	1f 92       	push	r1
   20c50:	8f 93       	push	r24
   20c52:	80 91 98 03 	lds	r24, 0x0398	; 0x800398 <menu_data+0x2>
   20c56:	1f 92       	push	r1
   20c58:	8f 93       	push	r24
   20c5a:	df 93       	push	r29
   20c5c:	cf 93       	push	r28
   20c5e:	1f 93       	push	r17
   20c60:	0f 93       	push	r16
   20c62:	0f 94 f7 a2 	call	0x345ee	; 0x345ee <sprintf_P>
          ip4_to_str(_md->ip_str, (uint8_t*)(&_md->ip));
          lcd_print(_md->ip_str);
   20c66:	8c e9       	ldi	r24, 0x9C	; 156
   20c68:	93 e0       	ldi	r25, 0x03	; 3
   20c6a:	0e 94 5f 73 	call	0xe6be	; 0xe6be <lcd_print(char const*)>
   20c6e:	8d b7       	in	r24, 0x3d	; 61
   20c70:	9e b7       	in	r25, 0x3e	; 62
   20c72:	0c 96       	adiw	r24, 0x0c	; 12
   20c74:	0f b6       	in	r0, 0x3f	; 63
   20c76:	f8 94       	cli
   20c78:	9e bf       	out	0x3e, r25	; 62
   20c7a:	0f be       	out	0x3f, r0	; 63
   20c7c:	8d bf       	out	0x3d, r24	; 61
      }
  }

  // Show the printer IP address, if it is available.
  if (IP_address) {
   20c7e:	80 91 10 06 	lds	r24, 0x0610	; 0x800610 <IP_address>
   20c82:	90 91 11 06 	lds	r25, 0x0611	; 0x800611 <IP_address+0x1>
   20c86:	a0 91 12 06 	lds	r26, 0x0612	; 0x800612 <IP_address+0x2>
   20c8a:	b0 91 13 06 	lds	r27, 0x0613	; 0x800613 <IP_address+0x3>
   20c8e:	89 2b       	or	r24, r25
   20c90:	8a 2b       	or	r24, r26
   20c92:	8b 2b       	or	r24, r27
   20c94:	09 f4       	brne	.+2      	; 0x20c98 <lcd_support_menu() [clone .lto_priv.389]+0x20c>
   20c96:	42 c0       	rjmp	.+132    	; 0x20d1c <lcd_support_menu() [clone .lto_priv.389]+0x290>

      MENU_ITEM_BACK_P(STR_SEPARATOR);
   20c98:	81 e0       	ldi	r24, 0x01	; 1
   20c9a:	94 e8       	ldi	r25, 0x84	; 132
   20c9c:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
      MENU_ITEM_BACK_P(_T(MSG_PRINTER_IP));
   20ca0:	8c e4       	ldi	r24, 0x4C	; 76
   20ca2:	97 e5       	ldi	r25, 0x57	; 87
   20ca4:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   20ca8:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
      MENU_ITEM_BACK_P(PSTR(" "));
   20cac:	8c e2       	ldi	r24, 0x2C	; 44
   20cae:	98 e9       	ldi	r25, 0x98	; 152
   20cb0:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
      if (((menu_item - 1) == menu_line) && lcd_draw_update) {
   20cb4:	80 91 63 04 	lds	r24, 0x0463	; 0x800463 <menu_item>
   20cb8:	81 50       	subi	r24, 0x01	; 1
   20cba:	99 0b       	sbc	r25, r25
   20cbc:	20 91 62 04 	lds	r18, 0x0462	; 0x800462 <menu_line>
   20cc0:	28 17       	cp	r18, r24
   20cc2:	19 06       	cpc	r1, r25
   20cc4:	59 f5       	brne	.+86     	; 0x20d1c <lcd_support_menu() [clone .lto_priv.389]+0x290>
   20cc6:	80 91 59 02 	lds	r24, 0x0259	; 0x800259 <lcd_draw_update>
   20cca:	88 23       	and	r24, r24
   20ccc:	39 f1       	breq	.+78     	; 0x20d1c <lcd_support_menu() [clone .lto_priv.389]+0x290>
          lcd_set_cursor(2, menu_row);
   20cce:	60 91 60 04 	lds	r22, 0x0460	; 0x800460 <menu_row>
   20cd2:	82 e0       	ldi	r24, 0x02	; 2
   20cd4:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
   20cd8:	80 91 13 06 	lds	r24, 0x0613	; 0x800613 <IP_address+0x3>
   20cdc:	1f 92       	push	r1
   20cde:	8f 93       	push	r24
   20ce0:	80 91 12 06 	lds	r24, 0x0612	; 0x800612 <IP_address+0x2>
   20ce4:	1f 92       	push	r1
   20ce6:	8f 93       	push	r24
   20ce8:	80 91 11 06 	lds	r24, 0x0611	; 0x800611 <IP_address+0x1>
   20cec:	1f 92       	push	r1
   20cee:	8f 93       	push	r24
   20cf0:	80 91 10 06 	lds	r24, 0x0610	; 0x800610 <IP_address>
   20cf4:	1f 92       	push	r1
   20cf6:	8f 93       	push	r24
   20cf8:	df 93       	push	r29
   20cfa:	cf 93       	push	r28
   20cfc:	1f 93       	push	r17
   20cfe:	0f 93       	push	r16
   20d00:	0f 94 f7 a2 	call	0x345ee	; 0x345ee <sprintf_P>
          ip4_to_str(_md->ip_str, (uint8_t*)(&IP_address));
          lcd_print(_md->ip_str);
   20d04:	8c e9       	ldi	r24, 0x9C	; 156
   20d06:	93 e0       	ldi	r25, 0x03	; 3
   20d08:	0e 94 5f 73 	call	0xe6be	; 0xe6be <lcd_print(char const*)>
   20d0c:	8d b7       	in	r24, 0x3d	; 61
   20d0e:	9e b7       	in	r25, 0x3e	; 62
   20d10:	0c 96       	adiw	r24, 0x0c	; 12
   20d12:	0f b6       	in	r0, 0x3f	; 63
   20d14:	f8 94       	cli
   20d16:	9e bf       	out	0x3e, r25	; 62
   20d18:	0f be       	out	0x3f, r0	; 63
   20d1a:	8d bf       	out	0x3d, r24	; 61
      }
  }

  MENU_ITEM_BACK_P(STR_SEPARATOR);
   20d1c:	81 e0       	ldi	r24, 0x01	; 1
   20d1e:	94 e8       	ldi	r25, 0x84	; 132
   20d20:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
  MENU_ITEM_SUBMENU_P(_T(MSG_XYZ_DETAILS), lcd_menu_xyz_y_min);
   20d24:	89 e3       	ldi	r24, 0x39	; 57
   20d26:	97 e5       	ldi	r25, 0x57	; 87
   20d28:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   20d2c:	62 e9       	ldi	r22, 0x92	; 146
   20d2e:	76 ec       	ldi	r23, 0xC6	; 198
   20d30:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
  MENU_ITEM_SUBMENU_P(_T(MSG_INFO_EXTRUDER), lcd_menu_extruder_info);
   20d34:	89 e2       	ldi	r24, 0x29	; 41
   20d36:	97 e5       	ldi	r25, 0x57	; 87
   20d38:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   20d3c:	64 ea       	ldi	r22, 0xA4	; 164
   20d3e:	77 e3       	ldi	r23, 0x37	; 55
   20d40:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
  MENU_ITEM_SUBMENU_P(_T(MSG_INFO_SENSORS), lcd_menu_show_sensors_state);
   20d44:	8b e1       	ldi	r24, 0x1B	; 27
   20d46:	97 e5       	ldi	r25, 0x57	; 87
   20d48:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   20d4c:	6f e8       	ldi	r22, 0x8F	; 143
   20d4e:	74 ec       	ldi	r23, 0xC4	; 196
   20d50:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>

#ifdef TMC2130
  MENU_ITEM_SUBMENU_P(_T(MSG_BELT_STATUS), lcd_menu_belt_status);
#endif //TMC2130

  MENU_ITEM_SUBMENU_P(_T(MSG_MENU_TEMPERATURES), lcd_menu_temperatures);
   20d54:	8c e0       	ldi	r24, 0x0C	; 12
   20d56:	97 e5       	ldi	r25, 0x57	; 87
   20d58:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   20d5c:	68 ee       	ldi	r22, 0xE8	; 232
   20d5e:	77 e3       	ldi	r23, 0x37	; 55
   20d60:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>

#ifdef MENU_DUMP
    MENU_ITEM_FUNCTION_P(_n("Dump memory"), lcd_dump_memory);
#endif //MENU_DUMP
#ifdef MENU_SERIAL_DUMP
    if (emergency_serial_dump)
   20d64:	80 91 0f 06 	lds	r24, 0x060F	; 0x80060f <emergency_serial_dump>
   20d68:	88 23       	and	r24, r24
   20d6a:	31 f0       	breq	.+12     	; 0x20d78 <lcd_support_menu() [clone .lto_priv.389]+0x2ec>
        MENU_ITEM_FUNCTION_P(_n("Dump to serial"), lcd_serial_dump);
   20d6c:	6e ec       	ldi	r22, 0xCE	; 206
   20d6e:	77 e3       	ldi	r23, 0x37	; 55
   20d70:	8a ed       	ldi	r24, 0xDA	; 218
   20d72:	9a e6       	ldi	r25, 0x6A	; 106
   20d74:	0e 94 9d 72 	call	0xe53a	; 0xe53a <menu_item_function_P(char const*, void (*)())>
    MENU_ITEM_FUNCTION_P(PSTR("Stack crash"), lcd_stack_crash);
#endif //EMERGENCY_HANDLERS
  MENU_ITEM_SUBMENU_P(PSTR("Debug"), lcd_menu_debug);////MSG_DEBUG c=18
#endif /* DEBUG_BUILD */

  MENU_END();
   20d78:	0e 94 83 62 	call	0xc506	; 0xc506 <menu_end()>
    {
        // Waiting for the FlashAir card to get an IP address from a router. Force an update.
        _md->status = 0;
    }

  MENU_BEGIN();
   20d7c:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   20d80:	8f 5f       	subi	r24, 0xFF	; 255
   20d82:	80 93 60 04 	sts	0x0460, r24	; 0x800460 <menu_row>
   20d86:	80 91 62 04 	lds	r24, 0x0462	; 0x800462 <menu_line>
   20d8a:	8f 5f       	subi	r24, 0xFF	; 255
   20d8c:	80 93 62 04 	sts	0x0462, r24	; 0x800462 <menu_line>
   20d90:	a5 ce       	rjmp	.-694    	; 0x20adc <lcd_support_menu() [clone .lto_priv.389]+0x50>
        _md->status = 1;
        _md->is_flash_air = card.ToshibaFlashAir_isEnabled();
        if (_md->is_flash_air) {
            card.ToshibaFlashAir_GetIP((uint8_t*)(&_md->ip)); // ip == 0 if it failed
        }
    } else if (_md->is_flash_air && _md->ip == 0 && ++ _md->status == 16)
   20d92:	90 91 97 03 	lds	r25, 0x0397	; 0x800397 <menu_data+0x1>
   20d96:	99 23       	and	r25, r25
   20d98:	09 f4       	brne	.+2      	; 0x20d9c <lcd_support_menu() [clone .lto_priv.389]+0x310>
   20d9a:	94 ce       	rjmp	.-728    	; 0x20ac4 <lcd_support_menu() [clone .lto_priv.389]+0x38>
   20d9c:	40 91 98 03 	lds	r20, 0x0398	; 0x800398 <menu_data+0x2>
   20da0:	50 91 99 03 	lds	r21, 0x0399	; 0x800399 <menu_data+0x3>
   20da4:	60 91 9a 03 	lds	r22, 0x039A	; 0x80039a <menu_data+0x4>
   20da8:	70 91 9b 03 	lds	r23, 0x039B	; 0x80039b <menu_data+0x5>
   20dac:	45 2b       	or	r20, r21
   20dae:	46 2b       	or	r20, r22
   20db0:	47 2b       	or	r20, r23
   20db2:	09 f0       	breq	.+2      	; 0x20db6 <lcd_support_menu() [clone .lto_priv.389]+0x32a>
   20db4:	87 ce       	rjmp	.-754    	; 0x20ac4 <lcd_support_menu() [clone .lto_priv.389]+0x38>
   20db6:	8f 5f       	subi	r24, 0xFF	; 255
   20db8:	80 31       	cpi	r24, 0x10	; 16
   20dba:	19 f0       	breq	.+6      	; 0x20dc2 <lcd_support_menu() [clone .lto_priv.389]+0x336>
   20dbc:	80 93 96 03 	sts	0x0396, r24	; 0x800396 <menu_data>
   20dc0:	81 ce       	rjmp	.-766    	; 0x20ac4 <lcd_support_menu() [clone .lto_priv.389]+0x38>
    {
        // Waiting for the FlashAir card to get an IP address from a router. Force an update.
        _md->status = 0;
   20dc2:	10 92 96 03 	sts	0x0396, r1	; 0x800396 <menu_data>
   20dc6:	7e ce       	rjmp	.-772    	; 0x20ac4 <lcd_support_menu() [clone .lto_priv.389]+0x38>
			lcd_set_cursor(6, menu_row);
			MMU2::Version mmu_version = MMU2::mmu2.GetMMUFWVersion();
			if (mmu_version.major > 0)
				lcd_printf_P(PSTR("%d.%d.%d"), mmu_version.major, mmu_version.minor, mmu_version.build);
			else
				lcd_puts_P(_T(MSG_UNKNOWN));
   20dc8:	8f e5       	ldi	r24, 0x5F	; 95
   20dca:	97 e5       	ldi	r25, 0x57	; 87
   20dcc:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   20dd0:	0e 94 1d 6f 	call	0xde3a	; 0xde3a <lcd_puts_P(char const*)>
   20dd4:	0f cf       	rjmp	.-482    	; 0x20bf4 <lcd_support_menu() [clone .lto_priv.389]+0x168>
		}
	}
	else
		MENU_ITEM_BACK_P(PSTR("MMU        N/A"));
   20dd6:	82 e4       	ldi	r24, 0x42	; 66
   20dd8:	98 e9       	ldi	r25, 0x98	; 152
   20dda:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
   20dde:	0a cf       	rjmp	.-492    	; 0x20bf4 <lcd_support_menu() [clone .lto_priv.389]+0x168>
#endif //EMERGENCY_HANDLERS
  MENU_ITEM_SUBMENU_P(PSTR("Debug"), lcd_menu_debug);////MSG_DEBUG c=18
#endif /* DEBUG_BUILD */

  MENU_END();
}
   20de0:	df 91       	pop	r29
   20de2:	cf 91       	pop	r28
   20de4:	1f 91       	pop	r17
   20de6:	0f 91       	pop	r16
   20de8:	ff 90       	pop	r15
   20dea:	ef 90       	pop	r14
   20dec:	08 95       	ret

00020dee <lcd_menu_fails_stats() [clone .lto_priv.395]>:
//! |Total failures      |	MSG_TOTAL_FAILURES c=20
//! | Fil. runouts    000|	MSG_FIL_RUNOUTS c=15
//! ----------------------
//! @endcode
static void lcd_menu_fails_stats()
{
   20dee:	bf 92       	push	r11
   20df0:	cf 92       	push	r12
   20df2:	df 92       	push	r13
   20df4:	ef 92       	push	r14
   20df6:	ff 92       	push	r15
   20df8:	0f 93       	push	r16
   20dfa:	1f 93       	push	r17
   20dfc:	cf 93       	push	r28
   20dfe:	df 93       	push	r29
   20e00:	10 92 e3 03 	sts	0x03E3, r1	; 0x8003e3 <lcd_timeoutToStatus>
	lcd_timeoutToStatus.stop(); //infinite timeout
    uint8_t filamentLast = eeprom_read_byte((uint8_t*)EEPROM_FERROR_COUNT);
   20e04:	85 e6       	ldi	r24, 0x65	; 101
   20e06:	9f e0       	ldi	r25, 0x0F	; 15
   20e08:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   20e0c:	18 2f       	mov	r17, r24
    uint16_t filamentTotal = clamp999( eeprom_read_word((uint16_t*)EEPROM_FERROR_COUNT_TOT) );
   20e0e:	81 e0       	ldi	r24, 0x01	; 1
   20e10:	9f e0       	ldi	r25, 0x0F	; 15
   20e12:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
   20e16:	0e 94 34 ff 	call	0x1fe68	; 0x1fe68 <clamp999(unsigned int)>
   20e1a:	c8 2e       	mov	r12, r24
   20e1c:	b9 2e       	mov	r11, r25
	lcd_home();
   20e1e:	0e 94 1f 70 	call	0xe03e	; 0xe03e <lcd_home()>
	lcd_printf_P(failStatsFmt,
   20e22:	8d ef       	ldi	r24, 0xFD	; 253
   20e24:	96 e5       	ldi	r25, 0x56	; 86
   20e26:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   20e2a:	e8 2e       	mov	r14, r24
   20e2c:	d9 2e       	mov	r13, r25
   20e2e:	8c ee       	ldi	r24, 0xEC	; 236
   20e30:	96 e5       	ldi	r25, 0x56	; 86
   20e32:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   20e36:	08 2f       	mov	r16, r24
   20e38:	f9 2e       	mov	r15, r25
   20e3a:	8d ef       	ldi	r24, 0xFD	; 253
   20e3c:	96 e5       	ldi	r25, 0x56	; 86
   20e3e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   20e42:	ec 01       	movw	r28, r24
   20e44:	86 ed       	ldi	r24, 0xD6	; 214
   20e46:	96 e5       	ldi	r25, 0x56	; 86
   20e48:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   20e4c:	bf 92       	push	r11
   20e4e:	cf 92       	push	r12
   20e50:	df 92       	push	r13
   20e52:	ef 92       	push	r14
   20e54:	ff 92       	push	r15
   20e56:	0f 93       	push	r16
   20e58:	1f 92       	push	r1
   20e5a:	1f 93       	push	r17
   20e5c:	df 93       	push	r29
   20e5e:	cf 93       	push	r28
   20e60:	9f 93       	push	r25
   20e62:	8f 93       	push	r24
   20e64:	83 ef       	ldi	r24, 0xF3	; 243
   20e66:	97 e9       	ldi	r25, 0x97	; 151
   20e68:	9f 93       	push	r25
   20e6a:	8f 93       	push	r24
   20e6c:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
        _T(MSG_LAST_PRINT_FAILURES),
        _T(MSG_FIL_RUNOUTS), filamentLast,
        _T(MSG_TOTAL_FAILURES),
        _T(MSG_FIL_RUNOUTS), filamentTotal);

	menu_back_if_clicked();
   20e70:	8d b7       	in	r24, 0x3d	; 61
   20e72:	9e b7       	in	r25, 0x3e	; 62
   20e74:	0e 96       	adiw	r24, 0x0e	; 14
   20e76:	0f b6       	in	r0, 0x3f	; 63
   20e78:	f8 94       	cli
   20e7a:	9e bf       	out	0x3e, r25	; 62
   20e7c:	0f be       	out	0x3f, r0	; 63
   20e7e:	8d bf       	out	0x3d, r24	; 61
}
   20e80:	df 91       	pop	r29
   20e82:	cf 91       	pop	r28
   20e84:	1f 91       	pop	r17
   20e86:	0f 91       	pop	r16
   20e88:	ff 90       	pop	r15
   20e8a:	ef 90       	pop	r14
   20e8c:	df 90       	pop	r13
   20e8e:	cf 90       	pop	r12
   20e90:	bf 90       	pop	r11
        _T(MSG_LAST_PRINT_FAILURES),
        _T(MSG_FIL_RUNOUTS), filamentLast,
        _T(MSG_TOTAL_FAILURES),
        _T(MSG_FIL_RUNOUTS), filamentTotal);

	menu_back_if_clicked();
   20e92:	0c 94 06 74 	jmp	0xe80c	; 0xe80c <menu_back_if_clicked()>

00020e96 <lcd_menu_fails_stats_mmu_total()>:
//! | MMU fails       000|	MSG_MMU_FAILS c=15
//! | MMU load fails  000|	MSG_MMU_LOAD_FAILS c=15
//! | MMU power fails 000|	MSG_MMU_POWER_FAILS c=15
//! ----------------------
//! @endcode
static void lcd_menu_fails_stats_mmu_total() {
   20e96:	8f 92       	push	r8
   20e98:	9f 92       	push	r9
   20e9a:	af 92       	push	r10
   20e9c:	bf 92       	push	r11
   20e9e:	cf 92       	push	r12
   20ea0:	df 92       	push	r13
   20ea2:	ef 92       	push	r14
   20ea4:	ff 92       	push	r15
   20ea6:	0f 93       	push	r16
   20ea8:	1f 93       	push	r17
   20eaa:	cf 93       	push	r28
   20eac:	df 93       	push	r29
   20eae:	10 92 e3 03 	sts	0x03E3, r1	; 0x8003e3 <lcd_timeoutToStatus>
    lcd_timeoutToStatus.stop(); //infinite timeout
    lcd_home();
   20eb2:	0e 94 1f 70 	call	0xe03e	; 0xe03e <lcd_home()>
    lcd_printf_P(
   20eb6:	80 91 07 13 	lds	r24, 0x1307	; 0x801307 <MMU2::mmu2+0x75>
   20eba:	90 91 08 13 	lds	r25, 0x1308	; 0x801308 <MMU2::mmu2+0x76>
   20ebe:	0e 94 34 ff 	call	0x1fe68	; 0x1fe68 <clamp999(unsigned int)>
   20ec2:	98 2e       	mov	r9, r24
   20ec4:	89 2e       	mov	r8, r25
   20ec6:	81 eb       	ldi	r24, 0xB1	; 177
   20ec8:	96 e5       	ldi	r25, 0x56	; 86
   20eca:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   20ece:	b8 2e       	mov	r11, r24
   20ed0:	a9 2e       	mov	r10, r25
   20ed2:	80 ed       	ldi	r24, 0xD0	; 208
   20ed4:	9e e0       	ldi	r25, 0x0E	; 14
   20ed6:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
   20eda:	0e 94 34 ff 	call	0x1fe68	; 0x1fe68 <clamp999(unsigned int)>
   20ede:	d8 2e       	mov	r13, r24
   20ee0:	c9 2e       	mov	r12, r25
   20ee2:	80 ea       	ldi	r24, 0xA0	; 160
   20ee4:	96 e5       	ldi	r25, 0x56	; 86
   20ee6:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   20eea:	f8 2e       	mov	r15, r24
   20eec:	e9 2e       	mov	r14, r25
   20eee:	83 ed       	ldi	r24, 0xD3	; 211
   20ef0:	9e e0       	ldi	r25, 0x0E	; 14
   20ef2:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
   20ef6:	0e 94 34 ff 	call	0x1fe68	; 0x1fe68 <clamp999(unsigned int)>
   20efa:	18 2f       	mov	r17, r24
   20efc:	09 2f       	mov	r16, r25
   20efe:	84 e9       	ldi	r24, 0x94	; 148
   20f00:	96 e5       	ldi	r25, 0x56	; 86
   20f02:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   20f06:	ec 01       	movw	r28, r24
   20f08:	8c ee       	ldi	r24, 0xEC	; 236
   20f0a:	96 e5       	ldi	r25, 0x56	; 86
   20f0c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   20f10:	8f 92       	push	r8
   20f12:	9f 92       	push	r9
   20f14:	af 92       	push	r10
   20f16:	bf 92       	push	r11
   20f18:	cf 92       	push	r12
   20f1a:	df 92       	push	r13
   20f1c:	ef 92       	push	r14
   20f1e:	ff 92       	push	r15
   20f20:	0f 93       	push	r16
   20f22:	1f 93       	push	r17
   20f24:	df 93       	push	r29
   20f26:	cf 93       	push	r28
   20f28:	9f 93       	push	r25
   20f2a:	8f 93       	push	r24
   20f2c:	86 ec       	ldi	r24, 0xC6	; 198
   20f2e:	97 e9       	ldi	r25, 0x97	; 151
   20f30:	9f 93       	push	r25
   20f32:	8f 93       	push	r24
   20f34:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
        ),
        _T(MSG_TOTAL_FAILURES),
        _T(MSG_MMU_FAILS), clamp999( eeprom_read_word((uint16_t*)EEPROM_MMU_FAIL_TOT) ),
        _T(MSG_MMU_LOAD_FAILS), clamp999( eeprom_read_word((uint16_t*)EEPROM_MMU_LOAD_FAIL_TOT) ),
        _T(MSG_MMU_POWER_FAILS), clamp999( MMU2::mmu2.TMCFailures() ));
    menu_back_if_clicked();
   20f38:	8d b7       	in	r24, 0x3d	; 61
   20f3a:	9e b7       	in	r25, 0x3e	; 62
   20f3c:	40 96       	adiw	r24, 0x10	; 16
   20f3e:	0f b6       	in	r0, 0x3f	; 63
   20f40:	f8 94       	cli
   20f42:	9e bf       	out	0x3e, r25	; 62
   20f44:	0f be       	out	0x3f, r0	; 63
   20f46:	8d bf       	out	0x3d, r24	; 61
}
   20f48:	df 91       	pop	r29
   20f4a:	cf 91       	pop	r28
   20f4c:	1f 91       	pop	r17
   20f4e:	0f 91       	pop	r16
   20f50:	ff 90       	pop	r15
   20f52:	ef 90       	pop	r14
   20f54:	df 90       	pop	r13
   20f56:	cf 90       	pop	r12
   20f58:	bf 90       	pop	r11
   20f5a:	af 90       	pop	r10
   20f5c:	9f 90       	pop	r9
   20f5e:	8f 90       	pop	r8
        ),
        _T(MSG_TOTAL_FAILURES),
        _T(MSG_MMU_FAILS), clamp999( eeprom_read_word((uint16_t*)EEPROM_MMU_FAIL_TOT) ),
        _T(MSG_MMU_LOAD_FAILS), clamp999( eeprom_read_word((uint16_t*)EEPROM_MMU_LOAD_FAIL_TOT) ),
        _T(MSG_MMU_POWER_FAILS), clamp999( MMU2::mmu2.TMCFailures() ));
    menu_back_if_clicked();
   20f60:	0c 94 06 74 	jmp	0xe80c	; 0xe80c <menu_back_if_clicked()>

00020f64 <lcd_menu_toolchange_stats_mmu_total()>:
    {
        bool initialized;              // 1byte
    } _menu_data_t;
    static_assert(sizeof(menu_data)>= sizeof(_menu_data_t),"_menu_data_t doesn't fit into menu_data");
    _menu_data_t* _md = (_menu_data_t*)&(menu_data[0]);
    if(!_md->initialized) {
   20f64:	80 91 96 03 	lds	r24, 0x0396	; 0x800396 <menu_data>
   20f68:	81 11       	cpse	r24, r1
   20f6a:	19 c0       	rjmp	.+50     	; 0x20f9e <lcd_menu_toolchange_stats_mmu_total()+0x3a>
        lcd_clear();
   20f6c:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
        lcd_puts_P(_T(MSG_MATERIAL_CHANGES)); /// MSG_MATERIAL_CHANGES c=18
   20f70:	83 ec       	ldi	r24, 0xC3	; 195
   20f72:	96 e5       	ldi	r25, 0x56	; 86
   20f74:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   20f78:	0e 94 1d 6f 	call	0xde3a	; 0xde3a <lcd_puts_P(char const*)>
        lcd_putc(':');
   20f7c:	8a e3       	ldi	r24, 0x3A	; 58
   20f7e:	0e 94 21 6f 	call	0xde42	; 0xde42 <lcd_putc(char)>
        lcd_set_cursor(10, 1);
   20f82:	61 e0       	ldi	r22, 0x01	; 1
   20f84:	8a e0       	ldi	r24, 0x0A	; 10
   20f86:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
        lcd_print(eeprom_read_dword((uint32_t*)EEPROM_MMU_MATERIAL_CHANGES));
   20f8a:	88 ea       	ldi	r24, 0xA8	; 168
   20f8c:	9c e0       	ldi	r25, 0x0C	; 12
   20f8e:	0f 94 e8 a3 	call	0x347d0	; 0x347d0 <eeprom_read_dword>
	else
		lcd_printNumber(n, base);
   20f92:	4a e0       	ldi	r20, 0x0A	; 10
   20f94:	0e 94 76 71 	call	0xe2ec	; 0xe2ec <lcd_printNumber(unsigned long, unsigned char)>
        _md->initialized = true;
   20f98:	81 e0       	ldi	r24, 0x01	; 1
   20f9a:	80 93 96 03 	sts	0x0396, r24	; 0x800396 <menu_data>
    }
    menu_back_if_clicked();
   20f9e:	0c 94 06 74 	jmp	0xe80c	; 0xe80c <menu_back_if_clicked()>

00020fa2 <lcd_pause_usb_print()>:
}

//! @brief Send host action "pause"
void lcd_pause_usb_print()
{
    SERIAL_PROTOCOLLNRPGM(MSG_HOST_ACTION_ASK_PAUSE);
   20fa2:	8b ec       	ldi	r24, 0xCB	; 203
   20fa4:	9a e6       	ldi	r25, 0x6A	; 106
   20fa6:	0c 94 bd 7c 	jmp	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>

00020faa <lcd_return_to_status()>:
#endif //DEBUG_DISABLE_LCD_STATUS_LINE
}

static void lcdui_refresh(uint8_t clear = true)
{
    clear ? lcd_refresh() : lcd_refresh_noclear();
   20faa:	0e 94 9f 70 	call	0xe13e	; 0xe13e <lcd_refresh()>
    lcd_status_message_idx = 0; // Re-draw message from beginning
   20fae:	10 92 64 04 	sts	0x0464, r1	; 0x800464 <_ZL22lcd_status_message_idx.lto_priv.419>
}

void lcd_return_to_status()
{
	lcdui_refresh(); // to maybe revive the LCD if static electricity killed it.
	menu_goto(lcd_status_screen, 0, true);
   20fb2:	20 e0       	ldi	r18, 0x00	; 0
   20fb4:	41 e0       	ldi	r20, 0x01	; 1
   20fb6:	70 e0       	ldi	r23, 0x00	; 0
   20fb8:	60 e0       	ldi	r22, 0x00	; 0
   20fba:	80 e2       	ldi	r24, 0x20	; 32
   20fbc:	97 e3       	ldi	r25, 0x37	; 55
   20fbe:	0e 94 b7 62 	call	0xc56e	; 0xc56e <menu_goto(void (*)(), int, bool, bool)>
	menu_depth = 0;
   20fc2:	10 92 df 03 	sts	0x03DF, r1	; 0x8003df <menu_depth>
    eFilamentAction = FilamentAction::None; // i.e. non-autoLoad
   20fc6:	10 92 94 03 	sts	0x0394, r1	; 0x800394 <eFilamentAction>
}
   20fca:	08 95       	ret

00020fcc <lcdui_print_extruder()>:
//              Filament [nr1.] was loaded, but [nr2.] is currently being loaded via tool change
// Scenario 6: "?>?"
//              This scenario should not be possible and indicates a bug in the firmware
uint8_t lcdui_print_extruder(void) {
    uint8_t chars = 1;
    lcd_space(1);
   20fcc:	81 e0       	ldi	r24, 0x01	; 1
   20fce:	0e 94 28 6f 	call	0xde50	; 0xde50 <lcd_space(unsigned char)>
    if (MMU2::mmu2.get_current_tool() == MMU2::mmu2.get_tool_change_tool()) {
   20fd2:	0f 94 a7 65 	call	0x2cb4e	; 0x2cb4e <MMU2::MMU2::get_current_tool() const [clone .constprop.351]>
uint8_t __attribute__((noinline)) MMU2::get_current_tool() const {
    return extruder == MMU2_NO_TOOL ? (uint8_t)FILAMENT_UNKNOWN : extruder;
}

uint8_t MMU2::get_tool_change_tool() const {
    return tool_change_extruder == MMU2_NO_TOOL ? (uint8_t)FILAMENT_UNKNOWN : tool_change_extruder;
   20fd6:	90 91 e9 12 	lds	r25, 0x12E9	; 0x8012e9 <MMU2::mmu2+0x57>
   20fda:	93 36       	cpi	r25, 0x63	; 99
   20fdc:	09 f4       	brne	.+2      	; 0x20fe0 <lcdui_print_extruder()+0x14>
   20fde:	9f ef       	ldi	r25, 0xFF	; 255
   20fe0:	89 13       	cpse	r24, r25
   20fe2:	0e c0       	rjmp	.+28     	; 0x21000 <lcdui_print_extruder()+0x34>
        lcd_putc('F');
   20fe4:	86 e4       	ldi	r24, 0x46	; 70
   20fe6:	0e 94 21 6f 	call	0xde42	; 0xde42 <lcd_putc(char)>
        lcd_putc(MMU2::mmu2.get_current_tool() == (uint8_t)MMU2::FILAMENT_UNKNOWN ? '?' : MMU2::mmu2.get_current_tool() + '1');
   20fea:	0f 94 a7 65 	call	0x2cb4e	; 0x2cb4e <MMU2::MMU2::get_current_tool() const [clone .constprop.351]>
   20fee:	8f 3f       	cpi	r24, 0xFF	; 255
   20ff0:	29 f0       	breq	.+10     	; 0x20ffc <lcdui_print_extruder()+0x30>
   20ff2:	8f 5c       	subi	r24, 0xCF	; 207
   20ff4:	0e 94 21 6f 	call	0xde42	; 0xde42 <lcd_putc(char)>
   20ff8:	83 e0       	ldi	r24, 0x03	; 3
   20ffa:	08 95       	ret
   20ffc:	8f e3       	ldi	r24, 0x3F	; 63
   20ffe:	fa cf       	rjmp	.-12     	; 0x20ff4 <lcdui_print_extruder()+0x28>
        chars += 2;
    } else {
        lcd_putc(MMU2::mmu2.get_current_tool() == (uint8_t)MMU2::FILAMENT_UNKNOWN ? '?' : MMU2::mmu2.get_current_tool() + '1');
   21000:	8f 3f       	cpi	r24, 0xFF	; 255
   21002:	89 f0       	breq	.+34     	; 0x21026 <lcdui_print_extruder()+0x5a>
   21004:	8f 5c       	subi	r24, 0xCF	; 207
   21006:	0e 94 21 6f 	call	0xde42	; 0xde42 <lcd_putc(char)>
        lcd_putc('>');
   2100a:	8e e3       	ldi	r24, 0x3E	; 62
   2100c:	0e 94 21 6f 	call	0xde42	; 0xde42 <lcd_putc(char)>
   21010:	80 91 e9 12 	lds	r24, 0x12E9	; 0x8012e9 <MMU2::mmu2+0x57>
   21014:	83 36       	cpi	r24, 0x63	; 99
   21016:	49 f0       	breq	.+18     	; 0x2102a <lcdui_print_extruder()+0x5e>
        lcd_putc(MMU2::mmu2.get_tool_change_tool() == (uint8_t)MMU2::FILAMENT_UNKNOWN ? '?' : MMU2::mmu2.get_tool_change_tool() + '1');
   21018:	8f 3f       	cpi	r24, 0xFF	; 255
   2101a:	39 f0       	breq	.+14     	; 0x2102a <lcdui_print_extruder()+0x5e>
   2101c:	8f 5c       	subi	r24, 0xCF	; 207
   2101e:	0e 94 21 6f 	call	0xde42	; 0xde42 <lcd_putc(char)>
        chars += 3;
   21022:	84 e0       	ldi	r24, 0x04	; 4
    }
    return chars;
}
   21024:	08 95       	ret
    if (MMU2::mmu2.get_current_tool() == MMU2::mmu2.get_tool_change_tool()) {
        lcd_putc('F');
        lcd_putc(MMU2::mmu2.get_current_tool() == (uint8_t)MMU2::FILAMENT_UNKNOWN ? '?' : MMU2::mmu2.get_current_tool() + '1');
        chars += 2;
    } else {
        lcd_putc(MMU2::mmu2.get_current_tool() == (uint8_t)MMU2::FILAMENT_UNKNOWN ? '?' : MMU2::mmu2.get_current_tool() + '1');
   21026:	8f e3       	ldi	r24, 0x3F	; 63
   21028:	ee cf       	rjmp	.-36     	; 0x21006 <lcdui_print_extruder()+0x3a>
        lcd_putc('>');
        lcd_putc(MMU2::mmu2.get_tool_change_tool() == (uint8_t)MMU2::FILAMENT_UNKNOWN ? '?' : MMU2::mmu2.get_tool_change_tool() + '1');
   2102a:	8f e3       	ldi	r24, 0x3F	; 63
   2102c:	f8 cf       	rjmp	.-16     	; 0x2101e <lcdui_print_extruder()+0x52>

0002102e <alert_automaton_mintemp::step(float, float)>:
	}
public:
	//! brief state automaton step routine
	//! @param current_temp current hotend/bed temperature (for computing simple hysteresis)
	//! @param mintemp minimal temperature including hysteresis to check current_temp against
	void step(float current_temp, float mintemp){
   2102e:	0f 93       	push	r16
   21030:	1f 93       	push	r17
   21032:	cf 93       	push	r28
   21034:	df 93       	push	r29
   21036:	ec 01       	movw	r28, r24
   21038:	cb 01       	movw	r24, r22
   2103a:	ba 01       	movw	r22, r20
		static const char m1[] PROGMEM = "Please restart";
		switch(state){
   2103c:	4a 81       	ldd	r20, Y+2	; 0x02
   2103e:	41 30       	cpi	r20, 0x01	; 1
   21040:	29 f0       	breq	.+10     	; 0x2104c <alert_automaton_mintemp::step(float, float)+0x1e>
   21042:	88 f0       	brcs	.+34     	; 0x21066 <alert_automaton_mintemp::step(float, float)+0x38>
   21044:	42 30       	cpi	r20, 0x02	; 2
   21046:	09 f1       	breq	.+66     	; 0x2108a <alert_automaton_mintemp::step(float, float)+0x5c>
   21048:	43 30       	cpi	r20, 0x03	; 3
   2104a:	d1 f4       	brne	.+52     	; 0x21080 <alert_automaton_mintemp::step(float, float)+0x52>
	enum class States : uint8_t { Init = 0, TempAboveMintemp, ShowPleaseRestart, ShowMintemp };
	States state = States::Init;
	uint8_t repeat = ALERT_AUTOMATON_SPEED_DIV;

	void substep(const char* next_msg, States next_state){
		if( repeat == 0 ){
   2104c:	8b 81       	ldd	r24, Y+3	; 0x03
   2104e:	81 11       	cpse	r24, r1
   21050:	25 c0       	rjmp	.+74     	; 0x2109c <alert_automaton_mintemp::step(float, float)+0x6e>
			state = next_state; // advance to the next state
   21052:	82 e0       	ldi	r24, 0x02	; 2
   21054:	8a 83       	std	Y+2, r24	; 0x02
			lcd_setalertstatuspgm(next_msg, LCD_STATUS_CRITICAL);
   21056:	63 e0       	ldi	r22, 0x03	; 3
   21058:	84 e4       	ldi	r24, 0x44	; 68
   2105a:	97 e9       	ldi	r25, 0x97	; 151
   2105c:	0e 94 2c da 	call	0x1b458	; 0x1b458 <lcd_setalertstatuspgm(char const*, unsigned char)>
			repeat = ALERT_AUTOMATON_SPEED_DIV; // and prepare repeating for it too
   21060:	85 e0       	ldi	r24, 0x05	; 5
		} else {
			--repeat;
   21062:	8b 83       	std	Y+3, r24	; 0x03
   21064:	0d c0       	rjmp	.+26     	; 0x21080 <alert_automaton_mintemp::step(float, float)+0x52>
	//! @param mintemp minimal temperature including hysteresis to check current_temp against
	void step(float current_temp, float mintemp){
		static const char m1[] PROGMEM = "Please restart";
		switch(state){
		case States::Init: // initial state - check hysteresis
			if( current_temp > mintemp ){
   21066:	a9 01       	movw	r20, r18
   21068:	98 01       	movw	r18, r16
   2106a:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   2106e:	18 16       	cp	r1, r24
   21070:	3c f4       	brge	.+14     	; 0x21080 <alert_automaton_mintemp::step(float, float)+0x52>
				lcd_setalertstatuspgm(m2, LCD_STATUS_CRITICAL);
   21072:	63 e0       	ldi	r22, 0x03	; 3
   21074:	88 81       	ld	r24, Y
   21076:	99 81       	ldd	r25, Y+1	; 0x01
   21078:	0e 94 2c da 	call	0x1b458	; 0x1b458 <lcd_setalertstatuspgm(char const*, unsigned char)>
				state = States::TempAboveMintemp;
   2107c:	81 e0       	ldi	r24, 0x01	; 1
   2107e:	8a 83       	std	Y+2, r24	; 0x02
			break;
		case States::ShowPleaseRestart: // displaying "Please restart"
			substep(m2, States::ShowMintemp);
			break;
		}
	}
   21080:	df 91       	pop	r29
   21082:	cf 91       	pop	r28
   21084:	1f 91       	pop	r17
   21086:	0f 91       	pop	r16
   21088:	08 95       	ret
	enum class States : uint8_t { Init = 0, TempAboveMintemp, ShowPleaseRestart, ShowMintemp };
	States state = States::Init;
	uint8_t repeat = ALERT_AUTOMATON_SPEED_DIV;

	void substep(const char* next_msg, States next_state){
		if( repeat == 0 ){
   2108a:	8b 81       	ldd	r24, Y+3	; 0x03
   2108c:	81 11       	cpse	r24, r1
   2108e:	06 c0       	rjmp	.+12     	; 0x2109c <alert_automaton_mintemp::step(float, float)+0x6e>
		case States::TempAboveMintemp: // the temperature has risen above the hysteresis check
		case States::ShowMintemp: // displaying "MINTEMP fixed"
			substep(m1, States::ShowPleaseRestart);
			break;
		case States::ShowPleaseRestart: // displaying "Please restart"
			substep(m2, States::ShowMintemp);
   21090:	88 81       	ld	r24, Y
   21092:	99 81       	ldd	r25, Y+1	; 0x01
	States state = States::Init;
	uint8_t repeat = ALERT_AUTOMATON_SPEED_DIV;

	void substep(const char* next_msg, States next_state){
		if( repeat == 0 ){
			state = next_state; // advance to the next state
   21094:	23 e0       	ldi	r18, 0x03	; 3
   21096:	2a 83       	std	Y+2, r18	; 0x02
			lcd_setalertstatuspgm(next_msg, LCD_STATUS_CRITICAL);
   21098:	63 e0       	ldi	r22, 0x03	; 3
   2109a:	e0 cf       	rjmp	.-64     	; 0x2105c <alert_automaton_mintemp::step(float, float)+0x2e>
			repeat = ALERT_AUTOMATON_SPEED_DIV; // and prepare repeating for it too
		} else {
			--repeat;
   2109c:	81 50       	subi	r24, 0x01	; 1
   2109e:	e1 cf       	rjmp	.-62     	; 0x21062 <alert_automaton_mintemp::step(float, float)+0x34>

000210a0 <prusa_stat_farm_number()>:
    SERIAL_ECHO(_status);
    SERIAL_ECHO(']');
}

static void prusa_stat_farm_number() {
    SERIAL_ECHOPGM("[PFN:0]");
   210a0:	82 e2       	ldi	r24, 0x22	; 34
   210a2:	99 e8       	ldi	r25, 0x89	; 137
   210a4:	0c 94 c4 7a 	jmp	0xf588	; 0xf588 <serialprintPGM(char const*)>

000210a8 <Sound_DoSound_Prompt()>:

static void Sound_DoSound_Prompt(void)
{
    backlight_wake(2);
WRITE(BEEPER,HIGH);
   210a8:	9f b7       	in	r25, 0x3f	; 63
   210aa:	f8 94       	cli
   210ac:	e2 e0       	ldi	r30, 0x02	; 2
   210ae:	f1 e0       	ldi	r31, 0x01	; 1
   210b0:	80 81       	ld	r24, Z
   210b2:	84 60       	ori	r24, 0x04	; 4
   210b4:	80 83       	st	Z, r24
   210b6:	9f bf       	out	0x3f, r25	; 63
   210b8:	2f ef       	ldi	r18, 0xFF	; 255
   210ba:	89 e6       	ldi	r24, 0x69	; 105
   210bc:	98 e1       	ldi	r25, 0x18	; 24
   210be:	21 50       	subi	r18, 0x01	; 1
   210c0:	80 40       	sbci	r24, 0x00	; 0
   210c2:	90 40       	sbci	r25, 0x00	; 0
   210c4:	e1 f7       	brne	.-8      	; 0x210be <Sound_DoSound_Prompt()+0x16>
   210c6:	00 c0       	rjmp	.+0      	; 0x210c8 <Sound_DoSound_Prompt()+0x20>
   210c8:	00 00       	nop
_delay_ms(500);
WRITE(BEEPER,LOW);
   210ca:	9f b7       	in	r25, 0x3f	; 63
   210cc:	f8 94       	cli
   210ce:	80 81       	ld	r24, Z
   210d0:	8b 7f       	andi	r24, 0xFB	; 251
   210d2:	80 83       	st	Z, r24
   210d4:	9f bf       	out	0x3f, r25	; 63
}
   210d6:	08 95       	ret

000210d8 <prusa_stat_temperatures()>:
    SERIAL_ECHO(eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM));
    SERIAL_ECHO(']');
}

static void prusa_stat_temperatures() {
    SERIAL_ECHOPGM("[ST0:");
   210d8:	85 e4       	ldi	r24, 0x45	; 69
   210da:	99 e8       	ldi	r25, 0x89	; 137
   210dc:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   210e0:	60 91 5d 12 	lds	r22, 0x125D	; 0x80125d <target_temperature>
   210e4:	70 91 5e 12 	lds	r23, 0x125E	; 0x80125e <target_temperature+0x1>
   210e8:	07 2e       	mov	r0, r23
   210ea:	00 0c       	add	r0, r0
   210ec:	88 0b       	sbc	r24, r24
   210ee:	99 0b       	sbc	r25, r25
   210f0:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
    SERIAL_ECHO(target_temperature[0]);
    SERIAL_ECHOPGM("][STB:");
   210f4:	8e e3       	ldi	r24, 0x3E	; 62
   210f6:	99 e8       	ldi	r25, 0x89	; 137
   210f8:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   210fc:	60 91 59 12 	lds	r22, 0x1259	; 0x801259 <target_temperature_bed>
   21100:	70 91 5a 12 	lds	r23, 0x125A	; 0x80125a <target_temperature_bed+0x1>
   21104:	07 2e       	mov	r0, r23
   21106:	00 0c       	add	r0, r0
   21108:	88 0b       	sbc	r24, r24
   2110a:	99 0b       	sbc	r25, r25
   2110c:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
    SERIAL_ECHO(target_temperature_bed);
    SERIAL_ECHOPGM("][AT0:");
   21110:	87 e3       	ldi	r24, 0x37	; 55
   21112:	99 e8       	ldi	r25, 0x89	; 137
   21114:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
  else printNumber(n, base);
}

void MarlinSerial::print(double n, int digits)
{
  printFloat(n, digits);
   21118:	60 91 5a 0d 	lds	r22, 0x0D5A	; 0x800d5a <current_temperature>
   2111c:	70 91 5b 0d 	lds	r23, 0x0D5B	; 0x800d5b <current_temperature+0x1>
   21120:	80 91 5c 0d 	lds	r24, 0x0D5C	; 0x800d5c <current_temperature+0x2>
   21124:	90 91 5d 0d 	lds	r25, 0x0D5D	; 0x800d5d <current_temperature+0x3>
   21128:	42 e0       	ldi	r20, 0x02	; 2
   2112a:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
    SERIAL_ECHO(current_temperature[0]);
    SERIAL_ECHOPGM("][ATB:");
   2112e:	80 e3       	ldi	r24, 0x30	; 48
   21130:	99 e8       	ldi	r25, 0x89	; 137
   21132:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   21136:	60 91 bc 03 	lds	r22, 0x03BC	; 0x8003bc <current_temperature_bed>
   2113a:	70 91 bd 03 	lds	r23, 0x03BD	; 0x8003bd <current_temperature_bed+0x1>
   2113e:	80 91 be 03 	lds	r24, 0x03BE	; 0x8003be <current_temperature_bed+0x2>
   21142:	90 91 bf 03 	lds	r25, 0x03BF	; 0x8003bf <current_temperature_bed+0x3>
   21146:	42 e0       	ldi	r20, 0x02	; 2
   21148:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
}

void MarlinSerial::print(long n, int base)
{
  if (base == 0) {
    write(n);
   2114c:	8d e5       	ldi	r24, 0x5D	; 93
   2114e:	0c 94 b1 79 	jmp	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>

00021152 <prusa_stat_printerstatus(unsigned char)>:
    prusa_stat_printerstatus(statnr);
    prusa_stat_farm_number();
    prusa_stat_printinfo();
}

static void prusa_stat_printerstatus(uint8_t _status) {
   21152:	cf 93       	push	r28
   21154:	c8 2f       	mov	r28, r24
    SERIAL_ECHOPGM("[PRN:");
   21156:	8c e1       	ldi	r24, 0x1C	; 28
   21158:	99 e8       	ldi	r25, 0x89	; 137
   2115a:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
  }
}

void MarlinSerial::print(unsigned long n, int base)
{
  if (base == 0) write(n);
   2115e:	8c 2f       	mov	r24, r28
   21160:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
}

void MarlinSerial::print(long n, int base)
{
  if (base == 0) {
    write(n);
   21164:	8d e5       	ldi	r24, 0x5D	; 93
    SERIAL_ECHO(_status);
    SERIAL_ECHO(']');
}
   21166:	cf 91       	pop	r28
   21168:	0c 94 b1 79 	jmp	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>

0002116c <prusa_statistics_err(char)>:
#ifdef PRUSA_M28
static void trace();
#endif


static void prusa_statistics_err(char c) {
   2116c:	cf 93       	push	r28
   2116e:	c8 2f       	mov	r28, r24
    SERIAL_ECHOPGM("{[ERR:");
   21170:	85 ee       	ldi	r24, 0xE5	; 229
   21172:	98 e8       	ldi	r25, 0x88	; 136
   21174:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   21178:	8c 2f       	mov	r24, r28
   2117a:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
   2117e:	8d e5       	ldi	r24, 0x5D	; 93
   21180:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
    SERIAL_ECHO(c);
    SERIAL_ECHO(']');
    prusa_stat_farm_number();
}
   21184:	cf 91       	pop	r28

static void prusa_statistics_err(char c) {
    SERIAL_ECHOPGM("{[ERR:");
    SERIAL_ECHO(c);
    SERIAL_ECHO(']');
    prusa_stat_farm_number();
   21186:	0d 94 50 08 	jmp	0x210a0	; 0x210a0 <prusa_stat_farm_number()>

0002118a <prusa_stat_diameter()>:
static void prusa_stat_farm_number() {
    SERIAL_ECHOPGM("[PFN:0]");
}

static void prusa_stat_diameter() {
    SERIAL_ECHOPGM("[DIA:");
   2118a:	8a e2       	ldi	r24, 0x2A	; 42
   2118c:	99 e8       	ldi	r25, 0x89	; 137
   2118e:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    SERIAL_ECHO(eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM));
   21192:	85 ea       	ldi	r24, 0xA5	; 165
   21194:	9d e0       	ldi	r25, 0x0D	; 13
   21196:	0f 94 ee a3 	call	0x347dc	; 0x347dc <eeprom_read_word>
  print((long) n, base);
}

void MarlinSerial::print(unsigned int n, int base)
{
  print((unsigned long) n, base);
   2119a:	bc 01       	movw	r22, r24
   2119c:	90 e0       	ldi	r25, 0x00	; 0
   2119e:	80 e0       	ldi	r24, 0x00	; 0
}

void MarlinSerial::print(unsigned long n, int base)
{
  if (base == 0) write(n);
  else printNumber(n, base);
   211a0:	4a e0       	ldi	r20, 0x0A	; 10
   211a2:	0e 94 c5 79 	call	0xf38a	; 0xf38a <MarlinSerial::printNumber(unsigned long, unsigned char)>
}

void MarlinSerial::print(long n, int base)
{
  if (base == 0) {
    write(n);
   211a6:	8d e5       	ldi	r24, 0x5D	; 93
   211a8:	0c 94 b1 79 	jmp	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>

000211ac <calculate_trapezoid_for_block(block_t*, float, float)>:
// Minimum stepper rate 120Hz.
#define MINIMAL_STEP_RATE 120

// Calculates trapezoid parameters so that the entry- and exit-speed is compensated by the provided factors.
void calculate_trapezoid_for_block(block_t *block, float entry_speed, float exit_speed)
{
   211ac:	2f 92       	push	r2
   211ae:	3f 92       	push	r3
   211b0:	4f 92       	push	r4
   211b2:	5f 92       	push	r5
   211b4:	6f 92       	push	r6
   211b6:	7f 92       	push	r7
   211b8:	8f 92       	push	r8
   211ba:	9f 92       	push	r9
   211bc:	af 92       	push	r10
   211be:	bf 92       	push	r11
   211c0:	cf 92       	push	r12
   211c2:	df 92       	push	r13
   211c4:	ef 92       	push	r14
   211c6:	ff 92       	push	r15
   211c8:	0f 93       	push	r16
   211ca:	1f 93       	push	r17
   211cc:	cf 93       	push	r28
   211ce:	df 93       	push	r29
   211d0:	cd b7       	in	r28, 0x3d	; 61
   211d2:	de b7       	in	r29, 0x3e	; 62
   211d4:	a1 97       	sbiw	r28, 0x21	; 33
   211d6:	0f b6       	in	r0, 0x3f	; 63
   211d8:	f8 94       	cli
   211da:	de bf       	out	0x3e, r29	; 62
   211dc:	0f be       	out	0x3f, r0	; 63
   211de:	cd bf       	out	0x3d, r28	; 61
   211e0:	1c 01       	movw	r2, r24
   211e2:	48 01       	movw	r8, r16
   211e4:	59 01       	movw	r10, r18
  // These two lines are the only floating point calculations performed in this routine.
  // initial_rate, final_rate in Hz.
  // Minimum stepper rate 120Hz, maximum 40kHz. If the stepper rate goes above 10kHz,
  // the stepper interrupt routine groups the pulses by 2 or 4 pulses per interrupt tick.
  uint32_t initial_rate = ceil(entry_speed * block->speed_factor); // (step/min)
   211e6:	fc 01       	movw	r30, r24
   211e8:	e8 5b       	subi	r30, 0xB8	; 184
   211ea:	ff 4f       	sbci	r31, 0xFF	; 255
   211ec:	c0 80       	ld	r12, Z
   211ee:	d1 80       	ldd	r13, Z+1	; 0x01
   211f0:	e2 80       	ldd	r14, Z+2	; 0x02
   211f2:	f3 80       	ldd	r15, Z+3	; 0x03
   211f4:	9a 01       	movw	r18, r20
   211f6:	ab 01       	movw	r20, r22
   211f8:	c7 01       	movw	r24, r14
   211fa:	b6 01       	movw	r22, r12
   211fc:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   21200:	0f 94 e6 a5 	call	0x34bcc	; 0x34bcc <ceil>
   21204:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   21208:	8b 01       	movw	r16, r22
   2120a:	8d 83       	std	Y+5, r24	; 0x05
   2120c:	99 83       	std	Y+1, r25	; 0x01
  uint32_t final_rate   = ceil(exit_speed  * block->speed_factor); // (step/min)
   2120e:	a5 01       	movw	r20, r10
   21210:	94 01       	movw	r18, r8
   21212:	c7 01       	movw	r24, r14
   21214:	b6 01       	movw	r22, r12
   21216:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2121a:	0f 94 e6 a5 	call	0x34bcc	; 0x34bcc <ceil>
   2121e:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   21222:	36 2f       	mov	r19, r22
   21224:	27 2f       	mov	r18, r23
   21226:	a8 01       	movw	r20, r16
   21228:	6d 81       	ldd	r22, Y+5	; 0x05
   2122a:	79 81       	ldd	r23, Y+1	; 0x01
   2122c:	48 37       	cpi	r20, 0x78	; 120
   2122e:	51 05       	cpc	r21, r1
   21230:	61 05       	cpc	r22, r1
   21232:	71 05       	cpc	r23, r1
   21234:	20 f4       	brcc	.+8      	; 0x2123e <calculate_trapezoid_for_block(block_t*, float, float)+0x92>
   21236:	48 e7       	ldi	r20, 0x78	; 120
   21238:	50 e0       	ldi	r21, 0x00	; 0
   2123a:	60 e0       	ldi	r22, 0x00	; 0
   2123c:	70 e0       	ldi	r23, 0x00	; 0

  // Limit minimal step rate (Otherwise the timer will overflow.)
  if (initial_rate < MINIMAL_STEP_RATE)
      initial_rate = MINIMAL_STEP_RATE;
  if (initial_rate > block->nominal_rate)
   2123e:	d1 01       	movw	r26, r2
   21240:	d6 96       	adiw	r26, 0x36	; 54
   21242:	8d 90       	ld	r8, X+
   21244:	9d 90       	ld	r9, X+
   21246:	ad 90       	ld	r10, X+
   21248:	bc 90       	ld	r11, X
   2124a:	d9 97       	sbiw	r26, 0x39	; 57
   2124c:	8f 8a       	std	Y+23, r8	; 0x17
   2124e:	98 8e       	std	Y+24, r9	; 0x18
   21250:	a9 8e       	std	Y+25, r10	; 0x19
   21252:	ba 8e       	std	Y+26, r11	; 0x1a
   21254:	48 15       	cp	r20, r8
   21256:	59 05       	cpc	r21, r9
   21258:	6a 05       	cpc	r22, r10
   2125a:	7b 05       	cpc	r23, r11
   2125c:	20 f4       	brcc	.+8      	; 0x21266 <calculate_trapezoid_for_block(block_t*, float, float)+0xba>
   2125e:	4f 8b       	std	Y+23, r20	; 0x17
   21260:	58 8f       	std	Y+24, r21	; 0x18
   21262:	69 8f       	std	Y+25, r22	; 0x19
   21264:	7a 8f       	std	Y+26, r23	; 0x1a
   21266:	43 2f       	mov	r20, r19
   21268:	52 2f       	mov	r21, r18
   2126a:	bc 01       	movw	r22, r24
   2126c:	48 37       	cpi	r20, 0x78	; 120
   2126e:	51 05       	cpc	r21, r1
   21270:	61 05       	cpc	r22, r1
   21272:	71 05       	cpc	r23, r1
   21274:	20 f4       	brcc	.+8      	; 0x2127e <calculate_trapezoid_for_block(block_t*, float, float)+0xd2>
   21276:	48 e7       	ldi	r20, 0x78	; 120
   21278:	50 e0       	ldi	r21, 0x00	; 0
   2127a:	60 e0       	ldi	r22, 0x00	; 0
   2127c:	70 e0       	ldi	r23, 0x00	; 0
   2127e:	18 2d       	mov	r17, r8
   21280:	09 2d       	mov	r16, r9
   21282:	a9 a2       	std	Y+33, r10	; 0x21
   21284:	b8 a2       	std	Y+32, r11	; 0x20
   21286:	48 15       	cp	r20, r8
   21288:	59 05       	cpc	r21, r9
   2128a:	6a 05       	cpc	r22, r10
   2128c:	7b 05       	cpc	r23, r11
   2128e:	20 f4       	brcc	.+8      	; 0x21298 <calculate_trapezoid_for_block(block_t*, float, float)+0xec>
   21290:	14 2f       	mov	r17, r20
   21292:	05 2f       	mov	r16, r21
   21294:	69 a3       	std	Y+33, r22	; 0x21
   21296:	78 a3       	std	Y+32, r23	; 0x20
  if (final_rate < MINIMAL_STEP_RATE)
      final_rate = MINIMAL_STEP_RATE;
  if (final_rate > block->nominal_rate)
      final_rate = block->nominal_rate;

  uint32_t acceleration      = block->acceleration_steps_per_s2;
   21298:	f1 01       	movw	r30, r2
   2129a:	ee 5b       	subi	r30, 0xBE	; 190
   2129c:	ff 4f       	sbci	r31, 0xFF	; 255
   2129e:	c0 80       	ld	r12, Z
   212a0:	d1 80       	ldd	r13, Z+1	; 0x01
   212a2:	e2 80       	ldd	r14, Z+2	; 0x02
   212a4:	f3 80       	ldd	r15, Z+3	; 0x03
   212a6:	cd 82       	std	Y+5, r12	; 0x05
   212a8:	de 82       	std	Y+6, r13	; 0x06
   212aa:	ef 82       	std	Y+7, r14	; 0x07
   212ac:	f8 86       	std	Y+8, r15	; 0x08
  if (acceleration == 0)
   212ae:	cd 28       	or	r12, r13
   212b0:	ce 28       	or	r12, r14
   212b2:	cf 28       	or	r12, r15
   212b4:	41 f4       	brne	.+16     	; 0x212c6 <calculate_trapezoid_for_block(block_t*, float, float)+0x11a>
      // Don't allow zero acceleration.
      acceleration = 1;
   212b6:	c1 2c       	mov	r12, r1
   212b8:	d1 2c       	mov	r13, r1
   212ba:	76 01       	movw	r14, r12
   212bc:	c3 94       	inc	r12
   212be:	cd 82       	std	Y+5, r12	; 0x05
   212c0:	de 82       	std	Y+6, r13	; 0x06
   212c2:	ef 82       	std	Y+7, r14	; 0x07
   212c4:	f8 86       	std	Y+8, r15	; 0x08
  // estimate_acceleration_distance(float initial_rate, float target_rate, float acceleration)
  // (target_rate*target_rate-initial_rate*initial_rate)/(2.0*acceleration));
  uint32_t initial_rate_sqr  = initial_rate*initial_rate;
   212c6:	2f 89       	ldd	r18, Y+23	; 0x17
   212c8:	38 8d       	ldd	r19, Y+24	; 0x18
   212ca:	49 8d       	ldd	r20, Y+25	; 0x19
   212cc:	5a 8d       	ldd	r21, Y+26	; 0x1a
   212ce:	b9 01       	movw	r22, r18
   212d0:	ca 01       	movw	r24, r20
   212d2:	0f 94 43 a4 	call	0x34886	; 0x34886 <__mulsi3>
   212d6:	6d 87       	std	Y+13, r22	; 0x0d
   212d8:	7e 87       	std	Y+14, r23	; 0x0e
   212da:	8f 87       	std	Y+15, r24	; 0x0f
   212dc:	98 8b       	std	Y+16, r25	; 0x10
  //FIXME assert that this result fits a 64bit unsigned int.
  uint32_t nominal_rate_sqr  = block->nominal_rate*block->nominal_rate;
   212de:	a5 01       	movw	r20, r10
   212e0:	94 01       	movw	r18, r8
   212e2:	c5 01       	movw	r24, r10
   212e4:	b4 01       	movw	r22, r8
   212e6:	0f 94 43 a4 	call	0x34886	; 0x34886 <__mulsi3>
   212ea:	2b 01       	movw	r4, r22
   212ec:	3c 01       	movw	r6, r24
  uint32_t final_rate_sqr    = final_rate*final_rate;
   212ee:	21 2f       	mov	r18, r17
   212f0:	30 2f       	mov	r19, r16
   212f2:	49 a1       	ldd	r20, Y+33	; 0x21
   212f4:	58 a1       	ldd	r21, Y+32	; 0x20
   212f6:	61 2f       	mov	r22, r17
   212f8:	70 2f       	mov	r23, r16
   212fa:	ca 01       	movw	r24, r20
   212fc:	0f 94 43 a4 	call	0x34886	; 0x34886 <__mulsi3>
   21300:	69 8b       	std	Y+17, r22	; 0x11
   21302:	7a 8b       	std	Y+18, r23	; 0x12
   21304:	8b 8b       	std	Y+19, r24	; 0x13
   21306:	9c 8b       	std	Y+20, r25	; 0x14
  uint32_t acceleration_x2   = acceleration << 1;
   21308:	cd 80       	ldd	r12, Y+5	; 0x05
   2130a:	de 80       	ldd	r13, Y+6	; 0x06
   2130c:	ef 80       	ldd	r14, Y+7	; 0x07
   2130e:	f8 84       	ldd	r15, Y+8	; 0x08
   21310:	cc 0c       	add	r12, r12
   21312:	dd 1c       	adc	r13, r13
   21314:	ee 1c       	adc	r14, r14
   21316:	ff 1c       	adc	r15, r15
   21318:	c9 86       	std	Y+9, r12	; 0x09
   2131a:	da 86       	std	Y+10, r13	; 0x0a
   2131c:	eb 86       	std	Y+11, r14	; 0x0b
   2131e:	fc 86       	std	Y+12, r15	; 0x0c
  // ceil(estimate_acceleration_distance(initial_rate, block->nominal_rate, acceleration));
  uint32_t accelerate_steps  = (nominal_rate_sqr - initial_rate_sqr + acceleration_x2 - 1) / acceleration_x2;
   21320:	c3 01       	movw	r24, r6
   21322:	b2 01       	movw	r22, r4
   21324:	61 50       	subi	r22, 0x01	; 1
   21326:	71 09       	sbc	r23, r1
   21328:	81 09       	sbc	r24, r1
   2132a:	91 09       	sbc	r25, r1
   2132c:	cd 84       	ldd	r12, Y+13	; 0x0d
   2132e:	de 84       	ldd	r13, Y+14	; 0x0e
   21330:	ef 84       	ldd	r14, Y+15	; 0x0f
   21332:	f8 88       	ldd	r15, Y+16	; 0x10
   21334:	6c 19       	sub	r22, r12
   21336:	7d 09       	sbc	r23, r13
   21338:	8e 09       	sbc	r24, r14
   2133a:	9f 09       	sbc	r25, r15
   2133c:	c9 84       	ldd	r12, Y+9	; 0x09
   2133e:	da 84       	ldd	r13, Y+10	; 0x0a
   21340:	eb 84       	ldd	r14, Y+11	; 0x0b
   21342:	fc 84       	ldd	r15, Y+12	; 0x0c
   21344:	6c 0d       	add	r22, r12
   21346:	7d 1d       	adc	r23, r13
   21348:	8e 1d       	adc	r24, r14
   2134a:	9f 1d       	adc	r25, r15
   2134c:	a7 01       	movw	r20, r14
   2134e:	96 01       	movw	r18, r12
   21350:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
   21354:	69 01       	movw	r12, r18
   21356:	7a 01       	movw	r14, r20
  // floor(estimate_acceleration_distance(block->nominal_rate, final_rate, -acceleration));
  uint32_t decelerate_steps  = (nominal_rate_sqr - final_rate_sqr) / acceleration_x2;
   21358:	c3 01       	movw	r24, r6
   2135a:	b2 01       	movw	r22, r4
   2135c:	29 89       	ldd	r18, Y+17	; 0x11
   2135e:	3a 89       	ldd	r19, Y+18	; 0x12
   21360:	4b 89       	ldd	r20, Y+19	; 0x13
   21362:	5c 89       	ldd	r21, Y+20	; 0x14
   21364:	62 1b       	sub	r22, r18
   21366:	73 0b       	sbc	r23, r19
   21368:	84 0b       	sbc	r24, r20
   2136a:	95 0b       	sbc	r25, r21
   2136c:	29 85       	ldd	r18, Y+9	; 0x09
   2136e:	3a 85       	ldd	r19, Y+10	; 0x0a
   21370:	4b 85       	ldd	r20, Y+11	; 0x0b
   21372:	5c 85       	ldd	r21, Y+12	; 0x0c
   21374:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
   21378:	29 01       	movw	r4, r18
   2137a:	3a 01       	movw	r6, r20
  uint32_t accel_decel_steps = accelerate_steps + decelerate_steps;
   2137c:	d7 01       	movw	r26, r14
   2137e:	c6 01       	movw	r24, r12
   21380:	84 0d       	add	r24, r4
   21382:	95 1d       	adc	r25, r5
   21384:	a6 1d       	adc	r26, r6
   21386:	b7 1d       	adc	r27, r7
   21388:	8c 8f       	std	Y+28, r24	; 0x1c
   2138a:	9d 8f       	std	Y+29, r25	; 0x1d
   2138c:	ae 8f       	std	Y+30, r26	; 0x1e
   2138e:	bf 8f       	std	Y+31, r27	; 0x1f
  uint32_t plateau_steps     = 0;

#ifdef LIN_ADVANCE
  uint16_t final_adv_steps = 0;
  uint16_t max_adv_steps = 0;
  if (block->use_advance_lead) {
   21390:	f1 01       	movw	r30, r2
   21392:	e4 5b       	subi	r30, 0xB4	; 180
   21394:	ff 4f       	sbci	r31, 0xFF	; 255
   21396:	90 81       	ld	r25, Z
   21398:	9b 8f       	std	Y+27, r25	; 0x1b
   2139a:	99 23       	and	r25, r25
   2139c:	09 f4       	brne	.+2      	; 0x213a0 <calculate_trapezoid_for_block(block_t*, float, float)+0x1f4>
   2139e:	8d c0       	rjmp	.+282    	; 0x214ba <calculate_trapezoid_for_block(block_t*, float, float)+0x30e>
      final_adv_steps = final_rate * block->adv_comp;
   213a0:	61 2f       	mov	r22, r17
   213a2:	70 2f       	mov	r23, r16
   213a4:	89 a1       	ldd	r24, Y+33	; 0x21
   213a6:	98 a1       	ldd	r25, Y+32	; 0x20
   213a8:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   213ac:	f1 01       	movw	r30, r2
   213ae:	ec 5a       	subi	r30, 0xAC	; 172
   213b0:	ff 4f       	sbci	r31, 0xFF	; 255
   213b2:	20 81       	ld	r18, Z
   213b4:	31 81       	ldd	r19, Z+1	; 0x01
   213b6:	42 81       	ldd	r20, Z+2	; 0x02
   213b8:	53 81       	ldd	r21, Z+3	; 0x03
   213ba:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   213be:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   213c2:	6d 8b       	std	Y+21, r22	; 0x15
   213c4:	7e 8b       	std	Y+22, r23	; 0x16
#endif

  // Is the Plateau of Nominal Rate smaller than nothing? That means no cruising, and we will
  // have to use intersection_distance() to calculate when to abort acceleration and start braking
  // in order to reach the final_rate exactly at the end of this block.
  if (accel_decel_steps < block->step_event_count.wide) {
   213c6:	d1 01       	movw	r26, r2
   213c8:	50 96       	adiw	r26, 0x10	; 16
   213ca:	2d 91       	ld	r18, X+
   213cc:	3d 91       	ld	r19, X+
   213ce:	4d 91       	ld	r20, X+
   213d0:	5c 91       	ld	r21, X
   213d2:	53 97       	sbiw	r26, 0x13	; 19
   213d4:	29 83       	std	Y+1, r18	; 0x01
   213d6:	3a 83       	std	Y+2, r19	; 0x02
   213d8:	4b 83       	std	Y+3, r20	; 0x03
   213da:	5c 83       	std	Y+4, r21	; 0x04
   213dc:	8c 8d       	ldd	r24, Y+28	; 0x1c
   213de:	9d 8d       	ldd	r25, Y+29	; 0x1d
   213e0:	ae 8d       	ldd	r26, Y+30	; 0x1e
   213e2:	bf 8d       	ldd	r27, Y+31	; 0x1f
   213e4:	82 17       	cp	r24, r18
   213e6:	93 07       	cpc	r25, r19
   213e8:	a4 07       	cpc	r26, r20
   213ea:	b5 07       	cpc	r27, r21
   213ec:	08 f0       	brcs	.+2      	; 0x213f0 <calculate_trapezoid_for_block(block_t*, float, float)+0x244>
   213ee:	68 c0       	rjmp	.+208    	; 0x214c0 <calculate_trapezoid_for_block(block_t*, float, float)+0x314>
    plateau_steps = block->step_event_count.wide - accel_decel_steps;
   213f0:	29 01       	movw	r4, r18
   213f2:	3a 01       	movw	r6, r20
   213f4:	48 1a       	sub	r4, r24
   213f6:	59 0a       	sbc	r5, r25
   213f8:	6a 0a       	sbc	r6, r26
   213fa:	7b 0a       	sbc	r7, r27
#ifdef LIN_ADVANCE
    if (block->use_advance_lead)
   213fc:	9b 8d       	ldd	r25, Y+27	; 0x1b
  // Size of Plateau of Nominal Rate.
  uint32_t plateau_steps     = 0;

#ifdef LIN_ADVANCE
  uint16_t final_adv_steps = 0;
  uint16_t max_adv_steps = 0;
   213fe:	40 e0       	ldi	r20, 0x00	; 0
   21400:	80 e0       	ldi	r24, 0x00	; 0
  // have to use intersection_distance() to calculate when to abort acceleration and start braking
  // in order to reach the final_rate exactly at the end of this block.
  if (accel_decel_steps < block->step_event_count.wide) {
    plateau_steps = block->step_event_count.wide - accel_decel_steps;
#ifdef LIN_ADVANCE
    if (block->use_advance_lead)
   21402:	99 23       	and	r25, r25
   21404:	89 f0       	breq	.+34     	; 0x21428 <calculate_trapezoid_for_block(block_t*, float, float)+0x27c>
        max_adv_steps = block->nominal_rate * block->adv_comp;
   21406:	c5 01       	movw	r24, r10
   21408:	b4 01       	movw	r22, r8
   2140a:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   2140e:	f1 01       	movw	r30, r2
   21410:	ec 5a       	subi	r30, 0xAC	; 172
   21412:	ff 4f       	sbci	r31, 0xFF	; 255
   21414:	20 81       	ld	r18, Z
   21416:	31 81       	ldd	r19, Z+1	; 0x01
   21418:	42 81       	ldd	r20, Z+2	; 0x02
   2141a:	53 81       	ldd	r21, Z+3	; 0x03
   2141c:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   21420:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   21424:	46 2f       	mov	r20, r22
   21426:	87 2f       	mov	r24, r23
        }
    }
#endif
  }

  CRITICAL_SECTION_START;  // Fill variables used by the stepper in a critical section
   21428:	3f b7       	in	r19, 0x3f	; 63
   2142a:	f8 94       	cli
  // This block locks the interrupts globally for 4.38 us,
  // which corresponds to a maximum repeat frequency of 228.57 kHz.
  // This blocking is safe in the context of a 10kHz stepper driver interrupt
  // or a 115200 Bd serial line receive interrupt, which will not trigger faster than 12kHz.
  if (! block->busy) { // Don't update variables if block is busy.
   2142c:	f1 01       	movw	r30, r2
   2142e:	e9 5b       	subi	r30, 0xB9	; 185
   21430:	ff 4f       	sbci	r31, 0xFF	; 255
   21432:	20 81       	ld	r18, Z
   21434:	21 11       	cpse	r18, r1
   21436:	27 c0       	rjmp	.+78     	; 0x21486 <calculate_trapezoid_for_block(block_t*, float, float)+0x2da>
    block->accelerate_until = accelerate_steps;
   21438:	d1 01       	movw	r26, r2
   2143a:	59 96       	adiw	r26, 0x19	; 25
   2143c:	cd 92       	st	X+, r12
   2143e:	dd 92       	st	X+, r13
   21440:	ed 92       	st	X+, r14
   21442:	fc 92       	st	X, r15
   21444:	5c 97       	sbiw	r26, 0x1c	; 28
    block->decelerate_after = accelerate_steps+plateau_steps;
   21446:	c4 0c       	add	r12, r4
   21448:	d5 1c       	adc	r13, r5
   2144a:	e6 1c       	adc	r14, r6
   2144c:	f7 1c       	adc	r15, r7
   2144e:	f1 01       	movw	r30, r2
   21450:	c5 8e       	std	Z+29, r12	; 0x1d
   21452:	d6 8e       	std	Z+30, r13	; 0x1e
   21454:	e7 8e       	std	Z+31, r14	; 0x1f
   21456:	f0 a2       	std	Z+32, r15	; 0x20
    block->initial_rate = initial_rate;
   21458:	cf 88       	ldd	r12, Y+23	; 0x17
   2145a:	c2 ae       	std	Z+58, r12	; 0x3a
   2145c:	d8 8c       	ldd	r13, Y+24	; 0x18
   2145e:	d3 ae       	std	Z+59, r13	; 0x3b
   21460:	e9 8c       	ldd	r14, Y+25	; 0x19
   21462:	e4 ae       	std	Z+60, r14	; 0x3c
   21464:	fa 8c       	ldd	r15, Y+26	; 0x1a
   21466:	f5 ae       	std	Z+61, r15	; 0x3d
    block->final_rate = final_rate;
   21468:	fe 96       	adiw	r30, 0x3e	; 62
   2146a:	10 83       	st	Z, r17
   2146c:	01 83       	std	Z+1, r16	; 0x01
   2146e:	c9 a0       	ldd	r12, Y+33	; 0x21
   21470:	c2 82       	std	Z+2, r12	; 0x02
   21472:	d8 a0       	ldd	r13, Y+32	; 0x20
   21474:	d3 82       	std	Z+3, r13	; 0x03
#ifdef LIN_ADVANCE
    block->final_adv_steps = final_adv_steps;
   21476:	73 96       	adiw	r30, 0x13	; 19
   21478:	ed 88       	ldd	r14, Y+21	; 0x15
   2147a:	e0 82       	st	Z, r14
   2147c:	fe 88       	ldd	r15, Y+22	; 0x16
   2147e:	f1 82       	std	Z+1, r15	; 0x01
    block->max_adv_steps = max_adv_steps;
   21480:	32 97       	sbiw	r30, 0x02	; 2
   21482:	40 83       	st	Z, r20
   21484:	81 83       	std	Z+1, r24	; 0x01
#endif
  }
  CRITICAL_SECTION_END;
   21486:	3f bf       	out	0x3f, r19	; 63
}
   21488:	a1 96       	adiw	r28, 0x21	; 33
   2148a:	0f b6       	in	r0, 0x3f	; 63
   2148c:	f8 94       	cli
   2148e:	de bf       	out	0x3e, r29	; 62
   21490:	0f be       	out	0x3f, r0	; 63
   21492:	cd bf       	out	0x3d, r28	; 61
   21494:	df 91       	pop	r29
   21496:	cf 91       	pop	r28
   21498:	1f 91       	pop	r17
   2149a:	0f 91       	pop	r16
   2149c:	ff 90       	pop	r15
   2149e:	ef 90       	pop	r14
   214a0:	df 90       	pop	r13
   214a2:	cf 90       	pop	r12
   214a4:	bf 90       	pop	r11
   214a6:	af 90       	pop	r10
   214a8:	9f 90       	pop	r9
   214aa:	8f 90       	pop	r8
   214ac:	7f 90       	pop	r7
   214ae:	6f 90       	pop	r6
   214b0:	5f 90       	pop	r5
   214b2:	4f 90       	pop	r4
   214b4:	3f 90       	pop	r3
   214b6:	2f 90       	pop	r2
   214b8:	08 95       	ret
  uint32_t accel_decel_steps = accelerate_steps + decelerate_steps;
  // Size of Plateau of Nominal Rate.
  uint32_t plateau_steps     = 0;

#ifdef LIN_ADVANCE
  uint16_t final_adv_steps = 0;
   214ba:	1d 8a       	std	Y+21, r1	; 0x15
   214bc:	1e 8a       	std	Y+22, r1	; 0x16
   214be:	83 cf       	rjmp	.-250    	; 0x213c6 <calculate_trapezoid_for_block(block_t*, float, float)+0x21a>
#ifdef LIN_ADVANCE
    if (block->use_advance_lead)
        max_adv_steps = block->nominal_rate * block->adv_comp;
#endif
  } else {
    uint32_t acceleration_x4  = acceleration << 2;
   214c0:	2d 81       	ldd	r18, Y+5	; 0x05
   214c2:	3e 81       	ldd	r19, Y+6	; 0x06
   214c4:	4f 81       	ldd	r20, Y+7	; 0x07
   214c6:	58 85       	ldd	r21, Y+8	; 0x08
   214c8:	82 e0       	ldi	r24, 0x02	; 2
   214ca:	22 0f       	add	r18, r18
   214cc:	33 1f       	adc	r19, r19
   214ce:	44 1f       	adc	r20, r20
   214d0:	55 1f       	adc	r21, r21
   214d2:	8a 95       	dec	r24
   214d4:	d1 f7       	brne	.-12     	; 0x214ca <calculate_trapezoid_for_block(block_t*, float, float)+0x31e>
   214d6:	89 81       	ldd	r24, Y+1	; 0x01
   214d8:	9a 81       	ldd	r25, Y+2	; 0x02
   214da:	ab 81       	ldd	r26, Y+3	; 0x03
   214dc:	bc 81       	ldd	r27, Y+4	; 0x04
   214de:	81 70       	andi	r24, 0x01	; 1
   214e0:	99 27       	eor	r25, r25
   214e2:	aa 27       	eor	r26, r26
   214e4:	bb 27       	eor	r27, r27
   214e6:	8d 83       	std	Y+5, r24	; 0x05
   214e8:	9e 83       	std	Y+6, r25	; 0x06
   214ea:	af 83       	std	Y+7, r26	; 0x07
   214ec:	b8 87       	std	Y+8, r27	; 0x08
   214ee:	89 80       	ldd	r8, Y+1	; 0x01
   214f0:	9a 80       	ldd	r9, Y+2	; 0x02
   214f2:	ab 80       	ldd	r10, Y+3	; 0x03
   214f4:	bc 80       	ldd	r11, Y+4	; 0x04
   214f6:	b6 94       	lsr	r11
   214f8:	a7 94       	ror	r10
   214fa:	97 94       	ror	r9
   214fc:	87 94       	ror	r8
    // Avoid negative numbers
    if (final_rate_sqr >= initial_rate_sqr) {
   214fe:	cd 84       	ldd	r12, Y+13	; 0x0d
   21500:	de 84       	ldd	r13, Y+14	; 0x0e
   21502:	ef 84       	ldd	r14, Y+15	; 0x0f
   21504:	f8 88       	ldd	r15, Y+16	; 0x10
   21506:	89 89       	ldd	r24, Y+17	; 0x11
   21508:	9a 89       	ldd	r25, Y+18	; 0x12
   2150a:	ab 89       	ldd	r26, Y+19	; 0x13
   2150c:	bc 89       	ldd	r27, Y+20	; 0x14
   2150e:	8c 15       	cp	r24, r12
   21510:	9d 05       	cpc	r25, r13
   21512:	ae 05       	cpc	r26, r14
   21514:	bf 05       	cpc	r27, r15
   21516:	08 f4       	brcc	.+2      	; 0x2151a <calculate_trapezoid_for_block(block_t*, float, float)+0x36e>
   21518:	6f c0       	rjmp	.+222    	; 0x215f8 <calculate_trapezoid_for_block(block_t*, float, float)+0x44c>
        // intersection_distance(float initial_rate, float final_rate, float acceleration, float distance)
        // (2.0*acceleration*distance-initial_rate*initial_rate+final_rate*final_rate)/(4.0*acceleration);
#if 0
        accelerate_steps = (block->step_event_count >> 1) + (final_rate_sqr - initial_rate_sqr + acceleration_x4 - 1 + (block->step_event_count & 1) * acceleration_x2) / acceleration_x4;
#else
        accelerate_steps = final_rate_sqr - initial_rate_sqr + acceleration_x4 - 1;
   2151a:	6c 01       	movw	r12, r24
   2151c:	7d 01       	movw	r14, r26
   2151e:	91 e0       	ldi	r25, 0x01	; 1
   21520:	c9 1a       	sub	r12, r25
   21522:	d1 08       	sbc	r13, r1
   21524:	e1 08       	sbc	r14, r1
   21526:	f1 08       	sbc	r15, r1
   21528:	8d 85       	ldd	r24, Y+13	; 0x0d
   2152a:	9e 85       	ldd	r25, Y+14	; 0x0e
   2152c:	af 85       	ldd	r26, Y+15	; 0x0f
   2152e:	b8 89       	ldd	r27, Y+16	; 0x10
   21530:	c8 1a       	sub	r12, r24
   21532:	d9 0a       	sbc	r13, r25
   21534:	ea 0a       	sbc	r14, r26
   21536:	fb 0a       	sbc	r15, r27
   21538:	c7 01       	movw	r24, r14
   2153a:	b6 01       	movw	r22, r12
   2153c:	62 0f       	add	r22, r18
   2153e:	73 1f       	adc	r23, r19
   21540:	84 1f       	adc	r24, r20
   21542:	95 1f       	adc	r25, r21
        if (block->step_event_count.wide & 1)
   21544:	cd 80       	ldd	r12, Y+5	; 0x05
   21546:	de 80       	ldd	r13, Y+6	; 0x06
   21548:	ef 80       	ldd	r14, Y+7	; 0x07
   2154a:	f8 84       	ldd	r15, Y+8	; 0x08
   2154c:	cd 28       	or	r12, r13
   2154e:	ce 28       	or	r12, r14
   21550:	cf 28       	or	r12, r15
   21552:	41 f0       	breq	.+16     	; 0x21564 <calculate_trapezoid_for_block(block_t*, float, float)+0x3b8>
            accelerate_steps += acceleration_x2;
   21554:	c9 84       	ldd	r12, Y+9	; 0x09
   21556:	da 84       	ldd	r13, Y+10	; 0x0a
   21558:	eb 84       	ldd	r14, Y+11	; 0x0b
   2155a:	fc 84       	ldd	r15, Y+12	; 0x0c
   2155c:	6c 0d       	add	r22, r12
   2155e:	7d 1d       	adc	r23, r13
   21560:	8e 1d       	adc	r24, r14
   21562:	9f 1d       	adc	r25, r15
        accelerate_steps /= acceleration_x4;
   21564:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
   21568:	75 01       	movw	r14, r10
   2156a:	64 01       	movw	r12, r8
   2156c:	c2 0e       	add	r12, r18
   2156e:	d3 1e       	adc	r13, r19
   21570:	e4 1e       	adc	r14, r20
   21572:	f5 1e       	adc	r15, r21
   21574:	29 81       	ldd	r18, Y+1	; 0x01
   21576:	3a 81       	ldd	r19, Y+2	; 0x02
   21578:	4b 81       	ldd	r20, Y+3	; 0x03
   2157a:	5c 81       	ldd	r21, Y+4	; 0x04
   2157c:	2c 15       	cp	r18, r12
   2157e:	3d 05       	cpc	r19, r13
   21580:	4e 05       	cpc	r20, r14
   21582:	5f 05       	cpc	r21, r15
   21584:	10 f4       	brcc	.+4      	; 0x2158a <calculate_trapezoid_for_block(block_t*, float, float)+0x3de>
   21586:	69 01       	movw	r12, r18
   21588:	7a 01       	movw	r14, r20
            decelerate_steps = block->step_event_count.wide;
        accelerate_steps = block->step_event_count.wide - decelerate_steps;
    }

#ifdef LIN_ADVANCE
    if (block->use_advance_lead) {
   2158a:	2b 8d       	ldd	r18, Y+27	; 0x1b
   2158c:	22 23       	and	r18, r18
   2158e:	09 f4       	brne	.+2      	; 0x21592 <calculate_trapezoid_for_block(block_t*, float, float)+0x3e6>
   21590:	69 c0       	rjmp	.+210    	; 0x21664 <calculate_trapezoid_for_block(block_t*, float, float)+0x4b8>
        if(!accelerate_steps || !decelerate_steps) {
   21592:	c1 14       	cp	r12, r1
   21594:	d1 04       	cpc	r13, r1
   21596:	e1 04       	cpc	r14, r1
   21598:	f1 04       	cpc	r15, r1
   2159a:	09 f4       	brne	.+2      	; 0x2159e <calculate_trapezoid_for_block(block_t*, float, float)+0x3f2>
   2159c:	66 c0       	rjmp	.+204    	; 0x2166a <calculate_trapezoid_for_block(block_t*, float, float)+0x4be>
            // accelerate_steps=0: deceleration-only ramp, max_rate is effectively unused
            // decelerate_steps=0: acceleration-only ramp, max_rate _is_ final_rate
            max_adv_steps = final_adv_steps;
   2159e:	4d 89       	ldd	r20, Y+21	; 0x15
   215a0:	8e 89       	ldd	r24, Y+22	; 0x16
        accelerate_steps = block->step_event_count.wide - decelerate_steps;
    }

#ifdef LIN_ADVANCE
    if (block->use_advance_lead) {
        if(!accelerate_steps || !decelerate_steps) {
   215a2:	41 14       	cp	r4, r1
   215a4:	51 04       	cpc	r5, r1
   215a6:	61 04       	cpc	r6, r1
   215a8:	71 04       	cpc	r7, r1
   215aa:	09 f4       	brne	.+2      	; 0x215ae <calculate_trapezoid_for_block(block_t*, float, float)+0x402>
   215ac:	3d cf       	rjmp	.-390    	; 0x21428 <calculate_trapezoid_for_block(block_t*, float, float)+0x27c>
            // accelerate_steps=0: deceleration-only ramp, max_rate is effectively unused
            // decelerate_steps=0: acceleration-only ramp, max_rate _is_ final_rate
            max_adv_steps = final_adv_steps;
        } else {
            float max_rate = sqrt(acceleration_x2 * accelerate_steps + initial_rate_sqr);
   215ae:	a7 01       	movw	r20, r14
   215b0:	96 01       	movw	r18, r12
   215b2:	69 85       	ldd	r22, Y+9	; 0x09
   215b4:	7a 85       	ldd	r23, Y+10	; 0x0a
   215b6:	8b 85       	ldd	r24, Y+11	; 0x0b
   215b8:	9c 85       	ldd	r25, Y+12	; 0x0c
   215ba:	0f 94 43 a4 	call	0x34886	; 0x34886 <__mulsi3>
   215be:	2d 85       	ldd	r18, Y+13	; 0x0d
   215c0:	3e 85       	ldd	r19, Y+14	; 0x0e
   215c2:	4f 85       	ldd	r20, Y+15	; 0x0f
   215c4:	58 89       	ldd	r21, Y+16	; 0x10
   215c6:	62 0f       	add	r22, r18
   215c8:	73 1f       	adc	r23, r19
   215ca:	84 1f       	adc	r24, r20
   215cc:	95 1f       	adc	r25, r21
   215ce:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   215d2:	0f 94 d6 a8 	call	0x351ac	; 0x351ac <sqrt>
            max_adv_steps = max_rate * block->adv_comp;
   215d6:	f1 01       	movw	r30, r2
   215d8:	ec 5a       	subi	r30, 0xAC	; 172
   215da:	ff 4f       	sbci	r31, 0xFF	; 255
   215dc:	20 81       	ld	r18, Z
   215de:	31 81       	ldd	r19, Z+1	; 0x01
   215e0:	42 81       	ldd	r20, Z+2	; 0x02
   215e2:	53 81       	ldd	r21, Z+3	; 0x03
   215e4:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   215e8:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   215ec:	46 2f       	mov	r20, r22
   215ee:	87 2f       	mov	r24, r23
  uint32_t accelerate_steps  = (nominal_rate_sqr - initial_rate_sqr + acceleration_x2 - 1) / acceleration_x2;
  // floor(estimate_acceleration_distance(block->nominal_rate, final_rate, -acceleration));
  uint32_t decelerate_steps  = (nominal_rate_sqr - final_rate_sqr) / acceleration_x2;
  uint32_t accel_decel_steps = accelerate_steps + decelerate_steps;
  // Size of Plateau of Nominal Rate.
  uint32_t plateau_steps     = 0;
   215f0:	41 2c       	mov	r4, r1
   215f2:	51 2c       	mov	r5, r1
   215f4:	32 01       	movw	r6, r4
   215f6:	18 cf       	rjmp	.-464    	; 0x21428 <calculate_trapezoid_for_block(block_t*, float, float)+0x27c>
            accelerate_steps = block->step_event_count.wide;
    } else {
#if 0
        decelerate_steps = (block->step_event_count >> 1) + (initial_rate_sqr - final_rate_sqr + (block->step_event_count & 1) * acceleration_x2) / acceleration_x4;
#else
        decelerate_steps = initial_rate_sqr - final_rate_sqr;
   215f8:	6d 85       	ldd	r22, Y+13	; 0x0d
   215fa:	7e 85       	ldd	r23, Y+14	; 0x0e
   215fc:	8f 85       	ldd	r24, Y+15	; 0x0f
   215fe:	98 89       	ldd	r25, Y+16	; 0x10
   21600:	c9 88       	ldd	r12, Y+17	; 0x11
   21602:	da 88       	ldd	r13, Y+18	; 0x12
   21604:	eb 88       	ldd	r14, Y+19	; 0x13
   21606:	fc 88       	ldd	r15, Y+20	; 0x14
   21608:	6c 19       	sub	r22, r12
   2160a:	7d 09       	sbc	r23, r13
   2160c:	8e 09       	sbc	r24, r14
   2160e:	9f 09       	sbc	r25, r15
        if (block->step_event_count.wide & 1)
   21610:	cd 80       	ldd	r12, Y+5	; 0x05
   21612:	de 80       	ldd	r13, Y+6	; 0x06
   21614:	ef 80       	ldd	r14, Y+7	; 0x07
   21616:	f8 84       	ldd	r15, Y+8	; 0x08
   21618:	cd 28       	or	r12, r13
   2161a:	ce 28       	or	r12, r14
   2161c:	cf 28       	or	r12, r15
   2161e:	41 f0       	breq	.+16     	; 0x21630 <calculate_trapezoid_for_block(block_t*, float, float)+0x484>
            decelerate_steps += acceleration_x2;
   21620:	c9 84       	ldd	r12, Y+9	; 0x09
   21622:	da 84       	ldd	r13, Y+10	; 0x0a
   21624:	eb 84       	ldd	r14, Y+11	; 0x0b
   21626:	fc 84       	ldd	r15, Y+12	; 0x0c
   21628:	6c 0d       	add	r22, r12
   2162a:	7d 1d       	adc	r23, r13
   2162c:	8e 1d       	adc	r24, r14
   2162e:	9f 1d       	adc	r25, r15
        decelerate_steps /= acceleration_x4;
   21630:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
        decelerate_steps += (block->step_event_count.wide >> 1);
   21634:	82 0e       	add	r8, r18
   21636:	93 1e       	adc	r9, r19
   21638:	a4 1e       	adc	r10, r20
   2163a:	b5 1e       	adc	r11, r21
   2163c:	49 80       	ldd	r4, Y+1	; 0x01
   2163e:	5a 80       	ldd	r5, Y+2	; 0x02
   21640:	6b 80       	ldd	r6, Y+3	; 0x03
   21642:	7c 80       	ldd	r7, Y+4	; 0x04
   21644:	84 14       	cp	r8, r4
   21646:	95 04       	cpc	r9, r5
   21648:	a6 04       	cpc	r10, r6
   2164a:	b7 04       	cpc	r11, r7
   2164c:	10 f4       	brcc	.+4      	; 0x21652 <calculate_trapezoid_for_block(block_t*, float, float)+0x4a6>
   2164e:	24 01       	movw	r4, r8
   21650:	35 01       	movw	r6, r10
#endif
        if (decelerate_steps > block->step_event_count.wide)
            decelerate_steps = block->step_event_count.wide;
        accelerate_steps = block->step_event_count.wide - decelerate_steps;
   21652:	c9 80       	ldd	r12, Y+1	; 0x01
   21654:	da 80       	ldd	r13, Y+2	; 0x02
   21656:	eb 80       	ldd	r14, Y+3	; 0x03
   21658:	fc 80       	ldd	r15, Y+4	; 0x04
   2165a:	c4 18       	sub	r12, r4
   2165c:	d5 08       	sbc	r13, r5
   2165e:	e6 08       	sbc	r14, r6
   21660:	f7 08       	sbc	r15, r7
   21662:	93 cf       	rjmp	.-218    	; 0x2158a <calculate_trapezoid_for_block(block_t*, float, float)+0x3de>
  // Size of Plateau of Nominal Rate.
  uint32_t plateau_steps     = 0;

#ifdef LIN_ADVANCE
  uint16_t final_adv_steps = 0;
  uint16_t max_adv_steps = 0;
   21664:	40 e0       	ldi	r20, 0x00	; 0
   21666:	80 e0       	ldi	r24, 0x00	; 0
   21668:	c3 cf       	rjmp	.-122    	; 0x215f0 <calculate_trapezoid_for_block(block_t*, float, float)+0x444>
#ifdef LIN_ADVANCE
    if (block->use_advance_lead) {
        if(!accelerate_steps || !decelerate_steps) {
            // accelerate_steps=0: deceleration-only ramp, max_rate is effectively unused
            // decelerate_steps=0: acceleration-only ramp, max_rate _is_ final_rate
            max_adv_steps = final_adv_steps;
   2166a:	4d 89       	ldd	r20, Y+21	; 0x15
   2166c:	8e 89       	ldd	r24, Y+22	; 0x16
   2166e:	c0 cf       	rjmp	.-128    	; 0x215f0 <calculate_trapezoid_for_block(block_t*, float, float)+0x444>

00021670 <MMU2::tuneIdlerStallguardThresholdMenu()>:
};

static_assert(sizeof(_menu_tune_data_t) == 18);
static_assert(sizeof(menu_data)>= sizeof(_menu_tune_data_t),"_menu_tune_data_t doesn't fit into menu_data");

void tuneIdlerStallguardThresholdMenu() {
   21670:	ef 92       	push	r14
   21672:	ff 92       	push	r15
   21674:	0f 93       	push	r16
   21676:	1f 93       	push	r17
   21678:	cf 93       	push	r28
   2167a:	df 93       	push	r29
   2167c:	10 92 e3 03 	sts	0x03E3, r1	; 0x8003e3 <lcd_timeoutToStatus>
    static constexpr _menu_tune_data_t * const _md = (_menu_tune_data_t*)&(menu_data[0]);

    // Do not timeout the screen, otherwise there will be FW crash (menu recursion)
    lcd_timeoutToStatus.stop();
    if (_md->status == 0)
   21680:	80 91 a3 03 	lds	r24, 0x03A3	; 0x8003a3 <menu_data+0xd>
   21684:	81 11       	cpse	r24, r1
   21686:	23 c0       	rjmp	.+70     	; 0x216ce <MMU2::tuneIdlerStallguardThresholdMenu()+0x5e>
    {
        _md->status = 1; // Menu entered for the first time
   21688:	81 e0       	ldi	r24, 0x01	; 1
   2168a:	80 93 a3 03 	sts	0x03A3, r24	; 0x8003a3 <menu_data+0xd>

        // Fetch the TuneItem from PROGMEM
        const uint8_t offset = (mmu2.MMUCurrentErrorCode() == ErrorCode::HOMING_IDLER_FAILED) ? 1 : 0;
   2168e:	81 e0       	ldi	r24, 0x01	; 1
   21690:	90 e0       	ldi	r25, 0x00	; 0
   21692:	20 91 d2 12 	lds	r18, 0x12D2	; 0x8012d2 <MMU2::mmu2+0x40>
   21696:	30 91 d3 12 	lds	r19, 0x12D3	; 0x8012d3 <MMU2::mmu2+0x41>
   2169a:	27 30       	cpi	r18, 0x07	; 7
   2169c:	31 48       	sbci	r19, 0x81	; 129
   2169e:	11 f0       	breq	.+4      	; 0x216a4 <MMU2::tuneIdlerStallguardThresholdMenu()+0x34>
   216a0:	90 e0       	ldi	r25, 0x00	; 0
   216a2:	80 e0       	ldi	r24, 0x00	; 0
        memcpy_P(&(_md->item), &TuneItems[offset], sizeof(TuneItem));
   216a4:	bc 01       	movw	r22, r24
   216a6:	66 0f       	add	r22, r22
   216a8:	77 1f       	adc	r23, r23
   216aa:	68 0f       	add	r22, r24
   216ac:	79 1f       	adc	r23, r25
   216ae:	69 52       	subi	r22, 0x29	; 41
   216b0:	78 47       	sbci	r23, 0x78	; 120
   216b2:	43 e0       	ldi	r20, 0x03	; 3
   216b4:	50 e0       	ldi	r21, 0x00	; 0
   216b6:	85 ea       	ldi	r24, 0xA5	; 165
   216b8:	93 e0       	ldi	r25, 0x03	; 3
   216ba:	0f 94 7a a1 	call	0x342f4	; 0x342f4 <memcpy_P>

        // Fetch the value which is currently in MMU EEPROM
        mmu2.ReadRegister(_md->item.address);
   216be:	80 91 a5 03 	lds	r24, 0x03A5	; 0x8003a5 <menu_data+0xf>
   216c2:	0e 94 03 ff 	call	0x1fe06	; 0x1fe06 <MMU2::MMU2::ReadRegister(unsigned char) [clone .constprop.30]>
        _md->currentValue = mmu2.GetLastReadRegisterValue();
   216c6:	80 91 fd 12 	lds	r24, 0x12FD	; 0x8012fd <MMU2::mmu2+0x6b>
   216ca:	80 93 a4 03 	sts	0x03A4, r24	; 0x8003a4 <menu_data+0xe>
    }

    MENU_BEGIN();
   216ce:	0e 94 0c 74 	call	0xe818	; 0xe818 <menu_start()>
   216d2:	10 92 60 04 	sts	0x0460, r1	; 0x800460 <menu_row>
   216d6:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   216da:	84 30       	cpi	r24, 0x04	; 4
   216dc:	e0 f5       	brcc	.+120    	; 0x21756 <MMU2::tuneIdlerStallguardThresholdMenu()+0xe6>
   216de:	10 92 63 04 	sts	0x0463, r1	; 0x800463 <menu_item>
    ON_MENU_LEAVE(
   216e2:	0e 94 4c 62 	call	0xc498	; 0xc498 <menu_item_leave()>
   216e6:	88 23       	and	r24, r24
   216e8:	89 f0       	breq	.+34     	; 0x2170c <MMU2::tuneIdlerStallguardThresholdMenu()+0x9c>
   216ea:	60 91 a4 03 	lds	r22, 0x03A4	; 0x8003a4 <menu_data+0xe>
   216ee:	70 e0       	ldi	r23, 0x00	; 0
   216f0:	80 91 a5 03 	lds	r24, 0x03A5	; 0x8003a5 <menu_data+0xf>
   216f4:	0e 94 9c d2 	call	0x1a538	; 0x1a538 <MMU2::MMU2::WriteRegister(unsigned char, unsigned int) [clone .constprop.28]>
   216f8:	10 92 43 0d 	sts	0x0D43, r1	; 0x800d43 <_ZN4MMU2L21putErrorScreenToSleepE.lto_priv.451>
        &_md->currentValue,
        _md->item.minValue,
        _md->item.maxValue
    );
    MENU_END();
}
   216fc:	df 91       	pop	r29
   216fe:	cf 91       	pop	r28
   21700:	1f 91       	pop	r17
   21702:	0f 91       	pop	r16
   21704:	ff 90       	pop	r15
   21706:	ef 90       	pop	r14
        mmu2.ReadRegister(_md->item.address);
        _md->currentValue = mmu2.GetLastReadRegisterValue();
    }

    MENU_BEGIN();
    ON_MENU_LEAVE(
   21708:	0d 94 d5 07 	jmp	0x20faa	; 0x20faa <lcd_return_to_status()>
        mmu2.WriteRegister(_md->item.address, (uint16_t)_md->currentValue);
        putErrorScreenToSleep = false;
        lcd_return_to_status();
        return;
    );
    MENU_ITEM_BACK_P(_T(MSG_DONE));
   2170c:	81 e0       	ldi	r24, 0x01	; 1
   2170e:	96 e5       	ldi	r25, 0x56	; 86
   21710:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   21714:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
    MENU_ITEM_EDIT_int3_P(
   21718:	00 91 a7 03 	lds	r16, 0x03A7	; 0x8003a7 <menu_data+0x11>
   2171c:	10 e0       	ldi	r17, 0x00	; 0
   2171e:	c0 91 a6 03 	lds	r28, 0x03A6	; 0x8003a6 <menu_data+0x10>
   21722:	d0 e0       	ldi	r29, 0x00	; 0
   21724:	83 ef       	ldi	r24, 0xF3	; 243
   21726:	95 e5       	ldi	r25, 0x55	; 85
   21728:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   2172c:	f1 2c       	mov	r15, r1
   2172e:	e1 2c       	mov	r14, r1
   21730:	9e 01       	movw	r18, r28
   21732:	48 e0       	ldi	r20, 0x08	; 8
   21734:	64 ea       	ldi	r22, 0xA4	; 164
   21736:	73 e0       	ldi	r23, 0x03	; 3
   21738:	0e 94 6e 6f 	call	0xdedc	; 0xdedc <menu_item_edit_P(char const*, void*, unsigned char, int, int, int)>
        _T(MSG_MMU_SENSITIVITY),
        &_md->currentValue,
        _md->item.minValue,
        _md->item.maxValue
    );
    MENU_END();
   2173c:	0e 94 83 62 	call	0xc506	; 0xc506 <menu_end()>
        // Fetch the value which is currently in MMU EEPROM
        mmu2.ReadRegister(_md->item.address);
        _md->currentValue = mmu2.GetLastReadRegisterValue();
    }

    MENU_BEGIN();
   21740:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   21744:	8f 5f       	subi	r24, 0xFF	; 255
   21746:	80 93 60 04 	sts	0x0460, r24	; 0x800460 <menu_row>
   2174a:	80 91 62 04 	lds	r24, 0x0462	; 0x800462 <menu_line>
   2174e:	8f 5f       	subi	r24, 0xFF	; 255
   21750:	80 93 62 04 	sts	0x0462, r24	; 0x800462 <menu_line>
   21754:	c0 cf       	rjmp	.-128    	; 0x216d6 <MMU2::tuneIdlerStallguardThresholdMenu()+0x66>
        &_md->currentValue,
        _md->item.minValue,
        _md->item.maxValue
    );
    MENU_END();
}
   21756:	df 91       	pop	r29
   21758:	cf 91       	pop	r28
   2175a:	1f 91       	pop	r17
   2175c:	0f 91       	pop	r16
   2175e:	ff 90       	pop	r15
   21760:	ef 90       	pop	r14
   21762:	08 95       	ret

00021764 <lcd_loading_progress_bar(unsigned int) [clone .lto_priv.520]>:
  lcd_puts_at_P(0, 2, _T(MSG_CHANGE_SUCCESS));


}

static void lcd_loading_progress_bar(uint16_t loading_time_ms) {
   21764:	1f 93       	push	r17
   21766:	cf 93       	push	r28
   21768:	df 93       	push	r29

	for (uint_least8_t i = 0; i < LCD_WIDTH; i++) {
		lcd_putc_at(i, 3, '.');
		//loading_time_ms/20 delay
		for (uint_least8_t j = 0; j < 5; j++) {
			delay_keep_alive(loading_time_ms / 100);
   2176a:	64 e6       	ldi	r22, 0x64	; 100
   2176c:	70 e0       	ldi	r23, 0x00	; 0
   2176e:	0f 94 a9 a4 	call	0x34952	; 0x34952 <__udivmodhi4>
   21772:	eb 01       	movw	r28, r22

}

static void lcd_loading_progress_bar(uint16_t loading_time_ms) {

	for (uint_least8_t i = 0; i < LCD_WIDTH; i++) {
   21774:	10 e0       	ldi	r17, 0x00	; 0
		lcd_putc_at(i, 3, '.');
   21776:	4e e2       	ldi	r20, 0x2E	; 46
   21778:	63 e0       	ldi	r22, 0x03	; 3
   2177a:	81 2f       	mov	r24, r17
   2177c:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
		//loading_time_ms/20 delay
		for (uint_least8_t j = 0; j < 5; j++) {
			delay_keep_alive(loading_time_ms / 100);
   21780:	ce 01       	movw	r24, r28
   21782:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
   21786:	ce 01       	movw	r24, r28
   21788:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
   2178c:	ce 01       	movw	r24, r28
   2178e:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
   21792:	ce 01       	movw	r24, r28
   21794:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
   21798:	ce 01       	movw	r24, r28
   2179a:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>

}

static void lcd_loading_progress_bar(uint16_t loading_time_ms) {

	for (uint_least8_t i = 0; i < LCD_WIDTH; i++) {
   2179e:	1f 5f       	subi	r17, 0xFF	; 255
   217a0:	14 31       	cpi	r17, 0x14	; 20
   217a2:	49 f7       	brne	.-46     	; 0x21776 <lcd_loading_progress_bar(unsigned int) [clone .lto_priv.520]+0x12>
		//loading_time_ms/20 delay
		for (uint_least8_t j = 0; j < 5; j++) {
			delay_keep_alive(loading_time_ms / 100);
		}
	}
}
   217a4:	df 91       	pop	r29
   217a6:	cf 91       	pop	r28
   217a8:	1f 91       	pop	r17
   217aa:	08 95       	ret

000217ac <clearFilamentAction() [clone .lto_priv.411]>:
        }
    }
}

static void setFilamentAction(FilamentAction action) {
    eFilamentAction = action;
   217ac:	10 92 94 03 	sts	0x0394, r1	; 0x800394 <eFilamentAction>

static void __attribute__((noinline)) clearFilamentAction()
{
    // filament action has been cancelled or completed
    setFilamentAction(FilamentAction::None);
}
   217b0:	08 95       	ret

000217b2 <lcd_generic_preheat_menu()>:
    bFilamentPreheatState = false;
    mFilamentItem(PVB_PREHEAT_HOTEND_TEMP, PVB_PREHEAT_HPB_TEMP);
}

void lcd_generic_preheat_menu()
{
   217b2:	cf 93       	push	r28
    MENU_BEGIN();
   217b4:	0e 94 0c 74 	call	0xe818	; 0xe818 <menu_start()>
   217b8:	10 92 60 04 	sts	0x0460, r1	; 0x800460 <menu_row>
   217bc:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   217c0:	84 30       	cpi	r24, 0x04	; 4
   217c2:	08 f0       	brcs	.+2      	; 0x217c6 <lcd_generic_preheat_menu()+0x14>
   217c4:	b1 c0       	rjmp	.+354    	; 0x21928 <lcd_generic_preheat_menu()+0x176>
   217c6:	10 92 63 04 	sts	0x0463, r1	; 0x800463 <menu_item>
    if (!eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE))
   217ca:	8f e5       	ldi	r24, 0x5F	; 95
   217cc:	9f e0       	ldi	r25, 0x0F	; 15
   217ce:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   217d2:	81 11       	cpse	r24, r1
   217d4:	0f c0       	rjmp	.+30     	; 0x217f4 <lcd_generic_preheat_menu()+0x42>
    {
        ON_MENU_LEAVE(
   217d6:	0e 94 4c 62 	call	0xc498	; 0xc498 <menu_item_leave()>
   217da:	81 11       	cpse	r24, r1
   217dc:	0f 94 d6 0b 	call	0x217ac	; 0x217ac <clearFilamentAction() [clone .lto_priv.411]>
            clearFilamentAction();
        );
        MENU_ITEM_BACK_P(_T(eFilamentAction == FilamentAction::Lay1Cal ? MSG_BACK : MSG_MAIN));
   217e0:	80 91 94 03 	lds	r24, 0x0394	; 0x800394 <eFilamentAction>
   217e4:	8a 30       	cpi	r24, 0x0A	; 10
   217e6:	a9 f1       	breq	.+106    	; 0x21852 <lcd_generic_preheat_menu()+0xa0>
   217e8:	8f ed       	ldi	r24, 0xDF	; 223
   217ea:	98 e4       	ldi	r25, 0x48	; 72
   217ec:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   217f0:	0e 94 ce 72 	call	0xe59c	; 0xe59c <menu_item_back_P(char const*)>
    }
    if (farm_mode)
   217f4:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   217f8:	88 23       	and	r24, r24
   217fa:	71 f1       	breq	.+92     	; 0x21858 <lcd_generic_preheat_menu()+0xa6>
    {
        MENU_ITEM_FUNCTION_P(PSTR("farm   -  " STRINGIFY(FARM_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(FARM_PREHEAT_HPB_TEMP)), mFilamentItem_farm);
   217fc:	66 ee       	ldi	r22, 0xE6	; 230
   217fe:	77 e3       	ldi	r23, 0x37	; 55
   21800:	83 ee       	ldi	r24, 0xE3	; 227
   21802:	99 e9       	ldi	r25, 0x99	; 153
   21804:	0e 94 9d 72 	call	0xe53a	; 0xe53a <menu_item_function_P(char const*, void (*)())>
        MENU_ITEM_FUNCTION_P(PSTR("nozzle -  " STRINGIFY(FARM_PREHEAT_HOTEND_TEMP) "/0"), mFilamentItem_farm_nozzle);
   21808:	6e e9       	ldi	r22, 0x9E	; 158
   2180a:	78 e3       	ldi	r23, 0x38	; 56
   2180c:	83 ed       	ldi	r24, 0xD3	; 211
   2180e:	99 e9       	ldi	r25, 0x99	; 153
   21810:	0e 94 9d 72 	call	0xe53a	; 0xe53a <menu_item_function_P(char const*, void (*)())>
        MENU_ITEM_SUBMENU_P(bPreheatOnlyNozzle ? PSTR("ABS  -  " STRINGIFY(ABS_PREHEAT_HOTEND_TEMP)) : PSTR("ABS  -  " STRINGIFY(ABS_PREHEAT_HOTEND_TEMP)  "/" STRINGIFY(ABS_PREHEAT_HPB_TEMP)) , mFilamentItem_ABS);
        MENU_ITEM_SUBMENU_P(bPreheatOnlyNozzle ? PSTR("HIPS -  " STRINGIFY(HIPS_PREHEAT_HOTEND_TEMP)): PSTR("HIPS -  " STRINGIFY(HIPS_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(HIPS_PREHEAT_HPB_TEMP)), mFilamentItem_HIPS);
        MENU_ITEM_SUBMENU_P(bPreheatOnlyNozzle ? PSTR("PP   -  " STRINGIFY(PP_PREHEAT_HOTEND_TEMP))  : PSTR("PP   -  " STRINGIFY(PP_PREHEAT_HOTEND_TEMP)   "/" STRINGIFY(PP_PREHEAT_HPB_TEMP))  , mFilamentItem_PP);
        MENU_ITEM_SUBMENU_P(bPreheatOnlyNozzle ? PSTR("FLEX -  " STRINGIFY(FLEX_PREHEAT_HOTEND_TEMP)): PSTR("FLEX -  " STRINGIFY(FLEX_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(FLEX_PREHEAT_HPB_TEMP)), mFilamentItem_FLEX);
    }
    if (!eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE) && eFilamentAction == FilamentAction::Preheat) MENU_ITEM_FUNCTION_P(_T(MSG_COOLDOWN), lcd_cooldown);
   21814:	8f e5       	ldi	r24, 0x5F	; 95
   21816:	9f e0       	ldi	r25, 0x0F	; 15
   21818:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   2181c:	81 11       	cpse	r24, r1
   2181e:	0c c0       	rjmp	.+24     	; 0x21838 <lcd_generic_preheat_menu()+0x86>
   21820:	80 91 94 03 	lds	r24, 0x0394	; 0x800394 <eFilamentAction>
   21824:	89 30       	cpi	r24, 0x09	; 9
   21826:	41 f4       	brne	.+16     	; 0x21838 <lcd_generic_preheat_menu()+0x86>
   21828:	80 e1       	ldi	r24, 0x10	; 16
   2182a:	98 e5       	ldi	r25, 0x58	; 88
   2182c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   21830:	68 e9       	ldi	r22, 0x98	; 152
   21832:	78 e3       	ldi	r23, 0x38	; 56
   21834:	0e 94 9d 72 	call	0xe53a	; 0xe53a <menu_item_function_P(char const*, void (*)())>
    MENU_END();
   21838:	0e 94 83 62 	call	0xc506	; 0xc506 <menu_end()>
    mFilamentItem(PVB_PREHEAT_HOTEND_TEMP, PVB_PREHEAT_HPB_TEMP);
}

void lcd_generic_preheat_menu()
{
    MENU_BEGIN();
   2183c:	80 91 60 04 	lds	r24, 0x0460	; 0x800460 <menu_row>
   21840:	8f 5f       	subi	r24, 0xFF	; 255
   21842:	80 93 60 04 	sts	0x0460, r24	; 0x800460 <menu_row>
   21846:	80 91 62 04 	lds	r24, 0x0462	; 0x800462 <menu_line>
   2184a:	8f 5f       	subi	r24, 0xFF	; 255
   2184c:	80 93 62 04 	sts	0x0462, r24	; 0x800462 <menu_line>
   21850:	b5 cf       	rjmp	.-150    	; 0x217bc <lcd_generic_preheat_menu()+0xa>
    if (!eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE))
    {
        ON_MENU_LEAVE(
            clearFilamentAction();
        );
        MENU_ITEM_BACK_P(_T(eFilamentAction == FilamentAction::Lay1Cal ? MSG_BACK : MSG_MAIN));
   21852:	88 ee       	ldi	r24, 0xE8	; 232
   21854:	9a e4       	ldi	r25, 0x4A	; 74
   21856:	ca cf       	rjmp	.-108    	; 0x217ec <lcd_generic_preheat_menu()+0x3a>
        MENU_ITEM_FUNCTION_P(PSTR("farm   -  " STRINGIFY(FARM_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(FARM_PREHEAT_HPB_TEMP)), mFilamentItem_farm);
        MENU_ITEM_FUNCTION_P(PSTR("nozzle -  " STRINGIFY(FARM_PREHEAT_HOTEND_TEMP) "/0"), mFilamentItem_farm_nozzle);
    }
    else
    {
        bool bPreheatOnlyNozzle = shouldPreheatOnlyNozzle();
   21858:	0f 94 7d 04 	call	0x208fa	; 0x208fa <shouldPreheatOnlyNozzle()>
   2185c:	c8 2f       	mov	r28, r24
        MENU_ITEM_SUBMENU_P(bPreheatOnlyNozzle ? PSTR("PLA  -  " STRINGIFY(PLA_PREHEAT_HOTEND_TEMP)) : PSTR("PLA  -  " STRINGIFY(PLA_PREHEAT_HOTEND_TEMP)  "/" STRINGIFY(PLA_PREHEAT_HPB_TEMP)) , mFilamentItem_PLA);
   2185e:	88 eb       	ldi	r24, 0xB8	; 184
   21860:	99 e9       	ldi	r25, 0x99	; 153
   21862:	cc 23       	and	r28, r28
   21864:	11 f0       	breq	.+4      	; 0x2186a <lcd_generic_preheat_menu()+0xb8>
   21866:	87 ec       	ldi	r24, 0xC7	; 199
   21868:	99 e9       	ldi	r25, 0x99	; 153
   2186a:	6a e1       	ldi	r22, 0x1A	; 26
   2186c:	77 e3       	ldi	r23, 0x37	; 55
   2186e:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
        MENU_ITEM_SUBMENU_P(bPreheatOnlyNozzle ? PSTR("PET  -  " STRINGIFY(PET_PREHEAT_HOTEND_TEMP)) : PSTR("PET  -  " STRINGIFY(PET_PREHEAT_HOTEND_TEMP)  "/" STRINGIFY(PET_PREHEAT_HPB_TEMP)) , mFilamentItem_PET);
   21872:	8d e9       	ldi	r24, 0x9D	; 157
   21874:	99 e9       	ldi	r25, 0x99	; 153
   21876:	cc 23       	and	r28, r28
   21878:	11 f0       	breq	.+4      	; 0x2187e <lcd_generic_preheat_menu()+0xcc>
   2187a:	8c ea       	ldi	r24, 0xAC	; 172
   2187c:	99 e9       	ldi	r25, 0x99	; 153
   2187e:	62 e4       	ldi	r22, 0x42	; 66
   21880:	77 e3       	ldi	r23, 0x37	; 55
   21882:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
        MENU_ITEM_SUBMENU_P(bPreheatOnlyNozzle ? PSTR("ASA  -  " STRINGIFY(ASA_PREHEAT_HOTEND_TEMP)) : PSTR("ASA  -  " STRINGIFY(ASA_PREHEAT_HOTEND_TEMP)  "/" STRINGIFY(ASA_PREHEAT_HPB_TEMP)) , mFilamentItem_ASA);
   21886:	81 e8       	ldi	r24, 0x81	; 129
   21888:	99 e9       	ldi	r25, 0x99	; 153
   2188a:	cc 23       	and	r28, r28
   2188c:	11 f0       	breq	.+4      	; 0x21892 <lcd_generic_preheat_menu()+0xe0>
   2188e:	81 e9       	ldi	r24, 0x91	; 145
   21890:	99 e9       	ldi	r25, 0x99	; 153
   21892:	6e eb       	ldi	r22, 0xBE	; 190
   21894:	77 e3       	ldi	r23, 0x37	; 55
   21896:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
        MENU_ITEM_SUBMENU_P(bPreheatOnlyNozzle ? PSTR("PC   -  " STRINGIFY(PC_PREHEAT_HOTEND_TEMP))  : PSTR("PC   -  " STRINGIFY(PC_PREHEAT_HOTEND_TEMP)   "/" STRINGIFY(PC_PREHEAT_HPB_TEMP))  , mFilamentItem_PC);
   2189a:	85 e6       	ldi	r24, 0x65	; 101
   2189c:	99 e9       	ldi	r25, 0x99	; 153
   2189e:	cc 23       	and	r28, r28
   218a0:	11 f0       	breq	.+4      	; 0x218a6 <lcd_generic_preheat_menu()+0xf4>
   218a2:	85 e7       	ldi	r24, 0x75	; 117
   218a4:	99 e9       	ldi	r25, 0x99	; 153
   218a6:	6a e8       	ldi	r22, 0x8A	; 138
   218a8:	77 e3       	ldi	r23, 0x37	; 55
   218aa:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
        MENU_ITEM_SUBMENU_P(bPreheatOnlyNozzle ? PSTR("PVB  -  " STRINGIFY(PVB_PREHEAT_HOTEND_TEMP)) : PSTR("PVB  -  " STRINGIFY(PVB_PREHEAT_HOTEND_TEMP)  "/" STRINGIFY(PVB_PREHEAT_HPB_TEMP)) , mFilamentItem_PVB);
   218ae:	8a e4       	ldi	r24, 0x4A	; 74
   218b0:	99 e9       	ldi	r25, 0x99	; 153
   218b2:	cc 23       	and	r28, r28
   218b4:	11 f0       	breq	.+4      	; 0x218ba <lcd_generic_preheat_menu()+0x108>
   218b6:	89 e5       	ldi	r24, 0x59	; 89
   218b8:	99 e9       	ldi	r25, 0x99	; 153
   218ba:	66 ea       	ldi	r22, 0xA6	; 166
   218bc:	78 e3       	ldi	r23, 0x38	; 56
   218be:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
        MENU_ITEM_SUBMENU_P(bPreheatOnlyNozzle ? PSTR("PA   -  " STRINGIFY(PA_PREHEAT_HOTEND_TEMP))  : PSTR("PA   -  " STRINGIFY(PA_PREHEAT_HOTEND_TEMP)   "/" STRINGIFY(PA_PREHEAT_HPB_TEMP))  , mFilamentItem_PA);
   218c2:	8f e2       	ldi	r24, 0x2F	; 47
   218c4:	99 e9       	ldi	r25, 0x99	; 153
   218c6:	cc 23       	and	r28, r28
   218c8:	11 f0       	breq	.+4      	; 0x218ce <lcd_generic_preheat_menu()+0x11c>
   218ca:	8e e3       	ldi	r24, 0x3E	; 62
   218cc:	99 e9       	ldi	r25, 0x99	; 153
   218ce:	6c ec       	ldi	r22, 0xCC	; 204
   218d0:	77 e3       	ldi	r23, 0x37	; 55
   218d2:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
        MENU_ITEM_SUBMENU_P(bPreheatOnlyNozzle ? PSTR("ABS  -  " STRINGIFY(ABS_PREHEAT_HOTEND_TEMP)) : PSTR("ABS  -  " STRINGIFY(ABS_PREHEAT_HOTEND_TEMP)  "/" STRINGIFY(ABS_PREHEAT_HPB_TEMP)) , mFilamentItem_ABS);
   218d6:	83 e1       	ldi	r24, 0x13	; 19
   218d8:	99 e9       	ldi	r25, 0x99	; 153
   218da:	cc 23       	and	r28, r28
   218dc:	11 f0       	breq	.+4      	; 0x218e2 <lcd_generic_preheat_menu()+0x130>
   218de:	83 e2       	ldi	r24, 0x23	; 35
   218e0:	99 e9       	ldi	r25, 0x99	; 153
   218e2:	68 e5       	ldi	r22, 0x58	; 88
   218e4:	77 e3       	ldi	r23, 0x37	; 55
   218e6:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
        MENU_ITEM_SUBMENU_P(bPreheatOnlyNozzle ? PSTR("HIPS -  " STRINGIFY(HIPS_PREHEAT_HOTEND_TEMP)): PSTR("HIPS -  " STRINGIFY(HIPS_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(HIPS_PREHEAT_HPB_TEMP)), mFilamentItem_HIPS);
   218ea:	87 ef       	ldi	r24, 0xF7	; 247
   218ec:	98 e9       	ldi	r25, 0x98	; 152
   218ee:	cc 23       	and	r28, r28
   218f0:	11 f0       	breq	.+4      	; 0x218f6 <lcd_generic_preheat_menu()+0x144>
   218f2:	87 e0       	ldi	r24, 0x07	; 7
   218f4:	99 e9       	ldi	r25, 0x99	; 153
   218f6:	68 e6       	ldi	r22, 0x68	; 104
   218f8:	77 e3       	ldi	r23, 0x37	; 55
   218fa:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
        MENU_ITEM_SUBMENU_P(bPreheatOnlyNozzle ? PSTR("PP   -  " STRINGIFY(PP_PREHEAT_HOTEND_TEMP))  : PSTR("PP   -  " STRINGIFY(PP_PREHEAT_HOTEND_TEMP)   "/" STRINGIFY(PP_PREHEAT_HPB_TEMP))  , mFilamentItem_PP);
   218fe:	8b ed       	ldi	r24, 0xDB	; 219
   21900:	98 e9       	ldi	r25, 0x98	; 152
   21902:	cc 23       	and	r28, r28
   21904:	11 f0       	breq	.+4      	; 0x2190a <lcd_generic_preheat_menu()+0x158>
   21906:	8b ee       	ldi	r24, 0xEB	; 235
   21908:	98 e9       	ldi	r25, 0x98	; 152
   2190a:	6c e6       	ldi	r22, 0x6C	; 108
   2190c:	77 e3       	ldi	r23, 0x37	; 55
   2190e:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
        MENU_ITEM_SUBMENU_P(bPreheatOnlyNozzle ? PSTR("FLEX -  " STRINGIFY(FLEX_PREHEAT_HOTEND_TEMP)): PSTR("FLEX -  " STRINGIFY(FLEX_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(FLEX_PREHEAT_HPB_TEMP)), mFilamentItem_FLEX);
   21912:	80 ec       	ldi	r24, 0xC0	; 192
   21914:	98 e9       	ldi	r25, 0x98	; 152
   21916:	cc 23       	and	r28, r28
   21918:	11 f0       	breq	.+4      	; 0x2191e <lcd_generic_preheat_menu()+0x16c>
   2191a:	8f ec       	ldi	r24, 0xCF	; 207
   2191c:	98 e9       	ldi	r25, 0x98	; 152
   2191e:	60 e8       	ldi	r22, 0x80	; 128
   21920:	78 e3       	ldi	r23, 0x38	; 56
   21922:	0e 94 f3 72 	call	0xe5e6	; 0xe5e6 <menu_item_submenu_P(char const*, void (*)())>
   21926:	76 cf       	rjmp	.-276    	; 0x21814 <lcd_generic_preheat_menu()+0x62>
    }
    if (!eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE) && eFilamentAction == FilamentAction::Preheat) MENU_ITEM_FUNCTION_P(_T(MSG_COOLDOWN), lcd_cooldown);
    MENU_END();
}
   21928:	cf 91       	pop	r28
   2192a:	08 95       	ret

0002192c <lcd_preheat_menu() [clone .lto_priv.390]>:
#endif //RESUME_DEBUG

//! @brief Show Preheat Menu
static void lcd_preheat_menu()
{
    eFilamentAction = FilamentAction::Preheat;
   2192c:	89 e0       	ldi	r24, 0x09	; 9
   2192e:	80 93 94 03 	sts	0x0394, r24	; 0x800394 <eFilamentAction>
    lcd_generic_preheat_menu();
   21932:	0d 94 d9 0b 	jmp	0x217b2	; 0x217b2 <lcd_generic_preheat_menu()>

00021936 <lcdui_print_temp(char, int, int)>:
}

// Print temperature (nozzle/bed) (9 chars total)
void lcdui_print_temp(char type, int val_current, int val_target)
{
	int chars = lcd_printf_P(_N("%c%3d/%d" LCD_STR_DEGREE), type, val_current, val_target);
   21936:	5f 93       	push	r21
   21938:	4f 93       	push	r20
   2193a:	7f 93       	push	r23
   2193c:	6f 93       	push	r22
   2193e:	28 2f       	mov	r18, r24
   21940:	08 2e       	mov	r0, r24
   21942:	00 0c       	add	r0, r0
   21944:	33 0b       	sbc	r19, r19
   21946:	3f 93       	push	r19
   21948:	8f 93       	push	r24
   2194a:	87 e5       	ldi	r24, 0x57	; 87
   2194c:	9a e6       	ldi	r25, 0x6A	; 106
   2194e:	9f 93       	push	r25
   21950:	8f 93       	push	r24
   21952:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
	lcd_space(9 - chars);
   21956:	2d b7       	in	r18, 0x3d	; 61
   21958:	3e b7       	in	r19, 0x3e	; 62
   2195a:	28 5f       	subi	r18, 0xF8	; 248
   2195c:	3f 4f       	sbci	r19, 0xFF	; 255
   2195e:	0f b6       	in	r0, 0x3f	; 63
   21960:	f8 94       	cli
   21962:	3e bf       	out	0x3e, r19	; 62
   21964:	0f be       	out	0x3f, r0	; 63
   21966:	2d bf       	out	0x3d, r18	; 61
   21968:	99 e0       	ldi	r25, 0x09	; 9
   2196a:	98 1b       	sub	r25, r24
   2196c:	89 2f       	mov	r24, r25
   2196e:	0c 94 28 6f 	jmp	0xde50	; 0xde50 <lcd_space(unsigned char)>

00021972 <lcd_print_target_temps_first_line()>:
        default:
            return false;
    }
}

void lcd_print_target_temps_first_line() {
   21972:	cf 93       	push	r28
   21974:	df 93       	push	r29
    lcd_home();
   21976:	0e 94 1f 70 	call	0xe03e	; 0xe03e <lcd_home()>
    lcdui_print_temp(LCD_STR_THERMOMETER[0], (int) degHotend(0), (int) degTargetHotend(0));
   2197a:	c0 91 5d 12 	lds	r28, 0x125D	; 0x80125d <target_temperature>
   2197e:	d0 91 5e 12 	lds	r29, 0x125E	; 0x80125e <target_temperature+0x1>
   21982:	60 91 5a 0d 	lds	r22, 0x0D5A	; 0x800d5a <current_temperature>
   21986:	70 91 5b 0d 	lds	r23, 0x0D5B	; 0x800d5b <current_temperature+0x1>
   2198a:	80 91 5c 0d 	lds	r24, 0x0D5C	; 0x800d5c <current_temperature+0x2>
   2198e:	90 91 5d 0d 	lds	r25, 0x0D5D	; 0x800d5d <current_temperature+0x3>
   21992:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   21996:	ae 01       	movw	r20, r28
   21998:	82 e8       	ldi	r24, 0x82	; 130
   2199a:	0f 94 9b 0c 	call	0x21936	; 0x21936 <lcdui_print_temp(char, int, int)>
    lcd_set_cursor(10, 0);
   2199e:	60 e0       	ldi	r22, 0x00	; 0
   219a0:	8a e0       	ldi	r24, 0x0A	; 10
   219a2:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
FORCE_INLINE float degTargetHotend(uint8_t extruder) {
  return target_temperature[extruder];
};

FORCE_INLINE float degTargetBed() {
  return target_temperature_bed;
   219a6:	c0 91 59 12 	lds	r28, 0x1259	; 0x801259 <target_temperature_bed>
   219aa:	d0 91 5a 12 	lds	r29, 0x125A	; 0x80125a <target_temperature_bed+0x1>
    int targetBedTemp = (int) degTargetBed();
    if (targetBedTemp) {
   219ae:	20 97       	sbiw	r28, 0x00	; 0
   219b0:	81 f0       	breq	.+32     	; 0x219d2 <lcd_print_target_temps_first_line()+0x60>
        lcdui_print_temp(LCD_STR_BEDTEMP[0], (int) degBed(), targetBedTemp);
   219b2:	60 91 bc 03 	lds	r22, 0x03BC	; 0x8003bc <current_temperature_bed>
   219b6:	70 91 bd 03 	lds	r23, 0x03BD	; 0x8003bd <current_temperature_bed+0x1>
   219ba:	80 91 be 03 	lds	r24, 0x03BE	; 0x8003be <current_temperature_bed+0x2>
   219be:	90 91 bf 03 	lds	r25, 0x03BF	; 0x8003bf <current_temperature_bed+0x3>
   219c2:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   219c6:	ae 01       	movw	r20, r28
   219c8:	80 e8       	ldi	r24, 0x80	; 128
    } else {
        lcd_space(10);
    }
}
   219ca:	df 91       	pop	r29
   219cc:	cf 91       	pop	r28
    lcd_home();
    lcdui_print_temp(LCD_STR_THERMOMETER[0], (int) degHotend(0), (int) degTargetHotend(0));
    lcd_set_cursor(10, 0);
    int targetBedTemp = (int) degTargetBed();
    if (targetBedTemp) {
        lcdui_print_temp(LCD_STR_BEDTEMP[0], (int) degBed(), targetBedTemp);
   219ce:	0d 94 9b 0c 	jmp	0x21936	; 0x21936 <lcdui_print_temp(char, int, int)>
    } else {
        lcd_space(10);
   219d2:	8a e0       	ldi	r24, 0x0A	; 10
    }
}
   219d4:	df 91       	pop	r29
   219d6:	cf 91       	pop	r28
    lcd_set_cursor(10, 0);
    int targetBedTemp = (int) degTargetBed();
    if (targetBedTemp) {
        lcdui_print_temp(LCD_STR_BEDTEMP[0], (int) degBed(), targetBedTemp);
    } else {
        lcd_space(10);
   219d8:	0c 94 28 6f 	jmp	0xde50	; 0xde50 <lcd_space(unsigned char)>

000219dc <mFilamentPrompt()>:
   219dc:	10 92 e3 03 	sts	0x03E3, r1	; 0x8003e3 <lcd_timeoutToStatus>
    }
}

static void mFilamentPrompt() {
    lcd_timeoutToStatus.stop();
    lcd_print_target_temps_first_line();
   219e0:	0f 94 b9 0c 	call	0x21972	; 0x21972 <lcd_print_target_temps_first_line()>
    lcd_puts_at_P(0,1, _T(MSG_PRESS_KNOB));
   219e4:	89 ea       	ldi	r24, 0xA9	; 169
   219e6:	97 e5       	ldi	r25, 0x57	; 87
   219e8:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   219ec:	ac 01       	movw	r20, r24
   219ee:	61 e0       	ldi	r22, 0x01	; 1
   219f0:	80 e0       	ldi	r24, 0x00	; 0
   219f2:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
    lcd_set_cursor(0,2);
   219f6:	62 e0       	ldi	r22, 0x02	; 2
   219f8:	80 e0       	ldi	r24, 0x00	; 0
   219fa:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
    switch(eFilamentAction) {
   219fe:	80 91 94 03 	lds	r24, 0x0394	; 0x800394 <eFilamentAction>
   21a02:	83 30       	cpi	r24, 0x03	; 3
   21a04:	81 f1       	breq	.+96     	; 0x21a66 <mFilamentPrompt()+0x8a>
   21a06:	48 f4       	brcc	.+18     	; 0x21a1a <mFilamentPrompt()+0x3e>
   21a08:	81 30       	cpi	r24, 0x01	; 1
   21a0a:	60 f0       	brcs	.+24     	; 0x21a24 <mFilamentPrompt()+0x48>
        case FilamentAction::Load:
        case FilamentAction::AutoLoad:
        case FilamentAction::MmuLoad:
        case FilamentAction::MmuLoadingTest:
            lcd_puts_P(_T(MSG_TO_LOAD_FIL));
   21a0c:	86 e9       	ldi	r24, 0x96	; 150
   21a0e:	97 e5       	ldi	r25, 0x57	; 87
            break;
        case FilamentAction::UnLoad:
        case FilamentAction::MmuUnLoad:
            lcd_puts_P(_T(MSG_TO_UNLOAD_FIL));
   21a10:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   21a14:	0e 94 1d 6f 	call	0xde3a	; 0xde3a <lcd_puts_P(char const*)>
   21a18:	05 c0       	rjmp	.+10     	; 0x21a24 <mFilamentPrompt()+0x48>
static void mFilamentPrompt() {
    lcd_timeoutToStatus.stop();
    lcd_print_target_temps_first_line();
    lcd_puts_at_P(0,1, _T(MSG_PRESS_KNOB));
    lcd_set_cursor(0,2);
    switch(eFilamentAction) {
   21a1a:	85 30       	cpi	r24, 0x05	; 5
   21a1c:	21 f1       	breq	.+72     	; 0x21a66 <mFilamentPrompt()+0x8a>
   21a1e:	b0 f3       	brcs	.-20     	; 0x21a0c <mFilamentPrompt()+0x30>
   21a20:	88 30       	cpi	r24, 0x08	; 8
   21a22:	a1 f3       	breq	.-24     	; 0x21a0c <mFilamentPrompt()+0x30>
        case FilamentAction::Preheat:
        case FilamentAction::Lay1Cal:
            break;
    }

    if(lcd_clicked()
   21a24:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
#ifdef FILAMENT_SENSOR
/// @todo leptun - add this as a specific retest item
        || (((eFilamentAction == FilamentAction::Load) || (eFilamentAction == FilamentAction::AutoLoad)) && fsensor.getFilamentLoadEvent())
   21a28:	81 11       	cpse	r24, r1
   21a2a:	09 c0       	rjmp	.+18     	; 0x21a3e <mFilamentPrompt()+0x62>
   21a2c:	80 91 94 03 	lds	r24, 0x0394	; 0x800394 <eFilamentAction>
   21a30:	81 50       	subi	r24, 0x01	; 1
   21a32:	82 30       	cpi	r24, 0x02	; 2
   21a34:	28 f5       	brcc	.+74     	; 0x21a80 <mFilamentPrompt()+0xa4>
   21a36:	80 91 f5 16 	lds	r24, 0x16F5	; 0x8016f5 <fsensor+0x4>
   21a3a:	88 23       	and	r24, r24
   21a3c:	09 f1       	breq	.+66     	; 0x21a80 <mFilamentPrompt()+0xa4>
#endif //FILAMENT_SENSOR
    ) {
        menu_back(bFilamentPreheatState ? 2 : 3);
   21a3e:	80 91 15 06 	lds	r24, 0x0615	; 0x800615 <bFilamentPreheatState>
   21a42:	81 11       	cpse	r24, r1
   21a44:	13 c0       	rjmp	.+38     	; 0x21a6c <mFilamentPrompt()+0x90>
   21a46:	83 e0       	ldi	r24, 0x03	; 3
   21a48:	0e 94 ff 62 	call	0xc5fe	; 0xc5fe <menu_back(unsigned char)>
        switch(eFilamentAction) {
   21a4c:	80 91 94 03 	lds	r24, 0x0394	; 0x800394 <eFilamentAction>
   21a50:	82 30       	cpi	r24, 0x02	; 2
   21a52:	71 f0       	breq	.+28     	; 0x21a70 <mFilamentPrompt()+0x94>
   21a54:	83 30       	cpi	r24, 0x03	; 3
   21a56:	81 f0       	breq	.+32     	; 0x21a78 <mFilamentPrompt()+0x9c>
   21a58:	81 30       	cpi	r24, 0x01	; 1
   21a5a:	91 f4       	brne	.+36     	; 0x21a80 <mFilamentPrompt()+0xa4>
            case FilamentAction::AutoLoad:
                // loading no longer cancellable
                eFilamentAction = FilamentAction::Load;
                [[fallthrough]];
            case FilamentAction::Load:
                enquecommand_P(MSG_M701);      // load filament
   21a5c:	61 e0       	ldi	r22, 0x01	; 1
   21a5e:	88 e1       	ldi	r24, 0x18	; 24
   21a60:	9b e6       	ldi	r25, 0x6B	; 107
                break;
            case FilamentAction::UnLoad:
                enquecommand_P(MSG_M702);      // unload filament
   21a62:	0c 94 e9 8e 	jmp	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
        case FilamentAction::MmuLoadingTest:
            lcd_puts_P(_T(MSG_TO_LOAD_FIL));
            break;
        case FilamentAction::UnLoad:
        case FilamentAction::MmuUnLoad:
            lcd_puts_P(_T(MSG_TO_UNLOAD_FIL));
   21a66:	81 e8       	ldi	r24, 0x81	; 129
   21a68:	97 e5       	ldi	r25, 0x57	; 87
   21a6a:	d2 cf       	rjmp	.-92     	; 0x21a10 <mFilamentPrompt()+0x34>
#ifdef FILAMENT_SENSOR
/// @todo leptun - add this as a specific retest item
        || (((eFilamentAction == FilamentAction::Load) || (eFilamentAction == FilamentAction::AutoLoad)) && fsensor.getFilamentLoadEvent())
#endif //FILAMENT_SENSOR
    ) {
        menu_back(bFilamentPreheatState ? 2 : 3);
   21a6c:	82 e0       	ldi	r24, 0x02	; 2
   21a6e:	ec cf       	rjmp	.-40     	; 0x21a48 <mFilamentPrompt()+0x6c>
        switch(eFilamentAction) {
            case FilamentAction::AutoLoad:
                // loading no longer cancellable
                eFilamentAction = FilamentAction::Load;
   21a70:	81 e0       	ldi	r24, 0x01	; 1
   21a72:	80 93 94 03 	sts	0x0394, r24	; 0x800394 <eFilamentAction>
   21a76:	f2 cf       	rjmp	.-28     	; 0x21a5c <mFilamentPrompt()+0x80>
                [[fallthrough]];
            case FilamentAction::Load:
                enquecommand_P(MSG_M701);      // load filament
                break;
            case FilamentAction::UnLoad:
                enquecommand_P(MSG_M702);      // unload filament
   21a78:	61 e0       	ldi	r22, 0x01	; 1
   21a7a:	8c ec       	ldi	r24, 0xCC	; 204
   21a7c:	98 e6       	ldi	r25, 0x68	; 104
   21a7e:	f1 cf       	rjmp	.-30     	; 0x21a62 <mFilamentPrompt()+0x86>
            case FilamentAction::Preheat:
            case FilamentAction::Lay1Cal:
                break;
        }
    }
}
   21a80:	08 95       	ret

00021a82 <__vector_51>:
	UCSR2B |= (1 << RXCIE2); // enable rx interrupt
	fdev_setup_stream(uart2io, uart2_putchar, uart2_getchar, _FDEV_SETUP_WRITE | _FDEV_SETUP_READ); //setup uart2 i/o stream
}

ISR(USART2_RX_vect)
{
   21a82:	1f 92       	push	r1
   21a84:	0f 92       	push	r0
   21a86:	0f b6       	in	r0, 0x3f	; 63
   21a88:	0f 92       	push	r0
   21a8a:	11 24       	eor	r1, r1
   21a8c:	0b b6       	in	r0, 0x3b	; 59
   21a8e:	0f 92       	push	r0
   21a90:	2f 93       	push	r18
   21a92:	3f 93       	push	r19
   21a94:	4f 93       	push	r20
   21a96:	5f 93       	push	r21
   21a98:	6f 93       	push	r22
   21a9a:	7f 93       	push	r23
   21a9c:	8f 93       	push	r24
   21a9e:	9f 93       	push	r25
   21aa0:	af 93       	push	r26
   21aa2:	bf 93       	push	r27
   21aa4:	ef 93       	push	r30
   21aa6:	ff 93       	push	r31
	if (rbuf_put(uart2_ibuf, UDR2) < 0) // put received byte to buffer
   21aa8:	20 91 d6 00 	lds	r18, 0x00D6	; 0x8000d6 <__TEXT_REGION_LENGTH__+0x7c20d6>
//put single byte to buffer
int rbuf_put(uint8_t* ptr, uint8_t b)
{
//#ifdef _NO_ASM
	_lock();                         //lock
	uint8_t buf_w = ptr[1];          //get write index
   21aac:	80 91 46 0d 	lds	r24, 0x0D46	; 0x800d46 <uart2_ibuf+0x1>
	uint8_t buf_r = ptr[2];          //get read index
   21ab0:	90 91 47 0d 	lds	r25, 0x0D47	; 0x800d47 <uart2_ibuf+0x2>
	_unlock();                       //unlock
	ptr[4 + buf_w] = b;              //store byte to buffer
   21ab4:	e8 2f       	mov	r30, r24
   21ab6:	f0 e0       	ldi	r31, 0x00	; 0
   21ab8:	e7 5b       	subi	r30, 0xB7	; 183
   21aba:	f2 4f       	sbci	r31, 0xF2	; 242
   21abc:	20 83       	st	Z, r18
	buf_w++;                         //incerment write index
   21abe:	8f 5f       	subi	r24, 0xFF	; 255
	uint8_t buf_l = ptr[0];          //get length
	if (buf_w >= buf_l) buf_w = 0;   //rotate write index
   21ac0:	20 91 45 0d 	lds	r18, 0x0D45	; 0x800d45 <uart2_ibuf>
   21ac4:	82 17       	cp	r24, r18
   21ac6:	08 f0       	brcs	.+2      	; 0x21aca <__vector_51+0x48>
   21ac8:	80 e0       	ldi	r24, 0x00	; 0
	if (buf_w == buf_r) return -1;   //return -1 to signal buffer full
   21aca:	98 13       	cpse	r25, r24
   21acc:	17 c0       	rjmp	.+46     	; 0x21afc <__vector_51+0x7a>
	{ //rx buffer full
		puts_P(PSTR("USART2 rx Full!!!"));
   21ace:	83 e5       	ldi	r24, 0x53	; 83
   21ad0:	97 e9       	ldi	r25, 0x97	; 151
   21ad2:	0f 94 c9 a2 	call	0x34592	; 0x34592 <puts_P>
	}
}
   21ad6:	ff 91       	pop	r31
   21ad8:	ef 91       	pop	r30
   21ada:	bf 91       	pop	r27
   21adc:	af 91       	pop	r26
   21ade:	9f 91       	pop	r25
   21ae0:	8f 91       	pop	r24
   21ae2:	7f 91       	pop	r23
   21ae4:	6f 91       	pop	r22
   21ae6:	5f 91       	pop	r21
   21ae8:	4f 91       	pop	r20
   21aea:	3f 91       	pop	r19
   21aec:	2f 91       	pop	r18
   21aee:	0f 90       	pop	r0
   21af0:	0b be       	out	0x3b, r0	; 59
   21af2:	0f 90       	pop	r0
   21af4:	0f be       	out	0x3f, r0	; 63
   21af6:	0f 90       	pop	r0
   21af8:	1f 90       	pop	r1
   21afa:	18 95       	reti
	ptr[1] = buf_w;                  //store write index
   21afc:	80 93 46 0d 	sts	0x0D46, r24	; 0x800d46 <uart2_ibuf+0x1>
   21b00:	ea cf       	rjmp	.-44     	; 0x21ad6 <__vector_51+0x54>

00021b02 <__vector_45>:
{
	WRITE(BEEPER, 1);
}

ISR(TIMER4_OVF_vect)
{
   21b02:	1f 92       	push	r1
   21b04:	0f 92       	push	r0
   21b06:	0f b6       	in	r0, 0x3f	; 63
   21b08:	0f 92       	push	r0
   21b0a:	11 24       	eor	r1, r1
   21b0c:	0b b6       	in	r0, 0x3b	; 59
   21b0e:	0f 92       	push	r0
   21b10:	8f 93       	push	r24
   21b12:	9f 93       	push	r25
   21b14:	ef 93       	push	r30
   21b16:	ff 93       	push	r31
	WRITE(BEEPER, 0);
   21b18:	9f b7       	in	r25, 0x3f	; 63
   21b1a:	f8 94       	cli
   21b1c:	e2 e0       	ldi	r30, 0x02	; 2
   21b1e:	f1 e0       	ldi	r31, 0x01	; 1
   21b20:	80 81       	ld	r24, Z
   21b22:	8b 7f       	andi	r24, 0xFB	; 251
   21b24:	80 83       	st	Z, r24
   21b26:	9f bf       	out	0x3f, r25	; 63
}
   21b28:	ff 91       	pop	r31
   21b2a:	ef 91       	pop	r30
   21b2c:	9f 91       	pop	r25
   21b2e:	8f 91       	pop	r24
   21b30:	0f 90       	pop	r0
   21b32:	0b be       	out	0x3b, r0	; 59
   21b34:	0f 90       	pop	r0
   21b36:	0f be       	out	0x3f, r0	; 63
   21b38:	0f 90       	pop	r0
   21b3a:	1f 90       	pop	r1
   21b3c:	18 95       	reti

00021b3e <__vector_42>:
#endif //EXTRUDER_0_AUTO_FAN_PIN

// Because of the timer mode change, we need two interrupts. We could also try to assume that the frequency is x2
// and use a TOGGLE(), but this seems to work well enough so I left it as it is now.
ISR(TIMER4_COMPA_vect)
{
   21b3e:	1f 92       	push	r1
   21b40:	0f 92       	push	r0
   21b42:	0f b6       	in	r0, 0x3f	; 63
   21b44:	0f 92       	push	r0
   21b46:	11 24       	eor	r1, r1
   21b48:	0b b6       	in	r0, 0x3b	; 59
   21b4a:	0f 92       	push	r0
   21b4c:	8f 93       	push	r24
   21b4e:	9f 93       	push	r25
   21b50:	ef 93       	push	r30
   21b52:	ff 93       	push	r31
	WRITE(BEEPER, 1);
   21b54:	9f b7       	in	r25, 0x3f	; 63
   21b56:	f8 94       	cli
   21b58:	e2 e0       	ldi	r30, 0x02	; 2
   21b5a:	f1 e0       	ldi	r31, 0x01	; 1
   21b5c:	80 81       	ld	r24, Z
   21b5e:	84 60       	ori	r24, 0x04	; 4
   21b60:	80 83       	st	Z, r24
   21b62:	9f bf       	out	0x3f, r25	; 63
}
   21b64:	ff 91       	pop	r31
   21b66:	ef 91       	pop	r30
   21b68:	9f 91       	pop	r25
   21b6a:	8f 91       	pop	r24
   21b6c:	0f 90       	pop	r0
   21b6e:	0b be       	out	0x3b, r0	; 59
   21b70:	0f 90       	pop	r0
   21b72:	0f be       	out	0x3f, r0	; 63
   21b74:	0f 90       	pop	r0
   21b76:	1f 90       	pop	r1
   21b78:	18 95       	reti

00021b7a <delay2>:

void delay2(unsigned long ms)
{
   21b7a:	8f 92       	push	r8
   21b7c:	9f 92       	push	r9
   21b7e:	af 92       	push	r10
   21b80:	bf 92       	push	r11
   21b82:	cf 92       	push	r12
   21b84:	df 92       	push	r13
   21b86:	ef 92       	push	r14
   21b88:	ff 92       	push	r15
   21b8a:	6b 01       	movw	r12, r22
   21b8c:	7c 01       	movw	r14, r24
	uint32_t start = micros2();
   21b8e:	0e 94 5c ff 	call	0x1feb8	; 0x1feb8 <micros2>
   21b92:	4b 01       	movw	r8, r22
   21b94:	5c 01       	movw	r10, r24
	while (ms > 0)
	{
		yield();
		while ( ms > 0 && (micros2() - start) >= 1000)
   21b96:	c1 14       	cp	r12, r1
   21b98:	d1 04       	cpc	r13, r1
   21b9a:	e1 04       	cpc	r14, r1
   21b9c:	f1 04       	cpc	r15, r1
   21b9e:	b9 f0       	breq	.+46     	; 0x21bce <delay2+0x54>
   21ba0:	0e 94 5c ff 	call	0x1feb8	; 0x1feb8 <micros2>
   21ba4:	68 19       	sub	r22, r8
   21ba6:	79 09       	sbc	r23, r9
   21ba8:	8a 09       	sbc	r24, r10
   21baa:	9b 09       	sbc	r25, r11
   21bac:	68 3e       	cpi	r22, 0xE8	; 232
   21bae:	73 40       	sbci	r23, 0x03	; 3
   21bb0:	81 05       	cpc	r24, r1
   21bb2:	91 05       	cpc	r25, r1
   21bb4:	80 f3       	brcs	.-32     	; 0x21b96 <delay2+0x1c>
		{
			ms--;
   21bb6:	21 e0       	ldi	r18, 0x01	; 1
   21bb8:	c2 1a       	sub	r12, r18
   21bba:	d1 08       	sbc	r13, r1
   21bbc:	e1 08       	sbc	r14, r1
   21bbe:	f1 08       	sbc	r15, r1
			start += 1000;
   21bc0:	88 ee       	ldi	r24, 0xE8	; 232
   21bc2:	88 0e       	add	r8, r24
   21bc4:	83 e0       	ldi	r24, 0x03	; 3
   21bc6:	98 1e       	adc	r9, r24
   21bc8:	a1 1c       	adc	r10, r1
   21bca:	b1 1c       	adc	r11, r1
   21bcc:	e4 cf       	rjmp	.-56     	; 0x21b96 <delay2+0x1c>
		}
	}
}
   21bce:	ff 90       	pop	r15
   21bd0:	ef 90       	pop	r14
   21bd2:	df 90       	pop	r13
   21bd4:	cf 90       	pop	r12
   21bd6:	bf 90       	pop	r11
   21bd8:	af 90       	pop	r10
   21bda:	9f 90       	pop	r9
   21bdc:	8f 90       	pop	r8
   21bde:	08 95       	ret

00021be0 <millis2>:
}

unsigned long millis2(void)
{
	unsigned long m;
	uint8_t oldSREG = SREG;
   21be0:	2f b7       	in	r18, 0x3f	; 63

	// disable interrupts while we read timer0_millis or we might get an
	// inconsistent value (e.g. in the middle of a write to timer0_millis)
	cli();
   21be2:	f8 94       	cli
	m = timer2_millis;
   21be4:	60 91 f8 05 	lds	r22, 0x05F8	; 0x8005f8 <timer2_millis>
   21be8:	70 91 f9 05 	lds	r23, 0x05F9	; 0x8005f9 <timer2_millis+0x1>
   21bec:	80 91 fa 05 	lds	r24, 0x05FA	; 0x8005fa <timer2_millis+0x2>
   21bf0:	90 91 fb 05 	lds	r25, 0x05FB	; 0x8005fb <timer2_millis+0x3>
	SREG = oldSREG;
   21bf4:	2f bf       	out	0x3f, r18	; 63

	return m;
}
   21bf6:	08 95       	ret

00021bf8 <lcd_pause_print()>:
}

//! @brief Pause print, disable nozzle heater, move to park position, send host action "paused"
void lcd_pause_print()
{
    stop_and_save_print_to_ram(0.0, -default_retraction);
   21bf8:	60 e0       	ldi	r22, 0x00	; 0
   21bfa:	70 e0       	ldi	r23, 0x00	; 0
   21bfc:	80 e8       	ldi	r24, 0x80	; 128
   21bfe:	9f eb       	ldi	r25, 0xBF	; 191
   21c00:	0f 94 06 66 	call	0x2cc0c	; 0x2cc0c <stop_and_save_print_to_ram(float, float) [clone .constprop.303]>

    SERIAL_ECHOLNRPGM(MSG_HOST_ACTION_PAUSED);
   21c04:	8b eb       	ldi	r24, 0xBB	; 187
   21c06:	9a e6       	ldi	r25, 0x6A	; 106
   21c08:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>

    // Indicate that the printer is paused
    did_pause_print = true;
   21c0c:	81 e0       	ldi	r24, 0x01	; 1
   21c0e:	80 93 cd 03 	sts	0x03CD, r24	; 0x8003cd <did_pause_print>
  }
  else return false;
}

bool Stopwatch::pause() {
  if (isRunning()) {
   21c12:	80 91 8b 03 	lds	r24, 0x038B	; 0x80038b <Stopwatch::state>
   21c16:	81 30       	cpi	r24, 0x01	; 1
   21c18:	69 f4       	brne	.+26     	; 0x21c34 <lcd_pause_print()+0x3c>
    state = PAUSED;
   21c1a:	82 e0       	ldi	r24, 0x02	; 2
   21c1c:	80 93 8b 03 	sts	0x038B, r24	; 0x80038b <Stopwatch::state>
    stopTimestamp = _millis();
   21c20:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   21c24:	60 93 0b 06 	sts	0x060B, r22	; 0x80060b <Stopwatch::stopTimestamp>
   21c28:	70 93 0c 06 	sts	0x060C, r23	; 0x80060c <Stopwatch::stopTimestamp+0x1>
   21c2c:	80 93 0d 06 	sts	0x060D, r24	; 0x80060d <Stopwatch::stopTimestamp+0x2>
   21c30:	90 93 0e 06 	sts	0x060E, r25	; 0x80060e <Stopwatch::stopTimestamp+0x3>

    print_job_timer.pause();

    // return to status is required to continue processing in the main loop!
    lcd_commands_type = LcdCommands::LongPause;
   21c34:	82 e0       	ldi	r24, 0x02	; 2
   21c36:	80 93 5e 0d 	sts	0x0D5E, r24	; 0x800d5e <lcd_commands_type>
    lcd_return_to_status();
   21c3a:	0d 94 d5 07 	jmp	0x20faa	; 0x20faa <lcd_return_to_status()>

00021c3e <Timer<unsigned short>::expired(unsigned short)>:
 * @param msPeriod Time interval in milliseconds. Do not omit "ul" when using constant literal with LongTimer.
 * @retval true Timer has expired
 * @retval false Timer not expired yet, or is not running, or time window in which is timer considered expired passed.
 */
template<typename T>
bool Timer<T>::expired(T msPeriod)
   21c3e:	ff 92       	push	r15
   21c40:	0f 93       	push	r16
   21c42:	1f 93       	push	r17
   21c44:	cf 93       	push	r28
   21c46:	df 93       	push	r29
{
    if (!m_isRunning) return false;
   21c48:	fc 01       	movw	r30, r24
   21c4a:	f0 80       	ld	r15, Z
   21c4c:	f1 10       	cpse	r15, r1
   21c4e:	08 c0       	rjmp	.+16     	; 0x21c60 <Timer<unsigned short>::expired(unsigned short)+0x22>
   21c50:	f1 2c       	mov	r15, r1
            expired = true;
        }
    }
    if (expired) m_isRunning = false;
    return expired;
}
   21c52:	8f 2d       	mov	r24, r15
   21c54:	df 91       	pop	r29
   21c56:	cf 91       	pop	r28
   21c58:	1f 91       	pop	r17
   21c5a:	0f 91       	pop	r16
   21c5c:	ff 90       	pop	r15
   21c5e:	08 95       	ret
   21c60:	8b 01       	movw	r16, r22
   21c62:	ec 01       	movw	r28, r24
template<typename T>
bool Timer<T>::expired(T msPeriod)
{
    if (!m_isRunning) return false;
    bool expired = false;
    const T now = _millis();
   21c64:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
    if (m_started <=  m_started + msPeriod)
   21c68:	89 81       	ldd	r24, Y+1	; 0x01
   21c6a:	9a 81       	ldd	r25, Y+2	; 0x02
   21c6c:	08 0f       	add	r16, r24
   21c6e:	19 1f       	adc	r17, r25
   21c70:	08 17       	cp	r16, r24
   21c72:	19 07       	cpc	r17, r25
   21c74:	40 f0       	brcs	.+16     	; 0x21c86 <Timer<unsigned short>::expired(unsigned short)+0x48>
    {
        if ((now >= m_started + msPeriod) || (now < m_started))
   21c76:	60 17       	cp	r22, r16
   21c78:	71 07       	cpc	r23, r17
   21c7a:	18 f4       	brcc	.+6      	; 0x21c82 <Timer<unsigned short>::expired(unsigned short)+0x44>
            expired = true;
        }
    }
    else
    {
        if ((now >= m_started + msPeriod) && (now < m_started))
   21c7c:	68 17       	cp	r22, r24
   21c7e:	79 07       	cpc	r23, r25
   21c80:	38 f7       	brcc	.-50     	; 0x21c50 <Timer<unsigned short>::expired(unsigned short)+0x12>
        {
            expired = true;
        }
    }
    if (expired) m_isRunning = false;
   21c82:	18 82       	st	Y, r1
   21c84:	e6 cf       	rjmp	.-52     	; 0x21c52 <Timer<unsigned short>::expired(unsigned short)+0x14>
            expired = true;
        }
    }
    else
    {
        if ((now >= m_started + msPeriod) && (now < m_started))
   21c86:	60 17       	cp	r22, r16
   21c88:	71 07       	cpc	r23, r17
   21c8a:	c0 f7       	brcc	.-16     	; 0x21c7c <Timer<unsigned short>::expired(unsigned short)+0x3e>
   21c8c:	e1 cf       	rjmp	.-62     	; 0x21c50 <Timer<unsigned short>::expired(unsigned short)+0x12>

00021c8e <Timer<unsigned short>::expired_cont(unsigned short)>:
}

template<typename T>
bool Timer<T>::expired_cont(T msPeriod)
{
    return !m_isRunning || expired(msPeriod);
   21c8e:	fc 01       	movw	r30, r24
   21c90:	20 81       	ld	r18, Z
   21c92:	21 11       	cpse	r18, r1
   21c94:	0d 94 1f 0e 	jmp	0x21c3e	; 0x21c3e <Timer<unsigned short>::expired(unsigned short)>
}
   21c98:	81 e0       	ldi	r24, 0x01	; 1
   21c9a:	08 95       	ret

00021c9c <Timer<unsigned short>::start()>:

/**
 * @brief Start timer
 */
template<typename T>
void Timer<T>::start()
   21c9c:	cf 93       	push	r28
   21c9e:	df 93       	push	r29
   21ca0:	ec 01       	movw	r28, r24
{
    m_started = _millis();
   21ca2:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   21ca6:	7a 83       	std	Y+2, r23	; 0x02
   21ca8:	69 83       	std	Y+1, r22	; 0x01
    m_isRunning = true;
   21caa:	81 e0       	ldi	r24, 0x01	; 1
   21cac:	88 83       	st	Y, r24
}
   21cae:	df 91       	pop	r29
   21cb0:	cf 91       	pop	r28
   21cb2:	08 95       	ret

00021cb4 <twi_wait(unsigned char) [clone .lto_priv.368]>:
  TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTO);
}


static uint8_t twi_wait(uint8_t status)
{
   21cb4:	1f 93       	push	r17
   21cb6:	cf 93       	push	r28
   21cb8:	df 93       	push	r29
   21cba:	00 d0       	rcall	.+0      	; 0x21cbc <twi_wait(unsigned char) [clone .lto_priv.368]+0x8>
   21cbc:	cd b7       	in	r28, 0x3d	; 61
   21cbe:	de b7       	in	r29, 0x3e	; 62
   21cc0:	18 2f       	mov	r17, r24
  ShortTimer timmy;
   21cc2:	19 82       	std	Y+1, r1	; 0x01
   21cc4:	1b 82       	std	Y+3, r1	; 0x03
   21cc6:	1a 82       	std	Y+2, r1	; 0x02
  timmy.start();
   21cc8:	ce 01       	movw	r24, r28
   21cca:	01 96       	adiw	r24, 0x01	; 1
   21ccc:	0f 94 4e 0e 	call	0x21c9c	; 0x21c9c <Timer<unsigned short>::start()>
  while(!(TWCR & _BV(TWINT))) {
   21cd0:	80 91 bc 00 	lds	r24, 0x00BC	; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc>
   21cd4:	87 fd       	sbrc	r24, 7
   21cd6:	0a c0       	rjmp	.+20     	; 0x21cec <twi_wait(unsigned char) [clone .lto_priv.368]+0x38>
    if (timmy.expired(TWI_TIMEOUT_MS)) {
   21cd8:	6a e0       	ldi	r22, 0x0A	; 10
   21cda:	70 e0       	ldi	r23, 0x00	; 0
   21cdc:	ce 01       	movw	r24, r28
   21cde:	01 96       	adiw	r24, 0x01	; 1
   21ce0:	0f 94 1f 0e 	call	0x21c3e	; 0x21c3e <Timer<unsigned short>::expired(unsigned short)>
   21ce4:	88 23       	and	r24, r24
   21ce6:	a1 f3       	breq	.-24     	; 0x21cd0 <twi_wait(unsigned char) [clone .lto_priv.368]+0x1c>
      return 2;
   21ce8:	82 e0       	ldi	r24, 0x02	; 2
   21cea:	09 c0       	rjmp	.+18     	; 0x21cfe <twi_wait(unsigned char) [clone .lto_priv.368]+0x4a>
    }
  }
  if(TW_STATUS != status)
   21cec:	80 91 b9 00 	lds	r24, 0x00B9	; 0x8000b9 <__TEXT_REGION_LENGTH__+0x7c20b9>
   21cf0:	88 7f       	andi	r24, 0xF8	; 248
   21cf2:	18 17       	cp	r17, r24
   21cf4:	59 f0       	breq	.+22     	; 0x21d0c <twi_wait(unsigned char) [clone .lto_priv.368]+0x58>
}


static void twi_stop()
{
  TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTO);
   21cf6:	84 e9       	ldi	r24, 0x94	; 148
   21cf8:	80 93 bc 00 	sts	0x00BC, r24	; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc>
    }
  }
  if(TW_STATUS != status)
  {
      twi_stop();
      return 1;
   21cfc:	81 e0       	ldi	r24, 0x01	; 1
  }
  return 0;
}
   21cfe:	0f 90       	pop	r0
   21d00:	0f 90       	pop	r0
   21d02:	0f 90       	pop	r0
   21d04:	df 91       	pop	r29
   21d06:	cf 91       	pop	r28
   21d08:	1f 91       	pop	r17
   21d0a:	08 95       	ret
  if(TW_STATUS != status)
  {
      twi_stop();
      return 1;
  }
  return 0;
   21d0c:	80 e0       	ldi	r24, 0x00	; 0
   21d0e:	f7 cf       	rjmp	.-18     	; 0x21cfe <twi_wait(unsigned char) [clone .lto_priv.368]+0x4a>

00021d10 <Timer<unsigned long>::expired(unsigned long)>:
 * @param msPeriod Time interval in milliseconds. Do not omit "ul" when using constant literal with LongTimer.
 * @retval true Timer has expired
 * @retval false Timer not expired yet, or is not running, or time window in which is timer considered expired passed.
 */
template<typename T>
bool Timer<T>::expired(T msPeriod)
   21d10:	8f 92       	push	r8
   21d12:	9f 92       	push	r9
   21d14:	af 92       	push	r10
   21d16:	bf 92       	push	r11
   21d18:	cf 92       	push	r12
   21d1a:	df 92       	push	r13
   21d1c:	ef 92       	push	r14
   21d1e:	ff 92       	push	r15
   21d20:	1f 93       	push	r17
   21d22:	cf 93       	push	r28
   21d24:	df 93       	push	r29
{
    if (!m_isRunning) return false;
   21d26:	fc 01       	movw	r30, r24
   21d28:	10 81       	ld	r17, Z
   21d2a:	11 11       	cpse	r17, r1
   21d2c:	0e c0       	rjmp	.+28     	; 0x21d4a <Timer<unsigned long>::expired(unsigned long)+0x3a>
   21d2e:	10 e0       	ldi	r17, 0x00	; 0
            expired = true;
        }
    }
    if (expired) m_isRunning = false;
    return expired;
}
   21d30:	81 2f       	mov	r24, r17
   21d32:	df 91       	pop	r29
   21d34:	cf 91       	pop	r28
   21d36:	1f 91       	pop	r17
   21d38:	ff 90       	pop	r15
   21d3a:	ef 90       	pop	r14
   21d3c:	df 90       	pop	r13
   21d3e:	cf 90       	pop	r12
   21d40:	bf 90       	pop	r11
   21d42:	af 90       	pop	r10
   21d44:	9f 90       	pop	r9
   21d46:	8f 90       	pop	r8
   21d48:	08 95       	ret
   21d4a:	6a 01       	movw	r12, r20
   21d4c:	7b 01       	movw	r14, r22
   21d4e:	ec 01       	movw	r28, r24
template<typename T>
bool Timer<T>::expired(T msPeriod)
{
    if (!m_isRunning) return false;
    bool expired = false;
    const T now = _millis();
   21d50:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   21d54:	4b 01       	movw	r8, r22
   21d56:	5c 01       	movw	r10, r24
    if (m_started <=  m_started + msPeriod)
   21d58:	89 81       	ldd	r24, Y+1	; 0x01
   21d5a:	9a 81       	ldd	r25, Y+2	; 0x02
   21d5c:	ab 81       	ldd	r26, Y+3	; 0x03
   21d5e:	bc 81       	ldd	r27, Y+4	; 0x04
   21d60:	c8 0e       	add	r12, r24
   21d62:	d9 1e       	adc	r13, r25
   21d64:	ea 1e       	adc	r14, r26
   21d66:	fb 1e       	adc	r15, r27
   21d68:	c8 16       	cp	r12, r24
   21d6a:	d9 06       	cpc	r13, r25
   21d6c:	ea 06       	cpc	r14, r26
   21d6e:	fb 06       	cpc	r15, r27
   21d70:	60 f0       	brcs	.+24     	; 0x21d8a <Timer<unsigned long>::expired(unsigned long)+0x7a>
    {
        if ((now >= m_started + msPeriod) || (now < m_started))
   21d72:	8c 14       	cp	r8, r12
   21d74:	9d 04       	cpc	r9, r13
   21d76:	ae 04       	cpc	r10, r14
   21d78:	bf 04       	cpc	r11, r15
   21d7a:	28 f4       	brcc	.+10     	; 0x21d86 <Timer<unsigned long>::expired(unsigned long)+0x76>
            expired = true;
        }
    }
    else
    {
        if ((now >= m_started + msPeriod) && (now < m_started))
   21d7c:	88 16       	cp	r8, r24
   21d7e:	99 06       	cpc	r9, r25
   21d80:	aa 06       	cpc	r10, r26
   21d82:	bb 06       	cpc	r11, r27
   21d84:	a0 f6       	brcc	.-88     	; 0x21d2e <Timer<unsigned long>::expired(unsigned long)+0x1e>
        {
            expired = true;
        }
    }
    if (expired) m_isRunning = false;
   21d86:	18 82       	st	Y, r1
   21d88:	d3 cf       	rjmp	.-90     	; 0x21d30 <Timer<unsigned long>::expired(unsigned long)+0x20>
            expired = true;
        }
    }
    else
    {
        if ((now >= m_started + msPeriod) && (now < m_started))
   21d8a:	8c 14       	cp	r8, r12
   21d8c:	9d 04       	cpc	r9, r13
   21d8e:	ae 04       	cpc	r10, r14
   21d90:	bf 04       	cpc	r11, r15
   21d92:	a0 f7       	brcc	.-24     	; 0x21d7c <Timer<unsigned long>::expired(unsigned long)+0x6c>
   21d94:	cc cf       	rjmp	.-104    	; 0x21d2e <Timer<unsigned long>::expired(unsigned long)+0x1e>

00021d96 <lcdui_print_status_line()>:
    }
    lcd_space(8 - chars);
}

//! @Brief Print status line on status screen
void lcdui_print_status_line(void) {
   21d96:	0f 93       	push	r16
   21d98:	1f 93       	push	r17
   21d9a:	cf 93       	push	r28
    static uint8_t heating_status_counter;
    if (heating_status != HeatingStatus::NO_HEATING) { // If heating flag, show progress of heating
   21d9c:	80 91 cb 03 	lds	r24, 0x03CB	; 0x8003cb <heating_status>
   21da0:	88 23       	and	r24, r24
   21da2:	09 f4       	brne	.+2      	; 0x21da6 <lcdui_print_status_line()+0x10>
   21da4:	4d c0       	rjmp	.+154    	; 0x21e40 <lcdui_print_status_line()+0xaa>
        heating_status_counter++;
   21da6:	80 91 04 06 	lds	r24, 0x0604	; 0x800604 <lcdui_print_status_line()::heating_status_counter>
   21daa:	8f 5f       	subi	r24, 0xFF	; 255
        if (heating_status_counter > 13) {
   21dac:	8e 30       	cpi	r24, 0x0E	; 14
   21dae:	b0 f4       	brcc	.+44     	; 0x21ddc <lcdui_print_status_line()+0x46>

//! @Brief Print status line on status screen
void lcdui_print_status_line(void) {
    static uint8_t heating_status_counter;
    if (heating_status != HeatingStatus::NO_HEATING) { // If heating flag, show progress of heating
        heating_status_counter++;
   21db0:	80 93 04 06 	sts	0x0604, r24	; 0x800604 <lcdui_print_status_line()::heating_status_counter>
        if (heating_status_counter > 13) {
            heating_status_counter = 0;
        }
        lcd_set_cursor(7, 3);
   21db4:	63 e0       	ldi	r22, 0x03	; 3
   21db6:	87 e0       	ldi	r24, 0x07	; 7
   21db8:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
        lcd_space(13);
   21dbc:	8d e0       	ldi	r24, 0x0D	; 13
   21dbe:	0e 94 28 6f 	call	0xde50	; 0xde50 <lcd_space(unsigned char)>

        for (uint8_t dots = 0; dots < heating_status_counter; dots++) {
   21dc2:	c0 e0       	ldi	r28, 0x00	; 0
   21dc4:	80 91 04 06 	lds	r24, 0x0604	; 0x800604 <lcdui_print_status_line()::heating_status_counter>
   21dc8:	c8 17       	cp	r28, r24
   21dca:	58 f4       	brcc	.+22     	; 0x21de2 <lcdui_print_status_line()+0x4c>
            lcd_putc_at(7 + dots, 3, '.');
   21dcc:	4e e2       	ldi	r20, 0x2E	; 46
   21dce:	63 e0       	ldi	r22, 0x03	; 3
   21dd0:	87 e0       	ldi	r24, 0x07	; 7
   21dd2:	8c 0f       	add	r24, r28
   21dd4:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
            heating_status_counter = 0;
        }
        lcd_set_cursor(7, 3);
        lcd_space(13);

        for (uint8_t dots = 0; dots < heating_status_counter; dots++) {
   21dd8:	cf 5f       	subi	r28, 0xFF	; 255
   21dda:	f4 cf       	rjmp	.-24     	; 0x21dc4 <lcdui_print_status_line()+0x2e>
void lcdui_print_status_line(void) {
    static uint8_t heating_status_counter;
    if (heating_status != HeatingStatus::NO_HEATING) { // If heating flag, show progress of heating
        heating_status_counter++;
        if (heating_status_counter > 13) {
            heating_status_counter = 0;
   21ddc:	10 92 04 06 	sts	0x0604, r1	; 0x800604 <lcdui_print_status_line()::heating_status_counter>
   21de0:	e9 cf       	rjmp	.-46     	; 0x21db4 <lcdui_print_status_line()+0x1e>
        lcd_space(13);

        for (uint8_t dots = 0; dots < heating_status_counter; dots++) {
            lcd_putc_at(7 + dots, 3, '.');
        }
        switch (heating_status) {
   21de2:	80 91 cb 03 	lds	r24, 0x03CB	; 0x8003cb <heating_status>
   21de6:	82 30       	cpi	r24, 0x02	; 2
   21de8:	d1 f0       	breq	.+52     	; 0x21e1e <lcdui_print_status_line()+0x88>
   21dea:	30 f4       	brcc	.+12     	; 0x21df8 <lcdui_print_status_line()+0x62>
   21dec:	81 30       	cpi	r24, 0x01	; 1
   21dee:	59 f0       	breq	.+22     	; 0x21e06 <lcdui_print_status_line()+0x70>
        case CustomMsg::Resuming: // Resuming
            lcd_puts_at_P(0, 3, _T(MSG_RESUMING_PRINT));
            break;
        }
    }
}
   21df0:	cf 91       	pop	r28
   21df2:	1f 91       	pop	r17
   21df4:	0f 91       	pop	r16
   21df6:	08 95       	ret
        lcd_space(13);

        for (uint8_t dots = 0; dots < heating_status_counter; dots++) {
            lcd_putc_at(7 + dots, 3, '.');
        }
        switch (heating_status) {
   21df8:	83 30       	cpi	r24, 0x03	; 3
   21dfa:	f9 f0       	breq	.+62     	; 0x21e3a <lcdui_print_status_line()+0xa4>
   21dfc:	84 30       	cpi	r24, 0x04	; 4
   21dfe:	c1 f7       	brne	.-16     	; 0x21df0 <lcdui_print_status_line()+0x5a>
            break;
        case HeatingStatus::BED_HEATING:
            lcd_puts_at_P(0, 3, _T(MSG_BED_HEATING));
            break;
        case HeatingStatus::BED_HEATING_COMPLETE:
            lcd_puts_at_P(0, 3, _T(MSG_BED_DONE));
   21e00:	8c e4       	ldi	r24, 0x4C	; 76
   21e02:	96 e5       	ldi	r25, 0x56	; 86
   21e04:	0e c0       	rjmp	.+28     	; 0x21e22 <lcdui_print_status_line()+0x8c>
        for (uint8_t dots = 0; dots < heating_status_counter; dots++) {
            lcd_putc_at(7 + dots, 3, '.');
        }
        switch (heating_status) {
        case HeatingStatus::EXTRUDER_HEATING:
            lcd_puts_at_P(0, 3, _T(MSG_HEATING));
   21e06:	85 e7       	ldi	r24, 0x75	; 117
   21e08:	96 e5       	ldi	r25, 0x56	; 86
                lcd_print(custom_message_state); // seconds
                lcd_print(' ');
            }
            break;
        case CustomMsg::Resuming: // Resuming
            lcd_puts_at_P(0, 3, _T(MSG_RESUMING_PRINT));
   21e0a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   21e0e:	ac 01       	movw	r20, r24
   21e10:	63 e0       	ldi	r22, 0x03	; 3
   21e12:	80 e0       	ldi	r24, 0x00	; 0
            break;
        }
    }
}
   21e14:	cf 91       	pop	r28
   21e16:	1f 91       	pop	r17
   21e18:	0f 91       	pop	r16
                lcd_print(custom_message_state); // seconds
                lcd_print(' ');
            }
            break;
        case CustomMsg::Resuming: // Resuming
            lcd_puts_at_P(0, 3, _T(MSG_RESUMING_PRINT));
   21e1a:	0c 94 07 70 	jmp	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
        switch (heating_status) {
        case HeatingStatus::EXTRUDER_HEATING:
            lcd_puts_at_P(0, 3, _T(MSG_HEATING));
            break;
        case HeatingStatus::EXTRUDER_HEATING_COMPLETE:
            lcd_puts_at_P(0, 3, _T(MSG_HEATING_COMPLETE));
   21e1e:	85 e6       	ldi	r24, 0x65	; 101
   21e20:	96 e5       	ldi	r25, 0x56	; 86
            break;
        case HeatingStatus::BED_HEATING:
            lcd_puts_at_P(0, 3, _T(MSG_BED_HEATING));
            break;
        case HeatingStatus::BED_HEATING_COMPLETE:
            lcd_puts_at_P(0, 3, _T(MSG_BED_DONE));
   21e22:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   21e26:	ac 01       	movw	r20, r24
   21e28:	63 e0       	ldi	r22, 0x03	; 3
   21e2a:	80 e0       	ldi	r24, 0x00	; 0
   21e2c:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
            heating_status = HeatingStatus::NO_HEATING;
   21e30:	10 92 cb 03 	sts	0x03CB, r1	; 0x8003cb <heating_status>
            heating_status_counter = 0;
   21e34:	10 92 04 06 	sts	0x0604, r1	; 0x800604 <lcdui_print_status_line()::heating_status_counter>
   21e38:	db cf       	rjmp	.-74     	; 0x21df0 <lcdui_print_status_line()+0x5a>
            lcd_puts_at_P(0, 3, _T(MSG_HEATING_COMPLETE));
            heating_status = HeatingStatus::NO_HEATING;
            heating_status_counter = 0;
            break;
        case HeatingStatus::BED_HEATING:
            lcd_puts_at_P(0, 3, _T(MSG_BED_HEATING));
   21e3a:	87 e5       	ldi	r24, 0x57	; 87
   21e3c:	96 e5       	ldi	r25, 0x56	; 86
   21e3e:	e5 cf       	rjmp	.-54     	; 0x21e0a <lcdui_print_status_line()+0x74>
#ifdef SHOW_FILENAME_AFTER_FINISH
        || (GetPrinterState() == PrinterState::SDPrintingFinished)
#endif //SHOW_FILENAME_AFTER_FINISH
        ) &&
        (custom_message_type == CustomMsg::Status) &&
        (lcd_status_message_level <= LCD_STATUS_INFO) &&
   21e40:	80 91 d7 13 	lds	r24, 0x13D7	; 0x8013d7 <card+0x2>
   21e44:	88 23       	and	r24, r24
   21e46:	61 f1       	breq	.+88     	; 0x21ea0 <lcdui_print_status_line()+0x10a>
    }
    else if (((IS_SD_PRINTING)
#ifdef SHOW_FILENAME_AFTER_FINISH
        || (GetPrinterState() == PrinterState::SDPrintingFinished)
#endif //SHOW_FILENAME_AFTER_FINISH
        ) &&
   21e48:	80 91 5d 06 	lds	r24, 0x065D	; 0x80065d <custom_message_type>
   21e4c:	81 11       	cpse	r24, r1
   21e4e:	28 c0       	rjmp	.+80     	; 0x21ea0 <lcdui_print_status_line()+0x10a>
        (custom_message_type == CustomMsg::Status) &&
   21e50:	80 91 c0 03 	lds	r24, 0x03C0	; 0x8003c0 <_ZL24lcd_status_message_level.lto_priv.422>
   21e54:	82 30       	cpi	r24, 0x02	; 2
   21e56:	20 f5       	brcc	.+72     	; 0x21ea0 <lcdui_print_status_line()+0x10a>
}

template<typename T>
bool Timer<T>::expired_cont(T msPeriod)
{
    return !m_isRunning || expired(msPeriod);
   21e58:	80 91 7a 04 	lds	r24, 0x047A	; 0x80047a <_ZL26lcd_status_message_timeout.lto_priv.423>
   21e5c:	81 11       	cpse	r24, r1
   21e5e:	16 c0       	rjmp	.+44     	; 0x21e8c <lcdui_print_status_line()+0xf6>
        (lcd_status_message_level <= LCD_STATUS_INFO) &&
        lcd_status_message_timeout.expired_cont(LCD_STATUS_INFO_TIMEOUT))
    {
        // If printing from SD, show what we are printing
        const char* longFilenameOLD = (card.longFilename[0] ? card.longFilename : card.filename);
   21e60:	80 91 ee 13 	lds	r24, 0x13EE	; 0x8013ee <card+0x19>
   21e64:	88 23       	and	r24, r24
   21e66:	09 f4       	brne	.+2      	; 0x21e6a <lcdui_print_status_line()+0xd4>
   21e68:	35 c0       	rjmp	.+106    	; 0x21ed4 <lcdui_print_status_line()+0x13e>
   21e6a:	8e ee       	ldi	r24, 0xEE	; 238
   21e6c:	93 e1       	ldi	r25, 0x13	; 19
        if( lcd_print_pad(&longFilenameOLD[scrollstuff], LCD_WIDTH) == 0)
   21e6e:	20 91 62 0d 	lds	r18, 0x0D62	; 0x800d62 <scrollstuff>
   21e72:	64 e1       	ldi	r22, 0x14	; 20
   21e74:	82 0f       	add	r24, r18
   21e76:	91 1d       	adc	r25, r1
   21e78:	0e 94 47 73 	call	0xe68e	; 0xe68e <lcd_print_pad(char const*, unsigned char)>
   21e7c:	81 11       	cpse	r24, r1
   21e7e:	2d c0       	rjmp	.+90     	; 0x21eda <lcdui_print_status_line()+0x144>
        {
            scrollstuff++;
   21e80:	80 91 62 0d 	lds	r24, 0x0D62	; 0x800d62 <scrollstuff>
   21e84:	8f 5f       	subi	r24, 0xFF	; 255
   21e86:	80 93 62 0d 	sts	0x0D62, r24	; 0x800d62 <scrollstuff>
   21e8a:	b2 cf       	rjmp	.-156    	; 0x21df0 <lcdui_print_status_line()+0x5a>
   21e8c:	40 e2       	ldi	r20, 0x20	; 32
   21e8e:	5e e4       	ldi	r21, 0x4E	; 78
   21e90:	60 e0       	ldi	r22, 0x00	; 0
   21e92:	70 e0       	ldi	r23, 0x00	; 0
   21e94:	8a e7       	ldi	r24, 0x7A	; 122
   21e96:	94 e0       	ldi	r25, 0x04	; 4
   21e98:	0f 94 88 0e 	call	0x21d10	; 0x21d10 <Timer<unsigned long>::expired(unsigned long)>
   21e9c:	81 11       	cpse	r24, r1
   21e9e:	e0 cf       	rjmp	.-64     	; 0x21e60 <lcdui_print_status_line()+0xca>
            scrollstuff = 0;
        }
    } else { // Otherwise check for other special events
        if ( custom_message_type != CustomMsg::Status
        && lcd_status_message_timeout.running()
        && lcd_status_message_timeout.elapsed() < LCD_STATUS_DELAYED_TIMEOUT)
   21ea0:	80 91 5d 06 	lds	r24, 0x065D	; 0x80065d <custom_message_type>
   21ea4:	81 11       	cpse	r24, r1
   21ea6:	1c c0       	rjmp	.+56     	; 0x21ee0 <lcdui_print_status_line()+0x14a>
        {
            return; // Nothing to do, waiting for delay to expire
        }

        switch (custom_message_type) {
   21ea8:	e0 91 5d 06 	lds	r30, 0x065D	; 0x80065d <custom_message_type>
   21eac:	ea 30       	cpi	r30, 0x0A	; 10
   21eae:	08 f0       	brcs	.+2      	; 0x21eb2 <lcdui_print_status_line()+0x11c>
   21eb0:	9f cf       	rjmp	.-194    	; 0x21df0 <lcdui_print_status_line()+0x5a>
   21eb2:	f0 e0       	ldi	r31, 0x00	; 0
   21eb4:	88 27       	eor	r24, r24
   21eb6:	e0 5a       	subi	r30, 0xA0	; 160
   21eb8:	f0 4f       	sbci	r31, 0xF0	; 240
   21eba:	8e 4f       	sbci	r24, 0xFE	; 254
   21ebc:	0d 94 f0 a4 	jmp	0x349e0	; 0x349e0 <__tablejump2__>
   21ec0:	46 37       	cpi	r20, 0x76	; 118
   21ec2:	f2 36       	cpi	r31, 0x62	; 98
   21ec4:	46 37       	cpi	r20, 0x76	; 118
   21ec6:	32 37       	cpi	r19, 0x72	; 114
   21ec8:	5a 38       	cpi	r21, 0x8A	; 138
   21eca:	8e 38       	cpi	r24, 0x8E	; 142
   21ecc:	46 37       	cpi	r20, 0x76	; 118
   21ece:	46 37       	cpi	r20, 0x76	; 118
   21ed0:	d2 37       	cpi	r29, 0x72	; 114
   21ed2:	46 37       	cpi	r20, 0x76	; 118
        (custom_message_type == CustomMsg::Status) &&
        (lcd_status_message_level <= LCD_STATUS_INFO) &&
        lcd_status_message_timeout.expired_cont(LCD_STATUS_INFO_TIMEOUT))
    {
        // If printing from SD, show what we are printing
        const char* longFilenameOLD = (card.longFilename[0] ? card.longFilename : card.filename);
   21ed4:	89 ed       	ldi	r24, 0xD9	; 217
   21ed6:	93 e1       	ldi	r25, 0x13	; 19
   21ed8:	ca cf       	rjmp	.-108    	; 0x21e6e <lcdui_print_status_line()+0xd8>
        if( lcd_print_pad(&longFilenameOLD[scrollstuff], LCD_WIDTH) == 0)
        {
            scrollstuff++;
        } else {
            scrollstuff = 0;
   21eda:	10 92 62 0d 	sts	0x0D62, r1	; 0x800d62 <scrollstuff>
   21ede:	88 cf       	rjmp	.-240    	; 0x21df0 <lcdui_print_status_line()+0x5a>
        }
    } else { // Otherwise check for other special events
        if ( custom_message_type != CustomMsg::Status
        && lcd_status_message_timeout.running()
   21ee0:	80 91 7a 04 	lds	r24, 0x047A	; 0x80047a <_ZL26lcd_status_message_timeout.lto_priv.423>
   21ee4:	88 23       	and	r24, r24
   21ee6:	01 f3       	breq	.-64     	; 0x21ea8 <lcdui_print_status_line()+0x112>
 * This function is expected to handle wrap around of time register well.
 * The maximum elapsed time is dictated by the template type
 */
template<typename T>
T Timer<T>::elapsed() {
  return m_isRunning ? (_millis() - m_started) : 0;
   21ee8:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   21eec:	00 91 7b 04 	lds	r16, 0x047B	; 0x80047b <_ZL26lcd_status_message_timeout.lto_priv.423+0x1>
   21ef0:	10 91 7c 04 	lds	r17, 0x047C	; 0x80047c <_ZL26lcd_status_message_timeout.lto_priv.423+0x2>
   21ef4:	20 91 7d 04 	lds	r18, 0x047D	; 0x80047d <_ZL26lcd_status_message_timeout.lto_priv.423+0x3>
   21ef8:	30 91 7e 04 	lds	r19, 0x047E	; 0x80047e <_ZL26lcd_status_message_timeout.lto_priv.423+0x4>
   21efc:	60 1b       	sub	r22, r16
   21efe:	71 0b       	sbc	r23, r17
   21f00:	82 0b       	sbc	r24, r18
   21f02:	93 0b       	sbc	r25, r19
        && lcd_status_message_timeout.elapsed() < LCD_STATUS_DELAYED_TIMEOUT)
   21f04:	60 3a       	cpi	r22, 0xA0	; 160
   21f06:	7f 40       	sbci	r23, 0x0F	; 15
   21f08:	81 05       	cpc	r24, r1
   21f0a:	91 05       	cpc	r25, r1
   21f0c:	68 f6       	brcc	.-102    	; 0x21ea8 <lcdui_print_status_line()+0x112>
   21f0e:	70 cf       	rjmp	.-288    	; 0x21df0 <lcdui_print_status_line()+0x5a>
        case CustomMsg::Status: // Nothing special, print status message normally
        case CustomMsg::M0Wait: // M0/M1 Wait command working even from SD
        case CustomMsg::FilamentLoading: // If loading filament, print status
        case CustomMsg::MMUProgress: // MMU Progress Codes
        {
            lcd_set_cursor(lcd_status_message_idx, 3);
   21f10:	63 e0       	ldi	r22, 0x03	; 3
   21f12:	80 91 64 04 	lds	r24, 0x0464	; 0x800464 <_ZL22lcd_status_message_idx.lto_priv.419>
   21f16:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
            const uint8_t padding = lcd_print_pad(&lcd_status_message[lcd_status_message_idx], LCD_WIDTH - lcd_status_message_idx);
   21f1a:	80 91 64 04 	lds	r24, 0x0464	; 0x800464 <_ZL22lcd_status_message_idx.lto_priv.419>
   21f1e:	c4 e1       	ldi	r28, 0x14	; 20
   21f20:	6c 2f       	mov	r22, r28
   21f22:	68 1b       	sub	r22, r24
   21f24:	90 e0       	ldi	r25, 0x00	; 0
   21f26:	8b 59       	subi	r24, 0x9B	; 155
   21f28:	9b 4f       	sbci	r25, 0xFB	; 251
   21f2a:	0e 94 47 73 	call	0xe68e	; 0xe68e <lcd_print_pad(char const*, unsigned char)>
            lcd_status_message_idx = LCD_WIDTH - padding;
   21f2e:	c8 1b       	sub	r28, r24
   21f30:	c0 93 64 04 	sts	0x0464, r28	; 0x800464 <_ZL22lcd_status_message_idx.lto_priv.419>
   21f34:	5d cf       	rjmp	.-326    	; 0x21df0 <lcdui_print_status_line()+0x5a>
        }
        break;
        case CustomMsg::MeshBedLeveling: // If mesh bed leveling in progress, show the status
            if (custom_message_state > 10) {
   21f36:	80 91 de 03 	lds	r24, 0x03DE	; 0x8003de <custom_message_state>
   21f3a:	8b 30       	cpi	r24, 0x0B	; 11
   21f3c:	08 f1       	brcs	.+66     	; 0x21f80 <lcdui_print_status_line()+0x1ea>
                lcd_set_cursor(0, 3);
   21f3e:	63 e0       	ldi	r22, 0x03	; 3
   21f40:	80 e0       	ldi	r24, 0x00	; 0
   21f42:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
                lcd_space(LCD_WIDTH);
   21f46:	84 e1       	ldi	r24, 0x14	; 20
   21f48:	0e 94 28 6f 	call	0xde50	; 0xde50 <lcd_space(unsigned char)>
                lcd_puts_at_P(0, 3, _T(MSG_CALIBRATE_Z_AUTO));
   21f4c:	8c e3       	ldi	r24, 0x3C	; 60
   21f4e:	96 e5       	ldi	r25, 0x56	; 86
   21f50:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   21f54:	ac 01       	movw	r20, r24
   21f56:	63 e0       	ldi	r22, 0x03	; 3
   21f58:	80 e0       	ldi	r24, 0x00	; 0
   21f5a:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
                lcd_puts_P(PSTR(" : "));
   21f5e:	8f e7       	ldi	r24, 0x7F	; 127
   21f60:	97 e9       	ldi	r25, 0x97	; 151
   21f62:	0e 94 1d 6f 	call	0xde3a	; 0xde3a <lcd_puts_P(char const*)>
                lcd_print(custom_message_state - 10);
   21f66:	60 91 de 03 	lds	r22, 0x03DE	; 0x8003de <custom_message_state>
   21f6a:	6a 50       	subi	r22, 0x0A	; 10
   21f6c:	77 0b       	sbc	r23, r23
	lcd_print((unsigned long) b, base);
}

void lcd_print(int n, int base)
{
	lcd_print((long) n, base);
   21f6e:	07 2e       	mov	r0, r23
   21f70:	00 0c       	add	r0, r0
   21f72:	88 0b       	sbc	r24, r24
   21f74:	99 0b       	sbc	r25, r25
        case CustomMsg::Resuming: // Resuming
            lcd_puts_at_P(0, 3, _T(MSG_RESUMING_PRINT));
            break;
        }
    }
}
   21f76:	cf 91       	pop	r28
   21f78:	1f 91       	pop	r17
   21f7a:	0f 91       	pop	r16
   21f7c:	0c 94 db 71 	jmp	0xe3b6	; 0xe3b6 <lcd_print(long, int) [clone .part.3]>
                lcd_space(LCD_WIDTH);
                lcd_puts_at_P(0, 3, _T(MSG_CALIBRATE_Z_AUTO));
                lcd_puts_P(PSTR(" : "));
                lcd_print(custom_message_state - 10);
            } else {
                if (custom_message_state == 3) {
   21f80:	83 30       	cpi	r24, 0x03	; 3
   21f82:	31 f4       	brne	.+12     	; 0x21f90 <lcdui_print_status_line()+0x1fa>
                    lcd_setstatuspgm(MSG_WELCOME);
   21f84:	86 ee       	ldi	r24, 0xE6	; 230
   21f86:	9b e6       	ldi	r25, 0x6B	; 107
   21f88:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
                    custom_message_type = CustomMsg::Status;
   21f8c:	10 92 5d 06 	sts	0x065D, r1	; 0x80065d <custom_message_type>
                }
                if (custom_message_state > 3 && custom_message_state <= 10) {
   21f90:	80 91 de 03 	lds	r24, 0x03DE	; 0x8003de <custom_message_state>
   21f94:	84 50       	subi	r24, 0x04	; 4
   21f96:	87 30       	cpi	r24, 0x07	; 7
   21f98:	08 f0       	brcs	.+2      	; 0x21f9c <lcdui_print_status_line()+0x206>
   21f9a:	2a cf       	rjmp	.-428    	; 0x21df0 <lcdui_print_status_line()+0x5a>
                    lcd_set_cursor(0, 3);
   21f9c:	63 e0       	ldi	r22, 0x03	; 3
   21f9e:	80 e0       	ldi	r24, 0x00	; 0
   21fa0:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
                    lcd_space(19);
   21fa4:	83 e1       	ldi	r24, 0x13	; 19
   21fa6:	0e 94 28 6f 	call	0xde50	; 0xde50 <lcd_space(unsigned char)>
                    lcd_puts_at_P(0, 3, _T(MSG_HOMEYZ_DONE));
   21faa:	89 e2       	ldi	r24, 0x29	; 41
   21fac:	96 e5       	ldi	r25, 0x56	; 86
   21fae:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   21fb2:	ac 01       	movw	r20, r24
   21fb4:	63 e0       	ldi	r22, 0x03	; 3
   21fb6:	80 e0       	ldi	r24, 0x00	; 0
   21fb8:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
                    custom_message_state--;
   21fbc:	80 91 de 03 	lds	r24, 0x03DE	; 0x8003de <custom_message_state>
   21fc0:	81 50       	subi	r24, 0x01	; 1
   21fc2:	80 93 de 03 	sts	0x03DE, r24	; 0x8003de <custom_message_state>
   21fc6:	14 cf       	rjmp	.-472    	; 0x21df0 <lcdui_print_status_line()+0x5a>
                }
            }
            break;
        case CustomMsg::PidCal: // PID tuning in progress
            lcd_print_pad(lcd_status_message, LCD_WIDTH);
   21fc8:	64 e1       	ldi	r22, 0x14	; 20
   21fca:	85 e6       	ldi	r24, 0x65	; 101
   21fcc:	94 e0       	ldi	r25, 0x04	; 4
   21fce:	0e 94 47 73 	call	0xe68e	; 0xe68e <lcd_print_pad(char const*, unsigned char)>
            if (pid_cycle <= pid_number_of_cycles && custom_message_state > 0) {
   21fd2:	20 91 02 06 	lds	r18, 0x0602	; 0x800602 <pid_cycle>
   21fd6:	30 91 03 06 	lds	r19, 0x0603	; 0x800603 <pid_cycle+0x1>
   21fda:	80 91 00 06 	lds	r24, 0x0600	; 0x800600 <pid_number_of_cycles>
   21fde:	90 91 01 06 	lds	r25, 0x0601	; 0x800601 <pid_number_of_cycles+0x1>
   21fe2:	82 17       	cp	r24, r18
   21fe4:	93 07       	cpc	r25, r19
   21fe6:	0c f4       	brge	.+2      	; 0x21fea <lcdui_print_status_line()+0x254>
   21fe8:	03 cf       	rjmp	.-506    	; 0x21df0 <lcdui_print_status_line()+0x5a>
   21fea:	80 91 de 03 	lds	r24, 0x03DE	; 0x8003de <custom_message_state>
   21fee:	88 23       	and	r24, r24
   21ff0:	09 f4       	brne	.+2      	; 0x21ff4 <lcdui_print_status_line()+0x25e>
   21ff2:	fe ce       	rjmp	.-516    	; 0x21df0 <lcdui_print_status_line()+0x5a>
                lcd_set_cursor(10, 3);
   21ff4:	63 e0       	ldi	r22, 0x03	; 3
   21ff6:	8a e0       	ldi	r24, 0x0A	; 10
   21ff8:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
                lcd_printf_P(PSTR("%3d/%-3d"), pid_cycle, pid_number_of_cycles);
   21ffc:	80 91 01 06 	lds	r24, 0x0601	; 0x800601 <pid_number_of_cycles+0x1>
   22000:	8f 93       	push	r24
   22002:	80 91 00 06 	lds	r24, 0x0600	; 0x800600 <pid_number_of_cycles>
   22006:	8f 93       	push	r24
   22008:	80 91 03 06 	lds	r24, 0x0603	; 0x800603 <pid_cycle+0x1>
   2200c:	8f 93       	push	r24
   2200e:	80 91 02 06 	lds	r24, 0x0602	; 0x800602 <pid_cycle>
   22012:	8f 93       	push	r24
   22014:	86 e7       	ldi	r24, 0x76	; 118
   22016:	97 e9       	ldi	r25, 0x97	; 151
            }
            break;
        case CustomMsg::TempCal: // PINDA temp calibration in progress
            lcd_set_cursor(0, 3);
            lcd_printf_P(PSTR("%-12.12S%-d/6"), _T(MSG_PINDA_CALIBRATION), custom_message_state);
   22018:	9f 93       	push	r25
   2201a:	8f 93       	push	r24
   2201c:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
   22020:	0f 90       	pop	r0
   22022:	0f 90       	pop	r0
   22024:	0f 90       	pop	r0
   22026:	0f 90       	pop	r0
   22028:	0f 90       	pop	r0
   2202a:	0f 90       	pop	r0
   2202c:	e1 ce       	rjmp	.-574    	; 0x21df0 <lcdui_print_status_line()+0x5a>
                lcd_set_cursor(10, 3);
                lcd_printf_P(PSTR("%3d/%-3d"), pid_cycle, pid_number_of_cycles);
            }
            break;
        case CustomMsg::TempCal: // PINDA temp calibration in progress
            lcd_set_cursor(0, 3);
   2202e:	63 e0       	ldi	r22, 0x03	; 3
   22030:	80 e0       	ldi	r24, 0x00	; 0
   22032:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
            lcd_printf_P(PSTR("%-12.12S%-d/6"), _T(MSG_PINDA_CALIBRATION), custom_message_state);
   22036:	c0 91 de 03 	lds	r28, 0x03DE	; 0x8003de <custom_message_state>
   2203a:	8c ec       	ldi	r24, 0xCC	; 204
   2203c:	95 e4       	ldi	r25, 0x45	; 69
   2203e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   22042:	1f 92       	push	r1
   22044:	cf 93       	push	r28
   22046:	9f 93       	push	r25
   22048:	8f 93       	push	r24
   2204a:	88 e6       	ldi	r24, 0x68	; 104
   2204c:	97 e9       	ldi	r25, 0x97	; 151
   2204e:	e4 cf       	rjmp	.-56     	; 0x22018 <lcdui_print_status_line()+0x282>
            break;
        case CustomMsg::TempCompPreheat:              // temp compensation preheat
            lcd_puts_at_P(0, 3, _T(MSG_PINDA_PREHEAT));
   22050:	89 e1       	ldi	r24, 0x19	; 25
   22052:	96 e5       	ldi	r25, 0x56	; 86
   22054:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   22058:	ac 01       	movw	r20, r24
   2205a:	63 e0       	ldi	r22, 0x03	; 3
   2205c:	80 e0       	ldi	r24, 0x00	; 0
   2205e:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
            if (custom_message_state <= PINDA_HEAT_T) {
   22062:	80 91 de 03 	lds	r24, 0x03DE	; 0x8003de <custom_message_state>
   22066:	89 37       	cpi	r24, 0x79	; 121
   22068:	08 f0       	brcs	.+2      	; 0x2206c <lcdui_print_status_line()+0x2d6>
   2206a:	c2 ce       	rjmp	.-636    	; 0x21df0 <lcdui_print_status_line()+0x5a>
                lcd_puts_P(PSTR(": "));
   2206c:	85 e6       	ldi	r24, 0x65	; 101
   2206e:	97 e9       	ldi	r25, 0x97	; 151
   22070:	0e 94 1d 6f 	call	0xde3a	; 0xde3a <lcd_puts_P(char const*)>
}

void lcd_print(unsigned long n, int base)
{
	if (base == 0)
		lcd_write(n);
   22074:	80 91 de 03 	lds	r24, 0x03DE	; 0x8003de <custom_message_state>
   22078:	0e 94 a2 70 	call	0xe144	; 0xe144 <lcd_write(unsigned char) [clone .lto_priv.402]>
}

void lcd_print(long n, int base)
{
	if (base == 0)
		lcd_write(n);
   2207c:	80 e2       	ldi	r24, 0x20	; 32
        case CustomMsg::Resuming: // Resuming
            lcd_puts_at_P(0, 3, _T(MSG_RESUMING_PRINT));
            break;
        }
    }
}
   2207e:	cf 91       	pop	r28
   22080:	1f 91       	pop	r17
   22082:	0f 91       	pop	r16
   22084:	0c 94 a2 70 	jmp	0xe144	; 0xe144 <lcd_write(unsigned char) [clone .lto_priv.402]>
                lcd_print(custom_message_state); // seconds
                lcd_print(' ');
            }
            break;
        case CustomMsg::Resuming: // Resuming
            lcd_puts_at_P(0, 3, _T(MSG_RESUMING_PRINT));
   22088:	88 e0       	ldi	r24, 0x08	; 8
   2208a:	96 e5       	ldi	r25, 0x56	; 86
   2208c:	be ce       	rjmp	.-644    	; 0x21e0a <lcdui_print_status_line()+0x74>

0002208e <Timer<unsigned long>::start()>:

/**
 * @brief Start timer
 */
template<typename T>
void Timer<T>::start()
   2208e:	cf 93       	push	r28
   22090:	df 93       	push	r29
   22092:	ec 01       	movw	r28, r24
{
    m_started = _millis();
   22094:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   22098:	69 83       	std	Y+1, r22	; 0x01
   2209a:	7a 83       	std	Y+2, r23	; 0x02
   2209c:	8b 83       	std	Y+3, r24	; 0x03
   2209e:	9c 83       	std	Y+4, r25	; 0x04
    m_isRunning = true;
   220a0:	81 e0       	ldi	r24, 0x01	; 1
   220a2:	88 83       	st	Y, r24
}
   220a4:	df 91       	pop	r29
   220a6:	cf 91       	pop	r28
   220a8:	08 95       	ret

000220aa <temp_error_messagepgm(char const*, unsigned char)>:

//! signal a temperature error on both the lcd and serial
//! @param type short error abbreviation (PROGMEM)
//! @param e optional extruder index for hotend errors
static void temp_error_messagepgm(const char* PROGMEM type, uint8_t e = EXTRUDERS)
{
   220aa:	cf 92       	push	r12
   220ac:	df 92       	push	r13
   220ae:	ef 92       	push	r14
   220b0:	ff 92       	push	r15
   220b2:	1f 93       	push	r17
   220b4:	cf 93       	push	r28
   220b6:	df 93       	push	r29
   220b8:	cd b7       	in	r28, 0x3d	; 61
   220ba:	de b7       	in	r29, 0x3e	; 62
   220bc:	64 97       	sbiw	r28, 0x14	; 20
   220be:	0f b6       	in	r0, 0x3f	; 63
   220c0:	f8 94       	cli
   220c2:	de bf       	out	0x3e, r29	; 62
   220c4:	0f be       	out	0x3f, r0	; 63
   220c6:	cd bf       	out	0x3d, r28	; 61
   220c8:	7c 01       	movw	r14, r24
   220ca:	16 2f       	mov	r17, r22
    char msg[LCD_WIDTH];
    strcpy_P(msg, PSTR("Err: "));
   220cc:	6e e2       	ldi	r22, 0x2E	; 46
   220ce:	77 e9       	ldi	r23, 0x97	; 151
   220d0:	ce 01       	movw	r24, r28
   220d2:	01 96       	adiw	r24, 0x01	; 1
   220d4:	0f 94 97 a1 	call	0x3432e	; 0x3432e <strcpy_P>
    strcat_P(msg, type);
   220d8:	b7 01       	movw	r22, r14
   220da:	ce 01       	movw	r24, r28
   220dc:	01 96       	adiw	r24, 0x01	; 1
   220de:	0f 94 83 a1 	call	0x34306	; 0x34306 <strcat_P>
    lcd_status_message_timeout.start();
}

void lcd_setalertstatus_(const char* message, uint8_t severity, bool progmem)
{
    if (lcd_message_check(severity)) {
   220e2:	83 e0       	ldi	r24, 0x03	; 3
   220e4:	0e 94 16 da 	call	0x1b42c	; 0x1b42c <lcd_message_check(unsigned char) [clone .lto_priv.486]>
   220e8:	88 23       	and	r24, r24
   220ea:	e1 f0       	breq	.+56     	; 0x22124 <temp_error_messagepgm(char const*, unsigned char)+0x7a>
        bool same = !(progmem?
            strcmp_P(lcd_status_message, message):
            strcmp(lcd_status_message, message));
   220ec:	be 01       	movw	r22, r28
   220ee:	6f 5f       	subi	r22, 0xFF	; 255
   220f0:	7f 4f       	sbci	r23, 0xFF	; 255
   220f2:	85 e6       	ldi	r24, 0x65	; 101
   220f4:	94 e0       	ldi	r25, 0x04	; 4
   220f6:	0f 94 42 aa 	call	0x35484	; 0x35484 <strcmp>
   220fa:	6c 01       	movw	r12, r24
        lcd_status_message_timeout.start();
   220fc:	8a e7       	ldi	r24, 0x7A	; 122
   220fe:	94 e0       	ldi	r25, 0x04	; 4
   22100:	0f 94 47 10 	call	0x2208e	; 0x2208e <Timer<unsigned long>::start()>
        lcd_status_message_level = severity;
   22104:	83 e0       	ldi	r24, 0x03	; 3
   22106:	80 93 c0 03 	sts	0x03C0, r24	; 0x8003c0 <_ZL24lcd_status_message_level.lto_priv.422>
        custom_message_type = CustomMsg::Status;
   2210a:	10 92 5d 06 	sts	0x065D, r1	; 0x80065d <custom_message_type>
        custom_message_state = 0;
   2210e:	10 92 de 03 	sts	0x03DE, r1	; 0x8003de <custom_message_state>
        if (!same) {
   22112:	cd 28       	or	r12, r13
   22114:	39 f0       	breq	.+14     	; 0x22124 <temp_error_messagepgm(char const*, unsigned char)+0x7a>
            // do not kick the user out of the menus if the message is unchanged
            lcd_updatestatus(message, progmem);
   22116:	60 e0       	ldi	r22, 0x00	; 0
   22118:	ce 01       	movw	r24, r28
   2211a:	01 96       	adiw	r24, 0x01	; 1
   2211c:	0e 94 fb d9 	call	0x1b3f6	; 0x1b3f6 <lcd_updatestatus(char const*, bool) [clone .lto_priv.487]>
            lcd_return_to_status();
   22120:	0f 94 d5 07 	call	0x20faa	; 0x20faa <lcd_return_to_status()>
    lcd_setalertstatus(msg, LCD_STATUS_CRITICAL);

    SERIAL_ERROR_START;
   22124:	81 eb       	ldi	r24, 0xB1	; 177
   22126:	91 ea       	ldi	r25, 0xA1	; 161
   22128:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>

    if(e != EXTRUDERS) {
   2212c:	11 30       	cpi	r17, 0x01	; 1
   2212e:	51 f0       	breq	.+20     	; 0x22144 <temp_error_messagepgm(char const*, unsigned char)+0x9a>
  print((unsigned long) b, base);
}

void MarlinSerial::print(int n, int base)
{
  print((long) n, base);
   22130:	61 2f       	mov	r22, r17
   22132:	70 e0       	ldi	r23, 0x00	; 0
   22134:	90 e0       	ldi	r25, 0x00	; 0
   22136:	80 e0       	ldi	r24, 0x00	; 0
   22138:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
        SERIAL_ERROR((int)e);
        SERIAL_ERRORPGM(": ");
   2213c:	8b e2       	ldi	r24, 0x2B	; 43
   2213e:	97 e9       	ldi	r25, 0x97	; 151
   22140:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    }

    SERIAL_ERRORPGM("Heaters switched off. ");
   22144:	84 e1       	ldi	r24, 0x14	; 20
   22146:	97 e9       	ldi	r25, 0x97	; 151
   22148:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    SERIAL_ERRORRPGM(type);
   2214c:	c7 01       	movw	r24, r14
   2214e:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    SERIAL_ERRORLNPGM(" triggered!");
   22152:	88 e0       	ldi	r24, 0x08	; 8
   22154:	97 e9       	ldi	r25, 0x97	; 151
   22156:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
}
   2215a:	64 96       	adiw	r28, 0x14	; 20
   2215c:	0f b6       	in	r0, 0x3f	; 63
   2215e:	f8 94       	cli
   22160:	de bf       	out	0x3e, r29	; 62
   22162:	0f be       	out	0x3f, r0	; 63
   22164:	cd bf       	out	0x3d, r28	; 61
   22166:	df 91       	pop	r29
   22168:	cf 91       	pop	r28
   2216a:	1f 91       	pop	r17
   2216c:	ff 90       	pop	r15
   2216e:	ef 90       	pop	r14
   22170:	df 90       	pop	r13
   22172:	cf 90       	pop	r12
   22174:	08 95       	ret

00022176 <__vector_15>:
volatile unsigned long timer2_overflow_count;
volatile unsigned long timer2_millis;
unsigned char timer2_fract = 0;

ISR(TIMER2_OVF_vect)
{
   22176:	1f 92       	push	r1
   22178:	0f 92       	push	r0
   2217a:	0f b6       	in	r0, 0x3f	; 63
   2217c:	0f 92       	push	r0
   2217e:	11 24       	eor	r1, r1
   22180:	2f 93       	push	r18
   22182:	3f 93       	push	r19
   22184:	8f 93       	push	r24
   22186:	9f 93       	push	r25
   22188:	af 93       	push	r26
   2218a:	bf 93       	push	r27
	// copy these to local variables so they can be stored in registers
	// (volatile variables must be read from memory on every access)
	unsigned long m = timer2_millis;
   2218c:	80 91 f8 05 	lds	r24, 0x05F8	; 0x8005f8 <timer2_millis>
   22190:	90 91 f9 05 	lds	r25, 0x05F9	; 0x8005f9 <timer2_millis+0x1>
   22194:	a0 91 fa 05 	lds	r26, 0x05FA	; 0x8005fa <timer2_millis+0x2>
   22198:	b0 91 fb 05 	lds	r27, 0x05FB	; 0x8005fb <timer2_millis+0x3>
	unsigned char f = timer2_fract;
   2219c:	30 91 f7 05 	lds	r19, 0x05F7	; 0x8005f7 <timer2_fract>
	m += MILLIS_INC;
	f += FRACT_INC;
   221a0:	23 e0       	ldi	r18, 0x03	; 3
   221a2:	23 0f       	add	r18, r19
	if (f >= FRACT_MAX)
   221a4:	2d 37       	cpi	r18, 0x7D	; 125
   221a6:	58 f5       	brcc	.+86     	; 0x221fe <__vector_15+0x88>
{
	// copy these to local variables so they can be stored in registers
	// (volatile variables must be read from memory on every access)
	unsigned long m = timer2_millis;
	unsigned char f = timer2_fract;
	m += MILLIS_INC;
   221a8:	01 96       	adiw	r24, 0x01	; 1
   221aa:	a1 1d       	adc	r26, r1
   221ac:	b1 1d       	adc	r27, r1
	if (f >= FRACT_MAX)
	{
		f -= FRACT_MAX;
		m += 1;
	}
	timer2_fract = f;
   221ae:	20 93 f7 05 	sts	0x05F7, r18	; 0x8005f7 <timer2_fract>
	timer2_millis = m;
   221b2:	80 93 f8 05 	sts	0x05F8, r24	; 0x8005f8 <timer2_millis>
   221b6:	90 93 f9 05 	sts	0x05F9, r25	; 0x8005f9 <timer2_millis+0x1>
   221ba:	a0 93 fa 05 	sts	0x05FA, r26	; 0x8005fa <timer2_millis+0x2>
   221be:	b0 93 fb 05 	sts	0x05FB, r27	; 0x8005fb <timer2_millis+0x3>
	timer2_overflow_count++;
   221c2:	80 91 fc 05 	lds	r24, 0x05FC	; 0x8005fc <timer2_overflow_count>
   221c6:	90 91 fd 05 	lds	r25, 0x05FD	; 0x8005fd <timer2_overflow_count+0x1>
   221ca:	a0 91 fe 05 	lds	r26, 0x05FE	; 0x8005fe <timer2_overflow_count+0x2>
   221ce:	b0 91 ff 05 	lds	r27, 0x05FF	; 0x8005ff <timer2_overflow_count+0x3>
   221d2:	01 96       	adiw	r24, 0x01	; 1
   221d4:	a1 1d       	adc	r26, r1
   221d6:	b1 1d       	adc	r27, r1
   221d8:	80 93 fc 05 	sts	0x05FC, r24	; 0x8005fc <timer2_overflow_count>
   221dc:	90 93 fd 05 	sts	0x05FD, r25	; 0x8005fd <timer2_overflow_count+0x1>
   221e0:	a0 93 fe 05 	sts	0x05FE, r26	; 0x8005fe <timer2_overflow_count+0x2>
   221e4:	b0 93 ff 05 	sts	0x05FF, r27	; 0x8005ff <timer2_overflow_count+0x3>
}
   221e8:	bf 91       	pop	r27
   221ea:	af 91       	pop	r26
   221ec:	9f 91       	pop	r25
   221ee:	8f 91       	pop	r24
   221f0:	3f 91       	pop	r19
   221f2:	2f 91       	pop	r18
   221f4:	0f 90       	pop	r0
   221f6:	0f be       	out	0x3f, r0	; 63
   221f8:	0f 90       	pop	r0
   221fa:	1f 90       	pop	r1
   221fc:	18 95       	reti
	unsigned char f = timer2_fract;
	m += MILLIS_INC;
	f += FRACT_INC;
	if (f >= FRACT_MAX)
	{
		f -= FRACT_MAX;
   221fe:	26 e8       	ldi	r18, 0x86	; 134
   22200:	23 0f       	add	r18, r19
		m += 1;
   22202:	02 96       	adiw	r24, 0x02	; 2
   22204:	a1 1d       	adc	r26, r1
   22206:	b1 1d       	adc	r27, r1
   22208:	d2 cf       	rjmp	.-92     	; 0x221ae <__vector_15+0x38>

0002220a <disable_heater()>:
    }
    ENABLE_TEMP_MGR_INTERRUPT();
}

void disable_heater()
{
   2220a:	cf 93       	push	r28
};

// Doesn't save FLASH when FORCE_INLINE removed.
FORCE_INLINE void setTargetHotend(const float &celsius) {
  target_temperature[0] = celsius;
   2220c:	10 92 5e 12 	sts	0x125E, r1	; 0x80125e <target_temperature+0x1>
   22210:	10 92 5d 12 	sts	0x125D, r1	; 0x80125d <target_temperature>
  resetPID(0);
};

FORCE_INLINE void setTargetBed(const float &celsius) {
  target_temperature_bed = celsius;
   22214:	10 92 5a 12 	sts	0x125A, r1	; 0x80125a <target_temperature_bed+0x1>
   22218:	10 92 59 12 	sts	0x1259, r1	; 0x801259 <target_temperature_bed>
  setTargetHotend(0);
  setTargetBed(0);

  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
   2221c:	cf b7       	in	r28, 0x3f	; 63
    return 1;
}

static __inline__ uint8_t __iCliRetVal(void)
{
    cli();
   2221e:	f8 94       	cli
      // propagate all values down the chain
      setIsrTargetTemperatures();
   22220:	0f 94 45 02 	call	0x2048a	; 0x2048a <setIsrTargetTemperatures()>
      temp_mgr_pid();
   22224:	0e 94 82 ff 	call	0x1ff04	; 0x1ff04 <temp_mgr_pid()>

      // we can't call soft_pwm_core directly to toggle the pins as it would require removing the inline
      // attribute, so disable each pin individually
#if defined(HEATER_0_PIN) && HEATER_0_PIN > -1 && EXTRUDERS > 0
      WRITE(HEATER_0_PIN,LOW);
   22228:	75 98       	cbi	0x0e, 5	; 14
#endif
#if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1
      // TODO: this doesn't take immediate effect!
      bedPWMDisabled = 0;
   2222a:	10 92 28 06 	sts	0x0628, r1	; 0x800628 <bedPWMDisabled>
    (void)__s;
}

static __inline__ void __iRestore(const  uint8_t *__s)
{
    SREG = *__s;
   2222e:	cf bf       	out	0x3f, r28	; 63
#endif
  }
}
   22230:	cf 91       	pop	r28
   22232:	08 95       	ret

00022234 <lcd_cooldown() [clone .lto_priv.406]>:

/* Menu implementation */

static void lcd_cooldown()
{
  disable_heater();
   22234:	0f 94 05 11 	call	0x2220a	; 0x2220a <disable_heater()>
  fanSpeed = 0;
   22238:	10 92 55 12 	sts	0x1255, r1	; 0x801255 <fanSpeed>
  lcd_return_to_status();
   2223c:	0d 94 d5 07 	jmp	0x20faa	; 0x20faa <lcd_return_to_status()>

00022240 <set_temp_error(TempErrorSource, unsigned char, TempErrorType)>:

// set the error type from within the temp_mgr isr to be handled in manager_heater
// - immediately disable all heaters and turn on all fans at full speed
// - prevent the user to set temperatures until all errors are cleared
void set_temp_error(TempErrorSource source, uint8_t index, TempErrorType type)
{
   22240:	1f 93       	push	r17
   22242:	cf 93       	push	r28
   22244:	df 93       	push	r29
   22246:	c8 2f       	mov	r28, r24
   22248:	16 2f       	mov	r17, r22
   2224a:	d4 2f       	mov	r29, r20
    // save the original target temperatures for recovery before disabling heaters
    if(!temp_error_state.error && !saved_printing) {
   2224c:	80 91 cc 03 	lds	r24, 0x03CC	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
   22250:	80 fd       	sbrc	r24, 0
   22252:	18 c0       	rjmp	.+48     	; 0x22284 <set_temp_error(TempErrorSource, unsigned char, TempErrorType)+0x44>
   22254:	80 91 73 12 	lds	r24, 0x1273	; 0x801273 <saved_printing>
   22258:	81 11       	cpse	r24, r1
   2225a:	14 c0       	rjmp	.+40     	; 0x22284 <set_temp_error(TempErrorSource, unsigned char, TempErrorType)+0x44>
        saved_bed_temperature = target_temperature_bed;
   2225c:	80 91 59 12 	lds	r24, 0x1259	; 0x801259 <target_temperature_bed>
   22260:	80 93 58 12 	sts	0x1258, r24	; 0x801258 <saved_bed_temperature>
        saved_extruder_temperature = target_temperature[index];
   22264:	e6 2f       	mov	r30, r22
   22266:	f0 e0       	ldi	r31, 0x00	; 0
   22268:	ee 0f       	add	r30, r30
   2226a:	ff 1f       	adc	r31, r31
   2226c:	e3 5a       	subi	r30, 0xA3	; 163
   2226e:	fd 4e       	sbci	r31, 0xED	; 237
   22270:	80 81       	ld	r24, Z
   22272:	91 81       	ldd	r25, Z+1	; 0x01
   22274:	90 93 5c 12 	sts	0x125C, r25	; 0x80125c <saved_extruder_temperature+0x1>
   22278:	80 93 5b 12 	sts	0x125B, r24	; 0x80125b <saved_extruder_temperature>
        saved_fan_speed = fanSpeed;
   2227c:	80 91 55 12 	lds	r24, 0x1255	; 0x801255 <fanSpeed>
   22280:	80 93 54 12 	sts	0x1254, r24	; 0x801254 <saved_fan_speed>
    }

    // keep disabling heaters and keep fans on as long as the condition is asserted
    disable_heater();
   22284:	0f 94 05 11 	call	0x2220a	; 0x2220a <disable_heater()>
void hotendFanSetFullSpeed()
{
#ifdef EXTRUDER_ALTFAN_DETECT
    altfanStatus.altfanOverride = 1; //full speed
#endif //EXTRUDER_ALTFAN_DETECT
    resetFanCheck();
   22288:	0e 94 a2 77 	call	0xef44	; 0xef44 <resetFanCheck()>
    setExtruderAutoFanState(3);
   2228c:	83 e0       	ldi	r24, 0x03	; 3
   2228e:	0e 94 af 77 	call	0xef5e	; 0xef5e <setExtruderAutoFanState(unsigned char)>
    SET_OUTPUT(FAN_PIN);
   22292:	80 91 01 01 	lds	r24, 0x0101	; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101>
   22296:	88 60       	ori	r24, 0x08	; 8
   22298:	80 93 01 01 	sts	0x0101, r24	; 0x800101 <__TEXT_REGION_LENGTH__+0x7c2101>
#ifdef FAN_SOFT_PWM
    fanSpeedSoftPwm = 255;
   2229c:	8f ef       	ldi	r24, 0xFF	; 255
   2229e:	80 93 1d 06 	sts	0x061D, r24	; 0x80061d <fanSpeedSoftPwm>
#else //FAN_SOFT_PWM
    analogWrite(FAN_PIN, 255);
#endif //FAN_SOFT_PWM
    fanSpeed = 255;
   222a2:	80 93 55 12 	sts	0x1255, r24	; 0x801255 <fanSpeed>
    hotendFanSetFullSpeed();

    // set the initial error source to the highest priority error
    if(!temp_error_state.error || (uint8_t)type < temp_error_state.type) {
   222a6:	80 91 cc 03 	lds	r24, 0x03CC	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
   222aa:	80 ff       	sbrs	r24, 0
   222ac:	07 c0       	rjmp	.+14     	; 0x222bc <set_temp_error(TempErrorSource, unsigned char, TempErrorType)+0x7c>
   222ae:	80 91 cc 03 	lds	r24, 0x03CC	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
   222b2:	82 95       	swap	r24
   222b4:	86 95       	lsr	r24
   222b6:	87 70       	andi	r24, 0x07	; 7
   222b8:	d8 17       	cp	r29, r24
   222ba:	c0 f4       	brcc	.+48     	; 0x222ec <set_temp_error(TempErrorSource, unsigned char, TempErrorType)+0xac>
        temp_error_state.source = (uint8_t)source;
   222bc:	c3 70       	andi	r28, 0x03	; 3
   222be:	cc 0f       	add	r28, r28
   222c0:	cc 0f       	add	r28, r28
   222c2:	80 91 cc 03 	lds	r24, 0x03CC	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
   222c6:	83 7f       	andi	r24, 0xF3	; 243
   222c8:	8c 2b       	or	r24, r28
   222ca:	80 93 cc 03 	sts	0x03CC, r24	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
        temp_error_state.index = index;
   222ce:	80 91 cc 03 	lds	r24, 0x03CC	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
   222d2:	10 fb       	bst	r17, 0
   222d4:	84 f9       	bld	r24, 4
   222d6:	80 93 cc 03 	sts	0x03CC, r24	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
        temp_error_state.type = (uint8_t)type;
   222da:	d2 95       	swap	r29
   222dc:	dd 0f       	add	r29, r29
   222de:	d0 7e       	andi	r29, 0xE0	; 224
   222e0:	40 91 cc 03 	lds	r20, 0x03CC	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
   222e4:	4f 71       	andi	r20, 0x1F	; 31
   222e6:	4d 2b       	or	r20, r29
   222e8:	40 93 cc 03 	sts	0x03CC, r20	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
    }

    // always set the error state
    temp_error_state.error = true;
   222ec:	80 91 cc 03 	lds	r24, 0x03CC	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
   222f0:	81 60       	ori	r24, 0x01	; 1
   222f2:	80 93 cc 03 	sts	0x03CC, r24	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
    temp_error_state.assert = true;
   222f6:	80 91 cc 03 	lds	r24, 0x03CC	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
   222fa:	82 60       	ori	r24, 0x02	; 2
   222fc:	80 93 cc 03 	sts	0x03CC, r24	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
}
   22300:	df 91       	pop	r29
   22302:	cf 91       	pop	r28
   22304:	1f 91       	pop	r17
   22306:	08 95       	ret

00022308 <temp_runaway_check(unsigned char, float, float, float, bool)>:
  timer4_init(); //for tone and Hotend fan PWM
}

#if (defined (TEMP_RUNAWAY_BED_HYSTERESIS) && TEMP_RUNAWAY_BED_TIMEOUT > 0) || (defined (TEMP_RUNAWAY_EXTRUDER_HYSTERESIS) && TEMP_RUNAWAY_EXTRUDER_TIMEOUT > 0)
static void temp_runaway_check(uint8_t _heater_id, float _target_temperature, float _current_temperature, float _output, bool _isbed)
{
   22308:	2f 92       	push	r2
   2230a:	3f 92       	push	r3
   2230c:	4f 92       	push	r4
   2230e:	5f 92       	push	r5
   22310:	6f 92       	push	r6
   22312:	7f 92       	push	r7
   22314:	8f 92       	push	r8
   22316:	9f 92       	push	r9
   22318:	af 92       	push	r10
   2231a:	bf 92       	push	r11
   2231c:	cf 92       	push	r12
   2231e:	df 92       	push	r13
   22320:	ef 92       	push	r14
   22322:	ff 92       	push	r15
   22324:	0f 93       	push	r16
   22326:	1f 93       	push	r17
   22328:	cf 93       	push	r28
   2232a:	df 93       	push	r29
   2232c:	cd b7       	in	r28, 0x3d	; 61
   2232e:	de b7       	in	r29, 0x3e	; 62
   22330:	2c 97       	sbiw	r28, 0x0c	; 12
   22332:	0f b6       	in	r0, 0x3f	; 63
   22334:	f8 94       	cli
   22336:	de bf       	out	0x3e, r29	; 62
   22338:	0f be       	out	0x3f, r0	; 63
   2233a:	cd bf       	out	0x3d, r28	; 61
   2233c:	28 2e       	mov	r2, r24
   2233e:	49 83       	std	Y+1, r20	; 0x01
   22340:	5a 83       	std	Y+2, r21	; 0x02
   22342:	6b 83       	std	Y+3, r22	; 0x03
   22344:	7c 83       	std	Y+4, r23	; 0x04
   22346:	28 01       	movw	r4, r16
   22348:	39 01       	movw	r6, r18
   2234a:	3a 2c       	mov	r3, r10
	bool temp_runaway_check_active = false;
	static float __preheat_start[2] = { 0,0}; //currently just bed and one extruder
	static uint8_t __preheat_counter[2] = { 0,0};
	static uint8_t __preheat_errors[2] = { 0,0};

	if (_millis() - temp_runaway_timer[_heater_id] > 2000)
   2234c:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   22350:	02 2d       	mov	r16, r2
   22352:	10 e0       	ldi	r17, 0x00	; 0
   22354:	98 01       	movw	r18, r16
   22356:	22 0f       	add	r18, r18
   22358:	33 1f       	adc	r19, r19
   2235a:	22 0f       	add	r18, r18
   2235c:	33 1f       	adc	r19, r19
   2235e:	3c 87       	std	Y+12, r19	; 0x0c
   22360:	2b 87       	std	Y+11, r18	; 0x0b
   22362:	f9 01       	movw	r30, r18
   22364:	e4 56       	subi	r30, 0x64	; 100
   22366:	fa 4f       	sbci	r31, 0xFA	; 250
   22368:	80 80       	ld	r8, Z
   2236a:	91 80       	ldd	r9, Z+1	; 0x01
   2236c:	a2 80       	ldd	r10, Z+2	; 0x02
   2236e:	b3 80       	ldd	r11, Z+3	; 0x03
   22370:	68 19       	sub	r22, r8
   22372:	79 09       	sbc	r23, r9
   22374:	8a 09       	sbc	r24, r10
   22376:	9b 09       	sbc	r25, r11
   22378:	61 3d       	cpi	r22, 0xD1	; 209
   2237a:	77 40       	sbci	r23, 0x07	; 7
   2237c:	81 05       	cpc	r24, r1
   2237e:	91 05       	cpc	r25, r1
   22380:	08 f4       	brcc	.+2      	; 0x22384 <temp_runaway_check(unsigned char, float, float, float, bool)+0x7c>
   22382:	ea c0       	rjmp	.+468    	; 0x22558 <temp_runaway_check(unsigned char, float, float, float, bool)+0x250>
	{

#ifdef 	TEMP_RUNAWAY_BED_TIMEOUT
          if (_isbed)
   22384:	33 20       	and	r3, r3
   22386:	09 f4       	brne	.+2      	; 0x2238a <temp_runaway_check(unsigned char, float, float, float, bool)+0x82>
   22388:	75 c0       	rjmp	.+234    	; 0x22474 <temp_runaway_check(unsigned char, float, float, float, bool)+0x16c>
          {
               __hysteresis = TEMP_RUNAWAY_BED_HYSTERESIS;
               __timeout = TEMP_RUNAWAY_BED_TIMEOUT;
   2238a:	88 e6       	ldi	r24, 0x68	; 104
   2238c:	91 e0       	ldi	r25, 0x01	; 1
   2238e:	9a 87       	std	Y+10, r25	; 0x0a
   22390:	89 87       	std	Y+9, r24	; 0x09
	{

#ifdef 	TEMP_RUNAWAY_BED_TIMEOUT
          if (_isbed)
          {
               __hysteresis = TEMP_RUNAWAY_BED_HYSTERESIS;
   22392:	80 e0       	ldi	r24, 0x00	; 0
   22394:	90 e0       	ldi	r25, 0x00	; 0
   22396:	a0 ea       	ldi	r26, 0xA0	; 160
   22398:	b0 e4       	ldi	r27, 0x40	; 64
          }
#endif
#ifdef 	TEMP_RUNAWAY_EXTRUDER_TIMEOUT
          if (!_isbed)
          {
               __hysteresis = TEMP_RUNAWAY_EXTRUDER_HYSTERESIS;
   2239a:	8d 83       	std	Y+5, r24	; 0x05
   2239c:	9e 83       	std	Y+6, r25	; 0x06
   2239e:	af 83       	std	Y+7, r26	; 0x07
   223a0:	b8 87       	std	Y+8, r27	; 0x08
               __timeout = TEMP_RUNAWAY_EXTRUDER_TIMEOUT;
          }
#endif

		temp_runaway_timer[_heater_id] = _millis();
   223a2:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   223a6:	eb 85       	ldd	r30, Y+11	; 0x0b
   223a8:	fc 85       	ldd	r31, Y+12	; 0x0c
   223aa:	e4 56       	subi	r30, 0x64	; 100
   223ac:	fa 4f       	sbci	r31, 0xFA	; 250
   223ae:	60 83       	st	Z, r22
   223b0:	71 83       	std	Z+1, r23	; 0x01
   223b2:	82 83       	std	Z+2, r24	; 0x02
   223b4:	93 83       	std	Z+3, r25	; 0x03
		if (_output == 0)
   223b6:	20 e0       	ldi	r18, 0x00	; 0
   223b8:	30 e0       	ldi	r19, 0x00	; 0
   223ba:	a9 01       	movw	r20, r18
   223bc:	c7 01       	movw	r24, r14
   223be:	b6 01       	movw	r22, r12
   223c0:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   223c4:	81 11       	cpse	r24, r1
   223c6:	07 c0       	rjmp	.+14     	; 0x223d6 <temp_runaway_check(unsigned char, float, float, float, bool)+0xce>
		{
			temp_runaway_check_active = false;
			temp_runaway_error_counter[_heater_id] = 0;
   223c8:	f8 01       	movw	r30, r16
   223ca:	ee 0f       	add	r30, r30
   223cc:	ff 1f       	adc	r31, r31
   223ce:	e8 56       	subi	r30, 0x68	; 104
   223d0:	fa 4f       	sbci	r31, 0xFA	; 250
   223d2:	11 82       	std	Z+1, r1	; 0x01
   223d4:	10 82       	st	Z, r1
		}

		if (temp_runaway_target[_heater_id] != _target_temperature)
   223d6:	ab 85       	ldd	r26, Y+11	; 0x0b
   223d8:	bc 85       	ldd	r27, Y+12	; 0x0c
   223da:	a0 57       	subi	r26, 0x70	; 112
   223dc:	ba 4f       	sbci	r27, 0xFA	; 250
   223de:	5d 01       	movw	r10, r26
   223e0:	29 81       	ldd	r18, Y+1	; 0x01
   223e2:	3a 81       	ldd	r19, Y+2	; 0x02
   223e4:	4b 81       	ldd	r20, Y+3	; 0x03
   223e6:	5c 81       	ldd	r21, Y+4	; 0x04
   223e8:	6d 91       	ld	r22, X+
   223ea:	7d 91       	ld	r23, X+
   223ec:	8d 91       	ld	r24, X+
   223ee:	9c 91       	ld	r25, X
   223f0:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   223f4:	88 23       	and	r24, r24
   223f6:	09 f4       	brne	.+2      	; 0x223fa <temp_runaway_check(unsigned char, float, float, float, bool)+0xf2>
   223f8:	91 c0       	rjmp	.+290    	; 0x2251c <temp_runaway_check(unsigned char, float, float, float, bool)+0x214>
		{
			if (_target_temperature > 0)
   223fa:	20 e0       	ldi	r18, 0x00	; 0
   223fc:	30 e0       	ldi	r19, 0x00	; 0
   223fe:	a9 01       	movw	r20, r18
   22400:	69 81       	ldd	r22, Y+1	; 0x01
   22402:	7a 81       	ldd	r23, Y+2	; 0x02
   22404:	8b 81       	ldd	r24, Y+3	; 0x03
   22406:	9c 81       	ldd	r25, Y+4	; 0x04
   22408:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   2240c:	f8 01       	movw	r30, r16
   2240e:	e2 57       	subi	r30, 0x72	; 114
   22410:	fa 4f       	sbci	r31, 0xFA	; 250
   22412:	18 16       	cp	r1, r24
   22414:	c4 f5       	brge	.+112    	; 0x22486 <temp_runaway_check(unsigned char, float, float, float, bool)+0x17e>
			{
				temp_runaway_status[_heater_id] = TempRunaway_PREHEAT;
   22416:	81 e0       	ldi	r24, 0x01	; 1
   22418:	80 83       	st	Z, r24
				temp_runaway_target[_heater_id] = _target_temperature;
   2241a:	89 81       	ldd	r24, Y+1	; 0x01
   2241c:	9a 81       	ldd	r25, Y+2	; 0x02
   2241e:	ab 81       	ldd	r26, Y+3	; 0x03
   22420:	bc 81       	ldd	r27, Y+4	; 0x04
   22422:	f5 01       	movw	r30, r10
   22424:	80 83       	st	Z, r24
   22426:	91 83       	std	Z+1, r25	; 0x01
   22428:	a2 83       	std	Z+2, r26	; 0x02
   2242a:	b3 83       	std	Z+3, r27	; 0x03
				__preheat_start[_heater_id] = _current_temperature;
   2242c:	eb 85       	ldd	r30, Y+11	; 0x0b
   2242e:	fc 85       	ldd	r31, Y+12	; 0x0c
   22430:	ea 57       	subi	r30, 0x7A	; 122
   22432:	fa 4f       	sbci	r31, 0xFA	; 250
   22434:	40 82       	st	Z, r4
   22436:	51 82       	std	Z+1, r5	; 0x01
   22438:	62 82       	std	Z+2, r6	; 0x02
   2243a:	73 82       	std	Z+3, r7	; 0x03
				__preheat_counter[_heater_id] = 0;
   2243c:	f8 01       	movw	r30, r16
   2243e:	ec 57       	subi	r30, 0x7C	; 124
   22440:	fa 4f       	sbci	r31, 0xFA	; 250
   22442:	10 82       	st	Z, r1
				temp_runaway_status[_heater_id] = TempRunaway_INACTIVE;
				temp_runaway_target[_heater_id] = _target_temperature;
			}
		}

		if ((_current_temperature < _target_temperature)  && (temp_runaway_status[_heater_id] == TempRunaway_PREHEAT))
   22444:	a3 01       	movw	r20, r6
   22446:	92 01       	movw	r18, r4
   22448:	bc 01       	movw	r22, r24
   2244a:	cd 01       	movw	r24, r26
   2244c:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   22450:	18 16       	cp	r1, r24
   22452:	1c f5       	brge	.+70     	; 0x2249a <temp_runaway_check(unsigned char, float, float, float, bool)+0x192>
		{
			__preheat_counter[_heater_id]++;
   22454:	f8 01       	movw	r30, r16
   22456:	ec 57       	subi	r30, 0x7C	; 124
   22458:	fa 4f       	sbci	r31, 0xFA	; 250
   2245a:	80 81       	ld	r24, Z
   2245c:	8f 5f       	subi	r24, 0xFF	; 255
   2245e:	80 83       	st	Z, r24
			if (__preheat_counter[_heater_id] > ((_isbed) ? 16 : 8)) // periodicaly check if current temperature changes
   22460:	31 10       	cpse	r3, r1
   22462:	c7 c0       	rjmp	.+398    	; 0x225f2 <temp_runaway_check(unsigned char, float, float, float, bool)+0x2ea>
   22464:	89 30       	cpi	r24, 0x09	; 9
   22466:	c8 f0       	brcs	.+50     	; 0x2249a <temp_runaway_check(unsigned char, float, float, float, bool)+0x192>
			{
                    __delta=2.0;
   22468:	81 2c       	mov	r8, r1
   2246a:	91 2c       	mov	r9, r1
   2246c:	a1 2c       	mov	r10, r1
   2246e:	50 e4       	ldi	r21, 0x40	; 64
   22470:	b5 2e       	mov	r11, r21
   22472:	e8 c0       	rjmp	.+464    	; 0x22644 <temp_runaway_check(unsigned char, float, float, float, bool)+0x33c>
#endif
#ifdef 	TEMP_RUNAWAY_EXTRUDER_TIMEOUT
          if (!_isbed)
          {
               __hysteresis = TEMP_RUNAWAY_EXTRUDER_HYSTERESIS;
               __timeout = TEMP_RUNAWAY_EXTRUDER_TIMEOUT;
   22474:	ad e2       	ldi	r26, 0x2D	; 45
   22476:	b0 e0       	ldi	r27, 0x00	; 0
   22478:	ba 87       	std	Y+10, r27	; 0x0a
   2247a:	a9 87       	std	Y+9, r26	; 0x09
          }
#endif
#ifdef 	TEMP_RUNAWAY_EXTRUDER_TIMEOUT
          if (!_isbed)
          {
               __hysteresis = TEMP_RUNAWAY_EXTRUDER_HYSTERESIS;
   2247c:	80 e0       	ldi	r24, 0x00	; 0
   2247e:	90 e0       	ldi	r25, 0x00	; 0
   22480:	a0 e7       	ldi	r26, 0x70	; 112
   22482:	b1 e4       	ldi	r27, 0x41	; 65
   22484:	8a cf       	rjmp	.-236    	; 0x2239a <temp_runaway_check(unsigned char, float, float, float, bool)+0x92>
				__preheat_start[_heater_id] = _current_temperature;
				__preheat_counter[_heater_id] = 0;
			}
			else
			{
				temp_runaway_status[_heater_id] = TempRunaway_INACTIVE;
   22486:	10 82       	st	Z, r1
				temp_runaway_target[_heater_id] = _target_temperature;
   22488:	89 81       	ldd	r24, Y+1	; 0x01
   2248a:	9a 81       	ldd	r25, Y+2	; 0x02
   2248c:	ab 81       	ldd	r26, Y+3	; 0x03
   2248e:	bc 81       	ldd	r27, Y+4	; 0x04
   22490:	f5 01       	movw	r30, r10
   22492:	80 83       	st	Z, r24
   22494:	91 83       	std	Z+1, r25	; 0x01
   22496:	a2 83       	std	Z+2, r26	; 0x02
   22498:	b3 83       	std	Z+3, r27	; 0x03
				__preheat_start[_heater_id] = _current_temperature;
				__preheat_counter[_heater_id] = 0;
			}
		}

		if ((_current_temperature > (_target_temperature - __hysteresis))  && temp_runaway_status[_heater_id] == TempRunaway_PREHEAT)
   2249a:	2d 81       	ldd	r18, Y+5	; 0x05
   2249c:	3e 81       	ldd	r19, Y+6	; 0x06
   2249e:	4f 81       	ldd	r20, Y+7	; 0x07
   224a0:	58 85       	ldd	r21, Y+8	; 0x08
   224a2:	69 81       	ldd	r22, Y+1	; 0x01
   224a4:	7a 81       	ldd	r23, Y+2	; 0x02
   224a6:	8b 81       	ldd	r24, Y+3	; 0x03
   224a8:	9c 81       	ldd	r25, Y+4	; 0x04
   224aa:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   224ae:	a3 01       	movw	r20, r6
   224b0:	92 01       	movw	r18, r4
   224b2:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   224b6:	87 ff       	sbrs	r24, 7
   224b8:	46 c0       	rjmp	.+140    	; 0x22546 <temp_runaway_check(unsigned char, float, float, float, bool)+0x23e>
   224ba:	f8 01       	movw	r30, r16
   224bc:	e2 57       	subi	r30, 0x72	; 114
   224be:	fa 4f       	sbci	r31, 0xFA	; 250
   224c0:	80 81       	ld	r24, Z
   224c2:	81 30       	cpi	r24, 0x01	; 1
   224c4:	49 f4       	brne	.+18     	; 0x224d8 <temp_runaway_check(unsigned char, float, float, float, bool)+0x1d0>
		{
			temp_runaway_status[_heater_id] = TempRunaway_ACTIVE;
   224c6:	82 e0       	ldi	r24, 0x02	; 2
   224c8:	80 83       	st	Z, r24
			temp_runaway_check_active = false;
			temp_runaway_error_counter[_heater_id] = 0;
   224ca:	f8 01       	movw	r30, r16
   224cc:	ee 0f       	add	r30, r30
   224ce:	ff 1f       	adc	r31, r31
   224d0:	e8 56       	subi	r30, 0x68	; 104
   224d2:	fa 4f       	sbci	r31, 0xFA	; 250
   224d4:	11 82       	std	Z+1, r1	; 0x01
   224d6:	10 82       	st	Z, r1
		}

		if (_output > 0)
   224d8:	20 e0       	ldi	r18, 0x00	; 0
   224da:	30 e0       	ldi	r19, 0x00	; 0
   224dc:	a9 01       	movw	r20, r18
   224de:	c7 01       	movw	r24, r14
   224e0:	b6 01       	movw	r22, r12
   224e2:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   224e6:	18 16       	cp	r1, r24
   224e8:	bc f5       	brge	.+110    	; 0x22558 <temp_runaway_check(unsigned char, float, float, float, bool)+0x250>


		if (temp_runaway_check_active)
		{
			//	we are in range
			if ((_current_temperature > (_target_temperature - __hysteresis)) && (_current_temperature < (_target_temperature + __hysteresis)))
   224ea:	29 81       	ldd	r18, Y+1	; 0x01
   224ec:	3a 81       	ldd	r19, Y+2	; 0x02
   224ee:	4b 81       	ldd	r20, Y+3	; 0x03
   224f0:	5c 81       	ldd	r21, Y+4	; 0x04
   224f2:	6d 81       	ldd	r22, Y+5	; 0x05
   224f4:	7e 81       	ldd	r23, Y+6	; 0x06
   224f6:	8f 81       	ldd	r24, Y+7	; 0x07
   224f8:	98 85       	ldd	r25, Y+8	; 0x08
   224fa:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   224fe:	a3 01       	movw	r20, r6
   22500:	92 01       	movw	r18, r4
   22502:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   22506:	18 16       	cp	r1, r24
   22508:	0c f0       	brlt	.+2      	; 0x2250c <temp_runaway_check(unsigned char, float, float, float, bool)+0x204>
   2250a:	3f c0       	rjmp	.+126    	; 0x2258a <temp_runaway_check(unsigned char, float, float, float, bool)+0x282>
			{
				temp_runaway_check_active = false;
				temp_runaway_error_counter[_heater_id] = 0;
   2250c:	00 0f       	add	r16, r16
   2250e:	11 1f       	adc	r17, r17
   22510:	f8 01       	movw	r30, r16
   22512:	e8 56       	subi	r30, 0x68	; 104
   22514:	fa 4f       	sbci	r31, 0xFA	; 250
   22516:	11 82       	std	Z+1, r1	; 0x01
   22518:	10 82       	st	Z, r1
   2251a:	1e c0       	rjmp	.+60     	; 0x22558 <temp_runaway_check(unsigned char, float, float, float, bool)+0x250>
				temp_runaway_status[_heater_id] = TempRunaway_INACTIVE;
				temp_runaway_target[_heater_id] = _target_temperature;
			}
		}

		if ((_current_temperature < _target_temperature)  && (temp_runaway_status[_heater_id] == TempRunaway_PREHEAT))
   2251c:	a3 01       	movw	r20, r6
   2251e:	92 01       	movw	r18, r4
   22520:	69 81       	ldd	r22, Y+1	; 0x01
   22522:	7a 81       	ldd	r23, Y+2	; 0x02
   22524:	8b 81       	ldd	r24, Y+3	; 0x03
   22526:	9c 81       	ldd	r25, Y+4	; 0x04
   22528:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   2252c:	18 16       	cp	r1, r24
   2252e:	0c f0       	brlt	.+2      	; 0x22532 <temp_runaway_check(unsigned char, float, float, float, bool)+0x22a>
   22530:	b4 cf       	rjmp	.-152    	; 0x2249a <temp_runaway_check(unsigned char, float, float, float, bool)+0x192>
   22532:	f8 01       	movw	r30, r16
   22534:	e2 57       	subi	r30, 0x72	; 114
   22536:	fa 4f       	sbci	r31, 0xFA	; 250
   22538:	80 81       	ld	r24, Z
   2253a:	81 30       	cpi	r24, 0x01	; 1
   2253c:	09 f0       	breq	.+2      	; 0x22540 <temp_runaway_check(unsigned char, float, float, float, bool)+0x238>
   2253e:	ad cf       	rjmp	.-166    	; 0x2249a <temp_runaway_check(unsigned char, float, float, float, bool)+0x192>
   22540:	89 cf       	rjmp	.-238    	; 0x22454 <temp_runaway_check(unsigned char, float, float, float, bool)+0x14c>
                         if(_current_temperature>105.0) __delta=0.6;
                         }
				if (_current_temperature - __preheat_start[_heater_id] < __delta) {
					__preheat_errors[_heater_id]++;
				} else {
					__preheat_errors[_heater_id] = 0;
   22542:	10 82       	st	Z, r1
   22544:	97 c0       	rjmp	.+302    	; 0x22674 <temp_runaway_check(unsigned char, float, float, float, bool)+0x36c>
			temp_runaway_status[_heater_id] = TempRunaway_ACTIVE;
			temp_runaway_check_active = false;
			temp_runaway_error_counter[_heater_id] = 0;
		}

		if (_output > 0)
   22546:	20 e0       	ldi	r18, 0x00	; 0
   22548:	30 e0       	ldi	r19, 0x00	; 0
   2254a:	a9 01       	movw	r20, r18
   2254c:	c7 01       	movw	r24, r14
   2254e:	b6 01       	movw	r22, r12
   22550:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   22554:	18 16       	cp	r1, r24
   22556:	cc f0       	brlt	.+50     	; 0x2258a <temp_runaway_check(unsigned char, float, float, float, bool)+0x282>
				}
			}
		}

	}
}
   22558:	2c 96       	adiw	r28, 0x0c	; 12
   2255a:	0f b6       	in	r0, 0x3f	; 63
   2255c:	f8 94       	cli
   2255e:	de bf       	out	0x3e, r29	; 62
   22560:	0f be       	out	0x3f, r0	; 63
   22562:	cd bf       	out	0x3d, r28	; 61
   22564:	df 91       	pop	r29
   22566:	cf 91       	pop	r28
   22568:	1f 91       	pop	r17
   2256a:	0f 91       	pop	r16
   2256c:	ff 90       	pop	r15
   2256e:	ef 90       	pop	r14
   22570:	df 90       	pop	r13
   22572:	cf 90       	pop	r12
   22574:	bf 90       	pop	r11
   22576:	af 90       	pop	r10
   22578:	9f 90       	pop	r9
   2257a:	8f 90       	pop	r8
   2257c:	7f 90       	pop	r7
   2257e:	6f 90       	pop	r6
   22580:	5f 90       	pop	r5
   22582:	4f 90       	pop	r4
   22584:	3f 90       	pop	r3
   22586:	2f 90       	pop	r2
   22588:	08 95       	ret
				temp_runaway_check_active = false;
				temp_runaway_error_counter[_heater_id] = 0;
			}
			else
			{
				if (temp_runaway_status[_heater_id] > TempRunaway_PREHEAT)
   2258a:	f8 01       	movw	r30, r16
   2258c:	e2 57       	subi	r30, 0x72	; 114
   2258e:	fa 4f       	sbci	r31, 0xFA	; 250
   22590:	80 81       	ld	r24, Z
   22592:	82 30       	cpi	r24, 0x02	; 2
   22594:	08 f3       	brcs	.-62     	; 0x22558 <temp_runaway_check(unsigned char, float, float, float, bool)+0x250>
				{
					temp_runaway_error_counter[_heater_id]++;
   22596:	00 0f       	add	r16, r16
   22598:	11 1f       	adc	r17, r17
   2259a:	f8 01       	movw	r30, r16
   2259c:	e8 56       	subi	r30, 0x68	; 104
   2259e:	fa 4f       	sbci	r31, 0xFA	; 250
   225a0:	80 81       	ld	r24, Z
   225a2:	91 81       	ldd	r25, Z+1	; 0x01
   225a4:	01 96       	adiw	r24, 0x01	; 1
   225a6:	91 83       	std	Z+1, r25	; 0x01
   225a8:	80 83       	st	Z, r24
					if (temp_runaway_error_counter[_heater_id] * 2 > __timeout)
   225aa:	88 0f       	add	r24, r24
   225ac:	99 1f       	adc	r25, r25
   225ae:	e9 85       	ldd	r30, Y+9	; 0x09
   225b0:	fa 85       	ldd	r31, Y+10	; 0x0a
   225b2:	e8 17       	cp	r30, r24
   225b4:	f9 07       	cpc	r31, r25
   225b6:	80 f6       	brcc	.-96     	; 0x22558 <temp_runaway_check(unsigned char, float, float, float, bool)+0x250>
                        set_temp_error((_isbed?TempErrorSource::bed:TempErrorSource::hotend), _heater_id, TempErrorType::runaway);
   225b8:	43 e0       	ldi	r20, 0x03	; 3
   225ba:	62 2d       	mov	r22, r2
   225bc:	83 2d       	mov	r24, r3
				}
			}
		}

	}
}
   225be:	2c 96       	adiw	r28, 0x0c	; 12
   225c0:	0f b6       	in	r0, 0x3f	; 63
   225c2:	f8 94       	cli
   225c4:	de bf       	out	0x3e, r29	; 62
   225c6:	0f be       	out	0x3f, r0	; 63
   225c8:	cd bf       	out	0x3d, r28	; 61
   225ca:	df 91       	pop	r29
   225cc:	cf 91       	pop	r28
   225ce:	1f 91       	pop	r17
   225d0:	0f 91       	pop	r16
   225d2:	ff 90       	pop	r15
   225d4:	ef 90       	pop	r14
   225d6:	df 90       	pop	r13
   225d8:	cf 90       	pop	r12
   225da:	bf 90       	pop	r11
   225dc:	af 90       	pop	r10
   225de:	9f 90       	pop	r9
   225e0:	8f 90       	pop	r8
   225e2:	7f 90       	pop	r7
   225e4:	6f 90       	pop	r6
   225e6:	5f 90       	pop	r5
   225e8:	4f 90       	pop	r4
   225ea:	3f 90       	pop	r3
   225ec:	2f 90       	pop	r2
			{
				if (temp_runaway_status[_heater_id] > TempRunaway_PREHEAT)
				{
					temp_runaway_error_counter[_heater_id]++;
					if (temp_runaway_error_counter[_heater_id] * 2 > __timeout)
                        set_temp_error((_isbed?TempErrorSource::bed:TempErrorSource::hotend), _heater_id, TempErrorType::runaway);
   225ee:	0d 94 20 11 	jmp	0x22240	; 0x22240 <set_temp_error(TempErrorSource, unsigned char, TempErrorType)>
		}

		if ((_current_temperature < _target_temperature)  && (temp_runaway_status[_heater_id] == TempRunaway_PREHEAT))
		{
			__preheat_counter[_heater_id]++;
			if (__preheat_counter[_heater_id] > ((_isbed) ? 16 : 8)) // periodicaly check if current temperature changes
   225f2:	81 31       	cpi	r24, 0x11	; 17
   225f4:	08 f4       	brcc	.+2      	; 0x225f8 <temp_runaway_check(unsigned char, float, float, float, bool)+0x2f0>
   225f6:	51 cf       	rjmp	.-350    	; 0x2249a <temp_runaway_check(unsigned char, float, float, float, bool)+0x192>
			{
                    __delta=2.0;
                    if(_isbed)
                         {
                         __delta=3.0;
                         if(_current_temperature>90.0) __delta=2.0;
   225f8:	20 e0       	ldi	r18, 0x00	; 0
   225fa:	30 e0       	ldi	r19, 0x00	; 0
   225fc:	44 eb       	ldi	r20, 0xB4	; 180
   225fe:	52 e4       	ldi	r21, 0x42	; 66
   22600:	c3 01       	movw	r24, r6
   22602:	b2 01       	movw	r22, r4
   22604:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
			if (__preheat_counter[_heater_id] > ((_isbed) ? 16 : 8)) // periodicaly check if current temperature changes
			{
                    __delta=2.0;
                    if(_isbed)
                         {
                         __delta=3.0;
   22608:	81 2c       	mov	r8, r1
   2260a:	91 2c       	mov	r9, r1
   2260c:	e0 e4       	ldi	r30, 0x40	; 64
   2260e:	ae 2e       	mov	r10, r30
   22610:	ba 2c       	mov	r11, r10
                         if(_current_temperature>90.0) __delta=2.0;
   22612:	18 16       	cp	r1, r24
   22614:	2c f4       	brge	.+10     	; 0x22620 <temp_runaway_check(unsigned char, float, float, float, bool)+0x318>
   22616:	81 2c       	mov	r8, r1
   22618:	91 2c       	mov	r9, r1
   2261a:	a1 2c       	mov	r10, r1
   2261c:	70 e4       	ldi	r23, 0x40	; 64
   2261e:	b7 2e       	mov	r11, r23
                         if(_current_temperature>105.0) __delta=0.6;
   22620:	20 e0       	ldi	r18, 0x00	; 0
   22622:	30 e0       	ldi	r19, 0x00	; 0
   22624:	42 ed       	ldi	r20, 0xD2	; 210
   22626:	52 e4       	ldi	r21, 0x42	; 66
   22628:	c3 01       	movw	r24, r6
   2262a:	b2 01       	movw	r22, r4
   2262c:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   22630:	18 16       	cp	r1, r24
   22632:	44 f4       	brge	.+16     	; 0x22644 <temp_runaway_check(unsigned char, float, float, float, bool)+0x33c>
   22634:	6a e9       	ldi	r22, 0x9A	; 154
   22636:	86 2e       	mov	r8, r22
   22638:	69 e9       	ldi	r22, 0x99	; 153
   2263a:	96 2e       	mov	r9, r22
   2263c:	69 e1       	ldi	r22, 0x19	; 25
   2263e:	a6 2e       	mov	r10, r22
   22640:	6f e3       	ldi	r22, 0x3F	; 63
   22642:	b6 2e       	mov	r11, r22
                         }
				if (_current_temperature - __preheat_start[_heater_id] < __delta) {
   22644:	eb 85       	ldd	r30, Y+11	; 0x0b
   22646:	fc 85       	ldd	r31, Y+12	; 0x0c
   22648:	ea 57       	subi	r30, 0x7A	; 122
   2264a:	fa 4f       	sbci	r31, 0xFA	; 250
   2264c:	20 81       	ld	r18, Z
   2264e:	31 81       	ldd	r19, Z+1	; 0x01
   22650:	42 81       	ldd	r20, Z+2	; 0x02
   22652:	53 81       	ldd	r21, Z+3	; 0x03
   22654:	c3 01       	movw	r24, r6
   22656:	b2 01       	movw	r22, r4
   22658:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   2265c:	a5 01       	movw	r20, r10
   2265e:	94 01       	movw	r18, r8
   22660:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   22664:	f8 01       	movw	r30, r16
   22666:	ee 57       	subi	r30, 0x7E	; 126
   22668:	fa 4f       	sbci	r31, 0xFA	; 250
   2266a:	87 ff       	sbrs	r24, 7
   2266c:	6a cf       	rjmp	.-300    	; 0x22542 <temp_runaway_check(unsigned char, float, float, float, bool)+0x23a>
					__preheat_errors[_heater_id]++;
   2266e:	80 81       	ld	r24, Z
   22670:	8f 5f       	subi	r24, 0xFF	; 255
   22672:	80 83       	st	Z, r24
				} else {
					__preheat_errors[_heater_id] = 0;
				}

				if (__preheat_errors[_heater_id] > ((_isbed) ? 3 : 5))
   22674:	80 81       	ld	r24, Z
   22676:	90 e0       	ldi	r25, 0x00	; 0
   22678:	31 10       	cpse	r3, r1
   2267a:	04 c0       	rjmp	.+8      	; 0x22684 <temp_runaway_check(unsigned char, float, float, float, bool)+0x37c>
   2267c:	06 97       	sbiw	r24, 0x06	; 6
   2267e:	4c f0       	brlt	.+18     	; 0x22692 <temp_runaway_check(unsigned char, float, float, float, bool)+0x38a>
                    set_temp_error((_isbed?TempErrorSource::bed:TempErrorSource::hotend), _heater_id, TempErrorType::preheat);
   22680:	80 e0       	ldi	r24, 0x00	; 0
   22682:	03 c0       	rjmp	.+6      	; 0x2268a <temp_runaway_check(unsigned char, float, float, float, bool)+0x382>
					__preheat_errors[_heater_id]++;
				} else {
					__preheat_errors[_heater_id] = 0;
				}

				if (__preheat_errors[_heater_id] > ((_isbed) ? 3 : 5))
   22684:	04 97       	sbiw	r24, 0x04	; 4
   22686:	2c f0       	brlt	.+10     	; 0x22692 <temp_runaway_check(unsigned char, float, float, float, bool)+0x38a>
                    set_temp_error((_isbed?TempErrorSource::bed:TempErrorSource::hotend), _heater_id, TempErrorType::preheat);
   22688:	81 e0       	ldi	r24, 0x01	; 1
   2268a:	42 e0       	ldi	r20, 0x02	; 2
   2268c:	62 2d       	mov	r22, r2
   2268e:	0f 94 20 11 	call	0x22240	; 0x22240 <set_temp_error(TempErrorSource, unsigned char, TempErrorType)>

				__preheat_start[_heater_id] = _current_temperature;
   22692:	2b 85       	ldd	r18, Y+11	; 0x0b
   22694:	3c 85       	ldd	r19, Y+12	; 0x0c
   22696:	2a 57       	subi	r18, 0x7A	; 122
   22698:	3a 4f       	sbci	r19, 0xFA	; 250
   2269a:	d9 01       	movw	r26, r18
   2269c:	4d 92       	st	X+, r4
   2269e:	5d 92       	st	X+, r5
   226a0:	6d 92       	st	X+, r6
   226a2:	7c 92       	st	X, r7
   226a4:	13 97       	sbiw	r26, 0x03	; 3
				__preheat_counter[_heater_id] = 0;
   226a6:	f8 01       	movw	r30, r16
   226a8:	ec 57       	subi	r30, 0x7C	; 124
   226aa:	fa 4f       	sbci	r31, 0xFA	; 250
   226ac:	10 82       	st	Z, r1
   226ae:	f5 ce       	rjmp	.-534    	; 0x2249a <temp_runaway_check(unsigned char, float, float, float, bool)+0x192>

000226b0 <has_temperature_compensation()>:
//! @retval true firmware should do temperature compensation and allow calibration
//! @retval false PINDA thermistor is not detected, disable temperature compensation and calibration
//! @retval true/false when forced via LCD menu Settings->HW Setup->SuperPINDA
//!
bool has_temperature_compensation()
{
   226b0:	cf 93       	push	r28
#ifdef SUPERPINDA_SUPPORT
#ifdef PINDA_TEMP_COMP
   	uint8_t pinda_temp_compensation = eeprom_read_byte((uint8_t*)EEPROM_PINDA_TEMP_COMPENSATION);
   226b2:	89 e2       	ldi	r24, 0x29	; 41
   226b4:	9d e0       	ldi	r25, 0x0D	; 13
   226b6:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
    if (pinda_temp_compensation == EEPROM_EMPTY_VALUE) //Unkown PINDA temp compenstation, so check it.
      {
#endif //PINDA_TEMP_COMP
        return (current_temperature_pinda >= PINDA_MINTEMP) ? true : false;
   226ba:	c1 e0       	ldi	r28, 0x01	; 1
bool has_temperature_compensation()
{
#ifdef SUPERPINDA_SUPPORT
#ifdef PINDA_TEMP_COMP
   	uint8_t pinda_temp_compensation = eeprom_read_byte((uint8_t*)EEPROM_PINDA_TEMP_COMPENSATION);
    if (pinda_temp_compensation == EEPROM_EMPTY_VALUE) //Unkown PINDA temp compenstation, so check it.
   226bc:	8f 3f       	cpi	r24, 0xFF	; 255
   226be:	91 f4       	brne	.+36     	; 0x226e4 <has_temperature_compensation()+0x34>
      {
#endif //PINDA_TEMP_COMP
        return (current_temperature_pinda >= PINDA_MINTEMP) ? true : false;
   226c0:	20 e0       	ldi	r18, 0x00	; 0
   226c2:	30 e0       	ldi	r19, 0x00	; 0
   226c4:	40 ef       	ldi	r20, 0xF0	; 240
   226c6:	51 e4       	ldi	r21, 0x41	; 65
   226c8:	60 91 85 03 	lds	r22, 0x0385	; 0x800385 <current_temperature_pinda>
   226cc:	70 91 86 03 	lds	r23, 0x0386	; 0x800386 <current_temperature_pinda+0x1>
   226d0:	80 91 87 03 	lds	r24, 0x0387	; 0x800387 <current_temperature_pinda+0x2>
   226d4:	90 91 88 03 	lds	r25, 0x0388	; 0x800388 <current_temperature_pinda+0x3>
   226d8:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   226dc:	87 ff       	sbrs	r24, 7
   226de:	04 c0       	rjmp	.+8      	; 0x226e8 <has_temperature_compensation()+0x38>
#ifdef PINDA_TEMP_COMP
      }
    else if (pinda_temp_compensation == 0) return true; //Overwritten via LCD menu SuperPINDA [No]
   226e0:	c0 e0       	ldi	r28, 0x00	; 0
   226e2:	02 c0       	rjmp	.+4      	; 0x226e8 <has_temperature_compensation()+0x38>
   226e4:	81 11       	cpse	r24, r1
   226e6:	fc cf       	rjmp	.-8      	; 0x226e0 <has_temperature_compensation()+0x30>
    else return false; //Overwritten via LCD menu SuperPINDA [YES]
#endif //PINDA_TEMP_COMP
#else
    return true;
#endif
}
   226e8:	8c 2f       	mov	r24, r28
   226ea:	cf 91       	pop	r28
   226ec:	08 95       	ret

000226ee <__vector_14>:
#ifdef SYSTEM_TIMER_2
ISR(TIMER2_COMPB_vect)
#else //SYSTEM_TIMER_2
ISR(TIMER0_COMPB_vect)
#endif //SYSTEM_TIMER_2
{
   226ee:	1f 92       	push	r1
   226f0:	0f 92       	push	r0
   226f2:	0f b6       	in	r0, 0x3f	; 63
   226f4:	0f 92       	push	r0
   226f6:	11 24       	eor	r1, r1
   226f8:	0b b6       	in	r0, 0x3b	; 59
   226fa:	0f 92       	push	r0
   226fc:	ff 92       	push	r15
   226fe:	0f 93       	push	r16
   22700:	1f 93       	push	r17
   22702:	2f 93       	push	r18
   22704:	3f 93       	push	r19
   22706:	4f 93       	push	r20
   22708:	5f 93       	push	r21
   2270a:	6f 93       	push	r22
   2270c:	7f 93       	push	r23
   2270e:	8f 93       	push	r24
   22710:	9f 93       	push	r25
   22712:	af 93       	push	r26
   22714:	bf 93       	push	r27
   22716:	cf 93       	push	r28
   22718:	df 93       	push	r29
   2271a:	ef 93       	push	r30
   2271c:	ff 93       	push	r31
    DISABLE_SOFT_PWM_INTERRUPT();
   2271e:	80 91 70 00 	lds	r24, 0x0070	; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070>
   22722:	8b 7f       	andi	r24, 0xFB	; 251
   22724:	80 93 70 00 	sts	0x0070, r24	; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070>

#if !defined(__DOXYGEN__)
/* Internal helper functions. */
static __inline__ uint8_t __iSeiRetVal(void)
{
    sei();
   22728:	78 94       	sei
//          Only update flags, but do not perform any menu/lcd operation!
void lcd_buttons_update(void)
{
    static uint8_t lcd_long_press_active = 0;
    static uint8_t lcd_button_pressed = 0;
    if (READ(BTN_ENC) == 0)
   2272a:	80 91 00 01 	lds	r24, 0x0100	; 0x800100 <__TEXT_REGION_LENGTH__+0x7c2100>
   2272e:	86 fd       	sbrc	r24, 6
   22730:	c8 c0       	rjmp	.+400    	; 0x228c2 <__vector_14+0x1d4>
    { //button is pressed
        if (buttonBlanking.expired_cont(BUTTON_BLANKING_TIME)) {
   22732:	68 ec       	ldi	r22, 0xC8	; 200
   22734:	70 e0       	ldi	r23, 0x00	; 0
   22736:	82 eb       	ldi	r24, 0xB2	; 178
   22738:	95 e0       	ldi	r25, 0x05	; 5
   2273a:	0f 94 47 0e 	call	0x21c8e	; 0x21c8e <Timer<unsigned short>::expired_cont(unsigned short)>
   2273e:	88 23       	and	r24, r24
   22740:	b9 f0       	breq	.+46     	; 0x22770 <__vector_14+0x82>
            buttonBlanking.start();
   22742:	82 eb       	ldi	r24, 0xB2	; 178
   22744:	95 e0       	ldi	r25, 0x05	; 5
   22746:	0f 94 4e 0e 	call	0x21c9c	; 0x21c9c <Timer<unsigned short>::start()>
            safetyTimer.start();
   2274a:	8d ea       	ldi	r24, 0xAD	; 173
   2274c:	95 e0       	ldi	r25, 0x05	; 5
   2274e:	0f 94 47 10 	call	0x2208e	; 0x2208e <Timer<unsigned long>::start()>
            if ((lcd_button_pressed == 0) && (lcd_long_press_active == 0))
   22752:	80 91 ac 05 	lds	r24, 0x05AC	; 0x8005ac <lcd_buttons_update()::lcd_button_pressed>
   22756:	81 11       	cpse	r24, r1
   22758:	a5 c0       	rjmp	.+330    	; 0x228a4 <__vector_14+0x1b6>
   2275a:	80 91 ab 05 	lds	r24, 0x05AB	; 0x8005ab <lcd_buttons_update()::lcd_long_press_active>
   2275e:	81 11       	cpse	r24, r1
   22760:	a1 c0       	rjmp	.+322    	; 0x228a4 <__vector_14+0x1b6>
            {
                longPressTimer.start();
   22762:	88 ea       	ldi	r24, 0xA8	; 168
   22764:	95 e0       	ldi	r25, 0x05	; 5
   22766:	0f 94 4e 0e 	call	0x21c9c	; 0x21c9c <Timer<unsigned short>::start()>
                lcd_button_pressed = 1;
   2276a:	81 e0       	ldi	r24, 0x01	; 1
   2276c:	80 93 ac 05 	sts	0x05AC, r24	; 0x8005ac <lcd_buttons_update()::lcd_button_pressed>
		-2, 1, -1, 0,
	};

	static uint8_t enc_bits_old = 0;
	uint8_t enc_bits = 0;
    if (!READ(BTN_EN1)) enc_bits |= _BV(0);
   22770:	80 91 03 01 	lds	r24, 0x0103	; 0x800103 <__TEXT_REGION_LENGTH__+0x7c2103>
   22774:	82 fb       	bst	r24, 2
   22776:	88 27       	eor	r24, r24
   22778:	80 f9       	bld	r24, 0
   2277a:	91 e0       	ldi	r25, 0x01	; 1
   2277c:	89 27       	eor	r24, r25
    if (!READ(BTN_EN2)) enc_bits |= _BV(1);
   2277e:	90 91 03 01 	lds	r25, 0x0103	; 0x800103 <__TEXT_REGION_LENGTH__+0x7c2103>
   22782:	91 ff       	sbrs	r25, 1
   22784:	82 60       	ori	r24, 0x02	; 2

	if (enc_bits != enc_bits_old)
   22786:	e0 91 a5 05 	lds	r30, 0x05A5	; 0x8005a5 <lcd_buttons_update()::enc_bits_old>
   2278a:	e8 17       	cp	r30, r24
   2278c:	e1 f0       	breq	.+56     	; 0x227c6 <__vector_14+0xd8>
    {
		int8_t newDiff = pgm_read_byte(&encrot_table[(enc_bits_old << 2) | enc_bits]);
   2278e:	24 e0       	ldi	r18, 0x04	; 4
   22790:	e2 9f       	mul	r30, r18
   22792:	f0 01       	movw	r30, r0
   22794:	11 24       	eor	r1, r1
   22796:	e8 2b       	or	r30, r24
   22798:	ec 5c       	subi	r30, 0xCC	; 204
   2279a:	f8 46       	sbci	r31, 0x68	; 104
   2279c:	e4 91       	lpm	r30, Z
		lcd_encoder_diff += newDiff;
   2279e:	90 91 a4 05 	lds	r25, 0x05A4	; 0x8005a4 <_ZL16lcd_encoder_diff.lto_priv.502>
   227a2:	e9 0f       	add	r30, r25
   227a4:	e0 93 a4 05 	sts	0x05A4, r30	; 0x8005a4 <_ZL16lcd_encoder_diff.lto_priv.502>

        if (abs(lcd_encoder_diff) >= ENCODER_PULSES_PER_STEP) {
   227a8:	0e 2e       	mov	r0, r30
   227aa:	00 0c       	add	r0, r0
   227ac:	ff 0b       	sbc	r31, r31
   227ae:	f7 ff       	sbrs	r31, 7
   227b0:	03 c0       	rjmp	.+6      	; 0x227b8 <__vector_14+0xca>
   227b2:	f1 95       	neg	r31
   227b4:	e1 95       	neg	r30
   227b6:	f1 09       	sbc	r31, r1
   227b8:	34 97       	sbiw	r30, 0x04	; 4
   227ba:	1c f0       	brlt	.+6      	; 0x227c2 <__vector_14+0xd4>
            lcd_backlight_wake_trigger = true; // flag event, knob rotated
   227bc:	91 e0       	ldi	r25, 0x01	; 1
   227be:	90 93 a6 05 	sts	0x05A6, r25	; 0x8005a6 <_ZL26lcd_backlight_wake_trigger.lto_priv.501>
        }
        enc_bits_old = enc_bits;
   227c2:	80 93 a5 05 	sts	0x05A5, r24	; 0x8005a5 <lcd_buttons_update()::enc_bits_old>

#ifndef SLOW_PWM_HEATERS
  /*
   * standard PWM modulation
   */
  if (pwm_count == 0)
   227c6:	80 91 6e 02 	lds	r24, 0x026E	; 0x80026e <soft_pwm_core()::pwm_count>
   227ca:	81 11       	cpse	r24, r1
   227cc:	08 c0       	rjmp	.+16     	; 0x227de <__vector_14+0xf0>
  {
    soft_pwm_0 = soft_pwm[0];
   227ce:	80 91 f5 05 	lds	r24, 0x05F5	; 0x8005f5 <_ZL8soft_pwm.lto_priv.504>
   227d2:	80 93 bb 05 	sts	0x05BB, r24	; 0x8005bb <soft_pwm_core()::soft_pwm_0>
    if(soft_pwm_0 > 0)
   227d6:	88 23       	and	r24, r24
   227d8:	09 f4       	brne	.+2      	; 0x227dc <__vector_14+0xee>
   227da:	87 c0       	rjmp	.+270    	; 0x228ea <__vector_14+0x1fc>
	{
      WRITE(HEATER_0_PIN,1);
   227dc:	75 9a       	sbi	0x0e, 5	; 14
#endif
    } else WRITE(HEATER_0_PIN,0);
  }

#ifdef FAN_SOFT_PWM
  if ((pwm_count & ((1 << FAN_SOFT_PWM_BITS) - 1)) == 0)
   227de:	80 91 6e 02 	lds	r24, 0x026E	; 0x80026e <soft_pwm_core()::pwm_count>
   227e2:	8f 70       	andi	r24, 0x0F	; 15
   227e4:	a9 f4       	brne	.+42     	; 0x22810 <__vector_14+0x122>
  {
    soft_pwm_fan = fanSpeedSoftPwm / (1 << (8 - FAN_SOFT_PWM_BITS));
   227e6:	80 91 1d 06 	lds	r24, 0x061D	; 0x80061d <fanSpeedSoftPwm>
   227ea:	90 e0       	ldi	r25, 0x00	; 0
   227ec:	24 e0       	ldi	r18, 0x04	; 4
   227ee:	95 95       	asr	r25
   227f0:	87 95       	ror	r24
   227f2:	2a 95       	dec	r18
   227f4:	e1 f7       	brne	.-8      	; 0x227ee <__vector_14+0x100>
   227f6:	80 93 0f 04 	sts	0x040F, r24	; 0x80040f <_ZL12soft_pwm_fan.lto_priv.437>
    if(soft_pwm_fan > 0) WRITE(FAN_PIN,1); else WRITE(FAN_PIN,0);
   227fa:	89 2b       	or	r24, r25
   227fc:	09 f4       	brne	.+2      	; 0x22800 <__vector_14+0x112>
   227fe:	77 c0       	rjmp	.+238    	; 0x228ee <__vector_14+0x200>
   22800:	9f b7       	in	r25, 0x3f	; 63
   22802:	f8 94       	cli
   22804:	80 91 02 01 	lds	r24, 0x0102	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   22808:	88 60       	ori	r24, 0x08	; 8
   2280a:	80 93 02 01 	sts	0x0102, r24	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   2280e:	9f bf       	out	0x3f, r25	; 63
  }
#endif
  if(soft_pwm_0 < pwm_count)
   22810:	90 91 bb 05 	lds	r25, 0x05BB	; 0x8005bb <soft_pwm_core()::soft_pwm_0>
   22814:	80 91 6e 02 	lds	r24, 0x026E	; 0x80026e <soft_pwm_core()::pwm_count>
   22818:	98 17       	cp	r25, r24
   2281a:	08 f4       	brcc	.+2      	; 0x2281e <__vector_14+0x130>
  {
    WRITE(HEATER_0_PIN,0);
   2281c:	75 98       	cbi	0x0e, 5	; 14
    WRITE(HEATER_1_PIN,0);
#endif
  }

#ifdef FAN_SOFT_PWM
  if (soft_pwm_fan < (pwm_count & ((1 << FAN_SOFT_PWM_BITS) - 1))) WRITE(FAN_PIN,0);
   2281e:	80 91 6e 02 	lds	r24, 0x026E	; 0x80026e <soft_pwm_core()::pwm_count>
   22822:	8f 70       	andi	r24, 0x0F	; 15
   22824:	90 91 0f 04 	lds	r25, 0x040F	; 0x80040f <_ZL12soft_pwm_fan.lto_priv.437>
   22828:	98 17       	cp	r25, r24
   2282a:	40 f4       	brcc	.+16     	; 0x2283c <__vector_14+0x14e>
   2282c:	9f b7       	in	r25, 0x3f	; 63
   2282e:	f8 94       	cli
   22830:	80 91 02 01 	lds	r24, 0x0102	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   22834:	87 7f       	andi	r24, 0xF7	; 247
   22836:	80 93 02 01 	sts	0x0102, r24	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   2283a:	9f bf       	out	0x3f, r25	; 63
#endif

  pwm_count += (1 << SOFT_PWM_SCALE);
   2283c:	80 91 6e 02 	lds	r24, 0x026E	; 0x80026e <soft_pwm_core()::pwm_count>
   22840:	8f 5f       	subi	r24, 0xFF	; 255
  pwm_count &= 0x7f;
   22842:	8f 77       	andi	r24, 0x7F	; 127
   22844:	80 93 6e 02 	sts	0x026E, r24	; 0x80026e <soft_pwm_core()::pwm_count>
   22848:	10 e0       	ldi	r17, 0x00	; 0
   2284a:	00 e0       	ldi	r16, 0x00	; 0

#ifdef BABYSTEPPING
FORCE_INLINE static void applyBabysteps() {
  for(uint8_t axis=0;axis<3;axis++)
  {
    int curTodo=babystepsTodo[axis]; //get rid of volatile for performance
   2284c:	e8 01       	movw	r28, r16
   2284e:	cc 0f       	add	r28, r28
   22850:	dd 1f       	adc	r29, r29
   22852:	c1 58       	subi	r28, 0x81	; 129
   22854:	dc 4f       	sbci	r29, 0xFC	; 252
   22856:	88 81       	ld	r24, Y
   22858:	99 81       	ldd	r25, Y+1	; 0x01

    if(curTodo>0)
   2285a:	18 16       	cp	r1, r24
   2285c:	19 06       	cpc	r1, r25
   2285e:	0c f0       	brlt	.+2      	; 0x22862 <__vector_14+0x174>
   22860:	4c c0       	rjmp	.+152    	; 0x228fa <__vector_14+0x20c>
{
      ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
   22862:	ff b6       	in	r15, 0x3f	; 63
    return 1;
}

static __inline__ uint8_t __iCliRetVal(void)
{
    cli();
   22864:	f8 94       	cli
        babystep(axis,/*fwd*/true);
   22866:	61 e0       	ldi	r22, 0x01	; 1
   22868:	80 2f       	mov	r24, r16
   2286a:	0f 94 a6 02 	call	0x2054c	; 0x2054c <babystep(unsigned char, bool)>
        babystepsTodo[axis]--; //less to do next time
   2286e:	88 81       	ld	r24, Y
   22870:	99 81       	ldd	r25, Y+1	; 0x01
   22872:	01 97       	sbiw	r24, 0x01	; 1
    else
    if(curTodo<0)
    {
      ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
        babystep(axis,/*fwd*/false);
        babystepsTodo[axis]++; //less to do next time
   22874:	99 83       	std	Y+1, r25	; 0x01
   22876:	88 83       	st	Y, r24
    (void)__s;
}

static __inline__ void __iRestore(const  uint8_t *__s)
{
    SREG = *__s;
   22878:	ff be       	out	0x3f, r15	; 63
    __asm__ volatile ("" ::: "memory");
   2287a:	0f 5f       	subi	r16, 0xFF	; 255
   2287c:	1f 4f       	sbci	r17, 0xFF	; 255
}
#endif

#ifdef BABYSTEPPING
FORCE_INLINE static void applyBabysteps() {
  for(uint8_t axis=0;axis<3;axis++)
   2287e:	03 30       	cpi	r16, 0x03	; 3
   22880:	11 05       	cpc	r17, r1
   22882:	21 f7       	brne	.-56     	; 0x2284c <__vector_14+0x15e>
#ifdef BABYSTEPPING
  applyBabysteps();
#endif //BABYSTEPPING

  // Check if a stack overflow happened
  if (!SdFatUtil::test_stack_integrity()) stack_error();
   22884:	80 91 37 17 	lds	r24, 0x1737	; 0x801737 <__bss_end+0x20>
   22888:	90 91 38 17 	lds	r25, 0x1738	; 0x801738 <__bss_end+0x21>
   2288c:	a0 91 39 17 	lds	r26, 0x1739	; 0x801739 <__bss_end+0x22>
   22890:	b0 91 3a 17 	lds	r27, 0x173A	; 0x80173a <__bss_end+0x23>
   22894:	82 3a       	cpi	r24, 0xA2	; 162
   22896:	92 4a       	sbci	r25, 0xA2	; 162
   22898:	a1 05       	cpc	r26, r1
   2289a:	b1 05       	cpc	r27, r1
   2289c:	d9 f1       	breq	.+118    	; 0x22914 <__vector_14+0x226>
    crash_and_burn(dump_crash_reason::bad_isr);
}
#endif //EMERGENCY_HANDLERS

void stack_error() {
    crash_and_burn(dump_crash_reason::stack_error);
   2289e:	81 e0       	ldi	r24, 0x01	; 1
   228a0:	0e 94 c7 86 	call	0x10d8e	; 0x10d8e <crash_and_burn(dump_crash_reason) [clone .lto_priv.485]>
            if ((lcd_button_pressed == 0) && (lcd_long_press_active == 0))
            {
                longPressTimer.start();
                lcd_button_pressed = 1;
            }
            else if (longPressTimer.expired(LONG_PRESS_TIME))
   228a4:	68 ee       	ldi	r22, 0xE8	; 232
   228a6:	73 e0       	ldi	r23, 0x03	; 3
   228a8:	88 ea       	ldi	r24, 0xA8	; 168
   228aa:	95 e0       	ldi	r25, 0x05	; 5
   228ac:	0f 94 1f 0e 	call	0x21c3e	; 0x21c3e <Timer<unsigned short>::expired(unsigned short)>
   228b0:	88 23       	and	r24, r24
   228b2:	09 f4       	brne	.+2      	; 0x228b6 <__vector_14+0x1c8>
   228b4:	5d cf       	rjmp	.-326    	; 0x22770 <__vector_14+0x82>
            {
                lcd_long_press_active = 1;
   228b6:	81 e0       	ldi	r24, 0x01	; 1
   228b8:	80 93 ab 05 	sts	0x05AB, r24	; 0x8005ab <lcd_buttons_update()::lcd_long_press_active>
                lcd_longpress_trigger = 1;
   228bc:	80 93 a7 05 	sts	0x05A7, r24	; 0x8005a7 <lcd_longpress_trigger>
   228c0:	57 cf       	rjmp	.-338    	; 0x22770 <__vector_14+0x82>
            }
        }
    }
    else
    { //button not pressed
        if (lcd_button_pressed)
   228c2:	80 91 ac 05 	lds	r24, 0x05AC	; 0x8005ac <lcd_buttons_update()::lcd_button_pressed>
   228c6:	88 23       	and	r24, r24
   228c8:	09 f4       	brne	.+2      	; 0x228cc <__vector_14+0x1de>
   228ca:	52 cf       	rjmp	.-348    	; 0x22770 <__vector_14+0x82>
        { //button was released
            lcd_button_pressed = 0; // Reset to prevent double triggering
   228cc:	10 92 ac 05 	sts	0x05AC, r1	; 0x8005ac <lcd_buttons_update()::lcd_button_pressed>
            if (!lcd_long_press_active)
   228d0:	80 91 ab 05 	lds	r24, 0x05AB	; 0x8005ab <lcd_buttons_update()::lcd_long_press_active>
   228d4:	81 11       	cpse	r24, r1
   228d6:	03 c0       	rjmp	.+6      	; 0x228de <__vector_14+0x1f0>
            { //button released before long press gets activated
                lcd_click_trigger = 1; // This flag is reset when the event is consumed
   228d8:	81 e0       	ldi	r24, 0x01	; 1
   228da:	80 93 95 03 	sts	0x0395, r24	; 0x800395 <lcd_click_trigger>
            }
            lcd_backlight_wake_trigger = true; // flag event, knob pressed
   228de:	81 e0       	ldi	r24, 0x01	; 1
   228e0:	80 93 a6 05 	sts	0x05A6, r24	; 0x8005a6 <_ZL26lcd_backlight_wake_trigger.lto_priv.501>
            lcd_long_press_active = 0;
   228e4:	10 92 ab 05 	sts	0x05AB, r1	; 0x8005ab <lcd_buttons_update()::lcd_long_press_active>
   228e8:	43 cf       	rjmp	.-378    	; 0x22770 <__vector_14+0x82>
	{
      WRITE(HEATER_0_PIN,1);
#ifdef HEATERS_PARALLEL
      WRITE(HEATER_1_PIN,1);
#endif
    } else WRITE(HEATER_0_PIN,0);
   228ea:	75 98       	cbi	0x0e, 5	; 14
   228ec:	78 cf       	rjmp	.-272    	; 0x227de <__vector_14+0xf0>

#ifdef FAN_SOFT_PWM
  if ((pwm_count & ((1 << FAN_SOFT_PWM_BITS) - 1)) == 0)
  {
    soft_pwm_fan = fanSpeedSoftPwm / (1 << (8 - FAN_SOFT_PWM_BITS));
    if(soft_pwm_fan > 0) WRITE(FAN_PIN,1); else WRITE(FAN_PIN,0);
   228ee:	9f b7       	in	r25, 0x3f	; 63
   228f0:	f8 94       	cli
   228f2:	80 91 02 01 	lds	r24, 0x0102	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   228f6:	87 7f       	andi	r24, 0xF7	; 247
   228f8:	88 cf       	rjmp	.-240    	; 0x2280a <__vector_14+0x11c>
        babystep(axis,/*fwd*/true);
        babystepsTodo[axis]--; //less to do next time
      }
    }
    else
    if(curTodo<0)
   228fa:	89 2b       	or	r24, r25
   228fc:	09 f4       	brne	.+2      	; 0x22900 <__vector_14+0x212>
   228fe:	bd cf       	rjmp	.-134    	; 0x2287a <__vector_14+0x18c>
    {
      ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
   22900:	ff b6       	in	r15, 0x3f	; 63
    return 1;
}

static __inline__ uint8_t __iCliRetVal(void)
{
    cli();
   22902:	f8 94       	cli
        babystep(axis,/*fwd*/false);
   22904:	60 e0       	ldi	r22, 0x00	; 0
   22906:	80 2f       	mov	r24, r16
   22908:	0f 94 a6 02 	call	0x2054c	; 0x2054c <babystep(unsigned char, bool)>
        babystepsTodo[axis]++; //less to do next time
   2290c:	88 81       	ld	r24, Y
   2290e:	99 81       	ldd	r25, Y+1	; 0x01
   22910:	01 96       	adiw	r24, 0x01	; 1
   22912:	b0 cf       	rjmp	.-160    	; 0x22874 <__vector_14+0x186>

#if (defined(FANCHECK) && defined(TACH_0) && (TACH_0 > -1))
void readFanTach() {
    static bool fan_state[2];
#ifdef FAN_SOFT_PWM
    if (READ(TACH_0) != fan_state[0]) {
   22914:	96 b1       	in	r25, 0x06	; 6
   22916:	80 91 b9 05 	lds	r24, 0x05B9	; 0x8005b9 <readFanTach()::fan_state>
   2291a:	99 1f       	adc	r25, r25
   2291c:	99 27       	eor	r25, r25
   2291e:	99 1f       	adc	r25, r25
   22920:	98 17       	cp	r25, r24
   22922:	91 f0       	breq	.+36     	; 0x22948 <__vector_14+0x25a>
        if(fan_measuring) fan_edge_counter[0] ++;
   22924:	90 91 b6 03 	lds	r25, 0x03B6	; 0x8003b6 <fan_measuring>
   22928:	99 23       	and	r25, r25
   2292a:	51 f0       	breq	.+20     	; 0x22940 <__vector_14+0x252>
   2292c:	20 91 b5 05 	lds	r18, 0x05B5	; 0x8005b5 <fan_edge_counter>
   22930:	30 91 b6 05 	lds	r19, 0x05B6	; 0x8005b6 <fan_edge_counter+0x1>
   22934:	2f 5f       	subi	r18, 0xFF	; 255
   22936:	3f 4f       	sbci	r19, 0xFF	; 255
   22938:	30 93 b6 05 	sts	0x05B6, r19	; 0x8005b6 <fan_edge_counter+0x1>
   2293c:	20 93 b5 05 	sts	0x05B5, r18	; 0x8005b5 <fan_edge_counter>
        fan_state[0] = !fan_state[0];
   22940:	91 e0       	ldi	r25, 0x01	; 1
   22942:	89 27       	eor	r24, r25
   22944:	80 93 b9 05 	sts	0x05B9, r24	; 0x8005b9 <readFanTach()::fan_state>
    (void)__s;
}

static __inline__ void __iCliParam(const uint8_t *__s)
{
    cli();
   22948:	f8 94       	cli
{
    DISABLE_SOFT_PWM_INTERRUPT();
    NONATOMIC_BLOCK(NONATOMIC_FORCEOFF) {
        soft_pwm_isr();
    }
    ENABLE_SOFT_PWM_INTERRUPT();
   2294a:	80 91 70 00 	lds	r24, 0x0070	; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070>
   2294e:	84 60       	ori	r24, 0x04	; 4
   22950:	80 93 70 00 	sts	0x0070, r24	; 0x800070 <__TEXT_REGION_LENGTH__+0x7c2070>
}
   22954:	ff 91       	pop	r31
   22956:	ef 91       	pop	r30
   22958:	df 91       	pop	r29
   2295a:	cf 91       	pop	r28
   2295c:	bf 91       	pop	r27
   2295e:	af 91       	pop	r26
   22960:	9f 91       	pop	r25
   22962:	8f 91       	pop	r24
   22964:	7f 91       	pop	r23
   22966:	6f 91       	pop	r22
   22968:	5f 91       	pop	r21
   2296a:	4f 91       	pop	r20
   2296c:	3f 91       	pop	r19
   2296e:	2f 91       	pop	r18
   22970:	1f 91       	pop	r17
   22972:	0f 91       	pop	r16
   22974:	ff 90       	pop	r15
   22976:	0f 90       	pop	r0
   22978:	0b be       	out	0x3b, r0	; 59
   2297a:	0f 90       	pop	r0
   2297c:	0f be       	out	0x3f, r0	; 63
   2297e:	0f 90       	pop	r0
   22980:	1f 90       	pop	r1
   22982:	18 95       	reti

00022984 <analog2tempBed(int) [clone .lto_priv.404]>:
  return ((raw * ((5.0 * 100.0) / 1024.0) / OVERSAMPLENR) * TEMP_SENSOR_AD595_GAIN) + TEMP_SENSOR_AD595_OFFSET;
}

// Derived from RepRap FiveD extruder::getTemperature()
// For bed temperature measurement.
static float analog2tempBed(int raw) {
   22984:	4f 92       	push	r4
   22986:	5f 92       	push	r5
   22988:	6f 92       	push	r6
   2298a:	7f 92       	push	r7
   2298c:	af 92       	push	r10
   2298e:	bf 92       	push	r11
   22990:	cf 92       	push	r12
   22992:	df 92       	push	r13
   22994:	ef 92       	push	r14
   22996:	ff 92       	push	r15
   22998:	0f 93       	push	r16
   2299a:	1f 93       	push	r17
   2299c:	cf 93       	push	r28
   2299e:	df 93       	push	r29
   229a0:	24 e0       	ldi	r18, 0x04	; 4
   229a2:	30 e0       	ldi	r19, 0x00	; 0
   229a4:	41 e0       	ldi	r20, 0x01	; 1
   229a6:	50 e0       	ldi	r21, 0x00	; 0
   229a8:	d9 01       	movw	r26, r18
   229aa:	a6 5a       	subi	r26, 0xA6	; 166
   229ac:	ba 46       	sbci	r27, 0x6A	; 106
    float celsius = 0;
    byte i;

    for (i=1; i<BEDTEMPTABLE_LEN; i++)
    {
      if (PGM_RD_W(BEDTEMPTABLE[i][0]) > raw)
   229ae:	fd 01       	movw	r30, r26
   229b0:	65 91       	lpm	r22, Z+
   229b2:	74 91       	lpm	r23, Z
   229b4:	86 17       	cp	r24, r22
   229b6:	97 07       	cpc	r25, r23
   229b8:	0c f0       	brlt	.+2      	; 0x229bc <analog2tempBed(int) [clone .lto_priv.404]+0x38>
   229ba:	80 c0       	rjmp	.+256    	; 0x22abc <analog2tempBed(int) [clone .lto_priv.404]+0x138>
      {
        celsius  = PGM_RD_W(BEDTEMPTABLE[i-1][1]) +
   229bc:	41 50       	subi	r20, 0x01	; 1
   229be:	51 09       	sbc	r21, r1
   229c0:	44 0f       	add	r20, r20
   229c2:	55 1f       	adc	r21, r21
   229c4:	44 0f       	add	r20, r20
   229c6:	55 1f       	adc	r21, r21
   229c8:	8a 01       	movw	r16, r20
   229ca:	04 5a       	subi	r16, 0xA4	; 164
   229cc:	1a 46       	sbci	r17, 0x6A	; 106
   229ce:	f8 01       	movw	r30, r16
   229d0:	c5 90       	lpm	r12, Z+
   229d2:	d4 90       	lpm	r13, Z
          (raw - PGM_RD_W(BEDTEMPTABLE[i-1][0])) *
   229d4:	46 5a       	subi	r20, 0xA6	; 166
   229d6:	5a 46       	sbci	r21, 0x6A	; 106
   229d8:	fa 01       	movw	r30, r20
   229da:	65 91       	lpm	r22, Z+
   229dc:	74 91       	lpm	r23, Z
          (float)(PGM_RD_W(BEDTEMPTABLE[i][1]) - PGM_RD_W(BEDTEMPTABLE[i-1][1])) /
   229de:	f9 01       	movw	r30, r18
   229e0:	e4 5a       	subi	r30, 0xA4	; 164
   229e2:	fa 46       	sbci	r31, 0x6A	; 106
   229e4:	c5 91       	lpm	r28, Z+
   229e6:	d4 91       	lpm	r29, Z
   229e8:	f8 01       	movw	r30, r16
   229ea:	05 91       	lpm	r16, Z+
   229ec:	14 91       	lpm	r17, Z
          (float)(PGM_RD_W(BEDTEMPTABLE[i][0]) - PGM_RD_W(BEDTEMPTABLE[i-1][0]));
   229ee:	fd 01       	movw	r30, r26
   229f0:	e5 90       	lpm	r14, Z+
   229f2:	f4 90       	lpm	r15, Z
   229f4:	fa 01       	movw	r30, r20
   229f6:	a5 90       	lpm	r10, Z+
   229f8:	b4 90       	lpm	r11, Z
    for (i=1; i<BEDTEMPTABLE_LEN; i++)
    {
      if (PGM_RD_W(BEDTEMPTABLE[i][0]) > raw)
      {
        celsius  = PGM_RD_W(BEDTEMPTABLE[i-1][1]) +
          (raw - PGM_RD_W(BEDTEMPTABLE[i-1][0])) *
   229fa:	86 1b       	sub	r24, r22
   229fc:	97 0b       	sbc	r25, r23
   229fe:	bc 01       	movw	r22, r24
   22a00:	99 0f       	add	r25, r25
   22a02:	88 0b       	sbc	r24, r24
   22a04:	99 0b       	sbc	r25, r25
   22a06:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   22a0a:	2b 01       	movw	r4, r22
   22a0c:	3c 01       	movw	r6, r24
          (float)(PGM_RD_W(BEDTEMPTABLE[i][1]) - PGM_RD_W(BEDTEMPTABLE[i-1][1])) /
   22a0e:	be 01       	movw	r22, r28
   22a10:	60 1b       	sub	r22, r16
   22a12:	71 0b       	sbc	r23, r17
   22a14:	07 2e       	mov	r0, r23
   22a16:	00 0c       	add	r0, r0
   22a18:	88 0b       	sbc	r24, r24
   22a1a:	99 0b       	sbc	r25, r25
   22a1c:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   22a20:	9b 01       	movw	r18, r22
   22a22:	ac 01       	movw	r20, r24
    for (i=1; i<BEDTEMPTABLE_LEN; i++)
    {
      if (PGM_RD_W(BEDTEMPTABLE[i][0]) > raw)
      {
        celsius  = PGM_RD_W(BEDTEMPTABLE[i-1][1]) +
          (raw - PGM_RD_W(BEDTEMPTABLE[i-1][0])) *
   22a24:	c3 01       	movw	r24, r6
   22a26:	b2 01       	movw	r22, r4
   22a28:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   22a2c:	2b 01       	movw	r4, r22
   22a2e:	3c 01       	movw	r6, r24
          (float)(PGM_RD_W(BEDTEMPTABLE[i][1]) - PGM_RD_W(BEDTEMPTABLE[i-1][1])) /
          (float)(PGM_RD_W(BEDTEMPTABLE[i][0]) - PGM_RD_W(BEDTEMPTABLE[i-1][0]));
   22a30:	b7 01       	movw	r22, r14
   22a32:	6a 19       	sub	r22, r10
   22a34:	7b 09       	sbc	r23, r11
   22a36:	07 2e       	mov	r0, r23
   22a38:	00 0c       	add	r0, r0
   22a3a:	88 0b       	sbc	r24, r24
   22a3c:	99 0b       	sbc	r25, r25
   22a3e:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   22a42:	9b 01       	movw	r18, r22
   22a44:	ac 01       	movw	r20, r24
    {
      if (PGM_RD_W(BEDTEMPTABLE[i][0]) > raw)
      {
        celsius  = PGM_RD_W(BEDTEMPTABLE[i-1][1]) +
          (raw - PGM_RD_W(BEDTEMPTABLE[i-1][0])) *
          (float)(PGM_RD_W(BEDTEMPTABLE[i][1]) - PGM_RD_W(BEDTEMPTABLE[i-1][1])) /
   22a46:	c3 01       	movw	r24, r6
   22a48:	b2 01       	movw	r22, r4
   22a4a:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   22a4e:	2b 01       	movw	r4, r22
   22a50:	3c 01       	movw	r6, r24

    for (i=1; i<BEDTEMPTABLE_LEN; i++)
    {
      if (PGM_RD_W(BEDTEMPTABLE[i][0]) > raw)
      {
        celsius  = PGM_RD_W(BEDTEMPTABLE[i-1][1]) +
   22a52:	b6 01       	movw	r22, r12
   22a54:	dd 0c       	add	r13, r13
   22a56:	88 0b       	sbc	r24, r24
   22a58:	99 0b       	sbc	r25, r25
   22a5a:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   22a5e:	9b 01       	movw	r18, r22
   22a60:	ac 01       	movw	r20, r24
   22a62:	c3 01       	movw	r24, r6
   22a64:	b2 01       	movw	r22, r4
   22a66:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
        break;
      }
    }

    // Overflow: Set to last value in the table
    if (i == BEDTEMPTABLE_LEN) celsius = PGM_RD_W(BEDTEMPTABLE[i-1][1]);
   22a6a:	6b 01       	movw	r12, r22
   22a6c:	7c 01       	movw	r14, r24
	float _offset_start = BED_OFFSET_START;
	float _first_koef = (_offset / 2) / (_offset_center - _offset_start);
	float _second_koef = (_offset / 2) / (100 - _offset_center);


	if (celsius >= _offset_start && celsius <= _offset_center)
   22a6e:	20 e0       	ldi	r18, 0x00	; 0
   22a70:	30 e0       	ldi	r19, 0x00	; 0
   22a72:	40 e2       	ldi	r20, 0x20	; 32
   22a74:	52 e4       	ldi	r21, 0x42	; 66
   22a76:	c7 01       	movw	r24, r14
   22a78:	b6 01       	movw	r22, r12
   22a7a:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   22a7e:	87 fd       	sbrc	r24, 7
   22a80:	30 c0       	rjmp	.+96     	; 0x22ae2 <analog2tempBed(int) [clone .lto_priv.404]+0x15e>
   22a82:	20 e0       	ldi	r18, 0x00	; 0
   22a84:	30 e0       	ldi	r19, 0x00	; 0
   22a86:	48 e4       	ldi	r20, 0x48	; 72
   22a88:	52 e4       	ldi	r21, 0x42	; 66
   22a8a:	c7 01       	movw	r24, r14
   22a8c:	b6 01       	movw	r22, r12
   22a8e:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   22a92:	18 16       	cp	r1, r24
   22a94:	34 f1       	brlt	.+76     	; 0x22ae2 <analog2tempBed(int) [clone .lto_priv.404]+0x15e>
	{
		celsius = celsius + (_first_koef * (celsius - _offset_start));
   22a96:	20 e0       	ldi	r18, 0x00	; 0
   22a98:	30 e0       	ldi	r19, 0x00	; 0
   22a9a:	40 e2       	ldi	r20, 0x20	; 32
   22a9c:	52 e4       	ldi	r21, 0x42	; 66
   22a9e:	c7 01       	movw	r24, r14
   22aa0:	b6 01       	movw	r22, r12
   22aa2:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   22aa6:	20 e0       	ldi	r18, 0x00	; 0
   22aa8:	30 e0       	ldi	r19, 0x00	; 0
   22aaa:	40 e0       	ldi	r20, 0x00	; 0
   22aac:	5f e3       	ldi	r21, 0x3F	; 63
   22aae:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   22ab2:	9b 01       	movw	r18, r22
   22ab4:	ac 01       	movw	r20, r24
	{
		celsius = celsius + (_first_koef * (_offset_center - _offset_start)) + ( _second_koef * ( celsius - ( 100 - _offset_center ) )) ;
	}
	else if (celsius > 100)
	{
		celsius = celsius + _offset;
   22ab6:	c7 01       	movw	r24, r14
   22ab8:	b6 01       	movw	r22, r12
   22aba:	43 c0       	rjmp	.+134    	; 0x22b42 <analog2tempBed(int) [clone .lto_priv.404]+0x1be>
   22abc:	4f 5f       	subi	r20, 0xFF	; 255
   22abe:	5f 4f       	sbci	r21, 0xFF	; 255
   22ac0:	2c 5f       	subi	r18, 0xFC	; 252
   22ac2:	3f 4f       	sbci	r19, 0xFF	; 255
static float analog2tempBed(int raw) {
  #ifdef BED_USES_THERMISTOR
    float celsius = 0;
    byte i;

    for (i=1; i<BEDTEMPTABLE_LEN; i++)
   22ac4:	24 3f       	cpi	r18, 0xF4	; 244
   22ac6:	31 05       	cpc	r19, r1
   22ac8:	09 f0       	breq	.+2      	; 0x22acc <analog2tempBed(int) [clone .lto_priv.404]+0x148>
   22aca:	6e cf       	rjmp	.-292    	; 0x229a8 <analog2tempBed(int) [clone .lto_priv.404]+0x24>
        break;
      }
    }

    // Overflow: Set to last value in the table
    if (i == BEDTEMPTABLE_LEN) celsius = PGM_RD_W(BEDTEMPTABLE[i-1][1]);
   22acc:	ec e4       	ldi	r30, 0x4C	; 76
   22ace:	f6 e9       	ldi	r31, 0x96	; 150
   22ad0:	65 91       	lpm	r22, Z+
   22ad2:	74 91       	lpm	r23, Z
   22ad4:	07 2e       	mov	r0, r23
   22ad6:	00 0c       	add	r0, r0
   22ad8:	88 0b       	sbc	r24, r24
   22ada:	99 0b       	sbc	r25, r25
   22adc:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   22ae0:	c4 cf       	rjmp	.-120    	; 0x22a6a <analog2tempBed(int) [clone .lto_priv.404]+0xe6>

	if (celsius >= _offset_start && celsius <= _offset_center)
	{
		celsius = celsius + (_first_koef * (celsius - _offset_start));
	}
	else if (celsius > _offset_center && celsius <= 100)
   22ae2:	20 e0       	ldi	r18, 0x00	; 0
   22ae4:	30 e0       	ldi	r19, 0x00	; 0
   22ae6:	48 e4       	ldi	r20, 0x48	; 72
   22ae8:	52 e4       	ldi	r21, 0x42	; 66
   22aea:	c7 01       	movw	r24, r14
   22aec:	b6 01       	movw	r22, r12
   22aee:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   22af2:	18 16       	cp	r1, r24
   22af4:	dc f5       	brge	.+118    	; 0x22b6c <analog2tempBed(int) [clone .lto_priv.404]+0x1e8>
   22af6:	20 e0       	ldi	r18, 0x00	; 0
   22af8:	30 e0       	ldi	r19, 0x00	; 0
   22afa:	48 ec       	ldi	r20, 0xC8	; 200
   22afc:	52 e4       	ldi	r21, 0x42	; 66
   22afe:	c7 01       	movw	r24, r14
   22b00:	b6 01       	movw	r22, r12
   22b02:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   22b06:	18 16       	cp	r1, r24
   22b08:	8c f1       	brlt	.+98     	; 0x22b6c <analog2tempBed(int) [clone .lto_priv.404]+0x1e8>
	{
		celsius = celsius + (_first_koef * (_offset_center - _offset_start)) + ( _second_koef * ( celsius - ( 100 - _offset_center ) )) ;
   22b0a:	20 e0       	ldi	r18, 0x00	; 0
   22b0c:	30 e0       	ldi	r19, 0x00	; 0
   22b0e:	40 ea       	ldi	r20, 0xA0	; 160
   22b10:	50 e4       	ldi	r21, 0x40	; 64
   22b12:	c7 01       	movw	r24, r14
   22b14:	b6 01       	movw	r22, r12
   22b16:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   22b1a:	2b 01       	movw	r4, r22
   22b1c:	3c 01       	movw	r6, r24
   22b1e:	20 e0       	ldi	r18, 0x00	; 0
   22b20:	30 e0       	ldi	r19, 0x00	; 0
   22b22:	48 e4       	ldi	r20, 0x48	; 72
   22b24:	52 e4       	ldi	r21, 0x42	; 66
   22b26:	c7 01       	movw	r24, r14
   22b28:	b6 01       	movw	r22, r12
   22b2a:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   22b2e:	2d ec       	ldi	r18, 0xCD	; 205
   22b30:	3c ec       	ldi	r19, 0xCC	; 204
   22b32:	4c ec       	ldi	r20, 0xCC	; 204
   22b34:	5d e3       	ldi	r21, 0x3D	; 61
   22b36:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   22b3a:	9b 01       	movw	r18, r22
   22b3c:	ac 01       	movw	r20, r24
   22b3e:	c3 01       	movw	r24, r6
   22b40:	b2 01       	movw	r22, r4
	}
	else if (celsius > 100)
	{
		celsius = celsius + _offset;
   22b42:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   22b46:	6b 01       	movw	r12, r22
   22b48:	7c 01       	movw	r14, r24
  #elif defined BED_USES_AD595
    return ((raw * ((5.0 * 100.0) / 1024.0) / OVERSAMPLENR) * TEMP_SENSOR_AD595_GAIN) + TEMP_SENSOR_AD595_OFFSET;
  #else
    return 0;
  #endif
}
   22b4a:	c7 01       	movw	r24, r14
   22b4c:	b6 01       	movw	r22, r12
   22b4e:	df 91       	pop	r29
   22b50:	cf 91       	pop	r28
   22b52:	1f 91       	pop	r17
   22b54:	0f 91       	pop	r16
   22b56:	ff 90       	pop	r15
   22b58:	ef 90       	pop	r14
   22b5a:	df 90       	pop	r13
   22b5c:	cf 90       	pop	r12
   22b5e:	bf 90       	pop	r11
   22b60:	af 90       	pop	r10
   22b62:	7f 90       	pop	r7
   22b64:	6f 90       	pop	r6
   22b66:	5f 90       	pop	r5
   22b68:	4f 90       	pop	r4
   22b6a:	08 95       	ret
	}
	else if (celsius > _offset_center && celsius <= 100)
	{
		celsius = celsius + (_first_koef * (_offset_center - _offset_start)) + ( _second_koef * ( celsius - ( 100 - _offset_center ) )) ;
	}
	else if (celsius > 100)
   22b6c:	20 e0       	ldi	r18, 0x00	; 0
   22b6e:	30 e0       	ldi	r19, 0x00	; 0
   22b70:	48 ec       	ldi	r20, 0xC8	; 200
   22b72:	52 e4       	ldi	r21, 0x42	; 66
   22b74:	c7 01       	movw	r24, r14
   22b76:	b6 01       	movw	r22, r12
   22b78:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   22b7c:	18 16       	cp	r1, r24
   22b7e:	2c f7       	brge	.-54     	; 0x22b4a <analog2tempBed(int) [clone .lto_priv.404]+0x1c6>
	{
		celsius = celsius + _offset;
   22b80:	20 e0       	ldi	r18, 0x00	; 0
   22b82:	30 e0       	ldi	r19, 0x00	; 0
   22b84:	40 e2       	ldi	r20, 0x20	; 32
   22b86:	51 e4       	ldi	r21, 0x41	; 65
   22b88:	96 cf       	rjmp	.-212    	; 0x22ab6 <analog2tempBed(int) [clone .lto_priv.404]+0x132>

00022b8a <__vector_32>:
    if (pid_tuning_finished)
        temp_mgr_pid();
}

ISR(TIMERx_COMPA_vect)
{
   22b8a:	1f 92       	push	r1
   22b8c:	0f 92       	push	r0
   22b8e:	0f b6       	in	r0, 0x3f	; 63
   22b90:	0f 92       	push	r0
   22b92:	11 24       	eor	r1, r1
   22b94:	0b b6       	in	r0, 0x3b	; 59
   22b96:	0f 92       	push	r0
   22b98:	4f 92       	push	r4
   22b9a:	5f 92       	push	r5
   22b9c:	6f 92       	push	r6
   22b9e:	7f 92       	push	r7
   22ba0:	8f 92       	push	r8
   22ba2:	9f 92       	push	r9
   22ba4:	af 92       	push	r10
   22ba6:	bf 92       	push	r11
   22ba8:	cf 92       	push	r12
   22baa:	df 92       	push	r13
   22bac:	ef 92       	push	r14
   22bae:	ff 92       	push	r15
   22bb0:	0f 93       	push	r16
   22bb2:	1f 93       	push	r17
   22bb4:	2f 93       	push	r18
   22bb6:	3f 93       	push	r19
   22bb8:	4f 93       	push	r20
   22bba:	5f 93       	push	r21
   22bbc:	6f 93       	push	r22
   22bbe:	7f 93       	push	r23
   22bc0:	8f 93       	push	r24
   22bc2:	9f 93       	push	r25
   22bc4:	af 93       	push	r26
   22bc6:	bf 93       	push	r27
   22bc8:	cf 93       	push	r28
   22bca:	df 93       	push	r29
   22bcc:	ef 93       	push	r30
   22bce:	ff 93       	push	r31
    // immediately schedule a new conversion
    if(adc_values_ready != true) return;
   22bd0:	80 91 f6 05 	lds	r24, 0x05F6	; 0x8005f6 <_ZL16adc_values_ready.lto_priv.517>
   22bd4:	88 23       	and	r24, r24
   22bd6:	09 f4       	brne	.+2      	; 0x22bda <__vector_32+0x50>
   22bd8:	22 c1       	rjmp	.+580    	; 0x22e1e <__vector_32+0x294>
    adc_values_ready = false;
   22bda:	10 92 f6 05 	sts	0x05F6, r1	; 0x8005f6 <_ZL16adc_values_ready.lto_priv.517>
    adc_start_cycle();
   22bde:	0e 94 cf bc 	call	0x1799e	; 0x1799e <adc_start_cycle()>

    // run temperature management with interrupts enabled to reduce latency
    DISABLE_TEMP_MGR_INTERRUPT();
   22be2:	80 91 71 00 	lds	r24, 0x0071	; 0x800071 <__TEXT_REGION_LENGTH__+0x7c2071>
   22be6:	8d 7f       	andi	r24, 0xFD	; 253
   22be8:	80 93 71 00 	sts	0x0071, r24	; 0x800071 <__TEXT_REGION_LENGTH__+0x7c2071>

#if !defined(__DOXYGEN__)
/* Internal helper functions. */
static __inline__ uint8_t __iSeiRetVal(void)
{
    sei();
   22bec:	78 94       	sei
   interrupt context, while this function runs from temp_mgr_isr which *is* preemptible as
   analog2temp is relatively slow */
static void setIsrTemperaturesFromRawValues()
{
    for(uint8_t e=0;e<EXTRUDERS;e++)
        current_temperature_isr[e] = analog2temp(current_temperature_raw[e], e);
   22bee:	80 91 dc 05 	lds	r24, 0x05DC	; 0x8005dc <current_temperature_raw>
   22bf2:	90 91 dd 05 	lds	r25, 0x05DD	; 0x8005dd <current_temperature_raw+0x1>
   22bf6:	0f 94 66 8f 	call	0x31ecc	; 0x31ecc <analog2temp(int, unsigned char) [clone .constprop.59]>
   22bfa:	4b 01       	movw	r8, r22
   22bfc:	5c 01       	movw	r10, r24
   22bfe:	80 92 f1 05 	sts	0x05F1, r8	; 0x8005f1 <current_temperature_isr>
   22c02:	90 92 f2 05 	sts	0x05F2, r9	; 0x8005f2 <current_temperature_isr+0x1>
   22c06:	a0 92 f3 05 	sts	0x05F3, r10	; 0x8005f3 <current_temperature_isr+0x2>
   22c0a:	b0 92 f4 05 	sts	0x05F4, r11	; 0x8005f4 <current_temperature_isr+0x3>
    current_temperature_bed_isr = analog2tempBed(current_temperature_bed_raw);
   22c0e:	00 91 de 05 	lds	r16, 0x05DE	; 0x8005de <current_temperature_bed_raw>
   22c12:	10 91 df 05 	lds	r17, 0x05DF	; 0x8005df <current_temperature_bed_raw+0x1>
   22c16:	c8 01       	movw	r24, r16
   22c18:	0f 94 c2 14 	call	0x22984	; 0x22984 <analog2tempBed(int) [clone .lto_priv.404]>
   22c1c:	6b 01       	movw	r12, r22
   22c1e:	7c 01       	movw	r14, r24
   22c20:	c0 92 ea 05 	sts	0x05EA, r12	; 0x8005ea <current_temperature_bed_isr>
   22c24:	d0 92 eb 05 	sts	0x05EB, r13	; 0x8005eb <current_temperature_bed_isr+0x1>
   22c28:	e0 92 ec 05 	sts	0x05EC, r14	; 0x8005ec <current_temperature_bed_isr+0x2>
   22c2c:	f0 92 ed 05 	sts	0x05ED, r15	; 0x8005ed <current_temperature_bed_isr+0x3>
#ifdef PINDA_THERMISTOR
    current_temperature_pinda_isr = analog2tempBed(current_temperature_raw_pinda);
   22c30:	80 91 da 05 	lds	r24, 0x05DA	; 0x8005da <current_temperature_raw_pinda>
   22c34:	90 91 db 05 	lds	r25, 0x05DB	; 0x8005db <current_temperature_raw_pinda+0x1>
   22c38:	0f 94 c2 14 	call	0x22984	; 0x22984 <analog2tempBed(int) [clone .lto_priv.404]>
   22c3c:	60 93 d6 05 	sts	0x05D6, r22	; 0x8005d6 <current_temperature_pinda_isr>
   22c40:	70 93 d7 05 	sts	0x05D7, r23	; 0x8005d7 <current_temperature_pinda_isr+0x1>
   22c44:	80 93 d8 05 	sts	0x05D8, r24	; 0x8005d8 <current_temperature_pinda_isr+0x2>
   22c48:	90 93 d9 05 	sts	0x05D9, r25	; 0x8005d9 <current_temperature_pinda_isr+0x3>
#endif
#ifdef AMBIENT_THERMISTOR
    current_temperature_ambient_isr = analog2tempAmbient(current_temperature_raw_ambient); //thermistor for ambient is NTCG104LH104JT1 (2000)
#endif
    temp_meas_ready = true;
   22c4c:	81 e0       	ldi	r24, 0x01	; 1
   22c4e:	80 93 d5 05 	sts	0x05D5, r24	; 0x8005d5 <temp_meas_ready>
{
    // update *_isr temperatures from raw values for PID regulation
    setIsrTemperaturesFromRawValues();

    // clear the error assertion flag before checking again
    temp_error_state.assert = false;
   22c52:	80 91 cc 03 	lds	r24, 0x03CC	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
   22c56:	8d 7f       	andi	r24, 0xFD	; 253
   22c58:	80 93 cc 03 	sts	0x03CC, r24	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>

void check_max_temp_raw()
{
    //heater
#if HEATER_0_RAW_LO_TEMP > HEATER_0_RAW_HI_TEMP
    if (current_temperature_raw[0] <= maxttemp_raw[0]) {
   22c5c:	c0 91 dc 05 	lds	r28, 0x05DC	; 0x8005dc <current_temperature_raw>
   22c60:	d0 91 dd 05 	lds	r29, 0x05DD	; 0x8005dd <current_temperature_raw+0x1>
   22c64:	80 91 0b 04 	lds	r24, 0x040B	; 0x80040b <_ZL12maxttemp_raw.lto_priv.430>
   22c68:	90 91 0c 04 	lds	r25, 0x040C	; 0x80040c <_ZL12maxttemp_raw.lto_priv.430+0x1>
   22c6c:	8c 17       	cp	r24, r28
   22c6e:	9d 07       	cpc	r25, r29
   22c70:	2c f0       	brlt	.+10     	; 0x22c7c <__vector_32+0xf2>
#else
    if (current_temperature_raw[0] >= maxttemp_raw[0]) {
#endif
        set_temp_error(TempErrorSource::hotend, 0, TempErrorType::max);
   22c72:	40 e0       	ldi	r20, 0x00	; 0
   22c74:	60 e0       	ldi	r22, 0x00	; 0
   22c76:	80 e0       	ldi	r24, 0x00	; 0
   22c78:	0f 94 20 11 	call	0x22240	; 0x22240 <set_temp_error(TempErrorSource, unsigned char, TempErrorType)>
    }
    //bed
#if defined(BED_MAXTEMP) && (TEMP_SENSOR_BED != 0)
#if HEATER_BED_RAW_LO_TEMP > HEATER_BED_RAW_HI_TEMP
    if (current_temperature_bed_raw <= bed_maxttemp_raw) {
   22c7c:	80 91 09 04 	lds	r24, 0x0409	; 0x800409 <_ZL16bed_maxttemp_raw.lto_priv.431>
   22c80:	90 91 0a 04 	lds	r25, 0x040A	; 0x80040a <_ZL16bed_maxttemp_raw.lto_priv.431+0x1>
   22c84:	80 17       	cp	r24, r16
   22c86:	91 07       	cpc	r25, r17
   22c88:	2c f0       	brlt	.+10     	; 0x22c94 <__vector_32+0x10a>
#else
    if (current_temperature_bed_raw >= bed_maxttemp_raw) {
#endif
        set_temp_error(TempErrorSource::bed, 0, TempErrorType::max);
   22c8a:	40 e0       	ldi	r20, 0x00	; 0
   22c8c:	60 e0       	ldi	r22, 0x00	; 0
   22c8e:	81 e0       	ldi	r24, 0x01	; 1
   22c90:	0f 94 20 11 	call	0x22240	; 0x22240 <set_temp_error(TempErrorSource, unsigned char, TempErrorType)>
    {
        // ambient temperature is low
#endif //AMBIENT_THERMISTOR
        // *** 'common' part of code for MK2.5 & MK3
        // * nozzle checking
        if(target_temperature_isr[active_extruder]>minttemp[active_extruder]) {
   22c94:	60 91 0d 04 	lds	r22, 0x040D	; 0x80040d <_ZL8minttemp.lto_priv.427>
   22c98:	70 91 0e 04 	lds	r23, 0x040E	; 0x80040e <_ZL8minttemp.lto_priv.427+0x1>
   22c9c:	80 91 ef 05 	lds	r24, 0x05EF	; 0x8005ef <target_temperature_isr>
   22ca0:	90 91 f0 05 	lds	r25, 0x05F0	; 0x8005f0 <target_temperature_isr+0x1>
   22ca4:	68 17       	cp	r22, r24
   22ca6:	79 07       	cpc	r23, r25
   22ca8:	0c f0       	brlt	.+2      	; 0x22cac <__vector_32+0x122>
   22caa:	dc c0       	rjmp	.+440    	; 0x22e64 <__vector_32+0x2da>
            // ~ nozzle heating is on
            bCheckingOnHeater=bCheckingOnHeater||(current_temperature_isr[active_extruder]>(minttemp[active_extruder]+TEMP_HYSTERESIS)); // for eventually delay cutting
   22cac:	10 91 e7 05 	lds	r17, 0x05E7	; 0x8005e7 <check_min_temp_raw()::bCheckingOnHeater>
   22cb0:	11 11       	cpse	r17, r1
   22cb2:	12 c0       	rjmp	.+36     	; 0x22cd8 <__vector_32+0x14e>
   22cb4:	6b 5f       	subi	r22, 0xFB	; 251
   22cb6:	7f 4f       	sbci	r23, 0xFF	; 255
   22cb8:	07 2e       	mov	r0, r23
   22cba:	00 0c       	add	r0, r0
   22cbc:	88 0b       	sbc	r24, r24
   22cbe:	99 0b       	sbc	r25, r25
   22cc0:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   22cc4:	9b 01       	movw	r18, r22
   22cc6:	ac 01       	movw	r20, r24
   22cc8:	11 e0       	ldi	r17, 0x01	; 1
   22cca:	c5 01       	movw	r24, r10
   22ccc:	b4 01       	movw	r22, r8
   22cce:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   22cd2:	18 16       	cp	r1, r24
   22cd4:	0c f0       	brlt	.+2      	; 0x22cd8 <__vector_32+0x14e>
   22cd6:	10 e0       	ldi	r17, 0x00	; 0
   22cd8:	10 93 e7 05 	sts	0x05E7, r17	; 0x8005e7 <check_min_temp_raw()::bCheckingOnHeater>
            if(oTimer4minTempHeater.expired_cont(HEATER_MINTEMP_DELAY) || bCheckingOnHeater) {
   22cdc:	68 e9       	ldi	r22, 0x98	; 152
   22cde:	7a e3       	ldi	r23, 0x3A	; 58
   22ce0:	84 ee       	ldi	r24, 0xE4	; 228
   22ce2:	95 e0       	ldi	r25, 0x05	; 5
   22ce4:	0f 94 47 0e 	call	0x21c8e	; 0x21c8e <Timer<unsigned short>::expired_cont(unsigned short)>
   22ce8:	81 11       	cpse	r24, r1
   22cea:	02 c0       	rjmp	.+4      	; 0x22cf0 <__vector_32+0x166>
   22cec:	11 23       	and	r17, r17
   22cee:	79 f0       	breq	.+30     	; 0x22d0e <__vector_32+0x184>
                bCheckingOnHeater=true;   // not necessary
   22cf0:	81 e0       	ldi	r24, 0x01	; 1
   22cf2:	80 93 e7 05 	sts	0x05E7, r24	; 0x8005e7 <check_min_temp_raw()::bCheckingOnHeater>
static alert_automaton_mintemp alert_automaton_hotend(m2hotend), alert_automaton_bed(m2bed);

void check_min_temp_heater0()
{
#if HEATER_0_RAW_LO_TEMP > HEATER_0_RAW_HI_TEMP
	if (current_temperature_raw[0] >= minttemp_raw[0]) {
   22cf6:	80 91 52 02 	lds	r24, 0x0252	; 0x800252 <_ZL12minttemp_raw.lto_priv.429>
   22cfa:	90 91 53 02 	lds	r25, 0x0253	; 0x800253 <_ZL12minttemp_raw.lto_priv.429+0x1>
   22cfe:	c8 17       	cp	r28, r24
   22d00:	d9 07       	cpc	r29, r25
   22d02:	2c f0       	brlt	.+10     	; 0x22d0e <__vector_32+0x184>
#else
	if (current_temperature_raw[0] <= minttemp_raw[0]) {
#endif
        set_temp_error(TempErrorSource::hotend, 0, TempErrorType::min);
   22d04:	41 e0       	ldi	r20, 0x01	; 1
   22d06:	60 e0       	ldi	r22, 0x00	; 0
   22d08:	80 e0       	ldi	r24, 0x00	; 0
   22d0a:	0f 94 20 11 	call	0x22240	; 0x22240 <set_temp_error(TempErrorSource, unsigned char, TempErrorType)>
            // ~ nozzle heating is off
            oTimer4minTempHeater.start();
            bCheckingOnHeater=false;
        }
        // * bed checking
        if(target_temperature_bed_isr>BED_MINTEMP) {
   22d0e:	80 91 e8 05 	lds	r24, 0x05E8	; 0x8005e8 <target_temperature_bed_isr>
   22d12:	90 91 e9 05 	lds	r25, 0x05E9	; 0x8005e9 <target_temperature_bed_isr+0x1>
   22d16:	4f 97       	sbiw	r24, 0x1f	; 31
   22d18:	0c f4       	brge	.+2      	; 0x22d1c <__vector_32+0x192>
   22d1a:	ab c0       	rjmp	.+342    	; 0x22e72 <__vector_32+0x2e8>
            // ~ bed heating is on
            bCheckingOnBed=bCheckingOnBed||(current_temperature_bed_isr>(BED_MINTEMP+TEMP_HYSTERESIS)); // for eventually delay cutting
   22d1c:	c0 91 e3 05 	lds	r28, 0x05E3	; 0x8005e3 <check_min_temp_raw()::bCheckingOnBed>
   22d20:	c1 11       	cpse	r28, r1
   22d22:	0c c0       	rjmp	.+24     	; 0x22d3c <__vector_32+0x1b2>
   22d24:	c1 e0       	ldi	r28, 0x01	; 1
   22d26:	20 e0       	ldi	r18, 0x00	; 0
   22d28:	30 e0       	ldi	r19, 0x00	; 0
   22d2a:	4c e0       	ldi	r20, 0x0C	; 12
   22d2c:	52 e4       	ldi	r21, 0x42	; 66
   22d2e:	c7 01       	movw	r24, r14
   22d30:	b6 01       	movw	r22, r12
   22d32:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   22d36:	18 16       	cp	r1, r24
   22d38:	0c f0       	brlt	.+2      	; 0x22d3c <__vector_32+0x1b2>
   22d3a:	c0 e0       	ldi	r28, 0x00	; 0
   22d3c:	c0 93 e3 05 	sts	0x05E3, r28	; 0x8005e3 <check_min_temp_raw()::bCheckingOnBed>
            if(oTimer4minTempBed.expired_cont(BED_MINTEMP_DELAY) || bCheckingOnBed) {
   22d40:	60 e5       	ldi	r22, 0x50	; 80
   22d42:	73 ec       	ldi	r23, 0xC3	; 195
   22d44:	80 ee       	ldi	r24, 0xE0	; 224
   22d46:	95 e0       	ldi	r25, 0x05	; 5
   22d48:	0f 94 47 0e 	call	0x21c8e	; 0x21c8e <Timer<unsigned short>::expired_cont(unsigned short)>
   22d4c:	81 11       	cpse	r24, r1
   22d4e:	02 c0       	rjmp	.+4      	; 0x22d54 <__vector_32+0x1ca>
   22d50:	cc 23       	and	r28, r28
   22d52:	99 f0       	breq	.+38     	; 0x22d7a <__vector_32+0x1f0>
                bCheckingOnBed=true;  // not necessary
   22d54:	81 e0       	ldi	r24, 0x01	; 1
   22d56:	80 93 e3 05 	sts	0x05E3, r24	; 0x8005e3 <check_min_temp_raw()::bCheckingOnBed>
}

void check_min_temp_bed()
{
#if HEATER_BED_RAW_LO_TEMP > HEATER_BED_RAW_HI_TEMP
	if (current_temperature_bed_raw >= bed_minttemp_raw) {
   22d5a:	20 91 de 05 	lds	r18, 0x05DE	; 0x8005de <current_temperature_bed_raw>
   22d5e:	30 91 df 05 	lds	r19, 0x05DF	; 0x8005df <current_temperature_bed_raw+0x1>
   22d62:	80 91 50 02 	lds	r24, 0x0250	; 0x800250 <_ZL16bed_minttemp_raw.lto_priv.428>
   22d66:	90 91 51 02 	lds	r25, 0x0251	; 0x800251 <_ZL16bed_minttemp_raw.lto_priv.428+0x1>
   22d6a:	28 17       	cp	r18, r24
   22d6c:	39 07       	cpc	r19, r25
   22d6e:	2c f0       	brlt	.+10     	; 0x22d7a <__vector_32+0x1f0>
#else
	if (current_temperature_bed_raw <= bed_minttemp_raw) {
#endif
        set_temp_error(TempErrorSource::bed, 0, TempErrorType::min);
   22d70:	41 e0       	ldi	r20, 0x01	; 1
   22d72:	60 e0       	ldi	r22, 0x00	; 0
   22d74:	81 e0       	ldi	r24, 0x01	; 1
   22d76:	0f 94 20 11 	call	0x22240	; 0x22240 <set_temp_error(TempErrorSource, unsigned char, TempErrorType)>

static void check_temp_runaway()
{
#ifdef TEMP_RUNAWAY_EXTRUDER_HYSTERESIS
    for(uint8_t e = 0; e < EXTRUDERS; e++)
        temp_runaway_check(e+1, target_temperature_isr[e], current_temperature_isr[e], soft_pwm[e], false);
   22d7a:	60 91 f5 05 	lds	r22, 0x05F5	; 0x8005f5 <_ZL8soft_pwm.lto_priv.504>
   22d7e:	70 e0       	ldi	r23, 0x00	; 0
   22d80:	90 e0       	ldi	r25, 0x00	; 0
   22d82:	80 e0       	ldi	r24, 0x00	; 0
   22d84:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   22d88:	6b 01       	movw	r12, r22
   22d8a:	7c 01       	movw	r14, r24
   22d8c:	40 90 f1 05 	lds	r4, 0x05F1	; 0x8005f1 <current_temperature_isr>
   22d90:	50 90 f2 05 	lds	r5, 0x05F2	; 0x8005f2 <current_temperature_isr+0x1>
   22d94:	60 90 f3 05 	lds	r6, 0x05F3	; 0x8005f3 <current_temperature_isr+0x2>
   22d98:	70 90 f4 05 	lds	r7, 0x05F4	; 0x8005f4 <current_temperature_isr+0x3>
   22d9c:	60 91 ef 05 	lds	r22, 0x05EF	; 0x8005ef <target_temperature_isr>
   22da0:	70 91 f0 05 	lds	r23, 0x05F0	; 0x8005f0 <target_temperature_isr+0x1>
   22da4:	07 2e       	mov	r0, r23
   22da6:	00 0c       	add	r0, r0
   22da8:	88 0b       	sbc	r24, r24
   22daa:	99 0b       	sbc	r25, r25
   22dac:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   22db0:	ab 01       	movw	r20, r22
   22db2:	bc 01       	movw	r22, r24
   22db4:	a1 2c       	mov	r10, r1
   22db6:	93 01       	movw	r18, r6
   22db8:	82 01       	movw	r16, r4
   22dba:	81 e0       	ldi	r24, 0x01	; 1
   22dbc:	0f 94 84 11 	call	0x22308	; 0x22308 <temp_runaway_check(unsigned char, float, float, float, bool)>
#endif
#ifdef TEMP_RUNAWAY_BED_HYSTERESIS
    temp_runaway_check(0, target_temperature_bed_isr, current_temperature_bed_isr, soft_pwm_bed, true);
   22dc0:	60 91 ee 05 	lds	r22, 0x05EE	; 0x8005ee <soft_pwm_bed>
   22dc4:	70 e0       	ldi	r23, 0x00	; 0
   22dc6:	90 e0       	ldi	r25, 0x00	; 0
   22dc8:	80 e0       	ldi	r24, 0x00	; 0
   22dca:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   22dce:	6b 01       	movw	r12, r22
   22dd0:	7c 01       	movw	r14, r24
   22dd2:	40 90 ea 05 	lds	r4, 0x05EA	; 0x8005ea <current_temperature_bed_isr>
   22dd6:	50 90 eb 05 	lds	r5, 0x05EB	; 0x8005eb <current_temperature_bed_isr+0x1>
   22dda:	60 90 ec 05 	lds	r6, 0x05EC	; 0x8005ec <current_temperature_bed_isr+0x2>
   22dde:	70 90 ed 05 	lds	r7, 0x05ED	; 0x8005ed <current_temperature_bed_isr+0x3>
   22de2:	60 91 e8 05 	lds	r22, 0x05E8	; 0x8005e8 <target_temperature_bed_isr>
   22de6:	70 91 e9 05 	lds	r23, 0x05E9	; 0x8005e9 <target_temperature_bed_isr+0x1>
   22dea:	07 2e       	mov	r0, r23
   22dec:	00 0c       	add	r0, r0
   22dee:	88 0b       	sbc	r24, r24
   22df0:	99 0b       	sbc	r25, r25
   22df2:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   22df6:	ab 01       	movw	r20, r22
   22df8:	bc 01       	movw	r22, r24
   22dfa:	aa 24       	eor	r10, r10
   22dfc:	a3 94       	inc	r10
   22dfe:	93 01       	movw	r18, r6
   22e00:	82 01       	movw	r16, r4
   22e02:	80 e0       	ldi	r24, 0x00	; 0
   22e04:	0f 94 84 11 	call	0x22308	; 0x22308 <temp_runaway_check(unsigned char, float, float, float, bool)>
    thermal_model::log_isr();
#endif
#endif

    // PID regulation
    if (pid_tuning_finished)
   22e08:	80 91 41 02 	lds	r24, 0x0241	; 0x800241 <_ZL19pid_tuning_finished.lto_priv.426>
   22e0c:	81 11       	cpse	r24, r1
        temp_mgr_pid();
   22e0e:	0e 94 82 ff 	call	0x1ff04	; 0x1ff04 <temp_mgr_pid()>
    (void)__s;
}

static __inline__ void __iCliParam(const uint8_t *__s)
{
    cli();
   22e12:	f8 94       	cli
    // run temperature management with interrupts enabled to reduce latency
    DISABLE_TEMP_MGR_INTERRUPT();
    NONATOMIC_BLOCK(NONATOMIC_FORCEOFF) {
        temp_mgr_isr();
    }
    ENABLE_TEMP_MGR_INTERRUPT();
   22e14:	80 91 71 00 	lds	r24, 0x0071	; 0x800071 <__TEXT_REGION_LENGTH__+0x7c2071>
   22e18:	82 60       	ori	r24, 0x02	; 2
   22e1a:	80 93 71 00 	sts	0x0071, r24	; 0x800071 <__TEXT_REGION_LENGTH__+0x7c2071>
}
   22e1e:	ff 91       	pop	r31
   22e20:	ef 91       	pop	r30
   22e22:	df 91       	pop	r29
   22e24:	cf 91       	pop	r28
   22e26:	bf 91       	pop	r27
   22e28:	af 91       	pop	r26
   22e2a:	9f 91       	pop	r25
   22e2c:	8f 91       	pop	r24
   22e2e:	7f 91       	pop	r23
   22e30:	6f 91       	pop	r22
   22e32:	5f 91       	pop	r21
   22e34:	4f 91       	pop	r20
   22e36:	3f 91       	pop	r19
   22e38:	2f 91       	pop	r18
   22e3a:	1f 91       	pop	r17
   22e3c:	0f 91       	pop	r16
   22e3e:	ff 90       	pop	r15
   22e40:	ef 90       	pop	r14
   22e42:	df 90       	pop	r13
   22e44:	cf 90       	pop	r12
   22e46:	bf 90       	pop	r11
   22e48:	af 90       	pop	r10
   22e4a:	9f 90       	pop	r9
   22e4c:	8f 90       	pop	r8
   22e4e:	7f 90       	pop	r7
   22e50:	6f 90       	pop	r6
   22e52:	5f 90       	pop	r5
   22e54:	4f 90       	pop	r4
   22e56:	0f 90       	pop	r0
   22e58:	0b be       	out	0x3b, r0	; 59
   22e5a:	0f 90       	pop	r0
   22e5c:	0f be       	out	0x3f, r0	; 63
   22e5e:	0f 90       	pop	r0
   22e60:	1f 90       	pop	r1
   22e62:	18 95       	reti
                check_min_temp_heater0(); // delay is elapsed or temperature is/was over minTemp => periodical checking is active
            }
        }
        else {
            // ~ nozzle heating is off
            oTimer4minTempHeater.start();
   22e64:	84 ee       	ldi	r24, 0xE4	; 228
   22e66:	95 e0       	ldi	r25, 0x05	; 5
   22e68:	0f 94 4e 0e 	call	0x21c9c	; 0x21c9c <Timer<unsigned short>::start()>
            bCheckingOnHeater=false;
   22e6c:	10 92 e7 05 	sts	0x05E7, r1	; 0x8005e7 <check_min_temp_raw()::bCheckingOnHeater>
   22e70:	4e cf       	rjmp	.-356    	; 0x22d0e <__vector_32+0x184>
                check_min_temp_bed(); // delay is elapsed or temperature is/was over minTemp => periodical checking is active
            }
        }
        else {
            // ~ bed heating is off
            oTimer4minTempBed.start();
   22e72:	80 ee       	ldi	r24, 0xE0	; 224
   22e74:	95 e0       	ldi	r25, 0x05	; 5
   22e76:	0f 94 4e 0e 	call	0x21c9c	; 0x21c9c <Timer<unsigned short>::start()>
            bCheckingOnBed=false;
   22e7a:	10 92 e3 05 	sts	0x05E3, r1	; 0x8005e3 <check_min_temp_raw()::bCheckingOnBed>
   22e7e:	7d cf       	rjmp	.-262    	; 0x22d7a <__vector_32+0x1f0>

00022e80 <updatePID()>:
void updatePID()
{
  // TODO: iState_sum_max and PID values should be synchronized for temp_mgr_isr
#ifdef PIDTEMP
  for(uint_least8_t e = 0; e < EXTRUDERS; e++) {
     iState_sum_max[e] = PID_INTEGRAL_DRIVE_MAX / cs.Ki;
   22e80:	20 91 d3 0d 	lds	r18, 0x0DD3	; 0x800dd3 <cs+0x6c>
   22e84:	30 91 d4 0d 	lds	r19, 0x0DD4	; 0x800dd4 <cs+0x6d>
   22e88:	40 91 d5 0d 	lds	r20, 0x0DD5	; 0x800dd5 <cs+0x6e>
   22e8c:	50 91 d6 0d 	lds	r21, 0x0DD6	; 0x800dd6 <cs+0x6f>
   22e90:	60 e0       	ldi	r22, 0x00	; 0
   22e92:	70 e0       	ldi	r23, 0x00	; 0
   22e94:	8f e7       	ldi	r24, 0x7F	; 127
   22e96:	93 e4       	ldi	r25, 0x43	; 67
   22e98:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   22e9c:	60 93 18 04 	sts	0x0418, r22	; 0x800418 <_ZL14iState_sum_max.lto_priv.435>
   22ea0:	70 93 19 04 	sts	0x0419, r23	; 0x800419 <_ZL14iState_sum_max.lto_priv.435+0x1>
   22ea4:	80 93 1a 04 	sts	0x041A, r24	; 0x80041a <_ZL14iState_sum_max.lto_priv.435+0x2>
   22ea8:	90 93 1b 04 	sts	0x041B, r25	; 0x80041b <_ZL14iState_sum_max.lto_priv.435+0x3>
  }
#endif
#ifdef PIDTEMPBED
  temp_iState_max_bed = PID_INTEGRAL_DRIVE_MAX / cs.bedKi;
   22eac:	20 91 df 0d 	lds	r18, 0x0DDF	; 0x800ddf <cs+0x78>
   22eb0:	30 91 e0 0d 	lds	r19, 0x0DE0	; 0x800de0 <cs+0x79>
   22eb4:	40 91 e1 0d 	lds	r20, 0x0DE1	; 0x800de1 <cs+0x7a>
   22eb8:	50 91 e2 0d 	lds	r21, 0x0DE2	; 0x800de2 <cs+0x7b>
   22ebc:	60 e0       	ldi	r22, 0x00	; 0
   22ebe:	70 e0       	ldi	r23, 0x00	; 0
   22ec0:	8f e7       	ldi	r24, 0x7F	; 127
   22ec2:	93 e4       	ldi	r25, 0x43	; 67
   22ec4:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   22ec8:	60 93 10 04 	sts	0x0410, r22	; 0x800410 <_ZL19temp_iState_max_bed.lto_priv.433>
   22ecc:	70 93 11 04 	sts	0x0411, r23	; 0x800411 <_ZL19temp_iState_max_bed.lto_priv.433+0x1>
   22ed0:	80 93 12 04 	sts	0x0412, r24	; 0x800412 <_ZL19temp_iState_max_bed.lto_priv.433+0x2>
   22ed4:	90 93 13 04 	sts	0x0413, r25	; 0x800413 <_ZL19temp_iState_max_bed.lto_priv.433+0x3>
#endif
}
   22ed8:	08 95       	ret

00022eda <Stopwatch::duration()>:
  startTimestamp = 0;
  stopTimestamp = 0;
  accumulator = 0;
}

uint32_t Stopwatch::duration() {
   22eda:	0f 93       	push	r16
   22edc:	1f 93       	push	r17
  return accumulator + MS_TO_SEC((isRunning() ? _millis() : stopTimestamp) - startTimestamp);
   22ede:	80 91 8b 03 	lds	r24, 0x038B	; 0x80038b <Stopwatch::state>
   22ee2:	81 30       	cpi	r24, 0x01	; 1
   22ee4:	19 f5       	brne	.+70     	; 0x22f2c <Stopwatch::duration()+0x52>
   22ee6:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   22eea:	00 91 7c 05 	lds	r16, 0x057C	; 0x80057c <Stopwatch::startTimestamp>
   22eee:	10 91 7d 05 	lds	r17, 0x057D	; 0x80057d <Stopwatch::startTimestamp+0x1>
   22ef2:	20 91 7e 05 	lds	r18, 0x057E	; 0x80057e <Stopwatch::startTimestamp+0x2>
   22ef6:	30 91 7f 05 	lds	r19, 0x057F	; 0x80057f <Stopwatch::startTimestamp+0x3>
   22efa:	60 1b       	sub	r22, r16
   22efc:	71 0b       	sbc	r23, r17
   22efe:	82 0b       	sbc	r24, r18
   22f00:	93 0b       	sbc	r25, r19
   22f02:	28 ee       	ldi	r18, 0xE8	; 232
   22f04:	33 e0       	ldi	r19, 0x03	; 3
   22f06:	40 e0       	ldi	r20, 0x00	; 0
   22f08:	50 e0       	ldi	r21, 0x00	; 0
   22f0a:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
   22f0e:	60 91 78 05 	lds	r22, 0x0578	; 0x800578 <Stopwatch::accumulator>
   22f12:	70 91 79 05 	lds	r23, 0x0579	; 0x800579 <Stopwatch::accumulator+0x1>
   22f16:	80 91 7a 05 	lds	r24, 0x057A	; 0x80057a <Stopwatch::accumulator+0x2>
   22f1a:	90 91 7b 05 	lds	r25, 0x057B	; 0x80057b <Stopwatch::accumulator+0x3>
   22f1e:	62 0f       	add	r22, r18
   22f20:	73 1f       	adc	r23, r19
   22f22:	84 1f       	adc	r24, r20
   22f24:	95 1f       	adc	r25, r21
}
   22f26:	1f 91       	pop	r17
   22f28:	0f 91       	pop	r16
   22f2a:	08 95       	ret
  stopTimestamp = 0;
  accumulator = 0;
}

uint32_t Stopwatch::duration() {
  return accumulator + MS_TO_SEC((isRunning() ? _millis() : stopTimestamp) - startTimestamp);
   22f2c:	60 91 0b 06 	lds	r22, 0x060B	; 0x80060b <Stopwatch::stopTimestamp>
   22f30:	70 91 0c 06 	lds	r23, 0x060C	; 0x80060c <Stopwatch::stopTimestamp+0x1>
   22f34:	80 91 0d 06 	lds	r24, 0x060D	; 0x80060d <Stopwatch::stopTimestamp+0x2>
   22f38:	90 91 0e 06 	lds	r25, 0x060E	; 0x80060e <Stopwatch::stopTimestamp+0x3>
   22f3c:	d6 cf       	rjmp	.-84     	; 0x22eea <Stopwatch::duration()+0x10>

00022f3e <lcd_menu_statistics()>:
//! |Total print time:   | MSG_TOTAL_PRINT_TIME c=19
//! |        00d 00h 00m |
//! ----------------------
//! @endcode
void lcd_menu_statistics()
{
   22f3e:	4f 92       	push	r4
   22f40:	5f 92       	push	r5
   22f42:	6f 92       	push	r6
   22f44:	7f 92       	push	r7
   22f46:	8f 92       	push	r8
   22f48:	9f 92       	push	r9
   22f4a:	af 92       	push	r10
   22f4c:	bf 92       	push	r11
   22f4e:	cf 92       	push	r12
   22f50:	df 92       	push	r13
   22f52:	ef 92       	push	r14
   22f54:	ff 92       	push	r15
   22f56:	0f 93       	push	r16
   22f58:	1f 93       	push	r17
   22f5a:	cf 93       	push	r28
   22f5c:	df 93       	push	r29
   22f5e:	10 92 e3 03 	sts	0x03E3, r1	; 0x8003e3 <lcd_timeoutToStatus>
    lcd_timeoutToStatus.stop(); //infinite timeout
	if (printJobOngoing())
   22f62:	0e 94 40 66 	call	0xcc80	; 0xcc80 <printJobOngoing()>
   22f66:	88 23       	and	r24, r24
   22f68:	09 f4       	brne	.+2      	; 0x22f6c <lcd_menu_statistics()+0x2e>
   22f6a:	6e c0       	rjmp	.+220    	; 0x23048 <lcd_menu_statistics()+0x10a>
	{
		const float _met = ((float)total_filament_used) / (100000.f);
   22f6c:	60 91 17 06 	lds	r22, 0x0617	; 0x800617 <total_filament_used>
   22f70:	70 91 18 06 	lds	r23, 0x0618	; 0x800618 <total_filament_used+0x1>
   22f74:	80 91 19 06 	lds	r24, 0x0619	; 0x800619 <total_filament_used+0x2>
   22f78:	90 91 1a 06 	lds	r25, 0x061A	; 0x80061a <total_filament_used+0x3>
   22f7c:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   22f80:	20 e0       	ldi	r18, 0x00	; 0
   22f82:	30 e5       	ldi	r19, 0x50	; 80
   22f84:	43 ec       	ldi	r20, 0xC3	; 195
   22f86:	57 e4       	ldi	r21, 0x47	; 71
   22f88:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   22f8c:	56 2e       	mov	r5, r22
   22f8e:	47 2e       	mov	r4, r23
   22f90:	ec 01       	movw	r28, r24

		const uint32_t _t = print_job_timer.duration();
   22f92:	0f 94 6d 17 	call	0x22eda	; 0x22eda <Stopwatch::duration()>
   22f96:	6b 01       	movw	r12, r22
   22f98:	7c 01       	movw	r14, r24
		const uint32_t _h = (_t / 60) / 60;
		const uint8_t _m = (_t / 60) % 60;
		const uint8_t _s = _t % 60;

        lcd_home();
   22f9a:	0e 94 1f 70 	call	0xe03e	; 0xe03e <lcd_home()>
		lcd_printf_P(_N(
   22f9e:	8f ec       	ldi	r24, 0xCF	; 207
   22fa0:	98 e5       	ldi	r25, 0x58	; 88
   22fa2:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   22fa6:	18 2f       	mov	r17, r24
   22fa8:	09 2f       	mov	r16, r25
   22faa:	8f eb       	ldi	r24, 0xBF	; 191
   22fac:	98 e5       	ldi	r25, 0x58	; 88
   22fae:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   22fb2:	78 2e       	mov	r7, r24
   22fb4:	69 2e       	mov	r6, r25
		const float _met = ((float)total_filament_used) / (100000.f);

		const uint32_t _t = print_job_timer.duration();
		const uint32_t _h = (_t / 60) / 60;
		const uint8_t _m = (_t / 60) % 60;
		const uint8_t _s = _t % 60;
   22fb6:	8c e3       	ldi	r24, 0x3C	; 60
   22fb8:	88 2e       	mov	r8, r24
   22fba:	91 2c       	mov	r9, r1
   22fbc:	a1 2c       	mov	r10, r1
   22fbe:	b1 2c       	mov	r11, r1
   22fc0:	c7 01       	movw	r24, r14
   22fc2:	b6 01       	movw	r22, r12
   22fc4:	a5 01       	movw	r20, r10
   22fc6:	94 01       	movw	r18, r8
   22fc8:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>

        lcd_home();
		lcd_printf_P(_N(
   22fcc:	7f 93       	push	r23
   22fce:	6f 93       	push	r22
	{
		const float _met = ((float)total_filament_used) / (100000.f);

		const uint32_t _t = print_job_timer.duration();
		const uint32_t _h = (_t / 60) / 60;
		const uint8_t _m = (_t / 60) % 60;
   22fd0:	ca 01       	movw	r24, r20
   22fd2:	b9 01       	movw	r22, r18
   22fd4:	a5 01       	movw	r20, r10
   22fd6:	94 01       	movw	r18, r8
   22fd8:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
		const uint8_t _s = _t % 60;

        lcd_home();
		lcd_printf_P(_N(
   22fdc:	7f 93       	push	r23
   22fde:	6f 93       	push	r22
	if (printJobOngoing())
	{
		const float _met = ((float)total_filament_used) / (100000.f);

		const uint32_t _t = print_job_timer.duration();
		const uint32_t _h = (_t / 60) / 60;
   22fe0:	c7 01       	movw	r24, r14
   22fe2:	b6 01       	movw	r22, r12
   22fe4:	20 e1       	ldi	r18, 0x10	; 16
   22fe6:	3e e0       	ldi	r19, 0x0E	; 14
   22fe8:	40 e0       	ldi	r20, 0x00	; 0
   22fea:	50 e0       	ldi	r21, 0x00	; 0
   22fec:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
		const uint8_t _m = (_t / 60) % 60;
		const uint8_t _s = _t % 60;

        lcd_home();
		lcd_printf_P(_N(
   22ff0:	5f 93       	push	r21
   22ff2:	4f 93       	push	r20
   22ff4:	3f 93       	push	r19
   22ff6:	2f 93       	push	r18
   22ff8:	0f 93       	push	r16
   22ffa:	1f 93       	push	r17
   22ffc:	df 93       	push	r29
   22ffe:	cf 93       	push	r28
   23000:	4f 92       	push	r4
   23002:	5f 92       	push	r5
   23004:	6f 92       	push	r6
   23006:	7f 92       	push	r7
   23008:	81 e4       	ldi	r24, 0x41	; 65
   2300a:	9b e6       	ldi	r25, 0x6B	; 107
   2300c:	9f 93       	push	r25
   2300e:	8f 93       	push	r24
   23010:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
			"%S:\n"
			"%10ldh %02dm %02ds"
		    ),
            _T(MSG_FILAMENT_USED), _met,
            _T(MSG_PRINT_TIME), _h, _m, _s);
		menu_back_if_clicked();
   23014:	8d b7       	in	r24, 0x3d	; 61
   23016:	9e b7       	in	r25, 0x3e	; 62
   23018:	42 96       	adiw	r24, 0x12	; 18
   2301a:	0f b6       	in	r0, 0x3f	; 63
   2301c:	f8 94       	cli
   2301e:	9e bf       	out	0x3e, r25	; 62
   23020:	0f be       	out	0x3f, r0	; 63
   23022:	8d bf       	out	0x3d, r24	; 61
            ),
            _T(MSG_TOTAL_FILAMENT), _filament_m,
            _T(MSG_TOTAL_PRINT_TIME), _days, _hours, _minutes);
        menu_back_if_clicked();
	}
}
   23024:	df 91       	pop	r29
   23026:	cf 91       	pop	r28
   23028:	1f 91       	pop	r17
   2302a:	0f 91       	pop	r16
   2302c:	ff 90       	pop	r15
   2302e:	ef 90       	pop	r14
   23030:	df 90       	pop	r13
   23032:	cf 90       	pop	r12
   23034:	bf 90       	pop	r11
   23036:	af 90       	pop	r10
   23038:	9f 90       	pop	r9
   2303a:	8f 90       	pop	r8
   2303c:	7f 90       	pop	r7
   2303e:	6f 90       	pop	r6
   23040:	5f 90       	pop	r5
   23042:	4f 90       	pop	r4
			"%S:\n"
			"%10ldd %02dh %02dm"
            ),
            _T(MSG_TOTAL_FILAMENT), _filament_m,
            _T(MSG_TOTAL_PRINT_TIME), _days, _hours, _minutes);
        menu_back_if_clicked();
   23044:	0c 94 06 74 	jmp	0xe80c	; 0xe80c <menu_back_if_clicked()>
            _T(MSG_PRINT_TIME), _h, _m, _s);
		menu_back_if_clicked();
	}
	else
	{
		uint32_t _filament = eeprom_read_dword((uint32_t *)EEPROM_FILAMENTUSED); // in centimeters
   23048:	81 ef       	ldi	r24, 0xF1	; 241
   2304a:	9f e0       	ldi	r25, 0x0F	; 15
   2304c:	0f 94 e8 a3 	call	0x347d0	; 0x347d0 <eeprom_read_dword>
   23050:	2b 01       	movw	r4, r22
   23052:	3c 01       	movw	r6, r24
		uint32_t _time = eeprom_read_dword((uint32_t *)EEPROM_TOTALTIME); // in minutes
   23054:	8d ee       	ldi	r24, 0xED	; 237
   23056:	9f e0       	ldi	r25, 0x0F	; 15
   23058:	0f 94 e8 a3 	call	0x347d0	; 0x347d0 <eeprom_read_dword>
   2305c:	6b 01       	movw	r12, r22
   2305e:	7c 01       	movw	r14, r24
		float _filament_m = (float)_filament/100;
		_days  = (_time / 60) / 24;
		_hours = (_time / 60) % 24;
		_minutes = _time % 60;

		lcd_home();
   23060:	0e 94 1f 70 	call	0xe03e	; 0xe03e <lcd_home()>
		lcd_printf_P(_N(
   23064:	8c ea       	ldi	r24, 0xAC	; 172
   23066:	98 e5       	ldi	r25, 0x58	; 88
   23068:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   2306c:	98 2e       	mov	r9, r24
   2306e:	89 2e       	mov	r8, r25
   23070:	8b e9       	ldi	r24, 0x9B	; 155
   23072:	98 e5       	ldi	r25, 0x58	; 88
   23074:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   23078:	b8 2e       	mov	r11, r24
   2307a:	a9 2e       	mov	r10, r25
		uint8_t _hours, _minutes;
		uint32_t _days;
		float _filament_m = (float)_filament/100;
		_days  = (_time / 60) / 24;
		_hours = (_time / 60) % 24;
		_minutes = _time % 60;
   2307c:	c7 01       	movw	r24, r14
   2307e:	b6 01       	movw	r22, r12
   23080:	2c e3       	ldi	r18, 0x3C	; 60
   23082:	30 e0       	ldi	r19, 0x00	; 0
   23084:	40 e0       	ldi	r20, 0x00	; 0
   23086:	50 e0       	ldi	r21, 0x00	; 0
   23088:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>

		lcd_home();
		lcd_printf_P(_N(
   2308c:	7f 93       	push	r23
   2308e:	6f 93       	push	r22
		uint32_t _time = eeprom_read_dword((uint32_t *)EEPROM_TOTALTIME); // in minutes
		uint8_t _hours, _minutes;
		uint32_t _days;
		float _filament_m = (float)_filament/100;
		_days  = (_time / 60) / 24;
		_hours = (_time / 60) % 24;
   23090:	ca 01       	movw	r24, r20
   23092:	b9 01       	movw	r22, r18
   23094:	28 e1       	ldi	r18, 0x18	; 24
   23096:	30 e0       	ldi	r19, 0x00	; 0
   23098:	40 e0       	ldi	r20, 0x00	; 0
   2309a:	50 e0       	ldi	r21, 0x00	; 0
   2309c:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
		_minutes = _time % 60;

		lcd_home();
		lcd_printf_P(_N(
   230a0:	7f 93       	push	r23
   230a2:	6f 93       	push	r22
		uint32_t _filament = eeprom_read_dword((uint32_t *)EEPROM_FILAMENTUSED); // in centimeters
		uint32_t _time = eeprom_read_dword((uint32_t *)EEPROM_TOTALTIME); // in minutes
		uint8_t _hours, _minutes;
		uint32_t _days;
		float _filament_m = (float)_filament/100;
		_days  = (_time / 60) / 24;
   230a4:	c7 01       	movw	r24, r14
   230a6:	b6 01       	movw	r22, r12
   230a8:	20 ea       	ldi	r18, 0xA0	; 160
   230aa:	35 e0       	ldi	r19, 0x05	; 5
   230ac:	40 e0       	ldi	r20, 0x00	; 0
   230ae:	50 e0       	ldi	r21, 0x00	; 0
   230b0:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
		_hours = (_time / 60) % 24;
		_minutes = _time % 60;

		lcd_home();
		lcd_printf_P(_N(
   230b4:	5f 93       	push	r21
   230b6:	4f 93       	push	r20
   230b8:	3f 93       	push	r19
   230ba:	2f 93       	push	r18
   230bc:	8f 92       	push	r8
   230be:	9f 92       	push	r9
	{
		uint32_t _filament = eeprom_read_dword((uint32_t *)EEPROM_FILAMENTUSED); // in centimeters
		uint32_t _time = eeprom_read_dword((uint32_t *)EEPROM_TOTALTIME); // in minutes
		uint8_t _hours, _minutes;
		uint32_t _days;
		float _filament_m = (float)_filament/100;
   230c0:	c3 01       	movw	r24, r6
   230c2:	b2 01       	movw	r22, r4
   230c4:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   230c8:	20 e0       	ldi	r18, 0x00	; 0
   230ca:	30 e0       	ldi	r19, 0x00	; 0
   230cc:	48 ec       	ldi	r20, 0xC8	; 200
   230ce:	52 e4       	ldi	r21, 0x42	; 66
   230d0:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
		_days  = (_time / 60) / 24;
		_hours = (_time / 60) % 24;
		_minutes = _time % 60;

		lcd_home();
		lcd_printf_P(_N(
   230d4:	9f 93       	push	r25
   230d6:	8f 93       	push	r24
   230d8:	7f 93       	push	r23
   230da:	6f 93       	push	r22
   230dc:	af 92       	push	r10
   230de:	bf 92       	push	r11
   230e0:	8d e1       	ldi	r24, 0x1D	; 29
   230e2:	9b e6       	ldi	r25, 0x6B	; 107
   230e4:	9f 93       	push	r25
   230e6:	8f 93       	push	r24
   230e8:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
			"%S:\n"
			"%10ldd %02dh %02dm"
            ),
            _T(MSG_TOTAL_FILAMENT), _filament_m,
            _T(MSG_TOTAL_PRINT_TIME), _days, _hours, _minutes);
        menu_back_if_clicked();
   230ec:	8d b7       	in	r24, 0x3d	; 61
   230ee:	9e b7       	in	r25, 0x3e	; 62
   230f0:	42 96       	adiw	r24, 0x12	; 18
   230f2:	0f b6       	in	r0, 0x3f	; 63
   230f4:	f8 94       	cli
   230f6:	9e bf       	out	0x3e, r25	; 62
   230f8:	0f be       	out	0x3f, r0	; 63
   230fa:	8d bf       	out	0x3d, r24	; 61
   230fc:	93 cf       	rjmp	.-218    	; 0x23024 <lcd_menu_statistics()+0xe6>

000230fe <prusa_statistics_case0(unsigned char)>:
    SERIAL_ECHO(c);
    SERIAL_ECHO(']');
    prusa_stat_farm_number();
}

static void prusa_statistics_case0(uint8_t statnr) {
   230fe:	cf 93       	push	r28
   23100:	c8 2f       	mov	r28, r24
}

void MarlinSerial::print(long n, int base)
{
  if (base == 0) {
    write(n);
   23102:	8b e7       	ldi	r24, 0x7B	; 123
   23104:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
    SERIAL_ECHO('{');
    prusa_stat_printerstatus(statnr);
   23108:	8c 2f       	mov	r24, r28
   2310a:	0f 94 a9 08 	call	0x21152	; 0x21152 <prusa_stat_printerstatus(unsigned char)>
    prusa_stat_farm_number();
   2310e:	0f 94 50 08 	call	0x210a0	; 0x210a0 <prusa_stat_farm_number()>
    SERIAL_ECHO(current_temperature_bed);
    SERIAL_ECHO(']');
}

static void prusa_stat_printinfo() {
    SERIAL_ECHOPGM("[TFU:");
   23112:	86 e1       	ldi	r24, 0x16	; 22
   23114:	99 e8       	ldi	r25, 0x89	; 137
   23116:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
}

void MarlinSerial::print(unsigned long n, int base)
{
  if (base == 0) write(n);
  else printNumber(n, base);
   2311a:	60 91 17 06 	lds	r22, 0x0617	; 0x800617 <total_filament_used>
   2311e:	70 91 18 06 	lds	r23, 0x0618	; 0x800618 <total_filament_used+0x1>
   23122:	80 91 19 06 	lds	r24, 0x0619	; 0x800619 <total_filament_used+0x2>
   23126:	90 91 1a 06 	lds	r25, 0x061A	; 0x80061a <total_filament_used+0x3>
   2312a:	4a e0       	ldi	r20, 0x0A	; 10
   2312c:	0e 94 c5 79 	call	0xf38a	; 0xf38a <MarlinSerial::printNumber(unsigned long, unsigned char)>
    SERIAL_ECHO(total_filament_used);
    SERIAL_ECHOPGM("][PCD:");
   23130:	8f e0       	ldi	r24, 0x0F	; 15
   23132:	99 e8       	ldi	r25, 0x89	; 137
   23134:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
      int16_t c = (int16_t)file.readFilteredGcode();
      sdpos = file.curPosition();
      return c;
  };
  void setIndex(long index) {sdpos = index;file.seekSetFilteredGcode(index);};
  FORCE_INLINE uint8_t percentDone(){if(!isFileOpen()) return 0; if(filesize) return sdpos/((filesize+99)/100); else return 0;};
   23138:	80 91 6a 16 	lds	r24, 0x166A	; 0x80166a <card+0x295>
   2313c:	88 23       	and	r24, r24
   2313e:	09 f4       	brne	.+2      	; 0x23142 <prusa_statistics_case0(unsigned char)+0x44>
   23140:	5e c0       	rjmp	.+188    	; 0x231fe <prusa_statistics_case0(unsigned char)+0x100>
   23142:	80 91 e4 16 	lds	r24, 0x16E4	; 0x8016e4 <card+0x30f>
   23146:	90 91 e5 16 	lds	r25, 0x16E5	; 0x8016e5 <card+0x310>
   2314a:	a0 91 e6 16 	lds	r26, 0x16E6	; 0x8016e6 <card+0x311>
   2314e:	b0 91 e7 16 	lds	r27, 0x16E7	; 0x8016e7 <card+0x312>
   23152:	00 97       	sbiw	r24, 0x00	; 0
   23154:	a1 05       	cpc	r26, r1
   23156:	b1 05       	cpc	r27, r1
   23158:	09 f4       	brne	.+2      	; 0x2315c <prusa_statistics_case0(unsigned char)+0x5e>
   2315a:	51 c0       	rjmp	.+162    	; 0x231fe <prusa_statistics_case0(unsigned char)+0x100>
   2315c:	bc 01       	movw	r22, r24
   2315e:	cd 01       	movw	r24, r26
   23160:	6d 59       	subi	r22, 0x9D	; 157
   23162:	7f 4f       	sbci	r23, 0xFF	; 255
   23164:	8f 4f       	sbci	r24, 0xFF	; 255
   23166:	9f 4f       	sbci	r25, 0xFF	; 255
   23168:	24 e6       	ldi	r18, 0x64	; 100
   2316a:	30 e0       	ldi	r19, 0x00	; 0
   2316c:	40 e0       	ldi	r20, 0x00	; 0
   2316e:	50 e0       	ldi	r21, 0x00	; 0
   23170:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
   23174:	60 91 eb 16 	lds	r22, 0x16EB	; 0x8016eb <card+0x316>
   23178:	70 91 ec 16 	lds	r23, 0x16EC	; 0x8016ec <card+0x317>
   2317c:	80 91 ed 16 	lds	r24, 0x16ED	; 0x8016ed <card+0x318>
   23180:	90 91 ee 16 	lds	r25, 0x16EE	; 0x8016ee <card+0x319>
   23184:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
  print((unsigned long) b, base);
}

void MarlinSerial::print(int n, int base)
{
  print((long) n, base);
   23188:	62 2f       	mov	r22, r18
   2318a:	70 e0       	ldi	r23, 0x00	; 0
   2318c:	90 e0       	ldi	r25, 0x00	; 0
   2318e:	80 e0       	ldi	r24, 0x00	; 0
   23190:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
    SERIAL_ECHO((int)card.percentDone());
    SERIAL_ECHOPGM("][FEM:");
   23194:	88 e0       	ldi	r24, 0x08	; 8
   23196:	99 e8       	ldi	r25, 0x89	; 137
   23198:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   2319c:	60 91 8e 02 	lds	r22, 0x028E	; 0x80028e <feedmultiply>
   231a0:	70 91 8f 02 	lds	r23, 0x028F	; 0x80028f <feedmultiply+0x1>
   231a4:	07 2e       	mov	r0, r23
   231a6:	00 0c       	add	r0, r0
   231a8:	88 0b       	sbc	r24, r24
   231aa:	99 0b       	sbc	r25, r25
   231ac:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
    SERIAL_ECHO(feedmultiply);
    SERIAL_ECHOPGM("][FNM:");
   231b0:	81 e0       	ldi	r24, 0x01	; 1
   231b2:	99 e8       	ldi	r25, 0x89	; 137
   231b4:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    SERIAL_ECHO(card.longFilename[0] ? card.longFilename : card.filename);
   231b8:	80 91 ee 13 	lds	r24, 0x13EE	; 0x8013ee <card+0x19>
   231bc:	81 11       	cpse	r24, r1
   231be:	21 c0       	rjmp	.+66     	; 0x23202 <prusa_statistics_case0(unsigned char)+0x104>
   231c0:	89 ed       	ldi	r24, 0xD9	; 217
   231c2:	93 e1       	ldi	r25, 0x13	; 19
      }
    }*/

    static FORCE_INLINE void print(const char *str)
    {
      write(str);
   231c4:	0e 94 95 87 	call	0x10f2a	; 0x10f2a <MarlinSerial::write(char const*)>
    SERIAL_ECHOPGM("][TIM:");
   231c8:	8a ef       	ldi	r24, 0xFA	; 250
   231ca:	98 e8       	ldi	r25, 0x88	; 136
   231cc:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    if (print_job_timer.isRunning()) {
   231d0:	80 91 8b 03 	lds	r24, 0x038B	; 0x80038b <Stopwatch::state>
   231d4:	81 30       	cpi	r24, 0x01	; 1
   231d6:	c1 f4       	brne	.+48     	; 0x23208 <prusa_statistics_case0(unsigned char)+0x10a>
        SERIAL_ECHO(print_job_timer.duration());
   231d8:	0f 94 6d 17 	call	0x22eda	; 0x22eda <Stopwatch::duration()>
}

void MarlinSerial::print(unsigned long n, int base)
{
  if (base == 0) write(n);
  else printNumber(n, base);
   231dc:	4a e0       	ldi	r20, 0x0A	; 10
   231de:	0e 94 c5 79 	call	0xf38a	; 0xf38a <MarlinSerial::printNumber(unsigned long, unsigned char)>
    }
    else {
        SERIAL_ECHO(0);
    }
    SERIAL_ECHOPGM("][FWR:");
   231e2:	83 ef       	ldi	r24, 0xF3	; 243
   231e4:	98 e8       	ldi	r25, 0x88	; 136
   231e6:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    SERIAL_ECHORPGM(FW_VERSION_STR_P());
   231ea:	8c ee       	ldi	r24, 0xEC	; 236
   231ec:	98 e8       	ldi	r25, 0x88	; 136
   231ee:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
}

void MarlinSerial::print(long n, int base)
{
  if (base == 0) {
    write(n);
   231f2:	8d e5       	ldi	r24, 0x5D	; 93
   231f4:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
static void prusa_statistics_case0(uint8_t statnr) {
    SERIAL_ECHO('{');
    prusa_stat_printerstatus(statnr);
    prusa_stat_farm_number();
    prusa_stat_printinfo();
}
   231f8:	cf 91       	pop	r28
        SERIAL_ECHO(0);
    }
    SERIAL_ECHOPGM("][FWR:");
    SERIAL_ECHORPGM(FW_VERSION_STR_P());
    SERIAL_ECHO(']');
    prusa_stat_diameter();
   231fa:	0d 94 c5 08 	jmp	0x2118a	; 0x2118a <prusa_stat_diameter()>
   231fe:	20 e0       	ldi	r18, 0x00	; 0
   23200:	c3 cf       	rjmp	.-122    	; 0x23188 <prusa_statistics_case0(unsigned char)+0x8a>
    SERIAL_ECHOPGM("][PCD:");
    SERIAL_ECHO((int)card.percentDone());
    SERIAL_ECHOPGM("][FEM:");
    SERIAL_ECHO(feedmultiply);
    SERIAL_ECHOPGM("][FNM:");
    SERIAL_ECHO(card.longFilename[0] ? card.longFilename : card.filename);
   23202:	8e ee       	ldi	r24, 0xEE	; 238
   23204:	93 e1       	ldi	r25, 0x13	; 19
   23206:	de cf       	rjmp	.-68     	; 0x231c4 <prusa_statistics_case0(unsigned char)+0xc6>
   23208:	60 e0       	ldi	r22, 0x00	; 0
   2320a:	70 e0       	ldi	r23, 0x00	; 0
   2320c:	cb 01       	movw	r24, r22
   2320e:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
   23212:	e7 cf       	rjmp	.-50     	; 0x231e2 <prusa_statistics_case0(unsigned char)+0xe4>

00023214 <Stopwatch::reset()>:
  reset();
  if ((accumulator = with_time)) state = RUNNING;
}

void Stopwatch::reset() {
  state = STOPPED;
   23214:	10 92 8b 03 	sts	0x038B, r1	; 0x80038b <Stopwatch::state>
  startTimestamp = 0;
   23218:	10 92 7c 05 	sts	0x057C, r1	; 0x80057c <Stopwatch::startTimestamp>
   2321c:	10 92 7d 05 	sts	0x057D, r1	; 0x80057d <Stopwatch::startTimestamp+0x1>
   23220:	10 92 7e 05 	sts	0x057E, r1	; 0x80057e <Stopwatch::startTimestamp+0x2>
   23224:	10 92 7f 05 	sts	0x057F, r1	; 0x80057f <Stopwatch::startTimestamp+0x3>
  stopTimestamp = 0;
   23228:	10 92 0b 06 	sts	0x060B, r1	; 0x80060b <Stopwatch::stopTimestamp>
   2322c:	10 92 0c 06 	sts	0x060C, r1	; 0x80060c <Stopwatch::stopTimestamp+0x1>
   23230:	10 92 0d 06 	sts	0x060D, r1	; 0x80060d <Stopwatch::stopTimestamp+0x2>
   23234:	10 92 0e 06 	sts	0x060E, r1	; 0x80060e <Stopwatch::stopTimestamp+0x3>
  accumulator = 0;
   23238:	10 92 78 05 	sts	0x0578, r1	; 0x800578 <Stopwatch::accumulator>
   2323c:	10 92 79 05 	sts	0x0579, r1	; 0x800579 <Stopwatch::accumulator+0x1>
   23240:	10 92 7a 05 	sts	0x057A, r1	; 0x80057a <Stopwatch::accumulator+0x2>
   23244:	10 92 7b 05 	sts	0x057B, r1	; 0x80057b <Stopwatch::accumulator+0x3>
}
   23248:	08 95       	ret

0002324a <Stopwatch::start()>:
    /**
     * @brief Check if the timer is running
     * @details Return true if the timer is currently running, false otherwise.
     * @return true if stopwatch is running
     */
    FORCE_INLINE static bool isRunning() { return state == RUNNING; }
   2324a:	80 91 8b 03 	lds	r24, 0x038B	; 0x80038b <Stopwatch::state>
  }
  else return false;
}

bool Stopwatch::start() {
  if (!isRunning()) {
   2324e:	81 30       	cpi	r24, 0x01	; 1
   23250:	f1 f0       	breq	.+60     	; 0x2328e <Stopwatch::start()+0x44>
    if (isPaused()) accumulator = duration();
   23252:	82 30       	cpi	r24, 0x02	; 2
   23254:	c9 f4       	brne	.+50     	; 0x23288 <Stopwatch::start()+0x3e>
   23256:	0f 94 6d 17 	call	0x22eda	; 0x22eda <Stopwatch::duration()>
   2325a:	60 93 78 05 	sts	0x0578, r22	; 0x800578 <Stopwatch::accumulator>
   2325e:	70 93 79 05 	sts	0x0579, r23	; 0x800579 <Stopwatch::accumulator+0x1>
   23262:	80 93 7a 05 	sts	0x057A, r24	; 0x80057a <Stopwatch::accumulator+0x2>
   23266:	90 93 7b 05 	sts	0x057B, r25	; 0x80057b <Stopwatch::accumulator+0x3>
    else reset();

    state = RUNNING;
   2326a:	81 e0       	ldi	r24, 0x01	; 1
   2326c:	80 93 8b 03 	sts	0x038B, r24	; 0x80038b <Stopwatch::state>
    startTimestamp = _millis();
   23270:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   23274:	60 93 7c 05 	sts	0x057C, r22	; 0x80057c <Stopwatch::startTimestamp>
   23278:	70 93 7d 05 	sts	0x057D, r23	; 0x80057d <Stopwatch::startTimestamp+0x1>
   2327c:	80 93 7e 05 	sts	0x057E, r24	; 0x80057e <Stopwatch::startTimestamp+0x2>
   23280:	90 93 7f 05 	sts	0x057F, r25	; 0x80057f <Stopwatch::startTimestamp+0x3>
   23284:	81 e0       	ldi	r24, 0x01	; 1
   23286:	08 95       	ret
}

bool Stopwatch::start() {
  if (!isRunning()) {
    if (isPaused()) accumulator = duration();
    else reset();
   23288:	0f 94 0a 19 	call	0x23214	; 0x23214 <Stopwatch::reset()>
   2328c:	ee cf       	rjmp	.-36     	; 0x2326a <Stopwatch::start()+0x20>

    state = RUNNING;
    startTimestamp = _millis();
    return true;
  }
  else return false;
   2328e:	80 e0       	ldi	r24, 0x00	; 0
}
   23290:	08 95       	ret

00023292 <Stopwatch::stop()>:
uint32_t Stopwatch::accumulator;
uint32_t Stopwatch::startTimestamp;
uint32_t Stopwatch::stopTimestamp;

bool Stopwatch::stop() {
  if (isRunning() || isPaused()) {
   23292:	80 91 8b 03 	lds	r24, 0x038B	; 0x80038b <Stopwatch::state>
   23296:	81 50       	subi	r24, 0x01	; 1
   23298:	82 30       	cpi	r24, 0x02	; 2
   2329a:	70 f4       	brcc	.+28     	; 0x232b8 <Stopwatch::stop()+0x26>
    state = STOPPED;
   2329c:	10 92 8b 03 	sts	0x038B, r1	; 0x80038b <Stopwatch::state>
    stopTimestamp = _millis();
   232a0:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   232a4:	60 93 0b 06 	sts	0x060B, r22	; 0x80060b <Stopwatch::stopTimestamp>
   232a8:	70 93 0c 06 	sts	0x060C, r23	; 0x80060c <Stopwatch::stopTimestamp+0x1>
   232ac:	80 93 0d 06 	sts	0x060D, r24	; 0x80060d <Stopwatch::stopTimestamp+0x2>
   232b0:	90 93 0e 06 	sts	0x060E, r25	; 0x80060e <Stopwatch::stopTimestamp+0x3>
   232b4:	81 e0       	ldi	r24, 0x01	; 1
   232b6:	08 95       	ret
    return true;
  }
  else return false;
   232b8:	80 e0       	ldi	r24, 0x00	; 0
}
   232ba:	08 95       	ret

000232bc <st_current_set(unsigned char, int) [clone .part.2]>:
#ifdef MOTOR_CURRENT_PWM_XY_PIN
void st_current_set(uint8_t driver, int current)
{
  if (driver == 0) analogWrite(MOTOR_CURRENT_PWM_XY_PIN, (long)current * 255L / (long)MOTOR_CURRENT_PWM_RANGE);
  if (driver == 1) analogWrite(MOTOR_CURRENT_PWM_Z_PIN, (long)current * 255L / (long)MOTOR_CURRENT_PWM_RANGE);
  if (driver == 2) analogWrite(MOTOR_CURRENT_PWM_E_PIN, (long)current * 255L / (long)MOTOR_CURRENT_PWM_RANGE);
   232bc:	2f ef       	ldi	r18, 0xFF	; 255
   232be:	30 e0       	ldi	r19, 0x00	; 0
   232c0:	dc 01       	movw	r26, r24
   232c2:	0f 94 00 a5 	call	0x34a00	; 0x34a00 <__usmulhisi3>
   232c6:	20 ed       	ldi	r18, 0xD0	; 208
   232c8:	37 e0       	ldi	r19, 0x07	; 7
   232ca:	40 e0       	ldi	r20, 0x00	; 0
   232cc:	50 e0       	ldi	r21, 0x00	; 0
   232ce:	0f 94 d1 a4 	call	0x349a2	; 0x349a2 <__divmodsi4>
   232d2:	b9 01       	movw	r22, r18
   232d4:	8c e2       	ldi	r24, 0x2C	; 44
   232d6:	0c 94 6e d3 	jmp	0x1a6dc	; 0x1a6dc <analogWrite>

000232da <microstep_readings()>:
    case 16: microstep_ms(driver,MICROSTEP16); break;
  }
}

void microstep_readings()
{
   232da:	cf 93       	push	r28
   232dc:	df 93       	push	r29
      SERIAL_PROTOCOLLNPGM("MS1,MS2 Pins");
   232de:	85 ea       	ldi	r24, 0xA5	; 165
   232e0:	93 e9       	ldi	r25, 0x93	; 147
   232e2:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
      SERIAL_PROTOCOLPGM("X: ");
   232e6:	81 ea       	ldi	r24, 0xA1	; 161
   232e8:	93 e9       	ldi	r25, 0x93	; 147
   232ea:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
      SERIAL_PROTOCOL(   READ(X_MS1_PIN));
   232ee:	62 b3       	in	r22, 0x12	; 18
   232f0:	66 95       	lsr	r22
   232f2:	61 70       	andi	r22, 0x01	; 1
   232f4:	70 e0       	ldi	r23, 0x00	; 0
   232f6:	90 e0       	ldi	r25, 0x00	; 0
   232f8:	80 e0       	ldi	r24, 0x00	; 0
   232fa:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
      SERIAL_PROTOCOLLN( READ(X_MS2_PIN));
   232fe:	82 b3       	in	r24, 0x12	; 18
   23300:	81 70       	andi	r24, 0x01	; 1
   23302:	90 e0       	ldi	r25, 0x00	; 0
   23304:	0f 94 bf 65 	call	0x2cb7e	; 0x2cb7e <MarlinSerial::println(int, int) [clone .constprop.319]>
      SERIAL_PROTOCOLPGM("Y: ");
   23308:	8d e9       	ldi	r24, 0x9D	; 157
   2330a:	93 e9       	ldi	r25, 0x93	; 147
   2330c:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
      SERIAL_PROTOCOL(   READ(Y_MS1_PIN));
   23310:	c6 e0       	ldi	r28, 0x06	; 6
   23312:	d1 e0       	ldi	r29, 0x01	; 1
   23314:	68 81       	ld	r22, Y
   23316:	06 2e       	mov	r0, r22
   23318:	00 0c       	add	r0, r0
   2331a:	77 0b       	sbc	r23, r23
   2331c:	88 0b       	sbc	r24, r24
   2331e:	99 0b       	sbc	r25, r25
   23320:	66 27       	eor	r22, r22
   23322:	97 fd       	sbrc	r25, 7
   23324:	63 95       	inc	r22
   23326:	77 27       	eor	r23, r23
   23328:	88 27       	eor	r24, r24
   2332a:	99 27       	eor	r25, r25
   2332c:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
      SERIAL_PROTOCOLLN( READ(Y_MS2_PIN));
   23330:	82 b3       	in	r24, 0x12	; 18
   23332:	82 fb       	bst	r24, 2
   23334:	88 27       	eor	r24, r24
   23336:	80 f9       	bld	r24, 0
   23338:	90 e0       	ldi	r25, 0x00	; 0
   2333a:	0f 94 bf 65 	call	0x2cb7e	; 0x2cb7e <MarlinSerial::println(int, int) [clone .constprop.319]>
      SERIAL_PROTOCOLPGM("Z: ");
   2333e:	89 e9       	ldi	r24, 0x99	; 153
   23340:	93 e9       	ldi	r25, 0x93	; 147
   23342:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
      SERIAL_PROTOCOL(   READ(Z_MS1_PIN));
   23346:	68 81       	ld	r22, Y
   23348:	66 fb       	bst	r22, 6
   2334a:	66 27       	eor	r22, r22
   2334c:	60 f9       	bld	r22, 0
   2334e:	70 e0       	ldi	r23, 0x00	; 0
   23350:	90 e0       	ldi	r25, 0x00	; 0
   23352:	80 e0       	ldi	r24, 0x00	; 0
   23354:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
      SERIAL_PROTOCOLLN( READ(Z_MS2_PIN));
   23358:	88 81       	ld	r24, Y
   2335a:	85 fb       	bst	r24, 5
   2335c:	88 27       	eor	r24, r24
   2335e:	80 f9       	bld	r24, 0
   23360:	90 e0       	ldi	r25, 0x00	; 0
   23362:	0f 94 bf 65 	call	0x2cb7e	; 0x2cb7e <MarlinSerial::println(int, int) [clone .constprop.319]>
      SERIAL_PROTOCOLPGM("E0: ");
   23366:	84 e9       	ldi	r24, 0x94	; 148
   23368:	93 e9       	ldi	r25, 0x93	; 147
   2336a:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
      SERIAL_PROTOCOL(   READ(E0_MS1_PIN));
   2336e:	68 81       	ld	r22, Y
   23370:	63 fb       	bst	r22, 3
   23372:	66 27       	eor	r22, r22
   23374:	60 f9       	bld	r22, 0
   23376:	70 e0       	ldi	r23, 0x00	; 0
   23378:	90 e0       	ldi	r25, 0x00	; 0
   2337a:	80 e0       	ldi	r24, 0x00	; 0
   2337c:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
      SERIAL_PROTOCOLLN( READ(E0_MS2_PIN));
   23380:	88 81       	ld	r24, Y
   23382:	82 95       	swap	r24
   23384:	81 70       	andi	r24, 0x01	; 1
   23386:	90 e0       	ldi	r25, 0x00	; 0
      #if defined(E1_MS1_PIN) && E1_MS1_PIN > -1
      SERIAL_PROTOCOLPGM("E1: ");
      SERIAL_PROTOCOL(   READ(E1_MS1_PIN));
      SERIAL_PROTOCOLLN( READ(E1_MS2_PIN));
      #endif
}
   23388:	df 91       	pop	r29
   2338a:	cf 91       	pop	r28
      SERIAL_PROTOCOLPGM("Z: ");
      SERIAL_PROTOCOL(   READ(Z_MS1_PIN));
      SERIAL_PROTOCOLLN( READ(Z_MS2_PIN));
      SERIAL_PROTOCOLPGM("E0: ");
      SERIAL_PROTOCOL(   READ(E0_MS1_PIN));
      SERIAL_PROTOCOLLN( READ(E0_MS2_PIN));
   2338c:	0d 94 bf 65 	jmp	0x2cb7e	; 0x2cb7e <MarlinSerial::println(int, int) [clone .constprop.319]>

00023390 <microstep_ms(unsigned char, signed char, signed char)>:
  #endif
}

void microstep_ms(uint8_t driver, int8_t ms1, int8_t ms2)
{
  if(ms1 > -1) switch(driver)
   23390:	67 fd       	sbrc	r22, 7
   23392:	08 c0       	rjmp	.+16     	; 0x233a4 <microstep_ms(unsigned char, signed char, signed char)+0x14>
   23394:	81 30       	cpi	r24, 0x01	; 1
   23396:	21 f1       	breq	.+72     	; 0x233e0 <microstep_ms(unsigned char, signed char, signed char)+0x50>
   23398:	d8 f0       	brcs	.+54     	; 0x233d0 <microstep_ms(unsigned char, signed char, signed char)+0x40>
   2339a:	82 30       	cpi	r24, 0x02	; 2
   2339c:	99 f1       	breq	.+102    	; 0x23404 <microstep_ms(unsigned char, signed char, signed char)+0x74>
   2339e:	83 30       	cpi	r24, 0x03	; 3
   233a0:	09 f4       	brne	.+2      	; 0x233a4 <microstep_ms(unsigned char, signed char, signed char)+0x14>
   233a2:	42 c0       	rjmp	.+132    	; 0x23428 <microstep_ms(unsigned char, signed char, signed char)+0x98>
    case 3: WRITE(E0_MS1_PIN,ms1); break;
    #if defined(E1_MS1_PIN) && E1_MS1_PIN > -1
    case 4: WRITE(E1_MS1_PIN,ms1); break;
    #endif
  }
  if(ms2 > -1) switch(driver)
   233a4:	47 fd       	sbrc	r20, 7
   233a6:	4c c0       	rjmp	.+152    	; 0x23440 <microstep_ms(unsigned char, signed char, signed char)+0xb0>
   233a8:	81 30       	cpi	r24, 0x01	; 1
   233aa:	09 f4       	brne	.+2      	; 0x233ae <microstep_ms(unsigned char, signed char, signed char)+0x1e>
   233ac:	55 c0       	rjmp	.+170    	; 0x23458 <microstep_ms(unsigned char, signed char, signed char)+0xc8>
   233ae:	08 f4       	brcc	.+2      	; 0x233b2 <microstep_ms(unsigned char, signed char, signed char)+0x22>
   233b0:	4d c0       	rjmp	.+154    	; 0x2344c <microstep_ms(unsigned char, signed char, signed char)+0xbc>
   233b2:	82 30       	cpi	r24, 0x02	; 2
   233b4:	09 f4       	brne	.+2      	; 0x233b8 <microstep_ms(unsigned char, signed char, signed char)+0x28>
   233b6:	56 c0       	rjmp	.+172    	; 0x23464 <microstep_ms(unsigned char, signed char, signed char)+0xd4>
   233b8:	83 30       	cpi	r24, 0x03	; 3
   233ba:	09 f0       	breq	.+2      	; 0x233be <microstep_ms(unsigned char, signed char, signed char)+0x2e>
   233bc:	41 c0       	rjmp	.+130    	; 0x23440 <microstep_ms(unsigned char, signed char, signed char)+0xb0>
  {
    case 0: WRITE( X_MS2_PIN,ms2); break;
    case 1: WRITE( Y_MS2_PIN,ms2); break;
    case 2: WRITE( Z_MS2_PIN,ms2); break;
    case 3: WRITE(E0_MS2_PIN,ms2); break;
   233be:	9f b7       	in	r25, 0x3f	; 63
   233c0:	44 23       	and	r20, r20
   233c2:	09 f4       	brne	.+2      	; 0x233c6 <microstep_ms(unsigned char, signed char, signed char)+0x36>
   233c4:	5f c0       	rjmp	.+190    	; 0x23484 <microstep_ms(unsigned char, signed char, signed char)+0xf4>
   233c6:	f8 94       	cli
   233c8:	80 91 08 01 	lds	r24, 0x0108	; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108>
   233cc:	80 61       	ori	r24, 0x10	; 16
   233ce:	51 c0       	rjmp	.+162    	; 0x23472 <microstep_ms(unsigned char, signed char, signed char)+0xe2>

void microstep_ms(uint8_t driver, int8_t ms1, int8_t ms2)
{
  if(ms1 > -1) switch(driver)
  {
    case 0: WRITE( X_MS1_PIN,ms1); break;
   233d0:	66 23       	and	r22, r22
   233d2:	21 f0       	breq	.+8      	; 0x233dc <microstep_ms(unsigned char, signed char, signed char)+0x4c>
   233d4:	a1 9a       	sbi	0x14, 1	; 20
    case 3: WRITE(E0_MS1_PIN,ms1); break;
    #if defined(E1_MS1_PIN) && E1_MS1_PIN > -1
    case 4: WRITE(E1_MS1_PIN,ms1); break;
    #endif
  }
  if(ms2 > -1) switch(driver)
   233d6:	47 ff       	sbrs	r20, 7
   233d8:	39 c0       	rjmp	.+114    	; 0x2344c <microstep_ms(unsigned char, signed char, signed char)+0xbc>
   233da:	08 95       	ret

void microstep_ms(uint8_t driver, int8_t ms1, int8_t ms2)
{
  if(ms1 > -1) switch(driver)
  {
    case 0: WRITE( X_MS1_PIN,ms1); break;
   233dc:	a1 98       	cbi	0x14, 1	; 20
   233de:	fb cf       	rjmp	.-10     	; 0x233d6 <microstep_ms(unsigned char, signed char, signed char)+0x46>
    case 1: WRITE( Y_MS1_PIN,ms1); break;
   233e0:	9f b7       	in	r25, 0x3f	; 63
   233e2:	66 23       	and	r22, r22
   233e4:	51 f0       	breq	.+20     	; 0x233fa <microstep_ms(unsigned char, signed char, signed char)+0x6a>
   233e6:	f8 94       	cli
   233e8:	80 91 08 01 	lds	r24, 0x0108	; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108>
   233ec:	80 68       	ori	r24, 0x80	; 128
   233ee:	80 93 08 01 	sts	0x0108, r24	; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108>
   233f2:	9f bf       	out	0x3f, r25	; 63
    case 3: WRITE(E0_MS1_PIN,ms1); break;
    #if defined(E1_MS1_PIN) && E1_MS1_PIN > -1
    case 4: WRITE(E1_MS1_PIN,ms1); break;
    #endif
  }
  if(ms2 > -1) switch(driver)
   233f4:	47 ff       	sbrs	r20, 7
   233f6:	30 c0       	rjmp	.+96     	; 0x23458 <microstep_ms(unsigned char, signed char, signed char)+0xc8>
   233f8:	08 95       	ret
void microstep_ms(uint8_t driver, int8_t ms1, int8_t ms2)
{
  if(ms1 > -1) switch(driver)
  {
    case 0: WRITE( X_MS1_PIN,ms1); break;
    case 1: WRITE( Y_MS1_PIN,ms1); break;
   233fa:	f8 94       	cli
   233fc:	80 91 08 01 	lds	r24, 0x0108	; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108>
   23400:	8f 77       	andi	r24, 0x7F	; 127
   23402:	f5 cf       	rjmp	.-22     	; 0x233ee <microstep_ms(unsigned char, signed char, signed char)+0x5e>
    case 2: WRITE( Z_MS1_PIN,ms1); break;
   23404:	9f b7       	in	r25, 0x3f	; 63
   23406:	66 23       	and	r22, r22
   23408:	51 f0       	breq	.+20     	; 0x2341e <microstep_ms(unsigned char, signed char, signed char)+0x8e>
   2340a:	f8 94       	cli
   2340c:	80 91 08 01 	lds	r24, 0x0108	; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108>
   23410:	80 64       	ori	r24, 0x40	; 64
   23412:	80 93 08 01 	sts	0x0108, r24	; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108>
   23416:	9f bf       	out	0x3f, r25	; 63
    case 3: WRITE(E0_MS1_PIN,ms1); break;
    #if defined(E1_MS1_PIN) && E1_MS1_PIN > -1
    case 4: WRITE(E1_MS1_PIN,ms1); break;
    #endif
  }
  if(ms2 > -1) switch(driver)
   23418:	47 ff       	sbrs	r20, 7
   2341a:	24 c0       	rjmp	.+72     	; 0x23464 <microstep_ms(unsigned char, signed char, signed char)+0xd4>
   2341c:	08 95       	ret
{
  if(ms1 > -1) switch(driver)
  {
    case 0: WRITE( X_MS1_PIN,ms1); break;
    case 1: WRITE( Y_MS1_PIN,ms1); break;
    case 2: WRITE( Z_MS1_PIN,ms1); break;
   2341e:	f8 94       	cli
   23420:	80 91 08 01 	lds	r24, 0x0108	; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108>
   23424:	8f 7b       	andi	r24, 0xBF	; 191
   23426:	f5 cf       	rjmp	.-22     	; 0x23412 <microstep_ms(unsigned char, signed char, signed char)+0x82>
    case 3: WRITE(E0_MS1_PIN,ms1); break;
   23428:	9f b7       	in	r25, 0x3f	; 63
   2342a:	66 23       	and	r22, r22
   2342c:	51 f0       	breq	.+20     	; 0x23442 <microstep_ms(unsigned char, signed char, signed char)+0xb2>
   2342e:	f8 94       	cli
   23430:	80 91 08 01 	lds	r24, 0x0108	; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108>
   23434:	88 60       	ori	r24, 0x08	; 8
   23436:	80 93 08 01 	sts	0x0108, r24	; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108>
   2343a:	9f bf       	out	0x3f, r25	; 63
    #if defined(E1_MS1_PIN) && E1_MS1_PIN > -1
    case 4: WRITE(E1_MS1_PIN,ms1); break;
    #endif
  }
  if(ms2 > -1) switch(driver)
   2343c:	47 ff       	sbrs	r20, 7
   2343e:	bf cf       	rjmp	.-130    	; 0x233be <microstep_ms(unsigned char, signed char, signed char)+0x2e>
    case 3: WRITE(E0_MS2_PIN,ms2); break;
    #if defined(E1_MS2_PIN) && E1_MS2_PIN > -1
    case 4: WRITE(E1_MS2_PIN,ms2); break;
    #endif
  }
}
   23440:	08 95       	ret
  if(ms1 > -1) switch(driver)
  {
    case 0: WRITE( X_MS1_PIN,ms1); break;
    case 1: WRITE( Y_MS1_PIN,ms1); break;
    case 2: WRITE( Z_MS1_PIN,ms1); break;
    case 3: WRITE(E0_MS1_PIN,ms1); break;
   23442:	f8 94       	cli
   23444:	80 91 08 01 	lds	r24, 0x0108	; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108>
   23448:	87 7f       	andi	r24, 0xF7	; 247
   2344a:	f5 cf       	rjmp	.-22     	; 0x23436 <microstep_ms(unsigned char, signed char, signed char)+0xa6>
    case 4: WRITE(E1_MS1_PIN,ms1); break;
    #endif
  }
  if(ms2 > -1) switch(driver)
  {
    case 0: WRITE( X_MS2_PIN,ms2); break;
   2344c:	44 23       	and	r20, r20
   2344e:	11 f0       	breq	.+4      	; 0x23454 <microstep_ms(unsigned char, signed char, signed char)+0xc4>
   23450:	a0 9a       	sbi	0x14, 0	; 20
   23452:	08 95       	ret
   23454:	a0 98       	cbi	0x14, 0	; 20
   23456:	08 95       	ret
    case 1: WRITE( Y_MS2_PIN,ms2); break;
   23458:	44 23       	and	r20, r20
   2345a:	11 f0       	breq	.+4      	; 0x23460 <microstep_ms(unsigned char, signed char, signed char)+0xd0>
   2345c:	a2 9a       	sbi	0x14, 2	; 20
   2345e:	08 95       	ret
   23460:	a2 98       	cbi	0x14, 2	; 20
   23462:	08 95       	ret
    case 2: WRITE( Z_MS2_PIN,ms2); break;
   23464:	9f b7       	in	r25, 0x3f	; 63
   23466:	44 23       	and	r20, r20
   23468:	41 f0       	breq	.+16     	; 0x2347a <microstep_ms(unsigned char, signed char, signed char)+0xea>
   2346a:	f8 94       	cli
   2346c:	80 91 08 01 	lds	r24, 0x0108	; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108>
   23470:	80 62       	ori	r24, 0x20	; 32
   23472:	80 93 08 01 	sts	0x0108, r24	; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108>
   23476:	9f bf       	out	0x3f, r25	; 63
   23478:	08 95       	ret
   2347a:	f8 94       	cli
   2347c:	80 91 08 01 	lds	r24, 0x0108	; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108>
   23480:	8f 7d       	andi	r24, 0xDF	; 223
   23482:	f7 cf       	rjmp	.-18     	; 0x23472 <microstep_ms(unsigned char, signed char, signed char)+0xe2>
    case 3: WRITE(E0_MS2_PIN,ms2); break;
   23484:	f8 94       	cli
   23486:	80 91 08 01 	lds	r24, 0x0108	; 0x800108 <__TEXT_REGION_LENGTH__+0x7c2108>
   2348a:	8f 7e       	andi	r24, 0xEF	; 239
   2348c:	f2 cf       	rjmp	.-28     	; 0x23472 <microstep_ms(unsigned char, signed char, signed char)+0xe2>

0002348e <microstep_mode(unsigned char, unsigned char)>:
  }
}

void microstep_mode(uint8_t driver, uint8_t stepping_mode)
{
  switch(stepping_mode)
   2348e:	64 30       	cpi	r22, 0x04	; 4
   23490:	81 f0       	breq	.+32     	; 0x234b2 <microstep_mode(unsigned char, unsigned char)+0x24>
   23492:	30 f4       	brcc	.+12     	; 0x234a0 <microstep_mode(unsigned char, unsigned char)+0x12>
   23494:	61 30       	cpi	r22, 0x01	; 1
   23496:	49 f0       	breq	.+18     	; 0x234aa <microstep_mode(unsigned char, unsigned char)+0x1c>
  {
    case 1: microstep_ms(driver,MICROSTEP1); break;
    case 2: microstep_ms(driver,MICROSTEP2); break;
   23498:	40 e0       	ldi	r20, 0x00	; 0
  }
}

void microstep_mode(uint8_t driver, uint8_t stepping_mode)
{
  switch(stepping_mode)
   2349a:	62 30       	cpi	r22, 0x02	; 2
   2349c:	69 f0       	breq	.+26     	; 0x234b8 <microstep_mode(unsigned char, unsigned char)+0x2a>
   2349e:	08 95       	ret
   234a0:	68 30       	cpi	r22, 0x08	; 8
   234a2:	49 f0       	breq	.+18     	; 0x234b6 <microstep_mode(unsigned char, unsigned char)+0x28>
   234a4:	60 31       	cpi	r22, 0x10	; 16
   234a6:	39 f0       	breq	.+14     	; 0x234b6 <microstep_mode(unsigned char, unsigned char)+0x28>
   234a8:	08 95       	ret
  {
    case 1: microstep_ms(driver,MICROSTEP1); break;
   234aa:	40 e0       	ldi	r20, 0x00	; 0
    case 2: microstep_ms(driver,MICROSTEP2); break;
    case 4: microstep_ms(driver,MICROSTEP4); break;
   234ac:	60 e0       	ldi	r22, 0x00	; 0
    case 8: microstep_ms(driver,MICROSTEP8); break;
   234ae:	0d 94 c8 19 	jmp	0x23390	; 0x23390 <microstep_ms(unsigned char, signed char, signed char)>
{
  switch(stepping_mode)
  {
    case 1: microstep_ms(driver,MICROSTEP1); break;
    case 2: microstep_ms(driver,MICROSTEP2); break;
    case 4: microstep_ms(driver,MICROSTEP4); break;
   234b2:	41 e0       	ldi	r20, 0x01	; 1
   234b4:	fb cf       	rjmp	.-10     	; 0x234ac <microstep_mode(unsigned char, unsigned char)+0x1e>
    case 8: microstep_ms(driver,MICROSTEP8); break;
   234b6:	41 e0       	ldi	r20, 0x01	; 1
   234b8:	61 e0       	ldi	r22, 0x01	; 1
   234ba:	f9 cf       	rjmp	.-14     	; 0x234ae <microstep_mode(unsigned char, unsigned char)+0x20>

000234bc <st_current_set(unsigned char, int)>:
#endif
}

#ifdef MOTOR_CURRENT_PWM_XY_PIN
void st_current_set(uint8_t driver, int current)
{
   234bc:	db 01       	movw	r26, r22
  if (driver == 0) analogWrite(MOTOR_CURRENT_PWM_XY_PIN, (long)current * 255L / (long)MOTOR_CURRENT_PWM_RANGE);
   234be:	81 11       	cpse	r24, r1
   234c0:	0e c0       	rjmp	.+28     	; 0x234de <st_current_set(unsigned char, int)+0x22>
   234c2:	2f ef       	ldi	r18, 0xFF	; 255
   234c4:	30 e0       	ldi	r19, 0x00	; 0
   234c6:	0f 94 00 a5 	call	0x34a00	; 0x34a00 <__usmulhisi3>
   234ca:	20 ed       	ldi	r18, 0xD0	; 208
   234cc:	37 e0       	ldi	r19, 0x07	; 7
   234ce:	40 e0       	ldi	r20, 0x00	; 0
   234d0:	50 e0       	ldi	r21, 0x00	; 0
   234d2:	0f 94 d1 a4 	call	0x349a2	; 0x349a2 <__divmodsi4>
   234d6:	b9 01       	movw	r22, r18
   234d8:	8e e2       	ldi	r24, 0x2E	; 46
  if (driver == 1) analogWrite(MOTOR_CURRENT_PWM_Z_PIN, (long)current * 255L / (long)MOTOR_CURRENT_PWM_RANGE);
   234da:	0c 94 6e d3 	jmp	0x1a6dc	; 0x1a6dc <analogWrite>
   234de:	81 30       	cpi	r24, 0x01	; 1
   234e0:	69 f4       	brne	.+26     	; 0x234fc <st_current_set(unsigned char, int)+0x40>
   234e2:	2f ef       	ldi	r18, 0xFF	; 255
   234e4:	30 e0       	ldi	r19, 0x00	; 0
   234e6:	0f 94 00 a5 	call	0x34a00	; 0x34a00 <__usmulhisi3>
   234ea:	20 ed       	ldi	r18, 0xD0	; 208
   234ec:	37 e0       	ldi	r19, 0x07	; 7
   234ee:	40 e0       	ldi	r20, 0x00	; 0
   234f0:	50 e0       	ldi	r21, 0x00	; 0
   234f2:	0f 94 d1 a4 	call	0x349a2	; 0x349a2 <__divmodsi4>
   234f6:	b9 01       	movw	r22, r18
   234f8:	8d e2       	ldi	r24, 0x2D	; 45
   234fa:	ef cf       	rjmp	.-34     	; 0x234da <st_current_set(unsigned char, int)+0x1e>
  if (driver == 2) analogWrite(MOTOR_CURRENT_PWM_E_PIN, (long)current * 255L / (long)MOTOR_CURRENT_PWM_RANGE);
   234fc:	82 30       	cpi	r24, 0x02	; 2
   234fe:	19 f4       	brne	.+6      	; 0x23506 <st_current_set(unsigned char, int)+0x4a>
   23500:	cb 01       	movw	r24, r22
   23502:	0d 94 5e 19 	jmp	0x232bc	; 0x232bc <st_current_set(unsigned char, int) [clone .part.2]>
}
   23506:	08 95       	ret

00023508 <st_current_init()>:

#ifndef TMC2130
void st_current_init() //Initialize Digipot Motor Current
{
#ifdef MOTOR_CURRENT_PWM_XY_PIN
  uint8_t SilentMode = eeprom_read_byte((uint8_t*)EEPROM_SILENT);
   23508:	8f ef       	ldi	r24, 0xFF	; 255
   2350a:	9f e0       	ldi	r25, 0x0F	; 15
   2350c:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
  SilentModeMenu = SilentMode;
   23510:	80 93 bb 03 	sts	0x03BB, r24	; 0x8003bb <SilentModeMenu>
    SET_OUTPUT(MOTOR_CURRENT_PWM_XY_PIN);
   23514:	90 91 0a 01 	lds	r25, 0x010A	; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a>
   23518:	98 60       	ori	r25, 0x08	; 8
   2351a:	90 93 0a 01 	sts	0x010A, r25	; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a>
    SET_OUTPUT(MOTOR_CURRENT_PWM_Z_PIN);
   2351e:	90 91 0a 01 	lds	r25, 0x010A	; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a>
   23522:	90 61       	ori	r25, 0x10	; 16
   23524:	90 93 0a 01 	sts	0x010A, r25	; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a>
    SET_OUTPUT(MOTOR_CURRENT_PWM_E_PIN);
   23528:	90 91 0a 01 	lds	r25, 0x010A	; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a>
   2352c:	90 62       	ori	r25, 0x20	; 32
   2352e:	90 93 0a 01 	sts	0x010A, r25	; 0x80010a <__TEXT_REGION_LENGTH__+0x7c210a>
    if((SilentMode == SILENT_MODE_OFF) || (farm_mode) ){
   23532:	88 23       	and	r24, r24
   23534:	21 f0       	breq	.+8      	; 0x2353e <st_current_init()+0x36>
   23536:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   2353a:	88 23       	and	r24, r24
   2353c:	59 f1       	breq	.+86     	; 0x23594 <st_current_init()+0x8c>

     motor_current_setting[0] = motor_current_setting_loud[0];
   2353e:	8c e1       	ldi	r24, 0x1C	; 28
   23540:	92 e0       	ldi	r25, 0x02	; 2
   23542:	90 93 60 02 	sts	0x0260, r25	; 0x800260 <motor_current_setting+0x1>
   23546:	80 93 5f 02 	sts	0x025F, r24	; 0x80025f <motor_current_setting>
     motor_current_setting[1] = motor_current_setting_loud[1];
   2354a:	8e e3       	ldi	r24, 0x3E	; 62
   2354c:	93 e0       	ldi	r25, 0x03	; 3
   2354e:	90 93 62 02 	sts	0x0262, r25	; 0x800262 <motor_current_setting+0x3>
   23552:	80 93 61 02 	sts	0x0261, r24	; 0x800261 <motor_current_setting+0x2>
     motor_current_setting[2] = motor_current_setting_loud[2];
   23556:	84 ef       	ldi	r24, 0xF4	; 244
   23558:	91 e0       	ldi	r25, 0x01	; 1

    }else{

     motor_current_setting[0] = motor_current_setting_silent[0];
     motor_current_setting[1] = motor_current_setting_silent[1];
     motor_current_setting[2] = motor_current_setting_silent[2];
   2355a:	90 93 64 02 	sts	0x0264, r25	; 0x800264 <motor_current_setting+0x5>
   2355e:	80 93 63 02 	sts	0x0263, r24	; 0x800263 <motor_current_setting+0x4>

    }
    st_current_set(0, motor_current_setting[0]);
   23562:	60 91 5f 02 	lds	r22, 0x025F	; 0x80025f <motor_current_setting>
   23566:	70 91 60 02 	lds	r23, 0x0260	; 0x800260 <motor_current_setting+0x1>
   2356a:	80 e0       	ldi	r24, 0x00	; 0
   2356c:	0f 94 5e 1a 	call	0x234bc	; 0x234bc <st_current_set(unsigned char, int)>
    st_current_set(1, motor_current_setting[1]);
   23570:	6e e3       	ldi	r22, 0x3E	; 62
   23572:	73 e0       	ldi	r23, 0x03	; 3
   23574:	81 e0       	ldi	r24, 0x01	; 1
   23576:	0f 94 5e 1a 	call	0x234bc	; 0x234bc <st_current_set(unsigned char, int)>
   2357a:	80 91 63 02 	lds	r24, 0x0263	; 0x800263 <motor_current_setting+0x4>
   2357e:	90 91 64 02 	lds	r25, 0x0264	; 0x800264 <motor_current_setting+0x5>
   23582:	0f 94 5e 19 	call	0x232bc	; 0x232bc <st_current_set(unsigned char, int) [clone .part.2]>
    st_current_set(2, motor_current_setting[2]);
    //Set timer5 to 31khz so the PWM of the motor power is as constant as possible. (removes a buzzing noise)
    TCCR5B = (TCCR5B & ~(_BV(CS50) | _BV(CS51) | _BV(CS52))) | _BV(CS50);
   23586:	80 91 21 01 	lds	r24, 0x0121	; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121>
   2358a:	88 7f       	andi	r24, 0xF8	; 248
   2358c:	81 60       	ori	r24, 0x01	; 1
   2358e:	80 93 21 01 	sts	0x0121, r24	; 0x800121 <__TEXT_REGION_LENGTH__+0x7c2121>
#endif
}
   23592:	08 95       	ret
     motor_current_setting[1] = motor_current_setting_loud[1];
     motor_current_setting[2] = motor_current_setting_loud[2];

    }else{

     motor_current_setting[0] = motor_current_setting_silent[0];
   23594:	8e e0       	ldi	r24, 0x0E	; 14
   23596:	91 e0       	ldi	r25, 0x01	; 1
   23598:	90 93 60 02 	sts	0x0260, r25	; 0x800260 <motor_current_setting+0x1>
   2359c:	80 93 5f 02 	sts	0x025F, r24	; 0x80025f <motor_current_setting>
     motor_current_setting[1] = motor_current_setting_silent[1];
   235a0:	8e e3       	ldi	r24, 0x3E	; 62
   235a2:	93 e0       	ldi	r25, 0x03	; 3
   235a4:	90 93 62 02 	sts	0x0262, r25	; 0x800262 <motor_current_setting+0x3>
   235a8:	80 93 61 02 	sts	0x0261, r24	; 0x800261 <motor_current_setting+0x2>
     motor_current_setting[2] = motor_current_setting_silent[2];
   235ac:	82 ec       	ldi	r24, 0xC2	; 194
   235ae:	91 e0       	ldi	r25, 0x01	; 1
   235b0:	d4 cf       	rjmp	.-88     	; 0x2355a <st_current_init()+0x52>

000235b2 <st_get_position(unsigned char)>:
}

long st_get_position(uint8_t axis)
{
  long count_pos;
  CRITICAL_SECTION_START;
   235b2:	2f b7       	in	r18, 0x3f	; 63
   235b4:	f8 94       	cli
  count_pos = count_position[axis];
   235b6:	94 e0       	ldi	r25, 0x04	; 4
   235b8:	89 9f       	mul	r24, r25
   235ba:	f0 01       	movw	r30, r0
   235bc:	11 24       	eor	r1, r1
   235be:	e4 5b       	subi	r30, 0xB4	; 180
   235c0:	f9 4f       	sbci	r31, 0xF9	; 249
   235c2:	60 81       	ld	r22, Z
   235c4:	71 81       	ldd	r23, Z+1	; 0x01
   235c6:	82 81       	ldd	r24, Z+2	; 0x02
   235c8:	93 81       	ldd	r25, Z+3	; 0x03
  CRITICAL_SECTION_END;
   235ca:	2f bf       	out	0x3f, r18	; 63
  return count_pos;
}
   235cc:	08 95       	ret

000235ce <st_get_position_mm(unsigned char)>:
  y = count_position[Y_AXIS];
  CRITICAL_SECTION_END;
}

float st_get_position_mm(uint8_t axis)
{
   235ce:	cf 93       	push	r28
   235d0:	c8 2f       	mov	r28, r24
  float steper_position_in_steps = st_get_position(axis);
   235d2:	0f 94 d9 1a 	call	0x235b2	; 0x235b2 <st_get_position(unsigned char)>
   235d6:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
  return steper_position_in_steps / cs.axis_steps_per_mm[axis];
   235da:	24 e0       	ldi	r18, 0x04	; 4
   235dc:	c2 9f       	mul	r28, r18
   235de:	f0 01       	movw	r30, r0
   235e0:	11 24       	eor	r1, r1
   235e2:	e5 59       	subi	r30, 0x95	; 149
   235e4:	f2 4f       	sbci	r31, 0xF2	; 242
   235e6:	20 81       	ld	r18, Z
   235e8:	31 81       	ldd	r19, Z+1	; 0x01
   235ea:	42 81       	ldd	r20, Z+2	; 0x02
   235ec:	53 81       	ldd	r21, Z+3	; 0x03
   235ee:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
}
   235f2:	cf 91       	pop	r28
   235f4:	08 95       	ret

000235f6 <st_synchronize()>:
   235f6:	90 91 3e 0d 	lds	r25, 0x0D3E	; 0x800d3e <block_buffer_head>
   235fa:	80 91 3f 0d 	lds	r24, 0x0D3F	; 0x800d3f <block_buffer_tail>


// Block until all buffered steps are executed
void st_synchronize()
{
	while(blocks_queued())
   235fe:	98 17       	cp	r25, r24
   23600:	29 f0       	breq	.+10     	; 0x2360c <st_synchronize()+0x16>
			manage_inactivity(true);
			lcd_update(0);
		}
#else //TMC2130
		// Vojtech: Don't disable motors inside the planner!
		delay_keep_alive(0);
   23602:	90 e0       	ldi	r25, 0x00	; 0
   23604:	80 e0       	ldi	r24, 0x00	; 0
   23606:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
   2360a:	f5 cf       	rjmp	.-22     	; 0x235f6 <st_synchronize()>
#endif //TMC2130
	}
}
   2360c:	08 95       	ret

0002360e <lcd_load_filament_color_check()>:
    _delay(2000);
    lcd_clear();
}

void lcd_load_filament_color_check()
{
   2360e:	cf 92       	push	r12
   23610:	ef 92       	push	r14
   23612:	ff 92       	push	r15
   23614:	0f 93       	push	r16
   23616:	1f 93       	push	r17
   23618:	cf 93       	push	r28
   2361a:	df 93       	push	r29
    // >Ja >Nein >Auswerfen
    // Hungarian
    // 01234567890123456789
    // >Igen >Nem   >Kiadás

    uint8_t clean = lcd_show_multiscreen_message_with_choices_and_wait_P(_T(MSG_FILAMENT_CLEAN), false, LCD_LEFT_BUTTON_CHOICE, _T(MSG_YES), _T(MSG_NO), _T(MSG_EJECT), strlen_P(_T(MSG_YES))+2);
   2361c:	89 e9       	ldi	r24, 0x99	; 153
   2361e:	98 e4       	ldi	r25, 0x48	; 72
   23620:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   23624:	0f 94 9e a1 	call	0x3433c	; 0x3433c <__strlen_P>
   23628:	c8 2e       	mov	r12, r24
   2362a:	86 e4       	ldi	r24, 0x46	; 70
   2362c:	98 e5       	ldi	r25, 0x58	; 88
   2362e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   23632:	7c 01       	movw	r14, r24
   23634:	8f e9       	ldi	r24, 0x9F	; 159
   23636:	98 e4       	ldi	r25, 0x48	; 72
   23638:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   2363c:	8c 01       	movw	r16, r24
   2363e:	89 e9       	ldi	r24, 0x99	; 153
   23640:	98 e4       	ldi	r25, 0x48	; 72
   23642:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   23646:	ec 01       	movw	r28, r24
   23648:	8b e1       	ldi	r24, 0x1B	; 27
   2364a:	98 e5       	ldi	r25, 0x58	; 88
   2364c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   23650:	c3 94       	inc	r12
   23652:	c3 94       	inc	r12
   23654:	9e 01       	movw	r18, r28
   23656:	40 e0       	ldi	r20, 0x00	; 0
   23658:	60 e0       	ldi	r22, 0x00	; 0
   2365a:	0e 94 a4 e4 	call	0x1c948	; 0x1c948 <lcd_show_multiscreen_message_with_choices_and_wait_P(char const*, bool, unsigned char, char const*, char const*, char const*, unsigned char)>
    while (clean == LCD_MIDDLE_BUTTON_CHOICE) {
   2365e:	81 30       	cpi	r24, 0x01	; 1
   23660:	29 f4       	brne	.+10     	; 0x2366c <lcd_load_filament_color_check()+0x5e>
        load_filament_final_feed();
   23662:	0e 94 ed 63 	call	0xc7da	; 0xc7da <load_filament_final_feed()>
        st_synchronize();
   23666:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
   2366a:	d8 cf       	rjmp	.-80     	; 0x2361c <lcd_load_filament_color_check()+0xe>
        clean = lcd_show_multiscreen_message_with_choices_and_wait_P(_T(MSG_FILAMENT_CLEAN), false, LCD_LEFT_BUTTON_CHOICE, _T(MSG_YES), _T(MSG_NO), _T(MSG_EJECT), strlen_P(_T(MSG_YES))+2);
    }
    if (clean == LCD_RIGHT_BUTTON_CHOICE) {
   2366c:	82 30       	cpi	r24, 0x02	; 2
   2366e:	61 f4       	brne	.+24     	; 0x23688 <lcd_load_filament_color_check()+0x7a>
        unload_filament(FILAMENTCHANGE_FINALRETRACT);
   23670:	60 e0       	ldi	r22, 0x00	; 0
   23672:	70 e0       	ldi	r23, 0x00	; 0
   23674:	cb 01       	movw	r24, r22
    }
}
   23676:	df 91       	pop	r29
   23678:	cf 91       	pop	r28
   2367a:	1f 91       	pop	r17
   2367c:	0f 91       	pop	r16
   2367e:	ff 90       	pop	r15
   23680:	ef 90       	pop	r14
   23682:	cf 90       	pop	r12
        load_filament_final_feed();
        st_synchronize();
        clean = lcd_show_multiscreen_message_with_choices_and_wait_P(_T(MSG_FILAMENT_CLEAN), false, LCD_LEFT_BUTTON_CHOICE, _T(MSG_YES), _T(MSG_NO), _T(MSG_EJECT), strlen_P(_T(MSG_YES))+2);
    }
    if (clean == LCD_RIGHT_BUTTON_CHOICE) {
        unload_filament(FILAMENTCHANGE_FINALRETRACT);
   23684:	0c 94 7e e3 	jmp	0x1c6fc	; 0x1c6fc <unload_filament(float)>
    }
}
   23688:	df 91       	pop	r29
   2368a:	cf 91       	pop	r28
   2368c:	1f 91       	pop	r17
   2368e:	0f 91       	pop	r16
   23690:	ff 90       	pop	r15
   23692:	ef 90       	pop	r14
   23694:	cf 90       	pop	r12
   23696:	08 95       	ret

00023698 <st_reset_timer()>:


void st_reset_timer()
{
  // Clear a possible pending interrupt on OCR1A overflow.
  TIFR1 |= 1 << OCF1A;
   23698:	b1 9a       	sbi	0x16, 1	; 22
  // Reset the counter.
  TCNT1 = 0;
   2369a:	10 92 85 00 	sts	0x0085, r1	; 0x800085 <__TEXT_REGION_LENGTH__+0x7c2085>
   2369e:	10 92 84 00 	sts	0x0084, r1	; 0x800084 <__TEXT_REGION_LENGTH__+0x7c2084>
  // Wake up after 1ms from now.
  OCR1A = 2000;
   236a2:	80 ed       	ldi	r24, 0xD0	; 208
   236a4:	97 e0       	ldi	r25, 0x07	; 7
   236a6:	90 93 89 00 	sts	0x0089, r25	; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089>
   236aa:	80 93 88 00 	sts	0x0088, r24	; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088>

#ifdef LIN_ADVANCE
  nextMainISR = 0;
   236ae:	10 92 4f 04 	sts	0x044F, r1	; 0x80044f <_ZL11nextMainISR.lto_priv.438+0x1>
   236b2:	10 92 4e 04 	sts	0x044E, r1	; 0x80044e <_ZL11nextMainISR.lto_priv.438>
  if(nextAdvanceISR && nextAdvanceISR != ADV_NEVER)
   236b6:	80 91 4c 04 	lds	r24, 0x044C	; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439>
   236ba:	90 91 4d 04 	lds	r25, 0x044D	; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1>
   236be:	01 97       	sbiw	r24, 0x01	; 1
   236c0:	8e 3f       	cpi	r24, 0xFE	; 254
   236c2:	9f 4f       	sbci	r25, 0xFF	; 255
   236c4:	20 f4       	brcc	.+8      	; 0x236ce <st_reset_timer()+0x36>
      nextAdvanceISR = 0;
   236c6:	10 92 4d 04 	sts	0x044D, r1	; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1>
   236ca:	10 92 4c 04 	sts	0x044C, r1	; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439>
#endif
}
   236ce:	08 95       	ret

000236d0 <__vector_17>:
//  step_events_completed reaches block->decelerate_after after which it decelerates until the trapezoid generator is reset.
//  The slope of acceleration is calculated using v = u + at where t is the accumulated timer values of the steps so far.

// "The Stepper Driver Interrupt" - This timer interrupt is the workhorse.
// It pops blocks from the block_buffer and executes them by pulsing the stepper pins appropriately.
ISR(TIMER1_COMPA_vect) {
   236d0:	1f 92       	push	r1
   236d2:	0f 92       	push	r0
   236d4:	0f b6       	in	r0, 0x3f	; 63
   236d6:	0f 92       	push	r0
   236d8:	11 24       	eor	r1, r1
   236da:	0b b6       	in	r0, 0x3b	; 59
   236dc:	0f 92       	push	r0
   236de:	4f 92       	push	r4
   236e0:	5f 92       	push	r5
   236e2:	6f 92       	push	r6
   236e4:	7f 92       	push	r7
   236e6:	8f 92       	push	r8
   236e8:	cf 92       	push	r12
   236ea:	df 92       	push	r13
   236ec:	ef 92       	push	r14
   236ee:	ff 92       	push	r15
   236f0:	1f 93       	push	r17
   236f2:	2f 93       	push	r18
   236f4:	3f 93       	push	r19
   236f6:	4f 93       	push	r20
   236f8:	5f 93       	push	r21
   236fa:	6f 93       	push	r22
   236fc:	7f 93       	push	r23
   236fe:	8f 93       	push	r24
   23700:	9f 93       	push	r25
   23702:	af 93       	push	r26
   23704:	bf 93       	push	r27
   23706:	cf 93       	push	r28
   23708:	df 93       	push	r29
   2370a:	ef 93       	push	r30
   2370c:	ff 93       	push	r31
    }
}

FORCE_INLINE void advance_isr_scheduler() {
    // Integrate the final timer value, accounting for scheduling adjustments
    if(nextAdvanceISR && nextAdvanceISR != ADV_NEVER)
   2370e:	80 91 4c 04 	lds	r24, 0x044C	; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439>
   23712:	90 91 4d 04 	lds	r25, 0x044D	; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1>
   23716:	9c 01       	movw	r18, r24
   23718:	21 50       	subi	r18, 0x01	; 1
   2371a:	31 09       	sbc	r19, r1
   2371c:	2e 3f       	cpi	r18, 0xFE	; 254
   2371e:	3f 4f       	sbci	r19, 0xFF	; 255
   23720:	90 f4       	brcc	.+36     	; 0x23746 <__vector_17+0x76>
    {
        if(nextAdvanceISR > OCR1A)
   23722:	20 91 88 00 	lds	r18, 0x0088	; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088>
   23726:	30 91 89 00 	lds	r19, 0x0089	; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089>
   2372a:	28 17       	cp	r18, r24
   2372c:	39 07       	cpc	r19, r25
   2372e:	08 f0       	brcs	.+2      	; 0x23732 <__vector_17+0x62>
   23730:	f9 c0       	rjmp	.+498    	; 0x23924 <__vector_17+0x254>
            nextAdvanceISR -= OCR1A;
   23732:	20 91 88 00 	lds	r18, 0x0088	; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088>
   23736:	30 91 89 00 	lds	r19, 0x0089	; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089>
   2373a:	82 1b       	sub	r24, r18
   2373c:	93 0b       	sbc	r25, r19
   2373e:	90 93 4d 04 	sts	0x044D, r25	; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1>
   23742:	80 93 4c 04 	sts	0x044C, r24	; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439>
        else
            nextAdvanceISR = 0;
    }
    if(nextMainISR > OCR1A)
   23746:	20 91 88 00 	lds	r18, 0x0088	; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088>
   2374a:	30 91 89 00 	lds	r19, 0x0089	; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089>
   2374e:	80 91 4e 04 	lds	r24, 0x044E	; 0x80044e <_ZL11nextMainISR.lto_priv.438>
   23752:	90 91 4f 04 	lds	r25, 0x044F	; 0x80044f <_ZL11nextMainISR.lto_priv.438+0x1>
   23756:	28 17       	cp	r18, r24
   23758:	39 07       	cpc	r19, r25
   2375a:	08 f0       	brcs	.+2      	; 0x2375e <__vector_17+0x8e>
   2375c:	e8 c0       	rjmp	.+464    	; 0x2392e <__vector_17+0x25e>
        nextMainISR -= OCR1A;
   2375e:	20 91 88 00 	lds	r18, 0x0088	; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088>
   23762:	30 91 89 00 	lds	r19, 0x0089	; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089>
   23766:	82 1b       	sub	r24, r18
   23768:	93 0b       	sbc	r25, r19
   2376a:	90 93 4f 04 	sts	0x044F, r25	; 0x80044f <_ZL11nextMainISR.lto_priv.438+0x1>
   2376e:	80 93 4e 04 	sts	0x044E, r24	; 0x80044e <_ZL11nextMainISR.lto_priv.438>
    else
        nextMainISR = 0;

    // Run main stepping ISR if flagged
    if (!nextMainISR)
   23772:	80 91 4e 04 	lds	r24, 0x044E	; 0x80044e <_ZL11nextMainISR.lto_priv.438>
   23776:	90 91 4f 04 	lds	r25, 0x044F	; 0x80044f <_ZL11nextMainISR.lto_priv.438+0x1>
   2377a:	89 2b       	or	r24, r25
   2377c:	11 f0       	breq	.+4      	; 0x23782 <__vector_17+0xb2>
   2377e:	0d 94 53 24 	jmp	0x248a6	; 0x248a6 <__vector_17+0x11d6>
FORCE_INLINE void isr() {
  //WRITE_NC(LOGIC_ANALYZER_CH0, true);

	//if (UVLO) uvlo();
  // If there is no current block, attempt to pop one from the buffer
  if (current_block == NULL)
   23782:	e0 91 51 12 	lds	r30, 0x1251	; 0x801251 <current_block>
   23786:	f0 91 52 12 	lds	r31, 0x1252	; 0x801252 <current_block+0x1>
   2378a:	30 97       	sbiw	r30, 0x00	; 0
   2378c:	09 f0       	breq	.+2      	; 0x23790 <__vector_17+0xc0>
   2378e:	82 c1       	rjmp	.+772    	; 0x23a94 <__vector_17+0x3c4>
// Mark this block as busy, so its velocities and acceperations will be no more recalculated
// by the planner routine.
// Returns NULL if buffer empty
FORCE_INLINE block_t *plan_get_current_block()
{
  if (block_buffer_head == block_buffer_tail) {
   23790:	90 91 3e 0d 	lds	r25, 0x0D3E	; 0x800d3e <block_buffer_head>
   23794:	80 91 3f 0d 	lds	r24, 0x0D3F	; 0x800d3f <block_buffer_tail>
   23798:	98 17       	cp	r25, r24
   2379a:	09 f4       	brne	.+2      	; 0x2379e <__vector_17+0xce>
   2379c:	35 c3       	rjmp	.+1642   	; 0x23e08 <__vector_17+0x738>
    return(NULL);
  }
  block_t *block = &block_buffer[block_buffer_tail];
   2379e:	c0 91 3f 0d 	lds	r28, 0x0D3F	; 0x800d3f <block_buffer_tail>
   237a2:	2c 2f       	mov	r18, r28
   237a4:	30 e0       	ldi	r19, 0x00	; 0
   237a6:	5e e6       	ldi	r21, 0x6E	; 110
   237a8:	c5 9f       	mul	r28, r21
   237aa:	e0 01       	movw	r28, r0
   237ac:	11 24       	eor	r1, r1
   237ae:	c2 5a       	subi	r28, 0xA2	; 162
   237b0:	d9 4f       	sbci	r29, 0xF9	; 249
  block->busy = true;
   237b2:	fe 01       	movw	r30, r28
   237b4:	e9 5b       	subi	r30, 0xB9	; 185
   237b6:	ff 4f       	sbci	r31, 0xFF	; 255
   237b8:	41 e0       	ldi	r20, 0x01	; 1
   237ba:	40 83       	st	Z, r20

FORCE_INLINE void stepper_next_block()
{
  // Anything in the buffer?
  //WRITE_NC(LOGIC_ANALYZER_CH2, true);
  current_block = plan_get_current_block();
   237bc:	d0 93 52 12 	sts	0x1252, r29	; 0x801252 <current_block+0x1>
   237c0:	c0 93 51 12 	sts	0x1251, r28	; 0x801251 <current_block>
  if (current_block != NULL) {
   237c4:	20 97       	sbiw	r28, 0x00	; 0
   237c6:	09 f4       	brne	.+2      	; 0x237ca <__vector_17+0xfa>
   237c8:	1f c3       	rjmp	.+1598   	; 0x23e08 <__vector_17+0x738>

    // The busy flag is set by the plan_get_current_block() call.
    // current_block->busy = true;
    // Initializes the trapezoid generator from the current block. Called whenever a new
    // block begins.
    deceleration_time = 0;
   237ca:	10 92 74 05 	sts	0x0574, r1	; 0x800574 <deceleration_time>
   237ce:	10 92 75 05 	sts	0x0575, r1	; 0x800575 <deceleration_time+0x1>
   237d2:	10 92 76 05 	sts	0x0576, r1	; 0x800576 <deceleration_time+0x2>
   237d6:	10 92 77 05 	sts	0x0577, r1	; 0x800577 <deceleration_time+0x3>
    // Set the nominal step loops to zero to indicate, that the timer value is not known yet.
    // That means, delay the initialization of nominal step rate and step loops until the steady
    // state is reached.
    step_loops_nominal = 0;
   237da:	10 92 73 05 	sts	0x0573, r1	; 0x800573 <step_loops_nominal>
    acc_step_rate = uint16_t(current_block->initial_rate);
   237de:	8a ad       	ldd	r24, Y+58	; 0x3a
   237e0:	9b ad       	ldd	r25, Y+59	; 0x3b
   237e2:	90 93 72 05 	sts	0x0572, r25	; 0x800572 <acc_step_rate+0x1>
   237e6:	80 93 71 05 	sts	0x0571, r24	; 0x800571 <acc_step_rate>
#endif //_NO_ASM


FORCE_INLINE unsigned short calc_timer(uint16_t step_rate, uint8_t& step_loops) {
  uint16_t timer;
  if(step_rate > MAX_STEP_FREQUENCY) step_rate = MAX_STEP_FREQUENCY;
   237ea:	81 34       	cpi	r24, 0x41	; 65
   237ec:	ac e9       	ldi	r26, 0x9C	; 156
   237ee:	9a 07       	cpc	r25, r26
   237f0:	08 f0       	brcs	.+2      	; 0x237f4 <__vector_17+0x124>
   237f2:	a2 c0       	rjmp	.+324    	; 0x23938 <__vector_17+0x268>

  if(step_rate > 20000) { // If steprate > 20kHz >> step 4 times
   237f4:	81 32       	cpi	r24, 0x21	; 33
   237f6:	be e4       	ldi	r27, 0x4E	; 78
   237f8:	9b 07       	cpc	r25, r27
   237fa:	08 f4       	brcc	.+2      	; 0x237fe <__vector_17+0x12e>
   237fc:	a0 c0       	rjmp	.+320    	; 0x2393e <__vector_17+0x26e>
    step_rate = (step_rate >> 2)&0x3fff;
   237fe:	96 95       	lsr	r25
   23800:	87 95       	ror	r24
   23802:	96 95       	lsr	r25
   23804:	87 95       	ror	r24
    step_loops = 4;
   23806:	44 e0       	ldi	r20, 0x04	; 4
  }
  else if(step_rate > 10000) { // If steprate > 10kHz >> step 2 times
    step_rate = (step_rate >> 1)&0x7fff;
    step_loops = 2;
   23808:	40 93 70 05 	sts	0x0570, r20	; 0x800570 <step_loops>
  else {
    step_loops = 1;
  }

  if(step_rate < (F_CPU/500000)) step_rate = (F_CPU/500000);
  step_rate -= (F_CPU/500000); // Correct for minimal speed
   2380c:	80 97       	sbiw	r24, 0x20	; 32
  if(step_rate >= (8*256)){ // higher step rate
   2380e:	81 15       	cp	r24, r1
   23810:	f8 e0       	ldi	r31, 0x08	; 8
   23812:	9f 07       	cpc	r25, r31
   23814:	08 f4       	brcc	.+2      	; 0x23818 <__vector_17+0x148>
   23816:	a4 c0       	rjmp	.+328    	; 0x23960 <__vector_17+0x290>
    unsigned short table_address = (unsigned short)&speed_lookuptable_fast[(unsigned char)(step_rate>>8)][0];
   23818:	e9 2f       	mov	r30, r25
   2381a:	ff 27       	eor	r31, r31
   2381c:	ee 0f       	add	r30, r30
   2381e:	ff 1f       	adc	r31, r31
   23820:	ee 0f       	add	r30, r30
   23822:	ff 1f       	adc	r31, r31
   23824:	af 01       	movw	r20, r30
   23826:	4c 56       	subi	r20, 0x6C	; 108
   23828:	50 47       	sbci	r21, 0x70	; 112
    unsigned char tmp_step_rate = (step_rate & 0x00ff);
    uint16_t gain = (uint16_t)pgm_read_word_near(table_address+2);
   2382a:	fa 01       	movw	r30, r20
   2382c:	32 96       	adiw	r30, 0x02	; 2
   2382e:	a5 91       	lpm	r26, Z+
   23830:	b4 91       	lpm	r27, Z
    timer = (unsigned short)pgm_read_word_near(table_address) - MUL8x16R8(tmp_step_rate, gain);
   23832:	fa 01       	movw	r30, r20
   23834:	45 91       	lpm	r20, Z+
   23836:	54 91       	lpm	r21, Z
    "clr r1" "\n\t"         //make r1 __zero_reg__ again
    "adc %B0, r1" "\n\t"    //propagate carry of addition (add 0 with carry)
    : "=&r" (out)
    : "r" (x), "r" (y)
    : "r0", "r1"            //clobbers: Technically these are either scratch registers or always 0 registers, but I'm making sure the compiler knows just in case.
    );
   23838:	b8 9f       	mul	r27, r24
   2383a:	b0 01       	movw	r22, r0
   2383c:	a8 9f       	mul	r26, r24
   2383e:	00 0c       	add	r0, r0
   23840:	61 1d       	adc	r22, r1
   23842:	11 24       	eor	r1, r1
   23844:	71 1d       	adc	r23, r1
  }
  else { // lower step rates
    unsigned short table_address = (unsigned short)&speed_lookuptable_slow[0][0];
    table_address += ((step_rate)>>1) & 0xfffc;
    timer = (unsigned short)pgm_read_word_near(table_address);
    timer -= (((unsigned short)pgm_read_word_near(table_address+2) * (unsigned char)(step_rate & 0x0007))>>3);
   23846:	46 1b       	sub	r20, r22
   23848:	57 0b       	sbc	r21, r23
    acceleration_time = calc_timer(acc_step_rate, step_loops);
   2384a:	ca 01       	movw	r24, r20
   2384c:	44 36       	cpi	r20, 0x64	; 100
   2384e:	51 05       	cpc	r21, r1
   23850:	10 f4       	brcc	.+4      	; 0x23856 <__vector_17+0x186>
   23852:	84 e6       	ldi	r24, 0x64	; 100
   23854:	90 e0       	ldi	r25, 0x00	; 0
   23856:	b0 e0       	ldi	r27, 0x00	; 0
   23858:	a0 e0       	ldi	r26, 0x00	; 0
   2385a:	80 93 6c 05 	sts	0x056C, r24	; 0x80056c <acceleration_time>
   2385e:	90 93 6d 05 	sts	0x056D, r25	; 0x80056d <acceleration_time+0x1>
   23862:	a0 93 6e 05 	sts	0x056E, r26	; 0x80056e <acceleration_time+0x2>
   23866:	b0 93 6f 05 	sts	0x056F, r27	; 0x80056f <acceleration_time+0x3>

#ifdef LIN_ADVANCE
    if (current_block->use_advance_lead) {
   2386a:	4e e6       	ldi	r20, 0x6E	; 110
   2386c:	42 9f       	mul	r20, r18
   2386e:	c0 01       	movw	r24, r0
   23870:	43 9f       	mul	r20, r19
   23872:	90 0d       	add	r25, r0
   23874:	11 24       	eor	r1, r1
   23876:	82 5a       	subi	r24, 0xA2	; 162
   23878:	99 4f       	sbci	r25, 0xF9	; 249
   2387a:	fc 01       	movw	r30, r24
   2387c:	e4 5b       	subi	r30, 0xB4	; 180
   2387e:	ff 4f       	sbci	r31, 0xFF	; 255
   23880:	40 81       	ld	r20, Z
   23882:	44 23       	and	r20, r20
   23884:	49 f0       	breq	.+18     	; 0x23898 <__vector_17+0x1c8>
        target_adv_steps = current_block->max_adv_steps;
   23886:	81 5b       	subi	r24, 0xB1	; 177
   23888:	9f 4f       	sbci	r25, 0xFF	; 255
   2388a:	dc 01       	movw	r26, r24
   2388c:	8d 91       	ld	r24, X+
   2388e:	9c 91       	ld	r25, X
   23890:	90 93 6b 05 	sts	0x056B, r25	; 0x80056b <target_adv_steps+0x1>
   23894:	80 93 6a 05 	sts	0x056A, r24	; 0x80056a <target_adv_steps>
    }
    e_steps = 0;
   23898:	10 92 69 05 	sts	0x0569, r1	; 0x800569 <e_steps>
    nextAdvanceISR = ADV_NEVER;
   2389c:	8f ef       	ldi	r24, 0xFF	; 255
   2389e:	9f ef       	ldi	r25, 0xFF	; 255
   238a0:	90 93 4d 04 	sts	0x044D, r25	; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1>
   238a4:	80 93 4c 04 	sts	0x044C, r24	; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439>
    LA_phase = -1;
   238a8:	80 93 68 05 	sts	0x0568, r24	; 0x800568 <LA_phase>
#endif

    if (current_block->flag & BLOCK_FLAG_E_RESET) {
   238ac:	8e e6       	ldi	r24, 0x6E	; 110
   238ae:	82 9f       	mul	r24, r18
   238b0:	f0 01       	movw	r30, r0
   238b2:	83 9f       	mul	r24, r19
   238b4:	f0 0d       	add	r31, r0
   238b6:	11 24       	eor	r1, r1
   238b8:	e2 5a       	subi	r30, 0xA2	; 162
   238ba:	f9 4f       	sbci	r31, 0xF9	; 249
   238bc:	85 a9       	ldd	r24, Z+53	; 0x35
   238be:	84 ff       	sbrs	r24, 4
   238c0:	08 c0       	rjmp	.+16     	; 0x238d2 <__vector_17+0x202>
        count_position[E_AXIS] = 0;
   238c2:	10 92 58 06 	sts	0x0658, r1	; 0x800658 <count_position+0xc>
   238c6:	10 92 59 06 	sts	0x0659, r1	; 0x800659 <count_position+0xd>
   238ca:	10 92 5a 06 	sts	0x065A, r1	; 0x80065a <count_position+0xe>
   238ce:	10 92 5b 06 	sts	0x065B, r1	; 0x80065b <count_position+0xf>
    }

    if (current_block->flag & BLOCK_FLAG_DDA_LOWRES) {
   238d2:	83 ff       	sbrs	r24, 3
   238d4:	61 c0       	rjmp	.+194    	; 0x23998 <__vector_17+0x2c8>
      const int16_t value = -(current_block->step_event_count.lo >> 1);
   238d6:	8e e6       	ldi	r24, 0x6E	; 110
   238d8:	82 9f       	mul	r24, r18
   238da:	f0 01       	movw	r30, r0
   238dc:	83 9f       	mul	r24, r19
   238de:	f0 0d       	add	r31, r0
   238e0:	11 24       	eor	r1, r1
   238e2:	e2 5a       	subi	r30, 0xA2	; 162
   238e4:	f9 4f       	sbci	r31, 0xF9	; 249
   238e6:	80 89       	ldd	r24, Z+16	; 0x10
   238e8:	91 89       	ldd	r25, Z+17	; 0x11
   238ea:	96 95       	lsr	r25
   238ec:	87 95       	ror	r24
   238ee:	91 95       	neg	r25
   238f0:	81 95       	neg	r24
   238f2:	91 09       	sbc	r25, r1
      for (uint8_t axis = 0; axis < NUM_AXIS; axis++)
      {
        counter[axis].lo = value;
   238f4:	90 93 59 05 	sts	0x0559, r25	; 0x800559 <counter+0x1>
   238f8:	80 93 58 05 	sts	0x0558, r24	; 0x800558 <counter>
   238fc:	90 93 5d 05 	sts	0x055D, r25	; 0x80055d <counter+0x5>
   23900:	80 93 5c 05 	sts	0x055C, r24	; 0x80055c <counter+0x4>
   23904:	90 93 61 05 	sts	0x0561, r25	; 0x800561 <counter+0x9>
   23908:	80 93 60 05 	sts	0x0560, r24	; 0x800560 <counter+0x8>
   2390c:	90 93 65 05 	sts	0x0565, r25	; 0x800565 <counter+0xd>
   23910:	80 93 64 05 	sts	0x0564, r24	; 0x800564 <counter+0xc>
      }
#ifdef LIN_ADVANCE
      e_extruding = current_block->steps[E_AXIS].lo != 0;
   23914:	81 e0       	ldi	r24, 0x01	; 1
   23916:	24 85       	ldd	r18, Z+12	; 0x0c
   23918:	35 85       	ldd	r19, Z+13	; 0x0d
   2391a:	23 2b       	or	r18, r19
   2391c:	09 f0       	breq	.+2      	; 0x23920 <__vector_17+0x250>
   2391e:	7d c0       	rjmp	.+250    	; 0x23a1a <__vector_17+0x34a>
      for (uint8_t axis = 0; axis < NUM_AXIS; axis++)
      {
        counter[axis].wide = value;
      }
#ifdef LIN_ADVANCE
      e_extruding = current_block->steps[E_AXIS].wide != 0;
   23920:	80 e0       	ldi	r24, 0x00	; 0
   23922:	7b c0       	rjmp	.+246    	; 0x23a1a <__vector_17+0x34a>
    if(nextAdvanceISR && nextAdvanceISR != ADV_NEVER)
    {
        if(nextAdvanceISR > OCR1A)
            nextAdvanceISR -= OCR1A;
        else
            nextAdvanceISR = 0;
   23924:	10 92 4d 04 	sts	0x044D, r1	; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1>
   23928:	10 92 4c 04 	sts	0x044C, r1	; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439>
   2392c:	0c cf       	rjmp	.-488    	; 0x23746 <__vector_17+0x76>
    }
    if(nextMainISR > OCR1A)
        nextMainISR -= OCR1A;
    else
        nextMainISR = 0;
   2392e:	10 92 4f 04 	sts	0x044F, r1	; 0x80044f <_ZL11nextMainISR.lto_priv.438+0x1>
   23932:	10 92 4e 04 	sts	0x044E, r1	; 0x80044e <_ZL11nextMainISR.lto_priv.438>
   23936:	1d cf       	rjmp	.-454    	; 0x23772 <__vector_17+0xa2>
#endif //_NO_ASM


FORCE_INLINE unsigned short calc_timer(uint16_t step_rate, uint8_t& step_loops) {
  uint16_t timer;
  if(step_rate > MAX_STEP_FREQUENCY) step_rate = MAX_STEP_FREQUENCY;
   23938:	80 e4       	ldi	r24, 0x40	; 64
   2393a:	9c e9       	ldi	r25, 0x9C	; 156
   2393c:	60 cf       	rjmp	.-320    	; 0x237fe <__vector_17+0x12e>

  if(step_rate > 20000) { // If steprate > 20kHz >> step 4 times
    step_rate = (step_rate >> 2)&0x3fff;
    step_loops = 4;
  }
  else if(step_rate > 10000) { // If steprate > 10kHz >> step 2 times
   2393e:	81 31       	cpi	r24, 0x11	; 17
   23940:	e7 e2       	ldi	r30, 0x27	; 39
   23942:	9e 07       	cpc	r25, r30
   23944:	20 f0       	brcs	.+8      	; 0x2394e <__vector_17+0x27e>
    step_rate = (step_rate >> 1)&0x7fff;
   23946:	96 95       	lsr	r25
   23948:	87 95       	ror	r24
    step_loops = 2;
   2394a:	42 e0       	ldi	r20, 0x02	; 2
   2394c:	5d cf       	rjmp	.-326    	; 0x23808 <__vector_17+0x138>
  }
  else {
    step_loops = 1;
   2394e:	40 93 70 05 	sts	0x0570, r20	; 0x800570 <step_loops>
   23952:	80 32       	cpi	r24, 0x20	; 32
   23954:	91 05       	cpc	r25, r1
   23956:	08 f0       	brcs	.+2      	; 0x2395a <__vector_17+0x28a>
   23958:	59 cf       	rjmp	.-334    	; 0x2380c <__vector_17+0x13c>
   2395a:	80 e2       	ldi	r24, 0x20	; 32
   2395c:	90 e0       	ldi	r25, 0x00	; 0
   2395e:	56 cf       	rjmp	.-340    	; 0x2380c <__vector_17+0x13c>
    uint16_t gain = (uint16_t)pgm_read_word_near(table_address+2);
    timer = (unsigned short)pgm_read_word_near(table_address) - MUL8x16R8(tmp_step_rate, gain);
  }
  else { // lower step rates
    unsigned short table_address = (unsigned short)&speed_lookuptable_slow[0][0];
    table_address += ((step_rate)>>1) & 0xfffc;
   23960:	bc 01       	movw	r22, r24
   23962:	76 95       	lsr	r23
   23964:	67 95       	ror	r22
   23966:	6c 7f       	andi	r22, 0xFC	; 252
   23968:	6c 56       	subi	r22, 0x6C	; 108
   2396a:	74 47       	sbci	r23, 0x74	; 116
    timer = (unsigned short)pgm_read_word_near(table_address);
   2396c:	fb 01       	movw	r30, r22
   2396e:	45 91       	lpm	r20, Z+
   23970:	54 91       	lpm	r21, Z
    timer -= (((unsigned short)pgm_read_word_near(table_address+2) * (unsigned char)(step_rate & 0x0007))>>3);
   23972:	fb 01       	movw	r30, r22
   23974:	32 96       	adiw	r30, 0x02	; 2
   23976:	a5 91       	lpm	r26, Z+
   23978:	b4 91       	lpm	r27, Z
   2397a:	87 70       	andi	r24, 0x07	; 7
   2397c:	99 27       	eor	r25, r25
   2397e:	8a 9f       	mul	r24, r26
   23980:	b0 01       	movw	r22, r0
   23982:	8b 9f       	mul	r24, r27
   23984:	70 0d       	add	r23, r0
   23986:	9a 9f       	mul	r25, r26
   23988:	70 0d       	add	r23, r0
   2398a:	11 24       	eor	r1, r1
   2398c:	e3 e0       	ldi	r30, 0x03	; 3
   2398e:	76 95       	lsr	r23
   23990:	67 95       	ror	r22
   23992:	ea 95       	dec	r30
   23994:	e1 f7       	brne	.-8      	; 0x2398e <__vector_17+0x2be>
   23996:	57 cf       	rjmp	.-338    	; 0x23846 <__vector_17+0x176>
      }
#ifdef LIN_ADVANCE
      e_extruding = current_block->steps[E_AXIS].lo != 0;
#endif
    } else {
      const int32_t value = -(current_block->step_event_count.wide >> 1);
   23998:	8e e6       	ldi	r24, 0x6E	; 110
   2399a:	82 9f       	mul	r24, r18
   2399c:	f0 01       	movw	r30, r0
   2399e:	83 9f       	mul	r24, r19
   239a0:	f0 0d       	add	r31, r0
   239a2:	11 24       	eor	r1, r1
   239a4:	e2 5a       	subi	r30, 0xA2	; 162
   239a6:	f9 4f       	sbci	r31, 0xF9	; 249
   239a8:	80 89       	ldd	r24, Z+16	; 0x10
   239aa:	91 89       	ldd	r25, Z+17	; 0x11
   239ac:	a2 89       	ldd	r26, Z+18	; 0x12
   239ae:	b3 89       	ldd	r27, Z+19	; 0x13
   239b0:	b6 95       	lsr	r27
   239b2:	a7 95       	ror	r26
   239b4:	97 95       	ror	r25
   239b6:	87 95       	ror	r24
   239b8:	b0 95       	com	r27
   239ba:	a0 95       	com	r26
   239bc:	90 95       	com	r25
   239be:	81 95       	neg	r24
   239c0:	9f 4f       	sbci	r25, 0xFF	; 255
   239c2:	af 4f       	sbci	r26, 0xFF	; 255
   239c4:	bf 4f       	sbci	r27, 0xFF	; 255
      for (uint8_t axis = 0; axis < NUM_AXIS; axis++)
      {
        counter[axis].wide = value;
   239c6:	80 93 58 05 	sts	0x0558, r24	; 0x800558 <counter>
   239ca:	90 93 59 05 	sts	0x0559, r25	; 0x800559 <counter+0x1>
   239ce:	a0 93 5a 05 	sts	0x055A, r26	; 0x80055a <counter+0x2>
   239d2:	b0 93 5b 05 	sts	0x055B, r27	; 0x80055b <counter+0x3>
   239d6:	80 93 5c 05 	sts	0x055C, r24	; 0x80055c <counter+0x4>
   239da:	90 93 5d 05 	sts	0x055D, r25	; 0x80055d <counter+0x5>
   239de:	a0 93 5e 05 	sts	0x055E, r26	; 0x80055e <counter+0x6>
   239e2:	b0 93 5f 05 	sts	0x055F, r27	; 0x80055f <counter+0x7>
   239e6:	80 93 60 05 	sts	0x0560, r24	; 0x800560 <counter+0x8>
   239ea:	90 93 61 05 	sts	0x0561, r25	; 0x800561 <counter+0x9>
   239ee:	a0 93 62 05 	sts	0x0562, r26	; 0x800562 <counter+0xa>
   239f2:	b0 93 63 05 	sts	0x0563, r27	; 0x800563 <counter+0xb>
   239f6:	80 93 64 05 	sts	0x0564, r24	; 0x800564 <counter+0xc>
   239fa:	90 93 65 05 	sts	0x0565, r25	; 0x800565 <counter+0xd>
   239fe:	a0 93 66 05 	sts	0x0566, r26	; 0x800566 <counter+0xe>
   23a02:	b0 93 67 05 	sts	0x0567, r27	; 0x800567 <counter+0xf>
      }
#ifdef LIN_ADVANCE
      e_extruding = current_block->steps[E_AXIS].wide != 0;
   23a06:	81 e0       	ldi	r24, 0x01	; 1
   23a08:	44 85       	ldd	r20, Z+12	; 0x0c
   23a0a:	55 85       	ldd	r21, Z+13	; 0x0d
   23a0c:	66 85       	ldd	r22, Z+14	; 0x0e
   23a0e:	77 85       	ldd	r23, Z+15	; 0x0f
   23a10:	45 2b       	or	r20, r21
   23a12:	46 2b       	or	r20, r22
   23a14:	47 2b       	or	r20, r23
   23a16:	09 f4       	brne	.+2      	; 0x23a1a <__vector_17+0x34a>
   23a18:	83 cf       	rjmp	.-250    	; 0x23920 <__vector_17+0x250>
   23a1a:	80 93 57 05 	sts	0x0557, r24	; 0x800557 <e_extruding>
#endif
    }
    step_events_completed.wide = 0;
   23a1e:	10 92 53 05 	sts	0x0553, r1	; 0x800553 <step_events_completed>
   23a22:	10 92 54 05 	sts	0x0554, r1	; 0x800554 <step_events_completed+0x1>
   23a26:	10 92 55 05 	sts	0x0555, r1	; 0x800555 <step_events_completed+0x2>
   23a2a:	10 92 56 05 	sts	0x0556, r1	; 0x800556 <step_events_completed+0x3>
    // Set directions.
    out_bits = current_block->direction_bits;
   23a2e:	88 8d       	ldd	r24, Y+24	; 0x18
   23a30:	80 93 52 05 	sts	0x0552, r24	; 0x800552 <out_bits>
    // Set the direction bits (X_AXIS=A_AXIS and Y_AXIS=B_AXIS for COREXY)
    if((out_bits & (1<<X_AXIS))!=0){
   23a34:	80 ff       	sbrs	r24, 0
   23a36:	d1 c1       	rjmp	.+930    	; 0x23dda <__vector_17+0x70a>
      WRITE_NC(X_DIR_PIN, INVERT_X_DIR);
   23a38:	80 91 0b 01 	lds	r24, 0x010B	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
   23a3c:	8d 7f       	andi	r24, 0xFD	; 253
   23a3e:	80 93 0b 01 	sts	0x010B, r24	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
      count_direction[X_AXIS]=-1;
   23a42:	8f ef       	ldi	r24, 0xFF	; 255
    } else {
      WRITE_NC(X_DIR_PIN, !INVERT_X_DIR);
      count_direction[X_AXIS]=1;
   23a44:	80 93 5b 02 	sts	0x025B, r24	; 0x80025b <count_direction>
    }
    if((out_bits & (1<<Y_AXIS))!=0){
   23a48:	80 91 52 05 	lds	r24, 0x0552	; 0x800552 <out_bits>
   23a4c:	81 ff       	sbrs	r24, 1
   23a4e:	cc c1       	rjmp	.+920    	; 0x23de8 <__vector_17+0x718>
      WRITE_NC(Y_DIR_PIN, INVERT_Y_DIR);
   23a50:	80 91 0b 01 	lds	r24, 0x010B	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
   23a54:	8e 7f       	andi	r24, 0xFE	; 254
   23a56:	80 93 0b 01 	sts	0x010B, r24	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
      count_direction[Y_AXIS]=-1;
   23a5a:	8f ef       	ldi	r24, 0xFF	; 255
    } else {
      WRITE_NC(Y_DIR_PIN, !INVERT_Y_DIR);
      count_direction[Y_AXIS]=1;
   23a5c:	80 93 5c 02 	sts	0x025C, r24	; 0x80025c <count_direction+0x1>
    }
    if ((out_bits & (1<<Z_AXIS)) != 0) {   // -direction
   23a60:	80 91 52 05 	lds	r24, 0x0552	; 0x800552 <out_bits>
   23a64:	82 ff       	sbrs	r24, 2
   23a66:	c7 c1       	rjmp	.+910    	; 0x23df6 <__vector_17+0x726>
      WRITE_NC(Z_DIR_PIN,INVERT_Z_DIR);
   23a68:	80 91 0b 01 	lds	r24, 0x010B	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
   23a6c:	8b 7f       	andi	r24, 0xFB	; 251
   23a6e:	80 93 0b 01 	sts	0x010B, r24	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
      count_direction[Z_AXIS]=-1;
   23a72:	8f ef       	ldi	r24, 0xFF	; 255
    } else { // +direction
      WRITE_NC(Z_DIR_PIN,!INVERT_Z_DIR);
      count_direction[Z_AXIS]=1;
   23a74:	80 93 5d 02 	sts	0x025D, r24	; 0x80025d <count_direction+0x2>
    }
    if ((out_bits & (1 << E_AXIS)) != 0) { // -direction
   23a78:	80 91 52 05 	lds	r24, 0x0552	; 0x800552 <out_bits>
   23a7c:	83 ff       	sbrs	r24, 3
   23a7e:	c2 c1       	rjmp	.+900    	; 0x23e04 <__vector_17+0x734>
#ifndef LIN_ADVANCE
      WRITE(E0_DIR_PIN, INVERT_E0_DIR);
#endif /* LIN_ADVANCE */
      count_direction[E_AXIS] = -1;
   23a80:	8f ef       	ldi	r24, 0xFF	; 255
    } else { // +direction
#ifndef LIN_ADVANCE
      WRITE(E0_DIR_PIN, !INVERT_E0_DIR);
#endif /* LIN_ADVANCE */
      count_direction[E_AXIS] = 1;
   23a82:	80 93 5e 02 	sts	0x025E, r24	; 0x80025e <count_direction+0x3>
	//if (UVLO) uvlo();
  // If there is no current block, attempt to pop one from the buffer
  if (current_block == NULL)
    stepper_next_block();

  if (current_block != NULL)
   23a86:	e0 91 51 12 	lds	r30, 0x1251	; 0x801251 <current_block>
   23a8a:	f0 91 52 12 	lds	r31, 0x1252	; 0x801252 <current_block+0x1>
   23a8e:	30 97       	sbiw	r30, 0x00	; 0
   23a90:	09 f4       	brne	.+2      	; 0x23a94 <__vector_17+0x3c4>
   23a92:	09 c7       	rjmp	.+3602   	; 0x248a6 <__vector_17+0x11d6>
}

// Check limit switches.
FORCE_INLINE void stepper_check_endstops()
{
  if(check_endstops)
   23a94:	80 91 77 02 	lds	r24, 0x0277	; 0x800277 <_ZL14check_endstops.lto_priv.387>
   23a98:	50 91 4f 05 	lds	r21, 0x054F	; 0x80054f <check_z_endstop>
   23a9c:	88 23       	and	r24, r24
   23a9e:	09 f4       	brne	.+2      	; 0x23aa2 <__vector_17+0x3d2>
   23aa0:	6c c0       	rjmp	.+216    	; 0x23b7a <__vector_17+0x4aa>
  {
    uint8_t _endstop_hit = endstop_hit;
   23aa2:	20 91 5e 04 	lds	r18, 0x045E	; 0x80045e <_ZL11endstop_hit.lto_priv.442>
    uint8_t _endstop = endstop;
   23aa6:	80 91 51 05 	lds	r24, 0x0551	; 0x800551 <endstop>
    uint8_t _old_endstop = old_endstop;
   23aaa:	90 91 50 05 	lds	r25, 0x0550	; 0x800550 <old_endstop>
    #ifndef COREXY
    if ((out_bits & (1<<X_AXIS)) != 0) // stepping along -X axis
   23aae:	30 91 52 05 	lds	r19, 0x0552	; 0x800552 <out_bits>
   23ab2:	30 ff       	sbrs	r19, 0
   23ab4:	1d c0       	rjmp	.+58     	; 0x23af0 <__vector_17+0x420>
      #ifdef TMC2130_SG_HOMING
        // Stall guard homing turned on
        SET_BIT_TO(_endstop, X_AXIS, (!READ(X_TMC2130_DIAG)));
      #else
        // Normal homing
        SET_BIT_TO(_endstop, X_AXIS, (READ(X_MIN_PIN) != X_MIN_ENDSTOP_INVERTING));
   23ab6:	1e 9b       	sbis	0x03, 6	; 3
   23ab8:	c6 c1       	rjmp	.+908    	; 0x23e46 <__vector_17+0x776>
   23aba:	81 60       	ori	r24, 0x01	; 1
      #endif
        if((_endstop & _old_endstop & _BV(X_AXIS)) && (current_block->steps[X_AXIS].wide > 0)) {
   23abc:	49 2f       	mov	r20, r25
   23abe:	41 70       	andi	r20, 0x01	; 1
   23ac0:	48 23       	and	r20, r24
   23ac2:	b1 f0       	breq	.+44     	; 0x23af0 <__vector_17+0x420>
   23ac4:	c0 80       	ld	r12, Z
   23ac6:	d1 80       	ldd	r13, Z+1	; 0x01
   23ac8:	e2 80       	ldd	r14, Z+2	; 0x02
   23aca:	f3 80       	ldd	r15, Z+3	; 0x03
   23acc:	1c 14       	cp	r1, r12
   23ace:	1d 04       	cpc	r1, r13
   23ad0:	1e 04       	cpc	r1, r14
   23ad2:	1f 04       	cpc	r1, r15
   23ad4:	6c f4       	brge	.+26     	; 0x23af0 <__vector_17+0x420>
#ifdef VERBOSE_CHECK_HIT_ENDSTOPS
          endstops_trigsteps[X_AXIS] = count_position[X_AXIS];
#endif //VERBOSE_CHECK_HIT_ENDSTOPS
          _endstop_hit |= _BV(X_AXIS);
   23ad6:	21 60       	ori	r18, 0x01	; 1
          step_events_completed.wide = current_block->step_event_count.wide;
   23ad8:	c0 88       	ldd	r12, Z+16	; 0x10
   23ada:	d1 88       	ldd	r13, Z+17	; 0x11
   23adc:	e2 88       	ldd	r14, Z+18	; 0x12
   23ade:	f3 88       	ldd	r15, Z+19	; 0x13
   23ae0:	c0 92 53 05 	sts	0x0553, r12	; 0x800553 <step_events_completed>
   23ae4:	d0 92 54 05 	sts	0x0554, r13	; 0x800554 <step_events_completed+0x1>
   23ae8:	e0 92 55 05 	sts	0x0555, r14	; 0x800555 <step_events_completed+0x2>
   23aec:	f0 92 56 05 	sts	0x0556, r15	; 0x800556 <step_events_completed+0x3>
        }
      #endif
    }

    #ifndef COREXY
    if ((out_bits & (1<<Y_AXIS)) != 0) // -direction
   23af0:	31 ff       	sbrs	r19, 1
   23af2:	1d c0       	rjmp	.+58     	; 0x23b2e <__vector_17+0x45e>
      #ifdef TMC2130_SG_HOMING
      // Stall guard homing turned on
        SET_BIT_TO(_endstop, Y_AXIS, (!READ(Y_TMC2130_DIAG)));
      #else
      // Normal homing
        SET_BIT_TO(_endstop, Y_AXIS, (READ(Y_MIN_PIN) != Y_MIN_ENDSTOP_INVERTING));
   23af4:	1d 9b       	sbis	0x03, 5	; 3
   23af6:	a9 c1       	rjmp	.+850    	; 0x23e4a <__vector_17+0x77a>
   23af8:	82 60       	ori	r24, 0x02	; 2
      #endif
        if((_endstop & _old_endstop & _BV(Y_AXIS)) && (current_block->steps[Y_AXIS].wide > 0)) {
   23afa:	49 2f       	mov	r20, r25
   23afc:	42 70       	andi	r20, 0x02	; 2
   23afe:	48 23       	and	r20, r24
   23b00:	b1 f0       	breq	.+44     	; 0x23b2e <__vector_17+0x45e>
   23b02:	c4 80       	ldd	r12, Z+4	; 0x04
   23b04:	d5 80       	ldd	r13, Z+5	; 0x05
   23b06:	e6 80       	ldd	r14, Z+6	; 0x06
   23b08:	f7 80       	ldd	r15, Z+7	; 0x07
   23b0a:	1c 14       	cp	r1, r12
   23b0c:	1d 04       	cpc	r1, r13
   23b0e:	1e 04       	cpc	r1, r14
   23b10:	1f 04       	cpc	r1, r15
   23b12:	6c f4       	brge	.+26     	; 0x23b2e <__vector_17+0x45e>
#ifdef VERBOSE_CHECK_HIT_ENDSTOPS
          endstops_trigsteps[Y_AXIS] = count_position[Y_AXIS];
#endif //VERBOSE_CHECK_HIT_ENDSTOPS
          _endstop_hit |= _BV(Y_AXIS);
   23b14:	22 60       	ori	r18, 0x02	; 2
          step_events_completed.wide = current_block->step_event_count.wide;
   23b16:	c0 88       	ldd	r12, Z+16	; 0x10
   23b18:	d1 88       	ldd	r13, Z+17	; 0x11
   23b1a:	e2 88       	ldd	r14, Z+18	; 0x12
   23b1c:	f3 88       	ldd	r15, Z+19	; 0x13
   23b1e:	c0 92 53 05 	sts	0x0553, r12	; 0x800553 <step_events_completed>
   23b22:	d0 92 54 05 	sts	0x0554, r13	; 0x800554 <step_events_completed+0x1>
   23b26:	e0 92 55 05 	sts	0x0555, r14	; 0x800555 <step_events_completed+0x2>
   23b2a:	f0 92 56 05 	sts	0x0556, r15	; 0x800556 <step_events_completed+0x3>
          step_events_completed.wide = current_block->step_event_count.wide;
        }
      #endif
    }

    if ((out_bits & (1<<Z_AXIS)) != 0) // -direction
   23b2e:	32 ff       	sbrs	r19, 2
   23b30:	90 c1       	rjmp	.+800    	; 0x23e52 <__vector_17+0x782>
    {
      #if defined(Z_MIN_PIN) && (Z_MIN_PIN > -1) && !defined(DEBUG_DISABLE_ZMINLIMIT)
      if (! check_z_endstop) {
   23b32:	51 11       	cpse	r21, r1
   23b34:	1c c0       	rjmp	.+56     	; 0x23b6e <__vector_17+0x49e>
            SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING));
          else
#endif //TMC2130_STEALTH_Z
            SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING) || (!READ(Z_TMC2130_DIAG)));
        #else
          SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING));
   23b36:	1c 9b       	sbis	0x03, 4	; 3
   23b38:	8a c1       	rjmp	.+788    	; 0x23e4e <__vector_17+0x77e>
   23b3a:	84 60       	ori	r24, 0x04	; 4
        #endif //TMC2130_SG_HOMING
        if((_endstop & _old_endstop & _BV(Z_AXIS)) && (current_block->steps[Z_AXIS].wide > 0)) {
   23b3c:	94 70       	andi	r25, 0x04	; 4
#endif //TMC2130_STEALTH_Z
          SET_BIT_TO(_endstop, Z_AXIS + 4, (!READ(Z_TMC2130_DIAG)));
        #else
        SET_BIT_TO(_endstop, Z_AXIS + 4, (READ(Z_MAX_PIN) != Z_MAX_ENDSTOP_INVERTING));
        #endif //TMC2130_SG_HOMING
        if((_endstop & _old_endstop & _BV(Z_AXIS + 4)) && (current_block->steps[Z_AXIS].wide > 0)) {
   23b3e:	98 23       	and	r25, r24
   23b40:	b1 f0       	breq	.+44     	; 0x23b6e <__vector_17+0x49e>
   23b42:	c0 84       	ldd	r12, Z+8	; 0x08
   23b44:	d1 84       	ldd	r13, Z+9	; 0x09
   23b46:	e2 84       	ldd	r14, Z+10	; 0x0a
   23b48:	f3 84       	ldd	r15, Z+11	; 0x0b
   23b4a:	1c 14       	cp	r1, r12
   23b4c:	1d 04       	cpc	r1, r13
   23b4e:	1e 04       	cpc	r1, r14
   23b50:	1f 04       	cpc	r1, r15
   23b52:	6c f4       	brge	.+26     	; 0x23b6e <__vector_17+0x49e>
#ifdef VERBOSE_CHECK_HIT_ENDSTOPS
          endstops_trigsteps[Z_AXIS] = count_position[Z_AXIS];
#endif //VERBOSE_CHECK_HIT_ENDSTOPS
          _endstop_hit |= _BV(Z_AXIS);
   23b54:	24 60       	ori	r18, 0x04	; 4
          step_events_completed.wide = current_block->step_event_count.wide;
   23b56:	c0 88       	ldd	r12, Z+16	; 0x10
   23b58:	d1 88       	ldd	r13, Z+17	; 0x11
   23b5a:	e2 88       	ldd	r14, Z+18	; 0x12
   23b5c:	f3 88       	ldd	r15, Z+19	; 0x13
   23b5e:	c0 92 53 05 	sts	0x0553, r12	; 0x800553 <step_events_completed>
   23b62:	d0 92 54 05 	sts	0x0554, r13	; 0x800554 <step_events_completed+0x1>
   23b66:	e0 92 55 05 	sts	0x0555, r14	; 0x800555 <step_events_completed+0x2>
   23b6a:	f0 92 56 05 	sts	0x0556, r15	; 0x800556 <step_events_completed+0x3>
        }
      #endif
    }
    endstop = _endstop;
   23b6e:	80 93 51 05 	sts	0x0551, r24	; 0x800551 <endstop>
    old_endstop = _endstop; //apply current endstop state to the old endstop
   23b72:	80 93 50 05 	sts	0x0550, r24	; 0x800550 <old_endstop>
    endstop_hit = _endstop_hit;
   23b76:	20 93 5e 04 	sts	0x045E, r18	; 0x80045e <_ZL11endstop_hit.lto_priv.442>
  }

  // Supporting stopping on a trigger of the Z-stop induction sensor, not only for the Z-minus movements.
  #if defined(Z_MIN_PIN) && (Z_MIN_PIN > -1) && !defined(DEBUG_DISABLE_ZMINLIMIT)
  if (check_z_endstop) {
   23b7a:	55 23       	and	r21, r21
   23b7c:	f9 f0       	breq	.+62     	; 0x23bbc <__vector_17+0x4ec>
      uint8_t _endstop_hit = endstop_hit;
   23b7e:	20 91 5e 04 	lds	r18, 0x045E	; 0x80045e <_ZL11endstop_hit.lto_priv.442>
      uint8_t _endstop = endstop;
   23b82:	80 91 51 05 	lds	r24, 0x0551	; 0x800551 <endstop>
      uint8_t _old_endstop = old_endstop;
   23b86:	90 91 50 05 	lds	r25, 0x0550	; 0x800550 <old_endstop>
        SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING));
      else
#endif //TMC2130_STEALTH_Z
        SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING) || (!READ(Z_TMC2130_DIAG)));
      #else
      SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING));
   23b8a:	1c 9b       	sbis	0x03, 4	; 3
   23b8c:	69 c1       	rjmp	.+722    	; 0x23e60 <__vector_17+0x790>
   23b8e:	84 60       	ori	r24, 0x04	; 4
      #endif //TMC2130_SG_HOMING
      if(_endstop & _old_endstop & _BV(Z_AXIS)) {
   23b90:	94 70       	andi	r25, 0x04	; 4
   23b92:	98 23       	and	r25, r24
   23b94:	69 f0       	breq	.+26     	; 0x23bb0 <__vector_17+0x4e0>
#ifdef VERBOSE_CHECK_HIT_ENDSTOPS
        endstops_trigsteps[Z_AXIS] = count_position[Z_AXIS];
#endif //VERBOSE_CHECK_HIT_ENDSTOPS
        _endstop_hit |= _BV(Z_AXIS);
   23b96:	24 60       	ori	r18, 0x04	; 4
        step_events_completed.wide = current_block->step_event_count.wide;
   23b98:	40 89       	ldd	r20, Z+16	; 0x10
   23b9a:	51 89       	ldd	r21, Z+17	; 0x11
   23b9c:	62 89       	ldd	r22, Z+18	; 0x12
   23b9e:	73 89       	ldd	r23, Z+19	; 0x13
   23ba0:	40 93 53 05 	sts	0x0553, r20	; 0x800553 <step_events_completed>
   23ba4:	50 93 54 05 	sts	0x0554, r21	; 0x800554 <step_events_completed+0x1>
   23ba8:	60 93 55 05 	sts	0x0555, r22	; 0x800555 <step_events_completed+0x2>
   23bac:	70 93 56 05 	sts	0x0556, r23	; 0x800556 <step_events_completed+0x3>
      }
      endstop = _endstop;
   23bb0:	80 93 51 05 	sts	0x0551, r24	; 0x800551 <endstop>
      old_endstop = _endstop; //apply current endstop state to the old endstop
   23bb4:	80 93 50 05 	sts	0x0550, r24	; 0x800550 <old_endstop>
      endstop_hit = _endstop_hit;
   23bb8:	20 93 5e 04 	sts	0x045E, r18	; 0x80045e <_ZL11endstop_hit.lto_priv.442>
    stepper_next_block();

  if (current_block != NULL)
  {
    stepper_check_endstops();
    if (current_block->flag & BLOCK_FLAG_DDA_LOWRES)
   23bbc:	85 a9       	ldd	r24, Z+53	; 0x35
}


FORCE_INLINE void stepper_tick_lowres()
{
  for (uint8_t i=0; i < step_loops; ++ i) { // Take multiple steps per interrupt (For high speed moves)
   23bbe:	c0 e0       	ldi	r28, 0x00	; 0
    stepper_next_block();

  if (current_block != NULL)
  {
    stepper_check_endstops();
    if (current_block->flag & BLOCK_FLAG_DDA_LOWRES)
   23bc0:	83 ff       	sbrs	r24, 3
   23bc2:	50 c1       	rjmp	.+672    	; 0x23e64 <__vector_17+0x794>
}


FORCE_INLINE void stepper_tick_lowres()
{
  for (uint8_t i=0; i < step_loops; ++ i) { // Take multiple steps per interrupt (For high speed moves)
   23bc4:	80 91 70 05 	lds	r24, 0x0570	; 0x800570 <step_loops>
   23bc8:	c8 17       	cp	r28, r24
   23bca:	08 f0       	brcs	.+2      	; 0x23bce <__vector_17+0x4fe>
   23bcc:	bd c2       	rjmp	.+1402   	; 0x24148 <__vector_17+0xa78>
    MSerial.checkRx(); // Check for serial chars.
   23bce:	0f 94 1f 03 	call	0x2063e	; 0x2063e <MarlinSerial::checkRx()>
    // Step in X axis
    counter[X_AXIS].lo += current_block->steps[X_AXIS].lo;
   23bd2:	e0 91 51 12 	lds	r30, 0x1251	; 0x801251 <current_block>
   23bd6:	f0 91 52 12 	lds	r31, 0x1252	; 0x801252 <current_block+0x1>
   23bda:	80 81       	ld	r24, Z
   23bdc:	91 81       	ldd	r25, Z+1	; 0x01
   23bde:	20 91 58 05 	lds	r18, 0x0558	; 0x800558 <counter>
   23be2:	30 91 59 05 	lds	r19, 0x0559	; 0x800559 <counter+0x1>
   23be6:	82 0f       	add	r24, r18
   23be8:	93 1f       	adc	r25, r19
   23bea:	90 93 59 05 	sts	0x0559, r25	; 0x800559 <counter+0x1>
   23bee:	80 93 58 05 	sts	0x0558, r24	; 0x800558 <counter>
    if (counter[X_AXIS].lo > 0) {
   23bf2:	18 16       	cp	r1, r24
   23bf4:	19 06       	cpc	r1, r25
   23bf6:	6c f5       	brge	.+90     	; 0x23c52 <__vector_17+0x582>
      STEP_NC_HI(X_AXIS);
   23bf8:	40 9a       	sbi	0x08, 0	; 8
#ifdef DEBUG_XSTEP_DUP_PIN
      STEP_NC_HI(X_DUP_AXIS);
#endif //DEBUG_XSTEP_DUP_PIN
      counter[X_AXIS].lo -= current_block->step_event_count.lo;
   23bfa:	e0 91 51 12 	lds	r30, 0x1251	; 0x801251 <current_block>
   23bfe:	f0 91 52 12 	lds	r31, 0x1252	; 0x801252 <current_block+0x1>
   23c02:	80 91 58 05 	lds	r24, 0x0558	; 0x800558 <counter>
   23c06:	90 91 59 05 	lds	r25, 0x0559	; 0x800559 <counter+0x1>
   23c0a:	20 89       	ldd	r18, Z+16	; 0x10
   23c0c:	31 89       	ldd	r19, Z+17	; 0x11
   23c0e:	82 1b       	sub	r24, r18
   23c10:	93 0b       	sbc	r25, r19
   23c12:	90 93 59 05 	sts	0x0559, r25	; 0x800559 <counter+0x1>
   23c16:	80 93 58 05 	sts	0x0558, r24	; 0x800558 <counter>
      count_position[X_AXIS]+=count_direction[X_AXIS];
   23c1a:	90 91 5b 02 	lds	r25, 0x025B	; 0x80025b <count_direction>
   23c1e:	40 91 4c 06 	lds	r20, 0x064C	; 0x80064c <count_position>
   23c22:	50 91 4d 06 	lds	r21, 0x064D	; 0x80064d <count_position+0x1>
   23c26:	60 91 4e 06 	lds	r22, 0x064E	; 0x80064e <count_position+0x2>
   23c2a:	70 91 4f 06 	lds	r23, 0x064F	; 0x80064f <count_position+0x3>
   23c2e:	89 2f       	mov	r24, r25
   23c30:	99 0f       	add	r25, r25
   23c32:	99 0b       	sbc	r25, r25
   23c34:	aa 0b       	sbc	r26, r26
   23c36:	bb 0b       	sbc	r27, r27
   23c38:	84 0f       	add	r24, r20
   23c3a:	95 1f       	adc	r25, r21
   23c3c:	a6 1f       	adc	r26, r22
   23c3e:	b7 1f       	adc	r27, r23
   23c40:	80 93 4c 06 	sts	0x064C, r24	; 0x80064c <count_position>
   23c44:	90 93 4d 06 	sts	0x064D, r25	; 0x80064d <count_position+0x1>
   23c48:	a0 93 4e 06 	sts	0x064E, r26	; 0x80064e <count_position+0x2>
   23c4c:	b0 93 4f 06 	sts	0x064F, r27	; 0x80064f <count_position+0x3>
      STEP_NC_LO(X_AXIS);
   23c50:	40 98       	cbi	0x08, 0	; 8
#ifdef DEBUG_XSTEP_DUP_PIN
      STEP_NC_LO(X_DUP_AXIS);
#endif //DEBUG_XSTEP_DUP_PIN
    }
    // Step in Y axis
    counter[Y_AXIS].lo += current_block->steps[Y_AXIS].lo;
   23c52:	e0 91 51 12 	lds	r30, 0x1251	; 0x801251 <current_block>
   23c56:	f0 91 52 12 	lds	r31, 0x1252	; 0x801252 <current_block+0x1>
   23c5a:	84 81       	ldd	r24, Z+4	; 0x04
   23c5c:	95 81       	ldd	r25, Z+5	; 0x05
   23c5e:	20 91 5c 05 	lds	r18, 0x055C	; 0x80055c <counter+0x4>
   23c62:	30 91 5d 05 	lds	r19, 0x055D	; 0x80055d <counter+0x5>
   23c66:	82 0f       	add	r24, r18
   23c68:	93 1f       	adc	r25, r19
   23c6a:	90 93 5d 05 	sts	0x055D, r25	; 0x80055d <counter+0x5>
   23c6e:	80 93 5c 05 	sts	0x055C, r24	; 0x80055c <counter+0x4>
    if (counter[Y_AXIS].lo > 0) {
   23c72:	18 16       	cp	r1, r24
   23c74:	19 06       	cpc	r1, r25
   23c76:	4c f5       	brge	.+82     	; 0x23cca <__vector_17+0x5fa>
      STEP_NC_HI(Y_AXIS);
   23c78:	41 9a       	sbi	0x08, 1	; 8
#ifdef DEBUG_YSTEP_DUP_PIN
      STEP_NC_HI(Y_DUP_AXIS);
#endif //DEBUG_YSTEP_DUP_PIN
      counter[Y_AXIS].lo -= current_block->step_event_count.lo;
   23c7a:	e0 91 51 12 	lds	r30, 0x1251	; 0x801251 <current_block>
   23c7e:	f0 91 52 12 	lds	r31, 0x1252	; 0x801252 <current_block+0x1>
   23c82:	20 89       	ldd	r18, Z+16	; 0x10
   23c84:	31 89       	ldd	r19, Z+17	; 0x11
   23c86:	82 1b       	sub	r24, r18
   23c88:	93 0b       	sbc	r25, r19
   23c8a:	90 93 5d 05 	sts	0x055D, r25	; 0x80055d <counter+0x5>
   23c8e:	80 93 5c 05 	sts	0x055C, r24	; 0x80055c <counter+0x4>
      count_position[Y_AXIS]+=count_direction[Y_AXIS];
   23c92:	90 91 5c 02 	lds	r25, 0x025C	; 0x80025c <count_direction+0x1>
   23c96:	40 91 50 06 	lds	r20, 0x0650	; 0x800650 <count_position+0x4>
   23c9a:	50 91 51 06 	lds	r21, 0x0651	; 0x800651 <count_position+0x5>
   23c9e:	60 91 52 06 	lds	r22, 0x0652	; 0x800652 <count_position+0x6>
   23ca2:	70 91 53 06 	lds	r23, 0x0653	; 0x800653 <count_position+0x7>
   23ca6:	89 2f       	mov	r24, r25
   23ca8:	99 0f       	add	r25, r25
   23caa:	99 0b       	sbc	r25, r25
   23cac:	aa 0b       	sbc	r26, r26
   23cae:	bb 0b       	sbc	r27, r27
   23cb0:	84 0f       	add	r24, r20
   23cb2:	95 1f       	adc	r25, r21
   23cb4:	a6 1f       	adc	r26, r22
   23cb6:	b7 1f       	adc	r27, r23
   23cb8:	80 93 50 06 	sts	0x0650, r24	; 0x800650 <count_position+0x4>
   23cbc:	90 93 51 06 	sts	0x0651, r25	; 0x800651 <count_position+0x5>
   23cc0:	a0 93 52 06 	sts	0x0652, r26	; 0x800652 <count_position+0x6>
   23cc4:	b0 93 53 06 	sts	0x0653, r27	; 0x800653 <count_position+0x7>
      STEP_NC_LO(Y_AXIS);
   23cc8:	41 98       	cbi	0x08, 1	; 8
#ifdef DEBUG_YSTEP_DUP_PIN
      STEP_NC_LO(Y_DUP_AXIS);
#endif //DEBUG_YSTEP_DUP_PIN
    }
    // Step in Z axis
    counter[Z_AXIS].lo += current_block->steps[Z_AXIS].lo;
   23cca:	e0 91 51 12 	lds	r30, 0x1251	; 0x801251 <current_block>
   23cce:	f0 91 52 12 	lds	r31, 0x1252	; 0x801252 <current_block+0x1>
   23cd2:	80 85       	ldd	r24, Z+8	; 0x08
   23cd4:	91 85       	ldd	r25, Z+9	; 0x09
   23cd6:	20 91 60 05 	lds	r18, 0x0560	; 0x800560 <counter+0x8>
   23cda:	30 91 61 05 	lds	r19, 0x0561	; 0x800561 <counter+0x9>
   23cde:	82 0f       	add	r24, r18
   23ce0:	93 1f       	adc	r25, r19
   23ce2:	90 93 61 05 	sts	0x0561, r25	; 0x800561 <counter+0x9>
   23ce6:	80 93 60 05 	sts	0x0560, r24	; 0x800560 <counter+0x8>
    if (counter[Z_AXIS].lo > 0) {
   23cea:	18 16       	cp	r1, r24
   23cec:	19 06       	cpc	r1, r25
   23cee:	4c f5       	brge	.+82     	; 0x23d42 <__vector_17+0x672>
      STEP_NC_HI(Z_AXIS);
   23cf0:	42 9a       	sbi	0x08, 2	; 8
      counter[Z_AXIS].lo -= current_block->step_event_count.lo;
   23cf2:	e0 91 51 12 	lds	r30, 0x1251	; 0x801251 <current_block>
   23cf6:	f0 91 52 12 	lds	r31, 0x1252	; 0x801252 <current_block+0x1>
   23cfa:	20 89       	ldd	r18, Z+16	; 0x10
   23cfc:	31 89       	ldd	r19, Z+17	; 0x11
   23cfe:	82 1b       	sub	r24, r18
   23d00:	93 0b       	sbc	r25, r19
   23d02:	90 93 61 05 	sts	0x0561, r25	; 0x800561 <counter+0x9>
   23d06:	80 93 60 05 	sts	0x0560, r24	; 0x800560 <counter+0x8>
      count_position[Z_AXIS]+=count_direction[Z_AXIS];
   23d0a:	90 91 5d 02 	lds	r25, 0x025D	; 0x80025d <count_direction+0x2>
   23d0e:	40 91 54 06 	lds	r20, 0x0654	; 0x800654 <count_position+0x8>
   23d12:	50 91 55 06 	lds	r21, 0x0655	; 0x800655 <count_position+0x9>
   23d16:	60 91 56 06 	lds	r22, 0x0656	; 0x800656 <count_position+0xa>
   23d1a:	70 91 57 06 	lds	r23, 0x0657	; 0x800657 <count_position+0xb>
   23d1e:	89 2f       	mov	r24, r25
   23d20:	99 0f       	add	r25, r25
   23d22:	99 0b       	sbc	r25, r25
   23d24:	aa 0b       	sbc	r26, r26
   23d26:	bb 0b       	sbc	r27, r27
   23d28:	84 0f       	add	r24, r20
   23d2a:	95 1f       	adc	r25, r21
   23d2c:	a6 1f       	adc	r26, r22
   23d2e:	b7 1f       	adc	r27, r23
   23d30:	80 93 54 06 	sts	0x0654, r24	; 0x800654 <count_position+0x8>
   23d34:	90 93 55 06 	sts	0x0655, r25	; 0x800655 <count_position+0x9>
   23d38:	a0 93 56 06 	sts	0x0656, r26	; 0x800656 <count_position+0xa>
   23d3c:	b0 93 57 06 	sts	0x0657, r27	; 0x800657 <count_position+0xb>
      STEP_NC_LO(Z_AXIS);
   23d40:	42 98       	cbi	0x08, 2	; 8
    }
    // Step in E axis
    counter[E_AXIS].lo += current_block->steps[E_AXIS].lo;
   23d42:	e0 91 51 12 	lds	r30, 0x1251	; 0x801251 <current_block>
   23d46:	f0 91 52 12 	lds	r31, 0x1252	; 0x801252 <current_block+0x1>
   23d4a:	80 91 64 05 	lds	r24, 0x0564	; 0x800564 <counter+0xc>
   23d4e:	90 91 65 05 	lds	r25, 0x0565	; 0x800565 <counter+0xd>
   23d52:	24 85       	ldd	r18, Z+12	; 0x0c
   23d54:	35 85       	ldd	r19, Z+13	; 0x0d
   23d56:	82 0f       	add	r24, r18
   23d58:	93 1f       	adc	r25, r19
   23d5a:	90 93 65 05 	sts	0x0565, r25	; 0x800565 <counter+0xd>
   23d5e:	80 93 64 05 	sts	0x0564, r24	; 0x800564 <counter+0xc>
   23d62:	20 89       	ldd	r18, Z+16	; 0x10
   23d64:	31 89       	ldd	r19, Z+17	; 0x11
    if (counter[E_AXIS].lo > 0) {
   23d66:	18 16       	cp	r1, r24
   23d68:	19 06       	cpc	r1, r25
   23d6a:	44 f5       	brge	.+80     	; 0x23dbc <__vector_17+0x6ec>
#ifndef LIN_ADVANCE
      STEP_NC_HI(E_AXIS);
#endif /* LIN_ADVANCE */
      counter[E_AXIS].lo -= current_block->step_event_count.lo;
   23d6c:	82 1b       	sub	r24, r18
   23d6e:	93 0b       	sbc	r25, r19
   23d70:	90 93 65 05 	sts	0x0565, r25	; 0x800565 <counter+0xd>
   23d74:	80 93 64 05 	sts	0x0564, r24	; 0x800564 <counter+0xc>
      count_position[E_AXIS] += count_direction[E_AXIS];
   23d78:	90 91 5e 02 	lds	r25, 0x025E	; 0x80025e <count_direction+0x3>
   23d7c:	40 91 58 06 	lds	r20, 0x0658	; 0x800658 <count_position+0xc>
   23d80:	50 91 59 06 	lds	r21, 0x0659	; 0x800659 <count_position+0xd>
   23d84:	60 91 5a 06 	lds	r22, 0x065A	; 0x80065a <count_position+0xe>
   23d88:	70 91 5b 06 	lds	r23, 0x065B	; 0x80065b <count_position+0xf>
   23d8c:	89 2f       	mov	r24, r25
   23d8e:	99 0f       	add	r25, r25
   23d90:	99 0b       	sbc	r25, r25
   23d92:	aa 0b       	sbc	r26, r26
   23d94:	bb 0b       	sbc	r27, r27
   23d96:	84 0f       	add	r24, r20
   23d98:	95 1f       	adc	r25, r21
   23d9a:	a6 1f       	adc	r26, r22
   23d9c:	b7 1f       	adc	r27, r23
   23d9e:	80 93 58 06 	sts	0x0658, r24	; 0x800658 <count_position+0xc>
   23da2:	90 93 59 06 	sts	0x0659, r25	; 0x800659 <count_position+0xd>
   23da6:	a0 93 5a 06 	sts	0x065A, r26	; 0x80065a <count_position+0xe>
   23daa:	b0 93 5b 06 	sts	0x065B, r27	; 0x80065b <count_position+0xf>
#ifdef LIN_ADVANCE
      e_steps += count_direction[E_AXIS];
   23dae:	90 91 5e 02 	lds	r25, 0x025E	; 0x80025e <count_direction+0x3>
   23db2:	80 91 69 05 	lds	r24, 0x0569	; 0x800569 <e_steps>
   23db6:	89 0f       	add	r24, r25
   23db8:	80 93 69 05 	sts	0x0569, r24	; 0x800569 <e_steps>
      fsensor.stStep(count_direction[E_AXIS] < 0);
#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
      STEP_NC_LO(E_AXIS);
#endif
    }
    if(++ step_events_completed.lo >= current_block->step_event_count.lo)
   23dbc:	80 91 53 05 	lds	r24, 0x0553	; 0x800553 <step_events_completed>
   23dc0:	90 91 54 05 	lds	r25, 0x0554	; 0x800554 <step_events_completed+0x1>
   23dc4:	01 96       	adiw	r24, 0x01	; 1
   23dc6:	90 93 54 05 	sts	0x0554, r25	; 0x800554 <step_events_completed+0x1>
   23dca:	80 93 53 05 	sts	0x0553, r24	; 0x800553 <step_events_completed>
   23dce:	82 17       	cp	r24, r18
   23dd0:	93 07       	cpc	r25, r19
   23dd2:	08 f0       	brcs	.+2      	; 0x23dd6 <__vector_17+0x706>
   23dd4:	b9 c1       	rjmp	.+882    	; 0x24148 <__vector_17+0xa78>
}


FORCE_INLINE void stepper_tick_lowres()
{
  for (uint8_t i=0; i < step_loops; ++ i) { // Take multiple steps per interrupt (For high speed moves)
   23dd6:	cf 5f       	subi	r28, 0xFF	; 255
   23dd8:	f5 ce       	rjmp	.-534    	; 0x23bc4 <__vector_17+0x4f4>
    // Set the direction bits (X_AXIS=A_AXIS and Y_AXIS=B_AXIS for COREXY)
    if((out_bits & (1<<X_AXIS))!=0){
      WRITE_NC(X_DIR_PIN, INVERT_X_DIR);
      count_direction[X_AXIS]=-1;
    } else {
      WRITE_NC(X_DIR_PIN, !INVERT_X_DIR);
   23dda:	80 91 0b 01 	lds	r24, 0x010B	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
   23dde:	82 60       	ori	r24, 0x02	; 2
   23de0:	80 93 0b 01 	sts	0x010B, r24	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
      count_direction[X_AXIS]=1;
   23de4:	81 e0       	ldi	r24, 0x01	; 1
   23de6:	2e ce       	rjmp	.-932    	; 0x23a44 <__vector_17+0x374>
    }
    if((out_bits & (1<<Y_AXIS))!=0){
      WRITE_NC(Y_DIR_PIN, INVERT_Y_DIR);
      count_direction[Y_AXIS]=-1;
    } else {
      WRITE_NC(Y_DIR_PIN, !INVERT_Y_DIR);
   23de8:	80 91 0b 01 	lds	r24, 0x010B	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
   23dec:	81 60       	ori	r24, 0x01	; 1
   23dee:	80 93 0b 01 	sts	0x010B, r24	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
      count_direction[Y_AXIS]=1;
   23df2:	81 e0       	ldi	r24, 0x01	; 1
   23df4:	33 ce       	rjmp	.-922    	; 0x23a5c <__vector_17+0x38c>
    }
    if ((out_bits & (1<<Z_AXIS)) != 0) {   // -direction
      WRITE_NC(Z_DIR_PIN,INVERT_Z_DIR);
      count_direction[Z_AXIS]=-1;
    } else { // +direction
      WRITE_NC(Z_DIR_PIN,!INVERT_Z_DIR);
   23df6:	80 91 0b 01 	lds	r24, 0x010B	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
   23dfa:	84 60       	ori	r24, 0x04	; 4
   23dfc:	80 93 0b 01 	sts	0x010B, r24	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
      count_direction[Z_AXIS]=1;
   23e00:	81 e0       	ldi	r24, 0x01	; 1
   23e02:	38 ce       	rjmp	.-912    	; 0x23a74 <__vector_17+0x3a4>
      count_direction[E_AXIS] = -1;
    } else { // +direction
#ifndef LIN_ADVANCE
      WRITE(E0_DIR_PIN, !INVERT_E0_DIR);
#endif /* LIN_ADVANCE */
      count_direction[E_AXIS] = 1;
   23e04:	81 e0       	ldi	r24, 0x01	; 1
   23e06:	3d ce       	rjmp	.-902    	; 0x23a82 <__vector_17+0x3b2>
    }
  }
  else {
      _NEXT_ISR(2000); // 1kHz.
   23e08:	80 ed       	ldi	r24, 0xD0	; 208
   23e0a:	97 e0       	ldi	r25, 0x07	; 7
   23e0c:	90 93 4f 04 	sts	0x044F, r25	; 0x80044f <_ZL11nextMainISR.lto_priv.438+0x1>
   23e10:	80 93 4e 04 	sts	0x044E, r24	; 0x80044e <_ZL11nextMainISR.lto_priv.438>
   23e14:	90 93 4b 04 	sts	0x044B, r25	; 0x80044b <_ZL9main_Rate.lto_priv.440+0x1>
   23e18:	80 93 4a 04 	sts	0x044A, r24	; 0x80044a <_ZL9main_Rate.lto_priv.440>

#ifdef LIN_ADVANCE
      // reset LA state when there's no block
      nextAdvanceISR = ADV_NEVER;
   23e1c:	8f ef       	ldi	r24, 0xFF	; 255
   23e1e:	9f ef       	ldi	r25, 0xFF	; 255
   23e20:	90 93 4d 04 	sts	0x044D, r25	; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1>
   23e24:	80 93 4c 04 	sts	0x044C, r24	; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439>
      e_steps = 0;
   23e28:	10 92 69 05 	sts	0x0569, r1	; 0x800569 <e_steps>

      // incrementally lose pressure to give a chance for
      // a new LA block to be scheduled and recover
      if(current_adv_steps)
   23e2c:	80 91 48 04 	lds	r24, 0x0448	; 0x800448 <_ZL17current_adv_steps.lto_priv.441>
   23e30:	90 91 49 04 	lds	r25, 0x0449	; 0x800449 <_ZL17current_adv_steps.lto_priv.441+0x1>
   23e34:	00 97       	sbiw	r24, 0x00	; 0
   23e36:	09 f4       	brne	.+2      	; 0x23e3a <__vector_17+0x76a>
   23e38:	26 ce       	rjmp	.-948    	; 0x23a86 <__vector_17+0x3b6>
          --current_adv_steps;
   23e3a:	01 97       	sbiw	r24, 0x01	; 1
   23e3c:	90 93 49 04 	sts	0x0449, r25	; 0x800449 <_ZL17current_adv_steps.lto_priv.441+0x1>
   23e40:	80 93 48 04 	sts	0x0448, r24	; 0x800448 <_ZL17current_adv_steps.lto_priv.441>
   23e44:	20 ce       	rjmp	.-960    	; 0x23a86 <__vector_17+0x3b6>
      #ifdef TMC2130_SG_HOMING
        // Stall guard homing turned on
        SET_BIT_TO(_endstop, X_AXIS, (!READ(X_TMC2130_DIAG)));
      #else
        // Normal homing
        SET_BIT_TO(_endstop, X_AXIS, (READ(X_MIN_PIN) != X_MIN_ENDSTOP_INVERTING));
   23e46:	8e 7f       	andi	r24, 0xFE	; 254
   23e48:	39 ce       	rjmp	.-910    	; 0x23abc <__vector_17+0x3ec>
      #ifdef TMC2130_SG_HOMING
      // Stall guard homing turned on
        SET_BIT_TO(_endstop, Y_AXIS, (!READ(Y_TMC2130_DIAG)));
      #else
      // Normal homing
        SET_BIT_TO(_endstop, Y_AXIS, (READ(Y_MIN_PIN) != Y_MIN_ENDSTOP_INVERTING));
   23e4a:	8d 7f       	andi	r24, 0xFD	; 253
   23e4c:	56 ce       	rjmp	.-852    	; 0x23afa <__vector_17+0x42a>
            SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING));
          else
#endif //TMC2130_STEALTH_Z
            SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING) || (!READ(Z_TMC2130_DIAG)));
        #else
          SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING));
   23e4e:	8b 7f       	andi	r24, 0xFB	; 251
   23e50:	75 ce       	rjmp	.-790    	; 0x23b3c <__vector_17+0x46c>
          SET_BIT_TO(_endstop, Z_AXIS + 4, 0);
        else
#endif //TMC2130_STEALTH_Z
          SET_BIT_TO(_endstop, Z_AXIS + 4, (!READ(Z_TMC2130_DIAG)));
        #else
        SET_BIT_TO(_endstop, Z_AXIS + 4, (READ(Z_MAX_PIN) != Z_MAX_ENDSTOP_INVERTING));
   23e52:	01 99       	sbic	0x00, 1	; 0
   23e54:	03 c0       	rjmp	.+6      	; 0x23e5c <__vector_17+0x78c>
   23e56:	80 64       	ori	r24, 0x40	; 64
        #endif //TMC2130_SG_HOMING
        if((_endstop & _old_endstop & _BV(Z_AXIS + 4)) && (current_block->steps[Z_AXIS].wide > 0)) {
   23e58:	90 74       	andi	r25, 0x40	; 64
   23e5a:	71 ce       	rjmp	.-798    	; 0x23b3e <__vector_17+0x46e>
          SET_BIT_TO(_endstop, Z_AXIS + 4, 0);
        else
#endif //TMC2130_STEALTH_Z
          SET_BIT_TO(_endstop, Z_AXIS + 4, (!READ(Z_TMC2130_DIAG)));
        #else
        SET_BIT_TO(_endstop, Z_AXIS + 4, (READ(Z_MAX_PIN) != Z_MAX_ENDSTOP_INVERTING));
   23e5c:	8f 7b       	andi	r24, 0xBF	; 191
   23e5e:	fc cf       	rjmp	.-8      	; 0x23e58 <__vector_17+0x788>
        SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING));
      else
#endif //TMC2130_STEALTH_Z
        SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING) || (!READ(Z_TMC2130_DIAG)));
      #else
      SET_BIT_TO(_endstop, Z_AXIS, (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING));
   23e60:	8b 7f       	andi	r24, 0xFB	; 251
   23e62:	96 ce       	rjmp	.-724    	; 0x23b90 <__vector_17+0x4c0>
  }
}

FORCE_INLINE void stepper_tick_highres()
{
  for (uint8_t i=0; i < step_loops; ++ i) { // Take multiple steps per interrupt (For high speed moves)
   23e64:	80 91 70 05 	lds	r24, 0x0570	; 0x800570 <step_loops>
   23e68:	c8 17       	cp	r28, r24
   23e6a:	08 f0       	brcs	.+2      	; 0x23e6e <__vector_17+0x79e>
   23e6c:	6d c1       	rjmp	.+730    	; 0x24148 <__vector_17+0xa78>
    MSerial.checkRx(); // Check for serial chars.
   23e6e:	0f 94 1f 03 	call	0x2063e	; 0x2063e <MarlinSerial::checkRx()>
    // Step in X axis
    counter[X_AXIS].wide += current_block->steps[X_AXIS].wide;
   23e72:	e0 91 51 12 	lds	r30, 0x1251	; 0x801251 <current_block>
   23e76:	f0 91 52 12 	lds	r31, 0x1252	; 0x801252 <current_block+0x1>
   23e7a:	80 81       	ld	r24, Z
   23e7c:	91 81       	ldd	r25, Z+1	; 0x01
   23e7e:	a2 81       	ldd	r26, Z+2	; 0x02
   23e80:	b3 81       	ldd	r27, Z+3	; 0x03
   23e82:	40 91 58 05 	lds	r20, 0x0558	; 0x800558 <counter>
   23e86:	50 91 59 05 	lds	r21, 0x0559	; 0x800559 <counter+0x1>
   23e8a:	60 91 5a 05 	lds	r22, 0x055A	; 0x80055a <counter+0x2>
   23e8e:	70 91 5b 05 	lds	r23, 0x055B	; 0x80055b <counter+0x3>
   23e92:	84 0f       	add	r24, r20
   23e94:	95 1f       	adc	r25, r21
   23e96:	a6 1f       	adc	r26, r22
   23e98:	b7 1f       	adc	r27, r23
   23e9a:	80 93 58 05 	sts	0x0558, r24	; 0x800558 <counter>
   23e9e:	90 93 59 05 	sts	0x0559, r25	; 0x800559 <counter+0x1>
   23ea2:	a0 93 5a 05 	sts	0x055A, r26	; 0x80055a <counter+0x2>
   23ea6:	b0 93 5b 05 	sts	0x055B, r27	; 0x80055b <counter+0x3>
    if (counter[X_AXIS].wide > 0) {
   23eaa:	18 16       	cp	r1, r24
   23eac:	19 06       	cpc	r1, r25
   23eae:	1a 06       	cpc	r1, r26
   23eb0:	1b 06       	cpc	r1, r27
   23eb2:	cc f5       	brge	.+114    	; 0x23f26 <__vector_17+0x856>
      STEP_NC_HI(X_AXIS);
   23eb4:	40 9a       	sbi	0x08, 0	; 8
#ifdef DEBUG_XSTEP_DUP_PIN
      STEP_NC_HI(X_DUP_AXIS);
#endif //DEBUG_XSTEP_DUP_PIN
      counter[X_AXIS].wide -= current_block->step_event_count.wide;
   23eb6:	e0 91 51 12 	lds	r30, 0x1251	; 0x801251 <current_block>
   23eba:	f0 91 52 12 	lds	r31, 0x1252	; 0x801252 <current_block+0x1>
   23ebe:	80 91 58 05 	lds	r24, 0x0558	; 0x800558 <counter>
   23ec2:	90 91 59 05 	lds	r25, 0x0559	; 0x800559 <counter+0x1>
   23ec6:	a0 91 5a 05 	lds	r26, 0x055A	; 0x80055a <counter+0x2>
   23eca:	b0 91 5b 05 	lds	r27, 0x055B	; 0x80055b <counter+0x3>
   23ece:	40 89       	ldd	r20, Z+16	; 0x10
   23ed0:	51 89       	ldd	r21, Z+17	; 0x11
   23ed2:	62 89       	ldd	r22, Z+18	; 0x12
   23ed4:	73 89       	ldd	r23, Z+19	; 0x13
   23ed6:	84 1b       	sub	r24, r20
   23ed8:	95 0b       	sbc	r25, r21
   23eda:	a6 0b       	sbc	r26, r22
   23edc:	b7 0b       	sbc	r27, r23
   23ede:	80 93 58 05 	sts	0x0558, r24	; 0x800558 <counter>
   23ee2:	90 93 59 05 	sts	0x0559, r25	; 0x800559 <counter+0x1>
   23ee6:	a0 93 5a 05 	sts	0x055A, r26	; 0x80055a <counter+0x2>
   23eea:	b0 93 5b 05 	sts	0x055B, r27	; 0x80055b <counter+0x3>
      count_position[X_AXIS]+=count_direction[X_AXIS];
   23eee:	90 91 5b 02 	lds	r25, 0x025B	; 0x80025b <count_direction>
   23ef2:	40 91 4c 06 	lds	r20, 0x064C	; 0x80064c <count_position>
   23ef6:	50 91 4d 06 	lds	r21, 0x064D	; 0x80064d <count_position+0x1>
   23efa:	60 91 4e 06 	lds	r22, 0x064E	; 0x80064e <count_position+0x2>
   23efe:	70 91 4f 06 	lds	r23, 0x064F	; 0x80064f <count_position+0x3>
   23f02:	89 2f       	mov	r24, r25
   23f04:	99 0f       	add	r25, r25
   23f06:	99 0b       	sbc	r25, r25
   23f08:	aa 0b       	sbc	r26, r26
   23f0a:	bb 0b       	sbc	r27, r27
   23f0c:	84 0f       	add	r24, r20
   23f0e:	95 1f       	adc	r25, r21
   23f10:	a6 1f       	adc	r26, r22
   23f12:	b7 1f       	adc	r27, r23
   23f14:	80 93 4c 06 	sts	0x064C, r24	; 0x80064c <count_position>
   23f18:	90 93 4d 06 	sts	0x064D, r25	; 0x80064d <count_position+0x1>
   23f1c:	a0 93 4e 06 	sts	0x064E, r26	; 0x80064e <count_position+0x2>
   23f20:	b0 93 4f 06 	sts	0x064F, r27	; 0x80064f <count_position+0x3>
      STEP_NC_LO(X_AXIS);
   23f24:	40 98       	cbi	0x08, 0	; 8
#ifdef DEBUG_XSTEP_DUP_PIN
      STEP_NC_LO(X_DUP_AXIS);
#endif //DEBUG_XSTEP_DUP_PIN
    }
    // Step in Y axis
    counter[Y_AXIS].wide += current_block->steps[Y_AXIS].wide;
   23f26:	e0 91 51 12 	lds	r30, 0x1251	; 0x801251 <current_block>
   23f2a:	f0 91 52 12 	lds	r31, 0x1252	; 0x801252 <current_block+0x1>
   23f2e:	84 81       	ldd	r24, Z+4	; 0x04
   23f30:	95 81       	ldd	r25, Z+5	; 0x05
   23f32:	a6 81       	ldd	r26, Z+6	; 0x06
   23f34:	b7 81       	ldd	r27, Z+7	; 0x07
   23f36:	40 91 5c 05 	lds	r20, 0x055C	; 0x80055c <counter+0x4>
   23f3a:	50 91 5d 05 	lds	r21, 0x055D	; 0x80055d <counter+0x5>
   23f3e:	60 91 5e 05 	lds	r22, 0x055E	; 0x80055e <counter+0x6>
   23f42:	70 91 5f 05 	lds	r23, 0x055F	; 0x80055f <counter+0x7>
   23f46:	84 0f       	add	r24, r20
   23f48:	95 1f       	adc	r25, r21
   23f4a:	a6 1f       	adc	r26, r22
   23f4c:	b7 1f       	adc	r27, r23
   23f4e:	80 93 5c 05 	sts	0x055C, r24	; 0x80055c <counter+0x4>
   23f52:	90 93 5d 05 	sts	0x055D, r25	; 0x80055d <counter+0x5>
   23f56:	a0 93 5e 05 	sts	0x055E, r26	; 0x80055e <counter+0x6>
   23f5a:	b0 93 5f 05 	sts	0x055F, r27	; 0x80055f <counter+0x7>
    if (counter[Y_AXIS].wide > 0) {
   23f5e:	18 16       	cp	r1, r24
   23f60:	19 06       	cpc	r1, r25
   23f62:	1a 06       	cpc	r1, r26
   23f64:	1b 06       	cpc	r1, r27
   23f66:	8c f5       	brge	.+98     	; 0x23fca <__vector_17+0x8fa>
      STEP_NC_HI(Y_AXIS);
   23f68:	41 9a       	sbi	0x08, 1	; 8
#ifdef DEBUG_YSTEP_DUP_PIN
      STEP_NC_HI(Y_DUP_AXIS);
#endif //DEBUG_YSTEP_DUP_PIN
      counter[Y_AXIS].wide -= current_block->step_event_count.wide;
   23f6a:	e0 91 51 12 	lds	r30, 0x1251	; 0x801251 <current_block>
   23f6e:	f0 91 52 12 	lds	r31, 0x1252	; 0x801252 <current_block+0x1>
   23f72:	40 89       	ldd	r20, Z+16	; 0x10
   23f74:	51 89       	ldd	r21, Z+17	; 0x11
   23f76:	62 89       	ldd	r22, Z+18	; 0x12
   23f78:	73 89       	ldd	r23, Z+19	; 0x13
   23f7a:	84 1b       	sub	r24, r20
   23f7c:	95 0b       	sbc	r25, r21
   23f7e:	a6 0b       	sbc	r26, r22
   23f80:	b7 0b       	sbc	r27, r23
   23f82:	80 93 5c 05 	sts	0x055C, r24	; 0x80055c <counter+0x4>
   23f86:	90 93 5d 05 	sts	0x055D, r25	; 0x80055d <counter+0x5>
   23f8a:	a0 93 5e 05 	sts	0x055E, r26	; 0x80055e <counter+0x6>
   23f8e:	b0 93 5f 05 	sts	0x055F, r27	; 0x80055f <counter+0x7>
      count_position[Y_AXIS]+=count_direction[Y_AXIS];
   23f92:	90 91 5c 02 	lds	r25, 0x025C	; 0x80025c <count_direction+0x1>
   23f96:	40 91 50 06 	lds	r20, 0x0650	; 0x800650 <count_position+0x4>
   23f9a:	50 91 51 06 	lds	r21, 0x0651	; 0x800651 <count_position+0x5>
   23f9e:	60 91 52 06 	lds	r22, 0x0652	; 0x800652 <count_position+0x6>
   23fa2:	70 91 53 06 	lds	r23, 0x0653	; 0x800653 <count_position+0x7>
   23fa6:	89 2f       	mov	r24, r25
   23fa8:	99 0f       	add	r25, r25
   23faa:	99 0b       	sbc	r25, r25
   23fac:	aa 0b       	sbc	r26, r26
   23fae:	bb 0b       	sbc	r27, r27
   23fb0:	84 0f       	add	r24, r20
   23fb2:	95 1f       	adc	r25, r21
   23fb4:	a6 1f       	adc	r26, r22
   23fb6:	b7 1f       	adc	r27, r23
   23fb8:	80 93 50 06 	sts	0x0650, r24	; 0x800650 <count_position+0x4>
   23fbc:	90 93 51 06 	sts	0x0651, r25	; 0x800651 <count_position+0x5>
   23fc0:	a0 93 52 06 	sts	0x0652, r26	; 0x800652 <count_position+0x6>
   23fc4:	b0 93 53 06 	sts	0x0653, r27	; 0x800653 <count_position+0x7>
      STEP_NC_LO(Y_AXIS);
   23fc8:	41 98       	cbi	0x08, 1	; 8
#ifdef DEBUG_YSTEP_DUP_PIN
      STEP_NC_LO(Y_DUP_AXIS);
#endif //DEBUG_YSTEP_DUP_PIN
    }
    // Step in Z axis
    counter[Z_AXIS].wide += current_block->steps[Z_AXIS].wide;
   23fca:	e0 91 51 12 	lds	r30, 0x1251	; 0x801251 <current_block>
   23fce:	f0 91 52 12 	lds	r31, 0x1252	; 0x801252 <current_block+0x1>
   23fd2:	80 85       	ldd	r24, Z+8	; 0x08
   23fd4:	91 85       	ldd	r25, Z+9	; 0x09
   23fd6:	a2 85       	ldd	r26, Z+10	; 0x0a
   23fd8:	b3 85       	ldd	r27, Z+11	; 0x0b
   23fda:	40 91 60 05 	lds	r20, 0x0560	; 0x800560 <counter+0x8>
   23fde:	50 91 61 05 	lds	r21, 0x0561	; 0x800561 <counter+0x9>
   23fe2:	60 91 62 05 	lds	r22, 0x0562	; 0x800562 <counter+0xa>
   23fe6:	70 91 63 05 	lds	r23, 0x0563	; 0x800563 <counter+0xb>
   23fea:	84 0f       	add	r24, r20
   23fec:	95 1f       	adc	r25, r21
   23fee:	a6 1f       	adc	r26, r22
   23ff0:	b7 1f       	adc	r27, r23
   23ff2:	80 93 60 05 	sts	0x0560, r24	; 0x800560 <counter+0x8>
   23ff6:	90 93 61 05 	sts	0x0561, r25	; 0x800561 <counter+0x9>
   23ffa:	a0 93 62 05 	sts	0x0562, r26	; 0x800562 <counter+0xa>
   23ffe:	b0 93 63 05 	sts	0x0563, r27	; 0x800563 <counter+0xb>
    if (counter[Z_AXIS].wide > 0) {
   24002:	18 16       	cp	r1, r24
   24004:	19 06       	cpc	r1, r25
   24006:	1a 06       	cpc	r1, r26
   24008:	1b 06       	cpc	r1, r27
   2400a:	8c f5       	brge	.+98     	; 0x2406e <__vector_17+0x99e>
      STEP_NC_HI(Z_AXIS);
   2400c:	42 9a       	sbi	0x08, 2	; 8
      counter[Z_AXIS].wide -= current_block->step_event_count.wide;
   2400e:	e0 91 51 12 	lds	r30, 0x1251	; 0x801251 <current_block>
   24012:	f0 91 52 12 	lds	r31, 0x1252	; 0x801252 <current_block+0x1>
   24016:	40 89       	ldd	r20, Z+16	; 0x10
   24018:	51 89       	ldd	r21, Z+17	; 0x11
   2401a:	62 89       	ldd	r22, Z+18	; 0x12
   2401c:	73 89       	ldd	r23, Z+19	; 0x13
   2401e:	84 1b       	sub	r24, r20
   24020:	95 0b       	sbc	r25, r21
   24022:	a6 0b       	sbc	r26, r22
   24024:	b7 0b       	sbc	r27, r23
   24026:	80 93 60 05 	sts	0x0560, r24	; 0x800560 <counter+0x8>
   2402a:	90 93 61 05 	sts	0x0561, r25	; 0x800561 <counter+0x9>
   2402e:	a0 93 62 05 	sts	0x0562, r26	; 0x800562 <counter+0xa>
   24032:	b0 93 63 05 	sts	0x0563, r27	; 0x800563 <counter+0xb>
      count_position[Z_AXIS]+=count_direction[Z_AXIS];
   24036:	90 91 5d 02 	lds	r25, 0x025D	; 0x80025d <count_direction+0x2>
   2403a:	40 91 54 06 	lds	r20, 0x0654	; 0x800654 <count_position+0x8>
   2403e:	50 91 55 06 	lds	r21, 0x0655	; 0x800655 <count_position+0x9>
   24042:	60 91 56 06 	lds	r22, 0x0656	; 0x800656 <count_position+0xa>
   24046:	70 91 57 06 	lds	r23, 0x0657	; 0x800657 <count_position+0xb>
   2404a:	89 2f       	mov	r24, r25
   2404c:	99 0f       	add	r25, r25
   2404e:	99 0b       	sbc	r25, r25
   24050:	aa 0b       	sbc	r26, r26
   24052:	bb 0b       	sbc	r27, r27
   24054:	84 0f       	add	r24, r20
   24056:	95 1f       	adc	r25, r21
   24058:	a6 1f       	adc	r26, r22
   2405a:	b7 1f       	adc	r27, r23
   2405c:	80 93 54 06 	sts	0x0654, r24	; 0x800654 <count_position+0x8>
   24060:	90 93 55 06 	sts	0x0655, r25	; 0x800655 <count_position+0x9>
   24064:	a0 93 56 06 	sts	0x0656, r26	; 0x800656 <count_position+0xa>
   24068:	b0 93 57 06 	sts	0x0657, r27	; 0x800657 <count_position+0xb>
      STEP_NC_LO(Z_AXIS);
   2406c:	42 98       	cbi	0x08, 2	; 8
    }
    // Step in E axis
    counter[E_AXIS].wide += current_block->steps[E_AXIS].wide;
   2406e:	e0 91 51 12 	lds	r30, 0x1251	; 0x801251 <current_block>
   24072:	f0 91 52 12 	lds	r31, 0x1252	; 0x801252 <current_block+0x1>
   24076:	80 91 64 05 	lds	r24, 0x0564	; 0x800564 <counter+0xc>
   2407a:	90 91 65 05 	lds	r25, 0x0565	; 0x800565 <counter+0xd>
   2407e:	a0 91 66 05 	lds	r26, 0x0566	; 0x800566 <counter+0xe>
   24082:	b0 91 67 05 	lds	r27, 0x0567	; 0x800567 <counter+0xf>
   24086:	44 85       	ldd	r20, Z+12	; 0x0c
   24088:	55 85       	ldd	r21, Z+13	; 0x0d
   2408a:	66 85       	ldd	r22, Z+14	; 0x0e
   2408c:	77 85       	ldd	r23, Z+15	; 0x0f
   2408e:	84 0f       	add	r24, r20
   24090:	95 1f       	adc	r25, r21
   24092:	a6 1f       	adc	r26, r22
   24094:	b7 1f       	adc	r27, r23
   24096:	80 93 64 05 	sts	0x0564, r24	; 0x800564 <counter+0xc>
   2409a:	90 93 65 05 	sts	0x0565, r25	; 0x800565 <counter+0xd>
   2409e:	a0 93 66 05 	sts	0x0566, r26	; 0x800566 <counter+0xe>
   240a2:	b0 93 67 05 	sts	0x0567, r27	; 0x800567 <counter+0xf>
   240a6:	40 89       	ldd	r20, Z+16	; 0x10
   240a8:	51 89       	ldd	r21, Z+17	; 0x11
   240aa:	62 89       	ldd	r22, Z+18	; 0x12
   240ac:	73 89       	ldd	r23, Z+19	; 0x13
    if (counter[E_AXIS].wide > 0) {
   240ae:	18 16       	cp	r1, r24
   240b0:	19 06       	cpc	r1, r25
   240b2:	1a 06       	cpc	r1, r26
   240b4:	1b 06       	cpc	r1, r27
   240b6:	74 f5       	brge	.+92     	; 0x24114 <__vector_17+0xa44>
#ifndef LIN_ADVANCE
      STEP_NC_HI(E_AXIS);
#endif /* LIN_ADVANCE */
      counter[E_AXIS].wide -= current_block->step_event_count.wide;
   240b8:	84 1b       	sub	r24, r20
   240ba:	95 0b       	sbc	r25, r21
   240bc:	a6 0b       	sbc	r26, r22
   240be:	b7 0b       	sbc	r27, r23
   240c0:	80 93 64 05 	sts	0x0564, r24	; 0x800564 <counter+0xc>
   240c4:	90 93 65 05 	sts	0x0565, r25	; 0x800565 <counter+0xd>
   240c8:	a0 93 66 05 	sts	0x0566, r26	; 0x800566 <counter+0xe>
   240cc:	b0 93 67 05 	sts	0x0567, r27	; 0x800567 <counter+0xf>
      count_position[E_AXIS] += count_direction[E_AXIS];
   240d0:	90 91 5e 02 	lds	r25, 0x025E	; 0x80025e <count_direction+0x3>
   240d4:	c0 90 58 06 	lds	r12, 0x0658	; 0x800658 <count_position+0xc>
   240d8:	d0 90 59 06 	lds	r13, 0x0659	; 0x800659 <count_position+0xd>
   240dc:	e0 90 5a 06 	lds	r14, 0x065A	; 0x80065a <count_position+0xe>
   240e0:	f0 90 5b 06 	lds	r15, 0x065B	; 0x80065b <count_position+0xf>
   240e4:	89 2f       	mov	r24, r25
   240e6:	99 0f       	add	r25, r25
   240e8:	99 0b       	sbc	r25, r25
   240ea:	aa 0b       	sbc	r26, r26
   240ec:	bb 0b       	sbc	r27, r27
   240ee:	8c 0d       	add	r24, r12
   240f0:	9d 1d       	adc	r25, r13
   240f2:	ae 1d       	adc	r26, r14
   240f4:	bf 1d       	adc	r27, r15
   240f6:	80 93 58 06 	sts	0x0658, r24	; 0x800658 <count_position+0xc>
   240fa:	90 93 59 06 	sts	0x0659, r25	; 0x800659 <count_position+0xd>
   240fe:	a0 93 5a 06 	sts	0x065A, r26	; 0x80065a <count_position+0xe>
   24102:	b0 93 5b 06 	sts	0x065B, r27	; 0x80065b <count_position+0xf>
#ifdef LIN_ADVANCE
      e_steps += count_direction[E_AXIS];
   24106:	90 91 5e 02 	lds	r25, 0x025E	; 0x80025e <count_direction+0x3>
   2410a:	80 91 69 05 	lds	r24, 0x0569	; 0x800569 <e_steps>
   2410e:	89 0f       	add	r24, r25
   24110:	80 93 69 05 	sts	0x0569, r24	; 0x800569 <e_steps>
      fsensor.stStep(count_direction[E_AXIS] < 0);
#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
      STEP_NC_LO(E_AXIS);
#endif
    }
    if(++ step_events_completed.wide >= current_block->step_event_count.wide)
   24114:	80 91 53 05 	lds	r24, 0x0553	; 0x800553 <step_events_completed>
   24118:	90 91 54 05 	lds	r25, 0x0554	; 0x800554 <step_events_completed+0x1>
   2411c:	a0 91 55 05 	lds	r26, 0x0555	; 0x800555 <step_events_completed+0x2>
   24120:	b0 91 56 05 	lds	r27, 0x0556	; 0x800556 <step_events_completed+0x3>
   24124:	01 96       	adiw	r24, 0x01	; 1
   24126:	a1 1d       	adc	r26, r1
   24128:	b1 1d       	adc	r27, r1
   2412a:	80 93 53 05 	sts	0x0553, r24	; 0x800553 <step_events_completed>
   2412e:	90 93 54 05 	sts	0x0554, r25	; 0x800554 <step_events_completed+0x1>
   24132:	a0 93 55 05 	sts	0x0555, r26	; 0x800555 <step_events_completed+0x2>
   24136:	b0 93 56 05 	sts	0x0556, r27	; 0x800556 <step_events_completed+0x3>
   2413a:	84 17       	cp	r24, r20
   2413c:	95 07       	cpc	r25, r21
   2413e:	a6 07       	cpc	r26, r22
   24140:	b7 07       	cpc	r27, r23
   24142:	10 f4       	brcc	.+4      	; 0x24148 <__vector_17+0xa78>
  }
}

FORCE_INLINE void stepper_tick_highres()
{
  for (uint8_t i=0; i < step_loops; ++ i) { // Take multiple steps per interrupt (For high speed moves)
   24144:	cf 5f       	subi	r28, 0xFF	; 255
   24146:	8e ce       	rjmp	.-740    	; 0x23e64 <__vector_17+0x794>
    else
      stepper_tick_highres();


#ifdef LIN_ADVANCE
    if (e_steps) WRITE_NC(E0_DIR_PIN, e_steps < 0? INVERT_E0_DIR: !INVERT_E0_DIR);
   24148:	80 91 69 05 	lds	r24, 0x0569	; 0x800569 <e_steps>
   2414c:	88 23       	and	r24, r24
   2414e:	39 f0       	breq	.+14     	; 0x2415e <__vector_17+0xa8e>
   24150:	87 ff       	sbrs	r24, 7
   24152:	f2 c0       	rjmp	.+484    	; 0x24338 <__vector_17+0xc68>
   24154:	80 91 0b 01 	lds	r24, 0x010B	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
   24158:	80 64       	ori	r24, 0x40	; 64
   2415a:	80 93 0b 01 	sts	0x010B, r24	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
    // Calculate new timer value
    // 13.38-14.63us for steady state,
    // 25.12us for acceleration / deceleration.
    {
      //WRITE_NC(LOGIC_ANALYZER_CH1, true);
      if (step_events_completed.wide <= current_block->accelerate_until) {
   2415e:	40 91 53 05 	lds	r20, 0x0553	; 0x800553 <step_events_completed>
   24162:	50 91 54 05 	lds	r21, 0x0554	; 0x800554 <step_events_completed+0x1>
   24166:	60 91 55 05 	lds	r22, 0x0555	; 0x800555 <step_events_completed+0x2>
   2416a:	70 91 56 05 	lds	r23, 0x0556	; 0x800556 <step_events_completed+0x3>
   2416e:	c0 91 51 12 	lds	r28, 0x1251	; 0x801251 <current_block>
   24172:	d0 91 52 12 	lds	r29, 0x1252	; 0x801252 <current_block+0x1>
   24176:	89 8d       	ldd	r24, Y+25	; 0x19
   24178:	9a 8d       	ldd	r25, Y+26	; 0x1a
   2417a:	ab 8d       	ldd	r26, Y+27	; 0x1b
   2417c:	bc 8d       	ldd	r27, Y+28	; 0x1c
   2417e:	84 17       	cp	r24, r20
   24180:	95 07       	cpc	r25, r21
   24182:	a6 07       	cpc	r26, r22
   24184:	b7 07       	cpc	r27, r23
   24186:	08 f4       	brcc	.+2      	; 0x2418a <__vector_17+0xaba>
   24188:	37 c1       	rjmp	.+622    	; 0x243f8 <__vector_17+0xd28>
        // v = t * a   ->   acc_step_rate = acceleration_time * current_block->acceleration_rate
        acc_step_rate = MUL24x24R24(acceleration_time, current_block->acceleration_rate);
   2418a:	c0 90 6c 05 	lds	r12, 0x056C	; 0x80056c <acceleration_time>
   2418e:	d0 90 6d 05 	lds	r13, 0x056D	; 0x80056d <acceleration_time+0x1>
   24192:	e0 90 6e 05 	lds	r14, 0x056E	; 0x80056e <acceleration_time+0x2>
   24196:	f0 90 6f 05 	lds	r15, 0x056F	; 0x80056f <acceleration_time+0x3>
    "adc %B0, r26 \n\t"
    "clr r1 \n\t"
    : "=&r" (out)
    : "r" (x), "r" (y)
    : "r0", "r1", "r26" , "r27" //clobbers: Technically these are either scratch registers or always 0 registers, but I'm making sure the compiler knows just in case. R26 is __zero_reg__, R27 is a temporary register.
    );
   2419a:	2c 89       	ldd	r18, Y+20	; 0x14
   2419c:	3d 89       	ldd	r19, Y+21	; 0x15
   2419e:	4e 89       	ldd	r20, Y+22	; 0x16
   241a0:	aa 27       	eor	r26, r26
   241a2:	c3 9e       	mul	r12, r19
   241a4:	b1 2d       	mov	r27, r1
   241a6:	d4 9e       	mul	r13, r20
   241a8:	c0 01       	movw	r24, r0
   241aa:	e4 9e       	mul	r14, r20
   241ac:	90 0d       	add	r25, r0
   241ae:	e3 9e       	mul	r14, r19
   241b0:	80 0d       	add	r24, r0
   241b2:	91 1d       	adc	r25, r1
   241b4:	c4 9e       	mul	r12, r20
   241b6:	b0 0d       	add	r27, r0
   241b8:	81 1d       	adc	r24, r1
   241ba:	9a 1f       	adc	r25, r26
   241bc:	d3 9e       	mul	r13, r19
   241be:	b0 0d       	add	r27, r0
   241c0:	81 1d       	adc	r24, r1
   241c2:	9a 1f       	adc	r25, r26
   241c4:	e2 9e       	mul	r14, r18
   241c6:	b0 0d       	add	r27, r0
   241c8:	81 1d       	adc	r24, r1
   241ca:	9a 1f       	adc	r25, r26
   241cc:	d2 9e       	mul	r13, r18
   241ce:	b1 0d       	add	r27, r1
   241d0:	8a 1f       	adc	r24, r26
   241d2:	9a 1f       	adc	r25, r26
   241d4:	bb 0f       	add	r27, r27
   241d6:	8a 1f       	adc	r24, r26
   241d8:	9a 1f       	adc	r25, r26
   241da:	11 24       	eor	r1, r1
        acc_step_rate += uint16_t(current_block->initial_rate);
   241dc:	2a ad       	ldd	r18, Y+58	; 0x3a
   241de:	3b ad       	ldd	r19, Y+59	; 0x3b
   241e0:	82 0f       	add	r24, r18
   241e2:	93 1f       	adc	r25, r19
   241e4:	90 93 72 05 	sts	0x0572, r25	; 0x800572 <acc_step_rate+0x1>
   241e8:	80 93 71 05 	sts	0x0571, r24	; 0x800571 <acc_step_rate>
        // upper limit
        if(acc_step_rate > uint16_t(current_block->nominal_rate))
   241ec:	2e a9       	ldd	r18, Y+54	; 0x36
   241ee:	3f a9       	ldd	r19, Y+55	; 0x37
   241f0:	28 17       	cp	r18, r24
   241f2:	39 07       	cpc	r19, r25
   241f4:	20 f4       	brcc	.+8      	; 0x241fe <__vector_17+0xb2e>
          acc_step_rate = current_block->nominal_rate;
   241f6:	30 93 72 05 	sts	0x0572, r19	; 0x800572 <acc_step_rate+0x1>
   241fa:	20 93 71 05 	sts	0x0571, r18	; 0x800571 <acc_step_rate>
        // step_rate to timer interval
        uint16_t timer = calc_timer(acc_step_rate, step_loops);
   241fe:	80 91 71 05 	lds	r24, 0x0571	; 0x800571 <acc_step_rate>
   24202:	90 91 72 05 	lds	r25, 0x0572	; 0x800572 <acc_step_rate+0x1>
#endif //_NO_ASM


FORCE_INLINE unsigned short calc_timer(uint16_t step_rate, uint8_t& step_loops) {
  uint16_t timer;
  if(step_rate > MAX_STEP_FREQUENCY) step_rate = MAX_STEP_FREQUENCY;
   24206:	81 34       	cpi	r24, 0x41	; 65
   24208:	bc e9       	ldi	r27, 0x9C	; 156
   2420a:	9b 07       	cpc	r25, r27
   2420c:	08 f0       	brcs	.+2      	; 0x24210 <__vector_17+0xb40>
   2420e:	98 c0       	rjmp	.+304    	; 0x24340 <__vector_17+0xc70>

  if(step_rate > 20000) { // If steprate > 20kHz >> step 4 times
   24210:	81 32       	cpi	r24, 0x21	; 33
   24212:	ee e4       	ldi	r30, 0x4E	; 78
   24214:	9e 07       	cpc	r25, r30
   24216:	08 f4       	brcc	.+2      	; 0x2421a <__vector_17+0xb4a>
   24218:	96 c0       	rjmp	.+300    	; 0x24346 <__vector_17+0xc76>
    step_rate = (step_rate >> 2)&0x3fff;
   2421a:	96 95       	lsr	r25
   2421c:	87 95       	ror	r24
   2421e:	96 95       	lsr	r25
   24220:	87 95       	ror	r24
    step_loops = 4;
   24222:	24 e0       	ldi	r18, 0x04	; 4
  }
  else if(step_rate > 10000) { // If steprate > 10kHz >> step 2 times
    step_rate = (step_rate >> 1)&0x7fff;
    step_loops = 2;
   24224:	20 93 70 05 	sts	0x0570, r18	; 0x800570 <step_loops>
  else {
    step_loops = 1;
  }

  if(step_rate < (F_CPU/500000)) step_rate = (F_CPU/500000);
  step_rate -= (F_CPU/500000); // Correct for minimal speed
   24228:	80 97       	sbiw	r24, 0x20	; 32
  if(step_rate >= (8*256)){ // higher step rate
   2422a:	81 15       	cp	r24, r1
   2422c:	28 e0       	ldi	r18, 0x08	; 8
   2422e:	92 07       	cpc	r25, r18
   24230:	08 f4       	brcc	.+2      	; 0x24234 <__vector_17+0xb64>
   24232:	9b c0       	rjmp	.+310    	; 0x2436a <__vector_17+0xc9a>
    unsigned short table_address = (unsigned short)&speed_lookuptable_fast[(unsigned char)(step_rate>>8)][0];
   24234:	e9 2f       	mov	r30, r25
   24236:	ff 27       	eor	r31, r31
   24238:	ee 0f       	add	r30, r30
   2423a:	ff 1f       	adc	r31, r31
   2423c:	ee 0f       	add	r30, r30
   2423e:	ff 1f       	adc	r31, r31
   24240:	9f 01       	movw	r18, r30
   24242:	2c 56       	subi	r18, 0x6C	; 108
   24244:	30 47       	sbci	r19, 0x70	; 112
    unsigned char tmp_step_rate = (step_rate & 0x00ff);
    uint16_t gain = (uint16_t)pgm_read_word_near(table_address+2);
   24246:	f9 01       	movw	r30, r18
   24248:	32 96       	adiw	r30, 0x02	; 2
   2424a:	45 91       	lpm	r20, Z+
   2424c:	54 91       	lpm	r21, Z
    timer = (unsigned short)pgm_read_word_near(table_address) - MUL8x16R8(tmp_step_rate, gain);
   2424e:	f9 01       	movw	r30, r18
   24250:	25 91       	lpm	r18, Z+
   24252:	34 91       	lpm	r19, Z
    "clr r1" "\n\t"         //make r1 __zero_reg__ again
    "adc %B0, r1" "\n\t"    //propagate carry of addition (add 0 with carry)
    : "=&r" (out)
    : "r" (x), "r" (y)
    : "r0", "r1"            //clobbers: Technically these are either scratch registers or always 0 registers, but I'm making sure the compiler knows just in case.
    );
   24254:	58 9f       	mul	r21, r24
   24256:	b0 01       	movw	r22, r0
   24258:	48 9f       	mul	r20, r24
   2425a:	00 0c       	add	r0, r0
   2425c:	61 1d       	adc	r22, r1
   2425e:	11 24       	eor	r1, r1
   24260:	71 1d       	adc	r23, r1
  step_rate -= (F_CPU/500000); // Correct for minimal speed
  if(step_rate >= (8*256)){ // higher step rate
    unsigned short table_address = (unsigned short)&speed_lookuptable_fast[(unsigned char)(step_rate>>8)][0];
    unsigned char tmp_step_rate = (step_rate & 0x00ff);
    uint16_t gain = (uint16_t)pgm_read_word_near(table_address+2);
    timer = (unsigned short)pgm_read_word_near(table_address) - MUL8x16R8(tmp_step_rate, gain);
   24262:	26 1b       	sub	r18, r22
   24264:	37 0b       	sbc	r19, r23
   24266:	c9 01       	movw	r24, r18
   24268:	24 36       	cpi	r18, 0x64	; 100
   2426a:	31 05       	cpc	r19, r1
   2426c:	10 f4       	brcc	.+4      	; 0x24272 <__vector_17+0xba2>
   2426e:	84 e6       	ldi	r24, 0x64	; 100
   24270:	90 e0       	ldi	r25, 0x00	; 0
        _NEXT_ISR(timer);
   24272:	90 93 4f 04 	sts	0x044F, r25	; 0x80044f <_ZL11nextMainISR.lto_priv.438+0x1>
   24276:	80 93 4e 04 	sts	0x044E, r24	; 0x80044e <_ZL11nextMainISR.lto_priv.438>
   2427a:	90 93 4b 04 	sts	0x044B, r25	; 0x80044b <_ZL9main_Rate.lto_priv.440+0x1>
   2427e:	80 93 4a 04 	sts	0x044A, r24	; 0x80044a <_ZL9main_Rate.lto_priv.440>
        acceleration_time += timer;
   24282:	c8 0e       	add	r12, r24
   24284:	d9 1e       	adc	r13, r25
   24286:	e1 1c       	adc	r14, r1
   24288:	f1 1c       	adc	r15, r1
   2428a:	c0 92 6c 05 	sts	0x056C, r12	; 0x80056c <acceleration_time>
   2428e:	d0 92 6d 05 	sts	0x056D, r13	; 0x80056d <acceleration_time+0x1>
   24292:	e0 92 6e 05 	sts	0x056E, r14	; 0x80056e <acceleration_time+0x2>
   24296:	f0 92 6f 05 	sts	0x056F, r15	; 0x80056f <acceleration_time+0x3>
#ifdef LIN_ADVANCE
        if (current_block->use_advance_lead) {
   2429a:	fe 01       	movw	r30, r28
   2429c:	e4 5b       	subi	r30, 0xB4	; 180
   2429e:	ff 4f       	sbci	r31, 0xFF	; 255
   242a0:	80 81       	ld	r24, Z
   242a2:	81 11       	cpse	r24, r1
   242a4:	80 c0       	rjmp	.+256    	; 0x243a6 <__vector_17+0xcd6>
      stepper_tick_highres();


#ifdef LIN_ADVANCE
    if (e_steps) WRITE_NC(E0_DIR_PIN, e_steps < 0? INVERT_E0_DIR: !INVERT_E0_DIR);
    uint8_t la_state = 0;
   242a6:	80 e0       	ldi	r24, 0x00	; 0
      //WRITE_NC(LOGIC_ANALYZER_CH1, false);
    }

#ifdef LIN_ADVANCE
    // avoid multiple instances or function calls to advance_spread
    if (la_state & ADV_INIT) {
   242a8:	80 ff       	sbrs	r24, 0
   242aa:	16 c0       	rjmp	.+44     	; 0x242d8 <__vector_17+0xc08>
        LA_phase = -1;
   242ac:	9f ef       	ldi	r25, 0xFF	; 255
   242ae:	90 93 68 05 	sts	0x0568, r25	; 0x800568 <LA_phase>

        if (current_adv_steps == target_adv_steps) {
   242b2:	e0 91 48 04 	lds	r30, 0x0448	; 0x800448 <_ZL17current_adv_steps.lto_priv.441>
   242b6:	f0 91 49 04 	lds	r31, 0x0449	; 0x800449 <_ZL17current_adv_steps.lto_priv.441+0x1>
   242ba:	20 91 6a 05 	lds	r18, 0x056A	; 0x80056a <target_adv_steps>
   242be:	30 91 6b 05 	lds	r19, 0x056B	; 0x80056b <target_adv_steps+0x1>
   242c2:	e2 17       	cp	r30, r18
   242c4:	f3 07       	cpc	r31, r19
   242c6:	09 f0       	breq	.+2      	; 0x242ca <__vector_17+0xbfa>
   242c8:	27 c2       	rjmp	.+1102   	; 0x24718 <__vector_17+0x1048>
            // nothing to be done in this phase, cancel any pending eisr
            la_state = 0;
            nextAdvanceISR = ADV_NEVER;
   242ca:	8f ef       	ldi	r24, 0xFF	; 255
   242cc:	9f ef       	ldi	r25, 0xFF	; 255
   242ce:	90 93 4d 04 	sts	0x044D, r25	; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1>
   242d2:	80 93 4c 04 	sts	0x044C, r24	; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439>
    if (la_state & ADV_INIT) {
        LA_phase = -1;

        if (current_adv_steps == target_adv_steps) {
            // nothing to be done in this phase, cancel any pending eisr
            la_state = 0;
   242d6:	80 e0       	ldi	r24, 0x00	; 0
                eISR_Err += current_block->advance_rate;
                LA_phase = 0;
            }
        }
    }
    if (la_state & ADV_INIT || nextAdvanceISR != ADV_NEVER) {
   242d8:	80 fd       	sbrc	r24, 0
   242da:	07 c0       	rjmp	.+14     	; 0x242ea <__vector_17+0xc1a>
   242dc:	80 91 4c 04 	lds	r24, 0x044C	; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439>
   242e0:	90 91 4d 04 	lds	r25, 0x044D	; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1>
   242e4:	01 96       	adiw	r24, 0x01	; 1
   242e6:	09 f4       	brne	.+2      	; 0x242ea <__vector_17+0xc1a>
   242e8:	b7 c2       	rjmp	.+1390   	; 0x24858 <__vector_17+0x1188>
        // update timers & phase for the next iteration
        advance_spread(main_Rate);
   242ea:	e0 91 4a 04 	lds	r30, 0x044A	; 0x80044a <_ZL9main_Rate.lto_priv.440>
   242ee:	f0 91 4b 04 	lds	r31, 0x044B	; 0x80044b <_ZL9main_Rate.lto_priv.440+0x1>
    else return ((uint32_t)0xAAAB * q) >> 17;
}

FORCE_INLINE void advance_spread(uint16_t timer)
{
    eISR_Err += timer;
   242f2:	80 91 49 05 	lds	r24, 0x0549	; 0x800549 <eISR_Err>
   242f6:	90 91 4a 05 	lds	r25, 0x054A	; 0x80054a <eISR_Err+0x1>
   242fa:	a0 91 4b 05 	lds	r26, 0x054B	; 0x80054b <eISR_Err+0x2>
   242fe:	b0 91 4c 05 	lds	r27, 0x054C	; 0x80054c <eISR_Err+0x3>
   24302:	2c 01       	movw	r4, r24
   24304:	3d 01       	movw	r6, r26
   24306:	4e 0e       	add	r4, r30
   24308:	5f 1e       	adc	r5, r31
   2430a:	61 1c       	adc	r6, r1
   2430c:	71 1c       	adc	r7, r1

    uint8_t ticks = 0;
    while(eISR_Err >= current_block->advance_rate)
   2430e:	9e 01       	movw	r18, r28
   24310:	23 5b       	subi	r18, 0xB3	; 179
   24312:	3f 4f       	sbci	r19, 0xFF	; 255
   24314:	d9 01       	movw	r26, r18
   24316:	cd 90       	ld	r12, X+
   24318:	dc 90       	ld	r13, X
   2431a:	f1 2c       	mov	r15, r1
   2431c:	e1 2c       	mov	r14, r1

FORCE_INLINE void advance_spread(uint16_t timer)
{
    eISR_Err += timer;

    uint8_t ticks = 0;
   2431e:	60 e0       	ldi	r22, 0x00	; 0
    while(eISR_Err >= current_block->advance_rate)
   24320:	4c 14       	cp	r4, r12
   24322:	5d 04       	cpc	r5, r13
   24324:	6e 04       	cpc	r6, r14
   24326:	7f 04       	cpc	r7, r15
   24328:	08 f4       	brcc	.+2      	; 0x2432c <__vector_17+0xc5c>
   2432a:	26 c2       	rjmp	.+1100   	; 0x24778 <__vector_17+0x10a8>
    {
        ++ticks;
   2432c:	6f 5f       	subi	r22, 0xFF	; 255
        eISR_Err -= current_block->advance_rate;
   2432e:	4c 18       	sub	r4, r12
   24330:	5d 08       	sbc	r5, r13
   24332:	6e 08       	sbc	r6, r14
   24334:	7f 08       	sbc	r7, r15
   24336:	f4 cf       	rjmp	.-24     	; 0x24320 <__vector_17+0xc50>
    else
      stepper_tick_highres();


#ifdef LIN_ADVANCE
    if (e_steps) WRITE_NC(E0_DIR_PIN, e_steps < 0? INVERT_E0_DIR: !INVERT_E0_DIR);
   24338:	80 91 0b 01 	lds	r24, 0x010B	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
   2433c:	8f 7b       	andi	r24, 0xBF	; 191
   2433e:	0d cf       	rjmp	.-486    	; 0x2415a <__vector_17+0xa8a>
#endif //_NO_ASM


FORCE_INLINE unsigned short calc_timer(uint16_t step_rate, uint8_t& step_loops) {
  uint16_t timer;
  if(step_rate > MAX_STEP_FREQUENCY) step_rate = MAX_STEP_FREQUENCY;
   24340:	80 e4       	ldi	r24, 0x40	; 64
   24342:	9c e9       	ldi	r25, 0x9C	; 156
   24344:	6a cf       	rjmp	.-300    	; 0x2421a <__vector_17+0xb4a>

  if(step_rate > 20000) { // If steprate > 20kHz >> step 4 times
    step_rate = (step_rate >> 2)&0x3fff;
    step_loops = 4;
  }
  else if(step_rate > 10000) { // If steprate > 10kHz >> step 2 times
   24346:	81 31       	cpi	r24, 0x11	; 17
   24348:	f7 e2       	ldi	r31, 0x27	; 39
   2434a:	9f 07       	cpc	r25, r31
   2434c:	20 f0       	brcs	.+8      	; 0x24356 <__vector_17+0xc86>
    step_rate = (step_rate >> 1)&0x7fff;
   2434e:	96 95       	lsr	r25
   24350:	87 95       	ror	r24
    step_loops = 2;
   24352:	22 e0       	ldi	r18, 0x02	; 2
   24354:	67 cf       	rjmp	.-306    	; 0x24224 <__vector_17+0xb54>
  }
  else {
    step_loops = 1;
   24356:	21 e0       	ldi	r18, 0x01	; 1
   24358:	20 93 70 05 	sts	0x0570, r18	; 0x800570 <step_loops>
   2435c:	80 32       	cpi	r24, 0x20	; 32
   2435e:	91 05       	cpc	r25, r1
   24360:	08 f0       	brcs	.+2      	; 0x24364 <__vector_17+0xc94>
   24362:	62 cf       	rjmp	.-316    	; 0x24228 <__vector_17+0xb58>
   24364:	80 e2       	ldi	r24, 0x20	; 32
   24366:	90 e0       	ldi	r25, 0x00	; 0
   24368:	5f cf       	rjmp	.-322    	; 0x24228 <__vector_17+0xb58>
    uint16_t gain = (uint16_t)pgm_read_word_near(table_address+2);
    timer = (unsigned short)pgm_read_word_near(table_address) - MUL8x16R8(tmp_step_rate, gain);
  }
  else { // lower step rates
    unsigned short table_address = (unsigned short)&speed_lookuptable_slow[0][0];
    table_address += ((step_rate)>>1) & 0xfffc;
   2436a:	ac 01       	movw	r20, r24
   2436c:	56 95       	lsr	r21
   2436e:	47 95       	ror	r20
   24370:	4c 7f       	andi	r20, 0xFC	; 252
   24372:	4c 56       	subi	r20, 0x6C	; 108
   24374:	54 47       	sbci	r21, 0x74	; 116
    timer = (unsigned short)pgm_read_word_near(table_address);
   24376:	fa 01       	movw	r30, r20
   24378:	25 91       	lpm	r18, Z+
   2437a:	34 91       	lpm	r19, Z
    timer -= (((unsigned short)pgm_read_word_near(table_address+2) * (unsigned char)(step_rate & 0x0007))>>3);
   2437c:	fa 01       	movw	r30, r20
   2437e:	32 96       	adiw	r30, 0x02	; 2
   24380:	65 91       	lpm	r22, Z+
   24382:	74 91       	lpm	r23, Z
   24384:	87 70       	andi	r24, 0x07	; 7
   24386:	99 27       	eor	r25, r25
   24388:	86 9f       	mul	r24, r22
   2438a:	a0 01       	movw	r20, r0
   2438c:	87 9f       	mul	r24, r23
   2438e:	50 0d       	add	r21, r0
   24390:	96 9f       	mul	r25, r22
   24392:	50 0d       	add	r21, r0
   24394:	11 24       	eor	r1, r1
   24396:	73 e0       	ldi	r23, 0x03	; 3
   24398:	56 95       	lsr	r21
   2439a:	47 95       	ror	r20
   2439c:	7a 95       	dec	r23
   2439e:	e1 f7       	brne	.-8      	; 0x24398 <__vector_17+0xcc8>
   243a0:	24 1b       	sub	r18, r20
   243a2:	35 0b       	sbc	r19, r21
   243a4:	60 cf       	rjmp	.-320    	; 0x24266 <__vector_17+0xb96>
        uint16_t timer = calc_timer(acc_step_rate, step_loops);
        _NEXT_ISR(timer);
        acceleration_time += timer;
#ifdef LIN_ADVANCE
        if (current_block->use_advance_lead) {
            if (step_events_completed.wide <= (unsigned long int)step_loops) {
   243a6:	40 91 53 05 	lds	r20, 0x0553	; 0x800553 <step_events_completed>
   243aa:	50 91 54 05 	lds	r21, 0x0554	; 0x800554 <step_events_completed+0x1>
   243ae:	60 91 55 05 	lds	r22, 0x0555	; 0x800555 <step_events_completed+0x2>
   243b2:	70 91 56 05 	lds	r23, 0x0556	; 0x800556 <step_events_completed+0x3>
   243b6:	80 91 70 05 	lds	r24, 0x0570	; 0x800570 <step_loops>
   243ba:	90 e0       	ldi	r25, 0x00	; 0
   243bc:	b0 e0       	ldi	r27, 0x00	; 0
   243be:	a0 e0       	ldi	r26, 0x00	; 0
   243c0:	84 17       	cp	r24, r20
   243c2:	95 07       	cpc	r25, r21
   243c4:	a6 07       	cpc	r26, r22
   243c6:	b7 07       	cpc	r27, r23
   243c8:	08 f4       	brcc	.+2      	; 0x243cc <__vector_17+0xcfc>
   243ca:	6d cf       	rjmp	.-294    	; 0x242a6 <__vector_17+0xbd6>
                la_state = ADV_INIT | ADV_ACC_VARY;
                if (e_extruding && current_adv_steps > target_adv_steps)
   243cc:	80 91 57 05 	lds	r24, 0x0557	; 0x800557 <e_extruding>
   243d0:	81 11       	cpse	r24, r1
   243d2:	02 c0       	rjmp	.+4      	; 0x243d8 <__vector_17+0xd08>
        _NEXT_ISR(timer);
        acceleration_time += timer;
#ifdef LIN_ADVANCE
        if (current_block->use_advance_lead) {
            if (step_events_completed.wide <= (unsigned long int)step_loops) {
                la_state = ADV_INIT | ADV_ACC_VARY;
   243d4:	83 e0       	ldi	r24, 0x03	; 3
   243d6:	68 cf       	rjmp	.-304    	; 0x242a8 <__vector_17+0xbd8>
                if (e_extruding && current_adv_steps > target_adv_steps)
   243d8:	80 91 48 04 	lds	r24, 0x0448	; 0x800448 <_ZL17current_adv_steps.lto_priv.441>
   243dc:	90 91 49 04 	lds	r25, 0x0449	; 0x800449 <_ZL17current_adv_steps.lto_priv.441+0x1>
   243e0:	20 91 6a 05 	lds	r18, 0x056A	; 0x80056a <target_adv_steps>
   243e4:	30 91 6b 05 	lds	r19, 0x056B	; 0x80056b <target_adv_steps+0x1>
   243e8:	28 17       	cp	r18, r24
   243ea:	39 07       	cpc	r19, r25
   243ec:	98 f7       	brcc	.-26     	; 0x243d4 <__vector_17+0xd04>
                    target_adv_steps = current_adv_steps;
   243ee:	90 93 6b 05 	sts	0x056B, r25	; 0x80056b <target_adv_steps+0x1>
   243f2:	80 93 6a 05 	sts	0x056A, r24	; 0x80056a <target_adv_steps>
   243f6:	ee cf       	rjmp	.-36     	; 0x243d4 <__vector_17+0xd04>
            }
        }
#endif
      }
      else if (step_events_completed.wide > current_block->decelerate_after) {
   243f8:	80 91 53 05 	lds	r24, 0x0553	; 0x800553 <step_events_completed>
   243fc:	90 91 54 05 	lds	r25, 0x0554	; 0x800554 <step_events_completed+0x1>
   24400:	a0 91 55 05 	lds	r26, 0x0555	; 0x800555 <step_events_completed+0x2>
   24404:	b0 91 56 05 	lds	r27, 0x0556	; 0x800556 <step_events_completed+0x3>
   24408:	4d 8d       	ldd	r20, Y+29	; 0x1d
   2440a:	5e 8d       	ldd	r21, Y+30	; 0x1e
   2440c:	6f 8d       	ldd	r22, Y+31	; 0x1f
   2440e:	78 a1       	ldd	r23, Y+32	; 0x20
   24410:	48 17       	cp	r20, r24
   24412:	59 07       	cpc	r21, r25
   24414:	6a 07       	cpc	r22, r26
   24416:	7b 07       	cpc	r23, r27
   24418:	08 f0       	brcs	.+2      	; 0x2441c <__vector_17+0xd4c>
   2441a:	e3 c0       	rjmp	.+454    	; 0x245e2 <__vector_17+0xf12>
        uint16_t step_rate = MUL24x24R24(deceleration_time, current_block->acceleration_rate);
   2441c:	c0 90 74 05 	lds	r12, 0x0574	; 0x800574 <deceleration_time>
   24420:	d0 90 75 05 	lds	r13, 0x0575	; 0x800575 <deceleration_time+0x1>
   24424:	e0 90 76 05 	lds	r14, 0x0576	; 0x800576 <deceleration_time+0x2>
   24428:	f0 90 77 05 	lds	r15, 0x0577	; 0x800577 <deceleration_time+0x3>
    "adc %B0, r26 \n\t"
    "clr r1 \n\t"
    : "=&r" (out)
    : "r" (x), "r" (y)
    : "r0", "r1", "r26" , "r27" //clobbers: Technically these are either scratch registers or always 0 registers, but I'm making sure the compiler knows just in case. R26 is __zero_reg__, R27 is a temporary register.
    );
   2442c:	6c 88       	ldd	r6, Y+20	; 0x14
   2442e:	7d 88       	ldd	r7, Y+21	; 0x15
   24430:	8e 88       	ldd	r8, Y+22	; 0x16
   24432:	aa 27       	eor	r26, r26
   24434:	c7 9c       	mul	r12, r7
   24436:	b1 2d       	mov	r27, r1
   24438:	d8 9c       	mul	r13, r8
   2443a:	f0 01       	movw	r30, r0
   2443c:	e8 9c       	mul	r14, r8
   2443e:	f0 0d       	add	r31, r0
   24440:	e7 9c       	mul	r14, r7
   24442:	e0 0d       	add	r30, r0
   24444:	f1 1d       	adc	r31, r1
   24446:	c8 9c       	mul	r12, r8
   24448:	b0 0d       	add	r27, r0
   2444a:	e1 1d       	adc	r30, r1
   2444c:	fa 1f       	adc	r31, r26
   2444e:	d7 9c       	mul	r13, r7
   24450:	b0 0d       	add	r27, r0
   24452:	e1 1d       	adc	r30, r1
   24454:	fa 1f       	adc	r31, r26
   24456:	e6 9c       	mul	r14, r6
   24458:	b0 0d       	add	r27, r0
   2445a:	e1 1d       	adc	r30, r1
   2445c:	fa 1f       	adc	r31, r26
   2445e:	d6 9c       	mul	r13, r6
   24460:	b1 0d       	add	r27, r1
   24462:	ea 1f       	adc	r30, r26
   24464:	fa 1f       	adc	r31, r26
   24466:	bb 0f       	add	r27, r27
   24468:	ea 1f       	adc	r30, r26
   2446a:	fa 1f       	adc	r31, r26
   2446c:	11 24       	eor	r1, r1

        if (step_rate > acc_step_rate) { // Check step_rate stays positive
   2446e:	20 91 71 05 	lds	r18, 0x0571	; 0x800571 <acc_step_rate>
   24472:	30 91 72 05 	lds	r19, 0x0572	; 0x800572 <acc_step_rate+0x1>
   24476:	8e ad       	ldd	r24, Y+62	; 0x3e
   24478:	9f ad       	ldd	r25, Y+63	; 0x3f
   2447a:	2e 17       	cp	r18, r30
   2447c:	3f 07       	cpc	r19, r31
   2447e:	30 f0       	brcs	.+12     	; 0x2448c <__vector_17+0xdbc>
            step_rate = uint16_t(current_block->final_rate);
        }
        else {
            step_rate = acc_step_rate - step_rate; // Decelerate from acceleration end point.
   24480:	2e 1b       	sub	r18, r30
   24482:	3f 0b       	sbc	r19, r31
   24484:	82 17       	cp	r24, r18
   24486:	93 07       	cpc	r25, r19
   24488:	08 f4       	brcc	.+2      	; 0x2448c <__vector_17+0xdbc>
   2448a:	c9 01       	movw	r24, r18
#endif //_NO_ASM


FORCE_INLINE unsigned short calc_timer(uint16_t step_rate, uint8_t& step_loops) {
  uint16_t timer;
  if(step_rate > MAX_STEP_FREQUENCY) step_rate = MAX_STEP_FREQUENCY;
   2448c:	81 34       	cpi	r24, 0x41	; 65
   2448e:	ac e9       	ldi	r26, 0x9C	; 156
   24490:	9a 07       	cpc	r25, r26
   24492:	08 f0       	brcs	.+2      	; 0x24496 <__vector_17+0xdc6>
   24494:	75 c0       	rjmp	.+234    	; 0x24580 <__vector_17+0xeb0>

  if(step_rate > 20000) { // If steprate > 20kHz >> step 4 times
   24496:	81 32       	cpi	r24, 0x21	; 33
   24498:	be e4       	ldi	r27, 0x4E	; 78
   2449a:	9b 07       	cpc	r25, r27
   2449c:	08 f4       	brcc	.+2      	; 0x244a0 <__vector_17+0xdd0>
   2449e:	73 c0       	rjmp	.+230    	; 0x24586 <__vector_17+0xeb6>
    step_rate = (step_rate >> 2)&0x3fff;
   244a0:	96 95       	lsr	r25
   244a2:	87 95       	ror	r24
   244a4:	96 95       	lsr	r25
   244a6:	87 95       	ror	r24
    step_loops = 4;
   244a8:	24 e0       	ldi	r18, 0x04	; 4
  }
  else if(step_rate > 10000) { // If steprate > 10kHz >> step 2 times
    step_rate = (step_rate >> 1)&0x7fff;
    step_loops = 2;
   244aa:	20 93 70 05 	sts	0x0570, r18	; 0x800570 <step_loops>
  else {
    step_loops = 1;
  }

  if(step_rate < (F_CPU/500000)) step_rate = (F_CPU/500000);
  step_rate -= (F_CPU/500000); // Correct for minimal speed
   244ae:	80 97       	sbiw	r24, 0x20	; 32
  if(step_rate >= (8*256)){ // higher step rate
   244b0:	81 15       	cp	r24, r1
   244b2:	f8 e0       	ldi	r31, 0x08	; 8
   244b4:	9f 07       	cpc	r25, r31
   244b6:	08 f4       	brcc	.+2      	; 0x244ba <__vector_17+0xdea>
   244b8:	78 c0       	rjmp	.+240    	; 0x245aa <__vector_17+0xeda>
    unsigned short table_address = (unsigned short)&speed_lookuptable_fast[(unsigned char)(step_rate>>8)][0];
   244ba:	e9 2f       	mov	r30, r25
   244bc:	ff 27       	eor	r31, r31
   244be:	ee 0f       	add	r30, r30
   244c0:	ff 1f       	adc	r31, r31
   244c2:	ee 0f       	add	r30, r30
   244c4:	ff 1f       	adc	r31, r31
   244c6:	9f 01       	movw	r18, r30
   244c8:	2c 56       	subi	r18, 0x6C	; 108
   244ca:	30 47       	sbci	r19, 0x70	; 112
    unsigned char tmp_step_rate = (step_rate & 0x00ff);
    uint16_t gain = (uint16_t)pgm_read_word_near(table_address+2);
   244cc:	f9 01       	movw	r30, r18
   244ce:	32 96       	adiw	r30, 0x02	; 2
   244d0:	a5 91       	lpm	r26, Z+
   244d2:	b4 91       	lpm	r27, Z
    timer = (unsigned short)pgm_read_word_near(table_address) - MUL8x16R8(tmp_step_rate, gain);
   244d4:	f9 01       	movw	r30, r18
   244d6:	25 91       	lpm	r18, Z+
   244d8:	34 91       	lpm	r19, Z
    "clr r1" "\n\t"         //make r1 __zero_reg__ again
    "adc %B0, r1" "\n\t"    //propagate carry of addition (add 0 with carry)
    : "=&r" (out)
    : "r" (x), "r" (y)
    : "r0", "r1"            //clobbers: Technically these are either scratch registers or always 0 registers, but I'm making sure the compiler knows just in case.
    );
   244da:	b8 9f       	mul	r27, r24
   244dc:	f0 01       	movw	r30, r0
   244de:	a8 9f       	mul	r26, r24
   244e0:	00 0c       	add	r0, r0
   244e2:	e1 1d       	adc	r30, r1
   244e4:	11 24       	eor	r1, r1
   244e6:	f1 1d       	adc	r31, r1
  }
  else { // lower step rates
    unsigned short table_address = (unsigned short)&speed_lookuptable_slow[0][0];
    table_address += ((step_rate)>>1) & 0xfffc;
    timer = (unsigned short)pgm_read_word_near(table_address);
    timer -= (((unsigned short)pgm_read_word_near(table_address+2) * (unsigned char)(step_rate & 0x0007))>>3);
   244e8:	2e 1b       	sub	r18, r30
   244ea:	3f 0b       	sbc	r19, r31
   244ec:	c9 01       	movw	r24, r18
   244ee:	24 36       	cpi	r18, 0x64	; 100
   244f0:	31 05       	cpc	r19, r1
   244f2:	10 f4       	brcc	.+4      	; 0x244f8 <__vector_17+0xe28>
   244f4:	84 e6       	ldi	r24, 0x64	; 100
   244f6:	90 e0       	ldi	r25, 0x00	; 0
                step_rate = uint16_t(current_block->final_rate);
        }

        // Step_rate to timer interval.
        uint16_t timer = calc_timer(step_rate, step_loops);
        _NEXT_ISR(timer);
   244f8:	90 93 4f 04 	sts	0x044F, r25	; 0x80044f <_ZL11nextMainISR.lto_priv.438+0x1>
   244fc:	80 93 4e 04 	sts	0x044E, r24	; 0x80044e <_ZL11nextMainISR.lto_priv.438>
   24500:	90 93 4b 04 	sts	0x044B, r25	; 0x80044b <_ZL9main_Rate.lto_priv.440+0x1>
   24504:	80 93 4a 04 	sts	0x044A, r24	; 0x80044a <_ZL9main_Rate.lto_priv.440>
        deceleration_time += timer;
   24508:	c8 0e       	add	r12, r24
   2450a:	d9 1e       	adc	r13, r25
   2450c:	e1 1c       	adc	r14, r1
   2450e:	f1 1c       	adc	r15, r1
   24510:	c0 92 74 05 	sts	0x0574, r12	; 0x800574 <deceleration_time>
   24514:	d0 92 75 05 	sts	0x0575, r13	; 0x800575 <deceleration_time+0x1>
   24518:	e0 92 76 05 	sts	0x0576, r14	; 0x800576 <deceleration_time+0x2>
   2451c:	f0 92 77 05 	sts	0x0577, r15	; 0x800577 <deceleration_time+0x3>

#ifdef LIN_ADVANCE
        if (current_block->use_advance_lead) {
   24520:	fe 01       	movw	r30, r28
   24522:	e4 5b       	subi	r30, 0xB4	; 180
   24524:	ff 4f       	sbci	r31, 0xFF	; 255
   24526:	80 81       	ld	r24, Z
   24528:	88 23       	and	r24, r24
   2452a:	09 f4       	brne	.+2      	; 0x2452e <__vector_17+0xe5e>
   2452c:	bc ce       	rjmp	.-648    	; 0x242a6 <__vector_17+0xbd6>
            if (step_events_completed.wide <= current_block->decelerate_after + step_loops) {
   2452e:	80 91 53 05 	lds	r24, 0x0553	; 0x800553 <step_events_completed>
   24532:	90 91 54 05 	lds	r25, 0x0554	; 0x800554 <step_events_completed+0x1>
   24536:	a0 91 55 05 	lds	r26, 0x0555	; 0x800555 <step_events_completed+0x2>
   2453a:	b0 91 56 05 	lds	r27, 0x0556	; 0x800556 <step_events_completed+0x3>
   2453e:	20 91 70 05 	lds	r18, 0x0570	; 0x800570 <step_loops>
   24542:	42 0f       	add	r20, r18
   24544:	51 1d       	adc	r21, r1
   24546:	61 1d       	adc	r22, r1
   24548:	71 1d       	adc	r23, r1
   2454a:	48 17       	cp	r20, r24
   2454c:	59 07       	cpc	r21, r25
   2454e:	6a 07       	cpc	r22, r26
   24550:	7b 07       	cpc	r23, r27
   24552:	08 f4       	brcc	.+2      	; 0x24556 <__vector_17+0xe86>
   24554:	a8 ce       	rjmp	.-688    	; 0x242a6 <__vector_17+0xbd6>
                target_adv_steps = current_block->final_adv_steps;
   24556:	35 96       	adiw	r30, 0x05	; 5
   24558:	20 81       	ld	r18, Z
   2455a:	31 81       	ldd	r19, Z+1	; 0x01
   2455c:	30 93 6b 05 	sts	0x056B, r19	; 0x80056b <target_adv_steps+0x1>
   24560:	20 93 6a 05 	sts	0x056A, r18	; 0x80056a <target_adv_steps>
                la_state = ADV_INIT | ADV_ACC_VARY;
                if (e_extruding && current_adv_steps < target_adv_steps)
   24564:	80 91 57 05 	lds	r24, 0x0557	; 0x800557 <e_extruding>
   24568:	88 23       	and	r24, r24
   2456a:	09 f4       	brne	.+2      	; 0x2456e <__vector_17+0xe9e>
   2456c:	33 cf       	rjmp	.-410    	; 0x243d4 <__vector_17+0xd04>
   2456e:	80 91 48 04 	lds	r24, 0x0448	; 0x800448 <_ZL17current_adv_steps.lto_priv.441>
   24572:	90 91 49 04 	lds	r25, 0x0449	; 0x800449 <_ZL17current_adv_steps.lto_priv.441+0x1>
   24576:	82 17       	cp	r24, r18
   24578:	93 07       	cpc	r25, r19
   2457a:	08 f0       	brcs	.+2      	; 0x2457e <__vector_17+0xeae>
   2457c:	2b cf       	rjmp	.-426    	; 0x243d4 <__vector_17+0xd04>
   2457e:	37 cf       	rjmp	.-402    	; 0x243ee <__vector_17+0xd1e>
#endif //_NO_ASM


FORCE_INLINE unsigned short calc_timer(uint16_t step_rate, uint8_t& step_loops) {
  uint16_t timer;
  if(step_rate > MAX_STEP_FREQUENCY) step_rate = MAX_STEP_FREQUENCY;
   24580:	80 e4       	ldi	r24, 0x40	; 64
   24582:	9c e9       	ldi	r25, 0x9C	; 156
   24584:	8d cf       	rjmp	.-230    	; 0x244a0 <__vector_17+0xdd0>

  if(step_rate > 20000) { // If steprate > 20kHz >> step 4 times
    step_rate = (step_rate >> 2)&0x3fff;
    step_loops = 4;
  }
  else if(step_rate > 10000) { // If steprate > 10kHz >> step 2 times
   24586:	81 31       	cpi	r24, 0x11	; 17
   24588:	e7 e2       	ldi	r30, 0x27	; 39
   2458a:	9e 07       	cpc	r25, r30
   2458c:	20 f0       	brcs	.+8      	; 0x24596 <__vector_17+0xec6>
    step_rate = (step_rate >> 1)&0x7fff;
   2458e:	96 95       	lsr	r25
   24590:	87 95       	ror	r24
    step_loops = 2;
   24592:	22 e0       	ldi	r18, 0x02	; 2
   24594:	8a cf       	rjmp	.-236    	; 0x244aa <__vector_17+0xdda>
  }
  else {
    step_loops = 1;
   24596:	21 e0       	ldi	r18, 0x01	; 1
   24598:	20 93 70 05 	sts	0x0570, r18	; 0x800570 <step_loops>
   2459c:	80 32       	cpi	r24, 0x20	; 32
   2459e:	91 05       	cpc	r25, r1
   245a0:	08 f0       	brcs	.+2      	; 0x245a4 <__vector_17+0xed4>
   245a2:	85 cf       	rjmp	.-246    	; 0x244ae <__vector_17+0xdde>
   245a4:	80 e2       	ldi	r24, 0x20	; 32
   245a6:	90 e0       	ldi	r25, 0x00	; 0
   245a8:	82 cf       	rjmp	.-252    	; 0x244ae <__vector_17+0xdde>
    uint16_t gain = (uint16_t)pgm_read_word_near(table_address+2);
    timer = (unsigned short)pgm_read_word_near(table_address) - MUL8x16R8(tmp_step_rate, gain);
  }
  else { // lower step rates
    unsigned short table_address = (unsigned short)&speed_lookuptable_slow[0][0];
    table_address += ((step_rate)>>1) & 0xfffc;
   245aa:	dc 01       	movw	r26, r24
   245ac:	b6 95       	lsr	r27
   245ae:	a7 95       	ror	r26
   245b0:	ac 7f       	andi	r26, 0xFC	; 252
   245b2:	ac 56       	subi	r26, 0x6C	; 108
   245b4:	b4 47       	sbci	r27, 0x74	; 116
    timer = (unsigned short)pgm_read_word_near(table_address);
   245b6:	fd 01       	movw	r30, r26
   245b8:	25 91       	lpm	r18, Z+
   245ba:	34 91       	lpm	r19, Z
    timer -= (((unsigned short)pgm_read_word_near(table_address+2) * (unsigned char)(step_rate & 0x0007))>>3);
   245bc:	fd 01       	movw	r30, r26
   245be:	32 96       	adiw	r30, 0x02	; 2
   245c0:	a5 91       	lpm	r26, Z+
   245c2:	b4 91       	lpm	r27, Z
   245c4:	87 70       	andi	r24, 0x07	; 7
   245c6:	99 27       	eor	r25, r25
   245c8:	8a 9f       	mul	r24, r26
   245ca:	f0 01       	movw	r30, r0
   245cc:	8b 9f       	mul	r24, r27
   245ce:	f0 0d       	add	r31, r0
   245d0:	9a 9f       	mul	r25, r26
   245d2:	f0 0d       	add	r31, r0
   245d4:	11 24       	eor	r1, r1
   245d6:	a3 e0       	ldi	r26, 0x03	; 3
   245d8:	f6 95       	lsr	r31
   245da:	e7 95       	ror	r30
   245dc:	aa 95       	dec	r26
   245de:	e1 f7       	brne	.-8      	; 0x245d8 <__vector_17+0xf08>
   245e0:	83 cf       	rjmp	.-250    	; 0x244e8 <__vector_17+0xe18>
            }
        }
#endif
      }
      else {
        if (! step_loops_nominal) {
   245e2:	80 91 73 05 	lds	r24, 0x0573	; 0x800573 <step_loops_nominal>
   245e6:	88 23       	and	r24, r24
   245e8:	71 f0       	breq	.+28     	; 0x24606 <__vector_17+0xf36>
      stepper_tick_highres();


#ifdef LIN_ADVANCE
    if (e_steps) WRITE_NC(E0_DIR_PIN, e_steps < 0? INVERT_E0_DIR: !INVERT_E0_DIR);
    uint8_t la_state = 0;
   245ea:	80 e0       	ldi	r24, 0x00	; 0
              if (e_extruding)
                  target_adv_steps = current_adv_steps;
          }
#endif
        }
        _NEXT_ISR(OCR1A_nominal);
   245ec:	20 91 4d 05 	lds	r18, 0x054D	; 0x80054d <OCR1A_nominal>
   245f0:	30 91 4e 05 	lds	r19, 0x054E	; 0x80054e <OCR1A_nominal+0x1>
   245f4:	30 93 4f 04 	sts	0x044F, r19	; 0x80044f <_ZL11nextMainISR.lto_priv.438+0x1>
   245f8:	20 93 4e 04 	sts	0x044E, r18	; 0x80044e <_ZL11nextMainISR.lto_priv.438>
   245fc:	30 93 4b 04 	sts	0x044B, r19	; 0x80044b <_ZL9main_Rate.lto_priv.440+0x1>
   24600:	20 93 4a 04 	sts	0x044A, r18	; 0x80044a <_ZL9main_Rate.lto_priv.440>
   24604:	51 ce       	rjmp	.-862    	; 0x242a8 <__vector_17+0xbd8>
      }
      else {
        if (! step_loops_nominal) {
          // Calculation of the steady state timer rate has been delayed to the 1st tick of the steady state to lower
          // the initial interrupt blocking.
          OCR1A_nominal = calc_timer(uint16_t(current_block->nominal_rate), step_loops);
   24606:	8e a9       	ldd	r24, Y+54	; 0x36
   24608:	9f a9       	ldd	r25, Y+55	; 0x37
#endif //_NO_ASM


FORCE_INLINE unsigned short calc_timer(uint16_t step_rate, uint8_t& step_loops) {
  uint16_t timer;
  if(step_rate > MAX_STEP_FREQUENCY) step_rate = MAX_STEP_FREQUENCY;
   2460a:	81 34       	cpi	r24, 0x41	; 65
   2460c:	2c e9       	ldi	r18, 0x9C	; 156
   2460e:	92 07       	cpc	r25, r18
   24610:	08 f0       	brcs	.+2      	; 0x24614 <__vector_17+0xf44>
   24612:	4e c0       	rjmp	.+156    	; 0x246b0 <__vector_17+0xfe0>

  if(step_rate > 20000) { // If steprate > 20kHz >> step 4 times
   24614:	81 32       	cpi	r24, 0x21	; 33
   24616:	4e e4       	ldi	r20, 0x4E	; 78
   24618:	94 07       	cpc	r25, r20
   2461a:	08 f4       	brcc	.+2      	; 0x2461e <__vector_17+0xf4e>
   2461c:	4c c0       	rjmp	.+152    	; 0x246b6 <__vector_17+0xfe6>
    step_rate = (step_rate >> 2)&0x3fff;
   2461e:	96 95       	lsr	r25
   24620:	87 95       	ror	r24
   24622:	96 95       	lsr	r25
   24624:	87 95       	ror	r24
    step_loops = 4;
   24626:	24 e0       	ldi	r18, 0x04	; 4
  }
  else if(step_rate > 10000) { // If steprate > 10kHz >> step 2 times
    step_rate = (step_rate >> 1)&0x7fff;
    step_loops = 2;
   24628:	20 93 70 05 	sts	0x0570, r18	; 0x800570 <step_loops>
  else {
    step_loops = 1;
  }

  if(step_rate < (F_CPU/500000)) step_rate = (F_CPU/500000);
  step_rate -= (F_CPU/500000); // Correct for minimal speed
   2462c:	80 97       	sbiw	r24, 0x20	; 32
  if(step_rate >= (8*256)){ // higher step rate
   2462e:	81 15       	cp	r24, r1
   24630:	a8 e0       	ldi	r26, 0x08	; 8
   24632:	9a 07       	cpc	r25, r26
   24634:	08 f4       	brcc	.+2      	; 0x24638 <__vector_17+0xf68>
   24636:	51 c0       	rjmp	.+162    	; 0x246da <__vector_17+0x100a>
    unsigned short table_address = (unsigned short)&speed_lookuptable_fast[(unsigned char)(step_rate>>8)][0];
   24638:	e9 2f       	mov	r30, r25
   2463a:	ff 27       	eor	r31, r31
   2463c:	ee 0f       	add	r30, r30
   2463e:	ff 1f       	adc	r31, r31
   24640:	ee 0f       	add	r30, r30
   24642:	ff 1f       	adc	r31, r31
   24644:	9f 01       	movw	r18, r30
   24646:	2c 56       	subi	r18, 0x6C	; 108
   24648:	30 47       	sbci	r19, 0x70	; 112
    unsigned char tmp_step_rate = (step_rate & 0x00ff);
    uint16_t gain = (uint16_t)pgm_read_word_near(table_address+2);
   2464a:	f9 01       	movw	r30, r18
   2464c:	32 96       	adiw	r30, 0x02	; 2
   2464e:	65 91       	lpm	r22, Z+
   24650:	74 91       	lpm	r23, Z
    timer = (unsigned short)pgm_read_word_near(table_address) - MUL8x16R8(tmp_step_rate, gain);
   24652:	f9 01       	movw	r30, r18
   24654:	25 91       	lpm	r18, Z+
   24656:	34 91       	lpm	r19, Z
    "clr r1" "\n\t"         //make r1 __zero_reg__ again
    "adc %B0, r1" "\n\t"    //propagate carry of addition (add 0 with carry)
    : "=&r" (out)
    : "r" (x), "r" (y)
    : "r0", "r1"            //clobbers: Technically these are either scratch registers or always 0 registers, but I'm making sure the compiler knows just in case.
    );
   24658:	78 9f       	mul	r23, r24
   2465a:	a0 01       	movw	r20, r0
   2465c:	68 9f       	mul	r22, r24
   2465e:	00 0c       	add	r0, r0
   24660:	41 1d       	adc	r20, r1
   24662:	11 24       	eor	r1, r1
   24664:	51 1d       	adc	r21, r1
  step_rate -= (F_CPU/500000); // Correct for minimal speed
  if(step_rate >= (8*256)){ // higher step rate
    unsigned short table_address = (unsigned short)&speed_lookuptable_fast[(unsigned char)(step_rate>>8)][0];
    unsigned char tmp_step_rate = (step_rate & 0x00ff);
    uint16_t gain = (uint16_t)pgm_read_word_near(table_address+2);
    timer = (unsigned short)pgm_read_word_near(table_address) - MUL8x16R8(tmp_step_rate, gain);
   24666:	c9 01       	movw	r24, r18
   24668:	84 1b       	sub	r24, r20
   2466a:	95 0b       	sbc	r25, r21
   2466c:	84 36       	cpi	r24, 0x64	; 100
   2466e:	91 05       	cpc	r25, r1
   24670:	10 f4       	brcc	.+4      	; 0x24676 <__vector_17+0xfa6>
   24672:	84 e6       	ldi	r24, 0x64	; 100
   24674:	90 e0       	ldi	r25, 0x00	; 0
   24676:	90 93 4e 05 	sts	0x054E, r25	; 0x80054e <OCR1A_nominal+0x1>
   2467a:	80 93 4d 05 	sts	0x054D, r24	; 0x80054d <OCR1A_nominal>
          step_loops_nominal = step_loops;
   2467e:	80 91 70 05 	lds	r24, 0x0570	; 0x800570 <step_loops>
   24682:	80 93 73 05 	sts	0x0573, r24	; 0x800573 <step_loops_nominal>

#ifdef LIN_ADVANCE
          if(current_block->use_advance_lead) {
   24686:	fe 01       	movw	r30, r28
   24688:	e4 5b       	subi	r30, 0xB4	; 180
   2468a:	ff 4f       	sbci	r31, 0xFF	; 255
   2468c:	80 81       	ld	r24, Z
   2468e:	88 23       	and	r24, r24
   24690:	09 f4       	brne	.+2      	; 0x24694 <__vector_17+0xfc4>
   24692:	ab cf       	rjmp	.-170    	; 0x245ea <__vector_17+0xf1a>
              // Due to E-jerk, there can be discontinuities in pressure state where an
              // acceleration or deceleration can be skipped or joined with the previous block.
              // If LA was not previously active, re-check the pressure level
              la_state = ADV_INIT;
              if (e_extruding)
   24694:	80 91 57 05 	lds	r24, 0x0557	; 0x800557 <e_extruding>
   24698:	88 23       	and	r24, r24
   2469a:	41 f0       	breq	.+16     	; 0x246ac <__vector_17+0xfdc>
                  target_adv_steps = current_adv_steps;
   2469c:	80 91 48 04 	lds	r24, 0x0448	; 0x800448 <_ZL17current_adv_steps.lto_priv.441>
   246a0:	90 91 49 04 	lds	r25, 0x0449	; 0x800449 <_ZL17current_adv_steps.lto_priv.441+0x1>
   246a4:	90 93 6b 05 	sts	0x056B, r25	; 0x80056b <target_adv_steps+0x1>
   246a8:	80 93 6a 05 	sts	0x056A, r24	; 0x80056a <target_adv_steps>
#ifdef LIN_ADVANCE
          if(current_block->use_advance_lead) {
              // Due to E-jerk, there can be discontinuities in pressure state where an
              // acceleration or deceleration can be skipped or joined with the previous block.
              // If LA was not previously active, re-check the pressure level
              la_state = ADV_INIT;
   246ac:	81 e0       	ldi	r24, 0x01	; 1
   246ae:	9e cf       	rjmp	.-196    	; 0x245ec <__vector_17+0xf1c>
#endif //_NO_ASM


FORCE_INLINE unsigned short calc_timer(uint16_t step_rate, uint8_t& step_loops) {
  uint16_t timer;
  if(step_rate > MAX_STEP_FREQUENCY) step_rate = MAX_STEP_FREQUENCY;
   246b0:	80 e4       	ldi	r24, 0x40	; 64
   246b2:	9c e9       	ldi	r25, 0x9C	; 156
   246b4:	b4 cf       	rjmp	.-152    	; 0x2461e <__vector_17+0xf4e>

  if(step_rate > 20000) { // If steprate > 20kHz >> step 4 times
    step_rate = (step_rate >> 2)&0x3fff;
    step_loops = 4;
  }
  else if(step_rate > 10000) { // If steprate > 10kHz >> step 2 times
   246b6:	81 31       	cpi	r24, 0x11	; 17
   246b8:	57 e2       	ldi	r21, 0x27	; 39
   246ba:	95 07       	cpc	r25, r21
   246bc:	20 f0       	brcs	.+8      	; 0x246c6 <__vector_17+0xff6>
    step_rate = (step_rate >> 1)&0x7fff;
   246be:	96 95       	lsr	r25
   246c0:	87 95       	ror	r24
    step_loops = 2;
   246c2:	22 e0       	ldi	r18, 0x02	; 2
   246c4:	b1 cf       	rjmp	.-158    	; 0x24628 <__vector_17+0xf58>
  }
  else {
    step_loops = 1;
   246c6:	21 e0       	ldi	r18, 0x01	; 1
   246c8:	20 93 70 05 	sts	0x0570, r18	; 0x800570 <step_loops>
   246cc:	80 32       	cpi	r24, 0x20	; 32
   246ce:	91 05       	cpc	r25, r1
   246d0:	08 f0       	brcs	.+2      	; 0x246d4 <__vector_17+0x1004>
   246d2:	ac cf       	rjmp	.-168    	; 0x2462c <__vector_17+0xf5c>
   246d4:	80 e2       	ldi	r24, 0x20	; 32
   246d6:	90 e0       	ldi	r25, 0x00	; 0
   246d8:	a9 cf       	rjmp	.-174    	; 0x2462c <__vector_17+0xf5c>
    uint16_t gain = (uint16_t)pgm_read_word_near(table_address+2);
    timer = (unsigned short)pgm_read_word_near(table_address) - MUL8x16R8(tmp_step_rate, gain);
  }
  else { // lower step rates
    unsigned short table_address = (unsigned short)&speed_lookuptable_slow[0][0];
    table_address += ((step_rate)>>1) & 0xfffc;
   246da:	9c 01       	movw	r18, r24
   246dc:	36 95       	lsr	r19
   246de:	27 95       	ror	r18
   246e0:	2c 7f       	andi	r18, 0xFC	; 252
   246e2:	2c 56       	subi	r18, 0x6C	; 108
   246e4:	34 47       	sbci	r19, 0x74	; 116
    timer = (unsigned short)pgm_read_word_near(table_address);
   246e6:	f9 01       	movw	r30, r18
   246e8:	45 91       	lpm	r20, Z+
   246ea:	54 91       	lpm	r21, Z
    timer -= (((unsigned short)pgm_read_word_near(table_address+2) * (unsigned char)(step_rate & 0x0007))>>3);
   246ec:	f9 01       	movw	r30, r18
   246ee:	32 96       	adiw	r30, 0x02	; 2
   246f0:	65 91       	lpm	r22, Z+
   246f2:	74 91       	lpm	r23, Z
   246f4:	87 70       	andi	r24, 0x07	; 7
   246f6:	99 27       	eor	r25, r25
   246f8:	86 9f       	mul	r24, r22
   246fa:	90 01       	movw	r18, r0
   246fc:	87 9f       	mul	r24, r23
   246fe:	30 0d       	add	r19, r0
   24700:	96 9f       	mul	r25, r22
   24702:	30 0d       	add	r19, r0
   24704:	11 24       	eor	r1, r1
   24706:	a3 e0       	ldi	r26, 0x03	; 3
   24708:	36 95       	lsr	r19
   2470a:	27 95       	ror	r18
   2470c:	aa 95       	dec	r26
   2470e:	e1 f7       	brne	.-8      	; 0x24708 <__vector_17+0x1038>
   24710:	ca 01       	movw	r24, r20
   24712:	82 1b       	sub	r24, r18
   24714:	93 0b       	sbc	r25, r19
   24716:	aa cf       	rjmp	.-172    	; 0x2466c <__vector_17+0xf9c>
            la_state = 0;
            nextAdvanceISR = ADV_NEVER;
        }
        else {
            // reset error and iterations per loop for this phase
            eISR_Err = current_block->advance_rate;
   24718:	de 01       	movw	r26, r28
   2471a:	a3 5b       	subi	r26, 0xB3	; 179
   2471c:	bf 4f       	sbci	r27, 0xFF	; 255
   2471e:	4d 91       	ld	r20, X+
   24720:	5c 91       	ld	r21, X
   24722:	11 97       	sbiw	r26, 0x01	; 1
   24724:	70 e0       	ldi	r23, 0x00	; 0
   24726:	60 e0       	ldi	r22, 0x00	; 0
   24728:	40 93 49 05 	sts	0x0549, r20	; 0x800549 <eISR_Err>
   2472c:	50 93 4a 05 	sts	0x054A, r21	; 0x80054a <eISR_Err+0x1>
   24730:	60 93 4b 05 	sts	0x054B, r22	; 0x80054b <eISR_Err+0x2>
   24734:	70 93 4c 05 	sts	0x054C, r23	; 0x80054c <eISR_Err+0x3>
            e_step_loops = current_block->advance_step_loops;
   24738:	16 96       	adiw	r26, 0x06	; 6
   2473a:	9c 91       	ld	r25, X
   2473c:	90 93 48 05 	sts	0x0548, r25	; 0x800548 <e_step_loops>

            if ((la_state & ADV_ACC_VARY) && e_extruding && (current_adv_steps > target_adv_steps)) {
   24740:	98 2f       	mov	r25, r24
   24742:	92 70       	andi	r25, 0x02	; 2
   24744:	09 f4       	brne	.+2      	; 0x24748 <__vector_17+0x1078>
   24746:	c8 cd       	rjmp	.-1136   	; 0x242d8 <__vector_17+0xc08>
   24748:	90 91 57 05 	lds	r25, 0x0557	; 0x800557 <e_extruding>
   2474c:	99 23       	and	r25, r25
   2474e:	09 f4       	brne	.+2      	; 0x24752 <__vector_17+0x1082>
   24750:	c3 cd       	rjmp	.-1146   	; 0x242d8 <__vector_17+0xc08>
   24752:	2e 17       	cp	r18, r30
   24754:	3f 07       	cpc	r19, r31
   24756:	08 f0       	brcs	.+2      	; 0x2475a <__vector_17+0x108a>
   24758:	bf cd       	rjmp	.-1154   	; 0x242d8 <__vector_17+0xc08>
                // LA could reverse the direction of extrusion in this phase
                eISR_Err += current_block->advance_rate;
   2475a:	44 0f       	add	r20, r20
   2475c:	55 1f       	adc	r21, r21
   2475e:	66 1f       	adc	r22, r22
   24760:	77 1f       	adc	r23, r23
   24762:	40 93 49 05 	sts	0x0549, r20	; 0x800549 <eISR_Err>
   24766:	50 93 4a 05 	sts	0x054A, r21	; 0x80054a <eISR_Err+0x1>
   2476a:	60 93 4b 05 	sts	0x054B, r22	; 0x80054b <eISR_Err+0x2>
   2476e:	70 93 4c 05 	sts	0x054C, r23	; 0x80054c <eISR_Err+0x3>
                LA_phase = 0;
   24772:	10 92 68 05 	sts	0x0568, r1	; 0x800568 <LA_phase>
   24776:	b0 cd       	rjmp	.-1184   	; 0x242d8 <__vector_17+0xc08>
   24778:	40 92 49 05 	sts	0x0549, r4	; 0x800549 <eISR_Err>
   2477c:	50 92 4a 05 	sts	0x054A, r5	; 0x80054a <eISR_Err+0x1>
   24780:	60 92 4b 05 	sts	0x054B, r6	; 0x80054b <eISR_Err+0x2>
   24784:	70 92 4c 05 	sts	0x054C, r7	; 0x80054c <eISR_Err+0x3>
    while(eISR_Err >= current_block->advance_rate)
    {
        ++ticks;
        eISR_Err -= current_block->advance_rate;
    }
    if(!ticks)
   24788:	61 11       	cpse	r22, r1
   2478a:	1d c0       	rjmp	.+58     	; 0x247c6 <__vector_17+0x10f6>
    {
        eISR_Rate = timer;
   2478c:	f0 93 47 05 	sts	0x0547, r31	; 0x800547 <eISR_Rate+0x1>
   24790:	e0 93 46 05 	sts	0x0546, r30	; 0x800546 <eISR_Rate>
        nextAdvanceISR = timer;
   24794:	f0 93 4d 04 	sts	0x044D, r31	; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1>
   24798:	e0 93 4c 04 	sts	0x044C, r30	; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439>
        }
    }
    if (la_state & ADV_INIT || nextAdvanceISR != ADV_NEVER) {
        // update timers & phase for the next iteration
        advance_spread(main_Rate);
        if (LA_phase >= 0) {
   2479c:	80 91 68 05 	lds	r24, 0x0568	; 0x800568 <LA_phase>
   247a0:	87 fd       	sbrc	r24, 7
   247a2:	5a c0       	rjmp	.+180    	; 0x24858 <__vector_17+0x1188>
            if (step_loops == e_step_loops)
   247a4:	80 91 70 05 	lds	r24, 0x0570	; 0x800570 <step_loops>
   247a8:	10 91 48 05 	lds	r17, 0x0548	; 0x800548 <e_step_loops>
   247ac:	c3 5b       	subi	r28, 0xB3	; 179
   247ae:	df 4f       	sbci	r29, 0xFF	; 255
   247b0:	28 81       	ld	r18, Y
   247b2:	39 81       	ldd	r19, Y+1	; 0x01
   247b4:	81 13       	cpse	r24, r17
   247b6:	35 c0       	rjmp	.+106    	; 0x24822 <__vector_17+0x1152>
                LA_phase = (current_block->advance_rate < main_Rate);
   247b8:	81 e0       	ldi	r24, 0x01	; 1
   247ba:	2e 17       	cp	r18, r30
   247bc:	3f 07       	cpc	r19, r31
   247be:	08 f4       	brcc	.+2      	; 0x247c2 <__vector_17+0x10f2>
   247c0:	49 c0       	rjmp	.+146    	; 0x24854 <__vector_17+0x1184>
            else {
                // avoid overflow through division. warning: we need to _guarantee_ step_loops
                // and e_step_loops are <= 4 due to fastdiv's limit
                auto adv_rate_n = fastdiv(current_block->advance_rate, step_loops);
                auto main_rate_n = fastdiv(main_Rate, e_step_loops);
                LA_phase = (adv_rate_n < main_rate_n);
   247c2:	80 e0       	ldi	r24, 0x00	; 0
   247c4:	47 c0       	rjmp	.+142    	; 0x24854 <__vector_17+0x1184>
        eISR_Rate = timer;
        nextAdvanceISR = timer;
        return;
    }

    if (ticks <= 3)
   247c6:	64 30       	cpi	r22, 0x04	; 4
   247c8:	28 f5       	brcc	.+74     	; 0x24814 <__vector_17+0x1144>
        eISR_Rate = fastdiv(timer, ticks + 1);
   247ca:	6f 5f       	subi	r22, 0xFF	; 255
#ifdef LIN_ADVANCE
// @wavexx: fast uint16_t division for small dividends<5
//          q/3 based on "Hacker's delight" formula
FORCE_INLINE uint16_t fastdiv(uint16_t q, uint8_t d)
{
    if(d != 3) return q >> (d / 2);
   247cc:	63 30       	cpi	r22, 0x03	; 3
   247ce:	a9 f0       	breq	.+42     	; 0x247fa <__vector_17+0x112a>
   247d0:	66 95       	lsr	r22
   247d2:	af 01       	movw	r20, r30
   247d4:	02 c0       	rjmp	.+4      	; 0x247da <__vector_17+0x110a>
   247d6:	56 95       	lsr	r21
   247d8:	47 95       	ror	r20
   247da:	6a 95       	dec	r22
   247dc:	e2 f7       	brpl	.-8      	; 0x247d6 <__vector_17+0x1106>
   247de:	ba 01       	movw	r22, r20
    if (ticks <= 3)
        eISR_Rate = fastdiv(timer, ticks + 1);
    else
    {
        // >4 ticks are still possible on slow moves
        eISR_Rate = timer / (ticks + 1);
   247e0:	70 93 47 05 	sts	0x0547, r23	; 0x800547 <eISR_Rate+0x1>
   247e4:	60 93 46 05 	sts	0x0546, r22	; 0x800546 <eISR_Rate>
    }

    nextAdvanceISR = eISR_Rate;
   247e8:	80 91 46 05 	lds	r24, 0x0546	; 0x800546 <eISR_Rate>
   247ec:	90 91 47 05 	lds	r25, 0x0547	; 0x800547 <eISR_Rate+0x1>
   247f0:	90 93 4d 04 	sts	0x044D, r25	; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1>
   247f4:	80 93 4c 04 	sts	0x044C, r24	; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439>
   247f8:	d1 cf       	rjmp	.-94     	; 0x2479c <__vector_17+0x10cc>
// @wavexx: fast uint16_t division for small dividends<5
//          q/3 based on "Hacker's delight" formula
FORCE_INLINE uint16_t fastdiv(uint16_t q, uint8_t d)
{
    if(d != 3) return q >> (d / 2);
    else return ((uint32_t)0xAAAB * q) >> 17;
   247fa:	9f 01       	movw	r18, r30
   247fc:	ab ea       	ldi	r26, 0xAB	; 171
   247fe:	ba ea       	ldi	r27, 0xAA	; 170
   24800:	0f 94 80 a4 	call	0x34900	; 0x34900 <__umulhisi3>
   24804:	41 e1       	ldi	r20, 0x11	; 17
   24806:	96 95       	lsr	r25
   24808:	87 95       	ror	r24
   2480a:	77 95       	ror	r23
   2480c:	67 95       	ror	r22
   2480e:	4a 95       	dec	r20
   24810:	d1 f7       	brne	.-12     	; 0x24806 <__vector_17+0x1136>
   24812:	e6 cf       	rjmp	.-52     	; 0x247e0 <__vector_17+0x1110>
    if (ticks <= 3)
        eISR_Rate = fastdiv(timer, ticks + 1);
    else
    {
        // >4 ticks are still possible on slow moves
        eISR_Rate = timer / (ticks + 1);
   24814:	70 e0       	ldi	r23, 0x00	; 0
   24816:	6f 5f       	subi	r22, 0xFF	; 255
   24818:	7f 4f       	sbci	r23, 0xFF	; 255
   2481a:	cf 01       	movw	r24, r30
   2481c:	0f 94 a9 a4 	call	0x34952	; 0x34952 <__udivmodhi4>
   24820:	df cf       	rjmp	.-66     	; 0x247e0 <__vector_17+0x1110>
#ifdef LIN_ADVANCE
// @wavexx: fast uint16_t division for small dividends<5
//          q/3 based on "Hacker's delight" formula
FORCE_INLINE uint16_t fastdiv(uint16_t q, uint8_t d)
{
    if(d != 3) return q >> (d / 2);
   24822:	83 30       	cpi	r24, 0x03	; 3
   24824:	09 f4       	brne	.+2      	; 0x24828 <__vector_17+0x1158>
   24826:	a2 c0       	rjmp	.+324    	; 0x2496c <__vector_17+0x129c>
   24828:	86 95       	lsr	r24
   2482a:	a9 01       	movw	r20, r18
   2482c:	02 c0       	rjmp	.+4      	; 0x24832 <__vector_17+0x1162>
   2482e:	56 95       	lsr	r21
   24830:	47 95       	ror	r20
   24832:	8a 95       	dec	r24
   24834:	e2 f7       	brpl	.-8      	; 0x2482e <__vector_17+0x115e>
   24836:	13 30       	cpi	r17, 0x03	; 3
   24838:	09 f4       	brne	.+2      	; 0x2483c <__vector_17+0x116c>
   2483a:	a6 c0       	rjmp	.+332    	; 0x24988 <__vector_17+0x12b8>
   2483c:	16 95       	lsr	r17
   2483e:	bf 01       	movw	r22, r30
   24840:	02 c0       	rjmp	.+4      	; 0x24846 <__vector_17+0x1176>
   24842:	76 95       	lsr	r23
   24844:	67 95       	ror	r22
   24846:	1a 95       	dec	r17
   24848:	e2 f7       	brpl	.-8      	; 0x24842 <__vector_17+0x1172>
            else {
                // avoid overflow through division. warning: we need to _guarantee_ step_loops
                // and e_step_loops are <= 4 due to fastdiv's limit
                auto adv_rate_n = fastdiv(current_block->advance_rate, step_loops);
                auto main_rate_n = fastdiv(main_Rate, e_step_loops);
                LA_phase = (adv_rate_n < main_rate_n);
   2484a:	81 e0       	ldi	r24, 0x01	; 1
   2484c:	46 17       	cp	r20, r22
   2484e:	57 07       	cpc	r21, r23
   24850:	08 f0       	brcs	.+2      	; 0x24854 <__vector_17+0x1184>
   24852:	b7 cf       	rjmp	.-146    	; 0x247c2 <__vector_17+0x10f2>
   24854:	80 93 68 05 	sts	0x0568, r24	; 0x800568 <LA_phase>
        }
    }

    // Check for serial chars. This executes roughtly inbetween 50-60% of the total runtime of the
    // entire isr, making this spot a much better choice than checking during esteps
    MSerial.checkRx();
   24858:	0f 94 1f 03 	call	0x2063e	; 0x2063e <MarlinSerial::checkRx()>
#endif

    // If current block is finished, reset pointer
    if (step_events_completed.wide >= current_block->step_event_count.wide) {
   2485c:	40 91 53 05 	lds	r20, 0x0553	; 0x800553 <step_events_completed>
   24860:	50 91 54 05 	lds	r21, 0x0554	; 0x800554 <step_events_completed+0x1>
   24864:	60 91 55 05 	lds	r22, 0x0555	; 0x800555 <step_events_completed+0x2>
   24868:	70 91 56 05 	lds	r23, 0x0556	; 0x800556 <step_events_completed+0x3>
   2486c:	e0 91 51 12 	lds	r30, 0x1251	; 0x801251 <current_block>
   24870:	f0 91 52 12 	lds	r31, 0x1252	; 0x801252 <current_block+0x1>
   24874:	80 89       	ldd	r24, Z+16	; 0x10
   24876:	91 89       	ldd	r25, Z+17	; 0x11
   24878:	a2 89       	ldd	r26, Z+18	; 0x12
   2487a:	b3 89       	ldd	r27, Z+19	; 0x13
   2487c:	48 17       	cp	r20, r24
   2487e:	59 07       	cpc	r21, r25
   24880:	6a 07       	cpc	r22, r26
   24882:	7b 07       	cpc	r23, r27
   24884:	80 f0       	brcs	.+32     	; 0x248a6 <__vector_17+0x11d6>
      current_block = NULL;
   24886:	10 92 52 12 	sts	0x1252, r1	; 0x801252 <current_block+0x1>
   2488a:	10 92 51 12 	sts	0x1251, r1	; 0x801251 <current_block>
extern volatile uint8_t block_buffer_tail;
// Called when the current block is no longer needed. Discards the block and makes the memory
// available for new blocks.
FORCE_INLINE void plan_discard_current_block()
{
  if (block_buffer_head != block_buffer_tail) {
   2488e:	90 91 3e 0d 	lds	r25, 0x0D3E	; 0x800d3e <block_buffer_head>
   24892:	80 91 3f 0d 	lds	r24, 0x0D3F	; 0x800d3f <block_buffer_tail>
   24896:	98 17       	cp	r25, r24
   24898:	31 f0       	breq	.+12     	; 0x248a6 <__vector_17+0x11d6>
    block_buffer_tail = (block_buffer_tail + 1) & (BLOCK_BUFFER_SIZE - 1);
   2489a:	80 91 3f 0d 	lds	r24, 0x0D3F	; 0x800d3f <block_buffer_tail>
   2489e:	8f 5f       	subi	r24, 0xFF	; 255
   248a0:	8f 70       	andi	r24, 0x0F	; 15
   248a2:	80 93 3f 0d 	sts	0x0D3F, r24	; 0x800d3f <block_buffer_tail>
        WRITE_NC(LOGIC_ANALYZER_CH0, false);
#endif
    }

    // Run the next advance isr if triggered
    bool eisr = !nextAdvanceISR;
   248a6:	60 91 4c 04 	lds	r22, 0x044C	; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439>
   248aa:	70 91 4d 04 	lds	r23, 0x044D	; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1>
    if (eisr)
   248ae:	61 15       	cp	r22, r1
   248b0:	71 05       	cpc	r23, r1
   248b2:	09 f0       	breq	.+2      	; 0x248b6 <__vector_17+0x11e6>
   248b4:	46 c0       	rjmp	.+140    	; 0x24942 <__vector_17+0x1272>

#ifdef LIN_ADVANCE
// Timer interrupt for E. e_steps is set in the main routine.

FORCE_INLINE void advance_isr() {
    if (current_adv_steps > target_adv_steps) {
   248b6:	40 91 48 04 	lds	r20, 0x0448	; 0x800448 <_ZL17current_adv_steps.lto_priv.441>
   248ba:	50 91 49 04 	lds	r21, 0x0449	; 0x800449 <_ZL17current_adv_steps.lto_priv.441+0x1>
   248be:	20 91 6a 05 	lds	r18, 0x056A	; 0x80056a <target_adv_steps>
   248c2:	30 91 6b 05 	lds	r19, 0x056B	; 0x80056b <target_adv_steps+0x1>
   248c6:	80 91 69 05 	lds	r24, 0x0569	; 0x800569 <e_steps>
   248ca:	24 17       	cp	r18, r20
   248cc:	35 07       	cpc	r19, r21
   248ce:	08 f0       	brcs	.+2      	; 0x248d2 <__vector_17+0x1202>
   248d0:	6c c0       	rjmp	.+216    	; 0x249aa <__vector_17+0x12da>
        // decompression
        if (e_step_loops != 1) {
   248d2:	90 91 48 05 	lds	r25, 0x0548	; 0x800548 <e_step_loops>
   248d6:	91 30       	cpi	r25, 0x01	; 1
   248d8:	41 f0       	breq	.+16     	; 0x248ea <__vector_17+0x121a>
            uint16_t d_steps = current_adv_steps - target_adv_steps;
   248da:	42 1b       	sub	r20, r18
   248dc:	53 0b       	sbc	r21, r19
            if (d_steps < e_step_loops)
   248de:	94 17       	cp	r25, r20
   248e0:	15 06       	cpc	r1, r21
   248e2:	19 f0       	breq	.+6      	; 0x248ea <__vector_17+0x121a>
   248e4:	10 f0       	brcs	.+4      	; 0x248ea <__vector_17+0x121a>
                e_step_loops = d_steps;
   248e6:	40 93 48 05 	sts	0x0548, r20	; 0x800548 <e_step_loops>
        }
        e_steps -= e_step_loops;
   248ea:	90 91 48 05 	lds	r25, 0x0548	; 0x800548 <e_step_loops>
   248ee:	89 1b       	sub	r24, r25
   248f0:	80 93 69 05 	sts	0x0569, r24	; 0x800569 <e_steps>
        if (e_steps) WRITE_NC(E0_DIR_PIN, e_steps < 0? INVERT_E0_DIR: !INVERT_E0_DIR);
   248f4:	88 23       	and	r24, r24
   248f6:	39 f0       	breq	.+14     	; 0x24906 <__vector_17+0x1236>
   248f8:	87 ff       	sbrs	r24, 7
   248fa:	53 c0       	rjmp	.+166    	; 0x249a2 <__vector_17+0x12d2>
   248fc:	80 91 0b 01 	lds	r24, 0x010B	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
   24900:	80 64       	ori	r24, 0x40	; 64
   24902:	80 93 0b 01 	sts	0x010B, r24	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
        current_adv_steps -= e_step_loops;
   24906:	20 91 48 05 	lds	r18, 0x0548	; 0x800548 <e_step_loops>
   2490a:	80 91 48 04 	lds	r24, 0x0448	; 0x800448 <_ZL17current_adv_steps.lto_priv.441>
   2490e:	90 91 49 04 	lds	r25, 0x0449	; 0x800449 <_ZL17current_adv_steps.lto_priv.441+0x1>
   24912:	82 1b       	sub	r24, r18
   24914:	91 09       	sbc	r25, r1
            if (d_steps < e_step_loops)
                e_step_loops = d_steps;
        }
        e_steps += e_step_loops;
        if (e_steps) WRITE_NC(E0_DIR_PIN, e_steps < 0? INVERT_E0_DIR: !INVERT_E0_DIR);
        current_adv_steps += e_step_loops;
   24916:	90 93 49 04 	sts	0x0449, r25	; 0x800449 <_ZL17current_adv_steps.lto_priv.441+0x1>
   2491a:	80 93 48 04 	sts	0x0448, r24	; 0x800448 <_ZL17current_adv_steps.lto_priv.441>
    }

    if (current_adv_steps == target_adv_steps) {
   2491e:	20 91 48 04 	lds	r18, 0x0448	; 0x800448 <_ZL17current_adv_steps.lto_priv.441>
   24922:	30 91 49 04 	lds	r19, 0x0449	; 0x800449 <_ZL17current_adv_steps.lto_priv.441+0x1>
   24926:	80 91 6a 05 	lds	r24, 0x056A	; 0x80056a <target_adv_steps>
   2492a:	90 91 6b 05 	lds	r25, 0x056B	; 0x80056b <target_adv_steps+0x1>
   2492e:	28 17       	cp	r18, r24
   24930:	39 07       	cpc	r19, r25
   24932:	09 f0       	breq	.+2      	; 0x24936 <__vector_17+0x1266>
   24934:	66 c0       	rjmp	.+204    	; 0x24a02 <__vector_17+0x1332>
        // advance steps completed
        nextAdvanceISR = ADV_NEVER;
   24936:	8f ef       	ldi	r24, 0xFF	; 255
   24938:	9f ef       	ldi	r25, 0xFF	; 255
    }
    else {
        // schedule another tick
        nextAdvanceISR = eISR_Rate;
   2493a:	90 93 4d 04 	sts	0x044D, r25	; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1>
   2493e:	80 93 4c 04 	sts	0x044C, r24	; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439>
        WRITE_NC(LOGIC_ANALYZER_CH1, false);
#endif
    }

    // Tick E steps if any
    if (e_steps && (LA_phase < 0 || LA_phase == eisr)) {
   24942:	40 91 69 05 	lds	r20, 0x0569	; 0x800569 <e_steps>
   24946:	41 11       	cpse	r20, r1
   24948:	61 c0       	rjmp	.+194    	; 0x24a0c <__vector_17+0x133c>
        while(--max_ticks);
    }

    // Schedule the next closest tick, ignoring advance if scheduled too
    // soon in order to avoid skewing the regular stepper acceleration
    if (nextAdvanceISR != ADV_NEVER && (nextAdvanceISR + 40) < nextMainISR)
   2494a:	80 91 4c 04 	lds	r24, 0x044C	; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439>
   2494e:	90 91 4d 04 	lds	r25, 0x044D	; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1>
   24952:	20 91 4e 04 	lds	r18, 0x044E	; 0x80044e <_ZL11nextMainISR.lto_priv.438>
   24956:	30 91 4f 04 	lds	r19, 0x044F	; 0x80044f <_ZL11nextMainISR.lto_priv.438+0x1>
   2495a:	8f 3f       	cpi	r24, 0xFF	; 255
   2495c:	98 07       	cpc	r25, r24
   2495e:	09 f0       	breq	.+2      	; 0x24962 <__vector_17+0x1292>
   24960:	98 c0       	rjmp	.+304    	; 0x24a92 <__vector_17+0x13c2>
        OCR1A = nextAdvanceISR;
    else
        OCR1A = nextMainISR;
   24962:	30 93 89 00 	sts	0x0089, r19	; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089>
   24966:	20 93 88 00 	sts	0x0088, r18	; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088>
   2496a:	9e c0       	rjmp	.+316    	; 0x24aa8 <__vector_17+0x13d8>
// @wavexx: fast uint16_t division for small dividends<5
//          q/3 based on "Hacker's delight" formula
FORCE_INLINE uint16_t fastdiv(uint16_t q, uint8_t d)
{
    if(d != 3) return q >> (d / 2);
    else return ((uint32_t)0xAAAB * q) >> 17;
   2496c:	ab ea       	ldi	r26, 0xAB	; 171
   2496e:	ba ea       	ldi	r27, 0xAA	; 170
   24970:	0f 94 80 a4 	call	0x34900	; 0x34900 <__umulhisi3>
   24974:	ab 01       	movw	r20, r22
   24976:	bc 01       	movw	r22, r24
   24978:	31 e1       	ldi	r19, 0x11	; 17
   2497a:	76 95       	lsr	r23
   2497c:	67 95       	ror	r22
   2497e:	57 95       	ror	r21
   24980:	47 95       	ror	r20
   24982:	3a 95       	dec	r19
   24984:	d1 f7       	brne	.-12     	; 0x2497a <__vector_17+0x12aa>
   24986:	57 cf       	rjmp	.-338    	; 0x24836 <__vector_17+0x1166>
   24988:	9f 01       	movw	r18, r30
   2498a:	ab ea       	ldi	r26, 0xAB	; 171
   2498c:	ba ea       	ldi	r27, 0xAA	; 170
   2498e:	0f 94 80 a4 	call	0x34900	; 0x34900 <__umulhisi3>
   24992:	21 e1       	ldi	r18, 0x11	; 17
   24994:	96 95       	lsr	r25
   24996:	87 95       	ror	r24
   24998:	77 95       	ror	r23
   2499a:	67 95       	ror	r22
   2499c:	2a 95       	dec	r18
   2499e:	d1 f7       	brne	.-12     	; 0x24994 <__vector_17+0x12c4>
   249a0:	54 cf       	rjmp	.-344    	; 0x2484a <__vector_17+0x117a>
            uint16_t d_steps = current_adv_steps - target_adv_steps;
            if (d_steps < e_step_loops)
                e_step_loops = d_steps;
        }
        e_steps -= e_step_loops;
        if (e_steps) WRITE_NC(E0_DIR_PIN, e_steps < 0? INVERT_E0_DIR: !INVERT_E0_DIR);
   249a2:	80 91 0b 01 	lds	r24, 0x010B	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
   249a6:	8f 7b       	andi	r24, 0xBF	; 191
   249a8:	ac cf       	rjmp	.-168    	; 0x24902 <__vector_17+0x1232>
        current_adv_steps -= e_step_loops;
    }
    else if (current_adv_steps < target_adv_steps) {
   249aa:	42 17       	cp	r20, r18
   249ac:	53 07       	cpc	r21, r19
   249ae:	08 f0       	brcs	.+2      	; 0x249b2 <__vector_17+0x12e2>
   249b0:	b6 cf       	rjmp	.-148    	; 0x2491e <__vector_17+0x124e>
        // compression
        if (e_step_loops != 1) {
   249b2:	90 91 48 05 	lds	r25, 0x0548	; 0x800548 <e_step_loops>
   249b6:	91 30       	cpi	r25, 0x01	; 1
   249b8:	41 f0       	breq	.+16     	; 0x249ca <__vector_17+0x12fa>
            uint16_t d_steps = target_adv_steps - current_adv_steps;
   249ba:	24 1b       	sub	r18, r20
   249bc:	35 0b       	sbc	r19, r21
            if (d_steps < e_step_loops)
   249be:	92 17       	cp	r25, r18
   249c0:	13 06       	cpc	r1, r19
   249c2:	19 f0       	breq	.+6      	; 0x249ca <__vector_17+0x12fa>
   249c4:	10 f0       	brcs	.+4      	; 0x249ca <__vector_17+0x12fa>
                e_step_loops = d_steps;
   249c6:	20 93 48 05 	sts	0x0548, r18	; 0x800548 <e_step_loops>
        }
        e_steps += e_step_loops;
   249ca:	90 91 48 05 	lds	r25, 0x0548	; 0x800548 <e_step_loops>
   249ce:	89 0f       	add	r24, r25
   249d0:	80 93 69 05 	sts	0x0569, r24	; 0x800569 <e_steps>
        if (e_steps) WRITE_NC(E0_DIR_PIN, e_steps < 0? INVERT_E0_DIR: !INVERT_E0_DIR);
   249d4:	88 23       	and	r24, r24
   249d6:	39 f0       	breq	.+14     	; 0x249e6 <__vector_17+0x1316>
   249d8:	87 ff       	sbrs	r24, 7
   249da:	0f c0       	rjmp	.+30     	; 0x249fa <__vector_17+0x132a>
   249dc:	80 91 0b 01 	lds	r24, 0x010B	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
   249e0:	80 64       	ori	r24, 0x40	; 64
   249e2:	80 93 0b 01 	sts	0x010B, r24	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
        current_adv_steps += e_step_loops;
   249e6:	80 91 48 05 	lds	r24, 0x0548	; 0x800548 <e_step_loops>
   249ea:	20 91 48 04 	lds	r18, 0x0448	; 0x800448 <_ZL17current_adv_steps.lto_priv.441>
   249ee:	30 91 49 04 	lds	r19, 0x0449	; 0x800449 <_ZL17current_adv_steps.lto_priv.441+0x1>
   249f2:	82 0f       	add	r24, r18
   249f4:	93 2f       	mov	r25, r19
   249f6:	91 1d       	adc	r25, r1
   249f8:	8e cf       	rjmp	.-228    	; 0x24916 <__vector_17+0x1246>
            uint16_t d_steps = target_adv_steps - current_adv_steps;
            if (d_steps < e_step_loops)
                e_step_loops = d_steps;
        }
        e_steps += e_step_loops;
        if (e_steps) WRITE_NC(E0_DIR_PIN, e_steps < 0? INVERT_E0_DIR: !INVERT_E0_DIR);
   249fa:	80 91 0b 01 	lds	r24, 0x010B	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
   249fe:	8f 7b       	andi	r24, 0xBF	; 191
   24a00:	f0 cf       	rjmp	.-32     	; 0x249e2 <__vector_17+0x1312>
        // advance steps completed
        nextAdvanceISR = ADV_NEVER;
    }
    else {
        // schedule another tick
        nextAdvanceISR = eISR_Rate;
   24a02:	80 91 46 05 	lds	r24, 0x0546	; 0x800546 <eISR_Rate>
   24a06:	90 91 47 05 	lds	r25, 0x0547	; 0x800547 <eISR_Rate+0x1>
   24a0a:	97 cf       	rjmp	.-210    	; 0x2493a <__vector_17+0x126a>
        WRITE_NC(LOGIC_ANALYZER_CH1, false);
#endif
    }

    // Tick E steps if any
    if (e_steps && (LA_phase < 0 || LA_phase == eisr)) {
   24a0c:	80 91 68 05 	lds	r24, 0x0568	; 0x800568 <LA_phase>
   24a10:	87 fd       	sbrc	r24, 7
   24a12:	0e c0       	rjmp	.+28     	; 0x24a30 <__vector_17+0x1360>
   24a14:	08 2e       	mov	r0, r24
   24a16:	00 0c       	add	r0, r0
   24a18:	99 0b       	sbc	r25, r25
        WRITE_NC(LOGIC_ANALYZER_CH0, false);
#endif
    }

    // Run the next advance isr if triggered
    bool eisr = !nextAdvanceISR;
   24a1a:	21 e0       	ldi	r18, 0x01	; 1
   24a1c:	30 e0       	ldi	r19, 0x00	; 0
   24a1e:	61 15       	cp	r22, r1
   24a20:	71 05       	cpc	r23, r1
   24a22:	11 f0       	breq	.+4      	; 0x24a28 <__vector_17+0x1358>
   24a24:	30 e0       	ldi	r19, 0x00	; 0
   24a26:	20 e0       	ldi	r18, 0x00	; 0
        WRITE_NC(LOGIC_ANALYZER_CH1, false);
#endif
    }

    // Tick E steps if any
    if (e_steps && (LA_phase < 0 || LA_phase == eisr)) {
   24a28:	82 17       	cp	r24, r18
   24a2a:	93 07       	cpc	r25, r19
   24a2c:	09 f0       	breq	.+2      	; 0x24a30 <__vector_17+0x1360>
   24a2e:	8d cf       	rjmp	.-230    	; 0x2494a <__vector_17+0x127a>
        uint8_t max_ticks = (eisr? e_step_loops: step_loops);
   24a30:	20 91 48 05 	lds	r18, 0x0548	; 0x800548 <e_step_loops>
   24a34:	67 2b       	or	r22, r23
   24a36:	11 f0       	breq	.+4      	; 0x24a3c <__vector_17+0x136c>
   24a38:	20 91 70 05 	lds	r18, 0x0570	; 0x800570 <step_loops>
        max_ticks = min(abs(e_steps), max_ticks);
   24a3c:	84 2f       	mov	r24, r20
   24a3e:	04 2e       	mov	r0, r20
   24a40:	00 0c       	add	r0, r0
   24a42:	99 0b       	sbc	r25, r25
   24a44:	97 ff       	sbrs	r25, 7
   24a46:	03 c0       	rjmp	.+6      	; 0x24a4e <__vector_17+0x137e>
   24a48:	91 95       	neg	r25
   24a4a:	81 95       	neg	r24
   24a4c:	91 09       	sbc	r25, r1
   24a4e:	30 e0       	ldi	r19, 0x00	; 0
   24a50:	28 17       	cp	r18, r24
   24a52:	39 07       	cpc	r19, r25
   24a54:	0c f4       	brge	.+2      	; 0x24a58 <__vector_17+0x1388>
   24a56:	c9 01       	movw	r24, r18
   24a58:	47 ff       	sbrs	r20, 7
   24a5a:	17 c0       	rjmp	.+46     	; 0x24a8a <__vector_17+0x13ba>
   24a5c:	61 e0       	ldi	r22, 0x01	; 1
   24a5e:	4f ef       	ldi	r20, 0xFF	; 255
   24a60:	5f ef       	ldi	r21, 0xFF	; 255
        bool rev = (e_steps < 0);
        do
        {
            STEP_NC_HI(E_AXIS);
   24a62:	43 9a       	sbi	0x08, 3	; 8
            e_steps += (rev? 1: -1);
   24a64:	90 91 69 05 	lds	r25, 0x0569	; 0x800569 <e_steps>
   24a68:	96 0f       	add	r25, r22
   24a6a:	90 93 69 05 	sts	0x0569, r25	; 0x800569 <e_steps>
            STEP_NC_LO(E_AXIS);
   24a6e:	43 98       	cbi	0x08, 3	; 8

    void setJamDetectionEnabled(bool state, bool updateEEPROM = false);
    bool getJamDetectionEnabled() const { return jamDetection; }

    void stStep(bool rev) { //from stepper isr
        stepCount += rev ? -1 : 1;
   24a70:	20 91 02 17 	lds	r18, 0x1702	; 0x801702 <fsensor+0x11>
   24a74:	30 91 03 17 	lds	r19, 0x1703	; 0x801703 <fsensor+0x12>
   24a78:	24 0f       	add	r18, r20
   24a7a:	35 1f       	adc	r19, r21
   24a7c:	30 93 03 17 	sts	0x1703, r19	; 0x801703 <fsensor+0x12>
   24a80:	20 93 02 17 	sts	0x1702, r18	; 0x801702 <fsensor+0x11>
#if defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
            fsensor.stStep(rev);
#endif //defined(FILAMENT_SENSOR) && (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
        }
        while(--max_ticks);
   24a84:	81 50       	subi	r24, 0x01	; 1
   24a86:	69 f7       	brne	.-38     	; 0x24a62 <__vector_17+0x1392>
   24a88:	60 cf       	rjmp	.-320    	; 0x2494a <__vector_17+0x127a>
   24a8a:	6f ef       	ldi	r22, 0xFF	; 255
   24a8c:	41 e0       	ldi	r20, 0x01	; 1
   24a8e:	50 e0       	ldi	r21, 0x00	; 0
   24a90:	e8 cf       	rjmp	.-48     	; 0x24a62 <__vector_17+0x1392>
    }

    // Schedule the next closest tick, ignoring advance if scheduled too
    // soon in order to avoid skewing the regular stepper acceleration
    if (nextAdvanceISR != ADV_NEVER && (nextAdvanceISR + 40) < nextMainISR)
   24a92:	ac 01       	movw	r20, r24
   24a94:	48 5d       	subi	r20, 0xD8	; 216
   24a96:	5f 4f       	sbci	r21, 0xFF	; 255
   24a98:	42 17       	cp	r20, r18
   24a9a:	53 07       	cpc	r21, r19
   24a9c:	08 f0       	brcs	.+2      	; 0x24aa0 <__vector_17+0x13d0>
   24a9e:	61 cf       	rjmp	.-318    	; 0x24962 <__vector_17+0x1292>
        OCR1A = nextAdvanceISR;
   24aa0:	90 93 89 00 	sts	0x0089, r25	; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089>
   24aa4:	80 93 88 00 	sts	0x0088, r24	; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088>
    isr();
#endif

  // Don't run the ISR faster than possible
  // Is there a 8us time left before the next interrupt triggers?
  if (OCR1A < TCNT1 + 16) {
   24aa8:	20 91 88 00 	lds	r18, 0x0088	; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088>
   24aac:	30 91 89 00 	lds	r19, 0x0089	; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089>
   24ab0:	80 91 84 00 	lds	r24, 0x0084	; 0x800084 <__TEXT_REGION_LENGTH__+0x7c2084>
   24ab4:	90 91 85 00 	lds	r25, 0x0085	; 0x800085 <__TEXT_REGION_LENGTH__+0x7c2085>
   24ab8:	40 96       	adiw	r24, 0x10	; 16
   24aba:	28 17       	cp	r18, r24
   24abc:	39 07       	cpc	r19, r25
   24abe:	48 f4       	brcc	.+18     	; 0x24ad2 <__vector_17+0x1402>
      // Beep, the beeper will be cleared at the stepper_timer_overflow() called from the main thread.
      WRITE(BEEPER, HIGH);
    }
#endif
    // Fix the next interrupt to be executed after 8us from now.
    OCR1A = TCNT1 + 16;
   24ac0:	80 91 84 00 	lds	r24, 0x0084	; 0x800084 <__TEXT_REGION_LENGTH__+0x7c2084>
   24ac4:	90 91 85 00 	lds	r25, 0x0085	; 0x800085 <__TEXT_REGION_LENGTH__+0x7c2085>
   24ac8:	40 96       	adiw	r24, 0x10	; 16
   24aca:	90 93 89 00 	sts	0x0089, r25	; 0x800089 <__TEXT_REGION_LENGTH__+0x7c2089>
   24ace:	80 93 88 00 	sts	0x0088, r24	; 0x800088 <__TEXT_REGION_LENGTH__+0x7c2088>
  }
}
   24ad2:	ff 91       	pop	r31
   24ad4:	ef 91       	pop	r30
   24ad6:	df 91       	pop	r29
   24ad8:	cf 91       	pop	r28
   24ada:	bf 91       	pop	r27
   24adc:	af 91       	pop	r26
   24ade:	9f 91       	pop	r25
   24ae0:	8f 91       	pop	r24
   24ae2:	7f 91       	pop	r23
   24ae4:	6f 91       	pop	r22
   24ae6:	5f 91       	pop	r21
   24ae8:	4f 91       	pop	r20
   24aea:	3f 91       	pop	r19
   24aec:	2f 91       	pop	r18
   24aee:	1f 91       	pop	r17
   24af0:	ff 90       	pop	r15
   24af2:	ef 90       	pop	r14
   24af4:	df 90       	pop	r13
   24af6:	cf 90       	pop	r12
   24af8:	8f 90       	pop	r8
   24afa:	7f 90       	pop	r7
   24afc:	6f 90       	pop	r6
   24afe:	5f 90       	pop	r5
   24b00:	4f 90       	pop	r4
   24b02:	0f 90       	pop	r0
   24b04:	0b be       	out	0x3b, r0	; 59
   24b06:	0f 90       	pop	r0
   24b08:	0f be       	out	0x3f, r0	; 63
   24b0a:	0f 90       	pop	r0
   24b0c:	1f 90       	pop	r1
   24b0e:	18 95       	reti

00024b10 <enable_z_endstop(bool)>:
  return old;
}

bool enable_z_endstop(bool check)
{
	bool old = check_z_endstop;
   24b10:	90 91 4f 05 	lds	r25, 0x054F	; 0x80054f <check_z_endstop>
	check_z_endstop = check;
   24b14:	80 93 4f 05 	sts	0x054F, r24	; 0x80054f <check_z_endstop>
CRITICAL_SECTION_START;
   24b18:	2f b7       	in	r18, 0x3f	; 63
   24b1a:	f8 94       	cli
	endstop_hit &= ~_BV(Z_AXIS);
   24b1c:	80 91 5e 04 	lds	r24, 0x045E	; 0x80045e <_ZL11endstop_hit.lto_priv.442>
   24b20:	8b 7f       	andi	r24, 0xFB	; 251
   24b22:	80 93 5e 04 	sts	0x045E, r24	; 0x80045e <_ZL11endstop_hit.lto_priv.442>
CRITICAL_SECTION_END;
   24b26:	2f bf       	out	0x3f, r18	; 63
	return old;
}
   24b28:	89 2f       	mov	r24, r25
   24b2a:	08 95       	ret

00024b2c <endstop_z_hit_on_purpose()>:
  return old;
}

bool endstop_z_hit_on_purpose()
{
  bool hit = endstop_hit & _BV(Z_AXIS);
   24b2c:	80 91 5e 04 	lds	r24, 0x045E	; 0x80045e <_ZL11endstop_hit.lto_priv.442>
CRITICAL_SECTION_START;
   24b30:	2f b7       	in	r18, 0x3f	; 63
   24b32:	f8 94       	cli
  endstop_hit &= ~_BV(Z_AXIS);
   24b34:	90 91 5e 04 	lds	r25, 0x045E	; 0x80045e <_ZL11endstop_hit.lto_priv.442>
   24b38:	9b 7f       	andi	r25, 0xFB	; 251
   24b3a:	90 93 5e 04 	sts	0x045E, r25	; 0x80045e <_ZL11endstop_hit.lto_priv.442>
CRITICAL_SECTION_END;
   24b3e:	2f bf       	out	0x3f, r18	; 63
  return hit;
}
   24b40:	82 fb       	bst	r24, 2
   24b42:	88 27       	eor	r24, r24
   24b44:	80 f9       	bld	r24, 0
   24b46:	08 95       	ret

00024b48 <endstops_hit_on_purpose()>:
 }
}

bool endstops_hit_on_purpose()
{
  uint8_t old = endstop_hit;
   24b48:	90 91 5e 04 	lds	r25, 0x045E	; 0x80045e <_ZL11endstop_hit.lto_priv.442>
  endstop_hit = 0;
   24b4c:	10 92 5e 04 	sts	0x045E, r1	; 0x80045e <_ZL11endstop_hit.lto_priv.442>
  return old;
   24b50:	81 e0       	ldi	r24, 0x01	; 1
   24b52:	91 11       	cpse	r25, r1
   24b54:	01 c0       	rjmp	.+2      	; 0x24b58 <endstops_hit_on_purpose()+0x10>
   24b56:	80 e0       	ldi	r24, 0x00	; 0
}
   24b58:	08 95       	ret

00024b5a <Sound_MakeSound(eSOUND_TYPE)>:
     }
}

void Sound_MakeSound(eSOUND_TYPE eSoundType)
{
switch(eSoundMode)
   24b5a:	90 91 47 04 	lds	r25, 0x0447	; 0x800447 <eSoundMode>
   24b5e:	91 30       	cpi	r25, 0x01	; 1
   24b60:	a1 f0       	breq	.+40     	; 0x24b8a <Sound_MakeSound(eSOUND_TYPE)+0x30>
   24b62:	28 f0       	brcs	.+10     	; 0x24b6e <Sound_MakeSound(eSOUND_TYPE)+0x14>
   24b64:	92 30       	cpi	r25, 0x02	; 2
   24b66:	a9 f0       	breq	.+42     	; 0x24b92 <Sound_MakeSound(eSOUND_TYPE)+0x38>
   24b68:	93 30       	cpi	r25, 0x03	; 3
   24b6a:	c1 f0       	breq	.+48     	; 0x24b9c <Sound_MakeSound(eSOUND_TYPE)+0x42>
   24b6c:	08 95       	ret
     {
     case e_SOUND_MODE_LOUD:
          if(eSoundType==e_SOUND_TYPE_ButtonEcho)
   24b6e:	81 11       	cpse	r24, r1
   24b70:	02 c0       	rjmp	.+4      	; 0x24b76 <Sound_MakeSound(eSOUND_TYPE)+0x1c>
          if(eSoundType==e_SOUND_TYPE_StandardAlert)
               Sound_DoSound_Alert(true);
          break;
     case e_SOUND_MODE_BLIND:
          if(eSoundType==e_SOUND_TYPE_ButtonEcho)
               Sound_DoSound_Echo();
   24b72:	0d 94 87 03 	jmp	0x2070e	; 0x2070e <Sound_DoSound_Echo()>
switch(eSoundMode)
     {
     case e_SOUND_MODE_LOUD:
          if(eSoundType==e_SOUND_TYPE_ButtonEcho)
               Sound_DoSound_Echo();
          if(eSoundType==e_SOUND_TYPE_StandardPrompt)
   24b76:	82 30       	cpi	r24, 0x02	; 2
   24b78:	11 f4       	brne	.+4      	; 0x24b7e <Sound_MakeSound(eSOUND_TYPE)+0x24>
          break;
     case e_SOUND_MODE_BLIND:
          if(eSoundType==e_SOUND_TYPE_ButtonEcho)
               Sound_DoSound_Echo();
          if(eSoundType==e_SOUND_TYPE_StandardPrompt)
               Sound_DoSound_Prompt();
   24b7a:	0d 94 54 08 	jmp	0x210a8	; 0x210a8 <Sound_DoSound_Prompt()>
     case e_SOUND_MODE_LOUD:
          if(eSoundType==e_SOUND_TYPE_ButtonEcho)
               Sound_DoSound_Echo();
          if(eSoundType==e_SOUND_TYPE_StandardPrompt)
               Sound_DoSound_Prompt();
          if(eSoundType==e_SOUND_TYPE_StandardAlert)
   24b7e:	85 30       	cpi	r24, 0x05	; 5
   24b80:	09 f0       	breq	.+2      	; 0x24b84 <Sound_MakeSound(eSOUND_TYPE)+0x2a>
   24b82:	4d c0       	rjmp	.+154    	; 0x24c1e <Sound_MakeSound(eSOUND_TYPE)+0xc4>
               Sound_DoSound_Alert(false);
   24b84:	80 e0       	ldi	r24, 0x00	; 0
          if(eSoundType==e_SOUND_TYPE_ButtonEcho)
              Sound_DoSound_Echo();
          if(eSoundType==e_SOUND_TYPE_StandardPrompt)
               Sound_DoSound_Prompt();
          if(eSoundType==e_SOUND_TYPE_StandardAlert)
               Sound_DoSound_Alert(true);
   24b86:	0d 94 65 03 	jmp	0x206ca	; 0x206ca <Sound_DoSound_Alert(bool)>
               Sound_DoSound_Prompt();
          if(eSoundType==e_SOUND_TYPE_StandardAlert)
               Sound_DoSound_Alert(false);
          break;
     case e_SOUND_MODE_ONCE:
          if(eSoundType==e_SOUND_TYPE_ButtonEcho)
   24b8a:	88 23       	and	r24, r24
   24b8c:	91 f3       	breq	.-28     	; 0x24b72 <Sound_MakeSound(eSOUND_TYPE)+0x18>
              Sound_DoSound_Echo();
          if(eSoundType==e_SOUND_TYPE_StandardPrompt)
   24b8e:	82 30       	cpi	r24, 0x02	; 2
   24b90:	a1 f3       	breq	.-24     	; 0x24b7a <Sound_MakeSound(eSOUND_TYPE)+0x20>
               Sound_DoSound_Prompt();
          if(eSoundType==e_SOUND_TYPE_StandardAlert)
   24b92:	85 30       	cpi	r24, 0x05	; 5
   24b94:	09 f0       	breq	.+2      	; 0x24b98 <Sound_MakeSound(eSOUND_TYPE)+0x3e>
   24b96:	43 c0       	rjmp	.+134    	; 0x24c1e <Sound_MakeSound(eSOUND_TYPE)+0xc4>
               Sound_DoSound_Alert(true);
   24b98:	81 e0       	ldi	r24, 0x01	; 1
   24b9a:	f5 cf       	rjmp	.-22     	; 0x24b86 <Sound_MakeSound(eSOUND_TYPE)+0x2c>
     case e_SOUND_MODE_SILENT:
          if(eSoundType==e_SOUND_TYPE_StandardAlert)
               Sound_DoSound_Alert(true);
          break;
     case e_SOUND_MODE_BLIND:
          if(eSoundType==e_SOUND_TYPE_ButtonEcho)
   24b9c:	88 23       	and	r24, r24
   24b9e:	49 f3       	breq	.-46     	; 0x24b72 <Sound_MakeSound(eSOUND_TYPE)+0x18>
               Sound_DoSound_Echo();
          if(eSoundType==e_SOUND_TYPE_StandardPrompt)
   24ba0:	82 30       	cpi	r24, 0x02	; 2
   24ba2:	59 f3       	breq	.-42     	; 0x24b7a <Sound_MakeSound(eSOUND_TYPE)+0x20>
               Sound_DoSound_Prompt();
          if(eSoundType==e_SOUND_TYPE_StandardAlert)
   24ba4:	85 30       	cpi	r24, 0x05	; 5
   24ba6:	71 f3       	breq	.-36     	; 0x24b84 <Sound_MakeSound(eSOUND_TYPE)+0x2a>
               Sound_DoSound_Alert(false);
          if(eSoundType==e_SOUND_TYPE_EncoderMove)
   24ba8:	86 30       	cpi	r24, 0x06	; 6
   24baa:	e1 f4       	brne	.+56     	; 0x24be4 <Sound_MakeSound(eSOUND_TYPE)+0x8a>
   24bac:	85 e0       	ldi	r24, 0x05	; 5
   24bae:	27 e2       	ldi	r18, 0x27	; 39
   24bb0:	31 e0       	ldi	r19, 0x01	; 1
{
uint8_t nI;

 for(nI=0;nI<5;nI++)
     {
     WRITE(BEEPER,HIGH);
   24bb2:	4f b7       	in	r20, 0x3f	; 63
   24bb4:	f8 94       	cli
   24bb6:	90 91 02 01 	lds	r25, 0x0102	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   24bba:	94 60       	ori	r25, 0x04	; 4
   24bbc:	90 93 02 01 	sts	0x0102, r25	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   24bc0:	4f bf       	out	0x3f, r20	; 63
   24bc2:	f9 01       	movw	r30, r18
   24bc4:	31 97       	sbiw	r30, 0x01	; 1
   24bc6:	f1 f7       	brne	.-4      	; 0x24bc4 <Sound_MakeSound(eSOUND_TYPE)+0x6a>
     delayMicroseconds(75);
     WRITE(BEEPER,LOW);
   24bc8:	4f b7       	in	r20, 0x3f	; 63
   24bca:	f8 94       	cli
   24bcc:	90 91 02 01 	lds	r25, 0x0102	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   24bd0:	9b 7f       	andi	r25, 0xFB	; 251
   24bd2:	90 93 02 01 	sts	0x0102, r25	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   24bd6:	4f bf       	out	0x3f, r20	; 63
   24bd8:	f9 01       	movw	r30, r18
   24bda:	31 97       	sbiw	r30, 0x01	; 1
   24bdc:	f1 f7       	brne	.-4      	; 0x24bda <Sound_MakeSound(eSOUND_TYPE)+0x80>
   24bde:	81 50       	subi	r24, 0x01	; 1

 static void Sound_DoSound_Encoder_Move(void)
{
uint8_t nI;

 for(nI=0;nI<5;nI++)
   24be0:	41 f7       	brne	.-48     	; 0x24bb2 <Sound_MakeSound(eSOUND_TYPE)+0x58>
   24be2:	08 95       	ret
               Sound_DoSound_Prompt();
          if(eSoundType==e_SOUND_TYPE_StandardAlert)
               Sound_DoSound_Alert(false);
          if(eSoundType==e_SOUND_TYPE_EncoderMove)
               Sound_DoSound_Encoder_Move();
          if(eSoundType==e_SOUND_TYPE_BlindAlert)
   24be4:	87 30       	cpi	r24, 0x07	; 7
   24be6:	d9 f4       	brne	.+54     	; 0x24c1e <Sound_MakeSound(eSOUND_TYPE)+0xc4>
   24be8:	84 e1       	ldi	r24, 0x14	; 20
   24bea:	23 e7       	ldi	r18, 0x73	; 115
   24bec:	31 e0       	ldi	r19, 0x01	; 1
    backlight_wake(1);
     uint8_t nI;

     for(nI=0; nI<20; nI++)
     {
         WRITE(BEEPER,HIGH);
   24bee:	4f b7       	in	r20, 0x3f	; 63
   24bf0:	f8 94       	cli
   24bf2:	90 91 02 01 	lds	r25, 0x0102	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   24bf6:	94 60       	ori	r25, 0x04	; 4
   24bf8:	90 93 02 01 	sts	0x0102, r25	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   24bfc:	4f bf       	out	0x3f, r20	; 63
   24bfe:	f9 01       	movw	r30, r18
   24c00:	31 97       	sbiw	r30, 0x01	; 1
   24c02:	f1 f7       	brne	.-4      	; 0x24c00 <Sound_MakeSound(eSOUND_TYPE)+0xa6>
         delayMicroseconds(94);
         WRITE(BEEPER,LOW);
   24c04:	4f b7       	in	r20, 0x3f	; 63
   24c06:	f8 94       	cli
   24c08:	90 91 02 01 	lds	r25, 0x0102	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   24c0c:	9b 7f       	andi	r25, 0xFB	; 251
   24c0e:	90 93 02 01 	sts	0x0102, r25	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   24c12:	4f bf       	out	0x3f, r20	; 63
   24c14:	f9 01       	movw	r30, r18
   24c16:	31 97       	sbiw	r30, 0x01	; 1
   24c18:	f1 f7       	brne	.-4      	; 0x24c16 <Sound_MakeSound(eSOUND_TYPE)+0xbc>
   24c1a:	81 50       	subi	r24, 0x01	; 1
static void Sound_DoSound_Blind_Alert(void)
{
    backlight_wake(1);
     uint8_t nI;

     for(nI=0; nI<20; nI++)
   24c1c:	41 f7       	brne	.-48     	; 0x24bee <Sound_MakeSound(eSOUND_TYPE)+0x94>
               Sound_DoSound_Blind_Alert();
          break;
     default:
          break;
     }
}
   24c1e:	08 95       	ret

00024c20 <mFilamentItem(unsigned int, unsigned int)>:
static void __attribute__((noinline)) mFilamentResetMenuStack() {
    menu_back(bFilamentPreheatState ? 1 : 2);
}

void mFilamentItem(uint16_t nTemp, uint16_t nTempBed)
{
   24c20:	0f 93       	push	r16
   24c22:	1f 93       	push	r17
   24c24:	cf 93       	push	r28
   24c26:	df 93       	push	r29
   24c28:	8c 01       	movw	r16, r24
   24c2a:	eb 01       	movw	r28, r22
  return target_temperature_bed;
};

// Doesn't save FLASH when FORCE_INLINE removed.
FORCE_INLINE void setTargetHotend(const float &celsius) {
  target_temperature[0] = celsius;
   24c2c:	90 93 5e 12 	sts	0x125E, r25	; 0x80125e <target_temperature+0x1>
   24c30:	80 93 5d 12 	sts	0x125D, r24	; 0x80125d <target_temperature>
    setTargetHotend((float)nTemp);
    if (!shouldPreheatOnlyNozzle()) setTargetBed((float)nTempBed);
   24c34:	0f 94 7d 04 	call	0x208fa	; 0x208fa <shouldPreheatOnlyNozzle()>
   24c38:	81 11       	cpse	r24, r1
   24c3a:	04 c0       	rjmp	.+8      	; 0x24c44 <mFilamentItem(unsigned int, unsigned int)+0x24>
  resetPID(0);
};

FORCE_INLINE void setTargetBed(const float &celsius) {
  target_temperature_bed = celsius;
   24c3c:	d0 93 5a 12 	sts	0x125A, r29	; 0x80125a <target_temperature_bed+0x1>
   24c40:	c0 93 59 12 	sts	0x1259, r28	; 0x801259 <target_temperature_bed>

    {
        const FilamentAction action = eFilamentAction;
   24c44:	c0 91 94 03 	lds	r28, 0x0394	; 0x800394 <eFilamentAction>
        if (action == FilamentAction::Preheat || action == FilamentAction::Lay1Cal)
   24c48:	87 ef       	ldi	r24, 0xF7	; 247
   24c4a:	8c 0f       	add	r24, r28
   24c4c:	82 30       	cpi	r24, 0x02	; 2
   24c4e:	f8 f4       	brcc	.+62     	; 0x24c8e <mFilamentItem(unsigned int, unsigned int)+0x6e>
        {
            lcd_return_to_status();
   24c50:	0f 94 d5 07 	call	0x20faa	; 0x20faa <lcd_return_to_status()>
            if (action == FilamentAction::Lay1Cal)
   24c54:	ca 30       	cpi	r28, 0x0A	; 10
   24c56:	41 f4       	brne	.+16     	; 0x24c68 <mFilamentItem(unsigned int, unsigned int)+0x48>
            {
                lcd_commands_type = LcdCommands::Layer1Cal;
   24c58:	84 e0       	ldi	r24, 0x04	; 4
   24c5a:	80 93 5e 0d 	sts	0x0D5E, r24	; 0x800d5e <lcd_commands_type>
            }
            menu_back();
            clearFilamentAction();
        }
    }
}
   24c5e:	df 91       	pop	r29
   24c60:	cf 91       	pop	r28
   24c62:	1f 91       	pop	r17
   24c64:	0f 91       	pop	r16
   24c66:	08 95       	ret
            {
                lcd_commands_type = LcdCommands::Layer1Cal;
            }
            else
            {
                raise_z_above(MIN_Z_FOR_PREHEAT);
   24c68:	60 e0       	ldi	r22, 0x00	; 0
   24c6a:	70 e0       	ldi	r23, 0x00	; 0
   24c6c:	80 e2       	ldi	r24, 0x20	; 32
   24c6e:	91 e4       	ldi	r25, 0x41	; 65
   24c70:	0e 94 f6 6c 	call	0xd9ec	; 0xd9ec <raise_z_above(float)>
                if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE))
   24c74:	8f e5       	ldi	r24, 0x5F	; 95
   24c76:	9f e0       	ldi	r25, 0x0F	; 15
   24c78:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   24c7c:	88 23       	and	r24, r24
   24c7e:	79 f3       	breq	.-34     	; 0x24c5e <mFilamentItem(unsigned int, unsigned int)+0x3e>
                    lcd_wizard(WizState::LoadFilHot);
   24c80:	88 e0       	ldi	r24, 0x08	; 8
            }
            menu_back();
            clearFilamentAction();
        }
    }
}
   24c82:	df 91       	pop	r29
   24c84:	cf 91       	pop	r28
   24c86:	1f 91       	pop	r17
   24c88:	0f 91       	pop	r16
            }
            else
            {
                raise_z_above(MIN_Z_FOR_PREHEAT);
                if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE))
                    lcd_wizard(WizState::LoadFilHot);
   24c8a:	0c 94 c3 eb 	jmp	0x1d786	; 0x1d786 <lcd_wizard(WizState)>
   24c8e:	10 92 e3 03 	sts	0x03E3, r1	; 0x8003e3 <lcd_timeoutToStatus>

    lcd_timeoutToStatus.stop();

    // the current temperature is within +-TEMP_HYSTERESIS of the target
    // then continue with the filament action if any is set
    if (bFilamentSkipPreheat || abs((int)current_temperature[0] - (int)nTemp) < TEMP_HYSTERESIS)
   24c92:	80 91 16 06 	lds	r24, 0x0616	; 0x800616 <bFilamentSkipPreheat>
   24c96:	81 11       	cpse	r24, r1
   24c98:	12 c0       	rjmp	.+36     	; 0x24cbe <mFilamentItem(unsigned int, unsigned int)+0x9e>
   24c9a:	60 91 5a 0d 	lds	r22, 0x0D5A	; 0x800d5a <current_temperature>
   24c9e:	70 91 5b 0d 	lds	r23, 0x0D5B	; 0x800d5b <current_temperature+0x1>
   24ca2:	80 91 5c 0d 	lds	r24, 0x0D5C	; 0x800d5c <current_temperature+0x2>
   24ca6:	90 91 5d 0d 	lds	r25, 0x0D5D	; 0x800d5d <current_temperature+0x3>
   24caa:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   24cae:	60 1b       	sub	r22, r16
   24cb0:	71 0b       	sbc	r23, r17
   24cb2:	6c 5f       	subi	r22, 0xFC	; 252
   24cb4:	7f 4f       	sbci	r23, 0xFF	; 255
   24cb6:	69 30       	cpi	r22, 0x09	; 9
   24cb8:	71 05       	cpc	r23, r1
   24cba:	08 f0       	brcs	.+2      	; 0x24cbe <mFilamentItem(unsigned int, unsigned int)+0x9e>
   24cbc:	60 c0       	rjmp	.+192    	; 0x24d7e <mFilamentItem(unsigned int, unsigned int)+0x15e>
    {
        menu_func_t filamentActionMenu = nullptr;
        switch (eFilamentAction)
   24cbe:	c1 50       	subi	r28, 0x01	; 1
   24cc0:	c8 30       	cpi	r28, 0x08	; 8
   24cc2:	88 f5       	brcc	.+98     	; 0x24d26 <mFilamentItem(unsigned int, unsigned int)+0x106>
   24cc4:	ec 2f       	mov	r30, r28
   24cc6:	f0 e0       	ldi	r31, 0x00	; 0
   24cc8:	88 27       	eor	r24, r24
   24cca:	e6 59       	subi	r30, 0x96	; 150
   24ccc:	f9 4d       	sbci	r31, 0xD9	; 217
   24cce:	8e 4f       	sbci	r24, 0xFE	; 254
   24cd0:	0d 94 f0 a4 	jmp	0x349e0	; 0x349e0 <__tablejump2__>
   24cd4:	ea 37       	cpi	r30, 0x7A	; 122
   24cd6:	ea 37       	cpi	r30, 0x7A	; 122
   24cd8:	ea 37       	cpi	r30, 0x7A	; 122
   24cda:	62 37       	cpi	r22, 0x72	; 114
   24cdc:	5c 37       	cpi	r21, 0x7C	; 124
   24cde:	ec 36       	cpi	r30, 0x6C	; 108
   24ce0:	d0 37       	cpi	r29, 0x70	; 112
   24ce2:	ee 37       	cpi	r30, 0x7E	; 126
                else if (eFilamentAction == FilamentAction::UnLoad)
                    enquecommand_P(MSG_M702); // unload filament
            }
            break;
        case FilamentAction::MmuLoad:
            filamentActionMenu = mmu_load_to_nozzle_menu;
   24ce4:	c7 e6       	ldi	r28, 0x67	; 103
   24ce6:	d0 ed       	ldi	r29, 0xD0	; 208
        case FilamentAction::Preheat:
        case FilamentAction::Lay1Cal:
            // handled earlier
            break;
        }
        if (bFilamentWaitingFlag) {
   24ce8:	80 91 14 06 	lds	r24, 0x0614	; 0x800614 <bFilamentWaitingFlag>
   24cec:	88 23       	and	r24, r24
   24cee:	29 f0       	breq	.+10     	; 0x24cfa <mFilamentItem(unsigned int, unsigned int)+0xda>
            Sound_MakeSound(e_SOUND_TYPE_StandardPrompt);
   24cf0:	82 e0       	ldi	r24, 0x02	; 2
   24cf2:	0f 94 ad 25 	call	0x24b5a	; 0x24b5a <Sound_MakeSound(eSOUND_TYPE)>
            bFilamentWaitingFlag = false;
   24cf6:	10 92 14 06 	sts	0x0614, r1	; 0x800614 <bFilamentWaitingFlag>
        }

        if (filamentActionMenu) {
   24cfa:	20 97       	sbiw	r28, 0x00	; 0
   24cfc:	09 f4       	brne	.+2      	; 0x24d00 <mFilamentItem(unsigned int, unsigned int)+0xe0>
   24cfe:	af cf       	rjmp	.-162    	; 0x24c5e <mFilamentItem(unsigned int, unsigned int)+0x3e>
            // Reset the menu stack and filament action before entering action menu
            mFilamentResetMenuStack();
   24d00:	0f 94 11 05 	call	0x20a22	; 0x20a22 <mFilamentResetMenuStack()>

            // The menu should clear eFilamentAction when the
            // 'action' is done
            menu_submenu(filamentActionMenu, true);
   24d04:	61 e0       	ldi	r22, 0x01	; 1
   24d06:	ce 01       	movw	r24, r28
            }
            menu_back();
            clearFilamentAction();
        }
    }
}
   24d08:	df 91       	pop	r29
   24d0a:	cf 91       	pop	r28
   24d0c:	1f 91       	pop	r17
   24d0e:	0f 91       	pop	r16
            // Reset the menu stack and filament action before entering action menu
            mFilamentResetMenuStack();

            // The menu should clear eFilamentAction when the
            // 'action' is done
            menu_submenu(filamentActionMenu, true);
   24d10:	0c 94 dd 62 	jmp	0xc5ba	; 0xc5ba <menu_submenu(void (*)(), bool)>
        switch (eFilamentAction)
        {
        case FilamentAction::Load:
        case FilamentAction::AutoLoad:
        case FilamentAction::UnLoad:
            if (bFilamentWaitingFlag) menu_submenu(mFilamentPrompt, true);
   24d14:	80 91 14 06 	lds	r24, 0x0614	; 0x800614 <bFilamentWaitingFlag>
   24d18:	88 23       	and	r24, r24
   24d1a:	41 f0       	breq	.+16     	; 0x24d2c <mFilamentItem(unsigned int, unsigned int)+0x10c>
   24d1c:	61 e0       	ldi	r22, 0x01	; 1
   24d1e:	86 ee       	ldi	r24, 0xE6	; 230
   24d20:	96 e3       	ldi	r25, 0x36	; 54
   24d22:	0e 94 dd 62 	call	0xc5ba	; 0xc5ba <menu_submenu(void (*)(), bool)>

    // the current temperature is within +-TEMP_HYSTERESIS of the target
    // then continue with the filament action if any is set
    if (bFilamentSkipPreheat || abs((int)current_temperature[0] - (int)nTemp) < TEMP_HYSTERESIS)
    {
        menu_func_t filamentActionMenu = nullptr;
   24d26:	d0 e0       	ldi	r29, 0x00	; 0
   24d28:	c0 e0       	ldi	r28, 0x00	; 0
   24d2a:	de cf       	rjmp	.-68     	; 0x24ce8 <mFilamentItem(unsigned int, unsigned int)+0xc8>
        case FilamentAction::AutoLoad:
        case FilamentAction::UnLoad:
            if (bFilamentWaitingFlag) menu_submenu(mFilamentPrompt, true);
            else
            {
                mFilamentResetMenuStack();
   24d2c:	0f 94 11 05 	call	0x20a22	; 0x20a22 <mFilamentResetMenuStack()>
                if (eFilamentAction == FilamentAction::AutoLoad) {
   24d30:	80 91 94 03 	lds	r24, 0x0394	; 0x800394 <eFilamentAction>
   24d34:	82 30       	cpi	r24, 0x02	; 2
   24d36:	19 f4       	brne	.+6      	; 0x24d3e <mFilamentItem(unsigned int, unsigned int)+0x11e>
                    // loading no longer cancellable
                    eFilamentAction = FilamentAction::Load;
   24d38:	81 e0       	ldi	r24, 0x01	; 1
   24d3a:	80 93 94 03 	sts	0x0394, r24	; 0x800394 <eFilamentAction>
                }

                if (eFilamentAction == FilamentAction::Load)
   24d3e:	80 91 94 03 	lds	r24, 0x0394	; 0x800394 <eFilamentAction>
   24d42:	81 30       	cpi	r24, 0x01	; 1
   24d44:	31 f4       	brne	.+12     	; 0x24d52 <mFilamentItem(unsigned int, unsigned int)+0x132>
                    enquecommand_P(MSG_M701); // load filament
   24d46:	61 e0       	ldi	r22, 0x01	; 1
   24d48:	88 e1       	ldi	r24, 0x18	; 24
   24d4a:	9b e6       	ldi	r25, 0x6B	; 107
                else if (eFilamentAction == FilamentAction::UnLoad)
                    enquecommand_P(MSG_M702); // unload filament
   24d4c:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
   24d50:	ea cf       	rjmp	.-44     	; 0x24d26 <mFilamentItem(unsigned int, unsigned int)+0x106>
                    eFilamentAction = FilamentAction::Load;
                }

                if (eFilamentAction == FilamentAction::Load)
                    enquecommand_P(MSG_M701); // load filament
                else if (eFilamentAction == FilamentAction::UnLoad)
   24d52:	83 30       	cpi	r24, 0x03	; 3
   24d54:	41 f7       	brne	.-48     	; 0x24d26 <mFilamentItem(unsigned int, unsigned int)+0x106>
                    enquecommand_P(MSG_M702); // unload filament
   24d56:	61 e0       	ldi	r22, 0x01	; 1
   24d58:	8c ec       	ldi	r24, 0xCC	; 204
   24d5a:	98 e6       	ldi	r25, 0x68	; 104
   24d5c:	f7 cf       	rjmp	.-18     	; 0x24d4c <mFilamentItem(unsigned int, unsigned int)+0x12c>
            break;
        case FilamentAction::MmuLoad:
            filamentActionMenu = mmu_load_to_nozzle_menu;
            break;
        case FilamentAction::MmuLoadingTest:
            filamentActionMenu = mmu_loading_test_menu;
   24d5e:	c1 ee       	ldi	r28, 0xE1	; 225
   24d60:	df ec       	ldi	r29, 0xCF	; 207
   24d62:	c2 cf       	rjmp	.-124    	; 0x24ce8 <mFilamentItem(unsigned int, unsigned int)+0xc8>
            break;
        case FilamentAction::MmuUnLoad:
            mFilamentResetMenuStack();
   24d64:	0f 94 11 05 	call	0x20a22	; 0x20a22 <mFilamentResetMenuStack()>
            MMU2::mmu2.unload();
   24d68:	0f 94 71 9d 	call	0x33ae2	; 0x33ae2 <MMU2::MMU2::unload() [clone .constprop.105]>

            // Clear the filament action. MMU Unload is currently a special edge
            // case in that it does not call a submenu. So we must clear the action
            // flag here for now
            clearFilamentAction();
   24d6c:	0f 94 d6 0b 	call	0x217ac	; 0x217ac <clearFilamentAction() [clone .lto_priv.411]>
   24d70:	da cf       	rjmp	.-76     	; 0x24d26 <mFilamentItem(unsigned int, unsigned int)+0x106>
            break;
        case FilamentAction::MmuEject:
            filamentActionMenu = mmu_fil_eject_menu;
   24d72:	cf e5       	ldi	r28, 0x5F	; 95
   24d74:	d0 ed       	ldi	r29, 0xD0	; 208
   24d76:	b8 cf       	rjmp	.-144    	; 0x24ce8 <mFilamentItem(unsigned int, unsigned int)+0xc8>
            break;
        case FilamentAction::MmuCut:
#ifdef MMU_HAS_CUTTER
            filamentActionMenu = mmu_cut_filament_menu;
   24d78:	c7 e5       	ldi	r28, 0x57	; 87
   24d7a:	d0 ed       	ldi	r29, 0xD0	; 208
   24d7c:	b5 cf       	rjmp	.-150    	; 0x24ce8 <mFilamentItem(unsigned int, unsigned int)+0xc8>
            menu_submenu(filamentActionMenu, true);
        }
    }
    else // still preheating, continue updating LCD UI
    {
        if (!bFilamentWaitingFlag || lcd_draw_update)
   24d7e:	80 91 14 06 	lds	r24, 0x0614	; 0x800614 <bFilamentWaitingFlag>
   24d82:	88 23       	and	r24, r24
   24d84:	21 f0       	breq	.+8      	; 0x24d8e <mFilamentItem(unsigned int, unsigned int)+0x16e>
   24d86:	80 91 59 02 	lds	r24, 0x0259	; 0x800259 <lcd_draw_update>
   24d8a:	88 23       	and	r24, r24
   24d8c:	a1 f1       	breq	.+104    	; 0x24df6 <mFilamentItem(unsigned int, unsigned int)+0x1d6>
            // bFilamentWaitingFlag to distinguish: this flag is reset exactly once when entering
            // the menu and is used to raise the carriage *once*. In other cases, the LCD has been
            // modified elsewhere and needs to be redrawn in full.

            // reset bFilamentWaitingFlag immediately to avoid re-entry from raise_z_above()!
            bFilamentWaitingFlag = true;
   24d8e:	81 e0       	ldi	r24, 0x01	; 1
   24d90:	80 93 14 06 	sts	0x0614, r24	; 0x800614 <bFilamentWaitingFlag>

            // also force-enable lcd_draw_update (might be 0 when called from outside a menu)
            lcd_draw_update = 1;
   24d94:	80 93 59 02 	sts	0x0259, r24	; 0x800259 <lcd_draw_update>

            lcd_clear();
   24d98:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
            lcd_puts_at_P(0,3, PSTR(">"));
   24d9c:	4e eb       	ldi	r20, 0xBE	; 190
   24d9e:	58 e9       	ldi	r21, 0x98	; 152
   24da0:	63 e0       	ldi	r22, 0x03	; 3
   24da2:	80 e0       	ldi	r24, 0x00	; 0
   24da4:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
            lcd_puts_at_P(1, 3, _T(MSG_CANCEL));
   24da8:	89 e2       	ldi	r24, 0x29	; 41
   24daa:	9d e3       	ldi	r25, 0x3D	; 61
   24dac:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   24db0:	ac 01       	movw	r20, r24
   24db2:	63 e0       	ldi	r22, 0x03	; 3
   24db4:	81 e0       	ldi	r24, 0x01	; 1
   24db6:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>

            lcd_set_cursor(0, 1);
   24dba:	61 e0       	ldi	r22, 0x01	; 1
   24dbc:	80 e0       	ldi	r24, 0x00	; 0
   24dbe:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
            switch (eFilamentAction)
   24dc2:	e0 91 94 03 	lds	r30, 0x0394	; 0x800394 <eFilamentAction>
   24dc6:	e1 50       	subi	r30, 0x01	; 1
   24dc8:	e8 30       	cpi	r30, 0x08	; 8
   24dca:	a8 f4       	brcc	.+42     	; 0x24df6 <mFilamentItem(unsigned int, unsigned int)+0x1d6>
   24dcc:	f0 e0       	ldi	r31, 0x00	; 0
   24dce:	88 27       	eor	r24, r24
   24dd0:	e3 51       	subi	r30, 0x13	; 19
   24dd2:	f9 4d       	sbci	r31, 0xD9	; 217
   24dd4:	8e 4f       	sbci	r24, 0xFE	; 254
   24dd6:	0d 94 f0 a4 	jmp	0x349e0	; 0x349e0 <__tablejump2__>
   24dda:	5e 37       	cpi	r21, 0x7E	; 126
   24ddc:	5e 37       	cpi	r21, 0x7E	; 126
   24dde:	54 38       	cpi	r21, 0x84	; 132
   24de0:	5e 37       	cpi	r21, 0x7E	; 126
   24de2:	54 38       	cpi	r21, 0x84	; 132
   24de4:	7c 37       	cpi	r23, 0x7C	; 124
   24de6:	08 38       	cpi	r16, 0x88	; 136
   24de8:	5e 37       	cpi	r21, 0x7E	; 126
            {
            case FilamentAction::Load:
            case FilamentAction::AutoLoad:
            case FilamentAction::MmuLoad:
            case FilamentAction::MmuLoadingTest:
                lcd_puts_P(_T(MSG_PREHEATING_TO_LOAD));
   24dea:	8b ef       	ldi	r24, 0xFB	; 251
   24dec:	97 e5       	ldi	r25, 0x57	; 87
                break;
            case FilamentAction::MmuEject:
                lcd_puts_P(_T(MSG_PREHEATING_TO_EJECT));
                break;
            case FilamentAction::MmuCut:
                lcd_puts_P(_T(MSG_PREHEATING_TO_CUT));
   24dee:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   24df2:	0e 94 1d 6f 	call	0xde3a	; 0xde3a <lcd_puts_P(char const*)>
                // handled earlier
                break;
            }
        }

        if (bFilamentWaitingFlag) {
   24df6:	80 91 14 06 	lds	r24, 0x0614	; 0x800614 <bFilamentWaitingFlag>
   24dfa:	81 11       	cpse	r24, r1
            lcd_print_target_temps_first_line();
   24dfc:	0f 94 b9 0c 	call	0x21972	; 0x21972 <lcd_print_target_temps_first_line()>
        }

        if (lcd_clicked())
   24e00:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   24e04:	88 23       	and	r24, r24
   24e06:	09 f4       	brne	.+2      	; 0x24e0a <mFilamentItem(unsigned int, unsigned int)+0x1ea>
   24e08:	2a cf       	rjmp	.-428    	; 0x24c5e <mFilamentItem(unsigned int, unsigned int)+0x3e>
        {
            // Filament action canceled while preheating
            bFilamentWaitingFlag = false;
   24e0a:	10 92 14 06 	sts	0x0614, r1	; 0x800614 <bFilamentWaitingFlag>
            if (!bFilamentPreheatState)
   24e0e:	80 91 15 06 	lds	r24, 0x0615	; 0x800615 <bFilamentPreheatState>
   24e12:	81 11       	cpse	r24, r1
   24e14:	0e c0       	rjmp	.+28     	; 0x24e32 <mFilamentItem(unsigned int, unsigned int)+0x212>
  return target_temperature_bed;
};

// Doesn't save FLASH when FORCE_INLINE removed.
FORCE_INLINE void setTargetHotend(const float &celsius) {
  target_temperature[0] = celsius;
   24e16:	10 92 5e 12 	sts	0x125E, r1	; 0x80125e <target_temperature+0x1>
   24e1a:	10 92 5d 12 	sts	0x125D, r1	; 0x80125d <target_temperature>
            {
                setTargetHotend(0);
                if (!printingIsPaused()) setTargetBed(0);
   24e1e:	0e 94 35 66 	call	0xcc6a	; 0xcc6a <printingIsPaused()>
   24e22:	81 11       	cpse	r24, r1
   24e24:	04 c0       	rjmp	.+8      	; 0x24e2e <mFilamentItem(unsigned int, unsigned int)+0x20e>
  resetPID(0);
};

FORCE_INLINE void setTargetBed(const float &celsius) {
  target_temperature_bed = celsius;
   24e26:	10 92 5a 12 	sts	0x125A, r1	; 0x80125a <target_temperature_bed+0x1>
   24e2a:	10 92 59 12 	sts	0x1259, r1	; 0x801259 <target_temperature_bed>
                menu_back();
   24e2e:	0e 94 1b 63 	call	0xc636	; 0xc636 <menu_back()>
            }
            menu_back();
   24e32:	0e 94 1b 63 	call	0xc636	; 0xc636 <menu_back()>
            clearFilamentAction();
        }
    }
}
   24e36:	df 91       	pop	r29
   24e38:	cf 91       	pop	r28
   24e3a:	1f 91       	pop	r17
   24e3c:	0f 91       	pop	r16
                setTargetHotend(0);
                if (!printingIsPaused()) setTargetBed(0);
                menu_back();
            }
            menu_back();
            clearFilamentAction();
   24e3e:	0d 94 d6 0b 	jmp	0x217ac	; 0x217ac <clearFilamentAction() [clone .lto_priv.411]>
            case FilamentAction::MmuLoadingTest:
                lcd_puts_P(_T(MSG_PREHEATING_TO_LOAD));
                break;
            case FilamentAction::UnLoad:
            case FilamentAction::MmuUnLoad:
                lcd_puts_P(_T(MSG_PREHEATING_TO_UNLOAD));
   24e42:	84 ee       	ldi	r24, 0xE4	; 228
   24e44:	97 e5       	ldi	r25, 0x57	; 87
   24e46:	d3 cf       	rjmp	.-90     	; 0x24dee <mFilamentItem(unsigned int, unsigned int)+0x1ce>
                break;
            case FilamentAction::MmuEject:
                lcd_puts_P(_T(MSG_PREHEATING_TO_EJECT));
   24e48:	8e ec       	ldi	r24, 0xCE	; 206
   24e4a:	97 e5       	ldi	r25, 0x57	; 87
   24e4c:	d0 cf       	rjmp	.-96     	; 0x24dee <mFilamentItem(unsigned int, unsigned int)+0x1ce>
                break;
            case FilamentAction::MmuCut:
                lcd_puts_P(_T(MSG_PREHEATING_TO_CUT));
   24e4e:	8a eb       	ldi	r24, 0xBA	; 186
   24e50:	97 e5       	ldi	r25, 0x57	; 87
   24e52:	cd cf       	rjmp	.-102    	; 0x24dee <mFilamentItem(unsigned int, unsigned int)+0x1ce>

00024e54 <preheat_or_continue(FilamentAction) [clone .lto_priv.410]>:
        }
    }
}

static void setFilamentAction(FilamentAction action) {
    eFilamentAction = action;
   24e54:	80 93 94 03 	sts	0x0394, r24	; 0x800394 <eFilamentAction>
    setFilamentAction(action);

    // For MMU: If FINDA doesn't detect filament on Cut or Eject action,
    // then preheating is unnecessary
    bFilamentSkipPreheat = ( MMU2::mmu2.Enabled() && !MMU2::mmu2.FindaDetectsFilament()
        && (action == FilamentAction::MmuCut ||  action == FilamentAction::MmuEject) );
   24e58:	40 91 01 13 	lds	r20, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   24e5c:	20 91 5d 12 	lds	r18, 0x125D	; 0x80125d <target_temperature>
   24e60:	30 91 5e 12 	lds	r19, 0x125E	; 0x80125e <target_temperature+0x1>
   24e64:	41 30       	cpi	r20, 0x01	; 1
   24e66:	59 f0       	breq	.+22     	; 0x24e7e <preheat_or_continue(FilamentAction) [clone .lto_priv.410]+0x2a>

    setFilamentAction(action);

    // For MMU: If FINDA doesn't detect filament on Cut or Eject action,
    // then preheating is unnecessary
    bFilamentSkipPreheat = ( MMU2::mmu2.Enabled() && !MMU2::mmu2.FindaDetectsFilament()
   24e68:	10 92 16 06 	sts	0x0616, r1	; 0x800616 <bFilamentSkipPreheat>
        && (action == FilamentAction::MmuCut ||  action == FilamentAction::MmuEject) );

    if (bFilamentSkipPreheat || target_temperature[0] >= extrude_min_temp) {
   24e6c:	80 91 57 02 	lds	r24, 0x0257	; 0x800257 <extrude_min_temp>
   24e70:	90 91 58 02 	lds	r25, 0x0258	; 0x800258 <extrude_min_temp+0x1>
   24e74:	28 17       	cp	r18, r24
   24e76:	39 07       	cpc	r19, r25
   24e78:	5c f4       	brge	.+22     	; 0x24e90 <preheat_or_continue(FilamentAction) [clone .lto_priv.410]+0x3c>
        bFilamentPreheatState = true;
        mFilamentItem(target_temperature[0], target_temperature_bed);
        bFilamentSkipPreheat = false; // Reset flag
    } else {
        lcd_generic_preheat_menu();
   24e7a:	0d 94 d9 0b 	jmp	0x217b2	; 0x217b2 <lcd_generic_preheat_menu()>

    setFilamentAction(action);

    // For MMU: If FINDA doesn't detect filament on Cut or Eject action,
    // then preheating is unnecessary
    bFilamentSkipPreheat = ( MMU2::mmu2.Enabled() && !MMU2::mmu2.FindaDetectsFilament()
   24e7e:	90 91 d7 12 	lds	r25, 0x12D7	; 0x8012d7 <MMU2::mmu2+0x45>
   24e82:	91 11       	cpse	r25, r1
   24e84:	f1 cf       	rjmp	.-30     	; 0x24e68 <preheat_or_continue(FilamentAction) [clone .lto_priv.410]+0x14>
        && (action == FilamentAction::MmuCut ||  action == FilamentAction::MmuEject) );
   24e86:	86 50       	subi	r24, 0x06	; 6
   24e88:	82 30       	cpi	r24, 0x02	; 2
   24e8a:	70 f7       	brcc	.-36     	; 0x24e68 <preheat_or_continue(FilamentAction) [clone .lto_priv.410]+0x14>

    setFilamentAction(action);

    // For MMU: If FINDA doesn't detect filament on Cut or Eject action,
    // then preheating is unnecessary
    bFilamentSkipPreheat = ( MMU2::mmu2.Enabled() && !MMU2::mmu2.FindaDetectsFilament()
   24e8c:	40 93 16 06 	sts	0x0616, r20	; 0x800616 <bFilamentSkipPreheat>
        && (action == FilamentAction::MmuCut ||  action == FilamentAction::MmuEject) );

    if (bFilamentSkipPreheat || target_temperature[0] >= extrude_min_temp) {
        bFilamentPreheatState = true;
   24e90:	81 e0       	ldi	r24, 0x01	; 1
   24e92:	80 93 15 06 	sts	0x0615, r24	; 0x800615 <bFilamentPreheatState>
        mFilamentItem(target_temperature[0], target_temperature_bed);
   24e96:	60 91 59 12 	lds	r22, 0x1259	; 0x801259 <target_temperature_bed>
   24e9a:	70 91 5a 12 	lds	r23, 0x125A	; 0x80125a <target_temperature_bed+0x1>
   24e9e:	c9 01       	movw	r24, r18
   24ea0:	0f 94 10 26 	call	0x24c20	; 0x24c20 <mFilamentItem(unsigned int, unsigned int)>
        bFilamentSkipPreheat = false; // Reset flag
   24ea4:	10 92 16 06 	sts	0x0616, r1	; 0x800616 <bFilamentSkipPreheat>
    } else {
        lcd_generic_preheat_menu();
    }
}
   24ea8:	08 95       	ret

00024eaa <lcd_AutoLoadFilament()>:
{
    preheat_or_continue(FilamentAction::Load);
}

void lcd_AutoLoadFilament() {
    preheat_or_continue(FilamentAction::AutoLoad);
   24eaa:	82 e0       	ldi	r24, 0x02	; 2
   24eac:	0d 94 2a 27 	jmp	0x24e54	; 0x24e54 <preheat_or_continue(FilamentAction) [clone .lto_priv.410]>

00024eb0 <lcd_LoadFilament() [clone .lto_priv.392]>:
    }
}

static void lcd_LoadFilament()
{
    preheat_or_continue(FilamentAction::Load);
   24eb0:	81 e0       	ldi	r24, 0x01	; 1
   24eb2:	0d 94 2a 27 	jmp	0x24e54	; 0x24e54 <preheat_or_continue(FilamentAction) [clone .lto_priv.410]>

00024eb6 <lcd_unLoadFilament() [clone .lto_priv.393]>:
    MENU_END();
}

static void lcd_unLoadFilament()
{
     preheat_or_continue(FilamentAction::UnLoad);
   24eb6:	83 e0       	ldi	r24, 0x03	; 3
   24eb8:	0d 94 2a 27 	jmp	0x24e54	; 0x24e54 <preheat_or_continue(FilamentAction) [clone .lto_priv.410]>

00024ebc <mFilamentItem_farm()>:
    }
}

static void mFilamentItem_farm()
{
    bFilamentPreheatState = false;
   24ebc:	10 92 15 06 	sts	0x0615, r1	; 0x800615 <bFilamentPreheatState>
    mFilamentItem(FARM_PREHEAT_HOTEND_TEMP, FARM_PREHEAT_HPB_TEMP);
   24ec0:	60 e5       	ldi	r22, 0x50	; 80
   24ec2:	70 e0       	ldi	r23, 0x00	; 0
   24ec4:	8a ef       	ldi	r24, 0xFA	; 250
   24ec6:	90 e0       	ldi	r25, 0x00	; 0
   24ec8:	0d 94 10 26 	jmp	0x24c20	; 0x24c20 <mFilamentItem(unsigned int, unsigned int)>

00024ecc <mFilamentItem_farm_nozzle()>:
}
static void mFilamentItem_farm_nozzle()
{
    bFilamentPreheatState = false;
   24ecc:	10 92 15 06 	sts	0x0615, r1	; 0x800615 <bFilamentPreheatState>
    mFilamentItem(FARM_PREHEAT_HOTEND_TEMP, 0);
   24ed0:	70 e0       	ldi	r23, 0x00	; 0
   24ed2:	60 e0       	ldi	r22, 0x00	; 0
   24ed4:	8a ef       	ldi	r24, 0xFA	; 250
   24ed6:	90 e0       	ldi	r25, 0x00	; 0
   24ed8:	0d 94 10 26 	jmp	0x24c20	; 0x24c20 <mFilamentItem(unsigned int, unsigned int)>

00024edc <mFilamentItem_PLA()>:
}

static void mFilamentItem_PLA()
{
    bFilamentPreheatState = false;
   24edc:	10 92 15 06 	sts	0x0615, r1	; 0x800615 <bFilamentPreheatState>
    mFilamentItem(PLA_PREHEAT_HOTEND_TEMP, PLA_PREHEAT_HPB_TEMP);
   24ee0:	6c e3       	ldi	r22, 0x3C	; 60
   24ee2:	70 e0       	ldi	r23, 0x00	; 0
   24ee4:	87 ed       	ldi	r24, 0xD7	; 215
   24ee6:	90 e0       	ldi	r25, 0x00	; 0
   24ee8:	0d 94 10 26 	jmp	0x24c20	; 0x24c20 <mFilamentItem(unsigned int, unsigned int)>

00024eec <mFilamentItem_PET()>:
}

static void mFilamentItem_PET()
{
    bFilamentPreheatState = false;
   24eec:	10 92 15 06 	sts	0x0615, r1	; 0x800615 <bFilamentPreheatState>
    mFilamentItem(PET_PREHEAT_HOTEND_TEMP, PET_PREHEAT_HPB_TEMP);
   24ef0:	65 e5       	ldi	r22, 0x55	; 85
   24ef2:	70 e0       	ldi	r23, 0x00	; 0
   24ef4:	86 ee       	ldi	r24, 0xE6	; 230
   24ef6:	90 e0       	ldi	r25, 0x00	; 0
   24ef8:	0d 94 10 26 	jmp	0x24c20	; 0x24c20 <mFilamentItem(unsigned int, unsigned int)>

00024efc <mFilamentItem_ASA()>:
}

static void mFilamentItem_ASA()
{
    bFilamentPreheatState = false;
   24efc:	10 92 15 06 	sts	0x0615, r1	; 0x800615 <bFilamentPreheatState>
    mFilamentItem(ASA_PREHEAT_HOTEND_TEMP, ASA_PREHEAT_HPB_TEMP);
   24f00:	69 e6       	ldi	r22, 0x69	; 105
   24f02:	70 e0       	ldi	r23, 0x00	; 0
   24f04:	84 e0       	ldi	r24, 0x04	; 4
   24f06:	91 e0       	ldi	r25, 0x01	; 1
   24f08:	0d 94 10 26 	jmp	0x24c20	; 0x24c20 <mFilamentItem(unsigned int, unsigned int)>

00024f0c <mFilamentItem_PC()>:
}

static void mFilamentItem_PC()
{
    bFilamentPreheatState = false;
   24f0c:	10 92 15 06 	sts	0x0615, r1	; 0x800615 <bFilamentPreheatState>
    mFilamentItem(PC_PREHEAT_HOTEND_TEMP, PC_PREHEAT_HPB_TEMP);
   24f10:	69 e6       	ldi	r22, 0x69	; 105
   24f12:	70 e0       	ldi	r23, 0x00	; 0
   24f14:	83 e1       	ldi	r24, 0x13	; 19
   24f16:	91 e0       	ldi	r25, 0x01	; 1
   24f18:	0d 94 10 26 	jmp	0x24c20	; 0x24c20 <mFilamentItem(unsigned int, unsigned int)>

00024f1c <mFilamentItem_PVB()>:
    mFilamentItem(FLEX_PREHEAT_HOTEND_TEMP, FLEX_PREHEAT_HPB_TEMP);
}

static void mFilamentItem_PVB()
{
    bFilamentPreheatState = false;
   24f1c:	10 92 15 06 	sts	0x0615, r1	; 0x800615 <bFilamentPreheatState>
    mFilamentItem(PVB_PREHEAT_HOTEND_TEMP, PVB_PREHEAT_HPB_TEMP);
   24f20:	6b e4       	ldi	r22, 0x4B	; 75
   24f22:	70 e0       	ldi	r23, 0x00	; 0
   24f24:	87 ed       	ldi	r24, 0xD7	; 215
   24f26:	90 e0       	ldi	r25, 0x00	; 0
   24f28:	0d 94 10 26 	jmp	0x24c20	; 0x24c20 <mFilamentItem(unsigned int, unsigned int)>

00024f2c <mFilamentItem_PA()>:
    mFilamentItem(ABS_PREHEAT_HOTEND_TEMP, ABS_PREHEAT_HPB_TEMP);
}

static void mFilamentItem_PA()
{
    bFilamentPreheatState = false;
   24f2c:	10 92 15 06 	sts	0x0615, r1	; 0x800615 <bFilamentPreheatState>
    mFilamentItem(PA_PREHEAT_HOTEND_TEMP, PA_PREHEAT_HPB_TEMP);
   24f30:	6a e5       	ldi	r22, 0x5A	; 90
   24f32:	70 e0       	ldi	r23, 0x00	; 0
   24f34:	83 e1       	ldi	r24, 0x13	; 19
   24f36:	91 e0       	ldi	r25, 0x01	; 1
   24f38:	0d 94 10 26 	jmp	0x24c20	; 0x24c20 <mFilamentItem(unsigned int, unsigned int)>

00024f3c <mFilamentItem_ABS()>:
    mFilamentItem(PC_PREHEAT_HOTEND_TEMP, PC_PREHEAT_HPB_TEMP);
}

static void mFilamentItem_ABS()
{
    bFilamentPreheatState = false;
   24f3c:	10 92 15 06 	sts	0x0615, r1	; 0x800615 <bFilamentPreheatState>
    mFilamentItem(ABS_PREHEAT_HOTEND_TEMP, ABS_PREHEAT_HPB_TEMP);
   24f40:	64 e6       	ldi	r22, 0x64	; 100
   24f42:	70 e0       	ldi	r23, 0x00	; 0
   24f44:	8f ef       	ldi	r24, 0xFF	; 255
   24f46:	90 e0       	ldi	r25, 0x00	; 0
   24f48:	0d 94 10 26 	jmp	0x24c20	; 0x24c20 <mFilamentItem(unsigned int, unsigned int)>

00024f4c <mFilamentItem_HIPS()>:
    mFilamentItem(PA_PREHEAT_HOTEND_TEMP, PA_PREHEAT_HPB_TEMP);
}

static void mFilamentItem_HIPS()
{
    bFilamentPreheatState = false;
   24f4c:	10 92 15 06 	sts	0x0615, r1	; 0x800615 <bFilamentPreheatState>
    mFilamentItem(HIPS_PREHEAT_HOTEND_TEMP, HIPS_PREHEAT_HPB_TEMP);
   24f50:	64 e6       	ldi	r22, 0x64	; 100
   24f52:	70 e0       	ldi	r23, 0x00	; 0
   24f54:	8c ed       	ldi	r24, 0xDC	; 220
   24f56:	90 e0       	ldi	r25, 0x00	; 0
   24f58:	0d 94 10 26 	jmp	0x24c20	; 0x24c20 <mFilamentItem(unsigned int, unsigned int)>

00024f5c <mFilamentItem_PP()>:
}

static void mFilamentItem_PP()
{
    bFilamentPreheatState = false;
   24f5c:	10 92 15 06 	sts	0x0615, r1	; 0x800615 <bFilamentPreheatState>
    mFilamentItem(PP_PREHEAT_HOTEND_TEMP, PP_PREHEAT_HPB_TEMP);
   24f60:	64 e6       	ldi	r22, 0x64	; 100
   24f62:	70 e0       	ldi	r23, 0x00	; 0
   24f64:	8e ef       	ldi	r24, 0xFE	; 254
   24f66:	90 e0       	ldi	r25, 0x00	; 0
   24f68:	0d 94 10 26 	jmp	0x24c20	; 0x24c20 <mFilamentItem(unsigned int, unsigned int)>

00024f6c <mFilamentItem_FLEX()>:
}

static void mFilamentItem_FLEX()
{
    bFilamentPreheatState = false;
   24f6c:	10 92 15 06 	sts	0x0615, r1	; 0x800615 <bFilamentPreheatState>
    mFilamentItem(FLEX_PREHEAT_HOTEND_TEMP, FLEX_PREHEAT_HPB_TEMP);
   24f70:	62 e3       	ldi	r22, 0x32	; 50
   24f72:	70 e0       	ldi	r23, 0x00	; 0
   24f74:	80 ef       	ldi	r24, 0xF0	; 240
   24f76:	90 e0       	ldi	r25, 0x00	; 0
   24f78:	0d 94 10 26 	jmp	0x24c20	; 0x24c20 <mFilamentItem(unsigned int, unsigned int)>

00024f7c <Sound_MakeCustom(unsigned int, unsigned int, bool)>:
     }
Sound_SaveMode();
}

//if critical is true then silend and once mode is ignored
void __attribute__((noinline)) Sound_MakeCustom(uint16_t ms,uint16_t tone_,bool critical){
   24f7c:	cf 92       	push	r12
   24f7e:	df 92       	push	r13
   24f80:	ef 92       	push	r14
   24f82:	ff 92       	push	r15
     if (critical || eSoundMode != e_SOUND_MODE_SILENT) {
   24f84:	41 11       	cpse	r20, r1
   24f86:	04 c0       	rjmp	.+8      	; 0x24f90 <Sound_MakeCustom(unsigned int, unsigned int, bool)+0x14>
   24f88:	20 91 47 04 	lds	r18, 0x0447	; 0x800447 <eSoundMode>
   24f8c:	22 30       	cpi	r18, 0x02	; 2
   24f8e:	d1 f0       	breq	.+52     	; 0x24fc4 <Sound_MakeCustom(unsigned int, unsigned int, bool)+0x48>
   24f90:	9b 01       	movw	r18, r22
   24f92:	6c 01       	movw	r12, r24
   24f94:	f1 2c       	mov	r15, r1
   24f96:	e1 2c       	mov	r14, r1
          if(!tone_) {
   24f98:	67 2b       	or	r22, r23
   24f9a:	c9 f4       	brne	.+50     	; 0x24fce <Sound_MakeCustom(unsigned int, unsigned int, bool)+0x52>
               WRITE(BEEPER, HIGH);
   24f9c:	9f b7       	in	r25, 0x3f	; 63
   24f9e:	f8 94       	cli
   24fa0:	80 91 02 01 	lds	r24, 0x0102	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   24fa4:	84 60       	ori	r24, 0x04	; 4
   24fa6:	80 93 02 01 	sts	0x0102, r24	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   24faa:	9f bf       	out	0x3f, r25	; 63
               _delay(ms);
   24fac:	c7 01       	movw	r24, r14
   24fae:	b6 01       	movw	r22, r12
   24fb0:	0f 94 bd 0d 	call	0x21b7a	; 0x21b7a <delay2>
	OCR4A = 255U;
	// Disable Output compare A interrupt and timer overflow interrupt
	TIMSK4 &= ~(_BV(OCIE4A) | _BV(TOIE4));
	CRITICAL_SECTION_END;
	// Turn beeper off if it was on when noTone was called
	WRITE(BEEPER, 0);
   24fb4:	9f b7       	in	r25, 0x3f	; 63
   24fb6:	f8 94       	cli
   24fb8:	80 91 02 01 	lds	r24, 0x0102	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   24fbc:	8b 7f       	andi	r24, 0xFB	; 251
   24fbe:	80 93 02 01 	sts	0x0102, r24	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   24fc2:	9f bf       	out	0x3f, r25	; 63
               _tone(BEEPER, tone_);
               _delay(ms);
               _noTone(BEEPER);
          }
     }
}
   24fc4:	ff 90       	pop	r15
   24fc6:	ef 90       	pop	r14
   24fc8:	df 90       	pop	r13
   24fca:	cf 90       	pop	r12
   24fcc:	08 95       	ret

void tone4(_UNUSED uint8_t _pin, uint16_t frequency)
{
	//this ocr and prescalarbits calculation is taken from the Arduino core and simplified for one type of timer only
	uint8_t prescalarbits = 0b001;
	uint32_t pwm_freq = F_CPU / (2 * frequency);
   24fce:	22 0f       	add	r18, r18
   24fd0:	33 1f       	adc	r19, r19
   24fd2:	50 e0       	ldi	r21, 0x00	; 0
   24fd4:	40 e0       	ldi	r20, 0x00	; 0
   24fd6:	60 e0       	ldi	r22, 0x00	; 0
   24fd8:	74 e2       	ldi	r23, 0x24	; 36
   24fda:	84 ef       	ldi	r24, 0xF4	; 244
   24fdc:	90 e0       	ldi	r25, 0x00	; 0
   24fde:	0f 94 d1 a4 	call	0x349a2	; 0x349a2 <__divmodsi4>
}

void tone4(_UNUSED uint8_t _pin, uint16_t frequency)
{
	//this ocr and prescalarbits calculation is taken from the Arduino core and simplified for one type of timer only
	uint8_t prescalarbits = 0b001;
   24fe2:	91 e0       	ldi	r25, 0x01	; 1
	uint32_t pwm_freq = F_CPU / (2 * frequency);

	if (pwm_freq > UINT16_MAX) {
   24fe4:	21 15       	cp	r18, r1
   24fe6:	31 05       	cpc	r19, r1
   24fe8:	81 e0       	ldi	r24, 0x01	; 1
   24fea:	48 07       	cpc	r20, r24
   24fec:	51 05       	cpc	r21, r1
   24fee:	44 f0       	brlt	.+16     	; 0x25000 <Sound_MakeCustom(unsigned int, unsigned int, bool)+0x84>
		pwm_freq /= 64; // Increase prescaler to 64
   24ff0:	86 e0       	ldi	r24, 0x06	; 6
   24ff2:	56 95       	lsr	r21
   24ff4:	47 95       	ror	r20
   24ff6:	37 95       	ror	r19
   24ff8:	27 95       	ror	r18
   24ffa:	8a 95       	dec	r24
   24ffc:	d1 f7       	brne	.-12     	; 0x24ff2 <Sound_MakeCustom(unsigned int, unsigned int, bool)+0x76>
		prescalarbits = 0b011;
   24ffe:	93 e0       	ldi	r25, 0x03	; 3
	}

	uint16_t ocr = pwm_freq - 1;
   25000:	21 50       	subi	r18, 0x01	; 1
   25002:	31 09       	sbc	r19, r1

	CRITICAL_SECTION_START;
   25004:	4f b7       	in	r20, 0x3f	; 63
   25006:	f8 94       	cli
	// Set calcualted prescaler
	TCCR4B = (TCCR4B & 0b11111000) | prescalarbits;
   25008:	80 91 a1 00 	lds	r24, 0x00A1	; 0x8000a1 <__TEXT_REGION_LENGTH__+0x7c20a1>
   2500c:	88 7f       	andi	r24, 0xF8	; 248
   2500e:	89 2b       	or	r24, r25
   25010:	80 93 a1 00 	sts	0x00A1, r24	; 0x8000a1 <__TEXT_REGION_LENGTH__+0x7c20a1>
#ifdef EXTRUDER_0_AUTO_FAN_PIN
	// Scale the fan PWM duty cycle so that it remains constant, but at the tone frequency
	OCR4C = (OCR4C * ocr) / (uint16_t)((TIMSK4 & _BV(OCIE4A)) ? OCR4A : 255U);
   25014:	60 91 ac 00 	lds	r22, 0x00AC	; 0x8000ac <__TEXT_REGION_LENGTH__+0x7c20ac>
   25018:	70 91 ad 00 	lds	r23, 0x00AD	; 0x8000ad <__TEXT_REGION_LENGTH__+0x7c20ad>
   2501c:	26 9f       	mul	r18, r22
   2501e:	c0 01       	movw	r24, r0
   25020:	27 9f       	mul	r18, r23
   25022:	90 0d       	add	r25, r0
   25024:	36 9f       	mul	r19, r22
   25026:	90 0d       	add	r25, r0
   25028:	11 24       	eor	r1, r1
   2502a:	50 91 72 00 	lds	r21, 0x0072	; 0x800072 <__TEXT_REGION_LENGTH__+0x7c2072>
   2502e:	6f ef       	ldi	r22, 0xFF	; 255
   25030:	70 e0       	ldi	r23, 0x00	; 0
   25032:	51 ff       	sbrs	r21, 1
   25034:	04 c0       	rjmp	.+8      	; 0x2503e <Sound_MakeCustom(unsigned int, unsigned int, bool)+0xc2>
   25036:	60 91 a8 00 	lds	r22, 0x00A8	; 0x8000a8 <__TEXT_REGION_LENGTH__+0x7c20a8>
   2503a:	70 91 a9 00 	lds	r23, 0x00A9	; 0x8000a9 <__TEXT_REGION_LENGTH__+0x7c20a9>
   2503e:	0f 94 a9 a4 	call	0x34952	; 0x34952 <__udivmodhi4>
   25042:	70 93 ad 00 	sts	0x00AD, r23	; 0x8000ad <__TEXT_REGION_LENGTH__+0x7c20ad>
   25046:	60 93 ac 00 	sts	0x00AC, r22	; 0x8000ac <__TEXT_REGION_LENGTH__+0x7c20ac>
#endif //EXTRUDER_0_AUTO_FAN_PIN
	// Set calcualted ocr
	OCR4A = ocr;
   2504a:	30 93 a9 00 	sts	0x00A9, r19	; 0x8000a9 <__TEXT_REGION_LENGTH__+0x7c20a9>
   2504e:	20 93 a8 00 	sts	0x00A8, r18	; 0x8000a8 <__TEXT_REGION_LENGTH__+0x7c20a8>
	// Enable Output compare A interrupt and timer overflow interrupt
	TIMSK4 |= _BV(OCIE4A) | _BV(TOIE4);
   25052:	80 91 72 00 	lds	r24, 0x0072	; 0x800072 <__TEXT_REGION_LENGTH__+0x7c2072>
   25056:	83 60       	ori	r24, 0x03	; 3
   25058:	80 93 72 00 	sts	0x0072, r24	; 0x800072 <__TEXT_REGION_LENGTH__+0x7c2072>
	CRITICAL_SECTION_END;
   2505c:	4f bf       	out	0x3f, r20	; 63
               WRITE(BEEPER, HIGH);
               _delay(ms);
               WRITE(BEEPER, LOW);
          } else {
               _tone(BEEPER, tone_);
               _delay(ms);
   2505e:	c7 01       	movw	r24, r14
   25060:	b6 01       	movw	r22, r12
   25062:	0f 94 bd 0d 	call	0x21b7a	; 0x21b7a <delay2>
}

void noTone4(_UNUSED uint8_t _pin)
{
	CRITICAL_SECTION_START;
   25066:	2f b7       	in	r18, 0x3f	; 63
   25068:	f8 94       	cli
	// Revert prescaler to CLK/1024
	TCCR4B = (TCCR4B & 0b11111000) | _BV(CS42) | _BV(CS40);
   2506a:	80 91 a1 00 	lds	r24, 0x00A1	; 0x8000a1 <__TEXT_REGION_LENGTH__+0x7c20a1>
   2506e:	88 7f       	andi	r24, 0xF8	; 248
   25070:	85 60       	ori	r24, 0x05	; 5
   25072:	80 93 a1 00 	sts	0x00A1, r24	; 0x8000a1 <__TEXT_REGION_LENGTH__+0x7c20a1>
#ifdef EXTRUDER_0_AUTO_FAN_PIN
	// Scale the fan OCR back to the original value.
	OCR4C = (OCR4C * 255U) / (uint16_t)((TIMSK4 & _BV(OCIE4A)) ? OCR4A : 255U);
   25076:	40 91 ac 00 	lds	r20, 0x00AC	; 0x8000ac <__TEXT_REGION_LENGTH__+0x7c20ac>
   2507a:	50 91 ad 00 	lds	r21, 0x00AD	; 0x8000ad <__TEXT_REGION_LENGTH__+0x7c20ad>
   2507e:	3f ef       	ldi	r19, 0xFF	; 255
   25080:	34 9f       	mul	r19, r20
   25082:	c0 01       	movw	r24, r0
   25084:	35 9f       	mul	r19, r21
   25086:	90 0d       	add	r25, r0
   25088:	11 24       	eor	r1, r1
   2508a:	30 91 72 00 	lds	r19, 0x0072	; 0x800072 <__TEXT_REGION_LENGTH__+0x7c2072>
   2508e:	6f ef       	ldi	r22, 0xFF	; 255
   25090:	70 e0       	ldi	r23, 0x00	; 0
   25092:	31 ff       	sbrs	r19, 1
   25094:	04 c0       	rjmp	.+8      	; 0x2509e <Sound_MakeCustom(unsigned int, unsigned int, bool)+0x122>
   25096:	60 91 a8 00 	lds	r22, 0x00A8	; 0x8000a8 <__TEXT_REGION_LENGTH__+0x7c20a8>
   2509a:	70 91 a9 00 	lds	r23, 0x00A9	; 0x8000a9 <__TEXT_REGION_LENGTH__+0x7c20a9>
   2509e:	0f 94 a9 a4 	call	0x34952	; 0x34952 <__udivmodhi4>
   250a2:	70 93 ad 00 	sts	0x00AD, r23	; 0x8000ad <__TEXT_REGION_LENGTH__+0x7c20ad>
   250a6:	60 93 ac 00 	sts	0x00AC, r22	; 0x8000ac <__TEXT_REGION_LENGTH__+0x7c20ac>
#endif //EXTRUDER_0_AUTO_FAN_PIN
	OCR4A = 255U;
   250aa:	8f ef       	ldi	r24, 0xFF	; 255
   250ac:	90 e0       	ldi	r25, 0x00	; 0
   250ae:	90 93 a9 00 	sts	0x00A9, r25	; 0x8000a9 <__TEXT_REGION_LENGTH__+0x7c20a9>
   250b2:	80 93 a8 00 	sts	0x00A8, r24	; 0x8000a8 <__TEXT_REGION_LENGTH__+0x7c20a8>
	// Disable Output compare A interrupt and timer overflow interrupt
	TIMSK4 &= ~(_BV(OCIE4A) | _BV(TOIE4));
   250b6:	80 91 72 00 	lds	r24, 0x0072	; 0x800072 <__TEXT_REGION_LENGTH__+0x7c2072>
   250ba:	8c 7f       	andi	r24, 0xFC	; 252
   250bc:	80 93 72 00 	sts	0x0072, r24	; 0x800072 <__TEXT_REGION_LENGTH__+0x7c2072>
	CRITICAL_SECTION_END;
   250c0:	2f bf       	out	0x3f, r18	; 63
   250c2:	78 cf       	rjmp	.-272    	; 0x24fb4 <Sound_MakeCustom(unsigned int, unsigned int, bool)+0x38>

000250c4 <sound_wait_for_user()>:
/// Make sure to call sound_wait_for_user_reset() when the user has clicked the knob
///     Loud - should continuously beep
///     Silent - should be silent
///     Once - should beep once
///     Assist/Blind - as loud with beep and click on knob rotation and press
void sound_wait_for_user() {
   250c4:	cf 93       	push	r28
#if BEEPER > 0
     if (eSoundMode == e_SOUND_MODE_SILENT) return;
   250c6:	c0 91 47 04 	lds	r28, 0x0447	; 0x800447 <eSoundMode>
   250ca:	c2 30       	cpi	r28, 0x02	; 2
   250cc:	59 f1       	breq	.+86     	; 0x25124 <sound_wait_for_user()+0x60>

     // Handle case where only one beep is needed
     if (eSoundMode == e_SOUND_MODE_ONCE) {
   250ce:	c1 30       	cpi	r28, 0x01	; 1
   250d0:	69 f4       	brne	.+26     	; 0x250ec <sound_wait_for_user()+0x28>
          if (bFirst) return;
   250d2:	80 91 c1 04 	lds	r24, 0x04C1	; 0x8004c1 <_ZL6bFirst.lto_priv.500>
   250d6:	81 11       	cpse	r24, r1
   250d8:	25 c0       	rjmp	.+74     	; 0x25124 <sound_wait_for_user()+0x60>
          Sound_MakeCustom(80, 0, false);
   250da:	40 e0       	ldi	r20, 0x00	; 0
   250dc:	70 e0       	ldi	r23, 0x00	; 0
   250de:	60 e0       	ldi	r22, 0x00	; 0
   250e0:	80 e5       	ldi	r24, 0x50	; 80
   250e2:	90 e0       	ldi	r25, 0x00	; 0
   250e4:	0f 94 be 27 	call	0x24f7c	; 0x24f7c <Sound_MakeCustom(unsigned int, unsigned int, bool)>
          bFirst = true;
   250e8:	c0 93 c1 04 	sts	0x04C1, r28	; 0x8004c1 <_ZL6bFirst.lto_priv.500>
     }

     // Handle case where there should be continous beeps
     if (beep_timer.expired_cont(CONTINOUS_BEEP_PERIOD)) {
   250ec:	60 ed       	ldi	r22, 0xD0	; 208
   250ee:	77 e0       	ldi	r23, 0x07	; 7
   250f0:	8e eb       	ldi	r24, 0xBE	; 190
   250f2:	94 e0       	ldi	r25, 0x04	; 4
   250f4:	0f 94 47 0e 	call	0x21c8e	; 0x21c8e <Timer<unsigned short>::expired_cont(unsigned short)>
   250f8:	88 23       	and	r24, r24
   250fa:	a1 f0       	breq	.+40     	; 0x25124 <sound_wait_for_user()+0x60>
          beep_timer.start();
   250fc:	8e eb       	ldi	r24, 0xBE	; 190
   250fe:	94 e0       	ldi	r25, 0x04	; 4
   25100:	0f 94 4e 0e 	call	0x21c9c	; 0x21c9c <Timer<unsigned short>::start()>
          if (eSoundMode == e_SOUND_MODE_LOUD) {
   25104:	80 91 47 04 	lds	r24, 0x0447	; 0x800447 <eSoundMode>
   25108:	81 11       	cpse	r24, r1
   2510a:	08 c0       	rjmp	.+16     	; 0x2511c <sound_wait_for_user()+0x58>
               Sound_MakeCustom(80, 0, false);
   2510c:	40 e0       	ldi	r20, 0x00	; 0
   2510e:	70 e0       	ldi	r23, 0x00	; 0
   25110:	60 e0       	ldi	r22, 0x00	; 0
   25112:	80 e5       	ldi	r24, 0x50	; 80
   25114:	90 e0       	ldi	r25, 0x00	; 0
               // Assist (lower volume sound)
               Sound_MakeSound(e_SOUND_TYPE_ButtonEcho);
          }
     }
#endif // BEEPER > 0
}
   25116:	cf 91       	pop	r28

     // Handle case where there should be continous beeps
     if (beep_timer.expired_cont(CONTINOUS_BEEP_PERIOD)) {
          beep_timer.start();
          if (eSoundMode == e_SOUND_MODE_LOUD) {
               Sound_MakeCustom(80, 0, false);
   25118:	0d 94 be 27 	jmp	0x24f7c	; 0x24f7c <Sound_MakeCustom(unsigned int, unsigned int, bool)>
          } else {
               // Assist (lower volume sound)
               Sound_MakeSound(e_SOUND_TYPE_ButtonEcho);
   2511c:	80 e0       	ldi	r24, 0x00	; 0
          }
     }
#endif // BEEPER > 0
}
   2511e:	cf 91       	pop	r28
          beep_timer.start();
          if (eSoundMode == e_SOUND_MODE_LOUD) {
               Sound_MakeCustom(80, 0, false);
          } else {
               // Assist (lower volume sound)
               Sound_MakeSound(e_SOUND_TYPE_ButtonEcho);
   25120:	0d 94 ad 25 	jmp	0x24b5a	; 0x24b5a <Sound_MakeSound(eSOUND_TYPE)>
          }
     }
#endif // BEEPER > 0
}
   25124:	cf 91       	pop	r28
   25126:	08 95       	ret

00025128 <sm4_do_step(unsigned char)>:
{
#if ((MOTHERBOARD == BOARD_RAMBO_MINI_1_0) || (MOTHERBOARD == BOARD_RAMBO_MINI_1_3) || (MOTHERBOARD == BOARD_EINSY_1_0a))
#ifdef TMC2130_DEDGE_STEPPING
	PINC = (axes_mask & 0x0f); // toggle step signals by mask
#else
	uint8_t portC = PORTC & 0xf0;
   25128:	98 b1       	in	r25, 0x08	; 8
   2512a:	90 7f       	andi	r25, 0xF0	; 240
	PORTC = portC | (axes_mask & 0x0f); //set step signals by mask
   2512c:	89 2b       	or	r24, r25
   2512e:	88 b9       	out	0x08, r24	; 8
	asm("nop");
   25130:	00 00       	nop
	PORTC = portC; //set step signals to zero
   25132:	98 b9       	out	0x08, r25	; 8
	asm("nop");
   25134:	00 00       	nop
#endif
#endif //((MOTHERBOARD == BOARD_RAMBO_MINI_1_0) || (MOTHERBOARD == BOARD_RAMBO_MINI_1_3) || (MOTHERBOARD == BOARD_EINSY_1_0a))
}
   25136:	08 95       	ret

00025138 <sm4_set_dir(unsigned char, unsigned char)>:

sm4_calc_delay_cb_t sm4_calc_delay_cb = 0;

void sm4_set_dir(uint8_t axis, uint8_t dir)
{
	switch (axis)
   25138:	82 30       	cpi	r24, 0x02	; 2
   2513a:	b9 f0       	breq	.+46     	; 0x2516a <sm4_set_dir(unsigned char, unsigned char)+0x32>
   2513c:	83 30       	cpi	r24, 0x03	; 3
   2513e:	e9 f0       	breq	.+58     	; 0x2517a <sm4_set_dir(unsigned char, unsigned char)+0x42>
   25140:	81 30       	cpi	r24, 0x01	; 1
   25142:	59 f0       	breq	.+22     	; 0x2515a <sm4_set_dir(unsigned char, unsigned char)+0x22>
	{
#if ((MOTHERBOARD == BOARD_RAMBO_MINI_1_0) || (MOTHERBOARD == BOARD_RAMBO_MINI_1_3))
	case 0: if (dir == INVERT_X_DIR) PORTL |= 2; else PORTL &= ~2; break;
   25144:	80 91 0b 01 	lds	r24, 0x010B	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
   25148:	61 11       	cpse	r22, r1
   2514a:	05 c0       	rjmp	.+10     	; 0x25156 <sm4_set_dir(unsigned char, unsigned char)+0x1e>
   2514c:	82 60       	ori	r24, 0x02	; 2
	case 1: if (dir == INVERT_Y_DIR) PORTL |= 1; else PORTL &= ~1; break;
	case 2: if (dir == INVERT_Z_DIR) PORTL |= 4; else PORTL &= ~4; break;
	case 3: if (dir == INVERT_E0_DIR) PORTL |= 64; else PORTL &= ~64; break;
   2514e:	80 93 0b 01 	sts	0x010B, r24	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
	case 1: if (dir == INVERT_Y_DIR) PORTL |= 2; else PORTL &= ~2; break;
	case 2: if (dir == INVERT_Z_DIR) PORTL |= 4; else PORTL &= ~4; break;
	case 3: if (dir == INVERT_E0_DIR) PORTL |= 64; else PORTL &= ~64; break;
#endif
	}
	asm("nop");
   25152:	00 00       	nop
}
   25154:	08 95       	ret
void sm4_set_dir(uint8_t axis, uint8_t dir)
{
	switch (axis)
	{
#if ((MOTHERBOARD == BOARD_RAMBO_MINI_1_0) || (MOTHERBOARD == BOARD_RAMBO_MINI_1_3))
	case 0: if (dir == INVERT_X_DIR) PORTL |= 2; else PORTL &= ~2; break;
   25156:	8d 7f       	andi	r24, 0xFD	; 253
   25158:	fa cf       	rjmp	.-12     	; 0x2514e <sm4_set_dir(unsigned char, unsigned char)+0x16>
	case 1: if (dir == INVERT_Y_DIR) PORTL |= 1; else PORTL &= ~1; break;
   2515a:	80 91 0b 01 	lds	r24, 0x010B	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
   2515e:	61 11       	cpse	r22, r1
   25160:	02 c0       	rjmp	.+4      	; 0x25166 <sm4_set_dir(unsigned char, unsigned char)+0x2e>
   25162:	81 60       	ori	r24, 0x01	; 1
   25164:	f4 cf       	rjmp	.-24     	; 0x2514e <sm4_set_dir(unsigned char, unsigned char)+0x16>
   25166:	8e 7f       	andi	r24, 0xFE	; 254
   25168:	f2 cf       	rjmp	.-28     	; 0x2514e <sm4_set_dir(unsigned char, unsigned char)+0x16>
	case 2: if (dir == INVERT_Z_DIR) PORTL |= 4; else PORTL &= ~4; break;
   2516a:	80 91 0b 01 	lds	r24, 0x010B	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
   2516e:	61 11       	cpse	r22, r1
   25170:	02 c0       	rjmp	.+4      	; 0x25176 <sm4_set_dir(unsigned char, unsigned char)+0x3e>
   25172:	84 60       	ori	r24, 0x04	; 4
   25174:	ec cf       	rjmp	.-40     	; 0x2514e <sm4_set_dir(unsigned char, unsigned char)+0x16>
   25176:	8b 7f       	andi	r24, 0xFB	; 251
   25178:	ea cf       	rjmp	.-44     	; 0x2514e <sm4_set_dir(unsigned char, unsigned char)+0x16>
	case 3: if (dir == INVERT_E0_DIR) PORTL |= 64; else PORTL &= ~64; break;
   2517a:	80 91 0b 01 	lds	r24, 0x010B	; 0x80010b <__TEXT_REGION_LENGTH__+0x7c210b>
   2517e:	61 30       	cpi	r22, 0x01	; 1
   25180:	11 f4       	brne	.+4      	; 0x25186 <sm4_set_dir(unsigned char, unsigned char)+0x4e>
   25182:	80 64       	ori	r24, 0x40	; 64
   25184:	e4 cf       	rjmp	.-56     	; 0x2514e <sm4_set_dir(unsigned char, unsigned char)+0x16>
   25186:	8f 7b       	andi	r24, 0xBF	; 191
   25188:	e2 cf       	rjmp	.-60     	; 0x2514e <sm4_set_dir(unsigned char, unsigned char)+0x16>

0002518a <spiSend(unsigned char) [clone .lto_priv.372]>:
  buf[nbyte] = SPDR;
}
//------------------------------------------------------------------------------
/** SPI send a byte */
static void spiSend(uint8_t b) {
  SPDR = b;
   2518a:	8e bd       	out	0x2e, r24	; 46
  while (!(SPSR & (1 << SPIF))) { /* Intentionally left empty */ }
   2518c:	0d b4       	in	r0, 0x2d	; 45
   2518e:	07 fe       	sbrs	r0, 7
   25190:	fd cf       	rjmp	.-6      	; 0x2518c <spiSend(unsigned char) [clone .lto_priv.372]+0x2>
}
   25192:	08 95       	ret

00025194 <spiRec() [clone .lto_priv.366]>:
  SPSR = spiRate & 1 || spiRate == 6 ? 0 : 1 << SPI2X;
}
//------------------------------------------------------------------------------
/** SPI receive a byte */
static uint8_t spiRec() {
  SPDR = 0XFF;
   25194:	8f ef       	ldi	r24, 0xFF	; 255
   25196:	8e bd       	out	0x2e, r24	; 46
  while (!(SPSR & (1 << SPIF))) { /* Intentionally left empty */ }
   25198:	0d b4       	in	r0, 0x2d	; 45
   2519a:	07 fe       	sbrs	r0, 7
   2519c:	fd cf       	rjmp	.-6      	; 0x25198 <spiRec() [clone .lto_priv.366]+0x4>
  return SPDR;
   2519e:	8e b5       	in	r24, 0x2e	; 46
}
   251a0:	08 95       	ret

000251a2 <Sd2Card::cardCommand(unsigned char, unsigned long)>:
  }
}
#endif  // SOFTWARE_SPI
//------------------------------------------------------------------------------
// send command and return error code.  Return zero for OK
uint8_t Sd2Card::cardCommand(uint8_t cmd, uint32_t arg) {
   251a2:	8f 92       	push	r8
   251a4:	9f 92       	push	r9
   251a6:	af 92       	push	r10
   251a8:	bf 92       	push	r11
   251aa:	ef 92       	push	r14
   251ac:	ff 92       	push	r15
   251ae:	0f 93       	push	r16
   251b0:	1f 93       	push	r17
   251b2:	cf 93       	push	r28
   251b4:	7c 01       	movw	r14, r24
   251b6:	c6 2f       	mov	r28, r22
   251b8:	49 01       	movw	r8, r18
   251ba:	5a 01       	movw	r10, r20
  WRITE(SDSS, 1);
}
//------------------------------------------------------------------------------
void Sd2Card::chipSelectLow() {
#ifndef SOFTWARE_SPI
  spiInit(spiRate_);
   251bc:	fc 01       	movw	r30, r24
   251be:	91 81       	ldd	r25, Z+1	; 0x01
 * Initialize hardware SPI
 * Set SCK rate to F_CPU/pow(2, 1 + spiRate) for spiRate [0,6]
 */
static void spiInit(uint8_t spiRate) {
  // See avr processor documentation
  SPCR = (1 << SPE) | (1 << MSTR) | (spiRate >> 1);
   251c0:	89 2f       	mov	r24, r25
   251c2:	80 6a       	ori	r24, 0xA0	; 160
   251c4:	86 95       	lsr	r24
   251c6:	8c bd       	out	0x2c, r24	; 44
  SPSR = spiRate & 1 || spiRate == 6 ? 0 : 1 << SPI2X;
   251c8:	90 fd       	sbrc	r25, 0
   251ca:	03 c0       	rjmp	.+6      	; 0x251d2 <Sd2Card::cardCommand(unsigned char, unsigned long)+0x30>
   251cc:	81 e0       	ldi	r24, 0x01	; 1
   251ce:	96 30       	cpi	r25, 0x06	; 6
   251d0:	09 f4       	brne	.+2      	; 0x251d4 <Sd2Card::cardCommand(unsigned char, unsigned long)+0x32>
   251d2:	80 e0       	ldi	r24, 0x00	; 0
   251d4:	8d bd       	out	0x2d, r24	; 45
//------------------------------------------------------------------------------
void Sd2Card::chipSelectLow() {
#ifndef SOFTWARE_SPI
  spiInit(spiRate_);
#endif  // SOFTWARE_SPI
  WRITE(SDSS, 0);
   251d6:	28 98       	cbi	0x05, 0	; 5
uint8_t Sd2Card::cardCommand(uint8_t cmd, uint32_t arg) {
  // select card
  chipSelectLow();

  // wait up to 300 ms if busy
  waitNotBusy(300);
   251d8:	8c e2       	ldi	r24, 0x2C	; 44
   251da:	91 e0       	ldi	r25, 0x01	; 1
   251dc:	0f 94 de 65 	call	0x2cbbc	; 0x2cbbc <Sd2Card::waitNotBusy(unsigned int) [clone .constprop.311]>

  // send command
  spiSend(cmd | 0x40);
   251e0:	8c 2f       	mov	r24, r28
   251e2:	80 64       	ori	r24, 0x40	; 64
   251e4:	0f 94 c5 28 	call	0x2518a	; 0x2518a <spiSend(unsigned char) [clone .lto_priv.372]>
   251e8:	08 e1       	ldi	r16, 0x18	; 24
   251ea:	10 e0       	ldi	r17, 0x00	; 0

  // send argument
  for (int8_t s = 24; s >= 0; s -= 8) spiSend(arg >> s);
   251ec:	d5 01       	movw	r26, r10
   251ee:	c4 01       	movw	r24, r8
   251f0:	00 2e       	mov	r0, r16
   251f2:	04 c0       	rjmp	.+8      	; 0x251fc <Sd2Card::cardCommand(unsigned char, unsigned long)+0x5a>
   251f4:	b6 95       	lsr	r27
   251f6:	a7 95       	ror	r26
   251f8:	97 95       	ror	r25
   251fa:	87 95       	ror	r24
   251fc:	0a 94       	dec	r0
   251fe:	d2 f7       	brpl	.-12     	; 0x251f4 <Sd2Card::cardCommand(unsigned char, unsigned long)+0x52>
   25200:	0f 94 c5 28 	call	0x2518a	; 0x2518a <spiSend(unsigned char) [clone .lto_priv.372]>
   25204:	08 50       	subi	r16, 0x08	; 8
   25206:	11 09       	sbc	r17, r1
   25208:	08 3f       	cpi	r16, 0xF8	; 248
   2520a:	ff ef       	ldi	r31, 0xFF	; 255
   2520c:	1f 07       	cpc	r17, r31
   2520e:	71 f7       	brne	.-36     	; 0x251ec <Sd2Card::cardCommand(unsigned char, unsigned long)+0x4a>

  // send CRC
  uint8_t crc = 0XFF;
  if (cmd == CMD0) crc = 0X95;  // correct crc for CMD0 with arg 0
   25210:	85 e9       	ldi	r24, 0x95	; 149
   25212:	cc 23       	and	r28, r28
   25214:	21 f0       	breq	.+8      	; 0x2521e <Sd2Card::cardCommand(unsigned char, unsigned long)+0x7c>
  if (cmd == CMD8) crc = 0X87;  // correct crc for CMD8 with arg 0X1AA
   25216:	87 e8       	ldi	r24, 0x87	; 135
   25218:	c8 30       	cpi	r28, 0x08	; 8
   2521a:	09 f0       	breq	.+2      	; 0x2521e <Sd2Card::cardCommand(unsigned char, unsigned long)+0x7c>

  // send argument
  for (int8_t s = 24; s >= 0; s -= 8) spiSend(arg >> s);

  // send CRC
  uint8_t crc = 0XFF;
   2521c:	8f ef       	ldi	r24, 0xFF	; 255
  if (cmd == CMD0) crc = 0X95;  // correct crc for CMD0 with arg 0
  if (cmd == CMD8) crc = 0X87;  // correct crc for CMD8 with arg 0X1AA
  spiSend(crc);
   2521e:	0f 94 c5 28 	call	0x2518a	; 0x2518a <spiSend(unsigned char) [clone .lto_priv.372]>

  // skip stuff byte for stop read
  if (cmd == CMD12) spiRec();
   25222:	cc 30       	cpi	r28, 0x0C	; 12
   25224:	11 f4       	brne	.+4      	; 0x2522a <Sd2Card::cardCommand(unsigned char, unsigned long)+0x88>
   25226:	0f 94 ca 28 	call	0x25194	; 0x25194 <spiRec() [clone .lto_priv.366]>

  // send argument
  for (int8_t s = 24; s >= 0; s -= 8) spiSend(arg >> s);

  // send CRC
  uint8_t crc = 0XFF;
   2522a:	c0 e0       	ldi	r28, 0x00	; 0

  // skip stuff byte for stop read
  if (cmd == CMD12) spiRec();

  // wait for response
  for (uint8_t i = 0; ((status_ = spiRec()) & 0X80) && i != 0XFF; i++) { /* Intentionally left empty */ }
   2522c:	0f 94 ca 28 	call	0x25194	; 0x25194 <spiRec() [clone .lto_priv.366]>
   25230:	f7 01       	movw	r30, r14
   25232:	82 83       	std	Z+2, r24	; 0x02
   25234:	87 ff       	sbrs	r24, 7
   25236:	04 c0       	rjmp	.+8      	; 0x25240 <Sd2Card::cardCommand(unsigned char, unsigned long)+0x9e>
   25238:	cf 3f       	cpi	r28, 0xFF	; 255
   2523a:	11 f0       	breq	.+4      	; 0x25240 <Sd2Card::cardCommand(unsigned char, unsigned long)+0x9e>
   2523c:	cf 5f       	subi	r28, 0xFF	; 255
   2523e:	f6 cf       	rjmp	.-20     	; 0x2522c <Sd2Card::cardCommand(unsigned char, unsigned long)+0x8a>
  return status_;
}
   25240:	cf 91       	pop	r28
   25242:	1f 91       	pop	r17
   25244:	0f 91       	pop	r16
   25246:	ff 90       	pop	r15
   25248:	ef 90       	pop	r14
   2524a:	bf 90       	pop	r11
   2524c:	af 90       	pop	r10
   2524e:	9f 90       	pop	r9
   25250:	8f 90       	pop	r8
   25252:	08 95       	ret

00025254 <Sd2Card::writeBlock(unsigned long, unsigned char const*)>:
 * \param[in] blockNumber Logical block to be written.
 * \param[in] src Pointer to the location of the data to be written.
 * \return The value one, true, is returned for success and
 * the value zero, false, is returned for failure.
 */
bool Sd2Card::writeBlock(uint32_t blockNumber, const uint8_t* src) {
   25254:	0f 93       	push	r16
   25256:	1f 93       	push	r17
   25258:	cf 93       	push	r28
   2525a:	df 93       	push	r29
   2525c:	ec 01       	movw	r28, r24
   2525e:	89 01       	movw	r16, r18
  // use address if not SDHC card
  if (type() != SD_CARD_TYPE_SDHC) blockNumber <<= 9;
   25260:	8b 81       	ldd	r24, Y+3	; 0x03
   25262:	83 30       	cpi	r24, 0x03	; 3
   25264:	39 f0       	breq	.+14     	; 0x25274 <Sd2Card::writeBlock(unsigned long, unsigned char const*)+0x20>
   25266:	89 e0       	ldi	r24, 0x09	; 9
   25268:	44 0f       	add	r20, r20
   2526a:	55 1f       	adc	r21, r21
   2526c:	66 1f       	adc	r22, r22
   2526e:	77 1f       	adc	r23, r23
   25270:	8a 95       	dec	r24
   25272:	d1 f7       	brne	.-12     	; 0x25268 <Sd2Card::writeBlock(unsigned long, unsigned char const*)+0x14>
  if (cardCommand(CMD24, blockNumber)) {
   25274:	9a 01       	movw	r18, r20
   25276:	ab 01       	movw	r20, r22
   25278:	68 e1       	ldi	r22, 0x18	; 24
   2527a:	ce 01       	movw	r24, r28
   2527c:	0f 94 d1 28 	call	0x251a2	; 0x251a2 <Sd2Card::cardCommand(unsigned char, unsigned long)>
   25280:	88 23       	and	r24, r24
   25282:	19 f0       	breq	.+6      	; 0x2528a <Sd2Card::writeBlock(unsigned long, unsigned char const*)+0x36>
  bool eraseSingleBlockEnable();
  /**
   *  Set SD error code.
   *  \param[in] code value for error code.
   */
  void error(uint8_t code) {errorCode_ = code;}
   25284:	86 e0       	ldi	r24, 0x06	; 6
   25286:	88 83       	st	Y, r24
   25288:	39 c0       	rjmp	.+114    	; 0x252fc <Sd2Card::writeBlock(unsigned long, unsigned char const*)+0xa8>
}
//------------------------------------------------------------------------------
/** SPI send block - only one call so force inline */
static inline __attribute__((always_inline))
  void spiSendBlock(uint8_t token, const uint8_t* buf) {
  SPDR = token;
   2528a:	8e ef       	ldi	r24, 0xFE	; 254
   2528c:	8e bd       	out	0x2e, r24	; 46
   2528e:	f8 01       	movw	r30, r16
   25290:	c8 01       	movw	r24, r16
   25292:	9e 5f       	subi	r25, 0xFE	; 254
  for (uint16_t i = 0; i < 512; i += 2) {
    while (!(SPSR & (1 << SPIF))) { /* Intentionally left empty */ }
   25294:	0d b4       	in	r0, 0x2d	; 45
   25296:	07 fe       	sbrs	r0, 7
   25298:	fd cf       	rjmp	.-6      	; 0x25294 <Sd2Card::writeBlock(unsigned long, unsigned char const*)+0x40>
    SPDR = buf[i];
   2529a:	20 81       	ld	r18, Z
   2529c:	2e bd       	out	0x2e, r18	; 46
    while (!(SPSR & (1 << SPIF))) { /* Intentionally left empty */ }
   2529e:	0d b4       	in	r0, 0x2d	; 45
   252a0:	07 fe       	sbrs	r0, 7
   252a2:	fd cf       	rjmp	.-6      	; 0x2529e <Sd2Card::writeBlock(unsigned long, unsigned char const*)+0x4a>
    SPDR = buf[i + 1];
   252a4:	21 81       	ldd	r18, Z+1	; 0x01
   252a6:	2e bd       	out	0x2e, r18	; 46
   252a8:	32 96       	adiw	r30, 0x02	; 2
//------------------------------------------------------------------------------
/** SPI send block - only one call so force inline */
static inline __attribute__((always_inline))
  void spiSendBlock(uint8_t token, const uint8_t* buf) {
  SPDR = token;
  for (uint16_t i = 0; i < 512; i += 2) {
   252aa:	e8 17       	cp	r30, r24
   252ac:	f9 07       	cpc	r31, r25
   252ae:	91 f7       	brne	.-28     	; 0x25294 <Sd2Card::writeBlock(unsigned long, unsigned char const*)+0x40>
    while (!(SPSR & (1 << SPIF))) { /* Intentionally left empty */ }
    SPDR = buf[i];
    while (!(SPSR & (1 << SPIF))) { /* Intentionally left empty */ }
    SPDR = buf[i + 1];
  }
  while (!(SPSR & (1 << SPIF))) { /* Intentionally left empty */ }
   252b0:	0d b4       	in	r0, 0x2d	; 45
   252b2:	07 fe       	sbrs	r0, 7
   252b4:	fd cf       	rjmp	.-6      	; 0x252b0 <Sd2Card::writeBlock(unsigned long, unsigned char const*)+0x5c>
//------------------------------------------------------------------------------
// send one block of data for write block or write multiple blocks
bool Sd2Card::writeData(uint8_t token, const uint8_t* src) {
  spiSendBlock(token, src);

  spiSend(0xff);  // dummy crc
   252b6:	8f ef       	ldi	r24, 0xFF	; 255
   252b8:	0f 94 c5 28 	call	0x2518a	; 0x2518a <spiSend(unsigned char) [clone .lto_priv.372]>
  spiSend(0xff);  // dummy crc
   252bc:	8f ef       	ldi	r24, 0xFF	; 255
   252be:	0f 94 c5 28 	call	0x2518a	; 0x2518a <spiSend(unsigned char) [clone .lto_priv.372]>

  status_ = spiRec();
   252c2:	0f 94 ca 28 	call	0x25194	; 0x25194 <spiRec() [clone .lto_priv.366]>
   252c6:	8a 83       	std	Y+2, r24	; 0x02
  if ((status_ & DATA_RES_MASK) != DATA_RES_ACCEPTED) {
   252c8:	8f 71       	andi	r24, 0x1F	; 31
   252ca:	85 30       	cpi	r24, 0x05	; 5
   252cc:	99 f4       	brne	.+38     	; 0x252f4 <Sd2Card::writeBlock(unsigned long, unsigned char const*)+0xa0>
    goto fail;
  }
  if (!writeData(DATA_START_BLOCK, src)) goto fail;

  // wait for flash programming to complete
  if (!waitNotBusy(SD_WRITE_TIMEOUT)) {
   252ce:	88 e5       	ldi	r24, 0x58	; 88
   252d0:	92 e0       	ldi	r25, 0x02	; 2
   252d2:	0f 94 de 65 	call	0x2cbbc	; 0x2cbbc <Sd2Card::waitNotBusy(unsigned int) [clone .constprop.311]>
   252d6:	18 2f       	mov	r17, r24
   252d8:	87 e1       	ldi	r24, 0x17	; 23
   252da:	11 23       	and	r17, r17
   252dc:	a1 f2       	breq	.-88     	; 0x25286 <Sd2Card::writeBlock(unsigned long, unsigned char const*)+0x32>
    error(SD_CARD_ERROR_WRITE_TIMEOUT);
    goto fail;
  }
  // response is r2 so get and check two bytes for nonzero
  if (cardCommand(CMD13, 0) || spiRec()) {
   252de:	20 e0       	ldi	r18, 0x00	; 0
   252e0:	30 e0       	ldi	r19, 0x00	; 0
   252e2:	a9 01       	movw	r20, r18
   252e4:	6d e0       	ldi	r22, 0x0D	; 13
   252e6:	ce 01       	movw	r24, r28
   252e8:	0f 94 d1 28 	call	0x251a2	; 0x251a2 <Sd2Card::cardCommand(unsigned char, unsigned long)>
   252ec:	88 23       	and	r24, r24
   252ee:	51 f0       	breq	.+20     	; 0x25304 <Sd2Card::writeBlock(unsigned long, unsigned char const*)+0xb0>
   252f0:	86 e1       	ldi	r24, 0x16	; 22
   252f2:	c9 cf       	rjmp	.-110    	; 0x25286 <Sd2Card::writeBlock(unsigned long, unsigned char const*)+0x32>
   252f4:	83 e1       	ldi	r24, 0x13	; 19
   252f6:	88 83       	st	Y, r24
    goto fail;
  }
  return true;

 fail:
  chipSelectHigh();
   252f8:	0f 94 dc 65 	call	0x2cbb8	; 0x2cbb8 <Sd2Card::chipSelectHigh() [clone .constprop.312]>
  }
  chipSelectHigh();
  return true;

 fail:
  chipSelectHigh();
   252fc:	0f 94 dc 65 	call	0x2cbb8	; 0x2cbb8 <Sd2Card::chipSelectHigh() [clone .constprop.312]>
  return false;
   25300:	10 e0       	ldi	r17, 0x00	; 0
   25302:	06 c0       	rjmp	.+12     	; 0x25310 <Sd2Card::writeBlock(unsigned long, unsigned char const*)+0xbc>
  if (!waitNotBusy(SD_WRITE_TIMEOUT)) {
    error(SD_CARD_ERROR_WRITE_TIMEOUT);
    goto fail;
  }
  // response is r2 so get and check two bytes for nonzero
  if (cardCommand(CMD13, 0) || spiRec()) {
   25304:	0f 94 ca 28 	call	0x25194	; 0x25194 <spiRec() [clone .lto_priv.366]>
   25308:	81 11       	cpse	r24, r1
   2530a:	f2 cf       	rjmp	.-28     	; 0x252f0 <Sd2Card::writeBlock(unsigned long, unsigned char const*)+0x9c>
    error(SD_CARD_ERROR_WRITE_PROGRAMMING);
    goto fail;
  }
  chipSelectHigh();
   2530c:	0f 94 dc 65 	call	0x2cbb8	; 0x2cbb8 <Sd2Card::chipSelectHigh() [clone .constprop.312]>
  return true;

 fail:
  chipSelectHigh();
  return false;
}
   25310:	81 2f       	mov	r24, r17
   25312:	df 91       	pop	r29
   25314:	cf 91       	pop	r28
   25316:	1f 91       	pop	r17
   25318:	0f 91       	pop	r16
   2531a:	08 95       	ret

0002531c <SdVolume::cacheFlush()>:

 fail:
  return false;
}
//------------------------------------------------------------------------------
bool SdVolume::cacheFlush() {
   2531c:	cf 93       	push	r28
  if (cacheDirty_) {
   2531e:	80 91 42 0e 	lds	r24, 0x0E42	; 0x800e42 <SdVolume::cacheDirty_>
      }
      cacheMirrorBlock_ = 0;
    }
    cacheDirty_ = 0;
  }
  return true;
   25322:	c1 e0       	ldi	r28, 0x01	; 1
 fail:
  return false;
}
//------------------------------------------------------------------------------
bool SdVolume::cacheFlush() {
  if (cacheDirty_) {
   25324:	88 23       	and	r24, r24
   25326:	a1 f0       	breq	.+40     	; 0x25350 <SdVolume::cacheFlush()+0x34>
    if (!sdCard_->writeBlock(cacheBlockNumber_, cacheBuffer_.data)) {
   25328:	40 91 3a 0e 	lds	r20, 0x0E3A	; 0x800e3a <SdVolume::cacheBlockNumber_>
   2532c:	50 91 3b 0e 	lds	r21, 0x0E3B	; 0x800e3b <SdVolume::cacheBlockNumber_+0x1>
   25330:	60 91 3c 0e 	lds	r22, 0x0E3C	; 0x800e3c <SdVolume::cacheBlockNumber_+0x2>
   25334:	70 91 3d 0e 	lds	r23, 0x0E3D	; 0x800e3d <SdVolume::cacheBlockNumber_+0x3>
   25338:	26 e4       	ldi	r18, 0x46	; 70
   2533a:	3e e0       	ldi	r19, 0x0E	; 14
   2533c:	80 91 43 0e 	lds	r24, 0x0E43	; 0x800e43 <SdVolume::sdCard_>
   25340:	90 91 44 0e 	lds	r25, 0x0E44	; 0x800e44 <SdVolume::sdCard_+0x1>
   25344:	0f 94 2a 29 	call	0x25254	; 0x25254 <Sd2Card::writeBlock(unsigned long, unsigned char const*)>
   25348:	c8 2f       	mov	r28, r24
   2534a:	81 11       	cpse	r24, r1
   2534c:	04 c0       	rjmp	.+8      	; 0x25356 <SdVolume::cacheFlush()+0x3a>
    cacheDirty_ = 0;
  }
  return true;

 fail:
  return false;
   2534e:	c0 e0       	ldi	r28, 0x00	; 0
}
   25350:	8c 2f       	mov	r24, r28
   25352:	cf 91       	pop	r28
   25354:	08 95       	ret
  if (cacheDirty_) {
    if (!sdCard_->writeBlock(cacheBlockNumber_, cacheBuffer_.data)) {
      goto fail;
    }
    // mirror FAT tables
    if (cacheMirrorBlock_) {
   25356:	40 91 3e 0e 	lds	r20, 0x0E3E	; 0x800e3e <SdVolume::cacheMirrorBlock_>
   2535a:	50 91 3f 0e 	lds	r21, 0x0E3F	; 0x800e3f <SdVolume::cacheMirrorBlock_+0x1>
   2535e:	60 91 40 0e 	lds	r22, 0x0E40	; 0x800e40 <SdVolume::cacheMirrorBlock_+0x2>
   25362:	70 91 41 0e 	lds	r23, 0x0E41	; 0x800e41 <SdVolume::cacheMirrorBlock_+0x3>
   25366:	41 15       	cp	r20, r1
   25368:	51 05       	cpc	r21, r1
   2536a:	61 05       	cpc	r22, r1
   2536c:	71 05       	cpc	r23, r1
   2536e:	91 f0       	breq	.+36     	; 0x25394 <SdVolume::cacheFlush()+0x78>
      if (!sdCard_->writeBlock(cacheMirrorBlock_, cacheBuffer_.data)) {
   25370:	26 e4       	ldi	r18, 0x46	; 70
   25372:	3e e0       	ldi	r19, 0x0E	; 14
   25374:	80 91 43 0e 	lds	r24, 0x0E43	; 0x800e43 <SdVolume::sdCard_>
   25378:	90 91 44 0e 	lds	r25, 0x0E44	; 0x800e44 <SdVolume::sdCard_+0x1>
   2537c:	0f 94 2a 29 	call	0x25254	; 0x25254 <Sd2Card::writeBlock(unsigned long, unsigned char const*)>
   25380:	88 23       	and	r24, r24
   25382:	29 f3       	breq	.-54     	; 0x2534e <SdVolume::cacheFlush()+0x32>
        goto fail;
      }
      cacheMirrorBlock_ = 0;
   25384:	10 92 3e 0e 	sts	0x0E3E, r1	; 0x800e3e <SdVolume::cacheMirrorBlock_>
   25388:	10 92 3f 0e 	sts	0x0E3F, r1	; 0x800e3f <SdVolume::cacheMirrorBlock_+0x1>
   2538c:	10 92 40 0e 	sts	0x0E40, r1	; 0x800e40 <SdVolume::cacheMirrorBlock_+0x2>
   25390:	10 92 41 0e 	sts	0x0E41, r1	; 0x800e41 <SdVolume::cacheMirrorBlock_+0x3>
    }
    cacheDirty_ = 0;
   25394:	10 92 42 0e 	sts	0x0E42, r1	; 0x800e42 <SdVolume::cacheDirty_>
   25398:	db cf       	rjmp	.-74     	; 0x25350 <SdVolume::cacheFlush()+0x34>

0002539a <Sd2Card::readBlock(unsigned long, unsigned char*)>:
 * \param[in] blockNumber Logical block to be read.
 * \param[out] dst Pointer to the location that will receive the data.
 * \return The value one, true, is returned for success and
 * the value zero, false, is returned for failure.
 */
bool Sd2Card::readBlock(uint32_t blockNumber, uint8_t* dst) {
   2539a:	2f 92       	push	r2
   2539c:	3f 92       	push	r3
   2539e:	4f 92       	push	r4
   253a0:	5f 92       	push	r5
   253a2:	6f 92       	push	r6
   253a4:	7f 92       	push	r7
   253a6:	8f 92       	push	r8
   253a8:	9f 92       	push	r9
   253aa:	af 92       	push	r10
   253ac:	bf 92       	push	r11
   253ae:	cf 92       	push	r12
   253b0:	df 92       	push	r13
   253b2:	ef 92       	push	r14
   253b4:	ff 92       	push	r15
   253b6:	0f 93       	push	r16
   253b8:	1f 93       	push	r17
   253ba:	cf 93       	push	r28
   253bc:	df 93       	push	r29
   253be:	ec 01       	movw	r28, r24
   253c0:	2a 01       	movw	r4, r20
   253c2:	3b 01       	movw	r6, r22
   253c4:	69 01       	movw	r12, r18
#ifdef SD_CHECK_AND_RETRY
  uint8_t retryCnt = 3;
  // use address if not SDHC card
  if (type()!= SD_CARD_TYPE_SDHC) blockNumber <<= 9;
   253c6:	8b 81       	ldd	r24, Y+3	; 0x03
   253c8:	83 30       	cpi	r24, 0x03	; 3
   253ca:	39 f0       	breq	.+14     	; 0x253da <Sd2Card::readBlock(unsigned long, unsigned char*)+0x40>
   253cc:	69 e0       	ldi	r22, 0x09	; 9
   253ce:	44 0c       	add	r4, r4
   253d0:	55 1c       	adc	r5, r5
   253d2:	66 1c       	adc	r6, r6
   253d4:	77 1c       	adc	r7, r7
   253d6:	6a 95       	dec	r22
   253d8:	d1 f7       	brne	.-12     	; 0x253ce <Sd2Card::readBlock(unsigned long, unsigned char*)+0x34>
 retry2:
   253da:	43 e0       	ldi	r20, 0x03	; 3
   253dc:	94 2e       	mov	r9, r20
   253de:	56 01       	movw	r10, r12
   253e0:	81 e0       	ldi	r24, 0x01	; 1
   253e2:	a8 1a       	sub	r10, r24
   253e4:	8e ef       	ldi	r24, 0xFE	; 254
   253e6:	b8 0a       	sbc	r11, r24
   253e8:	16 01       	movw	r2, r12
   253ea:	ee ef       	ldi	r30, 0xFE	; 254
   253ec:	3e 1a       	sub	r3, r30
   253ee:	54 e0       	ldi	r21, 0x04	; 4
   253f0:	85 2e       	mov	r8, r21
  retryCnt --;
   253f2:	9a 94       	dec	r9
  if (cardCommand(CMD17, blockNumber)) {
   253f4:	a3 01       	movw	r20, r6
   253f6:	92 01       	movw	r18, r4
   253f8:	61 e1       	ldi	r22, 0x11	; 17
   253fa:	ce 01       	movw	r24, r28
   253fc:	0f 94 d1 28 	call	0x251a2	; 0x251a2 <Sd2Card::cardCommand(unsigned char, unsigned long)>
   25400:	88 23       	and	r24, r24
   25402:	79 f0       	breq	.+30     	; 0x25422 <Sd2Card::readBlock(unsigned long, unsigned char*)+0x88>
   25404:	88 82       	st	Y, r8
    error(SD_CARD_ERROR_CMD17);
    if (retryCnt > 0) goto retry;
   25406:	99 20       	and	r9, r9
   25408:	09 f4       	brne	.+2      	; 0x2540c <Sd2Card::readBlock(unsigned long, unsigned char*)+0x72>
   2540a:	7a c0       	rjmp	.+244    	; 0x25500 <Sd2Card::readBlock(unsigned long, unsigned char*)+0x166>
    if (retryCnt > 0) goto retry;
    goto fail;
  }
  return true;
 retry:
   chipSelectHigh();
   2540c:	0f 94 dc 65 	call	0x2cbb8	; 0x2cbb8 <Sd2Card::chipSelectHigh() [clone .constprop.312]>
   cardCommand(CMD12, 0);//Try sending a stop command, but ignore the result.
   25410:	20 e0       	ldi	r18, 0x00	; 0
   25412:	30 e0       	ldi	r19, 0x00	; 0
   25414:	a9 01       	movw	r20, r18
   25416:	6c e0       	ldi	r22, 0x0C	; 12
   25418:	ce 01       	movw	r24, r28
   2541a:	0f 94 d1 28 	call	0x251a2	; 0x251a2 <Sd2Card::cardCommand(unsigned char, unsigned long)>
   errorCode_ = 0;
   2541e:	18 82       	st	Y, r1
   25420:	e8 cf       	rjmp	.-48     	; 0x253f2 <Sd2Card::readBlock(unsigned long, unsigned char*)+0x58>
#endif

//------------------------------------------------------------------------------
bool Sd2Card::readData(uint8_t* dst, uint16_t count) {
  // wait for start block token
  uint16_t t0 = _millis();
   25422:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   25426:	8b 01       	movw	r16, r22
  while ((status_ = spiRec()) == 0XFF) {
   25428:	0f 94 ca 28 	call	0x25194	; 0x25194 <spiRec() [clone .lto_priv.366]>
   2542c:	8a 83       	std	Y+2, r24	; 0x02
   2542e:	8f 3f       	cpi	r24, 0xFF	; 255
   25430:	91 f4       	brne	.+36     	; 0x25456 <Sd2Card::readBlock(unsigned long, unsigned char*)+0xbc>
    if (((uint16_t)_millis() - t0) > SD_READ_TIMEOUT) {
   25432:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   25436:	60 1b       	sub	r22, r16
   25438:	71 0b       	sbc	r23, r17
   2543a:	6d 32       	cpi	r22, 0x2D	; 45
   2543c:	71 40       	sbci	r23, 0x01	; 1
   2543e:	a0 f3       	brcs	.-24     	; 0x25428 <Sd2Card::readBlock(unsigned long, unsigned char*)+0x8e>
   25440:	81 e1       	ldi	r24, 0x11	; 17
   25442:	88 83       	st	Y, r24
  if (flash_air_compatible_)
    spiSend(0XFF);
  return true;

 fail:
  chipSelectHigh();
   25444:	0f 94 dc 65 	call	0x2cbb8	; 0x2cbb8 <Sd2Card::chipSelectHigh() [clone .constprop.312]>
  // Toshiba FlashAir Patch. Purge pending status byte.
  if (flash_air_compatible_)
   25448:	8c 81       	ldd	r24, Y+4	; 0x04
   2544a:	88 23       	and	r24, r24
   2544c:	e1 f2       	breq	.-72     	; 0x25406 <Sd2Card::readBlock(unsigned long, unsigned char*)+0x6c>
    spiSend(0XFF);
   2544e:	8f ef       	ldi	r24, 0xFF	; 255
   25450:	0f 94 c5 28 	call	0x2518a	; 0x2518a <spiSend(unsigned char) [clone .lto_priv.372]>
   25454:	d8 cf       	rjmp	.-80     	; 0x25406 <Sd2Card::readBlock(unsigned long, unsigned char*)+0x6c>
    if (((uint16_t)_millis() - t0) > SD_READ_TIMEOUT) {
      error(SD_CARD_ERROR_READ_TIMEOUT);
      goto fail;
    }
  }
  if (status_ != DATA_START_BLOCK) {
   25456:	8e 3f       	cpi	r24, 0xFE	; 254
   25458:	11 f0       	breq	.+4      	; 0x2545e <Sd2Card::readBlock(unsigned long, unsigned char*)+0xc4>
   2545a:	8f e0       	ldi	r24, 0x0F	; 15
   2545c:	f2 cf       	rjmp	.-28     	; 0x25442 <Sd2Card::readBlock(unsigned long, unsigned char*)+0xa8>
//------------------------------------------------------------------------------
/** SPI read data - only one call so force inline */
static inline __attribute__((always_inline))
void spiRead(uint8_t* buf, uint16_t nbyte) {
  if (nbyte-- == 0) return;
  SPDR = 0XFF;
   2545e:	8f ef       	ldi	r24, 0xFF	; 255
   25460:	8e bd       	out	0x2e, r24	; 46
   25462:	d6 01       	movw	r26, r12
   25464:	f6 01       	movw	r30, r12
  for (uint16_t i = 0; i < nbyte; i++) {
    while (!(SPSR & (1 << SPIF))) { /* Intentionally left empty */ }
   25466:	0d b4       	in	r0, 0x2d	; 45
   25468:	07 fe       	sbrs	r0, 7
   2546a:	fd cf       	rjmp	.-6      	; 0x25466 <Sd2Card::readBlock(unsigned long, unsigned char*)+0xcc>
    buf[i] = SPDR;
   2546c:	9e b5       	in	r25, 0x2e	; 46
   2546e:	91 93       	st	Z+, r25
    SPDR = 0XFF;
   25470:	8e bd       	out	0x2e, r24	; 46
/** SPI read data - only one call so force inline */
static inline __attribute__((always_inline))
void spiRead(uint8_t* buf, uint16_t nbyte) {
  if (nbyte-- == 0) return;
  SPDR = 0XFF;
  for (uint16_t i = 0; i < nbyte; i++) {
   25472:	ea 15       	cp	r30, r10
   25474:	fb 05       	cpc	r31, r11
   25476:	b9 f7       	brne	.-18     	; 0x25466 <Sd2Card::readBlock(unsigned long, unsigned char*)+0xcc>
    while (!(SPSR & (1 << SPIF))) { /* Intentionally left empty */ }
    buf[i] = SPDR;
    SPDR = 0XFF;
  }
  while (!(SPSR & (1 << SPIF))) { /* Intentionally left empty */ }
   25478:	0d b4       	in	r0, 0x2d	; 45
   2547a:	07 fe       	sbrs	r0, 7
   2547c:	fd cf       	rjmp	.-6      	; 0x25478 <Sd2Card::readBlock(unsigned long, unsigned char*)+0xde>
  buf[nbyte] = SPDR;
   2547e:	8e b5       	in	r24, 0x2e	; 46
   25480:	f5 01       	movw	r30, r10
   25482:	80 83       	st	Z, r24
  0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
  0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
  0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
};
static uint16_t CRC_CCITT(const uint8_t* data, size_t n) {
  uint16_t crc = 0;
   25484:	f1 2c       	mov	r15, r1
   25486:	e1 2c       	mov	r14, r1
  for (size_t i = 0; i < n; i++) {
    crc = pgm_read_word(&crctab[(crc >> 8 ^ data[i]) & 0XFF]) ^ (crc << 8);
   25488:	8d 91       	ld	r24, X+
   2548a:	ef 2d       	mov	r30, r15
   2548c:	ff 27       	eor	r31, r31
   2548e:	e8 27       	eor	r30, r24
   25490:	ee 0f       	add	r30, r30
   25492:	ff 1f       	adc	r31, r31
   25494:	e5 57       	subi	r30, 0x75	; 117
   25496:	f6 47       	sbci	r31, 0x76	; 118
   25498:	85 91       	lpm	r24, Z+
   2549a:	94 91       	lpm	r25, Z
   2549c:	fe 2c       	mov	r15, r14
   2549e:	ee 24       	eor	r14, r14
   254a0:	e8 26       	eor	r14, r24
   254a2:	f9 26       	eor	r15, r25
  0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
  0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
};
static uint16_t CRC_CCITT(const uint8_t* data, size_t n) {
  uint16_t crc = 0;
  for (size_t i = 0; i < n; i++) {
   254a4:	2a 16       	cp	r2, r26
   254a6:	3b 06       	cpc	r3, r27
   254a8:	79 f7       	brne	.-34     	; 0x25488 <Sd2Card::readBlock(unsigned long, unsigned char*)+0xee>
  spiRead(dst, count);

#ifdef SD_CHECK_AND_RETRY
  {
    uint16_t calcCrc = CRC_CCITT(dst, count);
    uint16_t recvCrc = spiRec() << 8;
   254aa:	0f 94 ca 28 	call	0x25194	; 0x25194 <spiRec() [clone .lto_priv.366]>
   254ae:	08 2f       	mov	r16, r24
   254b0:	10 e0       	ldi	r17, 0x00	; 0
   254b2:	10 2f       	mov	r17, r16
   254b4:	00 27       	eor	r16, r16
    recvCrc |= spiRec();
   254b6:	0f 94 ca 28 	call	0x25194	; 0x25194 <spiRec() [clone .lto_priv.366]>
   254ba:	08 2b       	or	r16, r24
    if (calcCrc != recvCrc)
   254bc:	0e 15       	cp	r16, r14
   254be:	1f 05       	cpc	r17, r15
   254c0:	19 f0       	breq	.+6      	; 0x254c8 <Sd2Card::readBlock(unsigned long, unsigned char*)+0x12e>
   254c2:	f0 e2       	ldi	r31, 0x20	; 32
   254c4:	f8 83       	st	Y, r31
   254c6:	be cf       	rjmp	.-132    	; 0x25444 <Sd2Card::readBlock(unsigned long, unsigned char*)+0xaa>
#else
  // discard CRC
  spiRec();
  spiRec();
#endif
  chipSelectHigh();
   254c8:	0f 94 dc 65 	call	0x2cbb8	; 0x2cbb8 <Sd2Card::chipSelectHigh() [clone .constprop.312]>
  // Toshiba FlashAir Patch. Purge pending status byte.
  if (flash_air_compatible_)
   254cc:	cc 81       	ldd	r28, Y+4	; 0x04
   254ce:	cc 23       	and	r28, r28
   254d0:	d9 f0       	breq	.+54     	; 0x25508 <Sd2Card::readBlock(unsigned long, unsigned char*)+0x16e>
    spiSend(0XFF);
   254d2:	8f ef       	ldi	r24, 0xFF	; 255
   254d4:	0f 94 c5 28 	call	0x2518a	; 0x2518a <spiSend(unsigned char) [clone .lto_priv.372]>
#endif

 fail:
  chipSelectHigh();
  return false;
}
   254d8:	8c 2f       	mov	r24, r28
   254da:	df 91       	pop	r29
   254dc:	cf 91       	pop	r28
   254de:	1f 91       	pop	r17
   254e0:	0f 91       	pop	r16
   254e2:	ff 90       	pop	r15
   254e4:	ef 90       	pop	r14
   254e6:	df 90       	pop	r13
   254e8:	cf 90       	pop	r12
   254ea:	bf 90       	pop	r11
   254ec:	af 90       	pop	r10
   254ee:	9f 90       	pop	r9
   254f0:	8f 90       	pop	r8
   254f2:	7f 90       	pop	r7
   254f4:	6f 90       	pop	r6
   254f6:	5f 90       	pop	r5
   254f8:	4f 90       	pop	r4
   254fa:	3f 90       	pop	r3
   254fc:	2f 90       	pop	r2
   254fe:	08 95       	ret
  }
  return readData(dst, 512);
#endif

 fail:
  chipSelectHigh();
   25500:	0f 94 dc 65 	call	0x2cbb8	; 0x2cbb8 <Sd2Card::chipSelectHigh() [clone .constprop.312]>
  return false;
   25504:	c0 e0       	ldi	r28, 0x00	; 0
   25506:	e8 cf       	rjmp	.-48     	; 0x254d8 <Sd2Card::readBlock(unsigned long, unsigned char*)+0x13e>
  if (!readData(dst, 512))
  {
    if (retryCnt > 0) goto retry;
    goto fail;
  }
  return true;
   25508:	c1 e0       	ldi	r28, 0x01	; 1
   2550a:	e6 cf       	rjmp	.-52     	; 0x254d8 <Sd2Card::readBlock(unsigned long, unsigned char*)+0x13e>

0002550c <SdVolume::cacheRawBlock(unsigned long, bool)>:

 fail:
  return false;
}
//------------------------------------------------------------------------------
bool SdVolume::cacheRawBlock(uint32_t blockNumber, bool dirty) {
   2550c:	cf 92       	push	r12
   2550e:	df 92       	push	r13
   25510:	ef 92       	push	r14
   25512:	ff 92       	push	r15
   25514:	cf 93       	push	r28
   25516:	6b 01       	movw	r12, r22
   25518:	7c 01       	movw	r14, r24
   2551a:	c4 2f       	mov	r28, r20
  if (cacheBlockNumber_ != blockNumber) {
   2551c:	80 91 3a 0e 	lds	r24, 0x0E3A	; 0x800e3a <SdVolume::cacheBlockNumber_>
   25520:	90 91 3b 0e 	lds	r25, 0x0E3B	; 0x800e3b <SdVolume::cacheBlockNumber_+0x1>
   25524:	a0 91 3c 0e 	lds	r26, 0x0E3C	; 0x800e3c <SdVolume::cacheBlockNumber_+0x2>
   25528:	b0 91 3d 0e 	lds	r27, 0x0E3D	; 0x800e3d <SdVolume::cacheBlockNumber_+0x3>
   2552c:	8c 15       	cp	r24, r12
   2552e:	9d 05       	cpc	r25, r13
   25530:	ae 05       	cpc	r26, r14
   25532:	bf 05       	cpc	r27, r15
   25534:	01 f1       	breq	.+64     	; 0x25576 <SdVolume::cacheRawBlock(unsigned long, bool)+0x6a>
    if (!cacheFlush()) goto fail;
   25536:	0f 94 8e 29 	call	0x2531c	; 0x2531c <SdVolume::cacheFlush()>
   2553a:	81 11       	cpse	r24, r1
   2553c:	08 c0       	rjmp	.+16     	; 0x2554e <SdVolume::cacheRawBlock(unsigned long, bool)+0x42>
  }
  if (dirty) cacheDirty_ = true;
  return true;

 fail:
  return false;
   2553e:	c0 e0       	ldi	r28, 0x00	; 0
}
   25540:	8c 2f       	mov	r24, r28
   25542:	cf 91       	pop	r28
   25544:	ff 90       	pop	r15
   25546:	ef 90       	pop	r14
   25548:	df 90       	pop	r13
   2554a:	cf 90       	pop	r12
   2554c:	08 95       	ret
}
//------------------------------------------------------------------------------
bool SdVolume::cacheRawBlock(uint32_t blockNumber, bool dirty) {
  if (cacheBlockNumber_ != blockNumber) {
    if (!cacheFlush()) goto fail;
    if (!sdCard_->readBlock(blockNumber, cacheBuffer_.data)) goto fail;
   2554e:	26 e4       	ldi	r18, 0x46	; 70
   25550:	3e e0       	ldi	r19, 0x0E	; 14
   25552:	b7 01       	movw	r22, r14
   25554:	a6 01       	movw	r20, r12
   25556:	80 91 43 0e 	lds	r24, 0x0E43	; 0x800e43 <SdVolume::sdCard_>
   2555a:	90 91 44 0e 	lds	r25, 0x0E44	; 0x800e44 <SdVolume::sdCard_+0x1>
   2555e:	0f 94 cd 29 	call	0x2539a	; 0x2539a <Sd2Card::readBlock(unsigned long, unsigned char*)>
   25562:	88 23       	and	r24, r24
   25564:	61 f3       	breq	.-40     	; 0x2553e <SdVolume::cacheRawBlock(unsigned long, bool)+0x32>
    cacheBlockNumber_ = blockNumber;
   25566:	c0 92 3a 0e 	sts	0x0E3A, r12	; 0x800e3a <SdVolume::cacheBlockNumber_>
   2556a:	d0 92 3b 0e 	sts	0x0E3B, r13	; 0x800e3b <SdVolume::cacheBlockNumber_+0x1>
   2556e:	e0 92 3c 0e 	sts	0x0E3C, r14	; 0x800e3c <SdVolume::cacheBlockNumber_+0x2>
   25572:	f0 92 3d 0e 	sts	0x0E3D, r15	; 0x800e3d <SdVolume::cacheBlockNumber_+0x3>
  }
  if (dirty) cacheDirty_ = true;
   25576:	cc 23       	and	r28, r28
   25578:	21 f0       	breq	.+8      	; 0x25582 <SdVolume::cacheRawBlock(unsigned long, bool)+0x76>
   2557a:	81 e0       	ldi	r24, 0x01	; 1
   2557c:	80 93 42 0e 	sts	0x0E42, r24	; 0x800e42 <SdVolume::cacheDirty_>
   25580:	df cf       	rjmp	.-66     	; 0x25540 <SdVolume::cacheRawBlock(unsigned long, bool)+0x34>
  return true;
   25582:	c1 e0       	ldi	r28, 0x01	; 1
   25584:	dd cf       	rjmp	.-70     	; 0x25540 <SdVolume::cacheRawBlock(unsigned long, bool)+0x34>

00025586 <SdVolume::fatPut(unsigned long, unsigned long)>:
 fail:
  return false;
}
//------------------------------------------------------------------------------
// Store a FAT entry
bool SdVolume::fatPut(uint32_t cluster, uint32_t value) {
   25586:	4f 92       	push	r4
   25588:	5f 92       	push	r5
   2558a:	6f 92       	push	r6
   2558c:	7f 92       	push	r7
   2558e:	8f 92       	push	r8
   25590:	9f 92       	push	r9
   25592:	af 92       	push	r10
   25594:	bf 92       	push	r11
   25596:	cf 92       	push	r12
   25598:	df 92       	push	r13
   2559a:	ef 92       	push	r14
   2559c:	ff 92       	push	r15
   2559e:	0f 93       	push	r16
   255a0:	1f 93       	push	r17
   255a2:	cf 93       	push	r28
   255a4:	df 93       	push	r29
   255a6:	ec 01       	movw	r28, r24
  uint32_t lba;
  // error if reserved cluster
  if (cluster < 2) goto fail;
   255a8:	42 30       	cpi	r20, 0x02	; 2
   255aa:	51 05       	cpc	r21, r1
   255ac:	61 05       	cpc	r22, r1
   255ae:	71 05       	cpc	r23, r1
   255b0:	90 f4       	brcc	.+36     	; 0x255d6 <SdVolume::fatPut(unsigned long, unsigned long)+0x50>
  // mirror second FAT
  if (fatCount_ > 1) cacheMirrorBlock_ = lba + blocksPerFat_;
  return true;

 fail:
  return false;
   255b2:	80 e0       	ldi	r24, 0x00	; 0
}
   255b4:	df 91       	pop	r29
   255b6:	cf 91       	pop	r28
   255b8:	1f 91       	pop	r17
   255ba:	0f 91       	pop	r16
   255bc:	ff 90       	pop	r15
   255be:	ef 90       	pop	r14
   255c0:	df 90       	pop	r13
   255c2:	cf 90       	pop	r12
   255c4:	bf 90       	pop	r11
   255c6:	af 90       	pop	r10
   255c8:	9f 90       	pop	r9
   255ca:	8f 90       	pop	r8
   255cc:	7f 90       	pop	r7
   255ce:	6f 90       	pop	r6
   255d0:	5f 90       	pop	r5
   255d2:	4f 90       	pop	r4
   255d4:	08 95       	ret
  uint32_t lba;
  // error if reserved cluster
  if (cluster < 2) goto fail;

  // error if not in FAT
  if (cluster > (clusterCount_ + 1)) goto fail;
   255d6:	89 85       	ldd	r24, Y+9	; 0x09
   255d8:	9a 85       	ldd	r25, Y+10	; 0x0a
   255da:	ab 85       	ldd	r26, Y+11	; 0x0b
   255dc:	bc 85       	ldd	r27, Y+12	; 0x0c
   255de:	01 96       	adiw	r24, 0x01	; 1
   255e0:	a1 1d       	adc	r26, r1
   255e2:	b1 1d       	adc	r27, r1
   255e4:	84 17       	cp	r24, r20
   255e6:	95 07       	cpc	r25, r21
   255e8:	a6 07       	cpc	r26, r22
   255ea:	b7 07       	cpc	r27, r23
   255ec:	10 f3       	brcs	.-60     	; 0x255b2 <SdVolume::fatPut(unsigned long, unsigned long)+0x2c>
      tmp = ((cacheBuffer_.data[index] & 0XF0)) | tmp >> 4;
    }
    cacheBuffer_.data[index] = tmp;
    return true;
  }
  if (fatType_ == 16) {
   255ee:	8f 89       	ldd	r24, Y+23	; 0x17
   255f0:	80 31       	cpi	r24, 0x10	; 16
   255f2:	c9 f5       	brne	.+114    	; 0x25666 <SdVolume::fatPut(unsigned long, unsigned long)+0xe0>
    lba = fatStartBlock_ + (cluster >> 8);
   255f4:	85 2e       	mov	r8, r21
   255f6:	96 2e       	mov	r9, r22
   255f8:	a7 2e       	mov	r10, r23
   255fa:	bb 24       	eor	r11, r11
   255fc:	8b 89       	ldd	r24, Y+19	; 0x13
   255fe:	9c 89       	ldd	r25, Y+20	; 0x14
   25600:	ad 89       	ldd	r26, Y+21	; 0x15
   25602:	be 89       	ldd	r27, Y+22	; 0x16
  } else if (fatType_ == 32) {
    lba = fatStartBlock_ + (cluster >> 7);
   25604:	88 0e       	add	r8, r24
   25606:	99 1e       	adc	r9, r25
   25608:	aa 1e       	adc	r10, r26
   2560a:	bb 1e       	adc	r11, r27
   2560c:	28 01       	movw	r4, r16
   2560e:	39 01       	movw	r6, r18
   25610:	6a 01       	movw	r12, r20
   25612:	7b 01       	movw	r14, r22
  } else {
    goto fail;
  }
  if (!cacheRawBlock(lba, CACHE_FOR_WRITE)) goto fail;
   25614:	41 e0       	ldi	r20, 0x01	; 1
   25616:	c5 01       	movw	r24, r10
   25618:	b4 01       	movw	r22, r8
   2561a:	0f 94 86 2a 	call	0x2550c	; 0x2550c <SdVolume::cacheRawBlock(unsigned long, bool)>
   2561e:	88 23       	and	r24, r24
   25620:	41 f2       	breq	.-112    	; 0x255b2 <SdVolume::fatPut(unsigned long, unsigned long)+0x2c>
  // store entry
  if (fatType_ == 16) {
   25622:	9f 89       	ldd	r25, Y+23	; 0x17
   25624:	90 31       	cpi	r25, 0x10	; 16
   25626:	81 f5       	brne	.+96     	; 0x25688 <SdVolume::fatPut(unsigned long, unsigned long)+0x102>
    cacheBuffer_.fat16[cluster & 0XFF] = value;
   25628:	dd 24       	eor	r13, r13
   2562a:	ee 24       	eor	r14, r14
   2562c:	ff 24       	eor	r15, r15
   2562e:	f6 01       	movw	r30, r12
   25630:	ee 0f       	add	r30, r30
   25632:	ff 1f       	adc	r31, r31
   25634:	ea 5b       	subi	r30, 0xBA	; 186
   25636:	f1 4f       	sbci	r31, 0xF1	; 241
   25638:	11 83       	std	Z+1, r17	; 0x01
   2563a:	00 83       	st	Z, r16
  } else {
    cacheBuffer_.fat32[cluster & 0X7F] = value;
  }
  // mirror second FAT
  if (fatCount_ > 1) cacheMirrorBlock_ = lba + blocksPerFat_;
   2563c:	9a 89       	ldd	r25, Y+18	; 0x12
   2563e:	92 30       	cpi	r25, 0x02	; 2
   25640:	08 f4       	brcc	.+2      	; 0x25644 <SdVolume::fatPut(unsigned long, unsigned long)+0xbe>
   25642:	b8 cf       	rjmp	.-144    	; 0x255b4 <SdVolume::fatPut(unsigned long, unsigned long)+0x2e>
   25644:	4d 81       	ldd	r20, Y+5	; 0x05
   25646:	5e 81       	ldd	r21, Y+6	; 0x06
   25648:	6f 81       	ldd	r22, Y+7	; 0x07
   2564a:	78 85       	ldd	r23, Y+8	; 0x08
   2564c:	84 0e       	add	r8, r20
   2564e:	95 1e       	adc	r9, r21
   25650:	a6 1e       	adc	r10, r22
   25652:	b7 1e       	adc	r11, r23
   25654:	80 92 3e 0e 	sts	0x0E3E, r8	; 0x800e3e <SdVolume::cacheMirrorBlock_>
   25658:	90 92 3f 0e 	sts	0x0E3F, r9	; 0x800e3f <SdVolume::cacheMirrorBlock_+0x1>
   2565c:	a0 92 40 0e 	sts	0x0E40, r10	; 0x800e40 <SdVolume::cacheMirrorBlock_+0x2>
   25660:	b0 92 41 0e 	sts	0x0E41, r11	; 0x800e41 <SdVolume::cacheMirrorBlock_+0x3>
   25664:	a7 cf       	rjmp	.-178    	; 0x255b4 <SdVolume::fatPut(unsigned long, unsigned long)+0x2e>
    cacheBuffer_.data[index] = tmp;
    return true;
  }
  if (fatType_ == 16) {
    lba = fatStartBlock_ + (cluster >> 8);
  } else if (fatType_ == 32) {
   25666:	80 32       	cpi	r24, 0x20	; 32
   25668:	09 f0       	breq	.+2      	; 0x2566c <SdVolume::fatPut(unsigned long, unsigned long)+0xe6>
   2566a:	a3 cf       	rjmp	.-186    	; 0x255b2 <SdVolume::fatPut(unsigned long, unsigned long)+0x2c>
    lba = fatStartBlock_ + (cluster >> 7);
   2566c:	8b 89       	ldd	r24, Y+19	; 0x13
   2566e:	9c 89       	ldd	r25, Y+20	; 0x14
   25670:	ad 89       	ldd	r26, Y+21	; 0x15
   25672:	be 89       	ldd	r27, Y+22	; 0x16
   25674:	4a 01       	movw	r8, r20
   25676:	5b 01       	movw	r10, r22
   25678:	e7 e0       	ldi	r30, 0x07	; 7
   2567a:	b6 94       	lsr	r11
   2567c:	a7 94       	ror	r10
   2567e:	97 94       	ror	r9
   25680:	87 94       	ror	r8
   25682:	ea 95       	dec	r30
   25684:	d1 f7       	brne	.-12     	; 0x2567a <SdVolume::fatPut(unsigned long, unsigned long)+0xf4>
   25686:	be cf       	rjmp	.-132    	; 0x25604 <SdVolume::fatPut(unsigned long, unsigned long)+0x7e>
  if (!cacheRawBlock(lba, CACHE_FOR_WRITE)) goto fail;
  // store entry
  if (fatType_ == 16) {
    cacheBuffer_.fat16[cluster & 0XFF] = value;
  } else {
    cacheBuffer_.fat32[cluster & 0X7F] = value;
   25688:	e8 94       	clt
   2568a:	c7 f8       	bld	r12, 7
   2568c:	dd 24       	eor	r13, r13
   2568e:	ee 24       	eor	r14, r14
   25690:	ff 24       	eor	r15, r15
   25692:	f6 01       	movw	r30, r12
   25694:	ee 0f       	add	r30, r30
   25696:	ff 1f       	adc	r31, r31
   25698:	ee 0f       	add	r30, r30
   2569a:	ff 1f       	adc	r31, r31
   2569c:	ea 5b       	subi	r30, 0xBA	; 186
   2569e:	f1 4f       	sbci	r31, 0xF1	; 241
   256a0:	40 82       	st	Z, r4
   256a2:	51 82       	std	Z+1, r5	; 0x01
   256a4:	62 82       	std	Z+2, r6	; 0x02
   256a6:	73 82       	std	Z+3, r7	; 0x03
   256a8:	c9 cf       	rjmp	.-110    	; 0x2563c <SdVolume::fatPut(unsigned long, unsigned long)+0xb6>

000256aa <SdVolume::fatGet(unsigned long, unsigned long*)>:
 fail:
  return false;
}
//------------------------------------------------------------------------------
// Fetch a FAT entry
bool SdVolume::fatGet(uint32_t cluster, uint32_t* value) {
   256aa:	cf 92       	push	r12
   256ac:	df 92       	push	r13
   256ae:	ef 92       	push	r14
   256b0:	ff 92       	push	r15
   256b2:	0f 93       	push	r16
   256b4:	1f 93       	push	r17
   256b6:	cf 93       	push	r28
   256b8:	df 93       	push	r29
   256ba:	fc 01       	movw	r30, r24
  uint32_t lba;
  if (cluster > (clusterCount_ + 1)) goto fail;
   256bc:	81 85       	ldd	r24, Z+9	; 0x09
   256be:	92 85       	ldd	r25, Z+10	; 0x0a
   256c0:	a3 85       	ldd	r26, Z+11	; 0x0b
   256c2:	b4 85       	ldd	r27, Z+12	; 0x0c
   256c4:	01 96       	adiw	r24, 0x01	; 1
   256c6:	a1 1d       	adc	r26, r1
   256c8:	b1 1d       	adc	r27, r1
   256ca:	84 17       	cp	r24, r20
   256cc:	95 07       	cpc	r25, r21
   256ce:	a6 07       	cpc	r26, r22
   256d0:	b7 07       	cpc	r27, r23
   256d2:	50 f4       	brcc	.+20     	; 0x256e8 <SdVolume::fatGet(unsigned long, unsigned long*)+0x3e>
    *value = cacheBuffer_.fat32[cluster & 0X7F] & FAT32MASK;
  }
  return true;

 fail:
  return false;
   256d4:	80 e0       	ldi	r24, 0x00	; 0
}
   256d6:	df 91       	pop	r29
   256d8:	cf 91       	pop	r28
   256da:	1f 91       	pop	r17
   256dc:	0f 91       	pop	r16
   256de:	ff 90       	pop	r15
   256e0:	ef 90       	pop	r14
   256e2:	df 90       	pop	r13
   256e4:	cf 90       	pop	r12
   256e6:	08 95       	ret
    }
    tmp |= cacheBuffer_.data[index] << 8;
    *value = cluster & 1 ? tmp >> 4 : tmp & 0XFFF;
    return true;
  }
  if (fatType_ == 16) {
   256e8:	87 89       	ldd	r24, Z+23	; 0x17
   256ea:	80 31       	cpi	r24, 0x10	; 16
   256ec:	a9 f5       	brne	.+106    	; 0x25758 <SdVolume::fatGet(unsigned long, unsigned long*)+0xae>
    lba = fatStartBlock_ + (cluster >> 8);
   256ee:	bb 27       	eor	r27, r27
   256f0:	a7 2f       	mov	r26, r23
   256f2:	96 2f       	mov	r25, r22
   256f4:	85 2f       	mov	r24, r21
   256f6:	c3 88       	ldd	r12, Z+19	; 0x13
   256f8:	d4 88       	ldd	r13, Z+20	; 0x14
   256fa:	e5 88       	ldd	r14, Z+21	; 0x15
   256fc:	f6 88       	ldd	r15, Z+22	; 0x16
  } else if (fatType_ == 32) {
    lba = fatStartBlock_ + (cluster >> 7);
   256fe:	8c 0d       	add	r24, r12
   25700:	9d 1d       	adc	r25, r13
   25702:	ae 1d       	adc	r26, r14
   25704:	bf 1d       	adc	r27, r15
   25706:	e9 01       	movw	r28, r18
   25708:	6a 01       	movw	r12, r20
   2570a:	7b 01       	movw	r14, r22
   2570c:	8f 01       	movw	r16, r30
  } else {
    goto fail;
  }
  if (lba != cacheBlockNumber_) {
   2570e:	40 91 3a 0e 	lds	r20, 0x0E3A	; 0x800e3a <SdVolume::cacheBlockNumber_>
   25712:	50 91 3b 0e 	lds	r21, 0x0E3B	; 0x800e3b <SdVolume::cacheBlockNumber_+0x1>
   25716:	60 91 3c 0e 	lds	r22, 0x0E3C	; 0x800e3c <SdVolume::cacheBlockNumber_+0x2>
   2571a:	70 91 3d 0e 	lds	r23, 0x0E3D	; 0x800e3d <SdVolume::cacheBlockNumber_+0x3>
   2571e:	84 17       	cp	r24, r20
   25720:	95 07       	cpc	r25, r21
   25722:	a6 07       	cpc	r26, r22
   25724:	b7 07       	cpc	r27, r23
   25726:	49 f5       	brne	.+82     	; 0x2577a <SdVolume::fatGet(unsigned long, unsigned long*)+0xd0>
    if (!cacheRawBlock(lba, CACHE_FOR_READ)) goto fail;
  }
  if (fatType_ == 16) {
   25728:	f8 01       	movw	r30, r16
   2572a:	87 89       	ldd	r24, Z+23	; 0x17
   2572c:	80 31       	cpi	r24, 0x10	; 16
   2572e:	69 f5       	brne	.+90     	; 0x2578a <SdVolume::fatGet(unsigned long, unsigned long*)+0xe0>
    *value = cacheBuffer_.fat16[cluster & 0XFF];
   25730:	b7 01       	movw	r22, r14
   25732:	a6 01       	movw	r20, r12
   25734:	55 27       	eor	r21, r21
   25736:	66 27       	eor	r22, r22
   25738:	77 27       	eor	r23, r23
   2573a:	44 0f       	add	r20, r20
   2573c:	55 1f       	adc	r21, r21
   2573e:	4a 5b       	subi	r20, 0xBA	; 186
   25740:	51 4f       	sbci	r21, 0xF1	; 241
   25742:	fa 01       	movw	r30, r20
   25744:	80 81       	ld	r24, Z
   25746:	91 81       	ldd	r25, Z+1	; 0x01
   25748:	b0 e0       	ldi	r27, 0x00	; 0
   2574a:	a0 e0       	ldi	r26, 0x00	; 0
  } else {
    *value = cacheBuffer_.fat32[cluster & 0X7F] & FAT32MASK;
   2574c:	88 83       	st	Y, r24
   2574e:	99 83       	std	Y+1, r25	; 0x01
   25750:	aa 83       	std	Y+2, r26	; 0x02
   25752:	bb 83       	std	Y+3, r27	; 0x03
   25754:	81 e0       	ldi	r24, 0x01	; 1
   25756:	bf cf       	rjmp	.-130    	; 0x256d6 <SdVolume::fatGet(unsigned long, unsigned long*)+0x2c>
    *value = cluster & 1 ? tmp >> 4 : tmp & 0XFFF;
    return true;
  }
  if (fatType_ == 16) {
    lba = fatStartBlock_ + (cluster >> 8);
  } else if (fatType_ == 32) {
   25758:	80 32       	cpi	r24, 0x20	; 32
   2575a:	09 f0       	breq	.+2      	; 0x2575e <SdVolume::fatGet(unsigned long, unsigned long*)+0xb4>
   2575c:	bb cf       	rjmp	.-138    	; 0x256d4 <SdVolume::fatGet(unsigned long, unsigned long*)+0x2a>
    lba = fatStartBlock_ + (cluster >> 7);
   2575e:	c3 88       	ldd	r12, Z+19	; 0x13
   25760:	d4 88       	ldd	r13, Z+20	; 0x14
   25762:	e5 88       	ldd	r14, Z+21	; 0x15
   25764:	f6 88       	ldd	r15, Z+22	; 0x16
   25766:	db 01       	movw	r26, r22
   25768:	ca 01       	movw	r24, r20
   2576a:	c7 e0       	ldi	r28, 0x07	; 7
   2576c:	b6 95       	lsr	r27
   2576e:	a7 95       	ror	r26
   25770:	97 95       	ror	r25
   25772:	87 95       	ror	r24
   25774:	ca 95       	dec	r28
   25776:	d1 f7       	brne	.-12     	; 0x2576c <SdVolume::fatGet(unsigned long, unsigned long*)+0xc2>
   25778:	c2 cf       	rjmp	.-124    	; 0x256fe <SdVolume::fatGet(unsigned long, unsigned long*)+0x54>
  } else {
    goto fail;
  }
  if (lba != cacheBlockNumber_) {
    if (!cacheRawBlock(lba, CACHE_FOR_READ)) goto fail;
   2577a:	40 e0       	ldi	r20, 0x00	; 0
   2577c:	bc 01       	movw	r22, r24
   2577e:	cd 01       	movw	r24, r26
   25780:	0f 94 86 2a 	call	0x2550c	; 0x2550c <SdVolume::cacheRawBlock(unsigned long, bool)>
   25784:	81 11       	cpse	r24, r1
   25786:	d0 cf       	rjmp	.-96     	; 0x25728 <SdVolume::fatGet(unsigned long, unsigned long*)+0x7e>
   25788:	a5 cf       	rjmp	.-182    	; 0x256d4 <SdVolume::fatGet(unsigned long, unsigned long*)+0x2a>
  }
  if (fatType_ == 16) {
    *value = cacheBuffer_.fat16[cluster & 0XFF];
  } else {
    *value = cacheBuffer_.fat32[cluster & 0X7F] & FAT32MASK;
   2578a:	b7 01       	movw	r22, r14
   2578c:	a6 01       	movw	r20, r12
   2578e:	4f 77       	andi	r20, 0x7F	; 127
   25790:	55 27       	eor	r21, r21
   25792:	66 27       	eor	r22, r22
   25794:	77 27       	eor	r23, r23
   25796:	44 0f       	add	r20, r20
   25798:	55 1f       	adc	r21, r21
   2579a:	44 0f       	add	r20, r20
   2579c:	55 1f       	adc	r21, r21
   2579e:	4a 5b       	subi	r20, 0xBA	; 186
   257a0:	51 4f       	sbci	r21, 0xF1	; 241
   257a2:	fa 01       	movw	r30, r20
   257a4:	80 81       	ld	r24, Z
   257a6:	91 81       	ldd	r25, Z+1	; 0x01
   257a8:	a2 81       	ldd	r26, Z+2	; 0x02
   257aa:	b3 81       	ldd	r27, Z+3	; 0x03
   257ac:	bf 70       	andi	r27, 0x0F	; 15
   257ae:	ce cf       	rjmp	.-100    	; 0x2574c <SdVolume::fatGet(unsigned long, unsigned long*)+0xa2>

000257b0 <SdVolume::chainSize(unsigned long, unsigned long*)>:
 fail:
  return false;
}
//------------------------------------------------------------------------------
// return the size in bytes of a cluster chain
bool SdVolume::chainSize(uint32_t cluster, uint32_t* size) {
   257b0:	4f 92       	push	r4
   257b2:	5f 92       	push	r5
   257b4:	6f 92       	push	r6
   257b6:	7f 92       	push	r7
   257b8:	af 92       	push	r10
   257ba:	bf 92       	push	r11
   257bc:	cf 92       	push	r12
   257be:	df 92       	push	r13
   257c0:	ef 92       	push	r14
   257c2:	ff 92       	push	r15
   257c4:	0f 93       	push	r16
   257c6:	1f 93       	push	r17
   257c8:	cf 93       	push	r28
   257ca:	df 93       	push	r29
   257cc:	00 d0       	rcall	.+0      	; 0x257ce <SdVolume::chainSize(unsigned long, unsigned long*)+0x1e>
   257ce:	1f 92       	push	r1
   257d0:	cd b7       	in	r28, 0x3d	; 61
   257d2:	de b7       	in	r29, 0x3e	; 62
   257d4:	8c 01       	movw	r16, r24
   257d6:	49 83       	std	Y+1, r20	; 0x01
   257d8:	5a 83       	std	Y+2, r21	; 0x02
   257da:	6b 83       	std	Y+3, r22	; 0x03
   257dc:	7c 83       	std	Y+4, r23	; 0x04
   257de:	59 01       	movw	r10, r18
  uint32_t s = 0;
   257e0:	c1 2c       	mov	r12, r1
   257e2:	d1 2c       	mov	r13, r1
   257e4:	76 01       	movw	r14, r12
  do {
    if (!fatGet(cluster, &cluster)) goto fail;
    s += 512UL << clusterSizeShift_;
   257e6:	41 2c       	mov	r4, r1
   257e8:	82 e0       	ldi	r24, 0x02	; 2
   257ea:	58 2e       	mov	r5, r24
   257ec:	61 2c       	mov	r6, r1
   257ee:	71 2c       	mov	r7, r1
//------------------------------------------------------------------------------
// return the size in bytes of a cluster chain
bool SdVolume::chainSize(uint32_t cluster, uint32_t* size) {
  uint32_t s = 0;
  do {
    if (!fatGet(cluster, &cluster)) goto fail;
   257f0:	49 81       	ldd	r20, Y+1	; 0x01
   257f2:	5a 81       	ldd	r21, Y+2	; 0x02
   257f4:	6b 81       	ldd	r22, Y+3	; 0x03
   257f6:	7c 81       	ldd	r23, Y+4	; 0x04
   257f8:	9e 01       	movw	r18, r28
   257fa:	2f 5f       	subi	r18, 0xFF	; 255
   257fc:	3f 4f       	sbci	r19, 0xFF	; 255
   257fe:	c8 01       	movw	r24, r16
   25800:	0f 94 55 2b 	call	0x256aa	; 0x256aa <SdVolume::fatGet(unsigned long, unsigned long*)>
   25804:	88 23       	and	r24, r24
   25806:	19 f1       	breq	.+70     	; 0x2584e <SdVolume::chainSize(unsigned long, unsigned long*)+0x9e>
    s += 512UL << clusterSizeShift_;
   25808:	f8 01       	movw	r30, r16
   2580a:	85 85       	ldd	r24, Z+13	; 0x0d
   2580c:	a3 01       	movw	r20, r6
   2580e:	92 01       	movw	r18, r4
   25810:	04 c0       	rjmp	.+8      	; 0x2581a <SdVolume::chainSize(unsigned long, unsigned long*)+0x6a>
   25812:	22 0f       	add	r18, r18
   25814:	33 1f       	adc	r19, r19
   25816:	44 1f       	adc	r20, r20
   25818:	55 1f       	adc	r21, r21
   2581a:	8a 95       	dec	r24
   2581c:	d2 f7       	brpl	.-12     	; 0x25812 <SdVolume::chainSize(unsigned long, unsigned long*)+0x62>
   2581e:	da 01       	movw	r26, r20
   25820:	c9 01       	movw	r24, r18
   25822:	c8 0e       	add	r12, r24
   25824:	d9 1e       	adc	r13, r25
   25826:	ea 1e       	adc	r14, r26
   25828:	fb 1e       	adc	r15, r27
  } while (!isEOC(cluster));
   2582a:	49 81       	ldd	r20, Y+1	; 0x01
   2582c:	5a 81       	ldd	r21, Y+2	; 0x02
   2582e:	6b 81       	ldd	r22, Y+3	; 0x03
   25830:	7c 81       	ldd	r23, Y+4	; 0x04
    return fatPut(cluster, 0x0FFFFFFF);
  }
  bool freeChain(uint32_t cluster);
  bool isEOC(uint32_t cluster) const {
    if (FAT12_SUPPORT && fatType_ == 12) return  cluster >= FAT12EOC_MIN;
    if (fatType_ == 16) return cluster >= FAT16EOC_MIN;
   25832:	87 89       	ldd	r24, Z+23	; 0x17
   25834:	80 31       	cpi	r24, 0x10	; 16
   25836:	f1 f4       	brne	.+60     	; 0x25874 <SdVolume::chainSize(unsigned long, unsigned long*)+0xc4>
   25838:	81 e0       	ldi	r24, 0x01	; 1
   2583a:	48 3f       	cpi	r20, 0xF8	; 248
   2583c:	5f 4f       	sbci	r21, 0xFF	; 255
   2583e:	61 05       	cpc	r22, r1
   25840:	71 05       	cpc	r23, r1
   25842:	b0 f2       	brcs	.-84     	; 0x257f0 <SdVolume::chainSize(unsigned long, unsigned long*)+0x40>
  *size = s;
   25844:	f5 01       	movw	r30, r10
   25846:	c0 82       	st	Z, r12
   25848:	d1 82       	std	Z+1, r13	; 0x01
   2584a:	e2 82       	std	Z+2, r14	; 0x02
   2584c:	f3 82       	std	Z+3, r15	; 0x03
  return true;

 fail:
  return false;
}
   2584e:	0f 90       	pop	r0
   25850:	0f 90       	pop	r0
   25852:	0f 90       	pop	r0
   25854:	0f 90       	pop	r0
   25856:	df 91       	pop	r29
   25858:	cf 91       	pop	r28
   2585a:	1f 91       	pop	r17
   2585c:	0f 91       	pop	r16
   2585e:	ff 90       	pop	r15
   25860:	ef 90       	pop	r14
   25862:	df 90       	pop	r13
   25864:	cf 90       	pop	r12
   25866:	bf 90       	pop	r11
   25868:	af 90       	pop	r10
   2586a:	7f 90       	pop	r7
   2586c:	6f 90       	pop	r6
   2586e:	5f 90       	pop	r5
   25870:	4f 90       	pop	r4
   25872:	08 95       	ret
    return  cluster >= FAT32EOC_MIN;
   25874:	81 e0       	ldi	r24, 0x01	; 1
   25876:	48 3f       	cpi	r20, 0xF8	; 248
   25878:	5f 4f       	sbci	r21, 0xFF	; 255
   2587a:	6f 4f       	sbci	r22, 0xFF	; 255
   2587c:	7f 40       	sbci	r23, 0x0F	; 15
   2587e:	08 f4       	brcc	.+2      	; 0x25882 <SdVolume::chainSize(unsigned long, unsigned long*)+0xd2>
   25880:	b7 cf       	rjmp	.-146    	; 0x257f0 <SdVolume::chainSize(unsigned long, unsigned long*)+0x40>
   25882:	e0 cf       	rjmp	.-64     	; 0x25844 <SdVolume::chainSize(unsigned long, unsigned long*)+0x94>

00025884 <SdBaseFile::openRoot(SdVolume*)>:
 * \return The value one, true, is returned for success and
 * the value zero, false, is returned for failure.
 * Reasons for failure include the file is already open, the FAT volume has
 * not been initialized or it a FAT12 volume.
 */
bool SdBaseFile::openRoot(SdVolume* vol) {
   25884:	0f 93       	push	r16
   25886:	1f 93       	push	r17
   25888:	cf 93       	push	r28
   2588a:	df 93       	push	r29
  // error if file is already open
  if (isOpen()) goto fail;
   2588c:	fc 01       	movw	r30, r24
   2588e:	23 81       	ldd	r18, Z+3	; 0x03
   25890:	22 23       	and	r18, r18
   25892:	31 f0       	breq	.+12     	; 0x258a0 <SdBaseFile::openRoot(SdVolume*)+0x1c>
  dirBlock_ = 0;
  dirIndex_ = 0;
  return true;

 fail:
  return false;
   25894:	80 e0       	ldi	r24, 0x00	; 0
}
   25896:	df 91       	pop	r29
   25898:	cf 91       	pop	r28
   2589a:	1f 91       	pop	r17
   2589c:	0f 91       	pop	r16
   2589e:	08 95       	ret
   258a0:	8b 01       	movw	r16, r22
   258a2:	ec 01       	movw	r28, r24
   258a4:	fb 01       	movw	r30, r22
   258a6:	87 89       	ldd	r24, Z+23	; 0x17
 */
bool SdBaseFile::openRoot(SdVolume* vol) {
  // error if file is already open
  if (isOpen()) goto fail;

  if (vol->fatType() == 16 || (FAT12_SUPPORT && vol->fatType() == 12)) {
   258a8:	80 31       	cpi	r24, 0x10	; 16
   258aa:	39 f5       	brne	.+78     	; 0x258fa <SdBaseFile::openRoot(SdVolume*)+0x76>
    type_ = FAT_FILE_TYPE_ROOT_FIXED;
   258ac:	82 e0       	ldi	r24, 0x02	; 2
   258ae:	8b 83       	std	Y+3, r24	; 0x03
    firstCluster_ = 0;
   258b0:	1d 8a       	std	Y+21, r1	; 0x15
   258b2:	1e 8a       	std	Y+22, r1	; 0x16
   258b4:	1f 8a       	std	Y+23, r1	; 0x17
   258b6:	18 8e       	std	Y+24, r1	; 0x18
    fileSize_ = 32 * vol->rootDirEntryCount();
   258b8:	80 8d       	ldd	r24, Z+24	; 0x18
   258ba:	91 8d       	ldd	r25, Z+25	; 0x19
   258bc:	b0 e0       	ldi	r27, 0x00	; 0
   258be:	a0 e0       	ldi	r26, 0x00	; 0
   258c0:	25 e0       	ldi	r18, 0x05	; 5
   258c2:	88 0f       	add	r24, r24
   258c4:	99 1f       	adc	r25, r25
   258c6:	aa 1f       	adc	r26, r26
   258c8:	bb 1f       	adc	r27, r27
   258ca:	2a 95       	dec	r18
   258cc:	d1 f7       	brne	.-12     	; 0x258c2 <SdBaseFile::openRoot(SdVolume*)+0x3e>
   258ce:	89 8b       	std	Y+17, r24	; 0x11
   258d0:	9a 8b       	std	Y+18, r25	; 0x12
   258d2:	ab 8b       	std	Y+19, r26	; 0x13
   258d4:	bc 8b       	std	Y+20, r27	; 0x14
    if (!vol->chainSize(firstCluster_, &fileSize_)) goto fail;
  } else {
    // volume is not initialized, invalid, or FAT12 without support
    return false;
  }
  vol_ = vol;
   258d6:	1a 8f       	std	Y+26, r17	; 0x1a
   258d8:	09 8f       	std	Y+25, r16	; 0x19
  // read only
  flags_ = O_READ;
   258da:	81 e0       	ldi	r24, 0x01	; 1
   258dc:	89 83       	std	Y+1, r24	; 0x01

  // set to start of file
  curCluster_ = 0;
   258de:	1c 82       	std	Y+4, r1	; 0x04
   258e0:	1d 82       	std	Y+5, r1	; 0x05
   258e2:	1e 82       	std	Y+6, r1	; 0x06
   258e4:	1f 82       	std	Y+7, r1	; 0x07
  curPosition_ = 0;
   258e6:	18 86       	std	Y+8, r1	; 0x08
   258e8:	19 86       	std	Y+9, r1	; 0x09
   258ea:	1a 86       	std	Y+10, r1	; 0x0a
   258ec:	1b 86       	std	Y+11, r1	; 0x0b

  // root has no directory entry
  dirBlock_ = 0;
   258ee:	1c 86       	std	Y+12, r1	; 0x0c
   258f0:	1d 86       	std	Y+13, r1	; 0x0d
   258f2:	1e 86       	std	Y+14, r1	; 0x0e
   258f4:	1f 86       	std	Y+15, r1	; 0x0f
  dirIndex_ = 0;
   258f6:	18 8a       	std	Y+16, r1	; 0x10
   258f8:	ce cf       	rjmp	.-100    	; 0x25896 <SdBaseFile::openRoot(SdVolume*)+0x12>

  if (vol->fatType() == 16 || (FAT12_SUPPORT && vol->fatType() == 12)) {
    type_ = FAT_FILE_TYPE_ROOT_FIXED;
    firstCluster_ = 0;
    fileSize_ = 32 * vol->rootDirEntryCount();
  } else if (vol->fatType() == 32) {
   258fa:	80 32       	cpi	r24, 0x20	; 32
   258fc:	59 f6       	brne	.-106    	; 0x25894 <SdBaseFile::openRoot(SdVolume*)+0x10>
    type_ = FAT_FILE_TYPE_ROOT32;
   258fe:	83 e0       	ldi	r24, 0x03	; 3
   25900:	8b 83       	std	Y+3, r24	; 0x03
  int32_t freeClusterCount();
  /** \return The number of entries in the root directory for FAT16 volumes. */
  uint32_t rootDirEntryCount() const {return rootDirEntryCount_;}
  /** \return The logical block number for the start of the root directory
       on FAT16 volumes or the first cluster number on FAT32 volumes. */
  uint32_t rootDirStart() const {return rootDirStart_;}
   25902:	42 8d       	ldd	r20, Z+26	; 0x1a
   25904:	53 8d       	ldd	r21, Z+27	; 0x1b
   25906:	64 8d       	ldd	r22, Z+28	; 0x1c
   25908:	75 8d       	ldd	r23, Z+29	; 0x1d
    firstCluster_ = vol->rootDirStart();
   2590a:	4d 8b       	std	Y+21, r20	; 0x15
   2590c:	5e 8b       	std	Y+22, r21	; 0x16
   2590e:	6f 8b       	std	Y+23, r22	; 0x17
   25910:	78 8f       	std	Y+24, r23	; 0x18
    if (!vol->chainSize(firstCluster_, &fileSize_)) goto fail;
   25912:	9e 01       	movw	r18, r28
   25914:	2f 5e       	subi	r18, 0xEF	; 239
   25916:	3f 4f       	sbci	r19, 0xFF	; 255
   25918:	c8 01       	movw	r24, r16
   2591a:	0f 94 d8 2b 	call	0x257b0	; 0x257b0 <SdVolume::chainSize(unsigned long, unsigned long*)>
   2591e:	81 11       	cpse	r24, r1
   25920:	da cf       	rjmp	.-76     	; 0x258d6 <SdBaseFile::openRoot(SdVolume*)+0x52>
   25922:	b8 cf       	rjmp	.-144    	; 0x25894 <SdBaseFile::openRoot(SdVolume*)+0x10>

00025924 <SdFile::gfComputeNextFileBlock()>:
        vol_->cache()->data[ terminateOfs < 512 ? terminateOfs : 512 ] = '\n';
    }
    return true;
}

bool SdFile::gfComputeNextFileBlock() {
   25924:	cf 92       	push	r12
   25926:	df 92       	push	r13
   25928:	ef 92       	push	r14
   2592a:	ff 92       	push	r15
   2592c:	1f 93       	push	r17
   2592e:	cf 93       	push	r28
   25930:	df 93       	push	r29
   25932:	ec 01       	movw	r28, r24
   25934:	eb 81       	ldd	r30, Y+3	; 0x03
    // error if not open or write only
    if (!isOpen() || !(flags_ & O_READ)) return false;
   25936:	e1 11       	cpse	r30, r1
   25938:	09 c0       	rjmp	.+18     	; 0x2594c <SdFile::gfComputeNextFileBlock()+0x28>
   2593a:	80 e0       	ldi	r24, 0x00	; 0
            }
        }
        gfBlock = vol_->clusterStartBlock(curCluster_) + blockOfCluster;
    }
    return true;
}
   2593c:	df 91       	pop	r29
   2593e:	cf 91       	pop	r28
   25940:	1f 91       	pop	r17
   25942:	ff 90       	pop	r15
   25944:	ef 90       	pop	r14
   25946:	df 90       	pop	r13
   25948:	cf 90       	pop	r12
   2594a:	08 95       	ret
    return true;
}

bool SdFile::gfComputeNextFileBlock() {
    // error if not open or write only
    if (!isOpen() || !(flags_ & O_READ)) return false;
   2594c:	89 81       	ldd	r24, Y+1	; 0x01
   2594e:	80 ff       	sbrs	r24, 0
   25950:	f4 cf       	rjmp	.-24     	; 0x2593a <SdFile::gfComputeNextFileBlock()+0x16>

    gfOffset = curPosition_ & 0X1FF;  // offset in block
   25952:	48 85       	ldd	r20, Y+8	; 0x08
   25954:	59 85       	ldd	r21, Y+9	; 0x09
   25956:	6a 85       	ldd	r22, Y+10	; 0x0a
   25958:	7b 85       	ldd	r23, Y+11	; 0x0b
   2595a:	9a 01       	movw	r18, r20
   2595c:	31 70       	andi	r19, 0x01	; 1
   2595e:	3a a3       	std	Y+34, r19	; 0x22
   25960:	29 a3       	std	Y+33, r18	; 0x21
   25962:	89 8d       	ldd	r24, Y+25	; 0x19
   25964:	9a 8d       	ldd	r25, Y+26	; 0x1a
   25966:	6a 01       	movw	r12, r20
   25968:	7b 01       	movw	r14, r22
   2596a:	f9 e0       	ldi	r31, 0x09	; 9
   2596c:	f6 94       	lsr	r15
   2596e:	e7 94       	ror	r14
   25970:	d7 94       	ror	r13
   25972:	c7 94       	ror	r12
   25974:	fa 95       	dec	r31
   25976:	d1 f7       	brne	.-12     	; 0x2596c <SdFile::gfComputeNextFileBlock()+0x48>
    if (type_ == FAT_FILE_TYPE_ROOT_FIXED) {
   25978:	e2 30       	cpi	r30, 0x02	; 2
   2597a:	79 f4       	brne	.+30     	; 0x2599a <SdFile::gfComputeNextFileBlock()+0x76>
        // SHR by 9 means skip the last byte and shift just 3 bytes by 1
        // -> should be 8 instructions... and not the horrible loop shifting 4 bytes at once
        // still need to get some work on this
        gfBlock = vol_->rootDirStart() + (curPosition_ >> 9);
   2597c:	fc 01       	movw	r30, r24
   2597e:	82 8d       	ldd	r24, Z+26	; 0x1a
   25980:	93 8d       	ldd	r25, Z+27	; 0x1b
   25982:	a4 8d       	ldd	r26, Z+28	; 0x1c
   25984:	b5 8d       	ldd	r27, Z+29	; 0x1d
   25986:	8c 0d       	add	r24, r12
   25988:	9d 1d       	adc	r25, r13
   2598a:	ae 1d       	adc	r26, r14
   2598c:	bf 1d       	adc	r27, r15
            } else {
                // get next cluster from FAT
                if (!vol_->fatGet(curCluster_, &curCluster_)) return false;
            }
        }
        gfBlock = vol_->clusterStartBlock(curCluster_) + blockOfCluster;
   2598e:	8d 8f       	std	Y+29, r24	; 0x1d
   25990:	9e 8f       	std	Y+30, r25	; 0x1e
   25992:	af 8f       	std	Y+31, r26	; 0x1f
   25994:	b8 a3       	std	Y+32, r27	; 0x20
    }
    return true;
   25996:	81 e0       	ldi	r24, 0x01	; 1
   25998:	d1 cf       	rjmp	.-94     	; 0x2593c <SdFile::gfComputeNextFileBlock()+0x18>
  uint16_t rootDirEntryCount_;  // number of entries in FAT16 root dir
  uint32_t rootDirStart_;       // root start block for FAT16, cluster for FAT32
  //----------------------------------------------------------------------------
  bool allocContiguous(uint32_t count, uint32_t* curCluster);
  uint8_t blockOfCluster(uint32_t position) const {
          return (position >> 9) & (blocksPerCluster_ - 1);}
   2599a:	fc 01       	movw	r30, r24
   2599c:	14 81       	ldd	r17, Z+4	; 0x04
   2599e:	11 50       	subi	r17, 0x01	; 1
   259a0:	1c 21       	and	r17, r12
        // -> should be 8 instructions... and not the horrible loop shifting 4 bytes at once
        // still need to get some work on this
        gfBlock = vol_->rootDirStart() + (curPosition_ >> 9);
    } else {
        uint8_t blockOfCluster = vol_->blockOfCluster(curPosition_);
        if (gfOffset == 0 && blockOfCluster == 0) {
   259a2:	23 2b       	or	r18, r19
   259a4:	71 f4       	brne	.+28     	; 0x259c2 <SdFile::gfComputeNextFileBlock()+0x9e>
   259a6:	11 11       	cpse	r17, r1
   259a8:	0c c0       	rjmp	.+24     	; 0x259c2 <SdFile::gfComputeNextFileBlock()+0x9e>
            // start of new cluster
            if (curPosition_ == 0) {
   259aa:	45 2b       	or	r20, r21
   259ac:	46 2b       	or	r20, r22
   259ae:	47 2b       	or	r20, r23
   259b0:	31 f5       	brne	.+76     	; 0x259fe <SdFile::gfComputeNextFileBlock()+0xda>
                // use first cluster in file
                curCluster_ = firstCluster_;
   259b2:	8d 89       	ldd	r24, Y+21	; 0x15
   259b4:	9e 89       	ldd	r25, Y+22	; 0x16
   259b6:	af 89       	ldd	r26, Y+23	; 0x17
   259b8:	b8 8d       	ldd	r27, Y+24	; 0x18
   259ba:	8c 83       	std	Y+4, r24	; 0x04
   259bc:	9d 83       	std	Y+5, r25	; 0x05
   259be:	ae 83       	std	Y+6, r26	; 0x06
   259c0:	bf 83       	std	Y+7, r27	; 0x07
            } else {
                // get next cluster from FAT
                if (!vol_->fatGet(curCluster_, &curCluster_)) return false;
            }
        }
        gfBlock = vol_->clusterStartBlock(curCluster_) + blockOfCluster;
   259c2:	e9 8d       	ldd	r30, Y+25	; 0x19
   259c4:	fa 8d       	ldd	r31, Y+26	; 0x1a
  uint32_t clusterStartBlock(uint32_t cluster) const {
           return dataStartBlock_ + ((cluster - 2) << clusterSizeShift_);}
   259c6:	8c 81       	ldd	r24, Y+4	; 0x04
   259c8:	9d 81       	ldd	r25, Y+5	; 0x05
   259ca:	ae 81       	ldd	r26, Y+6	; 0x06
   259cc:	bf 81       	ldd	r27, Y+7	; 0x07
   259ce:	02 97       	sbiw	r24, 0x02	; 2
   259d0:	a1 09       	sbc	r26, r1
   259d2:	b1 09       	sbc	r27, r1
   259d4:	25 85       	ldd	r18, Z+13	; 0x0d
   259d6:	04 c0       	rjmp	.+8      	; 0x259e0 <SdFile::gfComputeNextFileBlock()+0xbc>
   259d8:	88 0f       	add	r24, r24
   259da:	99 1f       	adc	r25, r25
   259dc:	aa 1f       	adc	r26, r26
   259de:	bb 1f       	adc	r27, r27
   259e0:	2a 95       	dec	r18
   259e2:	d2 f7       	brpl	.-12     	; 0x259d8 <SdFile::gfComputeNextFileBlock()+0xb4>
   259e4:	46 85       	ldd	r20, Z+14	; 0x0e
   259e6:	57 85       	ldd	r21, Z+15	; 0x0f
   259e8:	60 89       	ldd	r22, Z+16	; 0x10
   259ea:	71 89       	ldd	r23, Z+17	; 0x11
   259ec:	84 0f       	add	r24, r20
   259ee:	95 1f       	adc	r25, r21
   259f0:	a6 1f       	adc	r26, r22
   259f2:	b7 1f       	adc	r27, r23
   259f4:	81 0f       	add	r24, r17
   259f6:	91 1d       	adc	r25, r1
   259f8:	a1 1d       	adc	r26, r1
   259fa:	b1 1d       	adc	r27, r1
   259fc:	c8 cf       	rjmp	.-112    	; 0x2598e <SdFile::gfComputeNextFileBlock()+0x6a>
            if (curPosition_ == 0) {
                // use first cluster in file
                curCluster_ = firstCluster_;
            } else {
                // get next cluster from FAT
                if (!vol_->fatGet(curCluster_, &curCluster_)) return false;
   259fe:	4c 81       	ldd	r20, Y+4	; 0x04
   25a00:	5d 81       	ldd	r21, Y+5	; 0x05
   25a02:	6e 81       	ldd	r22, Y+6	; 0x06
   25a04:	7f 81       	ldd	r23, Y+7	; 0x07
   25a06:	9e 01       	movw	r18, r28
   25a08:	2c 5f       	subi	r18, 0xFC	; 252
   25a0a:	3f 4f       	sbci	r19, 0xFF	; 255
   25a0c:	0f 94 55 2b 	call	0x256aa	; 0x256aa <SdVolume::fatGet(unsigned long, unsigned long*)>
   25a10:	81 11       	cpse	r24, r1
   25a12:	d7 cf       	rjmp	.-82     	; 0x259c2 <SdFile::gfComputeNextFileBlock()+0x9e>
   25a14:	92 cf       	rjmp	.-220    	; 0x2593a <SdFile::gfComputeNextFileBlock()+0x16>

00025a16 <SdBaseFile::seekSet(unsigned long)>:
 * \param[in] pos The new position in bytes from the beginning of the file.
 *
 * \return The value one, true, is returned for success and
 * the value zero, false, is returned for failure.
 */
bool SdBaseFile::seekSet(uint32_t pos) {
   25a16:	8f 92       	push	r8
   25a18:	9f 92       	push	r9
   25a1a:	af 92       	push	r10
   25a1c:	bf 92       	push	r11
   25a1e:	cf 92       	push	r12
   25a20:	df 92       	push	r13
   25a22:	ef 92       	push	r14
   25a24:	ff 92       	push	r15
   25a26:	0f 93       	push	r16
   25a28:	1f 93       	push	r17
   25a2a:	cf 93       	push	r28
   25a2c:	df 93       	push	r29
   25a2e:	ec 01       	movw	r28, r24
   25a30:	8b 81       	ldd	r24, Y+3	; 0x03
  uint32_t nCur;
  uint32_t nNew;
  // error if file not open or seek past end of file
  if (!isOpen() || pos > fileSize_) goto fail;
   25a32:	81 11       	cpse	r24, r1
   25a34:	0e c0       	rjmp	.+28     	; 0x25a52 <SdBaseFile::seekSet(unsigned long)+0x3c>

 done:
  return true;

 fail:
  return false;
   25a36:	80 e0       	ldi	r24, 0x00	; 0
}
   25a38:	df 91       	pop	r29
   25a3a:	cf 91       	pop	r28
   25a3c:	1f 91       	pop	r17
   25a3e:	0f 91       	pop	r16
   25a40:	ff 90       	pop	r15
   25a42:	ef 90       	pop	r14
   25a44:	df 90       	pop	r13
   25a46:	cf 90       	pop	r12
   25a48:	bf 90       	pop	r11
   25a4a:	af 90       	pop	r10
   25a4c:	9f 90       	pop	r9
   25a4e:	8f 90       	pop	r8
   25a50:	08 95       	ret
 */
bool SdBaseFile::seekSet(uint32_t pos) {
  uint32_t nCur;
  uint32_t nNew;
  // error if file not open or seek past end of file
  if (!isOpen() || pos > fileSize_) goto fail;
   25a52:	09 89       	ldd	r16, Y+17	; 0x11
   25a54:	1a 89       	ldd	r17, Y+18	; 0x12
   25a56:	2b 89       	ldd	r18, Y+19	; 0x13
   25a58:	3c 89       	ldd	r19, Y+20	; 0x14
   25a5a:	04 17       	cp	r16, r20
   25a5c:	15 07       	cpc	r17, r21
   25a5e:	26 07       	cpc	r18, r22
   25a60:	37 07       	cpc	r19, r23
   25a62:	48 f3       	brcs	.-46     	; 0x25a36 <SdBaseFile::seekSet(unsigned long)+0x20>
   25a64:	4a 01       	movw	r8, r20
   25a66:	5b 01       	movw	r10, r22

  if (type_ == FAT_FILE_TYPE_ROOT_FIXED) {
   25a68:	82 30       	cpi	r24, 0x02	; 2
   25a6a:	31 f4       	brne	.+12     	; 0x25a78 <SdBaseFile::seekSet(unsigned long)+0x62>
    curPosition_ = pos;
   25a6c:	88 86       	std	Y+8, r8	; 0x08
   25a6e:	99 86       	std	Y+9, r9	; 0x09
   25a70:	aa 86       	std	Y+10, r10	; 0x0a
   25a72:	bb 86       	std	Y+11, r11	; 0x0b
    if (!vol_->fatGet(curCluster_, &curCluster_)) goto fail;
  }
  curPosition_ = pos;

 done:
  return true;
   25a74:	81 e0       	ldi	r24, 0x01	; 1
   25a76:	e0 cf       	rjmp	.-64     	; 0x25a38 <SdBaseFile::seekSet(unsigned long)+0x22>

  if (type_ == FAT_FILE_TYPE_ROOT_FIXED) {
    curPosition_ = pos;
    goto done;
  }
  if (pos == 0) {
   25a78:	81 14       	cp	r8, r1
   25a7a:	91 04       	cpc	r9, r1
   25a7c:	a1 04       	cpc	r10, r1
   25a7e:	b1 04       	cpc	r11, r1
   25a80:	49 f4       	brne	.+18     	; 0x25a94 <SdBaseFile::seekSet(unsigned long)+0x7e>
    // set position to start of file
    curCluster_ = 0;
   25a82:	1c 82       	std	Y+4, r1	; 0x04
   25a84:	1d 82       	std	Y+5, r1	; 0x05
   25a86:	1e 82       	std	Y+6, r1	; 0x06
   25a88:	1f 82       	std	Y+7, r1	; 0x07
    curPosition_ = 0;
   25a8a:	18 86       	std	Y+8, r1	; 0x08
   25a8c:	19 86       	std	Y+9, r1	; 0x09
   25a8e:	1a 86       	std	Y+10, r1	; 0x0a
   25a90:	1b 86       	std	Y+11, r1	; 0x0b
   25a92:	f0 cf       	rjmp	.-32     	; 0x25a74 <SdBaseFile::seekSet(unsigned long)+0x5e>
    goto done;
  }
  // calculate cluster index for cur and new position
  nCur = (curPosition_ - 1) >> (vol_->clusterSizeShift_ + 9);
   25a94:	08 85       	ldd	r16, Y+8	; 0x08
   25a96:	19 85       	ldd	r17, Y+9	; 0x09
   25a98:	2a 85       	ldd	r18, Y+10	; 0x0a
   25a9a:	3b 85       	ldd	r19, Y+11	; 0x0b
   25a9c:	e9 8d       	ldd	r30, Y+25	; 0x19
   25a9e:	fa 8d       	ldd	r31, Y+26	; 0x1a
   25aa0:	85 85       	ldd	r24, Z+13	; 0x0d
   25aa2:	90 e0       	ldi	r25, 0x00	; 0
   25aa4:	09 96       	adiw	r24, 0x09	; 9
   25aa6:	b9 01       	movw	r22, r18
   25aa8:	a8 01       	movw	r20, r16
   25aaa:	41 50       	subi	r20, 0x01	; 1
   25aac:	51 09       	sbc	r21, r1
   25aae:	61 09       	sbc	r22, r1
   25ab0:	71 09       	sbc	r23, r1
   25ab2:	08 2e       	mov	r0, r24
   25ab4:	04 c0       	rjmp	.+8      	; 0x25abe <SdBaseFile::seekSet(unsigned long)+0xa8>
   25ab6:	76 95       	lsr	r23
   25ab8:	67 95       	ror	r22
   25aba:	57 95       	ror	r21
   25abc:	47 95       	ror	r20
   25abe:	0a 94       	dec	r0
   25ac0:	d2 f7       	brpl	.-12     	; 0x25ab6 <SdBaseFile::seekSet(unsigned long)+0xa0>
  nNew = (pos - 1) >> (vol_->clusterSizeShift_ + 9);
   25ac2:	75 01       	movw	r14, r10
   25ac4:	64 01       	movw	r12, r8
   25ac6:	e1 e0       	ldi	r30, 0x01	; 1
   25ac8:	ce 1a       	sub	r12, r30
   25aca:	d1 08       	sbc	r13, r1
   25acc:	e1 08       	sbc	r14, r1
   25ace:	f1 08       	sbc	r15, r1
   25ad0:	04 c0       	rjmp	.+8      	; 0x25ada <SdBaseFile::seekSet(unsigned long)+0xc4>
   25ad2:	f6 94       	lsr	r15
   25ad4:	e7 94       	ror	r14
   25ad6:	d7 94       	ror	r13
   25ad8:	c7 94       	ror	r12
   25ada:	8a 95       	dec	r24
   25adc:	d2 f7       	brpl	.-12     	; 0x25ad2 <SdBaseFile::seekSet(unsigned long)+0xbc>

  if (nNew < nCur || curPosition_ == 0) {
   25ade:	c4 16       	cp	r12, r20
   25ae0:	d5 06       	cpc	r13, r21
   25ae2:	e6 06       	cpc	r14, r22
   25ae4:	f7 06       	cpc	r15, r23
   25ae6:	20 f0       	brcs	.+8      	; 0x25af0 <SdBaseFile::seekSet(unsigned long)+0xda>
   25ae8:	01 2b       	or	r16, r17
   25aea:	02 2b       	or	r16, r18
   25aec:	03 2b       	or	r16, r19
   25aee:	11 f5       	brne	.+68     	; 0x25b34 <SdBaseFile::seekSet(unsigned long)+0x11e>
    // must follow chain from first cluster
    curCluster_ = firstCluster_;
   25af0:	8d 89       	ldd	r24, Y+21	; 0x15
   25af2:	9e 89       	ldd	r25, Y+22	; 0x16
   25af4:	af 89       	ldd	r26, Y+23	; 0x17
   25af6:	b8 8d       	ldd	r27, Y+24	; 0x18
   25af8:	8c 83       	std	Y+4, r24	; 0x04
   25afa:	9d 83       	std	Y+5, r25	; 0x05
   25afc:	ae 83       	std	Y+6, r26	; 0x06
   25afe:	bf 83       	std	Y+7, r27	; 0x07
  } else {
    // advance from curPosition
    nNew -= nCur;
  }
  while (nNew--) {
    if (!vol_->fatGet(curCluster_, &curCluster_)) goto fail;
   25b00:	8e 01       	movw	r16, r28
   25b02:	0c 5f       	subi	r16, 0xFC	; 252
   25b04:	1f 4f       	sbci	r17, 0xFF	; 255
    curCluster_ = firstCluster_;
  } else {
    // advance from curPosition
    nNew -= nCur;
  }
  while (nNew--) {
   25b06:	c1 14       	cp	r12, r1
   25b08:	d1 04       	cpc	r13, r1
   25b0a:	e1 04       	cpc	r14, r1
   25b0c:	f1 04       	cpc	r15, r1
   25b0e:	09 f4       	brne	.+2      	; 0x25b12 <SdBaseFile::seekSet(unsigned long)+0xfc>
   25b10:	ad cf       	rjmp	.-166    	; 0x25a6c <SdBaseFile::seekSet(unsigned long)+0x56>
    if (!vol_->fatGet(curCluster_, &curCluster_)) goto fail;
   25b12:	4c 81       	ldd	r20, Y+4	; 0x04
   25b14:	5d 81       	ldd	r21, Y+5	; 0x05
   25b16:	6e 81       	ldd	r22, Y+6	; 0x06
   25b18:	7f 81       	ldd	r23, Y+7	; 0x07
   25b1a:	98 01       	movw	r18, r16
   25b1c:	89 8d       	ldd	r24, Y+25	; 0x19
   25b1e:	9a 8d       	ldd	r25, Y+26	; 0x1a
   25b20:	0f 94 55 2b 	call	0x256aa	; 0x256aa <SdVolume::fatGet(unsigned long, unsigned long*)>
   25b24:	91 e0       	ldi	r25, 0x01	; 1
   25b26:	c9 1a       	sub	r12, r25
   25b28:	d1 08       	sbc	r13, r1
   25b2a:	e1 08       	sbc	r14, r1
   25b2c:	f1 08       	sbc	r15, r1
   25b2e:	81 11       	cpse	r24, r1
   25b30:	ea cf       	rjmp	.-44     	; 0x25b06 <SdBaseFile::seekSet(unsigned long)+0xf0>
   25b32:	81 cf       	rjmp	.-254    	; 0x25a36 <SdBaseFile::seekSet(unsigned long)+0x20>
  if (nNew < nCur || curPosition_ == 0) {
    // must follow chain from first cluster
    curCluster_ = firstCluster_;
  } else {
    // advance from curPosition
    nNew -= nCur;
   25b34:	c4 1a       	sub	r12, r20
   25b36:	d5 0a       	sbc	r13, r21
   25b38:	e6 0a       	sbc	r14, r22
   25b3a:	f7 0a       	sbc	r15, r23
   25b3c:	e1 cf       	rjmp	.-62     	; 0x25b00 <SdBaseFile::seekSet(unsigned long)+0xea>

00025b3e <SdBaseFile::addCluster()>:
SdBaseFile* SdBaseFile::cwd_ = 0;
// callback function for date/time
void (*SdBaseFile::dateTime_)(uint16_t* date, uint16_t* time) = 0;
//------------------------------------------------------------------------------
// add a cluster to a file
bool SdBaseFile::addCluster() {
   25b3e:	3f 92       	push	r3
   25b40:	4f 92       	push	r4
   25b42:	5f 92       	push	r5
   25b44:	6f 92       	push	r6
   25b46:	7f 92       	push	r7
   25b48:	8f 92       	push	r8
   25b4a:	9f 92       	push	r9
   25b4c:	af 92       	push	r10
   25b4e:	bf 92       	push	r11
   25b50:	cf 92       	push	r12
   25b52:	df 92       	push	r13
   25b54:	ef 92       	push	r14
   25b56:	ff 92       	push	r15
   25b58:	0f 93       	push	r16
   25b5a:	1f 93       	push	r17
   25b5c:	cf 93       	push	r28
   25b5e:	df 93       	push	r29
   25b60:	cd b7       	in	r28, 0x3d	; 61
   25b62:	de b7       	in	r29, 0x3e	; 62
   25b64:	2c 97       	sbiw	r28, 0x0c	; 12
   25b66:	0f b6       	in	r0, 0x3f	; 63
   25b68:	f8 94       	cli
   25b6a:	de bf       	out	0x3e, r29	; 62
   25b6c:	0f be       	out	0x3f, r0	; 63
   25b6e:	cd bf       	out	0x3d, r28	; 61
   25b70:	5c 01       	movw	r10, r24
  if (!vol_->allocContiguous(1, &curCluster_)) goto fail;
   25b72:	dc 01       	movw	r26, r24
   25b74:	59 96       	adiw	r26, 0x19	; 25
   25b76:	8d 90       	ld	r8, X+
   25b78:	9c 90       	ld	r9, X
  // start of group
  uint32_t bgnCluster;
  // end of group
  uint32_t endCluster;
  // last cluster of FAT
  uint32_t fatEnd = clusterCount_ + 1;
   25b7a:	f4 01       	movw	r30, r8
   25b7c:	81 85       	ldd	r24, Z+9	; 0x09
   25b7e:	92 85       	ldd	r25, Z+10	; 0x0a
   25b80:	a3 85       	ldd	r26, Z+11	; 0x0b
   25b82:	b4 85       	ldd	r27, Z+12	; 0x0c
   25b84:	9c 01       	movw	r18, r24
   25b86:	ad 01       	movw	r20, r26
   25b88:	2f 5f       	subi	r18, 0xFF	; 255
   25b8a:	3f 4f       	sbci	r19, 0xFF	; 255
   25b8c:	4f 4f       	sbci	r20, 0xFF	; 255
   25b8e:	5f 4f       	sbci	r21, 0xFF	; 255
   25b90:	29 87       	std	Y+9, r18	; 0x09
   25b92:	3a 87       	std	Y+10, r19	; 0x0a
   25b94:	4b 87       	std	Y+11, r20	; 0x0b
   25b96:	5c 87       	std	Y+12, r21	; 0x0c

  // flag to save place to start next search
  bool setStart;

  // set search start cluster
  if (*curCluster) {
   25b98:	d5 01       	movw	r26, r10
   25b9a:	14 96       	adiw	r26, 0x04	; 4
   25b9c:	4d 90       	ld	r4, X+
   25b9e:	5d 90       	ld	r5, X+
   25ba0:	6d 90       	ld	r6, X+
   25ba2:	7c 90       	ld	r7, X
   25ba4:	17 97       	sbiw	r26, 0x07	; 7
   25ba6:	41 14       	cp	r4, r1
   25ba8:	51 04       	cpc	r5, r1
   25baa:	61 04       	cpc	r6, r1
   25bac:	71 04       	cpc	r7, r1
   25bae:	09 f4       	brne	.+2      	; 0x25bb2 <SdBaseFile::addCluster()+0x74>
   25bb0:	59 c0       	rjmp	.+178    	; 0x25c64 <SdBaseFile::addCluster()+0x126>
    // try to make file contiguous
    bgnCluster = *curCluster + 1;
   25bb2:	bf ef       	ldi	r27, 0xFF	; 255
   25bb4:	4b 1a       	sub	r4, r27
   25bb6:	5b 0a       	sbc	r5, r27
   25bb8:	6b 0a       	sbc	r6, r27
   25bba:	7b 0a       	sbc	r7, r27

    // don't save new start location
    setStart = false;
   25bbc:	31 2c       	mov	r3, r1

    // save next search start if one cluster
    setStart = count == 1;
  }
  // end of group
  endCluster = bgnCluster;
   25bbe:	73 01       	movw	r14, r6
   25bc0:	62 01       	movw	r12, r4

  // search the FAT for free clusters
  for (uint32_t n = 0;; n++, endCluster++) {
   25bc2:	1d 82       	std	Y+5, r1	; 0x05
   25bc4:	1e 82       	std	Y+6, r1	; 0x06
   25bc6:	1f 82       	std	Y+7, r1	; 0x07
   25bc8:	18 86       	std	Y+8, r1	; 0x08
    // can't find space checked all clusters
    if (n >= clusterCount_) goto fail;
   25bca:	f4 01       	movw	r30, r8
   25bcc:	81 85       	ldd	r24, Z+9	; 0x09
   25bce:	92 85       	ldd	r25, Z+10	; 0x0a
   25bd0:	a3 85       	ldd	r26, Z+11	; 0x0b
   25bd2:	b4 85       	ldd	r27, Z+12	; 0x0c
   25bd4:	2d 81       	ldd	r18, Y+5	; 0x05
   25bd6:	3e 81       	ldd	r19, Y+6	; 0x06
   25bd8:	4f 81       	ldd	r20, Y+7	; 0x07
   25bda:	58 85       	ldd	r21, Y+8	; 0x08
   25bdc:	28 17       	cp	r18, r24
   25bde:	39 07       	cpc	r19, r25
   25be0:	4a 07       	cpc	r20, r26
   25be2:	5b 07       	cpc	r21, r27
   25be4:	08 f0       	brcs	.+2      	; 0x25be8 <SdBaseFile::addCluster()+0xaa>
   25be6:	56 c0       	rjmp	.+172    	; 0x25c94 <SdBaseFile::addCluster()+0x156>

    // past end - start from beginning of FAT
    if (endCluster > fatEnd) {
   25be8:	89 85       	ldd	r24, Y+9	; 0x09
   25bea:	9a 85       	ldd	r25, Y+10	; 0x0a
   25bec:	ab 85       	ldd	r26, Y+11	; 0x0b
   25bee:	bc 85       	ldd	r27, Y+12	; 0x0c
   25bf0:	8c 15       	cp	r24, r12
   25bf2:	9d 05       	cpc	r25, r13
   25bf4:	ae 05       	cpc	r26, r14
   25bf6:	bf 05       	cpc	r27, r15
   25bf8:	50 f4       	brcc	.+20     	; 0x25c0e <SdBaseFile::addCluster()+0xd0>
      bgnCluster = endCluster = 2;
   25bfa:	82 e0       	ldi	r24, 0x02	; 2
   25bfc:	c8 2e       	mov	r12, r24
   25bfe:	d1 2c       	mov	r13, r1
   25c00:	e1 2c       	mov	r14, r1
   25c02:	f1 2c       	mov	r15, r1
   25c04:	92 e0       	ldi	r25, 0x02	; 2
   25c06:	49 2e       	mov	r4, r25
   25c08:	51 2c       	mov	r5, r1
   25c0a:	61 2c       	mov	r6, r1
   25c0c:	71 2c       	mov	r7, r1
    }
    uint32_t f;
    if (!fatGet(endCluster, &f)) goto fail;
   25c0e:	9e 01       	movw	r18, r28
   25c10:	2f 5f       	subi	r18, 0xFF	; 255
   25c12:	3f 4f       	sbci	r19, 0xFF	; 255
   25c14:	b7 01       	movw	r22, r14
   25c16:	a6 01       	movw	r20, r12
   25c18:	c4 01       	movw	r24, r8
   25c1a:	0f 94 55 2b 	call	0x256aa	; 0x256aa <SdVolume::fatGet(unsigned long, unsigned long*)>
   25c1e:	88 23       	and	r24, r24
   25c20:	c9 f1       	breq	.+114    	; 0x25c94 <SdBaseFile::addCluster()+0x156>

    if (f != 0) {
   25c22:	89 81       	ldd	r24, Y+1	; 0x01
   25c24:	9a 81       	ldd	r25, Y+2	; 0x02
   25c26:	ab 81       	ldd	r26, Y+3	; 0x03
   25c28:	bc 81       	ldd	r27, Y+4	; 0x04
   25c2a:	89 2b       	or	r24, r25
   25c2c:	8a 2b       	or	r24, r26
   25c2e:	8b 2b       	or	r24, r27
   25c30:	01 f1       	breq	.+64     	; 0x25c72 <SdBaseFile::addCluster()+0x134>
      // cluster in use try next cluster as bgnCluster
      bgnCluster = endCluster + 1;
   25c32:	26 01       	movw	r4, r12
   25c34:	37 01       	movw	r6, r14
   25c36:	9f ef       	ldi	r25, 0xFF	; 255
   25c38:	49 1a       	sub	r4, r25
   25c3a:	59 0a       	sbc	r5, r25
   25c3c:	69 0a       	sbc	r6, r25
   25c3e:	79 0a       	sbc	r7, r25
  }
  // end of group
  endCluster = bgnCluster;

  // search the FAT for free clusters
  for (uint32_t n = 0;; n++, endCluster++) {
   25c40:	2d 81       	ldd	r18, Y+5	; 0x05
   25c42:	3e 81       	ldd	r19, Y+6	; 0x06
   25c44:	4f 81       	ldd	r20, Y+7	; 0x07
   25c46:	58 85       	ldd	r21, Y+8	; 0x08
   25c48:	2f 5f       	subi	r18, 0xFF	; 255
   25c4a:	3f 4f       	sbci	r19, 0xFF	; 255
   25c4c:	4f 4f       	sbci	r20, 0xFF	; 255
   25c4e:	5f 4f       	sbci	r21, 0xFF	; 255
   25c50:	2d 83       	std	Y+5, r18	; 0x05
   25c52:	3e 83       	std	Y+6, r19	; 0x06
   25c54:	4f 83       	std	Y+7, r20	; 0x07
   25c56:	58 87       	std	Y+8, r21	; 0x08
   25c58:	3f ef       	ldi	r19, 0xFF	; 255
   25c5a:	c3 1a       	sub	r12, r19
   25c5c:	d3 0a       	sbc	r13, r19
   25c5e:	e3 0a       	sbc	r14, r19
   25c60:	f3 0a       	sbc	r15, r19
   25c62:	b3 cf       	rjmp	.-154    	; 0x25bca <SdBaseFile::addCluster()+0x8c>

    // don't save new start location
    setStart = false;
  } else {
    // start at likely place for free cluster
    bgnCluster = allocSearchStart_;
   25c64:	40 80       	ld	r4, Z
   25c66:	51 80       	ldd	r5, Z+1	; 0x01
   25c68:	62 80       	ldd	r6, Z+2	; 0x02
   25c6a:	73 80       	ldd	r7, Z+3	; 0x03

    // save next search start if one cluster
    setStart = count == 1;
   25c6c:	33 24       	eor	r3, r3
   25c6e:	33 94       	inc	r3
   25c70:	a6 cf       	rjmp	.-180    	; 0x25bbe <SdBaseFile::addCluster()+0x80>
    if (!fatGet(endCluster, &f)) goto fail;

    if (f != 0) {
      // cluster in use try next cluster as bgnCluster
      bgnCluster = endCluster + 1;
    } else if ((endCluster - bgnCluster + 1) == count) {
   25c72:	c4 14       	cp	r12, r4
   25c74:	d5 04       	cpc	r13, r5
   25c76:	e6 04       	cpc	r14, r6
   25c78:	f7 04       	cpc	r15, r7
   25c7a:	11 f7       	brne	.-60     	; 0x25c40 <SdBaseFile::addCluster()+0x102>
  void cacheSetDirty() {cacheDirty_ |= CACHE_FOR_WRITE;}
  bool chainSize(uint32_t beginCluster, uint32_t* size);
  bool fatGet(uint32_t cluster, uint32_t* value);
  bool fatPut(uint32_t cluster, uint32_t value);
  bool fatPutEOC(uint32_t cluster) {
    return fatPut(cluster, 0x0FFFFFFF);
   25c7c:	0f ef       	ldi	r16, 0xFF	; 255
   25c7e:	1f ef       	ldi	r17, 0xFF	; 255
   25c80:	2f ef       	ldi	r18, 0xFF	; 255
   25c82:	3f e0       	ldi	r19, 0x0F	; 15
   25c84:	b7 01       	movw	r22, r14
   25c86:	a6 01       	movw	r20, r12
   25c88:	c4 01       	movw	r24, r8
   25c8a:	0f 94 c3 2a 	call	0x25586	; 0x25586 <SdVolume::fatPut(unsigned long, unsigned long)>
   25c8e:	78 2e       	mov	r7, r24
      // done - found space
      break;
    }
  }
  // mark end of chain
  if (!fatPutEOC(endCluster)) goto fail;
   25c90:	81 11       	cpse	r24, r1
   25c92:	1a c0       	rjmp	.+52     	; 0x25cc8 <SdBaseFile::addCluster()+0x18a>
    flags_ |= F_FILE_DIR_DIRTY;
  }
  return true;

 fail:
  return false;
   25c94:	71 2c       	mov	r7, r1
}
   25c96:	87 2d       	mov	r24, r7
   25c98:	2c 96       	adiw	r28, 0x0c	; 12
   25c9a:	0f b6       	in	r0, 0x3f	; 63
   25c9c:	f8 94       	cli
   25c9e:	de bf       	out	0x3e, r29	; 62
   25ca0:	0f be       	out	0x3f, r0	; 63
   25ca2:	cd bf       	out	0x3d, r28	; 61
   25ca4:	df 91       	pop	r29
   25ca6:	cf 91       	pop	r28
   25ca8:	1f 91       	pop	r17
   25caa:	0f 91       	pop	r16
   25cac:	ff 90       	pop	r15
   25cae:	ef 90       	pop	r14
   25cb0:	df 90       	pop	r13
   25cb2:	cf 90       	pop	r12
   25cb4:	bf 90       	pop	r11
   25cb6:	af 90       	pop	r10
   25cb8:	9f 90       	pop	r9
   25cba:	8f 90       	pop	r8
   25cbc:	7f 90       	pop	r7
   25cbe:	6f 90       	pop	r6
   25cc0:	5f 90       	pop	r5
   25cc2:	4f 90       	pop	r4
   25cc4:	3f 90       	pop	r3
   25cc6:	08 95       	ret
  // link clusters
  while (endCluster > bgnCluster) {
    if (!fatPut(endCluster - 1, endCluster)) goto fail;
    endCluster--;
  }
  if (*curCluster != 0) {
   25cc8:	f5 01       	movw	r30, r10
   25cca:	44 81       	ldd	r20, Z+4	; 0x04
   25ccc:	55 81       	ldd	r21, Z+5	; 0x05
   25cce:	66 81       	ldd	r22, Z+6	; 0x06
   25cd0:	77 81       	ldd	r23, Z+7	; 0x07
   25cd2:	41 15       	cp	r20, r1
   25cd4:	51 05       	cpc	r21, r1
   25cd6:	61 05       	cpc	r22, r1
   25cd8:	71 05       	cpc	r23, r1
   25cda:	39 f0       	breq	.+14     	; 0x25cea <SdBaseFile::addCluster()+0x1ac>
    // connect chains
    if (!fatPut(*curCluster, bgnCluster)) goto fail;
   25cdc:	97 01       	movw	r18, r14
   25cde:	86 01       	movw	r16, r12
   25ce0:	c4 01       	movw	r24, r8
   25ce2:	0f 94 c3 2a 	call	0x25586	; 0x25586 <SdVolume::fatPut(unsigned long, unsigned long)>
   25ce6:	88 23       	and	r24, r24
   25ce8:	a9 f2       	breq	.-86     	; 0x25c94 <SdBaseFile::addCluster()+0x156>
  }
  // return first cluster number to caller
  *curCluster = bgnCluster;
   25cea:	d5 01       	movw	r26, r10
   25cec:	14 96       	adiw	r26, 0x04	; 4
   25cee:	cd 92       	st	X+, r12
   25cf0:	dd 92       	st	X+, r13
   25cf2:	ed 92       	st	X+, r14
   25cf4:	fc 92       	st	X, r15
   25cf6:	17 97       	sbiw	r26, 0x07	; 7

  // remember possible next free cluster
  if (setStart) allocSearchStart_ = bgnCluster + 1;
   25cf8:	33 20       	and	r3, r3
   25cfa:	51 f0       	breq	.+20     	; 0x25d10 <SdBaseFile::addCluster()+0x1d2>
   25cfc:	d7 01       	movw	r26, r14
   25cfe:	c6 01       	movw	r24, r12
   25d00:	01 96       	adiw	r24, 0x01	; 1
   25d02:	a1 1d       	adc	r26, r1
   25d04:	b1 1d       	adc	r27, r1
   25d06:	f4 01       	movw	r30, r8
   25d08:	80 83       	st	Z, r24
   25d0a:	91 83       	std	Z+1, r25	; 0x01
   25d0c:	a2 83       	std	Z+2, r26	; 0x02
   25d0e:	b3 83       	std	Z+3, r27	; 0x03
// add a cluster to a file
bool SdBaseFile::addCluster() {
  if (!vol_->allocContiguous(1, &curCluster_)) goto fail;

  // if first cluster of file link to directory entry
  if (firstCluster_ == 0) {
   25d10:	f5 01       	movw	r30, r10
   25d12:	85 89       	ldd	r24, Z+21	; 0x15
   25d14:	96 89       	ldd	r25, Z+22	; 0x16
   25d16:	a7 89       	ldd	r26, Z+23	; 0x17
   25d18:	b0 8d       	ldd	r27, Z+24	; 0x18
   25d1a:	89 2b       	or	r24, r25
   25d1c:	8a 2b       	or	r24, r26
   25d1e:	8b 2b       	or	r24, r27
   25d20:	09 f0       	breq	.+2      	; 0x25d24 <SdBaseFile::addCluster()+0x1e6>
   25d22:	b9 cf       	rjmp	.-142    	; 0x25c96 <SdBaseFile::addCluster()+0x158>
    firstCluster_ = curCluster_;
   25d24:	c5 8a       	std	Z+21, r12	; 0x15
   25d26:	d6 8a       	std	Z+22, r13	; 0x16
   25d28:	e7 8a       	std	Z+23, r14	; 0x17
   25d2a:	f0 8e       	std	Z+24, r15	; 0x18
    flags_ |= F_FILE_DIR_DIRTY;
   25d2c:	81 81       	ldd	r24, Z+1	; 0x01
   25d2e:	80 68       	ori	r24, 0x80	; 128
   25d30:	81 83       	std	Z+1, r24	; 0x01
   25d32:	b1 cf       	rjmp	.-158    	; 0x25c96 <SdBaseFile::addCluster()+0x158>

00025d34 <SdBaseFile::cacheDirEntry(unsigned char)>:
  return false;
}
//------------------------------------------------------------------------------
// cache a file's directory entry
// return pointer to cached entry or null for failure
dir_t* SdBaseFile::cacheDirEntry(uint8_t action) {
   25d34:	cf 93       	push	r28
   25d36:	df 93       	push	r29
   25d38:	ec 01       	movw	r28, r24
  if (!vol_->cacheRawBlock(dirBlock_, action)) goto fail;
   25d3a:	46 2f       	mov	r20, r22
   25d3c:	41 70       	andi	r20, 0x01	; 1
   25d3e:	6c 85       	ldd	r22, Y+12	; 0x0c
   25d40:	7d 85       	ldd	r23, Y+13	; 0x0d
   25d42:	8e 85       	ldd	r24, Y+14	; 0x0e
   25d44:	9f 85       	ldd	r25, Y+15	; 0x0f
   25d46:	0f 94 86 2a 	call	0x2550c	; 0x2550c <SdVolume::cacheRawBlock(unsigned long, bool)>
   25d4a:	88 23       	and	r24, r24
   25d4c:	51 f0       	breq	.+20     	; 0x25d62 <SdBaseFile::cacheDirEntry(unsigned char)+0x2e>
  return vol_->cache()->dir + dirIndex_;
   25d4e:	88 89       	ldd	r24, Y+16	; 0x10
   25d50:	20 e2       	ldi	r18, 0x20	; 32
   25d52:	82 9f       	mul	r24, r18
   25d54:	c0 01       	movw	r24, r0
   25d56:	11 24       	eor	r1, r1
   25d58:	8a 5b       	subi	r24, 0xBA	; 186
   25d5a:	91 4f       	sbci	r25, 0xF1	; 241

 fail:
  return 0;
}
   25d5c:	df 91       	pop	r29
   25d5e:	cf 91       	pop	r28
   25d60:	08 95       	ret
dir_t* SdBaseFile::cacheDirEntry(uint8_t action) {
  if (!vol_->cacheRawBlock(dirBlock_, action)) goto fail;
  return vol_->cache()->dir + dirIndex_;

 fail:
  return 0;
   25d62:	90 e0       	ldi	r25, 0x00	; 0
   25d64:	80 e0       	ldi	r24, 0x00	; 0
   25d66:	fa cf       	rjmp	.-12     	; 0x25d5c <SdBaseFile::cacheDirEntry(unsigned char)+0x28>

00025d68 <SdBaseFile::sync()>:
 * \return The value one, true, is returned for success and
 * the value zero, false, is returned for failure.
 * Reasons for failure include a call to sync() before a file has been
 * opened or an I/O error.
 */
bool SdBaseFile::sync() {
   25d68:	cf 93       	push	r28
   25d6a:	df 93       	push	r29
   25d6c:	ec 01       	movw	r28, r24
  // only allow open files and directories
  if (!isOpen()) goto fail;
   25d6e:	8b 81       	ldd	r24, Y+3	; 0x03
   25d70:	88 23       	and	r24, r24
   25d72:	49 f1       	breq	.+82     	; 0x25dc6 <SdBaseFile::sync()+0x5e>

  if (flags_ & F_FILE_DIR_DIRTY) {
   25d74:	89 81       	ldd	r24, Y+1	; 0x01
   25d76:	87 ff       	sbrs	r24, 7
   25d78:	22 c0       	rjmp	.+68     	; 0x25dbe <SdBaseFile::sync()+0x56>
    dir_t* d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE);
   25d7a:	61 e0       	ldi	r22, 0x01	; 1
   25d7c:	ce 01       	movw	r24, r28
   25d7e:	0f 94 9a 2e 	call	0x25d34	; 0x25d34 <SdBaseFile::cacheDirEntry(unsigned char)>
   25d82:	fc 01       	movw	r30, r24
    // check for deleted by another open file object
    if (!d || d->name[0] == DIR_NAME_DELETED) goto fail;
   25d84:	89 2b       	or	r24, r25
   25d86:	f9 f0       	breq	.+62     	; 0x25dc6 <SdBaseFile::sync()+0x5e>
   25d88:	80 81       	ld	r24, Z
   25d8a:	85 3e       	cpi	r24, 0xE5	; 229
   25d8c:	e1 f0       	breq	.+56     	; 0x25dc6 <SdBaseFile::sync()+0x5e>

    // do not set filesize for dir files
    if (!isDir()) d->fileSize = fileSize_;
   25d8e:	8b 81       	ldd	r24, Y+3	; 0x03
   25d90:	82 30       	cpi	r24, 0x02	; 2
   25d92:	40 f4       	brcc	.+16     	; 0x25da4 <SdBaseFile::sync()+0x3c>
   25d94:	89 89       	ldd	r24, Y+17	; 0x11
   25d96:	9a 89       	ldd	r25, Y+18	; 0x12
   25d98:	ab 89       	ldd	r26, Y+19	; 0x13
   25d9a:	bc 89       	ldd	r27, Y+20	; 0x14
   25d9c:	84 8f       	std	Z+28, r24	; 0x1c
   25d9e:	95 8f       	std	Z+29, r25	; 0x1d
   25da0:	a6 8f       	std	Z+30, r26	; 0x1e
   25da2:	b7 8f       	std	Z+31, r27	; 0x1f

    // update first cluster fields
    d->firstClusterLow = firstCluster_ & 0XFFFF;
   25da4:	8d 89       	ldd	r24, Y+21	; 0x15
   25da6:	9e 89       	ldd	r25, Y+22	; 0x16
   25da8:	93 8f       	std	Z+27, r25	; 0x1b
   25daa:	82 8f       	std	Z+26, r24	; 0x1a
    d->firstClusterHigh = firstCluster_ >> 16;
   25dac:	8d 89       	ldd	r24, Y+21	; 0x15
   25dae:	9e 89       	ldd	r25, Y+22	; 0x16
   25db0:	af 89       	ldd	r26, Y+23	; 0x17
   25db2:	b8 8d       	ldd	r27, Y+24	; 0x18
   25db4:	b5 8b       	std	Z+21, r27	; 0x15
   25db6:	a4 8b       	std	Z+20, r26	; 0x14
    if (dateTime_) {
      dateTime_(&d->lastWriteDate, &d->lastWriteTime);
      d->lastAccessDate = d->lastWriteDate;
    }
    // clear directory dirty
    flags_ &= ~F_FILE_DIR_DIRTY;
   25db8:	89 81       	ldd	r24, Y+1	; 0x01
   25dba:	8f 77       	andi	r24, 0x7F	; 127
   25dbc:	89 83       	std	Y+1, r24	; 0x01
  return vol_->cacheFlush();

 fail:
  writeError = true;
  return false;
}
   25dbe:	df 91       	pop	r29
   25dc0:	cf 91       	pop	r28
      d->lastAccessDate = d->lastWriteDate;
    }
    // clear directory dirty
    flags_ &= ~F_FILE_DIR_DIRTY;
  }
  return vol_->cacheFlush();
   25dc2:	0d 94 8e 29 	jmp	0x2531c	; 0x2531c <SdVolume::cacheFlush()>

 fail:
  writeError = true;
   25dc6:	81 e0       	ldi	r24, 0x01	; 1
   25dc8:	88 83       	st	Y, r24
  return false;
}
   25dca:	80 e0       	ldi	r24, 0x00	; 0
   25dcc:	df 91       	pop	r29
   25dce:	cf 91       	pop	r28
   25dd0:	08 95       	ret

00025dd2 <SdBaseFile::close()>:
 *
 * \return The value one, true, is returned for success and
 * the value zero, false, is returned for failure.
 * Reasons for failure include no file is open or an I/O error.
 */
bool SdBaseFile::close() {
   25dd2:	cf 93       	push	r28
   25dd4:	df 93       	push	r29
   25dd6:	ec 01       	movw	r28, r24
  bool rtn = sync();
   25dd8:	0f 94 b4 2e 	call	0x25d68	; 0x25d68 <SdBaseFile::sync()>
  type_ = FAT_FILE_TYPE_CLOSED;
   25ddc:	1b 82       	std	Y+3, r1	; 0x03
  return rtn;
}
   25dde:	df 91       	pop	r29
   25de0:	cf 91       	pop	r28
   25de2:	08 95       	ret

00025de4 <SdBaseFile::getFilename(char*)>:
 * \param[out] name An array of 13 characters for the file's name.
 *
 * \return The value one, true, is returned for success and
 * the value zero, false, is returned for failure.
 */
bool SdBaseFile::getFilename(char* name) {
   25de4:	cf 93       	push	r28
   25de6:	df 93       	push	r29
   25de8:	eb 01       	movw	r28, r22
   25dea:	fc 01       	movw	r30, r24
   25dec:	23 81       	ldd	r18, Z+3	; 0x03
  if (!isOpen()) return false;
   25dee:	21 11       	cpse	r18, r1
   25df0:	04 c0       	rjmp	.+8      	; 0x25dfa <SdBaseFile::getFilename(char*)+0x16>
   25df2:	80 e0       	ldi	r24, 0x00	; 0
  if (!p) return false;

  // format name
  dirName(*p, name);
  return true;
}
   25df4:	df 91       	pop	r29
   25df6:	cf 91       	pop	r28
   25df8:	08 95       	ret
  bool isOpen() const {return type_ != FAT_FILE_TYPE_CLOSED;}
  /** \return True if this is a subdirectory else false. */
  bool isSubDir() const {return type_ == FAT_FILE_TYPE_SUBDIR;}
  /** \return True if this is the root directory. */
  bool isRoot() const {
    return type_ == FAT_FILE_TYPE_ROOT_FIXED || type_ == FAT_FILE_TYPE_ROOT32;
   25dfa:	22 50       	subi	r18, 0x02	; 2
 * the value zero, false, is returned for failure.
 */
bool SdBaseFile::getFilename(char* name) {
  if (!isOpen()) return false;

  if (isRoot()) {
   25dfc:	22 30       	cpi	r18, 0x02	; 2
   25dfe:	28 f4       	brcc	.+10     	; 0x25e0a <SdBaseFile::getFilename(char*)+0x26>
    name[0] = '/';
   25e00:	8f e2       	ldi	r24, 0x2F	; 47
   25e02:	88 83       	st	Y, r24
    name[1] = '\0';
   25e04:	19 82       	std	Y+1, r1	; 0x01
  dir_t* p = cacheDirEntry(SdVolume::CACHE_FOR_READ);
  if (!p) return false;

  // format name
  dirName(*p, name);
  return true;
   25e06:	81 e0       	ldi	r24, 0x01	; 1
   25e08:	f5 cf       	rjmp	.-22     	; 0x25df4 <SdBaseFile::getFilename(char*)+0x10>
    name[0] = '/';
    name[1] = '\0';
    return true;
  }
  // cache entry
  dir_t* p = cacheDirEntry(SdVolume::CACHE_FOR_READ);
   25e0a:	60 e0       	ldi	r22, 0x00	; 0
   25e0c:	0f 94 9a 2e 	call	0x25d34	; 0x25d34 <SdBaseFile::cacheDirEntry(unsigned char)>
  if (!p) return false;
   25e10:	00 97       	sbiw	r24, 0x00	; 0
   25e12:	79 f3       	breq	.-34     	; 0x25df2 <SdBaseFile::getFilename(char*)+0xe>
   25e14:	dc 01       	movw	r26, r24
 *
 * \param[in] dir The directory structure containing the name.
 * \param[out] name A 13 byte char array for the formatted name.
 */
void SdBaseFile::dirName(const dir_t& dir, char* name) {
  uint8_t j = 0;
   25e16:	60 e0       	ldi	r22, 0x00	; 0
  for (uint8_t i = 0; i < 11; i++) {
   25e18:	80 e0       	ldi	r24, 0x00	; 0
    if (dir.name[i] == ' ')continue;
    if (i == 8) name[j++] = '.';
   25e1a:	9e e2       	ldi	r25, 0x2E	; 46
 * \param[out] name A 13 byte char array for the formatted name.
 */
void SdBaseFile::dirName(const dir_t& dir, char* name) {
  uint8_t j = 0;
  for (uint8_t i = 0; i < 11; i++) {
    if (dir.name[i] == ' ')continue;
   25e1c:	2d 91       	ld	r18, X+
   25e1e:	20 32       	cpi	r18, 0x20	; 32
   25e20:	99 f0       	breq	.+38     	; 0x25e48 <SdBaseFile::getFilename(char*)+0x64>
    if (i == 8) name[j++] = '.';
   25e22:	88 30       	cpi	r24, 0x08	; 8
   25e24:	31 f4       	brne	.+12     	; 0x25e32 <SdBaseFile::getFilename(char*)+0x4e>
   25e26:	9e 01       	movw	r18, r28
   25e28:	26 0f       	add	r18, r22
   25e2a:	31 1d       	adc	r19, r1
   25e2c:	f9 01       	movw	r30, r18
   25e2e:	90 83       	st	Z, r25
   25e30:	6f 5f       	subi	r22, 0xFF	; 255
    name[j++] = dir.name[i];
   25e32:	9e 01       	movw	r18, r28
   25e34:	26 0f       	add	r18, r22
   25e36:	31 1d       	adc	r19, r1
   25e38:	ad 01       	movw	r20, r26
   25e3a:	41 50       	subi	r20, 0x01	; 1
   25e3c:	51 09       	sbc	r21, r1
   25e3e:	fa 01       	movw	r30, r20
   25e40:	40 81       	ld	r20, Z
   25e42:	f9 01       	movw	r30, r18
   25e44:	40 83       	st	Z, r20
   25e46:	6f 5f       	subi	r22, 0xFF	; 255
 * \param[in] dir The directory structure containing the name.
 * \param[out] name A 13 byte char array for the formatted name.
 */
void SdBaseFile::dirName(const dir_t& dir, char* name) {
  uint8_t j = 0;
  for (uint8_t i = 0; i < 11; i++) {
   25e48:	8f 5f       	subi	r24, 0xFF	; 255
   25e4a:	8b 30       	cpi	r24, 0x0B	; 11
   25e4c:	39 f7       	brne	.-50     	; 0x25e1c <SdBaseFile::getFilename(char*)+0x38>
    if (dir.name[i] == ' ')continue;
    if (i == 8) name[j++] = '.';
    name[j++] = dir.name[i];
  }
  name[j] = 0;
   25e4e:	fe 01       	movw	r30, r28
   25e50:	e6 0f       	add	r30, r22
   25e52:	f1 1d       	adc	r31, r1
   25e54:	10 82       	st	Z, r1
   25e56:	d7 cf       	rjmp	.-82     	; 0x25e06 <SdBaseFile::getFilename(char*)+0x22>

00025e58 <SdBaseFile::read(void*, unsigned int)>:
 * if end of file is reached.
 * If an error occurs, read() returns -1.  Possible errors include
 * read() called before a file has been opened, corrupt file system
 * or an I/O error occurred.
 */
int16_t SdBaseFile::read(void* buf, uint16_t nbyte) {
   25e58:	2f 92       	push	r2
   25e5a:	3f 92       	push	r3
   25e5c:	4f 92       	push	r4
   25e5e:	5f 92       	push	r5
   25e60:	6f 92       	push	r6
   25e62:	7f 92       	push	r7
   25e64:	8f 92       	push	r8
   25e66:	9f 92       	push	r9
   25e68:	af 92       	push	r10
   25e6a:	bf 92       	push	r11
   25e6c:	cf 92       	push	r12
   25e6e:	df 92       	push	r13
   25e70:	ef 92       	push	r14
   25e72:	ff 92       	push	r15
   25e74:	0f 93       	push	r16
   25e76:	1f 93       	push	r17
   25e78:	cf 93       	push	r28
   25e7a:	df 93       	push	r29
   25e7c:	00 d0       	rcall	.+0      	; 0x25e7e <SdBaseFile::read(void*, unsigned int)+0x26>
   25e7e:	1f 92       	push	r1
   25e80:	cd b7       	in	r28, 0x3d	; 61
   25e82:	de b7       	in	r29, 0x3e	; 62
   25e84:	9c 83       	std	Y+4, r25	; 0x04
   25e86:	8b 83       	std	Y+3, r24	; 0x03
   25e88:	4b 01       	movw	r8, r22
   25e8a:	7a 01       	movw	r14, r20
  uint16_t offset;
  uint16_t toRead;
  uint32_t block;  // raw device block number

  // error if not open or write only
  if (!isOpen() || !(flags_ & O_READ)) goto fail;
   25e8c:	dc 01       	movw	r26, r24
   25e8e:	13 96       	adiw	r26, 0x03	; 3
   25e90:	8c 91       	ld	r24, X
   25e92:	81 11       	cpse	r24, r1
   25e94:	19 c0       	rjmp	.+50     	; 0x25ec8 <SdBaseFile::read(void*, unsigned int)+0x70>
    toRead -= n;
  }
  return nbyte;

 fail:
  return -1;
   25e96:	8f ef       	ldi	r24, 0xFF	; 255
   25e98:	9f ef       	ldi	r25, 0xFF	; 255
}
   25e9a:	0f 90       	pop	r0
   25e9c:	0f 90       	pop	r0
   25e9e:	0f 90       	pop	r0
   25ea0:	0f 90       	pop	r0
   25ea2:	df 91       	pop	r29
   25ea4:	cf 91       	pop	r28
   25ea6:	1f 91       	pop	r17
   25ea8:	0f 91       	pop	r16
   25eaa:	ff 90       	pop	r15
   25eac:	ef 90       	pop	r14
   25eae:	df 90       	pop	r13
   25eb0:	cf 90       	pop	r12
   25eb2:	bf 90       	pop	r11
   25eb4:	af 90       	pop	r10
   25eb6:	9f 90       	pop	r9
   25eb8:	8f 90       	pop	r8
   25eba:	7f 90       	pop	r7
   25ebc:	6f 90       	pop	r6
   25ebe:	5f 90       	pop	r5
   25ec0:	4f 90       	pop	r4
   25ec2:	3f 90       	pop	r3
   25ec4:	2f 90       	pop	r2
   25ec6:	08 95       	ret
  uint16_t offset;
  uint16_t toRead;
  uint32_t block;  // raw device block number

  // error if not open or write only
  if (!isOpen() || !(flags_ & O_READ)) goto fail;
   25ec8:	eb 81       	ldd	r30, Y+3	; 0x03
   25eca:	fc 81       	ldd	r31, Y+4	; 0x04
   25ecc:	81 81       	ldd	r24, Z+1	; 0x01
   25ece:	80 ff       	sbrs	r24, 0
   25ed0:	e2 cf       	rjmp	.-60     	; 0x25e96 <SdBaseFile::read(void*, unsigned int)+0x3e>

  // max bytes left in file
  if (nbyte >= (fileSize_ - curPosition_)) {
   25ed2:	01 89       	ldd	r16, Z+17	; 0x11
   25ed4:	12 89       	ldd	r17, Z+18	; 0x12
   25ed6:	23 89       	ldd	r18, Z+19	; 0x13
   25ed8:	34 89       	ldd	r19, Z+20	; 0x14
   25eda:	40 85       	ldd	r20, Z+8	; 0x08
   25edc:	51 85       	ldd	r21, Z+9	; 0x09
   25ede:	62 85       	ldd	r22, Z+10	; 0x0a
   25ee0:	73 85       	ldd	r23, Z+11	; 0x0b
   25ee2:	c7 01       	movw	r24, r14
   25ee4:	b0 e0       	ldi	r27, 0x00	; 0
   25ee6:	a0 e0       	ldi	r26, 0x00	; 0
   25ee8:	28 01       	movw	r4, r16
   25eea:	39 01       	movw	r6, r18
   25eec:	44 1a       	sub	r4, r20
   25eee:	55 0a       	sbc	r5, r21
   25ef0:	66 0a       	sbc	r6, r22
   25ef2:	77 0a       	sbc	r7, r23
   25ef4:	84 15       	cp	r24, r4
   25ef6:	95 05       	cpc	r25, r5
   25ef8:	a6 05       	cpc	r26, r6
   25efa:	b7 05       	cpc	r27, r7
   25efc:	18 f0       	brcs	.+6      	; 0x25f04 <SdBaseFile::read(void*, unsigned int)+0xac>
    nbyte = fileSize_ - curPosition_;
   25efe:	78 01       	movw	r14, r16
   25f00:	e4 1a       	sub	r14, r20
   25f02:	f5 0a       	sbc	r15, r21
  }
  // amount left to read
  toRead = nbyte;
   25f04:	67 01       	movw	r12, r14
        if (curPosition_ == 0) {
          // use first cluster in file
          curCluster_ = firstCluster_;
        } else {
          // get next cluster from FAT
          if (!vol_->fatGet(curCluster_, &curCluster_)) goto fail;
   25f06:	8b 81       	ldd	r24, Y+3	; 0x03
   25f08:	9c 81       	ldd	r25, Y+4	; 0x04
   25f0a:	04 96       	adiw	r24, 0x04	; 4
   25f0c:	9a 83       	std	Y+2, r25	; 0x02
   25f0e:	89 83       	std	Y+1, r24	; 0x01
      block = vol_->clusterStartBlock(curCluster_) + blockOfCluster;
    }
    uint16_t n = toRead;

    // amount to be read from current block
    if (n > (512 - offset)) n = 512 - offset;
   25f10:	61 2c       	mov	r6, r1
   25f12:	32 e0       	ldi	r19, 0x02	; 2
   25f14:	73 2e       	mov	r7, r19
  if (nbyte >= (fileSize_ - curPosition_)) {
    nbyte = fileSize_ - curPosition_;
  }
  // amount left to read
  toRead = nbyte;
  while (toRead > 0) {
   25f16:	c1 14       	cp	r12, r1
   25f18:	d1 04       	cpc	r13, r1
   25f1a:	09 f4       	brne	.+2      	; 0x25f1e <SdBaseFile::read(void*, unsigned int)+0xc6>
   25f1c:	b7 c0       	rjmp	.+366    	; 0x2608c <SdBaseFile::read(void*, unsigned int)+0x234>
    offset = curPosition_ & 0X1FF;  // offset in block
   25f1e:	ab 81       	ldd	r26, Y+3	; 0x03
   25f20:	bc 81       	ldd	r27, Y+4	; 0x04
   25f22:	18 96       	adiw	r26, 0x08	; 8
   25f24:	4d 91       	ld	r20, X+
   25f26:	5d 91       	ld	r21, X+
   25f28:	6d 91       	ld	r22, X+
   25f2a:	7c 91       	ld	r23, X
   25f2c:	1b 97       	sbiw	r26, 0x0b	; 11
   25f2e:	5a 01       	movw	r10, r20
   25f30:	b1 e0       	ldi	r27, 0x01	; 1
   25f32:	bb 22       	and	r11, r27
   25f34:	eb 81       	ldd	r30, Y+3	; 0x03
   25f36:	fc 81       	ldd	r31, Y+4	; 0x04
   25f38:	81 8d       	ldd	r24, Z+25	; 0x19
   25f3a:	92 8d       	ldd	r25, Z+26	; 0x1a
   25f3c:	1a 01       	movw	r2, r20
   25f3e:	2b 01       	movw	r4, r22
   25f40:	29 e0       	ldi	r18, 0x09	; 9
   25f42:	56 94       	lsr	r5
   25f44:	47 94       	ror	r4
   25f46:	37 94       	ror	r3
   25f48:	27 94       	ror	r2
   25f4a:	2a 95       	dec	r18
   25f4c:	d1 f7       	brne	.-12     	; 0x25f42 <SdBaseFile::read(void*, unsigned int)+0xea>
    if (type_ == FAT_FILE_TYPE_ROOT_FIXED) {
   25f4e:	23 81       	ldd	r18, Z+3	; 0x03
   25f50:	22 30       	cpi	r18, 0x02	; 2
   25f52:	91 f5       	brne	.+100    	; 0x25fb8 <SdBaseFile::read(void*, unsigned int)+0x160>
      block = vol_->rootDirStart() + (curPosition_ >> 9);
   25f54:	dc 01       	movw	r26, r24
   25f56:	5a 96       	adiw	r26, 0x1a	; 26
   25f58:	6d 91       	ld	r22, X+
   25f5a:	7d 91       	ld	r23, X+
   25f5c:	8d 91       	ld	r24, X+
   25f5e:	9c 91       	ld	r25, X
   25f60:	5d 97       	sbiw	r26, 0x1d	; 29
   25f62:	62 0d       	add	r22, r2
   25f64:	73 1d       	adc	r23, r3
   25f66:	84 1d       	adc	r24, r4
   25f68:	95 1d       	adc	r25, r5
   25f6a:	83 01       	movw	r16, r6
   25f6c:	0a 19       	sub	r16, r10
   25f6e:	1b 09       	sbc	r17, r11
   25f70:	c0 16       	cp	r12, r16
   25f72:	d1 06       	cpc	r13, r17
   25f74:	08 f4       	brcc	.+2      	; 0x25f78 <SdBaseFile::read(void*, unsigned int)+0x120>
   25f76:	86 01       	movw	r16, r12

    // amount to be read from current block
    if (n > (512 - offset)) n = 512 - offset;

    // no buffering needed if n == 512
    if (n == 512 && block != vol_->cacheBlockNumber()) {
   25f78:	01 15       	cp	r16, r1
   25f7a:	b2 e0       	ldi	r27, 0x02	; 2
   25f7c:	1b 07       	cpc	r17, r27
   25f7e:	71 f4       	brne	.+28     	; 0x25f9c <SdBaseFile::read(void*, unsigned int)+0x144>
   25f80:	20 91 3a 0e 	lds	r18, 0x0E3A	; 0x800e3a <SdVolume::cacheBlockNumber_>
   25f84:	30 91 3b 0e 	lds	r19, 0x0E3B	; 0x800e3b <SdVolume::cacheBlockNumber_+0x1>
   25f88:	40 91 3c 0e 	lds	r20, 0x0E3C	; 0x800e3c <SdVolume::cacheBlockNumber_+0x2>
   25f8c:	50 91 3d 0e 	lds	r21, 0x0E3D	; 0x800e3d <SdVolume::cacheBlockNumber_+0x3>
   25f90:	62 17       	cp	r22, r18
   25f92:	73 07       	cpc	r23, r19
   25f94:	84 07       	cpc	r24, r20
   25f96:	95 07       	cpc	r25, r21
   25f98:	09 f0       	breq	.+2      	; 0x25f9c <SdBaseFile::read(void*, unsigned int)+0x144>
   25f9a:	59 c0       	rjmp	.+178    	; 0x2604e <SdBaseFile::read(void*, unsigned int)+0x1f6>
      if (!vol_->readBlock(block, dst)) goto fail;
    } else {
      // read block to cache and copy data to caller
      if (!vol_->cacheRawBlock(block, SdVolume::CACHE_FOR_READ)) goto fail;
   25f9c:	40 e0       	ldi	r20, 0x00	; 0
   25f9e:	0f 94 86 2a 	call	0x2550c	; 0x2550c <SdVolume::cacheRawBlock(unsigned long, bool)>
   25fa2:	88 23       	and	r24, r24
   25fa4:	09 f4       	brne	.+2      	; 0x25fa8 <SdBaseFile::read(void*, unsigned int)+0x150>
   25fa6:	77 cf       	rjmp	.-274    	; 0x25e96 <SdBaseFile::read(void*, unsigned int)+0x3e>
      uint8_t* src = vol_->cache()->data + offset;
   25fa8:	b5 01       	movw	r22, r10
   25faa:	6a 5b       	subi	r22, 0xBA	; 186
   25fac:	71 4f       	sbci	r23, 0xF1	; 241
      memcpy(dst, src, n);
   25fae:	a8 01       	movw	r20, r16
   25fb0:	c4 01       	movw	r24, r8
   25fb2:	0f 94 09 aa 	call	0x35412	; 0x35412 <memcpy>
   25fb6:	57 c0       	rjmp	.+174    	; 0x26066 <SdBaseFile::read(void*, unsigned int)+0x20e>
  uint16_t rootDirEntryCount_;  // number of entries in FAT16 root dir
  uint32_t rootDirStart_;       // root start block for FAT16, cluster for FAT32
  //----------------------------------------------------------------------------
  bool allocContiguous(uint32_t count, uint32_t* curCluster);
  uint8_t blockOfCluster(uint32_t position) const {
          return (position >> 9) & (blocksPerCluster_ - 1);}
   25fb8:	fc 01       	movw	r30, r24
   25fba:	14 81       	ldd	r17, Z+4	; 0x04
   25fbc:	11 50       	subi	r17, 0x01	; 1
   25fbe:	12 21       	and	r17, r2
    offset = curPosition_ & 0X1FF;  // offset in block
    if (type_ == FAT_FILE_TYPE_ROOT_FIXED) {
      block = vol_->rootDirStart() + (curPosition_ >> 9);
    } else {
      uint8_t blockOfCluster = vol_->blockOfCluster(curPosition_);
      if (offset == 0 && blockOfCluster == 0) {
   25fc0:	a1 14       	cp	r10, r1
   25fc2:	b1 04       	cpc	r11, r1
   25fc4:	81 f4       	brne	.+32     	; 0x25fe6 <SdBaseFile::read(void*, unsigned int)+0x18e>
   25fc6:	11 11       	cpse	r17, r1
   25fc8:	0e c0       	rjmp	.+28     	; 0x25fe6 <SdBaseFile::read(void*, unsigned int)+0x18e>
        // start of new cluster
        if (curPosition_ == 0) {
   25fca:	45 2b       	or	r20, r21
   25fcc:	46 2b       	or	r20, r22
   25fce:	47 2b       	or	r20, r23
   25fd0:	79 f5       	brne	.+94     	; 0x26030 <SdBaseFile::read(void*, unsigned int)+0x1d8>
          // use first cluster in file
          curCluster_ = firstCluster_;
   25fd2:	eb 81       	ldd	r30, Y+3	; 0x03
   25fd4:	fc 81       	ldd	r31, Y+4	; 0x04
   25fd6:	85 89       	ldd	r24, Z+21	; 0x15
   25fd8:	96 89       	ldd	r25, Z+22	; 0x16
   25fda:	a7 89       	ldd	r26, Z+23	; 0x17
   25fdc:	b0 8d       	ldd	r27, Z+24	; 0x18
   25fde:	84 83       	std	Z+4, r24	; 0x04
   25fe0:	95 83       	std	Z+5, r25	; 0x05
   25fe2:	a6 83       	std	Z+6, r26	; 0x06
   25fe4:	b7 83       	std	Z+7, r27	; 0x07
        } else {
          // get next cluster from FAT
          if (!vol_->fatGet(curCluster_, &curCluster_)) goto fail;
        }
      }
      block = vol_->clusterStartBlock(curCluster_) + blockOfCluster;
   25fe6:	ab 81       	ldd	r26, Y+3	; 0x03
   25fe8:	bc 81       	ldd	r27, Y+4	; 0x04
   25fea:	59 96       	adiw	r26, 0x19	; 25
   25fec:	ed 91       	ld	r30, X+
   25fee:	fc 91       	ld	r31, X
   25ff0:	5a 97       	sbiw	r26, 0x1a	; 26
  uint32_t clusterStartBlock(uint32_t cluster) const {
           return dataStartBlock_ + ((cluster - 2) << clusterSizeShift_);}
   25ff2:	14 96       	adiw	r26, 0x04	; 4
   25ff4:	6d 91       	ld	r22, X+
   25ff6:	7d 91       	ld	r23, X+
   25ff8:	8d 91       	ld	r24, X+
   25ffa:	9c 91       	ld	r25, X
   25ffc:	17 97       	sbiw	r26, 0x07	; 7
   25ffe:	62 50       	subi	r22, 0x02	; 2
   26000:	71 09       	sbc	r23, r1
   26002:	81 09       	sbc	r24, r1
   26004:	91 09       	sbc	r25, r1
   26006:	25 85       	ldd	r18, Z+13	; 0x0d
   26008:	04 c0       	rjmp	.+8      	; 0x26012 <SdBaseFile::read(void*, unsigned int)+0x1ba>
   2600a:	66 0f       	add	r22, r22
   2600c:	77 1f       	adc	r23, r23
   2600e:	88 1f       	adc	r24, r24
   26010:	99 1f       	adc	r25, r25
   26012:	2a 95       	dec	r18
   26014:	d2 f7       	brpl	.-12     	; 0x2600a <SdBaseFile::read(void*, unsigned int)+0x1b2>
   26016:	26 85       	ldd	r18, Z+14	; 0x0e
   26018:	37 85       	ldd	r19, Z+15	; 0x0f
   2601a:	40 89       	ldd	r20, Z+16	; 0x10
   2601c:	51 89       	ldd	r21, Z+17	; 0x11
   2601e:	62 0f       	add	r22, r18
   26020:	73 1f       	adc	r23, r19
   26022:	84 1f       	adc	r24, r20
   26024:	95 1f       	adc	r25, r21
   26026:	61 0f       	add	r22, r17
   26028:	71 1d       	adc	r23, r1
   2602a:	81 1d       	adc	r24, r1
   2602c:	91 1d       	adc	r25, r1
   2602e:	9d cf       	rjmp	.-198    	; 0x25f6a <SdBaseFile::read(void*, unsigned int)+0x112>
        if (curPosition_ == 0) {
          // use first cluster in file
          curCluster_ = firstCluster_;
        } else {
          // get next cluster from FAT
          if (!vol_->fatGet(curCluster_, &curCluster_)) goto fail;
   26030:	ab 81       	ldd	r26, Y+3	; 0x03
   26032:	bc 81       	ldd	r27, Y+4	; 0x04
   26034:	14 96       	adiw	r26, 0x04	; 4
   26036:	4d 91       	ld	r20, X+
   26038:	5d 91       	ld	r21, X+
   2603a:	6d 91       	ld	r22, X+
   2603c:	7c 91       	ld	r23, X
   2603e:	17 97       	sbiw	r26, 0x07	; 7
   26040:	29 81       	ldd	r18, Y+1	; 0x01
   26042:	3a 81       	ldd	r19, Y+2	; 0x02
   26044:	0f 94 55 2b 	call	0x256aa	; 0x256aa <SdVolume::fatGet(unsigned long, unsigned long*)>
   26048:	81 11       	cpse	r24, r1
   2604a:	cd cf       	rjmp	.-102    	; 0x25fe6 <SdBaseFile::read(void*, unsigned int)+0x18e>
   2604c:	24 cf       	rjmp	.-440    	; 0x25e96 <SdBaseFile::read(void*, unsigned int)+0x3e>
    if (FAT12_SUPPORT && fatType_ == 12) return  cluster >= FAT12EOC_MIN;
    if (fatType_ == 16) return cluster >= FAT16EOC_MIN;
    return  cluster >= FAT32EOC_MIN;
  }
  bool readBlock(uint32_t block, uint8_t* dst) {
    return sdCard_->readBlock(block, dst);}
   2604e:	94 01       	movw	r18, r8
   26050:	ab 01       	movw	r20, r22
   26052:	bc 01       	movw	r22, r24
   26054:	80 91 43 0e 	lds	r24, 0x0E43	; 0x800e43 <SdVolume::sdCard_>
   26058:	90 91 44 0e 	lds	r25, 0x0E44	; 0x800e44 <SdVolume::sdCard_+0x1>
   2605c:	0f 94 cd 29 	call	0x2539a	; 0x2539a <Sd2Card::readBlock(unsigned long, unsigned char*)>
    // amount to be read from current block
    if (n > (512 - offset)) n = 512 - offset;

    // no buffering needed if n == 512
    if (n == 512 && block != vol_->cacheBlockNumber()) {
      if (!vol_->readBlock(block, dst)) goto fail;
   26060:	88 23       	and	r24, r24
   26062:	09 f4       	brne	.+2      	; 0x26066 <SdBaseFile::read(void*, unsigned int)+0x20e>
   26064:	18 cf       	rjmp	.-464    	; 0x25e96 <SdBaseFile::read(void*, unsigned int)+0x3e>
      // read block to cache and copy data to caller
      if (!vol_->cacheRawBlock(block, SdVolume::CACHE_FOR_READ)) goto fail;
      uint8_t* src = vol_->cache()->data + offset;
      memcpy(dst, src, n);
    }
    dst += n;
   26066:	80 0e       	add	r8, r16
   26068:	91 1e       	adc	r9, r17
    curPosition_ += n;
   2606a:	eb 81       	ldd	r30, Y+3	; 0x03
   2606c:	fc 81       	ldd	r31, Y+4	; 0x04
   2606e:	80 85       	ldd	r24, Z+8	; 0x08
   26070:	91 85       	ldd	r25, Z+9	; 0x09
   26072:	a2 85       	ldd	r26, Z+10	; 0x0a
   26074:	b3 85       	ldd	r27, Z+11	; 0x0b
   26076:	80 0f       	add	r24, r16
   26078:	91 1f       	adc	r25, r17
   2607a:	a1 1d       	adc	r26, r1
   2607c:	b1 1d       	adc	r27, r1
   2607e:	80 87       	std	Z+8, r24	; 0x08
   26080:	91 87       	std	Z+9, r25	; 0x09
   26082:	a2 87       	std	Z+10, r26	; 0x0a
   26084:	b3 87       	std	Z+11, r27	; 0x0b
    toRead -= n;
   26086:	c0 1a       	sub	r12, r16
   26088:	d1 0a       	sbc	r13, r17
   2608a:	45 cf       	rjmp	.-374    	; 0x25f16 <SdBaseFile::read(void*, unsigned int)+0xbe>
  }
  return nbyte;
   2608c:	c7 01       	movw	r24, r14
   2608e:	05 cf       	rjmp	.-502    	; 0x25e9a <SdBaseFile::read(void*, unsigned int)+0x42>

00026090 <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]>:
 * A value of zero will be returned if end of file is reached.
 * If an error occurs, readDir() returns -1.  Possible errors include
 * readDir() called before a directory has been opened, this is not
 * a directory file or an I/O error occurred.
 */
int8_t SdBaseFile::readDir(dir_t* dir, char* longFilename) {
   26090:	df 92       	push	r13
   26092:	ef 92       	push	r14
   26094:	ff 92       	push	r15
   26096:	0f 93       	push	r16
   26098:	1f 93       	push	r17
   2609a:	cf 93       	push	r28
   2609c:	df 93       	push	r29
   2609e:	8c 01       	movw	r16, r24
   260a0:	eb 01       	movw	r28, r22
   260a2:	7a 01       	movw	r14, r20
    	vfat_t *VFAT = (vfat_t*)dir;
		//Sanity check the VFAT entry. The first cluster is always set to zero. And th esequence number should be higher then 0
    	if (VFAT->firstClusterLow == 0 && (VFAT->sequenceNumber & 0x1F) > 0 && (VFAT->sequenceNumber & 0x1F) <= MAX_VFAT_ENTRIES)
    	{
			//TODO: Store the filename checksum to verify if a none-long filename aware system modified the file table.
    		n = ((VFAT->sequenceNumber & 0x1F) - 1) * 13;
   260a4:	8d e0       	ldi	r24, 0x0D	; 13
   260a6:	d8 2e       	mov	r13, r24
  {
  	longFilename[0] = '\0';
  }

  while (1) {
    n = read(dir, sizeof(dir_t));
   260a8:	40 e2       	ldi	r20, 0x20	; 32
   260aa:	50 e0       	ldi	r21, 0x00	; 0
   260ac:	be 01       	movw	r22, r28
   260ae:	c8 01       	movw	r24, r16
   260b0:	0f 94 2c 2f 	call	0x25e58	; 0x25e58 <SdBaseFile::read(void*, unsigned int)>
    if (n != sizeof(dir_t)) return n == 0 ? 0 : -1;
   260b4:	80 32       	cpi	r24, 0x20	; 32
   260b6:	91 05       	cpc	r25, r1
   260b8:	71 f0       	breq	.+28     	; 0x260d6 <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]+0x46>
   260ba:	21 e0       	ldi	r18, 0x01	; 1
   260bc:	89 2b       	or	r24, r25
   260be:	09 f4       	brne	.+2      	; 0x260c2 <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]+0x32>
   260c0:	20 e0       	ldi	r18, 0x00	; 0
   260c2:	82 2f       	mov	r24, r18
   260c4:	81 95       	neg	r24
		}
    }
    // return if normal file or subdirectory
    if (DIR_IS_FILE_OR_SUBDIR(dir)) return n;
  }
}
   260c6:	df 91       	pop	r29
   260c8:	cf 91       	pop	r28
   260ca:	1f 91       	pop	r17
   260cc:	0f 91       	pop	r16
   260ce:	ff 90       	pop	r15
   260d0:	ef 90       	pop	r14
   260d2:	df 90       	pop	r13
   260d4:	08 95       	ret

  while (1) {
    n = read(dir, sizeof(dir_t));
    if (n != sizeof(dir_t)) return n == 0 ? 0 : -1;
    // last entry if DIR_NAME_FREE
    if (dir->name[0] == DIR_NAME_FREE) return 0;
   260d6:	28 81       	ld	r18, Y
   260d8:	22 23       	and	r18, r18
   260da:	09 f4       	brne	.+2      	; 0x260de <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]+0x4e>
   260dc:	3f c0       	rjmp	.+126    	; 0x2615c <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]+0xcc>
    // skip empty entries and entry for .  and ..
    if (dir->name[0] == DIR_NAME_DELETED || dir->name[0] == '.') continue;
   260de:	25 3e       	cpi	r18, 0xE5	; 229
   260e0:	19 f3       	breq	.-58     	; 0x260a8 <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]+0x18>
   260e2:	2e 32       	cpi	r18, 0x2E	; 46
   260e4:	09 f3       	breq	.-62     	; 0x260a8 <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]+0x18>
    //Fill the long filename if we have a long filename entry,
	// long filename entries are stored before the actual filename.
	if (DIR_IS_LONG_NAME(dir) && longFilename != NULL)
   260e6:	3b 85       	ldd	r19, Y+11	; 0x0b
   260e8:	3f 73       	andi	r19, 0x3F	; 63
   260ea:	3f 30       	cpi	r19, 0x0F	; 15
   260ec:	99 f5       	brne	.+102    	; 0x26154 <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]+0xc4>
   260ee:	e1 14       	cp	r14, r1
   260f0:	f1 04       	cpc	r15, r1
   260f2:	81 f1       	breq	.+96     	; 0x26154 <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]+0xc4>
    {
    	vfat_t *VFAT = (vfat_t*)dir;
		//Sanity check the VFAT entry. The first cluster is always set to zero. And th esequence number should be higher then 0
    	if (VFAT->firstClusterLow == 0 && (VFAT->sequenceNumber & 0x1F) > 0 && (VFAT->sequenceNumber & 0x1F) <= MAX_VFAT_ENTRIES)
   260f4:	4a 8d       	ldd	r20, Y+26	; 0x1a
   260f6:	5b 8d       	ldd	r21, Y+27	; 0x1b
   260f8:	45 2b       	or	r20, r21
   260fa:	61 f5       	brne	.+88     	; 0x26154 <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]+0xc4>
   260fc:	2f 71       	andi	r18, 0x1F	; 31
   260fe:	3f ef       	ldi	r19, 0xFF	; 255
   26100:	32 0f       	add	r19, r18
   26102:	34 30       	cpi	r19, 0x04	; 4
   26104:	38 f5       	brcc	.+78     	; 0x26154 <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]+0xc4>
    	{
			//TODO: Store the filename checksum to verify if a none-long filename aware system modified the file table.
    		n = ((VFAT->sequenceNumber & 0x1F) - 1) * 13;
   26106:	21 50       	subi	r18, 0x01	; 1
   26108:	33 0b       	sbc	r19, r19
   2610a:	d2 9e       	mul	r13, r18
   2610c:	c0 01       	movw	r24, r0
   2610e:	d3 9e       	mul	r13, r19
   26110:	90 0d       	add	r25, r0
   26112:	11 24       	eor	r1, r1
			longFilename[n+0] = VFAT->name1[0];
   26114:	f7 01       	movw	r30, r14
   26116:	e8 0f       	add	r30, r24
   26118:	f9 1f       	adc	r31, r25
   2611a:	29 81       	ldd	r18, Y+1	; 0x01
   2611c:	20 83       	st	Z, r18
			longFilename[n+1] = VFAT->name1[1];
   2611e:	2b 81       	ldd	r18, Y+3	; 0x03
   26120:	21 83       	std	Z+1, r18	; 0x01
			longFilename[n+2] = VFAT->name1[2];
   26122:	2d 81       	ldd	r18, Y+5	; 0x05
   26124:	22 83       	std	Z+2, r18	; 0x02
			longFilename[n+3] = VFAT->name1[3];
   26126:	2f 81       	ldd	r18, Y+7	; 0x07
   26128:	23 83       	std	Z+3, r18	; 0x03
			longFilename[n+4] = VFAT->name1[4];
   2612a:	29 85       	ldd	r18, Y+9	; 0x09
   2612c:	24 83       	std	Z+4, r18	; 0x04
			longFilename[n+5] = VFAT->name2[0];
   2612e:	2e 85       	ldd	r18, Y+14	; 0x0e
   26130:	25 83       	std	Z+5, r18	; 0x05
			longFilename[n+6] = VFAT->name2[1];
   26132:	28 89       	ldd	r18, Y+16	; 0x10
   26134:	26 83       	std	Z+6, r18	; 0x06
			longFilename[n+7] = VFAT->name2[2];
   26136:	2a 89       	ldd	r18, Y+18	; 0x12
   26138:	27 83       	std	Z+7, r18	; 0x07
			longFilename[n+8] = VFAT->name2[3];
   2613a:	2c 89       	ldd	r18, Y+20	; 0x14
   2613c:	20 87       	std	Z+8, r18	; 0x08
			longFilename[n+9] = VFAT->name2[4];
   2613e:	2e 89       	ldd	r18, Y+22	; 0x16
   26140:	21 87       	std	Z+9, r18	; 0x09
			longFilename[n+10] = VFAT->name2[5];
   26142:	28 8d       	ldd	r18, Y+24	; 0x18
   26144:	22 87       	std	Z+10, r18	; 0x0a
			longFilename[n+11] = VFAT->name3[0];
   26146:	2c 8d       	ldd	r18, Y+28	; 0x1c
   26148:	23 87       	std	Z+11, r18	; 0x0b
			longFilename[n+12] = VFAT->name3[1];
   2614a:	2e 8d       	ldd	r18, Y+30	; 0x1e
   2614c:	24 87       	std	Z+12, r18	; 0x0c
			//If this VFAT entry is the last one, add a NUL terminator at the end of the string
			if (VFAT->sequenceNumber & 0x40)
   2614e:	28 81       	ld	r18, Y
   26150:	26 fd       	sbrc	r18, 6
				longFilename[n+13] = '\0';
   26152:	15 86       	std	Z+13, r1	; 0x0d
		}
    }
    // return if normal file or subdirectory
    if (DIR_IS_FILE_OR_SUBDIR(dir)) return n;
   26154:	2b 85       	ldd	r18, Y+11	; 0x0b
   26156:	23 fd       	sbrc	r18, 3
   26158:	a7 cf       	rjmp	.-178    	; 0x260a8 <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]+0x18>
   2615a:	b5 cf       	rjmp	.-150    	; 0x260c6 <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]+0x36>

  while (1) {
    n = read(dir, sizeof(dir_t));
    if (n != sizeof(dir_t)) return n == 0 ? 0 : -1;
    // last entry if DIR_NAME_FREE
    if (dir->name[0] == DIR_NAME_FREE) return 0;
   2615c:	80 e0       	ldi	r24, 0x00	; 0
   2615e:	b3 cf       	rjmp	.-154    	; 0x260c6 <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]+0x36>

00026160 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)>:
  return false;
}
//------------------------------------------------------------------------------
// open with filename in dname
bool SdBaseFile::open(SdBaseFile* dirFile,
  const uint8_t dname[11], uint8_t oflag) {
   26160:	4f 92       	push	r4
   26162:	5f 92       	push	r5
   26164:	6f 92       	push	r6
   26166:	7f 92       	push	r7
   26168:	af 92       	push	r10
   2616a:	bf 92       	push	r11
   2616c:	cf 92       	push	r12
   2616e:	df 92       	push	r13
   26170:	ef 92       	push	r14
   26172:	ff 92       	push	r15
   26174:	0f 93       	push	r16
   26176:	1f 93       	push	r17
   26178:	cf 93       	push	r28
   2617a:	df 93       	push	r29
   2617c:	1f 92       	push	r1
   2617e:	cd b7       	in	r28, 0x3d	; 61
   26180:	de b7       	in	r29, 0x3e	; 62
   26182:	8c 01       	movw	r16, r24
   26184:	7b 01       	movw	r14, r22
   26186:	5a 01       	movw	r10, r20
   26188:	c2 2e       	mov	r12, r18
  bool emptyFound = false;
  bool fileFound = false;
  uint8_t index;
  dir_t* p;

  vol_ = dirFile->vol_;
   2618a:	db 01       	movw	r26, r22
   2618c:	59 96       	adiw	r26, 0x19	; 25
   2618e:	8d 91       	ld	r24, X+
   26190:	9c 91       	ld	r25, X
   26192:	f8 01       	movw	r30, r16
   26194:	92 8f       	std	Z+26, r25	; 0x1a
   26196:	81 8f       	std	Z+25, r24	; 0x19

  dirFile->rewind();
   26198:	cb 01       	movw	r24, r22
   2619a:	0e 94 a6 79 	call	0xf34c	; 0xf34c <SdBaseFile::rewind()>
}
//------------------------------------------------------------------------------
// open with filename in dname
bool SdBaseFile::open(SdBaseFile* dirFile,
  const uint8_t dname[11], uint8_t oflag) {
  bool emptyFound = false;
   2619e:	71 2c       	mov	r7, r1
  vol_ = dirFile->vol_;

  dirFile->rewind();
  // search for file

  while (dirFile->curPosition_ < dirFile->fileSize_) {
   261a0:	f7 01       	movw	r30, r14
   261a2:	80 85       	ldd	r24, Z+8	; 0x08
   261a4:	91 85       	ldd	r25, Z+9	; 0x09
   261a6:	a2 85       	ldd	r26, Z+10	; 0x0a
   261a8:	b3 85       	ldd	r27, Z+11	; 0x0b
   261aa:	41 89       	ldd	r20, Z+17	; 0x11
   261ac:	52 89       	ldd	r21, Z+18	; 0x12
   261ae:	63 89       	ldd	r22, Z+19	; 0x13
   261b0:	74 89       	ldd	r23, Z+20	; 0x14
   261b2:	84 17       	cp	r24, r20
   261b4:	95 07       	cpc	r25, r21
   261b6:	a6 07       	cpc	r26, r22
   261b8:	b7 07       	cpc	r27, r23
   261ba:	08 f0       	brcs	.+2      	; 0x261be <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x5e>
   261bc:	52 c0       	rjmp	.+164    	; 0x26262 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x102>
    index = 0XF & (dirFile->curPosition_ >> 5);
   261be:	55 e0       	ldi	r21, 0x05	; 5
   261c0:	b6 95       	lsr	r27
   261c2:	a7 95       	ror	r26
   261c4:	97 95       	ror	r25
   261c6:	87 95       	ror	r24
   261c8:	5a 95       	dec	r21
   261ca:	d1 f7       	brne	.-12     	; 0x261c0 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x60>
   261cc:	f8 2f       	mov	r31, r24
   261ce:	ff 70       	andi	r31, 0x0F	; 15
   261d0:	df 2e       	mov	r13, r31
// Read next directory entry into the cache
// Assumes file is correctly positioned
dir_t* SdBaseFile::readDirCache() {
  uint8_t i;
  // error if not directory
  if (!isDir()) goto fail;
   261d2:	d7 01       	movw	r26, r14
   261d4:	13 96       	adiw	r26, 0x03	; 3
   261d6:	8c 91       	ld	r24, X
   261d8:	82 30       	cpi	r24, 0x02	; 2
   261da:	10 f4       	brcc	.+4      	; 0x261e0 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x80>
  if ((oflag & O_TRUNC) && !truncate(0)) return false;
  return oflag & O_AT_END ? seekEnd(0) : true;

 fail:
  type_ = FAT_FILE_TYPE_CLOSED;
  return false;
   261dc:	80 e0       	ldi	r24, 0x00	; 0
   261de:	db c0       	rjmp	.+438    	; 0x26396 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x236>
 * \return For success read returns the next byte in the file as an int.
 * If an error occurs or end of file is reached -1 is returned.
 */
int16_t SdBaseFile::read() {
  uint8_t b;
  return read(&b, 1) == 1 ? b : -1;
   261e0:	41 e0       	ldi	r20, 0x01	; 1
   261e2:	50 e0       	ldi	r21, 0x00	; 0
   261e4:	be 01       	movw	r22, r28
   261e6:	6f 5f       	subi	r22, 0xFF	; 255
   261e8:	7f 4f       	sbci	r23, 0xFF	; 255
   261ea:	c7 01       	movw	r24, r14
   261ec:	0f 94 2c 2f 	call	0x25e58	; 0x25e58 <SdBaseFile::read(void*, unsigned int)>
   261f0:	01 97       	sbiw	r24, 0x01	; 1
   261f2:	a1 f7       	brne	.-24     	; 0x261dc <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x7c>

  // use read to locate and cache block
  if (read() < 0) goto fail;

  // advance to next entry
  curPosition_ += 31;
   261f4:	f7 01       	movw	r30, r14
   261f6:	80 85       	ldd	r24, Z+8	; 0x08
   261f8:	91 85       	ldd	r25, Z+9	; 0x09
   261fa:	a2 85       	ldd	r26, Z+10	; 0x0a
   261fc:	b3 85       	ldd	r27, Z+11	; 0x0b
   261fe:	4f 96       	adiw	r24, 0x1f	; 31
   26200:	a1 1d       	adc	r26, r1
   26202:	b1 1d       	adc	r27, r1
   26204:	80 87       	std	Z+8, r24	; 0x08
   26206:	91 87       	std	Z+9, r25	; 0x09
   26208:	a2 87       	std	Z+10, r26	; 0x0a
   2620a:	b3 87       	std	Z+11, r27	; 0x0b

  // return pointer to entry
  return vol_->cache()->dir + i;
   2620c:	f0 e2       	ldi	r31, 0x20	; 32
   2620e:	df 9e       	mul	r13, r31
   26210:	b0 01       	movw	r22, r0
   26212:	11 24       	eor	r1, r1
   26214:	6a 5b       	subi	r22, 0xBA	; 186
   26216:	71 4f       	sbci	r23, 0xF1	; 241
  // search for file

  while (dirFile->curPosition_ < dirFile->fileSize_) {
    index = 0XF & (dirFile->curPosition_ >> 5);
    p = dirFile->readDirCache();
    if (!p) goto fail;
   26218:	61 15       	cp	r22, r1
   2621a:	71 05       	cpc	r23, r1
   2621c:	f9 f2       	breq	.-66     	; 0x261dc <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x7c>

    if (p->name[0] == DIR_NAME_FREE || p->name[0] == DIR_NAME_DELETED) {
   2621e:	db 01       	movw	r26, r22
   26220:	8c 91       	ld	r24, X
   26222:	88 23       	and	r24, r24
   26224:	41 f0       	breq	.+16     	; 0x26236 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0xd6>
   26226:	85 3e       	cpi	r24, 0xE5	; 229
   26228:	09 f0       	breq	.+2      	; 0x2622c <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0xcc>
   2622a:	4c c0       	rjmp	.+152    	; 0x262c4 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x164>
      // remember first empty slot
      if (!emptyFound) {
   2622c:	77 20       	and	r7, r7
   2622e:	29 f0       	breq	.+10     	; 0x2623a <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0xda>
  return false;
}
//------------------------------------------------------------------------------
// open with filename in dname
bool SdBaseFile::open(SdBaseFile* dirFile,
  const uint8_t dname[11], uint8_t oflag) {
   26230:	77 24       	eor	r7, r7
   26232:	73 94       	inc	r7
   26234:	b5 cf       	rjmp	.-150    	; 0x261a0 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x40>
    p = dirFile->readDirCache();
    if (!p) goto fail;

    if (p->name[0] == DIR_NAME_FREE || p->name[0] == DIR_NAME_DELETED) {
      // remember first empty slot
      if (!emptyFound) {
   26236:	71 10       	cpse	r7, r1
   26238:	0e c0       	rjmp	.+28     	; 0x26256 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0xf6>
        dirBlock_ = dirFile->vol_->cacheBlockNumber();
   2623a:	80 91 3a 0e 	lds	r24, 0x0E3A	; 0x800e3a <SdVolume::cacheBlockNumber_>
   2623e:	90 91 3b 0e 	lds	r25, 0x0E3B	; 0x800e3b <SdVolume::cacheBlockNumber_+0x1>
   26242:	a0 91 3c 0e 	lds	r26, 0x0E3C	; 0x800e3c <SdVolume::cacheBlockNumber_+0x2>
   26246:	b0 91 3d 0e 	lds	r27, 0x0E3D	; 0x800e3d <SdVolume::cacheBlockNumber_+0x3>
   2624a:	f8 01       	movw	r30, r16
   2624c:	84 87       	std	Z+12, r24	; 0x0c
   2624e:	95 87       	std	Z+13, r25	; 0x0d
   26250:	a6 87       	std	Z+14, r26	; 0x0e
   26252:	b7 87       	std	Z+15, r27	; 0x0f
        dirIndex_ = index;
   26254:	d0 8a       	std	Z+16, r13	; 0x10
        emptyFound = true;
      }
      // done if no entries follow
      if (p->name[0] == DIR_NAME_FREE) break;
   26256:	db 01       	movw	r26, r22
   26258:	8c 91       	ld	r24, X
   2625a:	81 11       	cpse	r24, r1
   2625c:	e9 cf       	rjmp	.-46     	; 0x26230 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0xd0>
   2625e:	77 24       	eor	r7, r7
   26260:	73 94       	inc	r7
  if (fileFound) {
    // don't open existing file if O_EXCL
    if (oflag & O_EXCL) goto fail;
  } else {
    // don't create unless O_CREAT and O_WRITE
    if (!(oflag & O_CREAT) || !(oflag & O_WRITE)) goto fail;
   26262:	8c 2d       	mov	r24, r12
   26264:	82 74       	andi	r24, 0x42	; 66
   26266:	82 34       	cpi	r24, 0x42	; 66
   26268:	09 f0       	breq	.+2      	; 0x2626c <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x10c>
   2626a:	b8 cf       	rjmp	.-144    	; 0x261dc <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x7c>
    if (emptyFound) {
   2626c:	77 20       	and	r7, r7
   2626e:	09 f4       	brne	.+2      	; 0x26272 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x112>
   26270:	a2 c0       	rjmp	.+324    	; 0x263b6 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x256>
      index = dirIndex_;
   26272:	f8 01       	movw	r30, r16
   26274:	d0 88       	ldd	r13, Z+16	; 0x10
      p = cacheDirEntry(SdVolume::CACHE_FOR_WRITE);
   26276:	61 e0       	ldi	r22, 0x01	; 1
   26278:	c8 01       	movw	r24, r16
   2627a:	0f 94 9a 2e 	call	0x25d34	; 0x25d34 <SdBaseFile::cacheDirEntry(unsigned char)>
      if (!p) goto fail;
   2627e:	00 97       	sbiw	r24, 0x00	; 0
   26280:	09 f4       	brne	.+2      	; 0x26284 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x124>
   26282:	ac cf       	rjmp	.-168    	; 0x261dc <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x7c>
      // use first entry in cluster
      p = dirFile->vol_->cache()->dir;
      index = 0;
    }
    // initialize as empty file
    memset(p, 0, sizeof(dir_t));
   26284:	20 e2       	ldi	r18, 0x20	; 32
   26286:	dc 01       	movw	r26, r24
   26288:	1d 92       	st	X+, r1
   2628a:	2a 95       	dec	r18
   2628c:	e9 f7       	brne	.-6      	; 0x26288 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x128>
    memcpy(p->name, dname, 11);
   2628e:	2b e0       	ldi	r18, 0x0B	; 11
   26290:	f5 01       	movw	r30, r10
   26292:	dc 01       	movw	r26, r24
   26294:	01 90       	ld	r0, Z+
   26296:	0d 92       	st	X+, r0
   26298:	2a 95       	dec	r18
   2629a:	e1 f7       	brne	.-8      	; 0x26294 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x134>
    if (dateTime_) {
      // call user date/time function
      dateTime_(&p->creationDate, &p->creationTime);
    } else {
      // use default date/time
      p->creationDate = FAT_DEFAULT_DATE;
   2629c:	21 e2       	ldi	r18, 0x21	; 33
   2629e:	38 e2       	ldi	r19, 0x28	; 40
   262a0:	fc 01       	movw	r30, r24
   262a2:	31 8b       	std	Z+17, r19	; 0x11
   262a4:	20 8b       	std	Z+16, r18	; 0x10
      p->creationTime = FAT_DEFAULT_TIME;
   262a6:	40 e0       	ldi	r20, 0x00	; 0
   262a8:	58 e0       	ldi	r21, 0x08	; 8
   262aa:	57 87       	std	Z+15, r21	; 0x0f
   262ac:	46 87       	std	Z+14, r20	; 0x0e
    }
    p->lastAccessDate = p->creationDate;
   262ae:	33 8b       	std	Z+19, r19	; 0x13
   262b0:	22 8b       	std	Z+18, r18	; 0x12
    p->lastWriteDate = p->creationDate;
   262b2:	31 8f       	std	Z+25, r19	; 0x19
   262b4:	20 8f       	std	Z+24, r18	; 0x18
    p->lastWriteTime = p->creationTime;
   262b6:	57 8b       	std	Z+23, r21	; 0x17
   262b8:	46 8b       	std	Z+22, r20	; 0x16

    // write entry to SD
    if (!dirFile->vol_->cacheFlush()) goto fail;
   262ba:	0f 94 8e 29 	call	0x2531c	; 0x2531c <SdVolume::cacheFlush()>
   262be:	81 11       	cpse	r24, r1
   262c0:	09 c0       	rjmp	.+18     	; 0x262d4 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x174>
   262c2:	8c cf       	rjmp	.-232    	; 0x261dc <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x7c>
        dirIndex_ = index;
        emptyFound = true;
      }
      // done if no entries follow
      if (p->name[0] == DIR_NAME_FREE) break;
    } else if (!memcmp(dname, p->name, 11)) {
   262c4:	4b e0       	ldi	r20, 0x0B	; 11
   262c6:	50 e0       	ldi	r21, 0x00	; 0
   262c8:	c5 01       	movw	r24, r10
   262ca:	0f 94 fc a9 	call	0x353f8	; 0x353f8 <memcmp>
   262ce:	89 2b       	or	r24, r25
   262d0:	09 f0       	breq	.+2      	; 0x262d4 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x174>
   262d2:	66 cf       	rjmp	.-308    	; 0x261a0 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x40>
}
//------------------------------------------------------------------------------
// open a cached directory entry. Assumes vol_ is initialized
bool SdBaseFile::openCachedEntry(uint8_t dirIndex, uint8_t oflag) {
  // location of entry in cache
  dir_t* p = &vol_->cache()->dir[dirIndex];
   262d4:	f0 e2       	ldi	r31, 0x20	; 32
   262d6:	df 9e       	mul	r13, r31
   262d8:	d0 01       	movw	r26, r0
   262da:	11 24       	eor	r1, r1
   262dc:	9d 01       	movw	r18, r26
   262de:	2a 5b       	subi	r18, 0xBA	; 186
   262e0:	31 4f       	sbci	r19, 0xF1	; 241

  // write or truncate is an error for a directory or read-only file
  if (p->attributes & (DIR_ATT_READ_ONLY | DIR_ATT_DIRECTORY)) {
   262e2:	f9 01       	movw	r30, r18
   262e4:	83 85       	ldd	r24, Z+11	; 0x0b
   262e6:	81 71       	andi	r24, 0x11	; 17
   262e8:	21 f0       	breq	.+8      	; 0x262f2 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x192>
    if (oflag & (O_WRITE | O_TRUNC)) goto fail;
   262ea:	8c 2d       	mov	r24, r12
   262ec:	82 71       	andi	r24, 0x12	; 18
   262ee:	09 f0       	breq	.+2      	; 0x262f2 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x192>
   262f0:	fc c0       	rjmp	.+504    	; 0x264ea <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x38a>
}
//------------------------------------------------------------------------------
// open a cached directory entry. Assumes vol_ is initialized
bool SdBaseFile::openCachedEntry(uint8_t dirIndex, uint8_t oflag) {
  // location of entry in cache
  dir_t* p = &vol_->cache()->dir[dirIndex];
   262f2:	f8 01       	movw	r30, r16
   262f4:	81 8d       	ldd	r24, Z+25	; 0x19
   262f6:	92 8d       	ldd	r25, Z+26	; 0x1a
  // write or truncate is an error for a directory or read-only file
  if (p->attributes & (DIR_ATT_READ_ONLY | DIR_ATT_DIRECTORY)) {
    if (oflag & (O_WRITE | O_TRUNC)) goto fail;
  }
  // remember location of directory entry on SD
  dirBlock_ = vol_->cacheBlockNumber();
   262f8:	40 91 3a 0e 	lds	r20, 0x0E3A	; 0x800e3a <SdVolume::cacheBlockNumber_>
   262fc:	50 91 3b 0e 	lds	r21, 0x0E3B	; 0x800e3b <SdVolume::cacheBlockNumber_+0x1>
   26300:	60 91 3c 0e 	lds	r22, 0x0E3C	; 0x800e3c <SdVolume::cacheBlockNumber_+0x2>
   26304:	70 91 3d 0e 	lds	r23, 0x0E3D	; 0x800e3d <SdVolume::cacheBlockNumber_+0x3>
   26308:	44 87       	std	Z+12, r20	; 0x0c
   2630a:	55 87       	std	Z+13, r21	; 0x0d
   2630c:	66 87       	std	Z+14, r22	; 0x0e
   2630e:	77 87       	std	Z+15, r23	; 0x0f
  dirIndex_ = dirIndex;
   26310:	d0 8a       	std	Z+16, r13	; 0x10

  // copy first cluster number for directory fields
  firstCluster_ = (uint32_t)p->firstClusterHigh << 16;
   26312:	fd 01       	movw	r30, r26
   26314:	ea 5b       	subi	r30, 0xBA	; 186
   26316:	f1 4f       	sbci	r31, 0xF1	; 241
   26318:	44 88       	ldd	r4, Z+20	; 0x14
   2631a:	55 88       	ldd	r5, Z+21	; 0x15
   2631c:	71 2c       	mov	r7, r1
   2631e:	61 2c       	mov	r6, r1
   26320:	32 01       	movw	r6, r4
   26322:	55 24       	eor	r5, r5
   26324:	44 24       	eor	r4, r4
   26326:	d8 01       	movw	r26, r16
   26328:	55 96       	adiw	r26, 0x15	; 21
   2632a:	4d 92       	st	X+, r4
   2632c:	5d 92       	st	X+, r5
   2632e:	6d 92       	st	X+, r6
   26330:	7c 92       	st	X, r7
   26332:	58 97       	sbiw	r26, 0x18	; 24
  firstCluster_ |= p->firstClusterLow;
   26334:	42 8d       	ldd	r20, Z+26	; 0x1a
   26336:	53 8d       	ldd	r21, Z+27	; 0x1b
   26338:	70 e0       	ldi	r23, 0x00	; 0
   2633a:	60 e0       	ldi	r22, 0x00	; 0
   2633c:	44 29       	or	r20, r4
   2633e:	55 29       	or	r21, r5
   26340:	66 29       	or	r22, r6
   26342:	77 29       	or	r23, r7
   26344:	55 96       	adiw	r26, 0x15	; 21
   26346:	4d 93       	st	X+, r20
   26348:	5d 93       	st	X+, r21
   2634a:	6d 93       	st	X+, r22
   2634c:	7c 93       	st	X, r23
   2634e:	58 97       	sbiw	r26, 0x18	; 24
   26350:	d9 01       	movw	r26, r18
   26352:	1b 96       	adiw	r26, 0x0b	; 11
   26354:	2c 91       	ld	r18, X
   26356:	28 71       	andi	r18, 0x18	; 24

  // make sure it is a normal file or subdirectory
  if (DIR_IS_FILE(p)) {
   26358:	09 f0       	breq	.+2      	; 0x2635c <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x1fc>
   2635a:	b9 c0       	rjmp	.+370    	; 0x264ce <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x36e>
    fileSize_ = p->fileSize;
   2635c:	84 8d       	ldd	r24, Z+28	; 0x1c
   2635e:	95 8d       	ldd	r25, Z+29	; 0x1d
   26360:	a6 8d       	ldd	r26, Z+30	; 0x1e
   26362:	b7 8d       	ldd	r27, Z+31	; 0x1f
   26364:	f8 01       	movw	r30, r16
   26366:	81 8b       	std	Z+17, r24	; 0x11
   26368:	92 8b       	std	Z+18, r25	; 0x12
   2636a:	a3 8b       	std	Z+19, r26	; 0x13
   2636c:	b4 8b       	std	Z+20, r27	; 0x14
    type_ = FAT_FILE_TYPE_NORMAL;
   2636e:	81 e0       	ldi	r24, 0x01	; 1
   26370:	83 83       	std	Z+3, r24	; 0x03
    type_ = FAT_FILE_TYPE_SUBDIR;
  } else {
    goto fail;
  }
  // save open flags for read/write
  flags_ = oflag & F_OFLAG;
   26372:	8c 2d       	mov	r24, r12
   26374:	8f 70       	andi	r24, 0x0F	; 15
   26376:	f8 01       	movw	r30, r16
   26378:	81 83       	std	Z+1, r24	; 0x01

  // set to start of file
  curCluster_ = 0;
   2637a:	14 82       	std	Z+4, r1	; 0x04
   2637c:	15 82       	std	Z+5, r1	; 0x05
   2637e:	16 82       	std	Z+6, r1	; 0x06
   26380:	17 82       	std	Z+7, r1	; 0x07
  curPosition_ = 0;
   26382:	10 86       	std	Z+8, r1	; 0x08
   26384:	11 86       	std	Z+9, r1	; 0x09
   26386:	12 86       	std	Z+10, r1	; 0x0a
   26388:	13 86       	std	Z+11, r1	; 0x0b
  if ((oflag & O_TRUNC) && !truncate(0)) return false;
  return oflag & O_AT_END ? seekEnd(0) : true;
   2638a:	81 e0       	ldi	r24, 0x01	; 1
  flags_ = oflag & F_OFLAG;

  // set to start of file
  curCluster_ = 0;
  curPosition_ = 0;
  if ((oflag & O_TRUNC) && !truncate(0)) return false;
   2638c:	c4 fe       	sbrs	r12, 4
   2638e:	03 c0       	rjmp	.+6      	; 0x26396 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x236>
   26390:	c8 01       	movw	r24, r16
   26392:	0f 94 f8 68 	call	0x2d1f0	; 0x2d1f0 <SdBaseFile::truncate(unsigned long) [clone .constprop.239]>
  // open entry in cache
  return openCachedEntry(index, oflag);

 fail:
  return false;
}
   26396:	0f 90       	pop	r0
   26398:	df 91       	pop	r29
   2639a:	cf 91       	pop	r28
   2639c:	1f 91       	pop	r17
   2639e:	0f 91       	pop	r16
   263a0:	ff 90       	pop	r15
   263a2:	ef 90       	pop	r14
   263a4:	df 90       	pop	r13
   263a6:	cf 90       	pop	r12
   263a8:	bf 90       	pop	r11
   263aa:	af 90       	pop	r10
   263ac:	7f 90       	pop	r7
   263ae:	6f 90       	pop	r6
   263b0:	5f 90       	pop	r5
   263b2:	4f 90       	pop	r4
   263b4:	08 95       	ret
    if (emptyFound) {
      index = dirIndex_;
      p = cacheDirEntry(SdVolume::CACHE_FOR_WRITE);
      if (!p) goto fail;
    } else {
      if (dirFile->type_ == FAT_FILE_TYPE_ROOT_FIXED) goto fail;
   263b6:	d7 01       	movw	r26, r14
   263b8:	13 96       	adiw	r26, 0x03	; 3
   263ba:	8c 91       	ld	r24, X
   263bc:	13 97       	sbiw	r26, 0x03	; 3
   263be:	82 30       	cpi	r24, 0x02	; 2
   263c0:	09 f4       	brne	.+2      	; 0x263c4 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x264>
   263c2:	0c cf       	rjmp	.-488    	; 0x261dc <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x7c>
// Add a cluster to a directory file and zero the cluster.
// return with first block of cluster in the cache
bool SdBaseFile::addDirCluster() {
  uint32_t block;
  // max folder size
  if (fileSize_/sizeof(dir_t) >= 0XFFFF) goto fail;
   263c4:	51 96       	adiw	r26, 0x11	; 17
   263c6:	8d 91       	ld	r24, X+
   263c8:	9d 91       	ld	r25, X+
   263ca:	0d 90       	ld	r0, X+
   263cc:	bc 91       	ld	r27, X
   263ce:	a0 2d       	mov	r26, r0
   263d0:	80 3e       	cpi	r24, 0xE0	; 224
   263d2:	9f 4f       	sbci	r25, 0xFF	; 255
   263d4:	af 41       	sbci	r26, 0x1F	; 31
   263d6:	b1 05       	cpc	r27, r1
   263d8:	08 f0       	brcs	.+2      	; 0x263dc <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x27c>
   263da:	00 cf       	rjmp	.-512    	; 0x261dc <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x7c>

  if (!addCluster()) goto fail;
   263dc:	c7 01       	movw	r24, r14
   263de:	0f 94 9f 2d 	call	0x25b3e	; 0x25b3e <SdBaseFile::addCluster()>
   263e2:	88 23       	and	r24, r24
   263e4:	09 f4       	brne	.+2      	; 0x263e8 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x288>
   263e6:	fa ce       	rjmp	.-524    	; 0x261dc <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x7c>
  if (!vol_->cacheFlush()) goto fail;
   263e8:	0f 94 8e 29 	call	0x2531c	; 0x2531c <SdVolume::cacheFlush()>
   263ec:	88 23       	and	r24, r24
   263ee:	09 f4       	brne	.+2      	; 0x263f2 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x292>
   263f0:	f5 ce       	rjmp	.-534    	; 0x261dc <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x7c>

  block = vol_->clusterStartBlock(curCluster_);
   263f2:	d7 01       	movw	r26, r14
   263f4:	59 96       	adiw	r26, 0x19	; 25
   263f6:	ed 91       	ld	r30, X+
   263f8:	fc 91       	ld	r31, X
   263fa:	5a 97       	sbiw	r26, 0x1a	; 26
  //----------------------------------------------------------------------------
  bool allocContiguous(uint32_t count, uint32_t* curCluster);
  uint8_t blockOfCluster(uint32_t position) const {
          return (position >> 9) & (blocksPerCluster_ - 1);}
  uint32_t clusterStartBlock(uint32_t cluster) const {
           return dataStartBlock_ + ((cluster - 2) << clusterSizeShift_);}
   263fc:	14 96       	adiw	r26, 0x04	; 4
   263fe:	4d 90       	ld	r4, X+
   26400:	5d 90       	ld	r5, X+
   26402:	6d 90       	ld	r6, X+
   26404:	7c 90       	ld	r7, X
   26406:	17 97       	sbiw	r26, 0x07	; 7
   26408:	b2 e0       	ldi	r27, 0x02	; 2
   2640a:	4b 1a       	sub	r4, r27
   2640c:	51 08       	sbc	r5, r1
   2640e:	61 08       	sbc	r6, r1
   26410:	71 08       	sbc	r7, r1
   26412:	85 85       	ldd	r24, Z+13	; 0x0d
   26414:	04 c0       	rjmp	.+8      	; 0x2641e <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x2be>
   26416:	44 0c       	add	r4, r4
   26418:	55 1c       	adc	r5, r5
   2641a:	66 1c       	adc	r6, r6
   2641c:	77 1c       	adc	r7, r7
   2641e:	8a 95       	dec	r24
   26420:	d2 f7       	brpl	.-12     	; 0x26416 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x2b6>
   26422:	86 85       	ldd	r24, Z+14	; 0x0e
   26424:	97 85       	ldd	r25, Z+15	; 0x0f
   26426:	a0 89       	ldd	r26, Z+16	; 0x10
   26428:	b1 89       	ldd	r27, Z+17	; 0x11
   2642a:	48 0e       	add	r4, r24
   2642c:	59 1e       	adc	r5, r25
   2642e:	6a 1e       	adc	r6, r26
   26430:	7b 1e       	adc	r7, r27
  static bool cacheFlush();
  static bool cacheRawBlock(uint32_t blockNumber, bool dirty);
#endif  // USE_MULTIPLE_CARDS
  // used by SdBaseFile write to assign cache to SD location
  void cacheSetBlockNumber(uint32_t blockNumber, bool dirty) {
    cacheDirty_ = dirty;
   26432:	81 e0       	ldi	r24, 0x01	; 1
   26434:	80 93 42 0e 	sts	0x0E42, r24	; 0x800e42 <SdVolume::cacheDirty_>
    cacheBlockNumber_  = blockNumber;
   26438:	40 92 3a 0e 	sts	0x0E3A, r4	; 0x800e3a <SdVolume::cacheBlockNumber_>
   2643c:	50 92 3b 0e 	sts	0x0E3B, r5	; 0x800e3b <SdVolume::cacheBlockNumber_+0x1>
   26440:	60 92 3c 0e 	sts	0x0E3C, r6	; 0x800e3c <SdVolume::cacheBlockNumber_+0x2>
   26444:	70 92 3d 0e 	sts	0x0E3D, r7	; 0x800e3d <SdVolume::cacheBlockNumber_+0x3>

  // set cache to first block of cluster
  vol_->cacheSetBlockNumber(block, true);

  // zero first block of cluster
  memset(vol_->cacheBuffer_.data, 0, 512);
   26448:	e6 e4       	ldi	r30, 0x46	; 70
   2644a:	fe e0       	ldi	r31, 0x0E	; 14
   2644c:	80 e0       	ldi	r24, 0x00	; 0
   2644e:	92 e0       	ldi	r25, 0x02	; 2
   26450:	df 01       	movw	r26, r30
   26452:	9c 01       	movw	r18, r24
   26454:	1d 92       	st	X+, r1
   26456:	21 50       	subi	r18, 0x01	; 1
   26458:	30 40       	sbci	r19, 0x00	; 0
   2645a:	e1 f7       	brne	.-8      	; 0x26454 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x2f4>

  // zero rest of cluster
  for (uint8_t i = 1; i < vol_->blocksPerCluster_; i++) {
   2645c:	dd 24       	eor	r13, r13
   2645e:	d3 94       	inc	r13
   26460:	d7 01       	movw	r26, r14
   26462:	59 96       	adiw	r26, 0x19	; 25
   26464:	ed 91       	ld	r30, X+
   26466:	fc 91       	ld	r31, X
   26468:	84 81       	ldd	r24, Z+4	; 0x04
   2646a:	d8 16       	cp	r13, r24
   2646c:	98 f4       	brcc	.+38     	; 0x26494 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x334>
    return  cluster >= FAT32EOC_MIN;
  }
  bool readBlock(uint32_t block, uint8_t* dst) {
    return sdCard_->readBlock(block, dst);}
  bool writeBlock(uint32_t block, const uint8_t* dst) {
    return sdCard_->writeBlock(block, dst);
   2646e:	26 e4       	ldi	r18, 0x46	; 70
   26470:	3e e0       	ldi	r19, 0x0E	; 14
   26472:	b3 01       	movw	r22, r6
   26474:	a2 01       	movw	r20, r4
   26476:	4d 0d       	add	r20, r13
   26478:	51 1d       	adc	r21, r1
   2647a:	61 1d       	adc	r22, r1
   2647c:	71 1d       	adc	r23, r1
   2647e:	80 91 43 0e 	lds	r24, 0x0E43	; 0x800e43 <SdVolume::sdCard_>
   26482:	90 91 44 0e 	lds	r25, 0x0E44	; 0x800e44 <SdVolume::sdCard_+0x1>
   26486:	0f 94 2a 29 	call	0x25254	; 0x25254 <Sd2Card::writeBlock(unsigned long, unsigned char const*)>
    if (!vol_->writeBlock(block + i, vol_->cacheBuffer_.data)) goto fail;
   2648a:	88 23       	and	r24, r24
   2648c:	09 f4       	brne	.+2      	; 0x26490 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x330>
   2648e:	a6 ce       	rjmp	.-692    	; 0x261dc <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x7c>

  // zero first block of cluster
  memset(vol_->cacheBuffer_.data, 0, 512);

  // zero rest of cluster
  for (uint8_t i = 1; i < vol_->blocksPerCluster_; i++) {
   26490:	d3 94       	inc	r13
   26492:	e6 cf       	rjmp	.-52     	; 0x26460 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x300>
    if (!vol_->writeBlock(block + i, vol_->cacheBuffer_.data)) goto fail;
  }
  // Increase directory file size by cluster size
  fileSize_ += 512UL << vol_->clusterSizeShift_;
   26494:	25 85       	ldd	r18, Z+13	; 0x0d
   26496:	80 e0       	ldi	r24, 0x00	; 0
   26498:	92 e0       	ldi	r25, 0x02	; 2
   2649a:	a0 e0       	ldi	r26, 0x00	; 0
   2649c:	b0 e0       	ldi	r27, 0x00	; 0
   2649e:	04 c0       	rjmp	.+8      	; 0x264a8 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x348>
   264a0:	88 0f       	add	r24, r24
   264a2:	99 1f       	adc	r25, r25
   264a4:	aa 1f       	adc	r26, r26
   264a6:	bb 1f       	adc	r27, r27
   264a8:	2a 95       	dec	r18
   264aa:	d2 f7       	brpl	.-12     	; 0x264a0 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x340>
   264ac:	f7 01       	movw	r30, r14
   264ae:	41 89       	ldd	r20, Z+17	; 0x11
   264b0:	52 89       	ldd	r21, Z+18	; 0x12
   264b2:	63 89       	ldd	r22, Z+19	; 0x13
   264b4:	74 89       	ldd	r23, Z+20	; 0x14
   264b6:	84 0f       	add	r24, r20
   264b8:	95 1f       	adc	r25, r21
   264ba:	a6 1f       	adc	r26, r22
   264bc:	b7 1f       	adc	r27, r23
   264be:	81 8b       	std	Z+17, r24	; 0x11
   264c0:	92 8b       	std	Z+18, r25	; 0x12
   264c2:	a3 8b       	std	Z+19, r26	; 0x13
   264c4:	b4 8b       	std	Z+20, r27	; 0x14

      // add and zero cluster for dirFile - first cluster is in cache for write
      if (!dirFile->addDirCluster()) goto fail;

      // use first entry in cluster
      p = dirFile->vol_->cache()->dir;
   264c6:	86 e4       	ldi	r24, 0x46	; 70
   264c8:	9e e0       	ldi	r25, 0x0E	; 14
      index = 0;
   264ca:	d1 2c       	mov	r13, r1
   264cc:	db ce       	rjmp	.-586    	; 0x26284 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x124>

  // make sure it is a normal file or subdirectory
  if (DIR_IS_FILE(p)) {
    fileSize_ = p->fileSize;
    type_ = FAT_FILE_TYPE_NORMAL;
  } else if (DIR_IS_SUBDIR(p)) {
   264ce:	20 31       	cpi	r18, 0x10	; 16
   264d0:	61 f4       	brne	.+24     	; 0x264ea <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x38a>
    if (!vol_->chainSize(firstCluster_, &fileSize_)) goto fail;
   264d2:	98 01       	movw	r18, r16
   264d4:	2f 5e       	subi	r18, 0xEF	; 239
   264d6:	3f 4f       	sbci	r19, 0xFF	; 255
   264d8:	0f 94 d8 2b 	call	0x257b0	; 0x257b0 <SdVolume::chainSize(unsigned long, unsigned long*)>
   264dc:	88 23       	and	r24, r24
   264de:	29 f0       	breq	.+10     	; 0x264ea <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x38a>
    type_ = FAT_FILE_TYPE_SUBDIR;
   264e0:	84 e0       	ldi	r24, 0x04	; 4
   264e2:	d8 01       	movw	r26, r16
   264e4:	13 96       	adiw	r26, 0x03	; 3
   264e6:	8c 93       	st	X, r24
   264e8:	44 cf       	rjmp	.-376    	; 0x26372 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x212>
  curPosition_ = 0;
  if ((oflag & O_TRUNC) && !truncate(0)) return false;
  return oflag & O_AT_END ? seekEnd(0) : true;

 fail:
  type_ = FAT_FILE_TYPE_CLOSED;
   264ea:	d8 01       	movw	r26, r16
   264ec:	13 96       	adiw	r26, 0x03	; 3
   264ee:	1c 92       	st	X, r1
   264f0:	75 ce       	rjmp	.-790    	; 0x261dc <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)+0x7c>

000264f2 <prusa_statistics(unsigned char)>:
    }
}
#endif //PRUSA_M28


void prusa_statistics(uint8_t _message) {
   264f2:	cf 93       	push	r28
    const uint8_t _fil_nr = 0;
    if (!farm_mode)
   264f4:	90 91 60 0d 	lds	r25, 0x0D60	; 0x800d60 <farm_mode>
   264f8:	99 23       	and	r25, r25
   264fa:	09 f4       	brne	.+2      	; 0x264fe <prusa_statistics(unsigned char)+0xc>
   264fc:	f6 c0       	rjmp	.+492    	; 0x266ea <prusa_statistics(unsigned char)+0x1f8>
   264fe:	c8 2f       	mov	r28, r24
        return;

    switch (_message) {
   26500:	87 30       	cpi	r24, 0x07	; 7
   26502:	09 f4       	brne	.+2      	; 0x26506 <prusa_statistics(unsigned char)+0x14>
   26504:	be c0       	rjmp	.+380    	; 0x26682 <prusa_statistics(unsigned char)+0x190>
   26506:	08 f0       	brcs	.+2      	; 0x2650a <prusa_statistics(unsigned char)+0x18>
   26508:	46 c0       	rjmp	.+140    	; 0x26596 <prusa_statistics(unsigned char)+0xa4>
   2650a:	83 30       	cpi	r24, 0x03	; 3
   2650c:	09 f4       	brne	.+2      	; 0x26510 <prusa_statistics(unsigned char)+0x1e>
   2650e:	ed c0       	rjmp	.+474    	; 0x266ea <prusa_statistics(unsigned char)+0x1f8>
   26510:	80 f5       	brcc	.+96     	; 0x26572 <prusa_statistics(unsigned char)+0x80>
   26512:	81 30       	cpi	r24, 0x01	; 1
   26514:	09 f4       	brne	.+2      	; 0x26518 <prusa_statistics(unsigned char)+0x26>
   26516:	88 c0       	rjmp	.+272    	; 0x26628 <prusa_statistics(unsigned char)+0x136>
   26518:	08 f4       	brcc	.+2      	; 0x2651c <prusa_statistics(unsigned char)+0x2a>
   2651a:	60 c0       	rjmp	.+192    	; 0x265dc <prusa_statistics(unsigned char)+0xea>
   2651c:	8b e7       	ldi	r24, 0x7B	; 123
   2651e:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
        farm_timer = 1;
        break;

    case 2: // heating done
        SERIAL_ECHO('{');
        prusa_stat_printerstatus(3);
   26522:	83 e0       	ldi	r24, 0x03	; 3
   26524:	0f 94 a9 08 	call	0x21152	; 0x21152 <prusa_stat_printerstatus(unsigned char)>
        prusa_stat_farm_number();
   26528:	0f 94 50 08 	call	0x210a0	; 0x210a0 <prusa_stat_farm_number()>
   2652c:	8d e7       	ldi	r24, 0x7D	; 125
   2652e:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
}

void MarlinSerial::println(char c, int base)
{
  print(c, base);
  println();
   26532:	0e 94 bc 7a 	call	0xf578	; 0xf578 <MarlinSerial::println()>
        SERIAL_ECHOLN('}');
        status_number = 3;
   26536:	c3 e0       	ldi	r28, 0x03	; 3
   26538:	c0 93 bd 04 	sts	0x04BD, r28	; 0x8004bd <_ZL13status_number.lto_priv.492>
        farm_timer = 1;
   2653c:	81 e0       	ldi	r24, 0x01	; 1
   2653e:	80 93 74 02 	sts	0x0274, r24	; 0x800274 <farm_timer>

        if (IS_SD_PRINTING || (eFilamentAction != FilamentAction::None)) {
   26542:	80 91 d7 13 	lds	r24, 0x13D7	; 0x8013d7 <card+0x2>
   26546:	81 11       	cpse	r24, r1
   26548:	05 c0       	rjmp	.+10     	; 0x26554 <prusa_statistics(unsigned char)+0x62>
   2654a:	80 91 94 03 	lds	r24, 0x0394	; 0x800394 <eFilamentAction>
   2654e:	88 23       	and	r24, r24
   26550:	09 f4       	brne	.+2      	; 0x26554 <prusa_statistics(unsigned char)+0x62>
   26552:	78 c0       	rjmp	.+240    	; 0x26644 <prusa_statistics(unsigned char)+0x152>
}

void MarlinSerial::print(long n, int base)
{
  if (base == 0) {
    write(n);
   26554:	8b e7       	ldi	r24, 0x7B	; 123
   26556:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
            SERIAL_ECHO('{');
            prusa_stat_printerstatus(4);
   2655a:	84 e0       	ldi	r24, 0x04	; 4
   2655c:	0f 94 a9 08 	call	0x21152	; 0x21152 <prusa_stat_printerstatus(unsigned char)>
            prusa_stat_farm_number();
   26560:	0f 94 50 08 	call	0x210a0	; 0x210a0 <prusa_stat_farm_number()>
            status_number = 4;
   26564:	84 e0       	ldi	r24, 0x04	; 4
   26566:	80 93 bd 04 	sts	0x04BD, r24	; 0x8004bd <_ZL13status_number.lto_priv.492>
            SERIAL_ECHO('{');
            prusa_stat_printerstatus(3);
            prusa_stat_farm_number();
            status_number = 3;
        }
        farm_timer = 1;
   2656a:	81 e0       	ldi	r24, 0x01	; 1
        SERIAL_ECHOPGM("{[RES:1][FIL:");
        MYSERIAL.print(int(_fil_nr));
        SERIAL_ECHO(']');
        prusa_stat_printerstatus(status_number);
        prusa_stat_farm_number();
        farm_timer = 2;
   2656c:	80 93 74 02 	sts	0x0274, r24	; 0x800274 <farm_timer>
   26570:	1e c0       	rjmp	.+60     	; 0x265ae <prusa_statistics(unsigned char)+0xbc>
void prusa_statistics(uint8_t _message) {
    const uint8_t _fil_nr = 0;
    if (!farm_mode)
        return;

    switch (_message) {
   26572:	85 30       	cpi	r24, 0x05	; 5
   26574:	09 f4       	brne	.+2      	; 0x26578 <prusa_statistics(unsigned char)+0x86>
   26576:	71 c0       	rjmp	.+226    	; 0x2665a <prusa_statistics(unsigned char)+0x168>
        // must do a return here to prevent doing SERIAL_ECHOLN("}") at the very end of this function
        // saved a considerable amount of FLASH
        return;
        break;
    case 4: // print succesfull
        SERIAL_ECHOPGM("{[RES:1][FIL:");
   26578:	8d e7       	ldi	r24, 0x7D	; 125
   2657a:	99 e8       	ldi	r25, 0x89	; 137
void prusa_statistics(uint8_t _message) {
    const uint8_t _fil_nr = 0;
    if (!farm_mode)
        return;

    switch (_message) {
   2657c:	c6 30       	cpi	r28, 0x06	; 6
   2657e:	08 f4       	brcc	.+2      	; 0x26582 <prusa_statistics(unsigned char)+0x90>
   26580:	6e c0       	rjmp	.+220    	; 0x2665e <prusa_statistics(unsigned char)+0x16c>
        prusa_stat_printerstatus(status_number);
        prusa_stat_farm_number();
        farm_timer = 2;
        break;
    case 6: // print done
        SERIAL_ECHOPGM("{[PRN:8]");
   26582:	86 e6       	ldi	r24, 0x66	; 102
   26584:	99 e8       	ldi	r25, 0x89	; 137
   26586:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        prusa_stat_farm_number();
   2658a:	0f 94 50 08 	call	0x210a0	; 0x210a0 <prusa_stat_farm_number()>
        status_number = 8;
   2658e:	88 e0       	ldi	r24, 0x08	; 8
        farm_timer = 2;
        break;
    case 7:        // print done - stopped
        SERIAL_ECHOPGM("{[PRN:9]");
        prusa_stat_farm_number();
        status_number = 9;
   26590:	80 93 bd 04 	sts	0x04BD, r24	; 0x8004bd <_ZL13status_number.lto_priv.492>
   26594:	74 c0       	rjmp	.+232    	; 0x2667e <prusa_statistics(unsigned char)+0x18c>
void prusa_statistics(uint8_t _message) {
    const uint8_t _fil_nr = 0;
    if (!farm_mode)
        return;

    switch (_message) {
   26596:	86 31       	cpi	r24, 0x16	; 22
   26598:	09 f4       	brne	.+2      	; 0x2659c <prusa_statistics(unsigned char)+0xaa>
   2659a:	9b c0       	rjmp	.+310    	; 0x266d2 <prusa_statistics(unsigned char)+0x1e0>
   2659c:	70 f4       	brcc	.+28     	; 0x265ba <prusa_statistics(unsigned char)+0xc8>
   2659e:	84 31       	cpi	r24, 0x14	; 20
   265a0:	09 f4       	brne	.+2      	; 0x265a4 <prusa_statistics(unsigned char)+0xb2>
   265a2:	80 c0       	rjmp	.+256    	; 0x266a4 <prusa_statistics(unsigned char)+0x1b2>
   265a4:	08 f0       	brcs	.+2      	; 0x265a8 <prusa_statistics(unsigned char)+0xb6>
   265a6:	89 c0       	rjmp	.+274    	; 0x266ba <prusa_statistics(unsigned char)+0x1c8>
   265a8:	88 30       	cpi	r24, 0x08	; 8
   265aa:	09 f4       	brne	.+2      	; 0x265ae <prusa_statistics(unsigned char)+0xbc>
   265ac:	72 c0       	rjmp	.+228    	; 0x26692 <prusa_statistics(unsigned char)+0x1a0>
   265ae:	8d e7       	ldi	r24, 0x7D	; 125
   265b0:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
        prusa_stat_temperatures();
        prusa_stat_farm_number();
        break;
    }
    SERIAL_ECHOLN('}');
}
   265b4:	cf 91       	pop	r28
}

void MarlinSerial::println(char c, int base)
{
  print(c, base);
  println();
   265b6:	0c 94 bc 7a 	jmp	0xf578	; 0xf578 <MarlinSerial::println()>
void prusa_statistics(uint8_t _message) {
    const uint8_t _fil_nr = 0;
    if (!farm_mode)
        return;

    switch (_message) {
   265ba:	8b 35       	cpi	r24, 0x5B	; 91
   265bc:	09 f4       	brne	.+2      	; 0x265c0 <prusa_statistics(unsigned char)+0xce>
   265be:	91 c0       	rjmp	.+290    	; 0x266e2 <prusa_statistics(unsigned char)+0x1f0>
   265c0:	30 f4       	brcc	.+12     	; 0x265ce <prusa_statistics(unsigned char)+0xdc>
        prusa_stat_farm_number();
        status_number = 5;
        break;

    case 90: // Error - Thermal Runaway
        prusa_statistics_err('1');
   265c2:	81 e3       	ldi	r24, 0x31	; 49
void prusa_statistics(uint8_t _message) {
    const uint8_t _fil_nr = 0;
    if (!farm_mode)
        return;

    switch (_message) {
   265c4:	ca 35       	cpi	r28, 0x5A	; 90
   265c6:	99 f7       	brne	.-26     	; 0x265ae <prusa_statistics(unsigned char)+0xbc>
        break;
    case 92: // Error - Min temp
        prusa_statistics_err('3');
        break;
    case 93: // Error - Max temp
        prusa_statistics_err('4');
   265c8:	0f 94 b6 08 	call	0x2116c	; 0x2116c <prusa_statistics_err(char)>
   265cc:	f0 cf       	rjmp	.-32     	; 0x265ae <prusa_statistics(unsigned char)+0xbc>
void prusa_statistics(uint8_t _message) {
    const uint8_t _fil_nr = 0;
    if (!farm_mode)
        return;

    switch (_message) {
   265ce:	8c 35       	cpi	r24, 0x5C	; 92
   265d0:	09 f4       	brne	.+2      	; 0x265d4 <prusa_statistics(unsigned char)+0xe2>
   265d2:	89 c0       	rjmp	.+274    	; 0x266e6 <prusa_statistics(unsigned char)+0x1f4>
        break;
    case 92: // Error - Min temp
        prusa_statistics_err('3');
        break;
    case 93: // Error - Max temp
        prusa_statistics_err('4');
   265d4:	84 e3       	ldi	r24, 0x34	; 52
void prusa_statistics(uint8_t _message) {
    const uint8_t _fil_nr = 0;
    if (!farm_mode)
        return;

    switch (_message) {
   265d6:	cd 35       	cpi	r28, 0x5D	; 93
   265d8:	b9 f3       	breq	.-18     	; 0x265c8 <prusa_statistics(unsigned char)+0xd6>
   265da:	e9 cf       	rjmp	.-46     	; 0x265ae <prusa_statistics(unsigned char)+0xbc>
    case 0: // default message
        if (busy_state == PAUSED_FOR_USER) {
   265dc:	80 91 78 02 	lds	r24, 0x0278	; 0x800278 <busy_state>
   265e0:	84 30       	cpi	r24, 0x04	; 4
   265e2:	21 f4       	brne	.+8      	; 0x265ec <prusa_statistics(unsigned char)+0xfa>
            prusa_statistics_case0(15);
   265e4:	8f e0       	ldi	r24, 0x0F	; 15
        }
        else if (printingIsPaused()) {
            prusa_statistics_case0(14);
   265e6:	0f 94 7f 18 	call	0x230fe	; 0x230fe <prusa_statistics_case0(unsigned char)>
   265ea:	e1 cf       	rjmp	.-62     	; 0x265ae <prusa_statistics(unsigned char)+0xbc>
    switch (_message) {
    case 0: // default message
        if (busy_state == PAUSED_FOR_USER) {
            prusa_statistics_case0(15);
        }
        else if (printingIsPaused()) {
   265ec:	0e 94 35 66 	call	0xcc6a	; 0xcc6a <printingIsPaused()>
   265f0:	88 23       	and	r24, r24
   265f2:	11 f0       	breq	.+4      	; 0x265f8 <prusa_statistics(unsigned char)+0x106>
            prusa_statistics_case0(14);
   265f4:	8e e0       	ldi	r24, 0x0E	; 14
   265f6:	f7 cf       	rjmp	.-18     	; 0x265e6 <prusa_statistics(unsigned char)+0xf4>
        }
        else if (IS_SD_PRINTING || (eFilamentAction != FilamentAction::None)) {
   265f8:	80 91 d7 13 	lds	r24, 0x13D7	; 0x8013d7 <card+0x2>
   265fc:	81 11       	cpse	r24, r1
   265fe:	04 c0       	rjmp	.+8      	; 0x26608 <prusa_statistics(unsigned char)+0x116>
   26600:	80 91 94 03 	lds	r24, 0x0394	; 0x800394 <eFilamentAction>
   26604:	88 23       	and	r24, r24
   26606:	11 f0       	breq	.+4      	; 0x2660c <prusa_statistics(unsigned char)+0x11a>
            prusa_statistics_case0(4);
   26608:	84 e0       	ldi	r24, 0x04	; 4
   2660a:	ed cf       	rjmp	.-38     	; 0x265e6 <prusa_statistics(unsigned char)+0xf4>
}

void MarlinSerial::print(long n, int base)
{
  if (base == 0) {
    write(n);
   2660c:	8b e7       	ldi	r24, 0x7B	; 123
   2660e:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
        }
        else {
            SERIAL_ECHO('{');
            prusa_stat_printerstatus(1);
   26612:	81 e0       	ldi	r24, 0x01	; 1
   26614:	0f 94 a9 08 	call	0x21152	; 0x21152 <prusa_stat_printerstatus(unsigned char)>
            prusa_stat_farm_number();
   26618:	0f 94 50 08 	call	0x210a0	; 0x210a0 <prusa_stat_farm_number()>
            prusa_stat_diameter();
   2661c:	0f 94 c5 08 	call	0x2118a	; 0x2118a <prusa_stat_diameter()>
            status_number = 1;
   26620:	81 e0       	ldi	r24, 0x01	; 1
        prusa_stat_printerstatus(status_number);
        break;
    case 22: // waiting for filament change
        SERIAL_ECHOPGM("{[PRN:5]");
        prusa_stat_farm_number();
        status_number = 5;
   26622:	80 93 bd 04 	sts	0x04BD, r24	; 0x8004bd <_ZL13status_number.lto_priv.492>
   26626:	c3 cf       	rjmp	.-122    	; 0x265ae <prusa_statistics(unsigned char)+0xbc>
   26628:	8b e7       	ldi	r24, 0x7B	; 123
   2662a:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
        }
        break;

    case 1: // 1 heating
        SERIAL_ECHO('{');
        prusa_stat_printerstatus(2);
   2662e:	82 e0       	ldi	r24, 0x02	; 2
   26630:	0f 94 a9 08 	call	0x21152	; 0x21152 <prusa_stat_printerstatus(unsigned char)>
        prusa_stat_farm_number();
   26634:	0f 94 50 08 	call	0x210a0	; 0x210a0 <prusa_stat_farm_number()>
        status_number = 2;
   26638:	82 e0       	ldi	r24, 0x02	; 2
   2663a:	80 93 bd 04 	sts	0x04BD, r24	; 0x8004bd <_ZL13status_number.lto_priv.492>
        farm_timer = 1;
   2663e:	c0 93 74 02 	sts	0x0274, r28	; 0x800274 <farm_timer>
   26642:	b5 cf       	rjmp	.-150    	; 0x265ae <prusa_statistics(unsigned char)+0xbc>
   26644:	8b e7       	ldi	r24, 0x7B	; 123
   26646:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
            prusa_stat_farm_number();
            status_number = 4;
        }
        else {
            SERIAL_ECHO('{');
            prusa_stat_printerstatus(3);
   2664a:	83 e0       	ldi	r24, 0x03	; 3
   2664c:	0f 94 a9 08 	call	0x21152	; 0x21152 <prusa_stat_printerstatus(unsigned char)>
            prusa_stat_farm_number();
   26650:	0f 94 50 08 	call	0x210a0	; 0x210a0 <prusa_stat_farm_number()>
            status_number = 3;
   26654:	c0 93 bd 04 	sts	0x04BD, r28	; 0x8004bd <_ZL13status_number.lto_priv.492>
   26658:	88 cf       	rjmp	.-240    	; 0x2656a <prusa_statistics(unsigned char)+0x78>
        prusa_stat_printerstatus(status_number);
        prusa_stat_farm_number();
        farm_timer = 2;
        break;
    case 5: // print not succesfull
        SERIAL_ECHOPGM("{[RES:0][FIL:");
   2665a:	8f e6       	ldi	r24, 0x6F	; 111
   2665c:	99 e8       	ldi	r25, 0x89	; 137
        // must do a return here to prevent doing SERIAL_ECHOLN("}") at the very end of this function
        // saved a considerable amount of FLASH
        return;
        break;
    case 4: // print succesfull
        SERIAL_ECHOPGM("{[RES:1][FIL:");
   2665e:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   26662:	60 e0       	ldi	r22, 0x00	; 0
   26664:	70 e0       	ldi	r23, 0x00	; 0
   26666:	cb 01       	movw	r24, r22
   26668:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
   2666c:	8d e5       	ldi	r24, 0x5D	; 93
   2666e:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
        MYSERIAL.print(int(_fil_nr));
        SERIAL_ECHO(']');
        prusa_stat_printerstatus(status_number);
   26672:	80 91 bd 04 	lds	r24, 0x04BD	; 0x8004bd <_ZL13status_number.lto_priv.492>
   26676:	0f 94 a9 08 	call	0x21152	; 0x21152 <prusa_stat_printerstatus(unsigned char)>
        prusa_stat_farm_number();
   2667a:	0f 94 50 08 	call	0x210a0	; 0x210a0 <prusa_stat_farm_number()>
        farm_timer = 2;
   2667e:	82 e0       	ldi	r24, 0x02	; 2
   26680:	75 cf       	rjmp	.-278    	; 0x2656c <prusa_statistics(unsigned char)+0x7a>
        prusa_stat_farm_number();
        status_number = 8;
        farm_timer = 2;
        break;
    case 7:        // print done - stopped
        SERIAL_ECHOPGM("{[PRN:9]");
   26682:	8d e5       	ldi	r24, 0x5D	; 93
   26684:	99 e8       	ldi	r25, 0x89	; 137
   26686:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        prusa_stat_farm_number();
   2668a:	0f 94 50 08 	call	0x210a0	; 0x210a0 <prusa_stat_farm_number()>
        status_number = 9;
   2668e:	89 e0       	ldi	r24, 0x09	; 9
   26690:	7f cf       	rjmp	.-258    	; 0x26590 <prusa_statistics(unsigned char)+0x9e>
        farm_timer = 2;
        break;
    case 8: // printer started
        SERIAL_ECHOPGM("{[PRN:0]");
   26692:	84 e5       	ldi	r24, 0x54	; 84
   26694:	99 e8       	ldi	r25, 0x89	; 137
   26696:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        prusa_stat_farm_number();
   2669a:	0f 94 50 08 	call	0x210a0	; 0x210a0 <prusa_stat_farm_number()>
        status_number = 0;
   2669e:	10 92 bd 04 	sts	0x04BD, r1	; 0x8004bd <_ZL13status_number.lto_priv.492>
   266a2:	ed cf       	rjmp	.-38     	; 0x2667e <prusa_statistics(unsigned char)+0x18c>
   266a4:	8b e7       	ldi	r24, 0x7B	; 123
   266a6:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
        farm_timer = 2;
        break;
    case 20: // echo farm no
        SERIAL_ECHO('{');
        prusa_stat_printerstatus(status_number);
   266aa:	80 91 bd 04 	lds	r24, 0x04BD	; 0x8004bd <_ZL13status_number.lto_priv.492>
   266ae:	0f 94 a9 08 	call	0x21152	; 0x21152 <prusa_stat_printerstatus(unsigned char)>
        prusa_stat_farm_number();
   266b2:	0f 94 50 08 	call	0x210a0	; 0x210a0 <prusa_stat_farm_number()>
        farm_timer = 4;
   266b6:	84 e0       	ldi	r24, 0x04	; 4
   266b8:	59 cf       	rjmp	.-334    	; 0x2656c <prusa_statistics(unsigned char)+0x7a>
   266ba:	8b e7       	ldi	r24, 0x7B	; 123
   266bc:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
        break;
    case 21: // temperatures
        SERIAL_ECHO('{');
        prusa_stat_temperatures();
   266c0:	0f 94 6c 08 	call	0x210d8	; 0x210d8 <prusa_stat_temperatures()>
        prusa_stat_farm_number();
   266c4:	0f 94 50 08 	call	0x210a0	; 0x210a0 <prusa_stat_farm_number()>
        prusa_stat_printerstatus(status_number);
   266c8:	80 91 bd 04 	lds	r24, 0x04BD	; 0x8004bd <_ZL13status_number.lto_priv.492>
   266cc:	0f 94 a9 08 	call	0x21152	; 0x21152 <prusa_stat_printerstatus(unsigned char)>
   266d0:	6e cf       	rjmp	.-292    	; 0x265ae <prusa_statistics(unsigned char)+0xbc>
        break;
    case 22: // waiting for filament change
        SERIAL_ECHOPGM("{[PRN:5]");
   266d2:	8b e4       	ldi	r24, 0x4B	; 75
   266d4:	99 e8       	ldi	r25, 0x89	; 137
   266d6:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        prusa_stat_farm_number();
   266da:	0f 94 50 08 	call	0x210a0	; 0x210a0 <prusa_stat_farm_number()>
        status_number = 5;
   266de:	85 e0       	ldi	r24, 0x05	; 5
   266e0:	a0 cf       	rjmp	.-192    	; 0x26622 <prusa_statistics(unsigned char)+0x130>

    case 90: // Error - Thermal Runaway
        prusa_statistics_err('1');
        break;
    case 91: // Error - Thermal Runaway Preheat
        prusa_statistics_err('2');
   266e2:	82 e3       	ldi	r24, 0x32	; 50
   266e4:	71 cf       	rjmp	.-286    	; 0x265c8 <prusa_statistics(unsigned char)+0xd6>
        break;
    case 92: // Error - Min temp
        prusa_statistics_err('3');
   266e6:	83 e3       	ldi	r24, 0x33	; 51
   266e8:	6f cf       	rjmp	.-290    	; 0x265c8 <prusa_statistics(unsigned char)+0xd6>
        prusa_stat_temperatures();
        prusa_stat_farm_number();
        break;
    }
    SERIAL_ECHOLN('}');
}
   266ea:	cf 91       	pop	r28
   266ec:	08 95       	ret

000266ee <lcd_status_screen()>:
    lcd_status_message_idx = 0; // Re-draw message from beginning
}

// Main status screen. It's up to the implementation specific part to show what is needed. As this is very display dependent
void lcd_status_screen()                          // NOT static due to using inside "Marlin_main" module ("manage_inactivity()")
{
   266ee:	cf 92       	push	r12
   266f0:	df 92       	push	r13
   266f2:	ef 92       	push	r14
   266f4:	ff 92       	push	r15
   266f6:	0f 93       	push	r16
   266f8:	1f 93       	push	r17
   266fa:	cf 93       	push	r28
   266fc:	df 93       	push	r29
   266fe:	00 d0       	rcall	.+0      	; 0x26700 <lcd_status_screen()+0x12>
   26700:	00 d0       	rcall	.+0      	; 0x26702 <lcd_status_screen()+0x14>
   26702:	1f 92       	push	r1
   26704:	1f 92       	push	r1
   26706:	cd b7       	in	r28, 0x3d	; 61
   26708:	de b7       	in	r29, 0x3e	; 62
	static uint8_t lcd_status_update_delay = 0;
#ifdef ULTIPANEL_FEEDMULTIPLY
    if (lcd_encoder)
   2670a:	80 91 1e 06 	lds	r24, 0x061E	; 0x80061e <lcd_encoder>
   2670e:	90 91 1f 06 	lds	r25, 0x061F	; 0x80061f <lcd_encoder+0x1>
   26712:	00 97       	sbiw	r24, 0x00	; 0
   26714:	e1 f1       	breq	.+120    	; 0x2678e <lcd_status_screen()+0xa0>
    {
        const int16_t initial_feedmultiply = feedmultiply;
   26716:	20 91 8e 02 	lds	r18, 0x028E	; 0x80028e <feedmultiply>
   2671a:	30 91 8f 02 	lds	r19, 0x028F	; 0x80028f <feedmultiply+0x1>
        // Dead zone at 100% feedrate
        if ((feedmultiply < 100 && (feedmultiply + lcd_encoder) > 100) ||
   2671e:	24 36       	cpi	r18, 0x64	; 100
   26720:	31 05       	cpc	r19, r1
   26722:	4c f4       	brge	.+18     	; 0x26736 <lcd_status_screen()+0x48>
   26724:	ac 01       	movw	r20, r24
   26726:	42 0f       	add	r20, r18
   26728:	53 1f       	adc	r21, r19
   2672a:	45 36       	cpi	r20, 0x65	; 101
   2672c:	51 05       	cpc	r21, r1
   2672e:	6c f4       	brge	.+26     	; 0x2674a <lcd_status_screen()+0x5c>
            feedmultiply += lcd_encoder - ENCODER_FEEDRATE_DEADZONE;
        }
        else if (feedmultiply == 100 && lcd_encoder < -ENCODER_FEEDRATE_DEADZONE) {
            feedmultiply += lcd_encoder + ENCODER_FEEDRATE_DEADZONE;
        }
        else if (feedmultiply != 100) feedmultiply += lcd_encoder;
   26730:	82 0f       	add	r24, r18
   26732:	93 1f       	adc	r25, r19
   26734:	0c c0       	rjmp	.+24     	; 0x2674e <lcd_status_screen()+0x60>
#ifdef ULTIPANEL_FEEDMULTIPLY
    if (lcd_encoder)
    {
        const int16_t initial_feedmultiply = feedmultiply;
        // Dead zone at 100% feedrate
        if ((feedmultiply < 100 && (feedmultiply + lcd_encoder) > 100) ||
   26736:	24 36       	cpi	r18, 0x64	; 100
   26738:	31 05       	cpc	r19, r1
   2673a:	09 f4       	brne	.+2      	; 0x2673e <lcd_status_screen()+0x50>
   2673c:	55 c0       	rjmp	.+170    	; 0x267e8 <lcd_status_screen()+0xfa>
            (feedmultiply > 100 && (feedmultiply + lcd_encoder) < 100))
   2673e:	ac 01       	movw	r20, r24
   26740:	42 0f       	add	r20, r18
   26742:	53 1f       	adc	r21, r19
   26744:	44 36       	cpi	r20, 0x64	; 100
   26746:	51 05       	cpc	r21, r1
   26748:	9c f7       	brge	.-26     	; 0x26730 <lcd_status_screen()+0x42>
        {
            feedmultiply = 100;
   2674a:	84 e6       	ldi	r24, 0x64	; 100
   2674c:	90 e0       	ldi	r25, 0x00	; 0
            feedmultiply += lcd_encoder - ENCODER_FEEDRATE_DEADZONE;
        }
        else if (feedmultiply == 100 && lcd_encoder < -ENCODER_FEEDRATE_DEADZONE) {
            feedmultiply += lcd_encoder + ENCODER_FEEDRATE_DEADZONE;
        }
        else if (feedmultiply != 100) feedmultiply += lcd_encoder;
   2674e:	90 93 8f 02 	sts	0x028F, r25	; 0x80028f <feedmultiply+0x1>
   26752:	80 93 8e 02 	sts	0x028E, r24	; 0x80028e <feedmultiply>

        if (initial_feedmultiply != feedmultiply) {
   26756:	80 91 8e 02 	lds	r24, 0x028E	; 0x80028e <feedmultiply>
   2675a:	90 91 8f 02 	lds	r25, 0x028F	; 0x80028f <feedmultiply+0x1>
   2675e:	82 17       	cp	r24, r18
   26760:	93 07       	cpc	r25, r19
   26762:	a9 f0       	breq	.+42     	; 0x2678e <lcd_status_screen()+0xa0>
            feedmultiply = constrain(feedmultiply, 10, 999);
   26764:	88 3e       	cpi	r24, 0xE8	; 232
   26766:	53 e0       	ldi	r21, 0x03	; 3
   26768:	95 07       	cpc	r25, r21
   2676a:	14 f0       	brlt	.+4      	; 0x26770 <lcd_status_screen()+0x82>
   2676c:	87 ee       	ldi	r24, 0xE7	; 231
   2676e:	93 e0       	ldi	r25, 0x03	; 3
   26770:	8a 30       	cpi	r24, 0x0A	; 10
   26772:	91 05       	cpc	r25, r1
   26774:	14 f4       	brge	.+4      	; 0x2677a <lcd_status_screen()+0x8c>
   26776:	8a e0       	ldi	r24, 0x0A	; 10
   26778:	90 e0       	ldi	r25, 0x00	; 0
   2677a:	90 93 8f 02 	sts	0x028F, r25	; 0x80028f <feedmultiply+0x1>
   2677e:	80 93 8e 02 	sts	0x028E, r24	; 0x80028e <feedmultiply>
            lcd_encoder = 0; // Consume rotation event
   26782:	10 92 1f 06 	sts	0x061F, r1	; 0x80061f <lcd_encoder+0x1>
   26786:	10 92 1e 06 	sts	0x061E, r1	; 0x80061e <lcd_encoder>
            refresh_saved_feedrate_multiplier_in_ram();
   2678a:	0e 94 3d 64 	call	0xc87a	; 0xc87a <refresh_saved_feedrate_multiplier_in_ram()>
        }
    }
#endif //ULTIPANEL_FEEDMULTIPLY

	if (lcd_draw_update) {
   2678e:	80 91 59 02 	lds	r24, 0x0259	; 0x800259 <lcd_draw_update>
   26792:	81 11       	cpse	r24, r1
		// Update the status screen immediately
		lcd_status_update_delay = 0;
   26794:	10 92 0a 06 	sts	0x060A, r1	; 0x80060a <lcd_status_screen()::lcd_status_update_delay>
	}

	if (lcd_status_update_delay)
   26798:	10 91 0a 06 	lds	r17, 0x060A	; 0x80060a <lcd_status_screen()::lcd_status_update_delay>
   2679c:	11 23       	and	r17, r17
   2679e:	91 f1       	breq	.+100    	; 0x26804 <lcd_status_screen()+0x116>
		lcd_status_update_delay--;
   267a0:	2f ef       	ldi	r18, 0xFF	; 255
   267a2:	21 0f       	add	r18, r17
   267a4:	20 93 0a 06 	sts	0x060A, r18	; 0x80060a <lcd_status_screen()::lcd_status_update_delay>

		if (lcd_commands_type != LcdCommands::Idle)
			lcd_commands();
	}

    if (!menu_is_any_block() && lcd_clicked()) {
   267a8:	80 91 3a 12 	lds	r24, 0x123A	; 0x80123a <menu_block_mask>
   267ac:	81 11       	cpse	r24, r1
   267ae:	0d c0       	rjmp	.+26     	; 0x267ca <lcd_status_screen()+0xdc>
   267b0:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   267b4:	88 23       	and	r24, r24
   267b6:	49 f0       	breq	.+18     	; 0x267ca <lcd_status_screen()+0xdc>
		menu_depth = 0; //redundant, as already done in lcd_return_to_status(), just to be sure
   267b8:	10 92 df 03 	sts	0x03DF, r1	; 0x8003df <menu_depth>
		menu_submenu(lcd_main_menu);
   267bc:	60 e0       	ldi	r22, 0x00	; 0
   267be:	8a ef       	ldi	r24, 0xFA	; 250
   267c0:	98 ec       	ldi	r25, 0xC8	; 200
   267c2:	0e 94 dd 62 	call	0xc5ba	; 0xc5ba <menu_submenu(void (*)(), bool)>
		lcd_refresh(); // to maybe revive the LCD if static electricity killed it.
   267c6:	0e 94 9f 70 	call	0xe13e	; 0xe13e <lcd_refresh()>
	}
}
   267ca:	28 96       	adiw	r28, 0x08	; 8
   267cc:	0f b6       	in	r0, 0x3f	; 63
   267ce:	f8 94       	cli
   267d0:	de bf       	out	0x3e, r29	; 62
   267d2:	0f be       	out	0x3f, r0	; 63
   267d4:	cd bf       	out	0x3d, r28	; 61
   267d6:	df 91       	pop	r29
   267d8:	cf 91       	pop	r28
   267da:	1f 91       	pop	r17
   267dc:	0f 91       	pop	r16
   267de:	ff 90       	pop	r15
   267e0:	ef 90       	pop	r14
   267e2:	df 90       	pop	r13
   267e4:	cf 90       	pop	r12
   267e6:	08 95       	ret
        if ((feedmultiply < 100 && (feedmultiply + lcd_encoder) > 100) ||
            (feedmultiply > 100 && (feedmultiply + lcd_encoder) < 100))
        {
            feedmultiply = 100;
        }
        else if (feedmultiply == 100 && lcd_encoder > ENCODER_FEEDRATE_DEADZONE) {
   267e8:	8b 30       	cpi	r24, 0x0B	; 11
   267ea:	91 05       	cpc	r25, r1
   267ec:	1c f0       	brlt	.+6      	; 0x267f4 <lcd_status_screen()+0x106>
            feedmultiply += lcd_encoder - ENCODER_FEEDRATE_DEADZONE;
   267ee:	86 5a       	subi	r24, 0xA6	; 166
   267f0:	9f 4f       	sbci	r25, 0xFF	; 255
   267f2:	ad cf       	rjmp	.-166    	; 0x2674e <lcd_status_screen()+0x60>
        }
        else if (feedmultiply == 100 && lcd_encoder < -ENCODER_FEEDRATE_DEADZONE) {
   267f4:	86 3f       	cpi	r24, 0xF6	; 246
   267f6:	4f ef       	ldi	r20, 0xFF	; 255
   267f8:	94 07       	cpc	r25, r20
   267fa:	0c f0       	brlt	.+2      	; 0x267fe <lcd_status_screen()+0x110>
   267fc:	ac cf       	rjmp	.-168    	; 0x26756 <lcd_status_screen()+0x68>
            feedmultiply += lcd_encoder + ENCODER_FEEDRATE_DEADZONE;
   267fe:	82 59       	subi	r24, 0x92	; 146
   26800:	9f 4f       	sbci	r25, 0xFF	; 255
   26802:	a5 cf       	rjmp	.-182    	; 0x2674e <lcd_status_screen()+0x60>
	if (lcd_status_update_delay)
		lcd_status_update_delay--;
	else
	{	// Redraw the main screen every second (see LCD_UPDATE_INTERVAL).
		// This is easier then trying keep track of all things that change on the screen
		lcd_status_update_delay = 10;
   26804:	6a e0       	ldi	r22, 0x0A	; 10
   26806:	60 93 0a 06 	sts	0x060A, r22	; 0x80060a <lcd_status_screen()::lcd_status_update_delay>
		ReInitLCD++;
   2680a:	80 91 09 06 	lds	r24, 0x0609	; 0x800609 <ReInitLCD>
   2680e:	8f 5f       	subi	r24, 0xFF	; 255
   26810:	80 93 09 06 	sts	0x0609, r24	; 0x800609 <ReInitLCD>
		if (ReInitLCD == 30)
   26814:	8e 31       	cpi	r24, 0x1E	; 30
   26816:	09 f0       	breq	.+2      	; 0x2681a <lcd_status_screen()+0x12c>
   26818:	9f c0       	rjmp	.+318    	; 0x26958 <lcd_status_screen()+0x26a>
		{
			ReInitLCD = 0 ;
   2681a:	10 92 09 06 	sts	0x0609, r1	; 0x800609 <ReInitLCD>
#endif //DEBUG_DISABLE_LCD_STATUS_LINE
}

static void lcdui_refresh(uint8_t clear = true)
{
    clear ? lcd_refresh() : lcd_refresh_noclear();
   2681e:	0e 94 9f 70 	call	0xe13e	; 0xe13e <lcd_refresh()>
    lcd_status_message_idx = 0; // Re-draw message from beginning
   26822:	10 92 64 04 	sts	0x0464, r1	; 0x800464 <_ZL22lcd_status_message_idx.lto_priv.419>
//! F - feedrate symbol 	LCD_STR_FEEDRATE
//! t - clock symbol 		LCD_STR_THERMOMETER
//! @endcode
void lcdui_print_status_screen(void)
{
    lcd_frame_start();
   26826:	0e 94 e6 6e 	call	0xddcc	; 0xddcc <lcd_frame_start()>
	lcd_home(); //line 0
   2682a:	0e 94 1f 70 	call	0xe03e	; 0xe03e <lcd_home()>
  return current_temperature_bed;
};

// Doesn't save FLASH when FORCE_INLINE removed.
FORCE_INLINE float degTargetHotend(uint8_t extruder) {
  return target_temperature[extruder];
   2682e:	60 91 5d 12 	lds	r22, 0x125D	; 0x80125d <target_temperature>
   26832:	70 91 5e 12 	lds	r23, 0x125E	; 0x80125e <target_temperature+0x1>
   26836:	07 2e       	mov	r0, r23
   26838:	00 0c       	add	r0, r0
   2683a:	88 0b       	sbc	r24, r24
   2683c:	99 0b       	sbc	r25, r25
   2683e:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>

    //Print the hotend temperature (9 chars total)
	lcdui_print_temp(LCD_STR_THERMOMETER[0], (int)(degHotend(0) + 0.5), (int)(degTargetHotend(0) + 0.5));
   26842:	20 e0       	ldi	r18, 0x00	; 0
   26844:	30 e0       	ldi	r19, 0x00	; 0
   26846:	40 e0       	ldi	r20, 0x00	; 0
   26848:	5f e3       	ldi	r21, 0x3F	; 63
   2684a:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   2684e:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   26852:	6b 01       	movw	r12, r22
   26854:	20 e0       	ldi	r18, 0x00	; 0
   26856:	30 e0       	ldi	r19, 0x00	; 0
   26858:	40 e0       	ldi	r20, 0x00	; 0
   2685a:	5f e3       	ldi	r21, 0x3F	; 63
   2685c:	60 91 5a 0d 	lds	r22, 0x0D5A	; 0x800d5a <current_temperature>
   26860:	70 91 5b 0d 	lds	r23, 0x0D5B	; 0x800d5b <current_temperature+0x1>
   26864:	80 91 5c 0d 	lds	r24, 0x0D5C	; 0x800d5c <current_temperature+0x2>
   26868:	90 91 5d 0d 	lds	r25, 0x0D5D	; 0x800d5d <current_temperature+0x3>
   2686c:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   26870:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   26874:	a6 01       	movw	r20, r12
   26876:	82 e8       	ldi	r24, 0x82	; 130
   26878:	0f 94 9b 0c 	call	0x21936	; 0x21936 <lcdui_print_temp(char, int, int)>

	lcd_space(3); //3 spaces
   2687c:	83 e0       	ldi	r24, 0x03	; 3
   2687e:	0e 94 28 6f 	call	0xde50	; 0xde50 <lcd_space(unsigned char)>
}

// Print Z-coordinate (8 chars total)
void lcdui_print_Z_coord(void)
{
    if (custom_message_type == CustomMsg::MeshBedLeveling)
   26882:	80 91 5d 06 	lds	r24, 0x065D	; 0x80065d <custom_message_type>
   26886:	81 30       	cpi	r24, 0x01	; 1
   26888:	09 f0       	breq	.+2      	; 0x2688c <lcd_status_screen()+0x19e>
   2688a:	6e c0       	rjmp	.+220    	; 0x26968 <lcd_status_screen()+0x27a>
        lcd_puts_P(_N("Z   --- "));
   2688c:	8a e6       	ldi	r24, 0x6A	; 106
   2688e:	9a e6       	ldi	r25, 0x6A	; 106
   26890:	0e 94 1d 6f 	call	0xde3a	; 0xde3a <lcd_puts_P(char const*)>
	lcd_space(3); //3 spaces

    //Print Z-coordinate (8 chars total)
	lcdui_print_Z_coord();

    lcd_set_cursor(0, 1); //line 1
   26894:	61 e0       	ldi	r22, 0x01	; 1
   26896:	80 e0       	ldi	r24, 0x00	; 0
   26898:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
};

FORCE_INLINE float degTargetBed() {
  return target_temperature_bed;
   2689c:	60 91 59 12 	lds	r22, 0x1259	; 0x801259 <target_temperature_bed>
   268a0:	70 91 5a 12 	lds	r23, 0x125A	; 0x80125a <target_temperature_bed+0x1>
   268a4:	07 2e       	mov	r0, r23
   268a6:	00 0c       	add	r0, r0
   268a8:	88 0b       	sbc	r24, r24
   268aa:	99 0b       	sbc	r25, r25
   268ac:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>

	//Print the Bed temperature (9 chars total)
	lcdui_print_temp(LCD_STR_BEDTEMP[0], (int)(degBed() + 0.5), (int)(degTargetBed() + 0.5));
   268b0:	20 e0       	ldi	r18, 0x00	; 0
   268b2:	30 e0       	ldi	r19, 0x00	; 0
   268b4:	40 e0       	ldi	r20, 0x00	; 0
   268b6:	5f e3       	ldi	r21, 0x3F	; 63
   268b8:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   268bc:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   268c0:	6b 01       	movw	r12, r22
   268c2:	20 e0       	ldi	r18, 0x00	; 0
   268c4:	30 e0       	ldi	r19, 0x00	; 0
   268c6:	40 e0       	ldi	r20, 0x00	; 0
   268c8:	5f e3       	ldi	r21, 0x3F	; 63
   268ca:	60 91 bc 03 	lds	r22, 0x03BC	; 0x8003bc <current_temperature_bed>
   268ce:	70 91 bd 03 	lds	r23, 0x03BD	; 0x8003bd <current_temperature_bed+0x1>
   268d2:	80 91 be 03 	lds	r24, 0x03BE	; 0x8003be <current_temperature_bed+0x2>
   268d6:	90 91 bf 03 	lds	r25, 0x03BF	; 0x8003bf <current_temperature_bed+0x3>
   268da:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   268de:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   268e2:	a6 01       	movw	r20, r12
   268e4:	80 e8       	ldi	r24, 0x80	; 128
   268e6:	0f 94 9b 0c 	call	0x21936	; 0x21936 <lcdui_print_temp(char, int, int)>

	lcd_space(3); //3 spaces
   268ea:	83 e0       	ldi	r24, 0x03	; 3
   268ec:	0e 94 28 6f 	call	0xde50	; 0xde50 <lcd_space(unsigned char)>
#endif // PLANNER_DIAGNOSTICS

// Print feedrate (8 chars total)
void lcdui_print_feedrate(void)
{
	int chars = lcd_printf_P(_N(LCD_STR_FEEDRATE "%3d%%"), feedmultiply);
   268f0:	80 91 8f 02 	lds	r24, 0x028F	; 0x80028f <feedmultiply+0x1>
   268f4:	8f 93       	push	r24
   268f6:	80 91 8e 02 	lds	r24, 0x028E	; 0x80028e <feedmultiply>
   268fa:	8f 93       	push	r24
   268fc:	83 e7       	ldi	r24, 0x73	; 115
   268fe:	9a e6       	ldi	r25, 0x6A	; 106
   26900:	9f 93       	push	r25
   26902:	8f 93       	push	r24
   26904:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
	lcd_space(8 - chars);
   26908:	98 e0       	ldi	r25, 0x08	; 8
   2690a:	98 1b       	sub	r25, r24
   2690c:	89 2f       	mov	r24, r25
   2690e:	0e 94 28 6f 	call	0xde50	; 0xde50 <lcd_space(unsigned char)>
#else // PLANNER_DIAGNOSTICS
    //Print Feedrate (8 chars)
	lcdui_print_feedrate();
#endif // PLANNER_DIAGNOSTICS

	lcd_set_cursor(0, 2); //line 2
   26912:	62 e0       	ldi	r22, 0x02	; 2
   26914:	80 e0       	ldi	r24, 0x00	; 0
   26916:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
}

// Print percent done in form "USB---%", " SD---%", "   ---%" (7 chars total)
void lcdui_print_percent_done(void)
{
	const char* src = usb_timer.running()?_N(" HO"):(IS_SD_PRINTING?_N(" SD"):_N("   "));
   2691a:	0f 90       	pop	r0
   2691c:	0f 90       	pop	r0
   2691e:	0f 90       	pop	r0
   26920:	0f 90       	pop	r0
   26922:	80 91 42 12 	lds	r24, 0x1242	; 0x801242 <usb_timer>
   26926:	e0 90 d7 13 	lds	r14, 0x13D7	; 0x8013d7 <card+0x2>
   2692a:	81 11       	cpse	r24, r1
   2692c:	3e c0       	rjmp	.+124    	; 0x269aa <lcd_status_screen()+0x2bc>
   2692e:	26 e8       	ldi	r18, 0x86	; 134
   26930:	c2 2e       	mov	r12, r18
   26932:	2a e6       	ldi	r18, 0x6A	; 106
   26934:	d2 2e       	mov	r13, r18
   26936:	e1 10       	cpse	r14, r1
   26938:	3c c0       	rjmp	.+120    	; 0x269b2 <lcd_status_screen()+0x2c4>
   2693a:	8a e8       	ldi	r24, 0x8A	; 138
   2693c:	c8 2e       	mov	r12, r24
   2693e:	8a e6       	ldi	r24, 0x6A	; 106
   26940:	d8 2e       	mov	r13, r24
	bool num = IS_SD_PRINTING || (printer_active() && (print_percent_done_normal != PRINT_PERCENT_DONE_INIT));
   26942:	0e 94 91 66 	call	0xcd22	; 0xcd22 <printer_active()>
   26946:	f8 2e       	mov	r15, r24
   26948:	88 23       	and	r24, r24
   2694a:	d9 f1       	breq	.+118    	; 0x269c2 <lcd_status_screen()+0x2d4>
   2694c:	80 91 6f 02 	lds	r24, 0x026F	; 0x80026f <print_percent_done_normal>
   26950:	8f 3f       	cpi	r24, 0xFF	; 255
   26952:	89 f5       	brne	.+98     	; 0x269b6 <lcd_status_screen()+0x2c8>
   26954:	f1 2c       	mov	r15, r1
   26956:	35 c0       	rjmp	.+106    	; 0x269c2 <lcd_status_screen()+0x2d4>
			ReInitLCD = 0 ;
            lcdui_refresh();
		}
		else
		{
			if ((ReInitLCD % 10) == 0)
   26958:	0f 94 9b a4 	call	0x34936	; 0x34936 <__divmodqi4>
   2695c:	91 11       	cpse	r25, r1
   2695e:	63 cf       	rjmp	.-314    	; 0x26826 <lcd_status_screen()+0x138>
    lcd_begin(1);
}

void lcd_refresh_noclear(void)
{
    lcd_begin(0);
   26960:	80 e0       	ldi	r24, 0x00	; 0
   26962:	0e 94 5e 70 	call	0xe0bc	; 0xe0bc <lcd_begin(unsigned char) [clone .lto_priv.405]>
   26966:	5d cf       	rjmp	.-326    	; 0x26822 <lcd_status_screen()+0x134>
void lcdui_print_Z_coord(void)
{
    if (custom_message_type == CustomMsg::MeshBedLeveling)
        lcd_puts_P(_N("Z   --- "));
    else
		lcd_printf_P(_N("Z%6.2f%c"), current_position[Z_AXIS], axis_known_position[Z_AXIS]?' ':'?');
   26968:	80 91 3b 06 	lds	r24, 0x063B	; 0x80063b <axis_known_position+0x2>
   2696c:	88 23       	and	r24, r24
   2696e:	d9 f0       	breq	.+54     	; 0x269a6 <lcd_status_screen()+0x2b8>
   26970:	80 e2       	ldi	r24, 0x20	; 32
   26972:	1f 92       	push	r1
   26974:	8f 93       	push	r24
   26976:	80 91 6c 12 	lds	r24, 0x126C	; 0x80126c <current_position+0xb>
   2697a:	8f 93       	push	r24
   2697c:	80 91 6b 12 	lds	r24, 0x126B	; 0x80126b <current_position+0xa>
   26980:	8f 93       	push	r24
   26982:	80 91 6a 12 	lds	r24, 0x126A	; 0x80126a <current_position+0x9>
   26986:	8f 93       	push	r24
   26988:	80 91 69 12 	lds	r24, 0x1269	; 0x801269 <current_position+0x8>
   2698c:	8f 93       	push	r24
   2698e:	81 e6       	ldi	r24, 0x61	; 97
   26990:	9a e6       	ldi	r25, 0x6A	; 106
   26992:	9f 93       	push	r25
   26994:	8f 93       	push	r24
   26996:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
   2699a:	0f b6       	in	r0, 0x3f	; 63
   2699c:	f8 94       	cli
   2699e:	de bf       	out	0x3e, r29	; 62
   269a0:	0f be       	out	0x3f, r0	; 63
   269a2:	cd bf       	out	0x3d, r28	; 61
   269a4:	77 cf       	rjmp	.-274    	; 0x26894 <lcd_status_screen()+0x1a6>
   269a6:	8f e3       	ldi	r24, 0x3F	; 63
   269a8:	e4 cf       	rjmp	.-56     	; 0x26972 <lcd_status_screen()+0x284>
}

// Print percent done in form "USB---%", " SD---%", "   ---%" (7 chars total)
void lcdui_print_percent_done(void)
{
	const char* src = usb_timer.running()?_N(" HO"):(IS_SD_PRINTING?_N(" SD"):_N("   "));
   269aa:	9e e8       	ldi	r25, 0x8E	; 142
   269ac:	c9 2e       	mov	r12, r25
   269ae:	9a e6       	ldi	r25, 0x6A	; 106
   269b0:	d9 2e       	mov	r13, r25
	bool num = IS_SD_PRINTING || (printer_active() && (print_percent_done_normal != PRINT_PERCENT_DONE_INIT));
   269b2:	ee 20       	and	r14, r14
   269b4:	31 f2       	breq	.-116    	; 0x26942 <lcd_status_screen()+0x254>
	if (!num || heating_status != HeatingStatus::NO_HEATING) // either not printing or heating
   269b6:	80 91 cb 03 	lds	r24, 0x03CB	; 0x8003cb <heating_status>

// Print percent done in form "USB---%", " SD---%", "   ---%" (7 chars total)
void lcdui_print_percent_done(void)
{
	const char* src = usb_timer.running()?_N(" HO"):(IS_SD_PRINTING?_N(" SD"):_N("   "));
	bool num = IS_SD_PRINTING || (printer_active() && (print_percent_done_normal != PRINT_PERCENT_DONE_INIT));
   269ba:	ff 24       	eor	r15, r15
   269bc:	f3 94       	inc	r15
	if (!num || heating_status != HeatingStatus::NO_HEATING) // either not printing or heating
   269be:	88 23       	and	r24, r24
   269c0:	99 f1       	breq	.+102    	; 0x26a28 <lcd_status_screen()+0x33a>
	{
		const int8_t sheetNR = eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet));
   269c2:	81 ea       	ldi	r24, 0xA1	; 161
   269c4:	9d e0       	ldi	r25, 0x0D	; 13
   269c6:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   269ca:	08 2f       	mov	r16, r24
		const int8_t nextSheet = eeprom_next_initialized_sheet(sheetNR);
   269cc:	0e 94 96 78 	call	0xf12c	; 0xf12c <eeprom_next_initialized_sheet(signed char)>
		if ((nextSheet >= 0) && (sheetNR != nextSheet))
   269d0:	87 fd       	sbrc	r24, 7
   269d2:	2a c0       	rjmp	.+84     	; 0x26a28 <lcd_status_screen()+0x33a>
   269d4:	08 17       	cp	r16, r24
   269d6:	41 f1       	breq	.+80     	; 0x26a28 <lcd_status_screen()+0x33a>
		{
			char sheet[8];
			eeprom_read_block(sheet, EEPROM_Sheets_base->s[sheetNR].name, 7);
   269d8:	9b e0       	ldi	r25, 0x0B	; 11
   269da:	09 02       	muls	r16, r25
   269dc:	b0 01       	movw	r22, r0
   269de:	11 24       	eor	r1, r1
   269e0:	67 5b       	subi	r22, 0xB7	; 183
   269e2:	72 4f       	sbci	r23, 0xF2	; 242
   269e4:	47 e0       	ldi	r20, 0x07	; 7
   269e6:	50 e0       	ldi	r21, 0x00	; 0
   269e8:	8e 01       	movw	r16, r28
   269ea:	0f 5f       	subi	r16, 0xFF	; 255
   269ec:	1f 4f       	sbci	r17, 0xFF	; 255
   269ee:	c8 01       	movw	r24, r16
   269f0:	0f 94 d0 a3 	call	0x347a0	; 0x347a0 <eeprom_read_block>
			sheet[7] = '\0';
   269f4:	18 86       	std	Y+8, r1	; 0x08
			lcd_printf_P(PSTR("%-7s"),sheet);
   269f6:	1f 93       	push	r17
   269f8:	0f 93       	push	r16
   269fa:	87 e8       	ldi	r24, 0x87	; 135
   269fc:	97 e9       	ldi	r25, 0x97	; 151
        lcd_print(hostName); // Two characters
    } else {
        lcd_printf_P(PSTR("%3S"), src);
    }

    lcd_printf_P(num ? _N("%3d%%"):_N("---%%"), calc_percent_done());
   269fe:	9f 93       	push	r25
   26a00:	8f 93       	push	r24
   26a02:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
   26a06:	0f 90       	pop	r0
   26a08:	0f 90       	pop	r0
   26a0a:	0f 90       	pop	r0
   26a0c:	0f 90       	pop	r0
	lcd_set_cursor(0, 2); //line 2

	//Print SD status (7 chars)
	lcdui_print_percent_done();

    if (MMU2::mmu2.Enabled()) {
   26a0e:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   26a12:	81 30       	cpi	r24, 0x01	; 1
   26a14:	09 f0       	breq	.+2      	; 0x26a18 <lcd_status_screen()+0x32a>
   26a16:	5a c0       	rjmp	.+180    	; 0x26acc <lcd_status_screen()+0x3de>
        // Print extruder status (5 chars)
        lcd_space(5 - lcdui_print_extruder());
   26a18:	0f 94 e6 07 	call	0x20fcc	; 0x20fcc <lcdui_print_extruder()>
   26a1c:	95 e0       	ldi	r25, 0x05	; 5
   26a1e:	98 1b       	sub	r25, r24
   26a20:	89 2f       	mov	r24, r25
    } else if (farm_mode) {
        // Print farm number (5 chars)
        lcdui_print_farm();
    } else {
        lcd_space(5); // 5 spaces
   26a22:	0e 94 28 6f 	call	0xde50	; 0xde50 <lcd_space(unsigned char)>
   26a26:	5f c0       	rjmp	.+190    	; 0x26ae6 <lcd_status_screen()+0x3f8>
			lcd_printf_P(PSTR("%-7s"),sheet);
			return; //do not also print the percentage
		}
	}

    if (!IS_SD_PRINTING && M79_timer_get_status() && GetHostStatusScreenName())
   26a28:	e1 10       	cpse	r14, r1
   26a2a:	04 c0       	rjmp	.+8      	; 0x26a34 <lcd_status_screen()+0x346>
   26a2c:	80 91 8c 03 	lds	r24, 0x038C	; 0x80038c <_ZL9M79_timer.lto_priv.421>
   26a30:	81 11       	cpse	r24, r1
   26a32:	42 c0       	rjmp	.+132    	; 0x26ab8 <lcd_status_screen()+0x3ca>
        // Overwrite the name
        char * hostName = GetHostStatusScreenName();
        lcd_space(1);    // Blank space
        lcd_print(hostName); // Two characters
    } else {
        lcd_printf_P(PSTR("%3S"), src);
   26a34:	df 92       	push	r13
   26a36:	cf 92       	push	r12
   26a38:	83 e8       	ldi	r24, 0x83	; 131
   26a3a:	97 e9       	ldi	r25, 0x97	; 151
   26a3c:	9f 93       	push	r25
   26a3e:	8f 93       	push	r24
   26a40:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
   26a44:	0f 90       	pop	r0
   26a46:	0f 90       	pop	r0
   26a48:	0f 90       	pop	r0
   26a4a:	0f 90       	pop	r0
    else if (print_percent_done_silent <= 100)
    {
        percent_done = print_percent_done_silent;
    }
#else
    if (print_percent_done_normal <= 100)
   26a4c:	80 91 6f 02 	lds	r24, 0x026F	; 0x80026f <print_percent_done_normal>
   26a50:	85 36       	cpi	r24, 0x65	; 101
   26a52:	d0 f1       	brcs	.+116    	; 0x26ac8 <lcd_status_screen()+0x3da>
   26a54:	80 91 6a 16 	lds	r24, 0x166A	; 0x80166a <card+0x295>
   26a58:	88 23       	and	r24, r24
   26a5a:	19 f1       	breq	.+70     	; 0x26aa2 <lcd_status_screen()+0x3b4>
   26a5c:	80 91 e4 16 	lds	r24, 0x16E4	; 0x8016e4 <card+0x30f>
   26a60:	90 91 e5 16 	lds	r25, 0x16E5	; 0x8016e5 <card+0x310>
   26a64:	a0 91 e6 16 	lds	r26, 0x16E6	; 0x8016e6 <card+0x311>
   26a68:	b0 91 e7 16 	lds	r27, 0x16E7	; 0x8016e7 <card+0x312>
   26a6c:	00 97       	sbiw	r24, 0x00	; 0
   26a6e:	a1 05       	cpc	r26, r1
   26a70:	b1 05       	cpc	r27, r1
   26a72:	b9 f0       	breq	.+46     	; 0x26aa2 <lcd_status_screen()+0x3b4>
   26a74:	bc 01       	movw	r22, r24
   26a76:	cd 01       	movw	r24, r26
   26a78:	6d 59       	subi	r22, 0x9D	; 157
   26a7a:	7f 4f       	sbci	r23, 0xFF	; 255
   26a7c:	8f 4f       	sbci	r24, 0xFF	; 255
   26a7e:	9f 4f       	sbci	r25, 0xFF	; 255
   26a80:	24 e6       	ldi	r18, 0x64	; 100
   26a82:	30 e0       	ldi	r19, 0x00	; 0
   26a84:	40 e0       	ldi	r20, 0x00	; 0
   26a86:	50 e0       	ldi	r21, 0x00	; 0
   26a88:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
   26a8c:	60 91 eb 16 	lds	r22, 0x16EB	; 0x8016eb <card+0x316>
   26a90:	70 91 ec 16 	lds	r23, 0x16EC	; 0x8016ec <card+0x317>
   26a94:	80 91 ed 16 	lds	r24, 0x16ED	; 0x8016ed <card+0x318>
   26a98:	90 91 ee 16 	lds	r25, 0x16EE	; 0x8016ee <card+0x319>
   26a9c:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
   26aa0:	12 2f       	mov	r17, r18
    }

    lcd_printf_P(num ? _N("%3d%%"):_N("---%%"), calc_percent_done());
   26aa2:	21 2f       	mov	r18, r17
   26aa4:	30 e0       	ldi	r19, 0x00	; 0
   26aa6:	80 e8       	ldi	r24, 0x80	; 128
   26aa8:	9a e6       	ldi	r25, 0x6A	; 106
   26aaa:	f1 10       	cpse	r15, r1
   26aac:	02 c0       	rjmp	.+4      	; 0x26ab2 <lcd_status_screen()+0x3c4>
   26aae:	8a e7       	ldi	r24, 0x7A	; 122
   26ab0:	9a e6       	ldi	r25, 0x6A	; 106
   26ab2:	3f 93       	push	r19
   26ab4:	2f 93       	push	r18
   26ab6:	a3 cf       	rjmp	.-186    	; 0x269fe <lcd_status_screen()+0x310>

    if (!IS_SD_PRINTING && M79_timer_get_status() && GetHostStatusScreenName())
    {
        // Overwrite the name
        char * hostName = GetHostStatusScreenName();
        lcd_space(1);    // Blank space
   26ab8:	81 e0       	ldi	r24, 0x01	; 1
   26aba:	0e 94 28 6f 	call	0xde50	; 0xde50 <lcd_space(unsigned char)>
        lcd_print(hostName); // Two characters
   26abe:	85 e0       	ldi	r24, 0x05	; 5
   26ac0:	96 e0       	ldi	r25, 0x06	; 6
   26ac2:	0e 94 5f 73 	call	0xe6be	; 0xe6be <lcd_print(char const*)>
   26ac6:	c2 cf       	rjmp	.-124    	; 0x26a4c <lcd_status_screen()+0x35e>
   26ac8:	18 2f       	mov	r17, r24
   26aca:	eb cf       	rjmp	.-42     	; 0x26aa2 <lcd_status_screen()+0x3b4>
	lcdui_print_percent_done();

    if (MMU2::mmu2.Enabled()) {
        // Print extruder status (5 chars)
        lcd_space(5 - lcdui_print_extruder());
    } else if (farm_mode) {
   26acc:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   26ad0:	88 23       	and	r24, r24
   26ad2:	09 f4       	brne	.+2      	; 0x26ad6 <lcd_status_screen()+0x3e8>
   26ad4:	a5 c0       	rjmp	.+330    	; 0x26c20 <lcd_status_screen()+0x532>
}

// Print farm number (5 chars total)
static void lcdui_print_farm(void)
{
	lcd_printf_P(_N(" FRM "));
   26ad6:	82 e9       	ldi	r24, 0x92	; 146
   26ad8:	9a e6       	ldi	r25, 0x6A	; 106
   26ada:	9f 93       	push	r25
   26adc:	8f 93       	push	r24
   26ade:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
   26ae2:	0f 90       	pop	r0
   26ae4:	0f 90       	pop	r0
void lcdui_print_time(void)
{
    static uint8_t clock_interval; // max value is 10: CLOCK_INTERVAL_TIME * 2
    //if remaining print time estimation is available print it else print elapsed time
    int chars = 0;
    if (printer_active()) {
   26ae6:	0e 94 91 66 	call	0xcd22	; 0xcd22 <printer_active()>
   26aea:	88 23       	and	r24, r24
   26aec:	09 f4       	brne	.+2      	; 0x26af0 <lcd_status_screen()+0x402>
   26aee:	ac c0       	rjmp	.+344    	; 0x26c48 <lcd_status_screen()+0x55a>
            if (print_time_to_change_silent != PRINT_TIME_REMAINING_INIT)
                print_tc = print_time_to_change_silent;
//#endif //CLOCK_INTERVAL_TIME
        } else {
#endif //TMC2130
            if (print_time_remaining_normal != PRINT_TIME_REMAINING_INIT)
   26af0:	c0 90 72 02 	lds	r12, 0x0272	; 0x800272 <print_time_remaining_normal>
   26af4:	d0 90 73 02 	lds	r13, 0x0273	; 0x800273 <print_time_remaining_normal+0x1>
                print_tr = print_time_remaining_normal;
//#ifdef CLOCK_INTERVAL_TIME
            if (print_time_to_change_normal != PRINT_TIME_REMAINING_INIT)
   26af8:	e0 90 70 02 	lds	r14, 0x0270	; 0x800270 <print_time_to_change_normal>
   26afc:	f0 90 71 02 	lds	r15, 0x0271	; 0x800271 <print_time_to_change_normal+0x1>
#ifdef TMC2130
        }
#endif //TMC2130

//#ifdef CLOCK_INTERVAL_TIME
        if (clock_interval == CLOCK_INTERVAL_TIME*2)
   26b00:	80 91 08 06 	lds	r24, 0x0608	; 0x800608 <lcdui_print_time()::clock_interval>
   26b04:	8a 30       	cpi	r24, 0x0A	; 10
   26b06:	11 f4       	brne	.+4      	; 0x26b0c <lcd_status_screen()+0x41e>
            clock_interval = 0;
   26b08:	10 92 08 06 	sts	0x0608, r1	; 0x800608 <lcdui_print_time()::clock_interval>

        clock_interval++;
   26b0c:	80 91 08 06 	lds	r24, 0x0608	; 0x800608 <lcdui_print_time()::clock_interval>
   26b10:	8f 5f       	subi	r24, 0xFF	; 255
   26b12:	80 93 08 06 	sts	0x0608, r24	; 0x800608 <lcdui_print_time()::clock_interval>

        if (print_tc != PRINT_TIME_REMAINING_INIT && clock_interval > CLOCK_INTERVAL_TIME) {
   26b16:	2f ef       	ldi	r18, 0xFF	; 255
   26b18:	e2 16       	cp	r14, r18
   26b1a:	f2 06       	cpc	r15, r18
   26b1c:	21 f0       	breq	.+8      	; 0x26b26 <lcd_status_screen()+0x438>
   26b1e:	97 01       	movw	r18, r14
            print_t = print_tc;
            suff = 'C';
   26b20:	13 e4       	ldi	r17, 0x43	; 67
        if (clock_interval == CLOCK_INTERVAL_TIME*2)
            clock_interval = 0;

        clock_interval++;

        if (print_tc != PRINT_TIME_REMAINING_INIT && clock_interval > CLOCK_INTERVAL_TIME) {
   26b22:	86 30       	cpi	r24, 0x06	; 6
   26b24:	70 f4       	brcc	.+28     	; 0x26b42 <lcd_status_screen()+0x454>
            print_t = print_tc;
            suff = 'C';
        } else
//#endif //CLOCK_INTERVAL_TIME
        if (print_tr != PRINT_TIME_REMAINING_INIT) {
   26b26:	3f ef       	ldi	r19, 0xFF	; 255
   26b28:	c3 16       	cp	r12, r19
   26b2a:	d3 06       	cpc	r13, r19
   26b2c:	09 f0       	breq	.+2      	; 0x26b30 <lcd_status_screen()+0x442>
   26b2e:	7a c0       	rjmp	.+244    	; 0x26c24 <lcd_status_screen()+0x536>
            print_t = print_tr;
            suff = 'R';
        } else
            print_t = print_job_timer.duration() / 60;
   26b30:	0f 94 6d 17 	call	0x22eda	; 0x22eda <Stopwatch::duration()>
   26b34:	2c e3       	ldi	r18, 0x3C	; 60
   26b36:	30 e0       	ldi	r19, 0x00	; 0
   26b38:	40 e0       	ldi	r20, 0x00	; 0
   26b3a:	50 e0       	ldi	r21, 0x00	; 0
   26b3c:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
    int chars = 0;
    if (printer_active()) {
        uint16_t print_t = PRINT_TIME_REMAINING_INIT;  // unit: minutes
        uint16_t print_tr = PRINT_TIME_REMAINING_INIT; // unit: minutes
        uint16_t print_tc = PRINT_TIME_REMAINING_INIT; // unit: minutes
        char suff = ' ';
   26b40:	10 e2       	ldi	r17, 0x20	; 32
            print_t = print_tr;
            suff = 'R';
        } else
            print_t = print_job_timer.duration() / 60;

        if (feedmultiply != 100 && (print_t == print_tr || print_t == print_tc)) {
   26b42:	40 91 8e 02 	lds	r20, 0x028E	; 0x80028e <feedmultiply>
   26b46:	50 91 8f 02 	lds	r21, 0x028F	; 0x80028f <feedmultiply+0x1>
   26b4a:	44 36       	cpi	r20, 0x64	; 100
   26b4c:	51 05       	cpc	r21, r1
   26b4e:	09 f4       	brne	.+2      	; 0x26b52 <lcd_status_screen()+0x464>
   26b50:	6c c0       	rjmp	.+216    	; 0x26c2a <lcd_status_screen()+0x53c>
   26b52:	c2 16       	cp	r12, r18
   26b54:	d3 06       	cpc	r13, r19
   26b56:	21 f0       	breq	.+8      	; 0x26b60 <lcd_status_screen()+0x472>
   26b58:	e2 16       	cp	r14, r18
   26b5a:	f3 06       	cpc	r15, r19
   26b5c:	09 f0       	breq	.+2      	; 0x26b60 <lcd_status_screen()+0x472>
   26b5e:	65 c0       	rjmp	.+202    	; 0x26c2a <lcd_status_screen()+0x53c>
            suff_doubt = '?';
            // (print_t * 100) overflows uint16_t at 10.9 hours, uint32_t is required
            print_t = (uint16_t)((100UL * (uint32_t)print_t) / feedmultiply);
   26b60:	a4 e6       	ldi	r26, 0x64	; 100
   26b62:	b0 e0       	ldi	r27, 0x00	; 0
   26b64:	0f 94 80 a4 	call	0x34900	; 0x34900 <__umulhisi3>
   26b68:	9a 01       	movw	r18, r20
   26b6a:	55 0f       	add	r21, r21
   26b6c:	44 0b       	sbc	r20, r20
   26b6e:	55 0b       	sbc	r21, r21
   26b70:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
            suff = 'R';
        } else
            print_t = print_job_timer.duration() / 60;

        if (feedmultiply != 100 && (print_t == print_tr || print_t == print_tc)) {
            suff_doubt = '?';
   26b74:	4f e3       	ldi	r20, 0x3F	; 63
   26b76:	e4 2e       	mov	r14, r20
   26b78:	04 2e       	mov	r0, r20
   26b7a:	00 0c       	add	r0, r0
   26b7c:	ff 08       	sbc	r15, r15
   26b7e:	e1 2f       	mov	r30, r17
   26b80:	01 2e       	mov	r0, r17
   26b82:	00 0c       	add	r0, r0
   26b84:	ff 0b       	sbc	r31, r31
   26b86:	c9 01       	movw	r24, r18
   26b88:	6c e3       	ldi	r22, 0x3C	; 60
   26b8a:	70 e0       	ldi	r23, 0x00	; 0
   26b8c:	0f 94 a9 a4 	call	0x34952	; 0x34952 <__udivmodhi4>
            // (print_t * 100) overflows uint16_t at 10.9 hours, uint32_t is required
            print_t = (uint16_t)((100UL * (uint32_t)print_t) / feedmultiply);
        }

        if (print_t < 6000) //time<100h
   26b90:	20 37       	cpi	r18, 0x70	; 112
   26b92:	37 41       	sbci	r19, 0x17	; 23
   26b94:	08 f0       	brcs	.+2      	; 0x26b98 <lcd_status_screen()+0x4aa>
   26b96:	4b c0       	rjmp	.+150    	; 0x26c2e <lcd_status_screen()+0x540>
            chars = lcd_printf_P(_N(LCD_STR_CLOCK "%02u:%02u%c%c"), print_t / 60, print_t % 60, suff, suff_doubt);
   26b98:	ff 92       	push	r15
   26b9a:	4f 93       	push	r20
   26b9c:	ff 93       	push	r31
   26b9e:	1f 93       	push	r17
   26ba0:	9f 93       	push	r25
   26ba2:	8f 93       	push	r24
   26ba4:	7f 93       	push	r23
   26ba6:	6f 93       	push	r22
   26ba8:	8c ea       	ldi	r24, 0xAC	; 172
   26baa:	9a e6       	ldi	r25, 0x6A	; 106
   26bac:	9f 93       	push	r25
   26bae:	8f 93       	push	r24
   26bb0:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
        else //time>=100h
            chars = lcd_printf_P(_N(LCD_STR_CLOCK "%3uh %c%c"), print_t / 60, suff, suff_doubt);
   26bb4:	0f b6       	in	r0, 0x3f	; 63
   26bb6:	f8 94       	cli
   26bb8:	de bf       	out	0x3e, r29	; 62
   26bba:	0f be       	out	0x3f, r0	; 63
   26bbc:	cd bf       	out	0x3d, r28	; 61
        chars = lcd_printf_P(PSTR("Nd %4.2f "),(float)eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM)/1000.0);
#else
        chars = lcd_printf_P(_N(LCD_STR_CLOCK "--:--  "));
#endif //QUICK_NOZZLE_CHANGE
    }
    lcd_space(8 - chars);
   26bbe:	98 e0       	ldi	r25, 0x08	; 8
   26bc0:	98 1b       	sub	r25, r24
   26bc2:	89 2f       	mov	r24, r25
   26bc4:	0e 94 28 6f 	call	0xde50	; 0xde50 <lcd_space(unsigned char)>
#else
    //Print time (8chars)
	lcdui_print_time();
#endif //CMD_DIAGNOSTICS

    lcd_set_cursor(0, 3); //line 3
   26bc8:	63 e0       	ldi	r22, 0x03	; 3
   26bca:	80 e0       	ldi	r24, 0x00	; 0
   26bcc:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>

#ifndef DEBUG_DISABLE_LCD_STATUS_LINE
	lcdui_print_status_line();
   26bd0:	0f 94 cb 0e 	call	0x21d96	; 0x21d96 <lcdui_print_status_line()>

void prusa_statistics_update_from_status_screen() {
    if (farm_mode) {
   26bd4:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   26bd8:	88 23       	and	r24, r24
   26bda:	b1 f0       	breq	.+44     	; 0x26c08 <lcd_status_screen()+0x51a>
        farm_timer--;
   26bdc:	80 91 74 02 	lds	r24, 0x0274	; 0x800274 <farm_timer>
   26be0:	81 50       	subi	r24, 0x01	; 1
        if (farm_timer < 1) {
   26be2:	d9 f1       	breq	.+118    	; 0x26c5a <lcd_status_screen()+0x56c>
    SERIAL_ECHOLN('}');
}

void prusa_statistics_update_from_status_screen() {
    if (farm_mode) {
        farm_timer--;
   26be4:	80 93 74 02 	sts	0x0274, r24	; 0x800274 <farm_timer>
        if (farm_timer < 1) {
            farm_timer = 10;
            prusa_statistics(0);
        }
        switch (farm_timer) {
   26be8:	80 91 74 02 	lds	r24, 0x0274	; 0x800274 <farm_timer>
   26bec:	85 30       	cpi	r24, 0x05	; 5
   26bee:	e1 f1       	breq	.+120    	; 0x26c68 <lcd_status_screen()+0x57a>
   26bf0:	88 30       	cpi	r24, 0x08	; 8
   26bf2:	51 f4       	brne	.+20     	; 0x26c08 <lcd_status_screen()+0x51a>
        case 8:
            prusa_statistics(21);
   26bf4:	85 e1       	ldi	r24, 0x15	; 21
   26bf6:	0f 94 79 32 	call	0x264f2	; 0x264f2 <prusa_statistics(unsigned char)>
            if(eFilamentAction != FilamentAction::None)
   26bfa:	80 91 94 03 	lds	r24, 0x0394	; 0x800394 <eFilamentAction>
   26bfe:	88 23       	and	r24, r24
   26c00:	19 f0       	breq	.+6      	; 0x26c08 <lcd_status_screen()+0x51a>
                prusa_statistics(22);
   26c02:	86 e1       	ldi	r24, 0x16	; 22
            break;
        case 5:
            if (IS_SD_PRINTING)
                prusa_statistics(20);
   26c04:	0f 94 79 32 	call	0x264f2	; 0x264f2 <prusa_statistics(unsigned char)>

		lcdui_print_status_screen();

		prusa_statistics_update_from_status_screen();

		if (lcd_commands_type != LcdCommands::Idle)
   26c08:	80 91 5e 0d 	lds	r24, 0x0D5E	; 0x800d5e <lcd_commands_type>
   26c0c:	88 23       	and	r24, r24
   26c0e:	09 f4       	brne	.+2      	; 0x26c12 <lcd_status_screen()+0x524>
   26c10:	cb cd       	rjmp	.-1130   	; 0x267a8 <lcd_status_screen()+0xba>
void lcd_print_stop_finish();

void lcd_commands()
{
    // printf_P(PSTR("lcd_commands begin, lcd_commands_type=%u, lcd_commands_step=%u\n"), (uint8_t)lcd_commands_type, lcd_commands_step);
    if (planner_aborted) {
   26c12:	80 91 42 0d 	lds	r24, 0x0D42	; 0x800d42 <planner_aborted>
   26c16:	81 11       	cpse	r24, r1
   26c18:	c7 cd       	rjmp	.-1138   	; 0x267a8 <lcd_status_screen()+0xba>
   26c1a:	0e 94 05 f6 	call	0x1ec0a	; 0x1ec0a <lcd_commands() [clone .part.42]>
   26c1e:	c4 cd       	rjmp	.-1144   	; 0x267a8 <lcd_status_screen()+0xba>
        lcd_space(5 - lcdui_print_extruder());
    } else if (farm_mode) {
        // Print farm number (5 chars)
        lcdui_print_farm();
    } else {
        lcd_space(5); // 5 spaces
   26c20:	85 e0       	ldi	r24, 0x05	; 5
   26c22:	ff ce       	rjmp	.-514    	; 0x26a22 <lcd_status_screen()+0x334>
        if (print_tc != PRINT_TIME_REMAINING_INIT && clock_interval > CLOCK_INTERVAL_TIME) {
            print_t = print_tc;
            suff = 'C';
        } else
//#endif //CLOCK_INTERVAL_TIME
        if (print_tr != PRINT_TIME_REMAINING_INIT) {
   26c24:	96 01       	movw	r18, r12
            print_t = print_tr;
            suff = 'R';
   26c26:	12 e5       	ldi	r17, 0x52	; 82
   26c28:	8c cf       	rjmp	.-232    	; 0x26b42 <lcd_status_screen()+0x454>
    if (printer_active()) {
        uint16_t print_t = PRINT_TIME_REMAINING_INIT;  // unit: minutes
        uint16_t print_tr = PRINT_TIME_REMAINING_INIT; // unit: minutes
        uint16_t print_tc = PRINT_TIME_REMAINING_INIT; // unit: minutes
        char suff = ' ';
        char suff_doubt = ' ';
   26c2a:	40 e2       	ldi	r20, 0x20	; 32
   26c2c:	a4 cf       	rjmp	.-184    	; 0x26b76 <lcd_status_screen()+0x488>
        }

        if (print_t < 6000) //time<100h
            chars = lcd_printf_P(_N(LCD_STR_CLOCK "%02u:%02u%c%c"), print_t / 60, print_t % 60, suff, suff_doubt);
        else //time>=100h
            chars = lcd_printf_P(_N(LCD_STR_CLOCK "%3uh %c%c"), print_t / 60, suff, suff_doubt);
   26c2e:	ff 92       	push	r15
   26c30:	4f 93       	push	r20
   26c32:	ff 93       	push	r31
   26c34:	1f 93       	push	r17
   26c36:	7f 93       	push	r23
   26c38:	6f 93       	push	r22
   26c3a:	81 ea       	ldi	r24, 0xA1	; 161
   26c3c:	9a e6       	ldi	r25, 0x6A	; 106
   26c3e:	9f 93       	push	r25
   26c40:	8f 93       	push	r24
   26c42:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
   26c46:	b6 cf       	rjmp	.-148    	; 0x26bb4 <lcd_status_screen()+0x4c6>
    } else {
#ifdef QUICK_NOZZLE_CHANGE
        chars = lcd_printf_P(PSTR("Nd %4.2f "),(float)eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM)/1000.0);
#else
        chars = lcd_printf_P(_N(LCD_STR_CLOCK "--:--  "));
   26c48:	88 e9       	ldi	r24, 0x98	; 152
   26c4a:	9a e6       	ldi	r25, 0x6A	; 106
   26c4c:	9f 93       	push	r25
   26c4e:	8f 93       	push	r24
   26c50:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
   26c54:	0f 90       	pop	r0
   26c56:	0f 90       	pop	r0
   26c58:	b2 cf       	rjmp	.-156    	; 0x26bbe <lcd_status_screen()+0x4d0>

void prusa_statistics_update_from_status_screen() {
    if (farm_mode) {
        farm_timer--;
        if (farm_timer < 1) {
            farm_timer = 10;
   26c5a:	8a e0       	ldi	r24, 0x0A	; 10
   26c5c:	80 93 74 02 	sts	0x0274, r24	; 0x800274 <farm_timer>
            prusa_statistics(0);
   26c60:	80 e0       	ldi	r24, 0x00	; 0
   26c62:	0f 94 79 32 	call	0x264f2	; 0x264f2 <prusa_statistics(unsigned char)>
   26c66:	c0 cf       	rjmp	.-128    	; 0x26be8 <lcd_status_screen()+0x4fa>
            prusa_statistics(21);
            if(eFilamentAction != FilamentAction::None)
                prusa_statistics(22);
            break;
        case 5:
            if (IS_SD_PRINTING)
   26c68:	80 91 d7 13 	lds	r24, 0x13D7	; 0x8013d7 <card+0x2>
   26c6c:	88 23       	and	r24, r24
   26c6e:	61 f2       	breq	.-104    	; 0x26c08 <lcd_status_screen()+0x51a>
                prusa_statistics(20);
   26c70:	84 e1       	ldi	r24, 0x14	; 20
   26c72:	c8 cf       	rjmp	.-112    	; 0x26c04 <lcd_status_screen()+0x516>

00026c74 <temp_runaway_stop(bool, bool)>:

	}
}

static void temp_runaway_stop(bool isPreheat, bool isBed)
{
   26c74:	cf 93       	push	r28
   26c76:	df 93       	push	r29
    if(IsStopped() == false) {
   26c78:	90 91 3b 12 	lds	r25, 0x123B	; 0x80123b <Stopped>
   26c7c:	91 11       	cpse	r25, r1
   26c7e:	21 c0       	rjmp	.+66     	; 0x26cc2 <temp_runaway_stop(bool, bool)+0x4e>
   26c80:	c6 2f       	mov	r28, r22
   26c82:	d8 2f       	mov	r29, r24
        if (isPreheat) {
   26c84:	88 23       	and	r24, r24
   26c86:	09 f1       	breq	.+66     	; 0x26cca <temp_runaway_stop(bool, bool)+0x56>
            lcd_setalertstatuspgm(isBed? PSTR("BED PREHEAT ERROR") : PSTR("PREHEAT ERROR"), LCD_STATUS_CRITICAL);
   26c88:	88 ee       	ldi	r24, 0xE8	; 232
   26c8a:	96 e9       	ldi	r25, 0x96	; 150
   26c8c:	66 23       	and	r22, r22
   26c8e:	11 f0       	breq	.+4      	; 0x26c94 <temp_runaway_stop(bool, bool)+0x20>
   26c90:	86 ef       	ldi	r24, 0xF6	; 246
   26c92:	96 e9       	ldi	r25, 0x96	; 150
   26c94:	63 e0       	ldi	r22, 0x03	; 3
   26c96:	0e 94 2c da 	call	0x1b458	; 0x1b458 <lcd_setalertstatuspgm(char const*, unsigned char)>
            SERIAL_ERROR_START;
   26c9a:	81 eb       	ldi	r24, 0xB1	; 177
   26c9c:	91 ea       	ldi	r25, 0xA1	; 161
   26c9e:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
            if (isBed) {
                SERIAL_ERRORLNPGM(" THERMAL RUNAWAY (PREHEAT HEATBED)");
   26ca2:	85 ec       	ldi	r24, 0xC5	; 197
   26ca4:	96 e9       	ldi	r25, 0x96	; 150
{
    if(IsStopped() == false) {
        if (isPreheat) {
            lcd_setalertstatuspgm(isBed? PSTR("BED PREHEAT ERROR") : PSTR("PREHEAT ERROR"), LCD_STATUS_CRITICAL);
            SERIAL_ERROR_START;
            if (isBed) {
   26ca6:	c1 11       	cpse	r28, r1
   26ca8:	02 c0       	rjmp	.+4      	; 0x26cae <temp_runaway_stop(bool, bool)+0x3a>
                SERIAL_ERRORLNPGM(" THERMAL RUNAWAY (PREHEAT HEATBED)");
            } else {
                SERIAL_ERRORLNPGM(" THERMAL RUNAWAY (PREHEAT HOTEND)");
   26caa:	83 ea       	ldi	r24, 0xA3	; 163
   26cac:	96 e9       	ldi	r25, 0x96	; 150
            lcd_setalertstatuspgm(isBed? PSTR("BED THERMAL RUNAWAY") : PSTR("THERMAL RUNAWAY"), LCD_STATUS_CRITICAL);
            SERIAL_ERROR_START;
            if (isBed) {
                SERIAL_ERRORLNPGM(" HEATBED THERMAL RUNAWAY");
            } else {
                SERIAL_ERRORLNPGM(" HOTEND THERMAL RUNAWAY");
   26cae:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
            }
        }
        prusa_statistics(0);
   26cb2:	80 e0       	ldi	r24, 0x00	; 0
   26cb4:	0f 94 79 32 	call	0x264f2	; 0x264f2 <prusa_statistics(unsigned char)>
        prusa_statistics(isPreheat? 91 : 90);
   26cb8:	8a e5       	ldi	r24, 0x5A	; 90
   26cba:	d1 11       	cpse	r29, r1
   26cbc:	8b e5       	ldi	r24, 0x5B	; 91
   26cbe:	0f 94 79 32 	call	0x264f2	; 0x264f2 <prusa_statistics(unsigned char)>
    }
    ThermalStop();
}
   26cc2:	df 91       	pop	r29
   26cc4:	cf 91       	pop	r28
            }
        }
        prusa_statistics(0);
        prusa_statistics(isPreheat? 91 : 90);
    }
    ThermalStop();
   26cc6:	0d 94 4f 67 	jmp	0x2ce9e	; 0x2ce9e <ThermalStop(bool) [clone .constprop.301]>
                SERIAL_ERRORLNPGM(" THERMAL RUNAWAY (PREHEAT HEATBED)");
            } else {
                SERIAL_ERRORLNPGM(" THERMAL RUNAWAY (PREHEAT HOTEND)");
            }
        } else {
            lcd_setalertstatuspgm(isBed? PSTR("BED THERMAL RUNAWAY") : PSTR("THERMAL RUNAWAY"), LCD_STATUS_CRITICAL);
   26cca:	8f e7       	ldi	r24, 0x7F	; 127
   26ccc:	96 e9       	ldi	r25, 0x96	; 150
   26cce:	66 23       	and	r22, r22
   26cd0:	11 f0       	breq	.+4      	; 0x26cd6 <temp_runaway_stop(bool, bool)+0x62>
   26cd2:	8f e8       	ldi	r24, 0x8F	; 143
   26cd4:	96 e9       	ldi	r25, 0x96	; 150
   26cd6:	63 e0       	ldi	r22, 0x03	; 3
   26cd8:	0e 94 2c da 	call	0x1b458	; 0x1b458 <lcd_setalertstatuspgm(char const*, unsigned char)>
            SERIAL_ERROR_START;
   26cdc:	81 eb       	ldi	r24, 0xB1	; 177
   26cde:	91 ea       	ldi	r25, 0xA1	; 161
   26ce0:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
            if (isBed) {
                SERIAL_ERRORLNPGM(" HEATBED THERMAL RUNAWAY");
   26ce4:	86 e6       	ldi	r24, 0x66	; 102
   26ce6:	96 e9       	ldi	r25, 0x96	; 150
                SERIAL_ERRORLNPGM(" THERMAL RUNAWAY (PREHEAT HOTEND)");
            }
        } else {
            lcd_setalertstatuspgm(isBed? PSTR("BED THERMAL RUNAWAY") : PSTR("THERMAL RUNAWAY"), LCD_STATUS_CRITICAL);
            SERIAL_ERROR_START;
            if (isBed) {
   26ce8:	c1 11       	cpse	r28, r1
   26cea:	e1 cf       	rjmp	.-62     	; 0x26cae <temp_runaway_stop(bool, bool)+0x3a>
                SERIAL_ERRORLNPGM(" HEATBED THERMAL RUNAWAY");
            } else {
                SERIAL_ERRORLNPGM(" HOTEND THERMAL RUNAWAY");
   26cec:	8e e4       	ldi	r24, 0x4E	; 78
   26cee:	96 e9       	ldi	r25, 0x96	; 150
   26cf0:	de cf       	rjmp	.-68     	; 0x26cae <temp_runaway_stop(bool, bool)+0x3a>

00026cf2 <PID_autotune(float, int, int)>:
#endif

// WARNING: the following function has been marked noinline to avoid a GCC 4.9.2 LTO
//          codegen bug causing a stack overwrite issue in process_commands()
void __attribute__((noinline)) PID_autotune(float temp, int extruder, int ncycles)
{
   26cf2:	2f 92       	push	r2
   26cf4:	3f 92       	push	r3
   26cf6:	4f 92       	push	r4
   26cf8:	5f 92       	push	r5
   26cfa:	6f 92       	push	r6
   26cfc:	7f 92       	push	r7
   26cfe:	8f 92       	push	r8
   26d00:	9f 92       	push	r9
   26d02:	af 92       	push	r10
   26d04:	bf 92       	push	r11
   26d06:	cf 92       	push	r12
   26d08:	df 92       	push	r13
   26d0a:	ef 92       	push	r14
   26d0c:	ff 92       	push	r15
   26d0e:	0f 93       	push	r16
   26d10:	1f 93       	push	r17
   26d12:	cf 93       	push	r28
   26d14:	df 93       	push	r29
   26d16:	cd b7       	in	r28, 0x3d	; 61
   26d18:	de b7       	in	r29, 0x3e	; 62
   26d1a:	e0 97       	sbiw	r28, 0x30	; 48
   26d1c:	0f b6       	in	r0, 0x3f	; 63
   26d1e:	f8 94       	cli
   26d20:	de bf       	out	0x3e, r29	; 62
   26d22:	0f be       	out	0x3f, r0	; 63
   26d24:	cd bf       	out	0x3d, r28	; 61
   26d26:	6a 87       	std	Y+10, r22	; 0x0a
   26d28:	7b 87       	std	Y+11, r23	; 0x0b
   26d2a:	8c 87       	std	Y+12, r24	; 0x0c
   26d2c:	9d 87       	std	Y+13, r25	; 0x0d
   26d2e:	1a 01       	movw	r2, r20
   26d30:	3a a7       	std	Y+42, r19	; 0x2a
   26d32:	29 a7       	std	Y+41, r18	; 0x29
      return !pid_tuning_finished;
  }

  void preparePidTuning() {
      // ensure heaters are disabled before we switch off PID management!
      disable_heater();
   26d34:	0f 94 05 11 	call	0x2220a	; 0x2220a <disable_heater()>
      pid_tuning_finished = false;
   26d38:	10 92 41 02 	sts	0x0241, r1	; 0x800241 <_ZL19pid_tuning_finished.lto_priv.426>
//          codegen bug causing a stack overwrite issue in process_commands()
void __attribute__((noinline)) PID_autotune(float temp, int extruder, int ncycles)
{
  preparePidTuning();

  pid_number_of_cycles = ncycles;
   26d3c:	29 a5       	ldd	r18, Y+41	; 0x29
   26d3e:	3a a5       	ldd	r19, Y+42	; 0x2a
   26d40:	30 93 01 06 	sts	0x0601, r19	; 0x800601 <pid_number_of_cycles+0x1>
   26d44:	20 93 00 06 	sts	0x0600, r18	; 0x800600 <pid_number_of_cycles>
  float input = 0.0;
  pid_cycle=0;
   26d48:	10 92 03 06 	sts	0x0603, r1	; 0x800603 <pid_cycle+0x1>
   26d4c:	10 92 02 06 	sts	0x0602, r1	; 0x800602 <pid_cycle>
  bool heating = true;

  unsigned long temp_millis = _millis();
   26d50:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   26d54:	6e 83       	std	Y+6, r22	; 0x06
   26d56:	7f 83       	std	Y+7, r23	; 0x07
   26d58:	88 87       	std	Y+8, r24	; 0x08
   26d5a:	99 87       	std	Y+9, r25	; 0x09

  long bias, d;
  float Ku, Tu;
  float max = 0, min = 10000;
  uint8_t safety_check_cycles = 0;
  const uint8_t safety_check_cycles_count = (extruder < 0) ? 45 : 10; //10 cycles / 20s delay for extruder and 45 cycles / 90s for heatbed
   26d5c:	37 fe       	sbrs	r3, 7
   26d5e:	ff c0       	rjmp	.+510    	; 0x26f5e <PID_autotune(float, int, int)+0x26c>
   26d60:	3d e2       	ldi	r19, 0x2D	; 45
   26d62:	3f 8f       	std	Y+31, r19	; 0x1f
  float temp_ambient;

#if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1)
  unsigned long extruder_autofan_last_check = _millis();
   26d64:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   26d68:	6c a3       	std	Y+36, r22	; 0x24
   26d6a:	7d a3       	std	Y+37, r23	; 0x25
   26d6c:	8e a3       	std	Y+38, r24	; 0x26
   26d6e:	9f a3       	std	Y+39, r25	; 0x27
  if ((extruder >= EXTRUDERS)
  #if (TEMP_BED_PIN <= -1)
       ||(extruder < 0)
  #endif
       ){
          SERIAL_ECHOLNPGM("PID Autotune failed. Bad extruder number.");
   26d70:	89 eb       	ldi	r24, 0xB9	; 185
   26d72:	94 e9       	ldi	r25, 0x94	; 148

#if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1)
  unsigned long extruder_autofan_last_check = _millis();
#endif

  if ((extruder >= EXTRUDERS)
   26d74:	12 14       	cp	r1, r2
   26d76:	13 04       	cpc	r1, r3
   26d78:	0c f4       	brge	.+2      	; 0x26d7c <PID_autotune(float, int, int)+0x8a>
   26d7a:	8a c2       	rjmp	.+1300   	; 0x27290 <PID_autotune(float, int, int)+0x59e>
		  pid_tuning_finished = true;
		  pid_cycle = 0;
          return;
        }

  SERIAL_ECHOLNPGM("PID Autotune start");
   26d7c:	86 ea       	ldi	r24, 0xA6	; 166
   26d7e:	94 e9       	ldi	r25, 0x94	; 148
   26d80:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   26d84:	6a 85       	ldd	r22, Y+10	; 0x0a
   26d86:	7b 85       	ldd	r23, Y+11	; 0x0b
   26d88:	8c 85       	ldd	r24, Y+12	; 0x0c
   26d8a:	9d 85       	ldd	r25, Y+13	; 0x0d
   26d8c:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>

  if (extruder<0)
  {
     soft_pwm_bed = (MAX_BED_POWER)/2;
   26d90:	2f e7       	ldi	r18, 0x7F	; 127
          return;
        }

  SERIAL_ECHOLNPGM("PID Autotune start");

  if (extruder<0)
   26d92:	21 14       	cp	r2, r1
   26d94:	31 04       	cpc	r3, r1
   26d96:	09 f4       	brne	.+2      	; 0x26d9a <PID_autotune(float, int, int)+0xa8>
   26d98:	e5 c0       	rjmp	.+458    	; 0x26f64 <PID_autotune(float, int, int)+0x272>
  {
     soft_pwm_bed = (MAX_BED_POWER)/2;
   26d9a:	20 93 ee 05 	sts	0x05EE, r18	; 0x8005ee <soft_pwm_bed>
     bias = d = (MAX_BED_POWER)/2;
     target_temperature_bed = (int)temp; // to display the requested target bed temperature properly on the main screen
   26d9e:	70 93 5a 12 	sts	0x125A, r23	; 0x80125a <target_temperature_bed+0x1>
   26da2:	60 93 59 12 	sts	0x1259, r22	; 0x801259 <target_temperature_bed>

  long bias, d;
  float Ku, Tu;
  float max = 0, min = 10000;
  uint8_t safety_check_cycles = 0;
  const uint8_t safety_check_cycles_count = (extruder < 0) ? 45 : 10; //10 cycles / 20s delay for extruder and 45 cycles / 90s for heatbed
   26da6:	8e 81       	ldd	r24, Y+6	; 0x06
   26da8:	9f 81       	ldd	r25, Y+7	; 0x07
   26daa:	a8 85       	ldd	r26, Y+8	; 0x08
   26dac:	b9 85       	ldd	r27, Y+9	; 0x09
   26dae:	8e 87       	std	Y+14, r24	; 0x0e
   26db0:	9f 87       	std	Y+15, r25	; 0x0f
   26db2:	a8 8b       	std	Y+16, r26	; 0x10
   26db4:	b9 8b       	std	Y+17, r27	; 0x11
   26db6:	88 a3       	std	Y+32, r24	; 0x20
   26db8:	99 a3       	std	Y+33, r25	; 0x21
   26dba:	aa a3       	std	Y+34, r26	; 0x22
   26dbc:	bb a3       	std	Y+35, r27	; 0x23
   26dbe:	1a 8a       	std	Y+18, r1	; 0x12
   26dc0:	90 e4       	ldi	r25, 0x40	; 64
   26dc2:	9b 8b       	std	Y+19, r25	; 0x13
   26dc4:	ac e1       	ldi	r26, 0x1C	; 28
   26dc6:	ac 8b       	std	Y+20, r26	; 0x14
   26dc8:	b6 e4       	ldi	r27, 0x46	; 70
   26dca:	bd 8b       	std	Y+21, r27	; 0x15
   26dcc:	1e 8a       	std	Y+22, r1	; 0x16
   26dce:	1f 8a       	std	Y+23, r1	; 0x17
   26dd0:	18 8e       	std	Y+24, r1	; 0x18
   26dd2:	19 8e       	std	Y+25, r1	; 0x19
   26dd4:	6f e7       	ldi	r22, 0x7F	; 127
   26dd6:	c6 2e       	mov	r12, r22
   26dd8:	d1 2c       	mov	r13, r1
   26dda:	e1 2c       	mov	r14, r1
   26ddc:	f1 2c       	mov	r15, r1
   26dde:	00 e0       	ldi	r16, 0x00	; 0
   26de0:	10 e0       	ldi	r17, 0x00	; 0
   26de2:	18 aa       	std	Y+48, r1	; 0x30
   26de4:	1f a6       	std	Y+47, r1	; 0x2f
   26de6:	1d 82       	std	Y+5, r1	; 0x05
   26de8:	2f e7       	ldi	r18, 0x7F	; 127
   26dea:	30 e0       	ldi	r19, 0x00	; 0
   26dec:	40 e0       	ldi	r20, 0x00	; 0
   26dee:	50 e0       	ldi	r21, 0x00	; 0
   26df0:	29 83       	std	Y+1, r18	; 0x01
   26df2:	3a 83       	std	Y+2, r19	; 0x02
   26df4:	4b 83       	std	Y+3, r20	; 0x03
   26df6:	5c 83       	std	Y+4, r21	; 0x04
   26df8:	1b 8e       	std	Y+27, r1	; 0x1b
   26dfa:	1c 8e       	std	Y+28, r1	; 0x1c
   26dfc:	1d 8e       	std	Y+29, r1	; 0x1d
   26dfe:	1e 8e       	std	Y+30, r1	; 0x1e
   26e00:	31 e0       	ldi	r19, 0x01	; 1
   26e02:	3a 8f       	std	Y+26, r19	; 0x1a
     target_temperature[extruder] = (int)temp; // to display the requested target extruder temperature properly on the main screen
  }

  for(;;) {
#ifdef WATCHDOG
    wdt_reset();
   26e04:	a8 95       	wdr
#endif //WATCHDOG
    if(temp_meas_ready == true) { // temp sample ready
   26e06:	40 91 d5 05 	lds	r20, 0x05D5	; 0x8005d5 <temp_meas_ready>
   26e0a:	48 a7       	std	Y+40, r20	; 0x28
   26e0c:	44 23       	and	r20, r20
   26e0e:	09 f4       	brne	.+2      	; 0x26e12 <PID_autotune(float, int, int)+0x120>
   26e10:	2c c2       	rjmp	.+1112   	; 0x2726a <PID_autotune(float, int, int)+0x578>
      updateTemperatures();
   26e12:	0f 94 56 02 	call	0x204ac	; 0x204ac <updateTemperatures()>

      input = (extruder<0)?current_temperature_bed:current_temperature[extruder];
   26e16:	21 14       	cp	r2, r1
   26e18:	31 04       	cpc	r3, r1
   26e1a:	09 f0       	breq	.+2      	; 0x26e1e <PID_autotune(float, int, int)+0x12c>
   26e1c:	aa c0       	rjmp	.+340    	; 0x26f72 <PID_autotune(float, int, int)+0x280>
   26e1e:	00 91 5a 0d 	lds	r16, 0x0D5A	; 0x800d5a <current_temperature>
   26e22:	10 91 5b 0d 	lds	r17, 0x0D5B	; 0x800d5b <current_temperature+0x1>
   26e26:	50 91 5c 0d 	lds	r21, 0x0D5C	; 0x800d5c <current_temperature+0x2>
   26e2a:	58 ab       	std	Y+48, r21	; 0x30
   26e2c:	80 91 5d 0d 	lds	r24, 0x0D5D	; 0x800d5d <current_temperature+0x3>
   26e30:	8f a7       	std	Y+47, r24	; 0x2f

      max=max(max,input);
   26e32:	2e 89       	ldd	r18, Y+22	; 0x16
   26e34:	3f 89       	ldd	r19, Y+23	; 0x17
   26e36:	48 8d       	ldd	r20, Y+24	; 0x18
   26e38:	59 8d       	ldd	r21, Y+25	; 0x19
   26e3a:	b8 01       	movw	r22, r16
   26e3c:	88 a9       	ldd	r24, Y+48	; 0x30
   26e3e:	9f a5       	ldd	r25, Y+47	; 0x2f
   26e40:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   26e44:	87 fd       	sbrc	r24, 7
   26e46:	06 c0       	rjmp	.+12     	; 0x26e54 <PID_autotune(float, int, int)+0x162>
   26e48:	0e 8b       	std	Y+22, r16	; 0x16
   26e4a:	1f 8b       	std	Y+23, r17	; 0x17
   26e4c:	b8 a9       	ldd	r27, Y+48	; 0x30
   26e4e:	b8 8f       	std	Y+24, r27	; 0x18
   26e50:	2f a5       	ldd	r18, Y+47	; 0x2f
   26e52:	29 8f       	std	Y+25, r18	; 0x19
      min=min(min,input);
   26e54:	2a 89       	ldd	r18, Y+18	; 0x12
   26e56:	3b 89       	ldd	r19, Y+19	; 0x13
   26e58:	4c 89       	ldd	r20, Y+20	; 0x14
   26e5a:	5d 89       	ldd	r21, Y+21	; 0x15
   26e5c:	b8 01       	movw	r22, r16
   26e5e:	88 a9       	ldd	r24, Y+48	; 0x30
   26e60:	9f a5       	ldd	r25, Y+47	; 0x2f
   26e62:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   26e66:	18 16       	cp	r1, r24
   26e68:	34 f0       	brlt	.+12     	; 0x26e76 <PID_autotune(float, int, int)+0x184>
   26e6a:	0a 8b       	std	Y+18, r16	; 0x12
   26e6c:	1b 8b       	std	Y+19, r17	; 0x13
   26e6e:	38 a9       	ldd	r19, Y+48	; 0x30
   26e70:	3c 8b       	std	Y+20, r19	; 0x14
   26e72:	4f a5       	ldd	r20, Y+47	; 0x2f
   26e74:	4d 8b       	std	Y+21, r20	; 0x15

      #if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1)
      if(_millis() - extruder_autofan_last_check > 2500) {
   26e76:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   26e7a:	2c a1       	ldd	r18, Y+36	; 0x24
   26e7c:	3d a1       	ldd	r19, Y+37	; 0x25
   26e7e:	4e a1       	ldd	r20, Y+38	; 0x26
   26e80:	5f a1       	ldd	r21, Y+39	; 0x27
   26e82:	62 1b       	sub	r22, r18
   26e84:	73 0b       	sbc	r23, r19
   26e86:	84 0b       	sbc	r24, r20
   26e88:	95 0b       	sbc	r25, r21
   26e8a:	65 3c       	cpi	r22, 0xC5	; 197
   26e8c:	79 40       	sbci	r23, 0x09	; 9
   26e8e:	81 05       	cpc	r24, r1
   26e90:	91 05       	cpc	r25, r1
   26e92:	40 f0       	brcs	.+16     	; 0x26ea4 <PID_autotune(float, int, int)+0x1b2>
        checkExtruderAutoFans();
   26e94:	0e 94 fb 77 	call	0xeff6	; 0xeff6 <checkExtruderAutoFans()>
        extruder_autofan_last_check = _millis();
   26e98:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   26e9c:	6c a3       	std	Y+36, r22	; 0x24
   26e9e:	7d a3       	std	Y+37, r23	; 0x25
   26ea0:	8e a3       	std	Y+38, r24	; 0x26
   26ea2:	9f a3       	std	Y+39, r25	; 0x27
      }
      #endif

      if(heating == true && input > temp) {
   26ea4:	4a 8d       	ldd	r20, Y+26	; 0x1a
   26ea6:	44 23       	and	r20, r20
   26ea8:	09 f4       	brne	.+2      	; 0x26eac <PID_autotune(float, int, int)+0x1ba>
   26eaa:	4c c0       	rjmp	.+152    	; 0x26f44 <PID_autotune(float, int, int)+0x252>
   26eac:	2a 85       	ldd	r18, Y+10	; 0x0a
   26eae:	3b 85       	ldd	r19, Y+11	; 0x0b
   26eb0:	4c 85       	ldd	r20, Y+12	; 0x0c
   26eb2:	5d 85       	ldd	r21, Y+13	; 0x0d
   26eb4:	b8 01       	movw	r22, r16
   26eb6:	88 a9       	ldd	r24, Y+48	; 0x30
   26eb8:	9f a5       	ldd	r25, Y+47	; 0x2f
   26eba:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   26ebe:	18 16       	cp	r1, r24
   26ec0:	0c f0       	brlt	.+2      	; 0x26ec4 <PID_autotune(float, int, int)+0x1d2>
   26ec2:	d3 c1       	rjmp	.+934    	; 0x2726a <PID_autotune(float, int, int)+0x578>
        if(_millis() - t2 > 5000) {
   26ec4:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   26ec8:	2e 85       	ldd	r18, Y+14	; 0x0e
   26eca:	3f 85       	ldd	r19, Y+15	; 0x0f
   26ecc:	48 89       	ldd	r20, Y+16	; 0x10
   26ece:	59 89       	ldd	r21, Y+17	; 0x11
   26ed0:	62 1b       	sub	r22, r18
   26ed2:	73 0b       	sbc	r23, r19
   26ed4:	84 0b       	sbc	r24, r20
   26ed6:	95 0b       	sbc	r25, r21
   26ed8:	69 38       	cpi	r22, 0x89	; 137
   26eda:	73 41       	sbci	r23, 0x13	; 19
   26edc:	81 05       	cpc	r24, r1
   26ede:	91 05       	cpc	r25, r1
   26ee0:	08 f4       	brcc	.+2      	; 0x26ee4 <PID_autotune(float, int, int)+0x1f2>
   26ee2:	c3 c1       	rjmp	.+902    	; 0x2726a <PID_autotune(float, int, int)+0x578>
   26ee4:	d7 01       	movw	r26, r14
   26ee6:	c6 01       	movw	r24, r12
   26ee8:	29 81       	ldd	r18, Y+1	; 0x01
   26eea:	3a 81       	ldd	r19, Y+2	; 0x02
   26eec:	4b 81       	ldd	r20, Y+3	; 0x03
   26eee:	5c 81       	ldd	r21, Y+4	; 0x04
   26ef0:	82 1b       	sub	r24, r18
   26ef2:	93 0b       	sbc	r25, r19
   26ef4:	a4 0b       	sbc	r26, r20
   26ef6:	b5 0b       	sbc	r27, r21
   26ef8:	b5 95       	asr	r27
   26efa:	a7 95       	ror	r26
   26efc:	97 95       	ror	r25
   26efe:	87 95       	ror	r24
          heating=false;
          if (extruder<0) {
   26f00:	21 14       	cp	r2, r1
   26f02:	31 04       	cpc	r3, r1
   26f04:	09 f4       	brne	.+2      	; 0x26f08 <PID_autotune(float, int, int)+0x216>
   26f06:	40 c0       	rjmp	.+128    	; 0x26f88 <PID_autotune(float, int, int)+0x296>
            soft_pwm_bed = (bias - d) >> 1;
   26f08:	80 93 ee 05 	sts	0x05EE, r24	; 0x8005ee <soft_pwm_bed>
		  }
          else
            soft_pwm[extruder] = (bias - d) >> 1;
          t1=_millis();
   26f0c:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   26f10:	6e 83       	std	Y+6, r22	; 0x06
   26f12:	7f 83       	std	Y+7, r23	; 0x07
   26f14:	88 87       	std	Y+8, r24	; 0x08
   26f16:	99 87       	std	Y+9, r25	; 0x09
          t_high=t1 - t2;
   26f18:	dc 01       	movw	r26, r24
   26f1a:	cb 01       	movw	r24, r22
   26f1c:	2e 85       	ldd	r18, Y+14	; 0x0e
   26f1e:	3f 85       	ldd	r19, Y+15	; 0x0f
   26f20:	48 89       	ldd	r20, Y+16	; 0x10
   26f22:	59 89       	ldd	r21, Y+17	; 0x11
   26f24:	82 1b       	sub	r24, r18
   26f26:	93 0b       	sbc	r25, r19
   26f28:	a4 0b       	sbc	r26, r20
   26f2a:	b5 0b       	sbc	r27, r21
   26f2c:	8b 8f       	std	Y+27, r24	; 0x1b
   26f2e:	9c 8f       	std	Y+28, r25	; 0x1c
   26f30:	ad 8f       	std	Y+29, r26	; 0x1d
   26f32:	be 8f       	std	Y+30, r27	; 0x1e
          max=temp;
   26f34:	3a 85       	ldd	r19, Y+10	; 0x0a
   26f36:	3e 8b       	std	Y+22, r19	; 0x16
   26f38:	4b 85       	ldd	r20, Y+11	; 0x0b
   26f3a:	4f 8b       	std	Y+23, r20	; 0x17
   26f3c:	5c 85       	ldd	r21, Y+12	; 0x0c
   26f3e:	58 8f       	std	Y+24, r21	; 0x18
   26f40:	8d 85       	ldd	r24, Y+13	; 0x0d
   26f42:	89 8f       	std	Y+25, r24	; 0x19
        }
      }
      if(heating == false && input < temp) {
   26f44:	2a 85       	ldd	r18, Y+10	; 0x0a
   26f46:	3b 85       	ldd	r19, Y+11	; 0x0b
   26f48:	4c 85       	ldd	r20, Y+12	; 0x0c
   26f4a:	5d 85       	ldd	r21, Y+13	; 0x0d
   26f4c:	b8 01       	movw	r22, r16
   26f4e:	88 a9       	ldd	r24, Y+48	; 0x30
   26f50:	9f a5       	ldd	r25, Y+47	; 0x2f
   26f52:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   26f56:	87 fd       	sbrc	r24, 7
   26f58:	1a c0       	rjmp	.+52     	; 0x26f8e <PID_autotune(float, int, int)+0x29c>
        if(_millis() - t1 > 5000) {
   26f5a:	1a 8e       	std	Y+26, r1	; 0x1a
   26f5c:	86 c1       	rjmp	.+780    	; 0x2726a <PID_autotune(float, int, int)+0x578>

  long bias, d;
  float Ku, Tu;
  float max = 0, min = 10000;
  uint8_t safety_check_cycles = 0;
  const uint8_t safety_check_cycles_count = (extruder < 0) ? 45 : 10; //10 cycles / 20s delay for extruder and 45 cycles / 90s for heatbed
   26f5e:	4a e0       	ldi	r20, 0x0A	; 10
   26f60:	4f 8f       	std	Y+31, r20	; 0x1f
   26f62:	00 cf       	rjmp	.-512    	; 0x26d64 <PID_autotune(float, int, int)+0x72>
     bias = d = (MAX_BED_POWER)/2;
     target_temperature_bed = (int)temp; // to display the requested target bed temperature properly on the main screen
   }
   else
   {
     soft_pwm[extruder] = (PID_MAX)/2;
   26f64:	20 93 f5 05 	sts	0x05F5, r18	; 0x8005f5 <_ZL8soft_pwm.lto_priv.504>
     bias = d = (PID_MAX)/2;
     target_temperature[extruder] = (int)temp; // to display the requested target extruder temperature properly on the main screen
   26f68:	70 93 5e 12 	sts	0x125E, r23	; 0x80125e <target_temperature+0x1>
   26f6c:	60 93 5d 12 	sts	0x125D, r22	; 0x80125d <target_temperature>
   26f70:	1a cf       	rjmp	.-460    	; 0x26da6 <PID_autotune(float, int, int)+0xb4>
    wdt_reset();
#endif //WATCHDOG
    if(temp_meas_ready == true) { // temp sample ready
      updateTemperatures();

      input = (extruder<0)?current_temperature_bed:current_temperature[extruder];
   26f72:	00 91 bc 03 	lds	r16, 0x03BC	; 0x8003bc <current_temperature_bed>
   26f76:	10 91 bd 03 	lds	r17, 0x03BD	; 0x8003bd <current_temperature_bed+0x1>
   26f7a:	90 91 be 03 	lds	r25, 0x03BE	; 0x8003be <current_temperature_bed+0x2>
   26f7e:	98 ab       	std	Y+48, r25	; 0x30
   26f80:	a0 91 bf 03 	lds	r26, 0x03BF	; 0x8003bf <current_temperature_bed+0x3>
   26f84:	af a7       	std	Y+47, r26	; 0x2f
   26f86:	55 cf       	rjmp	.-342    	; 0x26e32 <PID_autotune(float, int, int)+0x140>
          heating=false;
          if (extruder<0) {
            soft_pwm_bed = (bias - d) >> 1;
		  }
          else
            soft_pwm[extruder] = (bias - d) >> 1;
   26f88:	80 93 f5 05 	sts	0x05F5, r24	; 0x8005f5 <_ZL8soft_pwm.lto_priv.504>
   26f8c:	bf cf       	rjmp	.-130    	; 0x26f0c <PID_autotune(float, int, int)+0x21a>
          t_high=t1 - t2;
          max=temp;
        }
      }
      if(heating == false && input < temp) {
        if(_millis() - t1 > 5000) {
   26f8e:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   26f92:	2e 81       	ldd	r18, Y+6	; 0x06
   26f94:	3f 81       	ldd	r19, Y+7	; 0x07
   26f96:	48 85       	ldd	r20, Y+8	; 0x08
   26f98:	59 85       	ldd	r21, Y+9	; 0x09
   26f9a:	62 1b       	sub	r22, r18
   26f9c:	73 0b       	sbc	r23, r19
   26f9e:	84 0b       	sbc	r24, r20
   26fa0:	95 0b       	sbc	r25, r21
   26fa2:	69 38       	cpi	r22, 0x89	; 137
   26fa4:	73 41       	sbci	r23, 0x13	; 19
   26fa6:	81 05       	cpc	r24, r1
   26fa8:	91 05       	cpc	r25, r1
   26faa:	b8 f2       	brcs	.-82     	; 0x26f5a <PID_autotune(float, int, int)+0x268>
          heating=true;
          t2=_millis();
   26fac:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   26fb0:	6e 87       	std	Y+14, r22	; 0x0e
   26fb2:	7f 87       	std	Y+15, r23	; 0x0f
   26fb4:	88 8b       	std	Y+16, r24	; 0x10
   26fb6:	99 8b       	std	Y+17, r25	; 0x11
          t_low=t2 - t1;
          if(pid_cycle > 0) {
   26fb8:	80 91 02 06 	lds	r24, 0x0602	; 0x800602 <pid_cycle>
   26fbc:	90 91 03 06 	lds	r25, 0x0603	; 0x800603 <pid_cycle+0x1>
   26fc0:	18 16       	cp	r1, r24
   26fc2:	19 06       	cpc	r1, r25
   26fc4:	0c f0       	brlt	.+2      	; 0x26fc8 <PID_autotune(float, int, int)+0x2d6>
   26fc6:	2c c1       	rjmp	.+600    	; 0x27220 <PID_autotune(float, int, int)+0x52e>
      }
      if(heating == false && input < temp) {
        if(_millis() - t1 > 5000) {
          heating=true;
          t2=_millis();
          t_low=t2 - t1;
   26fc8:	8e 85       	ldd	r24, Y+14	; 0x0e
   26fca:	9f 85       	ldd	r25, Y+15	; 0x0f
   26fcc:	a8 89       	ldd	r26, Y+16	; 0x10
   26fce:	b9 89       	ldd	r27, Y+17	; 0x11
   26fd0:	2e 81       	ldd	r18, Y+6	; 0x06
   26fd2:	3f 81       	ldd	r19, Y+7	; 0x07
   26fd4:	48 85       	ldd	r20, Y+8	; 0x08
   26fd6:	59 85       	ldd	r21, Y+9	; 0x09
   26fd8:	82 1b       	sub	r24, r18
   26fda:	93 0b       	sbc	r25, r19
   26fdc:	a4 0b       	sbc	r26, r20
   26fde:	b5 0b       	sbc	r27, r21
          if(pid_cycle > 0) {
            bias += (d*(t_high - t_low))/(t_low + t_high);
   26fe0:	4b 8c       	ldd	r4, Y+27	; 0x1b
   26fe2:	5c 8c       	ldd	r5, Y+28	; 0x1c
   26fe4:	6d 8c       	ldd	r6, Y+29	; 0x1d
   26fe6:	7e 8c       	ldd	r7, Y+30	; 0x1e
   26fe8:	48 0e       	add	r4, r24
   26fea:	59 1e       	adc	r5, r25
   26fec:	6a 1e       	adc	r6, r26
   26fee:	7b 1e       	adc	r7, r27
   26ff0:	2b 8d       	ldd	r18, Y+27	; 0x1b
   26ff2:	3c 8d       	ldd	r19, Y+28	; 0x1c
   26ff4:	4d 8d       	ldd	r20, Y+29	; 0x1d
   26ff6:	5e 8d       	ldd	r21, Y+30	; 0x1e
   26ff8:	28 1b       	sub	r18, r24
   26ffa:	39 0b       	sbc	r19, r25
   26ffc:	4a 0b       	sbc	r20, r26
   26ffe:	5b 0b       	sbc	r21, r27
   27000:	69 81       	ldd	r22, Y+1	; 0x01
   27002:	7a 81       	ldd	r23, Y+2	; 0x02
   27004:	8b 81       	ldd	r24, Y+3	; 0x03
   27006:	9c 81       	ldd	r25, Y+4	; 0x04
   27008:	0f 94 43 a4 	call	0x34886	; 0x34886 <__mulsi3>
   2700c:	a3 01       	movw	r20, r6
   2700e:	92 01       	movw	r18, r4
   27010:	0f 94 d1 a4 	call	0x349a2	; 0x349a2 <__divmodsi4>
   27014:	da 01       	movw	r26, r20
   27016:	c9 01       	movw	r24, r18
   27018:	8c 0d       	add	r24, r12
   2701a:	9d 1d       	adc	r25, r13
   2701c:	ae 1d       	adc	r26, r14
   2701e:	bf 1d       	adc	r27, r15
            bias = constrain(bias, 20 ,(extruder<0?(MAX_BED_POWER):(PID_MAX))-20);
   27020:	84 31       	cpi	r24, 0x14	; 20
   27022:	91 05       	cpc	r25, r1
   27024:	a1 05       	cpc	r26, r1
   27026:	b1 05       	cpc	r27, r1
   27028:	0c f4       	brge	.+2      	; 0x2702c <PID_autotune(float, int, int)+0x33a>
   2702a:	3c c1       	rjmp	.+632    	; 0x272a4 <PID_autotune(float, int, int)+0x5b2>
   2702c:	6c 01       	movw	r12, r24
   2702e:	7d 01       	movw	r14, r26
   27030:	3c ee       	ldi	r19, 0xEC	; 236
   27032:	c3 16       	cp	r12, r19
   27034:	d1 04       	cpc	r13, r1
   27036:	e1 04       	cpc	r14, r1
   27038:	f1 04       	cpc	r15, r1
   2703a:	2c f0       	brlt	.+10     	; 0x27046 <PID_autotune(float, int, int)+0x354>
   2703c:	4b ee       	ldi	r20, 0xEB	; 235
   2703e:	c4 2e       	mov	r12, r20
   27040:	d1 2c       	mov	r13, r1
   27042:	e1 2c       	mov	r14, r1
   27044:	f1 2c       	mov	r15, r1
            if(bias > (extruder<0?(MAX_BED_POWER):(PID_MAX))/2) d = (extruder<0?(MAX_BED_POWER):(PID_MAX)) - 1 - bias;
   27046:	80 38       	cpi	r24, 0x80	; 128
   27048:	91 05       	cpc	r25, r1
   2704a:	a1 05       	cpc	r26, r1
   2704c:	b1 05       	cpc	r27, r1
   2704e:	0c f4       	brge	.+2      	; 0x27052 <PID_autotune(float, int, int)+0x360>
   27050:	37 c1       	rjmp	.+622    	; 0x272c0 <PID_autotune(float, int, int)+0x5ce>
   27052:	8e ef       	ldi	r24, 0xFE	; 254
   27054:	90 e0       	ldi	r25, 0x00	; 0
   27056:	a0 e0       	ldi	r26, 0x00	; 0
   27058:	b0 e0       	ldi	r27, 0x00	; 0
   2705a:	8c 19       	sub	r24, r12
   2705c:	9d 09       	sbc	r25, r13
   2705e:	ae 09       	sbc	r26, r14
   27060:	bf 09       	sbc	r27, r15
   27062:	89 83       	std	Y+1, r24	; 0x01
   27064:	9a 83       	std	Y+2, r25	; 0x02
   27066:	ab 83       	std	Y+3, r26	; 0x03
   27068:	bc 83       	std	Y+4, r27	; 0x04
            else d = bias;

            SERIAL_PROTOCOLPGM(" bias: "); SERIAL_PROTOCOL(bias);
   2706a:	8e e9       	ldi	r24, 0x9E	; 158
   2706c:	94 e9       	ldi	r25, 0x94	; 148
   2706e:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   27072:	c7 01       	movw	r24, r14
   27074:	b6 01       	movw	r22, r12
   27076:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
            SERIAL_PROTOCOLPGM(" d: "); SERIAL_PROTOCOL(d);
   2707a:	89 e9       	ldi	r24, 0x99	; 153
   2707c:	94 e9       	ldi	r25, 0x94	; 148
   2707e:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   27082:	69 81       	ldd	r22, Y+1	; 0x01
   27084:	7a 81       	ldd	r23, Y+2	; 0x02
   27086:	8b 81       	ldd	r24, Y+3	; 0x03
   27088:	9c 81       	ldd	r25, Y+4	; 0x04
   2708a:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
            SERIAL_PROTOCOLPGM(" min: "); SERIAL_PROTOCOL(min);
   2708e:	82 e9       	ldi	r24, 0x92	; 146
   27090:	94 e9       	ldi	r25, 0x94	; 148
   27092:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
  else printNumber(n, base);
}

void MarlinSerial::print(double n, int digits)
{
  printFloat(n, digits);
   27096:	42 e0       	ldi	r20, 0x02	; 2
   27098:	6a 89       	ldd	r22, Y+18	; 0x12
   2709a:	7b 89       	ldd	r23, Y+19	; 0x13
   2709c:	8c 89       	ldd	r24, Y+20	; 0x14
   2709e:	9d 89       	ldd	r25, Y+21	; 0x15
   270a0:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
            SERIAL_PROTOCOLPGM(" max: "); SERIAL_PROTOCOLLN(max);
   270a4:	8b e8       	ldi	r24, 0x8B	; 139
   270a6:	94 e9       	ldi	r25, 0x94	; 148
   270a8:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   270ac:	6e 89       	ldd	r22, Y+22	; 0x16
   270ae:	7f 89       	ldd	r23, Y+23	; 0x17
   270b0:	88 8d       	ldd	r24, Y+24	; 0x18
   270b2:	99 8d       	ldd	r25, Y+25	; 0x19
   270b4:	0f 94 a2 65 	call	0x2cb44	; 0x2cb44 <MarlinSerial::println(double, int) [clone .constprop.354]>
            if(pid_cycle > 2) {
   270b8:	80 91 02 06 	lds	r24, 0x0602	; 0x800602 <pid_cycle>
   270bc:	90 91 03 06 	lds	r25, 0x0603	; 0x800603 <pid_cycle+0x1>
   270c0:	03 97       	sbiw	r24, 0x03	; 3
   270c2:	0c f4       	brge	.+2      	; 0x270c6 <PID_autotune(float, int, int)+0x3d4>
   270c4:	ad c0       	rjmp	.+346    	; 0x27220 <PID_autotune(float, int, int)+0x52e>
              Ku = (4.0*d)/(3.14159*(max-min)/2.0);
   270c6:	69 81       	ldd	r22, Y+1	; 0x01
   270c8:	7a 81       	ldd	r23, Y+2	; 0x02
   270ca:	8b 81       	ldd	r24, Y+3	; 0x03
   270cc:	9c 81       	ldd	r25, Y+4	; 0x04
   270ce:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   270d2:	20 e0       	ldi	r18, 0x00	; 0
   270d4:	30 e0       	ldi	r19, 0x00	; 0
   270d6:	40 e8       	ldi	r20, 0x80	; 128
   270d8:	50 e4       	ldi	r21, 0x40	; 64
   270da:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   270de:	4b 01       	movw	r8, r22
   270e0:	5c 01       	movw	r10, r24
   270e2:	2a 89       	ldd	r18, Y+18	; 0x12
   270e4:	3b 89       	ldd	r19, Y+19	; 0x13
   270e6:	4c 89       	ldd	r20, Y+20	; 0x14
   270e8:	5d 89       	ldd	r21, Y+21	; 0x15
   270ea:	6e 89       	ldd	r22, Y+22	; 0x16
   270ec:	7f 89       	ldd	r23, Y+23	; 0x17
   270ee:	88 8d       	ldd	r24, Y+24	; 0x18
   270f0:	99 8d       	ldd	r25, Y+25	; 0x19
   270f2:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   270f6:	20 ed       	ldi	r18, 0xD0	; 208
   270f8:	3f e0       	ldi	r19, 0x0F	; 15
   270fa:	49 e4       	ldi	r20, 0x49	; 73
   270fc:	50 e4       	ldi	r21, 0x40	; 64
   270fe:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   27102:	20 e0       	ldi	r18, 0x00	; 0
   27104:	30 e0       	ldi	r19, 0x00	; 0
   27106:	40 e0       	ldi	r20, 0x00	; 0
   27108:	5f e3       	ldi	r21, 0x3F	; 63
   2710a:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2710e:	9b 01       	movw	r18, r22
   27110:	ac 01       	movw	r20, r24
   27112:	c5 01       	movw	r24, r10
   27114:	b4 01       	movw	r22, r8
   27116:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   2711a:	4b 01       	movw	r8, r22
   2711c:	5c 01       	movw	r10, r24
              Tu = ((float)(t_low + t_high)/1000.0);
   2711e:	c3 01       	movw	r24, r6
   27120:	b2 01       	movw	r22, r4
   27122:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   27126:	20 e0       	ldi	r18, 0x00	; 0
   27128:	30 e0       	ldi	r19, 0x00	; 0
   2712a:	4a e7       	ldi	r20, 0x7A	; 122
   2712c:	54 e4       	ldi	r21, 0x44	; 68
   2712e:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   27132:	2b 01       	movw	r4, r22
   27134:	3c 01       	movw	r6, r24
              SERIAL_PROTOCOLPGM(" Ku: "); SERIAL_PROTOCOL(Ku);
   27136:	85 e8       	ldi	r24, 0x85	; 133
   27138:	94 e9       	ldi	r25, 0x94	; 148
   2713a:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   2713e:	42 e0       	ldi	r20, 0x02	; 2
   27140:	c5 01       	movw	r24, r10
   27142:	b4 01       	movw	r22, r8
   27144:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
              SERIAL_PROTOCOLPGM(" Tu: "); SERIAL_PROTOCOLLN(Tu);
   27148:	8f e7       	ldi	r24, 0x7F	; 127
   2714a:	94 e9       	ldi	r25, 0x94	; 148
   2714c:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   27150:	c3 01       	movw	r24, r6
   27152:	b2 01       	movw	r22, r4
   27154:	0f 94 a2 65 	call	0x2cb44	; 0x2cb44 <MarlinSerial::println(double, int) [clone .constprop.354]>
              _Kp = 0.6*Ku;
   27158:	2a e9       	ldi	r18, 0x9A	; 154
   2715a:	39 e9       	ldi	r19, 0x99	; 153
   2715c:	49 e1       	ldi	r20, 0x19	; 25
   2715e:	5f e3       	ldi	r21, 0x3F	; 63
   27160:	c5 01       	movw	r24, r10
   27162:	b4 01       	movw	r22, r8
   27164:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   27168:	4b 01       	movw	r8, r22
   2716a:	5c 01       	movw	r10, r24
   2716c:	80 92 da 03 	sts	0x03DA, r8	; 0x8003da <_Kp>
   27170:	90 92 db 03 	sts	0x03DB, r9	; 0x8003db <_Kp+0x1>
   27174:	a0 92 dc 03 	sts	0x03DC, r10	; 0x8003dc <_Kp+0x2>
   27178:	b0 92 dd 03 	sts	0x03DD, r11	; 0x8003dd <_Kp+0x3>
              _Ki = 2*_Kp/Tu;
   2717c:	ac 01       	movw	r20, r24
   2717e:	9b 01       	movw	r18, r22
   27180:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   27184:	a3 01       	movw	r20, r6
   27186:	92 01       	movw	r18, r4
   27188:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   2718c:	60 93 d6 03 	sts	0x03D6, r22	; 0x8003d6 <_Ki>
   27190:	70 93 d7 03 	sts	0x03D7, r23	; 0x8003d7 <_Ki+0x1>
   27194:	80 93 d8 03 	sts	0x03D8, r24	; 0x8003d8 <_Ki+0x2>
   27198:	90 93 d9 03 	sts	0x03D9, r25	; 0x8003d9 <_Ki+0x3>
              _Kd = _Kp*Tu/8;
   2719c:	a3 01       	movw	r20, r6
   2719e:	92 01       	movw	r18, r4
   271a0:	c5 01       	movw	r24, r10
   271a2:	b4 01       	movw	r22, r8
   271a4:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   271a8:	20 e0       	ldi	r18, 0x00	; 0
   271aa:	30 e0       	ldi	r19, 0x00	; 0
   271ac:	40 e0       	ldi	r20, 0x00	; 0
   271ae:	5e e3       	ldi	r21, 0x3E	; 62
   271b0:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   271b4:	60 93 d2 03 	sts	0x03D2, r22	; 0x8003d2 <_Kd>
   271b8:	70 93 d3 03 	sts	0x03D3, r23	; 0x8003d3 <_Kd+0x1>
   271bc:	80 93 d4 03 	sts	0x03D4, r24	; 0x8003d4 <_Kd+0x2>
   271c0:	90 93 d5 03 	sts	0x03D5, r25	; 0x8003d5 <_Kd+0x3>
              SERIAL_PROTOCOLLNPGM(" Classic PID ");
   271c4:	81 e7       	ldi	r24, 0x71	; 113
   271c6:	94 e9       	ldi	r25, 0x94	; 148
   271c8:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
              SERIAL_PROTOCOLPGM(" Kp: "); SERIAL_PROTOCOLLN(_Kp);
   271cc:	8b e6       	ldi	r24, 0x6B	; 107
   271ce:	94 e9       	ldi	r25, 0x94	; 148
   271d0:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   271d4:	60 91 da 03 	lds	r22, 0x03DA	; 0x8003da <_Kp>
   271d8:	70 91 db 03 	lds	r23, 0x03DB	; 0x8003db <_Kp+0x1>
   271dc:	80 91 dc 03 	lds	r24, 0x03DC	; 0x8003dc <_Kp+0x2>
   271e0:	90 91 dd 03 	lds	r25, 0x03DD	; 0x8003dd <_Kp+0x3>
   271e4:	0f 94 a2 65 	call	0x2cb44	; 0x2cb44 <MarlinSerial::println(double, int) [clone .constprop.354]>
              SERIAL_PROTOCOLPGM(" Ki: "); SERIAL_PROTOCOLLN(_Ki);
   271e8:	85 e6       	ldi	r24, 0x65	; 101
   271ea:	94 e9       	ldi	r25, 0x94	; 148
   271ec:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   271f0:	60 91 d6 03 	lds	r22, 0x03D6	; 0x8003d6 <_Ki>
   271f4:	70 91 d7 03 	lds	r23, 0x03D7	; 0x8003d7 <_Ki+0x1>
   271f8:	80 91 d8 03 	lds	r24, 0x03D8	; 0x8003d8 <_Ki+0x2>
   271fc:	90 91 d9 03 	lds	r25, 0x03D9	; 0x8003d9 <_Ki+0x3>
   27200:	0f 94 a2 65 	call	0x2cb44	; 0x2cb44 <MarlinSerial::println(double, int) [clone .constprop.354]>
              SERIAL_PROTOCOLPGM(" Kd: "); SERIAL_PROTOCOLLN(_Kd);
   27204:	8f e5       	ldi	r24, 0x5F	; 95
   27206:	94 e9       	ldi	r25, 0x94	; 148
   27208:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   2720c:	60 91 d2 03 	lds	r22, 0x03D2	; 0x8003d2 <_Kd>
   27210:	70 91 d3 03 	lds	r23, 0x03D3	; 0x8003d3 <_Kd+0x1>
   27214:	80 91 d4 03 	lds	r24, 0x03D4	; 0x8003d4 <_Kd+0x2>
   27218:	90 91 d5 03 	lds	r25, 0x03D5	; 0x8003d5 <_Kd+0x3>
   2721c:	0f 94 a2 65 	call	0x2cb44	; 0x2cb44 <MarlinSerial::println(double, int) [clone .constprop.354]>
   27220:	89 81       	ldd	r24, Y+1	; 0x01
   27222:	9a 81       	ldd	r25, Y+2	; 0x02
   27224:	ab 81       	ldd	r26, Y+3	; 0x03
   27226:	bc 81       	ldd	r27, Y+4	; 0x04
   27228:	8c 0d       	add	r24, r12
   2722a:	9d 1d       	adc	r25, r13
   2722c:	ae 1d       	adc	r26, r14
   2722e:	bf 1d       	adc	r27, r15
   27230:	b5 95       	asr	r27
   27232:	a7 95       	ror	r26
   27234:	97 95       	ror	r25
   27236:	87 95       	ror	r24
              SERIAL_PROTOCOLPGM(" Ki: "); SERIAL_PROTOCOLLN(_Ki);
              SERIAL_PROTOCOLPGM(" Kd: "); SERIAL_PROTOCOLLN(_Kd);
              */
            }
          }
          if (extruder<0)
   27238:	21 14       	cp	r2, r1
   2723a:	31 04       	cpc	r3, r1
   2723c:	09 f4       	brne	.+2      	; 0x27240 <PID_autotune(float, int, int)+0x54e>
   2723e:	45 c0       	rjmp	.+138    	; 0x272ca <PID_autotune(float, int, int)+0x5d8>
		  {
            soft_pwm_bed = (bias + d) >> 1;
   27240:	80 93 ee 05 	sts	0x05EE, r24	; 0x8005ee <soft_pwm_bed>
		  }
          else
            soft_pwm[extruder] = (bias + d) >> 1;
          pid_cycle++;
   27244:	80 91 02 06 	lds	r24, 0x0602	; 0x800602 <pid_cycle>
   27248:	90 91 03 06 	lds	r25, 0x0603	; 0x800603 <pid_cycle+0x1>
   2724c:	01 96       	adiw	r24, 0x01	; 1
   2724e:	90 93 03 06 	sts	0x0603, r25	; 0x800603 <pid_cycle+0x1>
   27252:	80 93 02 06 	sts	0x0602, r24	; 0x800602 <pid_cycle>
          min=temp;
   27256:	3a 85       	ldd	r19, Y+10	; 0x0a
   27258:	3a 8b       	std	Y+18, r19	; 0x12
   2725a:	4b 85       	ldd	r20, Y+11	; 0x0b
   2725c:	4b 8b       	std	Y+19, r20	; 0x13
   2725e:	5c 85       	ldd	r21, Y+12	; 0x0c
   27260:	5c 8b       	std	Y+20, r21	; 0x14
   27262:	8d 85       	ldd	r24, Y+13	; 0x0d
   27264:	8d 8b       	std	Y+21, r24	; 0x15
          max=temp;
        }
      }
      if(heating == false && input < temp) {
        if(_millis() - t1 > 5000) {
          heating=true;
   27266:	98 a5       	ldd	r25, Y+40	; 0x28
   27268:	9a 8f       	std	Y+26, r25	; 0x1a
      }
    }
    #ifndef MAX_OVERSHOOT_PID_AUTOTUNE
      #define MAX_OVERSHOOT_PID_AUTOTUNE 20
    #endif
    if(input > (temp + MAX_OVERSHOOT_PID_AUTOTUNE)) {
   2726a:	20 e0       	ldi	r18, 0x00	; 0
   2726c:	30 e0       	ldi	r19, 0x00	; 0
   2726e:	40 ea       	ldi	r20, 0xA0	; 160
   27270:	51 e4       	ldi	r21, 0x41	; 65
   27272:	6a 85       	ldd	r22, Y+10	; 0x0a
   27274:	7b 85       	ldd	r23, Y+11	; 0x0b
   27276:	8c 85       	ldd	r24, Y+12	; 0x0c
   27278:	9d 85       	ldd	r25, Y+13	; 0x0d
   2727a:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   2727e:	98 01       	movw	r18, r16
   27280:	48 a9       	ldd	r20, Y+48	; 0x30
   27282:	5f a5       	ldd	r21, Y+47	; 0x2f
   27284:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   27288:	87 ff       	sbrs	r24, 7
   2728a:	22 c0       	rjmp	.+68     	; 0x272d0 <PID_autotune(float, int, int)+0x5de>
      SERIAL_PROTOCOLLNPGM("PID Autotune failed! Temperature too high");
   2728c:	85 e3       	ldi	r24, 0x35	; 53
   2728e:	94 e9       	ldi	r25, 0x94	; 148
	  pid_tuning_finished = true;
	  pid_cycle = 0;
      return;
    }
    if(pid_cycle > ncycles) {
      SERIAL_PROTOCOLLNPGM("PID Autotune finished! Put the last Kp, Ki and Kd constants from above into Configuration.h");
   27290:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
	  pid_tuning_finished = true;
   27294:	81 e0       	ldi	r24, 0x01	; 1
   27296:	80 93 41 02 	sts	0x0241, r24	; 0x800241 <_ZL19pid_tuning_finished.lto_priv.426>
	  pid_cycle = 0;
   2729a:	10 92 03 06 	sts	0x0603, r1	; 0x800603 <pid_cycle+0x1>
   2729e:	10 92 02 06 	sts	0x0602, r1	; 0x800602 <pid_cycle>
   272a2:	98 c0       	rjmp	.+304    	; 0x273d4 <PID_autotune(float, int, int)+0x6e2>
          heating=true;
          t2=_millis();
          t_low=t2 - t1;
          if(pid_cycle > 0) {
            bias += (d*(t_high - t_low))/(t_low + t_high);
            bias = constrain(bias, 20 ,(extruder<0?(MAX_BED_POWER):(PID_MAX))-20);
   272a4:	34 e1       	ldi	r19, 0x14	; 20
   272a6:	c3 2e       	mov	r12, r19
   272a8:	d1 2c       	mov	r13, r1
   272aa:	e1 2c       	mov	r14, r1
   272ac:	f1 2c       	mov	r15, r1
   272ae:	24 e1       	ldi	r18, 0x14	; 20
   272b0:	30 e0       	ldi	r19, 0x00	; 0
   272b2:	40 e0       	ldi	r20, 0x00	; 0
   272b4:	50 e0       	ldi	r21, 0x00	; 0
   272b6:	29 83       	std	Y+1, r18	; 0x01
   272b8:	3a 83       	std	Y+2, r19	; 0x02
   272ba:	4b 83       	std	Y+3, r20	; 0x03
   272bc:	5c 83       	std	Y+4, r21	; 0x04
   272be:	d5 ce       	rjmp	.-598    	; 0x2706a <PID_autotune(float, int, int)+0x378>
   272c0:	c9 82       	std	Y+1, r12	; 0x01
   272c2:	da 82       	std	Y+2, r13	; 0x02
   272c4:	eb 82       	std	Y+3, r14	; 0x03
   272c6:	fc 82       	std	Y+4, r15	; 0x04
   272c8:	d0 ce       	rjmp	.-608    	; 0x2706a <PID_autotune(float, int, int)+0x378>
          if (extruder<0)
		  {
            soft_pwm_bed = (bias + d) >> 1;
		  }
          else
            soft_pwm[extruder] = (bias + d) >> 1;
   272ca:	80 93 f5 05 	sts	0x05F5, r24	; 0x8005f5 <_ZL8soft_pwm.lto_priv.504>
   272ce:	ba cf       	rjmp	.-140    	; 0x27244 <PID_autotune(float, int, int)+0x552>
      SERIAL_PROTOCOLLNPGM("PID Autotune failed! Temperature too high");
	  pid_tuning_finished = true;
	  pid_cycle = 0;
      return;
    }
    if(_millis() - temp_millis > 2000) {
   272d0:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   272d4:	28 a1       	ldd	r18, Y+32	; 0x20
   272d6:	39 a1       	ldd	r19, Y+33	; 0x21
   272d8:	4a a1       	ldd	r20, Y+34	; 0x22
   272da:	5b a1       	ldd	r21, Y+35	; 0x23
   272dc:	62 1b       	sub	r22, r18
   272de:	73 0b       	sbc	r23, r19
   272e0:	84 0b       	sbc	r24, r20
   272e2:	95 0b       	sbc	r25, r21
   272e4:	61 3d       	cpi	r22, 0xD1	; 209
   272e6:	77 40       	sbci	r23, 0x07	; 7
   272e8:	81 05       	cpc	r24, r1
   272ea:	91 05       	cpc	r25, r1
   272ec:	58 f1       	brcs	.+86     	; 0x27344 <PID_autotune(float, int, int)+0x652>
      int p;
      if (extruder<0){
        p=soft_pwm_bed;
   272ee:	a0 90 ee 05 	lds	r10, 0x05EE	; 0x8005ee <soft_pwm_bed>
   272f2:	b1 2c       	mov	r11, r1
        SERIAL_PROTOCOLPGM("B:");
   272f4:	82 e3       	ldi	r24, 0x32	; 50
   272f6:	94 e9       	ldi	r25, 0x94	; 148
	  pid_cycle = 0;
      return;
    }
    if(_millis() - temp_millis > 2000) {
      int p;
      if (extruder<0){
   272f8:	21 14       	cp	r2, r1
   272fa:	31 04       	cpc	r3, r1
   272fc:	29 f4       	brne	.+10     	; 0x27308 <PID_autotune(float, int, int)+0x616>
        p=soft_pwm_bed;
        SERIAL_PROTOCOLPGM("B:");
      }else{
        p=soft_pwm[extruder];
   272fe:	a0 90 f5 05 	lds	r10, 0x05F5	; 0x8005f5 <_ZL8soft_pwm.lto_priv.504>
   27302:	b1 2c       	mov	r11, r1
        SERIAL_PROTOCOLPGM("T:");
   27304:	8f e2       	ldi	r24, 0x2F	; 47
   27306:	94 e9       	ldi	r25, 0x94	; 148
   27308:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   2730c:	42 e0       	ldi	r20, 0x02	; 2
   2730e:	b8 01       	movw	r22, r16
   27310:	88 a9       	ldd	r24, Y+48	; 0x30
   27312:	9f a5       	ldd	r25, Y+47	; 0x2f
   27314:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
      }

      SERIAL_PROTOCOL(input);
      SERIAL_PROTOCOLPGM(" @:");
   27318:	8b e2       	ldi	r24, 0x2B	; 43
   2731a:	94 e9       	ldi	r25, 0x94	; 148
   2731c:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
      SERIAL_PROTOCOLLN(p);
   27320:	c5 01       	movw	r24, r10
   27322:	0f 94 bf 65 	call	0x2cb7e	; 0x2cb7e <MarlinSerial::println(int, int) [clone .constprop.319]>
		if (safety_check_cycles == 0) { //save ambient temp
   27326:	4d 81       	ldd	r20, Y+5	; 0x05
   27328:	44 23       	and	r20, r20
   2732a:	09 f4       	brne	.+2      	; 0x2732e <PID_autotune(float, int, int)+0x63c>
   2732c:	6c c0       	rjmp	.+216    	; 0x27406 <PID_autotune(float, int, int)+0x714>
			temp_ambient = input;
			//SERIAL_ECHOPGM("Ambient T: ");
			//MYSERIAL.println(temp_ambient);
			safety_check_cycles++;
		}
		else if (safety_check_cycles < safety_check_cycles_count) { //delay
   2732e:	5f 8d       	ldd	r21, Y+31	; 0x1f
   27330:	45 17       	cp	r20, r21
   27332:	70 f5       	brcc	.+92     	; 0x27390 <PID_autotune(float, int, int)+0x69e>
			safety_check_cycles++;
   27334:	4f 5f       	subi	r20, 0xFF	; 255
   27336:	4d 83       	std	Y+5, r20	; 0x05
				temp_runaway_stop(false, (extruder<0));
				pid_tuning_finished = true;
				return;
			}
		}
      temp_millis = _millis();
   27338:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   2733c:	68 a3       	std	Y+32, r22	; 0x20
   2733e:	79 a3       	std	Y+33, r23	; 0x21
   27340:	8a a3       	std	Y+34, r24	; 0x22
   27342:	9b a3       	std	Y+35, r25	; 0x23
    }
    if(((_millis() - t1) + (_millis() - t2)) > (10L*60L*1000L*2L)) {
   27344:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   27348:	4b 01       	movw	r8, r22
   2734a:	5c 01       	movw	r10, r24
   2734c:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   27350:	4e 80       	ldd	r4, Y+6	; 0x06
   27352:	5f 80       	ldd	r5, Y+7	; 0x07
   27354:	68 84       	ldd	r6, Y+8	; 0x08
   27356:	79 84       	ldd	r7, Y+9	; 0x09
   27358:	2e 85       	ldd	r18, Y+14	; 0x0e
   2735a:	3f 85       	ldd	r19, Y+15	; 0x0f
   2735c:	48 89       	ldd	r20, Y+16	; 0x10
   2735e:	59 89       	ldd	r21, Y+17	; 0x11
   27360:	42 0e       	add	r4, r18
   27362:	53 1e       	adc	r5, r19
   27364:	64 1e       	adc	r6, r20
   27366:	75 1e       	adc	r7, r21
   27368:	84 18       	sub	r8, r4
   2736a:	95 08       	sbc	r9, r5
   2736c:	a6 08       	sbc	r10, r6
   2736e:	b7 08       	sbc	r11, r7
   27370:	86 0e       	add	r8, r22
   27372:	97 1e       	adc	r9, r23
   27374:	a8 1e       	adc	r10, r24
   27376:	b9 1e       	adc	r11, r25
   27378:	31 e8       	ldi	r19, 0x81	; 129
   2737a:	83 16       	cp	r8, r19
   2737c:	3f e4       	ldi	r19, 0x4F	; 79
   2737e:	93 06       	cpc	r9, r19
   27380:	32 e1       	ldi	r19, 0x12	; 18
   27382:	a3 06       	cpc	r10, r19
   27384:	b1 04       	cpc	r11, r1
   27386:	08 f4       	brcc	.+2      	; 0x2738a <PID_autotune(float, int, int)+0x698>
   27388:	47 c0       	rjmp	.+142    	; 0x27418 <PID_autotune(float, int, int)+0x726>
      SERIAL_PROTOCOLLNPGM("PID Autotune failed! timeout");
   2738a:	8e e0       	ldi	r24, 0x0E	; 14
   2738c:	94 e9       	ldi	r25, 0x94	; 148
   2738e:	80 cf       	rjmp	.-256    	; 0x27290 <PID_autotune(float, int, int)+0x59e>
			safety_check_cycles++;
		}
		else if (safety_check_cycles < safety_check_cycles_count) { //delay
			safety_check_cycles++;
		}
		else if (safety_check_cycles == safety_check_cycles_count){ //check that temperature is rising
   27390:	8d 81       	ldd	r24, Y+5	; 0x05
   27392:	9f 8d       	ldd	r25, Y+31	; 0x1f
   27394:	89 13       	cpse	r24, r25
   27396:	d0 cf       	rjmp	.-96     	; 0x27338 <PID_autotune(float, int, int)+0x646>
			safety_check_cycles++;
   27398:	8f 5f       	subi	r24, 0xFF	; 255
   2739a:	8d 83       	std	Y+5, r24	; 0x05
			//SERIAL_ECHOPGM("Time from beginning: ");
			//MYSERIAL.print(safety_check_cycles_count * 2);
			//SERIAL_ECHOPGM("s. Difference between current and ambient T: ");
			//MYSERIAL.println(input - temp_ambient);

			if (fabs(input - temp_ambient) < 5.0) {
   2739c:	2b a5       	ldd	r18, Y+43	; 0x2b
   2739e:	3c a5       	ldd	r19, Y+44	; 0x2c
   273a0:	4d a5       	ldd	r20, Y+45	; 0x2d
   273a2:	5e a5       	ldd	r21, Y+46	; 0x2e
   273a4:	b8 01       	movw	r22, r16
   273a6:	88 a9       	ldd	r24, Y+48	; 0x30
   273a8:	9f a5       	ldd	r25, Y+47	; 0x2f
   273aa:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   273ae:	9f 77       	andi	r25, 0x7F	; 127
   273b0:	20 e0       	ldi	r18, 0x00	; 0
   273b2:	30 e0       	ldi	r19, 0x00	; 0
   273b4:	40 ea       	ldi	r20, 0xA0	; 160
   273b6:	50 e4       	ldi	r21, 0x40	; 64
   273b8:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   273bc:	87 ff       	sbrs	r24, 7
   273be:	bc cf       	rjmp	.-136    	; 0x27338 <PID_autotune(float, int, int)+0x646>
				temp_runaway_stop(false, (extruder<0));
   273c0:	63 2d       	mov	r22, r3
   273c2:	66 1f       	adc	r22, r22
   273c4:	66 27       	eor	r22, r22
   273c6:	66 1f       	adc	r22, r22
   273c8:	80 e0       	ldi	r24, 0x00	; 0
   273ca:	0f 94 3a 36 	call	0x26c74	; 0x26c74 <temp_runaway_stop(bool, bool)>
				pid_tuning_finished = true;
   273ce:	81 e0       	ldi	r24, 0x01	; 1
   273d0:	80 93 41 02 	sts	0x0241, r24	; 0x800241 <_ZL19pid_tuning_finished.lto_priv.426>
	  pid_cycle = 0;
      return;
    }
    lcd_update(0);
  }
}
   273d4:	e0 96       	adiw	r28, 0x30	; 48
   273d6:	0f b6       	in	r0, 0x3f	; 63
   273d8:	f8 94       	cli
   273da:	de bf       	out	0x3e, r29	; 62
   273dc:	0f be       	out	0x3f, r0	; 63
   273de:	cd bf       	out	0x3d, r28	; 61
   273e0:	df 91       	pop	r29
   273e2:	cf 91       	pop	r28
   273e4:	1f 91       	pop	r17
   273e6:	0f 91       	pop	r16
   273e8:	ff 90       	pop	r15
   273ea:	ef 90       	pop	r14
   273ec:	df 90       	pop	r13
   273ee:	cf 90       	pop	r12
   273f0:	bf 90       	pop	r11
   273f2:	af 90       	pop	r10
   273f4:	9f 90       	pop	r9
   273f6:	8f 90       	pop	r8
   273f8:	7f 90       	pop	r7
   273fa:	6f 90       	pop	r6
   273fc:	5f 90       	pop	r5
   273fe:	4f 90       	pop	r4
   27400:	3f 90       	pop	r3
   27402:	2f 90       	pop	r2
   27404:	08 95       	ret

      SERIAL_PROTOCOL(input);
      SERIAL_PROTOCOLPGM(" @:");
      SERIAL_PROTOCOLLN(p);
		if (safety_check_cycles == 0) { //save ambient temp
			temp_ambient = input;
   27406:	0b a7       	std	Y+43, r16	; 0x2b
   27408:	1c a7       	std	Y+44, r17	; 0x2c
   2740a:	a8 a9       	ldd	r26, Y+48	; 0x30
   2740c:	ad a7       	std	Y+45, r26	; 0x2d
   2740e:	bf a5       	ldd	r27, Y+47	; 0x2f
   27410:	be a7       	std	Y+46, r27	; 0x2e
			//SERIAL_ECHOPGM("Ambient T: ");
			//MYSERIAL.println(temp_ambient);
			safety_check_cycles++;
   27412:	21 e0       	ldi	r18, 0x01	; 1
   27414:	2d 83       	std	Y+5, r18	; 0x05
   27416:	90 cf       	rjmp	.-224    	; 0x27338 <PID_autotune(float, int, int)+0x646>
      SERIAL_PROTOCOLLNPGM("PID Autotune failed! timeout");
	  pid_tuning_finished = true;
	  pid_cycle = 0;
      return;
    }
    if(pid_cycle > ncycles) {
   27418:	80 91 02 06 	lds	r24, 0x0602	; 0x800602 <pid_cycle>
   2741c:	90 91 03 06 	lds	r25, 0x0603	; 0x800603 <pid_cycle+0x1>
   27420:	49 a5       	ldd	r20, Y+41	; 0x29
   27422:	5a a5       	ldd	r21, Y+42	; 0x2a
   27424:	48 17       	cp	r20, r24
   27426:	59 07       	cpc	r21, r25
   27428:	1c f4       	brge	.+6      	; 0x27430 <PID_autotune(float, int, int)+0x73e>
      SERIAL_PROTOCOLLNPGM("PID Autotune finished! Put the last Kp, Ki and Kd constants from above into Configuration.h");
   2742a:	82 eb       	ldi	r24, 0xB2	; 178
   2742c:	93 e9       	ldi	r25, 0x93	; 147
   2742e:	30 cf       	rjmp	.-416    	; 0x27290 <PID_autotune(float, int, int)+0x59e>
	  pid_tuning_finished = true;
	  pid_cycle = 0;
      return;
    }
    lcd_update(0);
   27430:	80 e0       	ldi	r24, 0x00	; 0
   27432:	0e 94 f9 6e 	call	0xddf2	; 0xddf2 <lcd_update(unsigned char)>
   27436:	e6 cc       	rjmp	.-1588   	; 0x26e04 <PID_autotune(float, int, int)+0x112>

00027438 <manage_heater()>:
}

void handle_temp_error();

void manage_heater()
{
   27438:	cf 92       	push	r12
   2743a:	df 92       	push	r13
   2743c:	ef 92       	push	r14
   2743e:	ff 92       	push	r15
   27440:	0f 93       	push	r16
   27442:	1f 93       	push	r17
   27444:	cf 93       	push	r28
   27446:	df 93       	push	r29
   27448:	1f 92       	push	r1
   2744a:	1f 92       	push	r1
   2744c:	cd b7       	in	r28, 0x3d	; 61
   2744e:	de b7       	in	r29, 0x3e	; 62
#ifdef WATCHDOG
    wdt_reset();
   27450:	a8 95       	wdr
#endif //WATCHDOG

    // limit execution to the same rate as temp_mgr (low-level fault handling is already handled -
    // any remaining error handling is just user-facing and can wait one extra cycle)
    if(!temp_meas_ready)
   27452:	80 91 d5 05 	lds	r24, 0x05D5	; 0x8005d5 <temp_meas_ready>
   27456:	88 23       	and	r24, r24
   27458:	09 f4       	brne	.+2      	; 0x2745c <manage_heater()+0x24>
   2745a:	29 c2       	rjmp	.+1106   	; 0x278ae <manage_heater()+0x476>
        return;

    // syncronize temperatures with isr
    updateTemperatures();
   2745c:	0f 94 56 02 	call	0x204ac	; 0x204ac <updateTemperatures()>
    if(thermal_model::warning_state.warning)
        thermal_model::handle_warning();
#endif

    // handle temperature errors
    if(temp_error_state.v)
   27460:	80 91 cc 03 	lds	r24, 0x03CC	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
   27464:	88 23       	and	r24, r24
   27466:	89 f1       	breq	.+98     	; 0x274ca <manage_heater()+0x92>
#endif

void handle_temp_error()
{
    // relay to the original handler
    switch((TempErrorType)temp_error_state.type) {
   27468:	80 91 cc 03 	lds	r24, 0x03CC	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
   2746c:	82 95       	swap	r24
   2746e:	86 95       	lsr	r24
   27470:	87 70       	andi	r24, 0x07	; 7
   27472:	81 30       	cpi	r24, 0x01	; 1
   27474:	01 f1       	breq	.+64     	; 0x274b6 <manage_heater()+0x7e>
   27476:	08 f4       	brcc	.+2      	; 0x2747a <manage_heater()+0x42>
   27478:	be c1       	rjmp	.+892    	; 0x277f6 <manage_heater()+0x3be>
   2747a:	84 30       	cpi	r24, 0x04	; 4
   2747c:	30 f5       	brcc	.+76     	; 0x274ca <manage_heater()+0x92>
#endif
        }
        break;
    case TempErrorType::preheat:
    case TempErrorType::runaway:
        switch((TempErrorSource)temp_error_state.source) {
   2747e:	80 91 cc 03 	lds	r24, 0x03CC	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
   27482:	86 95       	lsr	r24
   27484:	86 95       	lsr	r24
   27486:	83 70       	andi	r24, 0x03	; 3
   27488:	82 30       	cpi	r24, 0x02	; 2
   2748a:	f8 f4       	brcc	.+62     	; 0x274ca <manage_heater()+0x92>
        case TempErrorSource::hotend:
        case TempErrorSource::bed:
            temp_runaway_stop(
                ((TempErrorType)temp_error_state.type == TempErrorType::preheat),
                ((TempErrorSource)temp_error_state.source == TempErrorSource::bed));
   2748c:	80 91 cc 03 	lds	r24, 0x03CC	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
   27490:	86 95       	lsr	r24
   27492:	86 95       	lsr	r24
   27494:	83 70       	andi	r24, 0x03	; 3
    case TempErrorType::runaway:
        switch((TempErrorSource)temp_error_state.source) {
        case TempErrorSource::hotend:
        case TempErrorSource::bed:
            temp_runaway_stop(
                ((TempErrorType)temp_error_state.type == TempErrorType::preheat),
   27496:	90 91 cc 03 	lds	r25, 0x03CC	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
   2749a:	92 95       	swap	r25
   2749c:	96 95       	lsr	r25
   2749e:	97 70       	andi	r25, 0x07	; 7
    case TempErrorType::preheat:
    case TempErrorType::runaway:
        switch((TempErrorSource)temp_error_state.source) {
        case TempErrorSource::hotend:
        case TempErrorSource::bed:
            temp_runaway_stop(
   274a0:	61 e0       	ldi	r22, 0x01	; 1
   274a2:	81 30       	cpi	r24, 0x01	; 1
   274a4:	09 f0       	breq	.+2      	; 0x274a8 <manage_heater()+0x70>
   274a6:	60 e0       	ldi	r22, 0x00	; 0
   274a8:	81 e0       	ldi	r24, 0x01	; 1
   274aa:	92 30       	cpi	r25, 0x02	; 2
   274ac:	09 f0       	breq	.+2      	; 0x274b0 <manage_heater()+0x78>
   274ae:	80 e0       	ldi	r24, 0x00	; 0
   274b0:	0f 94 3a 36 	call	0x26c74	; 0x26c74 <temp_runaway_stop(bool, bool)>
   274b4:	0a c0       	rjmp	.+20     	; 0x274ca <manage_heater()+0x92>
void handle_temp_error()
{
    // relay to the original handler
    switch((TempErrorType)temp_error_state.type) {
    case TempErrorType::min:
        switch((TempErrorSource)temp_error_state.source) {
   274b6:	80 91 cc 03 	lds	r24, 0x03CC	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
   274ba:	86 95       	lsr	r24
   274bc:	86 95       	lsr	r24
   274be:	83 70       	andi	r24, 0x03	; 3
   274c0:	09 f4       	brne	.+2      	; 0x274c4 <manage_heater()+0x8c>
   274c2:	4b c1       	rjmp	.+662    	; 0x2775a <manage_heater()+0x322>
   274c4:	81 30       	cpi	r24, 0x01	; 1
   274c6:	09 f4       	brne	.+2      	; 0x274ca <manage_heater()+0x92>
   274c8:	79 c1       	rjmp	.+754    	; 0x277bc <manage_heater()+0x384>
#ifndef DEBUG_DISABLE_FANCHECK
#if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1)

#ifdef FAN_SOFT_PWM
#ifdef FANCHECK
  if ((_millis() - extruder_autofan_last_check > FAN_CHECK_PERIOD) && (!fan_measuring)) {
   274ca:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   274ce:	00 91 07 17 	lds	r16, 0x1707	; 0x801707 <extruder_autofan_last_check>
   274d2:	10 91 08 17 	lds	r17, 0x1708	; 0x801708 <extruder_autofan_last_check+0x1>
   274d6:	20 91 09 17 	lds	r18, 0x1709	; 0x801709 <extruder_autofan_last_check+0x2>
   274da:	30 91 0a 17 	lds	r19, 0x170A	; 0x80170a <extruder_autofan_last_check+0x3>
   274de:	60 1b       	sub	r22, r16
   274e0:	71 0b       	sbc	r23, r17
   274e2:	82 0b       	sbc	r24, r18
   274e4:	93 0b       	sbc	r25, r19
   274e6:	69 38       	cpi	r22, 0x89	; 137
   274e8:	73 41       	sbci	r23, 0x13	; 19
   274ea:	81 05       	cpc	r24, r1
   274ec:	91 05       	cpc	r25, r1
   274ee:	d0 f0       	brcs	.+52     	; 0x27524 <manage_heater()+0xec>
   274f0:	80 91 b6 03 	lds	r24, 0x03B6	; 0x8003b6 <fan_measuring>
   274f4:	81 11       	cpse	r24, r1
   274f6:	16 c0       	rjmp	.+44     	; 0x27524 <manage_heater()+0xec>
	  extruder_autofan_last_check = _millis();
   274f8:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   274fc:	60 93 07 17 	sts	0x1707, r22	; 0x801707 <extruder_autofan_last_check>
   27500:	70 93 08 17 	sts	0x1708, r23	; 0x801708 <extruder_autofan_last_check+0x1>
   27504:	80 93 09 17 	sts	0x1709, r24	; 0x801709 <extruder_autofan_last_check+0x2>
   27508:	90 93 0a 17 	sts	0x170A, r25	; 0x80170a <extruder_autofan_last_check+0x3>
	  fanSpeedBckp = fanSpeedSoftPwm;
   2750c:	80 91 1d 06 	lds	r24, 0x061D	; 0x80061d <fanSpeedSoftPwm>
   27510:	80 93 65 02 	sts	0x0265, r24	; 0x800265 <fanSpeedBckp>

	  if (fanSpeedSoftPwm >= MIN_PRINT_FAN_SPEED) { //if we are in rage where we are doing fan check, set full PWM range for a short time to measure fan RPM by reading tacho signal without modulation by PWM signal
   27514:	8b 34       	cpi	r24, 0x4B	; 75
   27516:	18 f0       	brcs	.+6      	; 0x2751e <manage_heater()+0xe6>
		//  printf_P(PSTR("fanSpeedSoftPwm 1: %d\n"), fanSpeedSoftPwm);
		  fanSpeedSoftPwm = 255;
   27518:	8f ef       	ldi	r24, 0xFF	; 255
   2751a:	80 93 1d 06 	sts	0x061D, r24	; 0x80061d <fanSpeedSoftPwm>
	  }
	  fan_measuring = true;
   2751e:	81 e0       	ldi	r24, 0x01	; 1
   27520:	80 93 b6 03 	sts	0x03B6, r24	; 0x8003b6 <fan_measuring>
  }
  if ((_millis() - extruder_autofan_last_check > FAN_CHECK_DURATION) && (fan_measuring)) {
   27524:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   27528:	00 91 07 17 	lds	r16, 0x1707	; 0x801707 <extruder_autofan_last_check>
   2752c:	10 91 08 17 	lds	r17, 0x1708	; 0x801708 <extruder_autofan_last_check+0x1>
   27530:	20 91 09 17 	lds	r18, 0x1709	; 0x801709 <extruder_autofan_last_check+0x2>
   27534:	30 91 0a 17 	lds	r19, 0x170A	; 0x80170a <extruder_autofan_last_check+0x3>
   27538:	60 1b       	sub	r22, r16
   2753a:	71 0b       	sbc	r23, r17
   2753c:	82 0b       	sbc	r24, r18
   2753e:	93 0b       	sbc	r25, r19
   27540:	65 36       	cpi	r22, 0x65	; 101
   27542:	71 05       	cpc	r23, r1
   27544:	81 05       	cpc	r24, r1
   27546:	91 05       	cpc	r25, r1
   27548:	08 f4       	brcc	.+2      	; 0x2754c <manage_heater()+0x114>
   2754a:	a5 c1       	rjmp	.+842    	; 0x27896 <manage_heater()+0x45e>
   2754c:	80 91 b6 03 	lds	r24, 0x03B6	; 0x8003b6 <fan_measuring>
   27550:	88 23       	and	r24, r24
   27552:	09 f4       	brne	.+2      	; 0x27556 <manage_heater()+0x11e>
   27554:	a0 c1       	rjmp	.+832    	; 0x27896 <manage_heater()+0x45e>
#if (defined(FANCHECK) && (((defined(TACH_0) && (TACH_0 >-1)) || (defined(TACH_1) && (TACH_1 > -1)))))

void countFanSpeed()
{
    //SERIAL_ECHOPGM("edge counter 1:"); MYSERIAL.println(fan_edge_counter[1]);
    fan_speed[0] = (fan_edge_counter[0] * (float(250) / (_millis() - extruder_autofan_last_check)));
   27556:	60 91 b5 05 	lds	r22, 0x05B5	; 0x8005b5 <fan_edge_counter>
   2755a:	70 91 b6 05 	lds	r23, 0x05B6	; 0x8005b6 <fan_edge_counter+0x1>
   2755e:	07 2e       	mov	r0, r23
   27560:	00 0c       	add	r0, r0
   27562:	88 0b       	sbc	r24, r24
   27564:	99 0b       	sbc	r25, r25
   27566:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   2756a:	6b 01       	movw	r12, r22
   2756c:	7c 01       	movw	r14, r24
   2756e:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   27572:	00 91 07 17 	lds	r16, 0x1707	; 0x801707 <extruder_autofan_last_check>
   27576:	10 91 08 17 	lds	r17, 0x1708	; 0x801708 <extruder_autofan_last_check+0x1>
   2757a:	20 91 09 17 	lds	r18, 0x1709	; 0x801709 <extruder_autofan_last_check+0x2>
   2757e:	30 91 0a 17 	lds	r19, 0x170A	; 0x80170a <extruder_autofan_last_check+0x3>
   27582:	60 1b       	sub	r22, r16
   27584:	71 0b       	sbc	r23, r17
   27586:	82 0b       	sbc	r24, r18
   27588:	93 0b       	sbc	r25, r19
   2758a:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   2758e:	9b 01       	movw	r18, r22
   27590:	ac 01       	movw	r20, r24
   27592:	60 e0       	ldi	r22, 0x00	; 0
   27594:	70 e0       	ldi	r23, 0x00	; 0
   27596:	8a e7       	ldi	r24, 0x7A	; 122
   27598:	93 e4       	ldi	r25, 0x43	; 67
   2759a:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   2759e:	a7 01       	movw	r20, r14
   275a0:	96 01       	movw	r18, r12
   275a2:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   275a6:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   275aa:	70 93 b8 03 	sts	0x03B8, r23	; 0x8003b8 <fan_speed+0x1>
   275ae:	60 93 b7 03 	sts	0x03B7, r22	; 0x8003b7 <fan_speed>
    fan_speed[1] = (fan_edge_counter[1] * (float(250) / (_millis() - extruder_autofan_last_check)));
   275b2:	60 91 b7 05 	lds	r22, 0x05B7	; 0x8005b7 <fan_edge_counter+0x2>
   275b6:	70 91 b8 05 	lds	r23, 0x05B8	; 0x8005b8 <fan_edge_counter+0x3>
   275ba:	07 2e       	mov	r0, r23
   275bc:	00 0c       	add	r0, r0
   275be:	88 0b       	sbc	r24, r24
   275c0:	99 0b       	sbc	r25, r25
   275c2:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   275c6:	6b 01       	movw	r12, r22
   275c8:	7c 01       	movw	r14, r24
   275ca:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   275ce:	00 91 07 17 	lds	r16, 0x1707	; 0x801707 <extruder_autofan_last_check>
   275d2:	10 91 08 17 	lds	r17, 0x1708	; 0x801708 <extruder_autofan_last_check+0x1>
   275d6:	20 91 09 17 	lds	r18, 0x1709	; 0x801709 <extruder_autofan_last_check+0x2>
   275da:	30 91 0a 17 	lds	r19, 0x170A	; 0x80170a <extruder_autofan_last_check+0x3>
   275de:	60 1b       	sub	r22, r16
   275e0:	71 0b       	sbc	r23, r17
   275e2:	82 0b       	sbc	r24, r18
   275e4:	93 0b       	sbc	r25, r19
   275e6:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   275ea:	9b 01       	movw	r18, r22
   275ec:	ac 01       	movw	r20, r24
   275ee:	60 e0       	ldi	r22, 0x00	; 0
   275f0:	70 e0       	ldi	r23, 0x00	; 0
   275f2:	8a e7       	ldi	r24, 0x7A	; 122
   275f4:	93 e4       	ldi	r25, 0x43	; 67
   275f6:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   275fa:	a7 01       	movw	r20, r14
   275fc:	96 01       	movw	r18, r12
   275fe:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   27602:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   27606:	70 93 ba 03 	sts	0x03BA, r23	; 0x8003ba <fan_speed+0x3>
   2760a:	60 93 b9 03 	sts	0x03B9, r22	; 0x8003b9 <fan_speed+0x2>
    /*SERIAL_ECHOPGM("time interval: "); MYSERIAL.println(_millis() - extruder_autofan_last_check);
    SERIAL_ECHOPGM("hotend fan speed:"); MYSERIAL.print(fan_speed[0]); SERIAL_ECHOPGM("; edge counter:"); MYSERIAL.println(fan_edge_counter[0]);
    SERIAL_ECHOPGM("print fan speed:"); MYSERIAL.print(fan_speed[1]); SERIAL_ECHOPGM("; edge counter:"); MYSERIAL.println(fan_edge_counter[1]);
    SERIAL_ECHOLNPGM(" ");*/
    fan_edge_counter[0] = 0;
   2760e:	10 92 b6 05 	sts	0x05B6, r1	; 0x8005b6 <fan_edge_counter+0x1>
   27612:	10 92 b5 05 	sts	0x05B5, r1	; 0x8005b5 <fan_edge_counter>
    fan_edge_counter[1] = 0;
   27616:	10 92 b8 05 	sts	0x05B8, r1	; 0x8005b8 <fan_edge_counter+0x3>
   2761a:	10 92 b7 05 	sts	0x05B7, r1	; 0x8005b7 <fan_edge_counter+0x2>

void checkFanSpeed()
{
    uint8_t max_fan_errors[2];
#ifdef FAN_SOFT_PWM
    max_fan_errors[1] = 3;  // 15 seconds (Print fan)
   2761e:	83 e0       	ldi	r24, 0x03	; 3
   27620:	8a 83       	std	Y+2, r24	; 0x02
    max_fan_errors[0] = 2;  // 10 seconds (Hotend fan)
   27622:	82 e0       	ldi	r24, 0x02	; 2
   27624:	89 83       	std	Y+1, r24	; 0x01
#else //FAN_SOFT_PWM
    max_fan_errors[1] = 15; // 15 seconds (Print fan)
    max_fan_errors[0] = 5;  // 5  seconds (Hotend fan)
#endif //FAN_SOFT_PWM

    if(fans_check_enabled)
   27626:	80 91 40 02 	lds	r24, 0x0240	; 0x800240 <fans_check_enabled>
   2762a:	88 23       	and	r24, r24
   2762c:	51 f0       	breq	.+20     	; 0x27642 <manage_heater()+0x20a>
        fans_check_enabled = (eeprom_read_byte((uint8_t*)EEPROM_FAN_CHECK_ENABLED) > 0);
   2762e:	87 e8       	ldi	r24, 0x87	; 135
   27630:	9f e0       	ldi	r25, 0x0F	; 15
   27632:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   27636:	91 e0       	ldi	r25, 0x01	; 1
   27638:	81 11       	cpse	r24, r1
   2763a:	01 c0       	rjmp	.+2      	; 0x2763e <manage_heater()+0x206>
   2763c:	90 e0       	ldi	r25, 0x00	; 0
   2763e:	90 93 40 02 	sts	0x0240, r25	; 0x800240 <fans_check_enabled>
    static uint8_t fan_speed_errors[2] = { 0,0 };
#if (defined(FANCHECK) && defined(TACH_0) && (TACH_0 >-1))
    if ((fan_speed[0] < 20) && (current_temperature[0] > EXTRUDER_AUTO_FAN_TEMPERATURE)){ fan_speed_errors[0]++;}
   27642:	80 91 b7 03 	lds	r24, 0x03B7	; 0x8003b7 <fan_speed>
   27646:	90 91 b8 03 	lds	r25, 0x03B8	; 0x8003b8 <fan_speed+0x1>
   2764a:	44 97       	sbiw	r24, 0x14	; 20
   2764c:	0c f0       	brlt	.+2      	; 0x27650 <manage_heater()+0x218>
   2764e:	f2 c0       	rjmp	.+484    	; 0x27834 <manage_heater()+0x3fc>
   27650:	20 e0       	ldi	r18, 0x00	; 0
   27652:	30 e0       	ldi	r19, 0x00	; 0
   27654:	48 e4       	ldi	r20, 0x48	; 72
   27656:	52 e4       	ldi	r21, 0x42	; 66
   27658:	60 91 5a 0d 	lds	r22, 0x0D5A	; 0x800d5a <current_temperature>
   2765c:	70 91 5b 0d 	lds	r23, 0x0D5B	; 0x800d5b <current_temperature+0x1>
   27660:	80 91 5c 0d 	lds	r24, 0x0D5C	; 0x800d5c <current_temperature+0x2>
   27664:	90 91 5d 0d 	lds	r25, 0x0D5D	; 0x800d5d <current_temperature+0x3>
   27668:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   2766c:	18 16       	cp	r1, r24
   2766e:	0c f0       	brlt	.+2      	; 0x27672 <manage_heater()+0x23a>
   27670:	e1 c0       	rjmp	.+450    	; 0x27834 <manage_heater()+0x3fc>
   27672:	80 91 80 05 	lds	r24, 0x0580	; 0x800580 <checkFanSpeed()::fan_speed_errors>
   27676:	8f 5f       	subi	r24, 0xFF	; 255
   27678:	80 93 80 05 	sts	0x0580, r24	; 0x800580 <checkFanSpeed()::fan_speed_errors>
    if ((fan_speed[1] < 5) && ((blocks_queued() ? block_buffer[block_buffer_tail].fan_speed : fanSpeed) > MIN_PRINT_FAN_SPEED)) fan_speed_errors[1]++;
    else fan_speed_errors[1] = 0;
#endif

    // drop the fan_check_error flag when both fans are ok
    if( fan_speed_errors[0] == 0 && fan_speed_errors[1] == 0 && fan_check_error == EFCE_REPORTED){
   2767c:	80 91 80 05 	lds	r24, 0x0580	; 0x800580 <checkFanSpeed()::fan_speed_errors>
   27680:	81 11       	cpse	r24, r1
   27682:	0b c0       	rjmp	.+22     	; 0x2769a <manage_heater()+0x262>
   27684:	80 91 81 05 	lds	r24, 0x0581	; 0x800581 <checkFanSpeed()::fan_speed_errors+0x1>
   27688:	81 11       	cpse	r24, r1
   2768a:	07 c0       	rjmp	.+14     	; 0x2769a <manage_heater()+0x262>
   2768c:	80 91 ce 03 	lds	r24, 0x03CE	; 0x8003ce <fan_check_error>
   27690:	82 30       	cpi	r24, 0x02	; 2
   27692:	19 f4       	brne	.+6      	; 0x2769a <manage_heater()+0x262>
        // we may even send some info to the LCD from here
        fan_check_error = EFCE_FIXED;
   27694:	81 e0       	ldi	r24, 0x01	; 1
   27696:	80 93 ce 03 	sts	0x03CE, r24	; 0x8003ce <fan_check_error>
    }
    if ((fan_check_error == EFCE_FIXED) && !printer_active()){
   2769a:	80 91 ce 03 	lds	r24, 0x03CE	; 0x8003ce <fan_check_error>
   2769e:	81 30       	cpi	r24, 0x01	; 1
   276a0:	61 f4       	brne	.+24     	; 0x276ba <manage_heater()+0x282>
   276a2:	0e 94 91 66 	call	0xcd22	; 0xcd22 <printer_active()>
   276a6:	81 11       	cpse	r24, r1
   276a8:	08 c0       	rjmp	.+16     	; 0x276ba <manage_heater()+0x282>
        fan_check_error = EFCE_OK; //if the issue is fixed while the printer is doing nothing, reenable processing immediately.
   276aa:	10 92 ce 03 	sts	0x03CE, r1	; 0x8003ce <fan_check_error>
    lcd_setalertstatus_(message, severity, true);
}

void lcd_reset_alert_level()
{
    lcd_status_message_level = 0;
   276ae:	10 92 c0 03 	sts	0x03C0, r1	; 0x8003c0 <_ZL24lcd_status_message_level.lto_priv.422>
        lcd_reset_alert_level(); //for another fan speed error
        lcd_setstatuspgm(MSG_WELCOME); // Reset the status line message to visually show the error is gone
   276b2:	86 ee       	ldi	r24, 0xE6	; 230
   276b4:	9b e6       	ldi	r25, 0x6B	; 107
   276b6:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
    }
    if (fans_check_enabled && (fan_check_error != EFCE_REPORTED))
   276ba:	80 91 40 02 	lds	r24, 0x0240	; 0x800240 <fans_check_enabled>
   276be:	88 23       	and	r24, r24
   276c0:	09 f4       	brne	.+2      	; 0x276c4 <manage_heater()+0x28c>
   276c2:	d9 c0       	rjmp	.+434    	; 0x27876 <manage_heater()+0x43e>
   276c4:	80 91 ce 03 	lds	r24, 0x03CE	; 0x8003ce <fan_check_error>
   276c8:	82 30       	cpi	r24, 0x02	; 2
   276ca:	09 f4       	brne	.+2      	; 0x276ce <manage_heater()+0x296>
   276cc:	d4 c0       	rjmp	.+424    	; 0x27876 <manage_heater()+0x43e>
   276ce:	80 e8       	ldi	r24, 0x80	; 128
   276d0:	e8 2e       	mov	r14, r24
   276d2:	85 e0       	ldi	r24, 0x05	; 5
   276d4:	f8 2e       	mov	r15, r24
   276d6:	ce 01       	movw	r24, r28
   276d8:	01 96       	adiw	r24, 0x01	; 1
   276da:	6c 01       	movw	r12, r24
    {
        for (uint8_t fan = 0; fan < 2; fan++)
   276dc:	10 e0       	ldi	r17, 0x00	; 0
    }
}

void fanSpeedError(unsigned char _fan) {
    if (fan_check_error == EFCE_REPORTED) return;
    fan_check_error = EFCE_REPORTED;
   276de:	02 e0       	ldi	r16, 0x02	; 2
    }
    if (fans_check_enabled && (fan_check_error != EFCE_REPORTED))
    {
        for (uint8_t fan = 0; fan < 2; fan++)
        {
            if (fan_speed_errors[fan] > max_fan_errors[fan])
   276e0:	f7 01       	movw	r30, r14
   276e2:	91 91       	ld	r25, Z+
   276e4:	7f 01       	movw	r14, r30
   276e6:	f6 01       	movw	r30, r12
   276e8:	81 91       	ld	r24, Z+
   276ea:	6f 01       	movw	r12, r30
   276ec:	89 17       	cp	r24, r25
   276ee:	80 f5       	brcc	.+96     	; 0x27750 <manage_heater()+0x318>
            {
                fan_speed_errors[fan] = 0;
   276f0:	f7 01       	movw	r30, r14
   276f2:	31 97       	sbiw	r30, 0x01	; 1
   276f4:	10 82       	st	Z, r1
        LCD_ALERTMESSAGERPGM(lcdMsg);
    }
}

void fanSpeedError(unsigned char _fan) {
    if (fan_check_error == EFCE_REPORTED) return;
   276f6:	80 91 ce 03 	lds	r24, 0x03CE	; 0x8003ce <fan_check_error>
   276fa:	82 30       	cpi	r24, 0x02	; 2
   276fc:	49 f1       	breq	.+82     	; 0x27750 <manage_heater()+0x318>
    fan_check_error = EFCE_REPORTED;
   276fe:	00 93 ce 03 	sts	0x03CE, r16	; 0x8003ce <fan_check_error>

    if (printJobOngoing()) {
   27702:	0e 94 40 66 	call	0xcc80	; 0xcc80 <printJobOngoing()>
   27706:	88 23       	and	r24, r24
   27708:	09 f4       	brne	.+2      	; 0x2770c <manage_heater()+0x2d4>
   2770a:	9a c0       	rjmp	.+308    	; 0x27840 <manage_heater()+0x408>
        // A print is ongoing, pause the print normally
        if(!printingIsPaused()) {
   2770c:	0e 94 35 66 	call	0xcc6a	; 0xcc6a <printingIsPaused()>
   27710:	81 11       	cpse	r24, r1
   27712:	07 c0       	rjmp	.+14     	; 0x27722 <manage_heater()+0x2ea>
            if (usb_timer.running())
   27714:	80 91 42 12 	lds	r24, 0x1242	; 0x801242 <usb_timer>
   27718:	88 23       	and	r24, r24
   2771a:	09 f4       	brne	.+2      	; 0x2771e <manage_heater()+0x2e6>
   2771c:	8e c0       	rjmp	.+284    	; 0x2783a <manage_heater()+0x402>
                lcd_pause_usb_print();
   2771e:	0f 94 d1 07 	call	0x20fa2	; 0x20fa2 <lcd_pause_usb_print()>
    else {
        // Nothing is going on, but still turn off heaters and report the error
        setTargetHotend(0);
        heating_status = HeatingStatus::NO_HEATING;
    }
    switch (_fan) {
   27722:	11 30       	cpi	r17, 0x01	; 1
   27724:	09 f4       	brne	.+2      	; 0x27728 <manage_heater()+0x2f0>
   27726:	93 c0       	rjmp	.+294    	; 0x2784e <manage_heater()+0x416>
//! Prints serialMsg to serial port, displays lcdMsg onto the LCD and beeps.
//! Extracted from fanSpeedError to save some space.
//! @param serialMsg pointer into PROGMEM, this text will be printed to the serial port
//! @param lcdMsg pointer into PROGMEM, this text will be printed onto the LCD
static void fanSpeedErrorBeep(const char *serialMsg, const char *lcdMsg){
    SERIAL_ECHOLNRPGM(serialMsg);
   27728:	83 ee       	ldi	r24, 0xE3	; 227
   2772a:	94 e9       	ldi	r25, 0x94	; 148
   2772c:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
    if (get_message_level() == 0) {
   27730:	80 91 c0 03 	lds	r24, 0x03C0	; 0x8003c0 <_ZL24lcd_status_message_level.lto_priv.422>
   27734:	81 11       	cpse	r24, r1
   27736:	0c c0       	rjmp	.+24     	; 0x27750 <manage_heater()+0x318>
        Sound_MakeCustom(200,0,true);
   27738:	41 e0       	ldi	r20, 0x01	; 1
   2773a:	70 e0       	ldi	r23, 0x00	; 0
   2773c:	60 e0       	ldi	r22, 0x00	; 0
   2773e:	88 ec       	ldi	r24, 0xC8	; 200
   27740:	90 e0       	ldi	r25, 0x00	; 0
   27742:	0f 94 be 27 	call	0x24f7c	; 0x24f7c <Sound_MakeCustom(unsigned int, unsigned int, bool)>
        LCD_ALERTMESSAGERPGM(lcdMsg);
   27746:	62 e0       	ldi	r22, 0x02	; 2
   27748:	86 e2       	ldi	r24, 0x26	; 38
   2774a:	98 e6       	ldi	r25, 0x68	; 104
   2774c:	0e 94 2c da 	call	0x1b458	; 0x1b458 <lcd_setalertstatuspgm(char const*, unsigned char)>
        lcd_reset_alert_level(); //for another fan speed error
        lcd_setstatuspgm(MSG_WELCOME); // Reset the status line message to visually show the error is gone
    }
    if (fans_check_enabled && (fan_check_error != EFCE_REPORTED))
    {
        for (uint8_t fan = 0; fan < 2; fan++)
   27750:	11 30       	cpi	r17, 0x01	; 1
   27752:	09 f4       	brne	.+2      	; 0x27756 <manage_heater()+0x31e>
   27754:	90 c0       	rjmp	.+288    	; 0x27876 <manage_heater()+0x43e>
   27756:	11 e0       	ldi	r17, 0x01	; 1
   27758:	c3 cf       	rjmp	.-122    	; 0x276e0 <manage_heater()+0x2a8>
        case TempErrorSource::hotend:
            if(temp_error_state.assert) {
   2775a:	80 91 cc 03 	lds	r24, 0x03CC	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
   2775e:	81 ff       	sbrs	r24, 1
   27760:	12 c0       	rjmp	.+36     	; 0x27786 <manage_heater()+0x34e>
                min_temp_error(temp_error_state.index);
   27762:	60 91 cc 03 	lds	r22, 0x03CC	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
   27766:	62 95       	swap	r22
   27768:	61 70       	andi	r22, 0x01	; 1
#endif
}

static void min_temp_error(uint8_t e) {
    static const char err[] PROGMEM = "MINTEMP";
    if(IsStopped() == false) {
   2776a:	80 91 3b 12 	lds	r24, 0x123B	; 0x80123b <Stopped>
   2776e:	81 11       	cpse	r24, r1
   27770:	07 c0       	rjmp	.+14     	; 0x27780 <manage_heater()+0x348>
        temp_error_messagepgm(err, e);
   27772:	8e e3       	ldi	r24, 0x3E	; 62
   27774:	95 e9       	ldi	r25, 0x95	; 149
   27776:	0f 94 55 10 	call	0x220aa	; 0x220aa <temp_error_messagepgm(char const*, unsigned char)>
        prusa_statistics(92);
   2777a:	8c e5       	ldi	r24, 0x5C	; 92
   2777c:	0f 94 79 32 	call	0x264f2	; 0x264f2 <prusa_statistics(unsigned char)>
    }
    ThermalStop();
   27780:	0f 94 4f 67 	call	0x2ce9e	; 0x2ce9e <ThermalStop(bool) [clone .constprop.301]>
   27784:	a2 ce       	rjmp	.-700    	; 0x274ca <manage_heater()+0x92>
                // which is a safer variant than just continuing printing
                // The automaton also checks for hysteresis - the temperature must have reached a few degrees above the MINTEMP, before
                // we shall signalize, that MINTEMP has been fixed
                // Code notice: normally the alert_automaton instance would have been placed here
                // as static alert_automaton_mintemp alert_automaton_hotend, but
                alert_automaton_hotend.step(current_temperature[0], minttemp[0] + TEMP_HYSTERESIS);
   27786:	60 91 0d 04 	lds	r22, 0x040D	; 0x80040d <_ZL8minttemp.lto_priv.427>
   2778a:	70 91 0e 04 	lds	r23, 0x040E	; 0x80040e <_ZL8minttemp.lto_priv.427+0x1>
   2778e:	6b 5f       	subi	r22, 0xFB	; 251
   27790:	7f 4f       	sbci	r23, 0xFF	; 255
   27792:	07 2e       	mov	r0, r23
   27794:	00 0c       	add	r0, r0
   27796:	88 0b       	sbc	r24, r24
   27798:	99 0b       	sbc	r25, r25
   2779a:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   2779e:	8b 01       	movw	r16, r22
   277a0:	9c 01       	movw	r18, r24
   277a2:	40 91 5a 0d 	lds	r20, 0x0D5A	; 0x800d5a <current_temperature>
   277a6:	50 91 5b 0d 	lds	r21, 0x0D5B	; 0x800d5b <current_temperature+0x1>
   277aa:	60 91 5c 0d 	lds	r22, 0x0D5C	; 0x800d5c <current_temperature+0x2>
   277ae:	70 91 5d 0d 	lds	r23, 0x0D5D	; 0x800d5d <current_temperature+0x3>
   277b2:	8a e6       	ldi	r24, 0x6A	; 106
   277b4:	92 e0       	ldi	r25, 0x02	; 2
            if(temp_error_state.assert) {
                bed_min_temp_error();
            } else {
                // no recovery, just force the user to restart the printer
                // which is a safer variant than just continuing printing
                alert_automaton_bed.step(current_temperature_bed, BED_MINTEMP + TEMP_HYSTERESIS);
   277b6:	0f 94 17 08 	call	0x2102e	; 0x2102e <alert_automaton_mintemp::step(float, float)>
   277ba:	87 ce       	rjmp	.-754    	; 0x274ca <manage_heater()+0x92>
                // as static alert_automaton_mintemp alert_automaton_hotend, but
                alert_automaton_hotend.step(current_temperature[0], minttemp[0] + TEMP_HYSTERESIS);
            }
            break;
        case TempErrorSource::bed:
            if(temp_error_state.assert) {
   277bc:	80 91 cc 03 	lds	r24, 0x03CC	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
   277c0:	81 ff       	sbrs	r24, 1
   277c2:	0a c0       	rjmp	.+20     	; 0x277d8 <manage_heater()+0x3a0>
    ThermalStop();
}

static void bed_min_temp_error(void) {
    static const char err[] PROGMEM = "MINTEMP BED";
    if(IsStopped() == false) {
   277c4:	80 91 3b 12 	lds	r24, 0x123B	; 0x80123b <Stopped>
   277c8:	81 11       	cpse	r24, r1
   277ca:	da cf       	rjmp	.-76     	; 0x27780 <manage_heater()+0x348>
        temp_error_messagepgm(err);
   277cc:	61 e0       	ldi	r22, 0x01	; 1
   277ce:	82 e3       	ldi	r24, 0x32	; 50
   277d0:	95 e9       	ldi	r25, 0x95	; 149
    ThermalStop();
}

static void bed_max_temp_error(void) {
    if(IsStopped() == false) {
        temp_error_messagepgm(PSTR("MAXTEMP BED"));
   277d2:	0f 94 55 10 	call	0x220aa	; 0x220aa <temp_error_messagepgm(char const*, unsigned char)>
   277d6:	d4 cf       	rjmp	.-88     	; 0x27780 <manage_heater()+0x348>
            if(temp_error_state.assert) {
                bed_min_temp_error();
            } else {
                // no recovery, just force the user to restart the printer
                // which is a safer variant than just continuing printing
                alert_automaton_bed.step(current_temperature_bed, BED_MINTEMP + TEMP_HYSTERESIS);
   277d8:	40 91 bc 03 	lds	r20, 0x03BC	; 0x8003bc <current_temperature_bed>
   277dc:	50 91 bd 03 	lds	r21, 0x03BD	; 0x8003bd <current_temperature_bed+0x1>
   277e0:	60 91 be 03 	lds	r22, 0x03BE	; 0x8003be <current_temperature_bed+0x2>
   277e4:	70 91 bf 03 	lds	r23, 0x03BF	; 0x8003bf <current_temperature_bed+0x3>
   277e8:	00 e0       	ldi	r16, 0x00	; 0
   277ea:	10 e0       	ldi	r17, 0x00	; 0
   277ec:	2c e0       	ldi	r18, 0x0C	; 12
   277ee:	32 e4       	ldi	r19, 0x42	; 66
   277f0:	86 e6       	ldi	r24, 0x66	; 102
   277f2:	92 e0       	ldi	r25, 0x02	; 2
   277f4:	e0 cf       	rjmp	.-64     	; 0x277b6 <manage_heater()+0x37e>
            break;
#endif
        }
        break;
    case TempErrorType::max:
        switch((TempErrorSource)temp_error_state.source) {
   277f6:	80 91 cc 03 	lds	r24, 0x03CC	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
   277fa:	86 95       	lsr	r24
   277fc:	86 95       	lsr	r24
   277fe:	83 70       	andi	r24, 0x03	; 3
   27800:	59 f0       	breq	.+22     	; 0x27818 <manage_heater()+0x3e0>
   27802:	81 30       	cpi	r24, 0x01	; 1
   27804:	09 f0       	breq	.+2      	; 0x27808 <manage_heater()+0x3d0>
   27806:	61 ce       	rjmp	.-830    	; 0x274ca <manage_heater()+0x92>
    }
    ThermalStop();
}

static void bed_max_temp_error(void) {
    if(IsStopped() == false) {
   27808:	80 91 3b 12 	lds	r24, 0x123B	; 0x80123b <Stopped>
   2780c:	81 11       	cpse	r24, r1
   2780e:	b8 cf       	rjmp	.-144    	; 0x27780 <manage_heater()+0x348>
        temp_error_messagepgm(PSTR("MAXTEMP BED"));
   27810:	61 e0       	ldi	r22, 0x01	; 1
   27812:	8e e4       	ldi	r24, 0x4E	; 78
   27814:	95 e9       	ldi	r25, 0x95	; 149
   27816:	dd cf       	rjmp	.-70     	; 0x277d2 <manage_heater()+0x39a>
        }
        break;
    case TempErrorType::max:
        switch((TempErrorSource)temp_error_state.source) {
        case TempErrorSource::hotend:
            max_temp_error(temp_error_state.index);
   27818:	60 91 cc 03 	lds	r22, 0x03CC	; 0x8003cc <_ZL16temp_error_state.lto_priv.425>
   2781c:	62 95       	swap	r22
   2781e:	61 70       	andi	r22, 0x01	; 1
    SERIAL_ERRORLNPGM(" triggered!");
}


static void max_temp_error(uint8_t e) {
    if(IsStopped() == false) {
   27820:	80 91 3b 12 	lds	r24, 0x123B	; 0x80123b <Stopped>
   27824:	81 11       	cpse	r24, r1
   27826:	ac cf       	rjmp	.-168    	; 0x27780 <manage_heater()+0x348>
        temp_error_messagepgm(PSTR("MAXTEMP"), e);
   27828:	86 e4       	ldi	r24, 0x46	; 70
   2782a:	95 e9       	ldi	r25, 0x95	; 149
   2782c:	0f 94 55 10 	call	0x220aa	; 0x220aa <temp_error_messagepgm(char const*, unsigned char)>
        prusa_statistics(93);
   27830:	8d e5       	ldi	r24, 0x5D	; 93
   27832:	a4 cf       	rjmp	.-184    	; 0x2777c <manage_heater()+0x344>
    if(fans_check_enabled)
        fans_check_enabled = (eeprom_read_byte((uint8_t*)EEPROM_FAN_CHECK_ENABLED) > 0);
    static uint8_t fan_speed_errors[2] = { 0,0 };
#if (defined(FANCHECK) && defined(TACH_0) && (TACH_0 >-1))
    if ((fan_speed[0] < 20) && (current_temperature[0] > EXTRUDER_AUTO_FAN_TEMPERATURE)){ fan_speed_errors[0]++;}
    else fan_speed_errors[0] = 0;
   27834:	10 92 80 05 	sts	0x0580, r1	; 0x800580 <checkFanSpeed()::fan_speed_errors>
   27838:	21 cf       	rjmp	.-446    	; 0x2767c <manage_heater()+0x244>
        // A print is ongoing, pause the print normally
        if(!printingIsPaused()) {
            if (usb_timer.running())
                lcd_pause_usb_print();
            else
                lcd_pause_print();
   2783a:	0f 94 fc 0d 	call	0x21bf8	; 0x21bf8 <lcd_pause_print()>
   2783e:	71 cf       	rjmp	.-286    	; 0x27722 <manage_heater()+0x2ea>
};

// Doesn't save FLASH when FORCE_INLINE removed.
FORCE_INLINE void setTargetHotend(const float &celsius) {
  target_temperature[0] = celsius;
   27840:	10 92 5e 12 	sts	0x125E, r1	; 0x80125e <target_temperature+0x1>
   27844:	10 92 5d 12 	sts	0x125D, r1	; 0x80125d <target_temperature>
        }
    }
    else {
        // Nothing is going on, but still turn off heaters and report the error
        setTargetHotend(0);
        heating_status = HeatingStatus::NO_HEATING;
   27848:	10 92 cb 03 	sts	0x03CB, r1	; 0x8003cb <heating_status>
   2784c:	6a cf       	rjmp	.-300    	; 0x27722 <manage_heater()+0x2ea>
//! Prints serialMsg to serial port, displays lcdMsg onto the LCD and beeps.
//! Extracted from fanSpeedError to save some space.
//! @param serialMsg pointer into PROGMEM, this text will be printed to the serial port
//! @param lcdMsg pointer into PROGMEM, this text will be printed onto the LCD
static void fanSpeedErrorBeep(const char *serialMsg, const char *lcdMsg){
    SERIAL_ECHOLNRPGM(serialMsg);
   2784e:	8b e0       	ldi	r24, 0x0B	; 11
   27850:	95 e9       	ldi	r25, 0x95	; 149
   27852:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
    if (get_message_level() == 0) {
   27856:	80 91 c0 03 	lds	r24, 0x03C0	; 0x8003c0 <_ZL24lcd_status_message_level.lto_priv.422>
   2785a:	81 11       	cpse	r24, r1
   2785c:	0c c0       	rjmp	.+24     	; 0x27876 <manage_heater()+0x43e>
        Sound_MakeCustom(200,0,true);
   2785e:	41 e0       	ldi	r20, 0x01	; 1
   27860:	70 e0       	ldi	r23, 0x00	; 0
   27862:	60 e0       	ldi	r22, 0x00	; 0
   27864:	88 ec       	ldi	r24, 0xC8	; 200
   27866:	90 e0       	ldi	r25, 0x00	; 0
   27868:	0f 94 be 27 	call	0x24f7c	; 0x24f7c <Sound_MakeCustom(unsigned int, unsigned int, bool)>
        LCD_ALERTMESSAGERPGM(lcdMsg);
   2786c:	62 e0       	ldi	r22, 0x02	; 2
   2786e:	83 e4       	ldi	r24, 0x43	; 67
   27870:	9a e6       	ldi	r25, 0x6A	; 106
   27872:	0e 94 2c da 	call	0x1b458	; 0x1b458 <lcd_setalertstatuspgm(char const*, unsigned char)>
  }
  if ((_millis() - extruder_autofan_last_check > FAN_CHECK_DURATION) && (fan_measuring)) {
	  countFanSpeed();
	  checkFanSpeed();
	  //printf_P(PSTR("fanSpeedSoftPwm 1: %d\n"), fanSpeedSoftPwm);
	  fanSpeedSoftPwm = fanSpeedBckp;
   27876:	80 91 65 02 	lds	r24, 0x0265	; 0x800265 <fanSpeedBckp>
   2787a:	80 93 1d 06 	sts	0x061D, r24	; 0x80061d <fanSpeedSoftPwm>
	  //printf_P(PSTR("fan PWM: %d; extr fanSpeed measured: %d; print fan speed measured: %d \n"), fanSpeedBckp, fan_speed[0], fan_speed[1]);
	  extruder_autofan_last_check = _millis();
   2787e:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   27882:	60 93 07 17 	sts	0x1707, r22	; 0x801707 <extruder_autofan_last_check>
   27886:	70 93 08 17 	sts	0x1708, r23	; 0x801708 <extruder_autofan_last_check+0x1>
   2788a:	80 93 09 17 	sts	0x1709, r24	; 0x801709 <extruder_autofan_last_check+0x2>
   2788e:	90 93 0a 17 	sts	0x170A, r25	; 0x80170a <extruder_autofan_last_check+0x3>
	  fan_measuring = false;
   27892:	10 92 b6 03 	sts	0x03B6, r1	; 0x8003b6 <fan_measuring>
    checkFans();

#ifdef THERMAL_MODEL_DEBUG
    thermal_model::log_usr();
#endif
}
   27896:	0f 90       	pop	r0
   27898:	0f 90       	pop	r0
   2789a:	df 91       	pop	r29
   2789c:	cf 91       	pop	r28
   2789e:	1f 91       	pop	r17
   278a0:	0f 91       	pop	r16
   278a2:	ff 90       	pop	r15
   278a4:	ef 90       	pop	r14
   278a6:	df 90       	pop	r13
   278a8:	cf 90       	pop	r12
  }
#endif //FANCHECK
  checkExtruderAutoFans();
   278aa:	0c 94 fb 77 	jmp	0xeff6	; 0xeff6 <checkExtruderAutoFans()>
   278ae:	0f 90       	pop	r0
   278b0:	0f 90       	pop	r0
   278b2:	df 91       	pop	r29
   278b4:	cf 91       	pop	r28
   278b6:	1f 91       	pop	r17
   278b8:	0f 91       	pop	r16
   278ba:	ff 90       	pop	r15
   278bc:	ef 90       	pop	r14
   278be:	df 90       	pop	r13
   278c0:	cf 90       	pop	r12
   278c2:	08 95       	ret

000278c4 <code_seen_P(char const*) [clone .lto_priv.409]>:
}
#endif

// Return True if a character was found
static inline bool    code_seen(char code) { return (strchr_pointer = strchr(CMDBUFFER_CURRENT_STRING, code)) != NULL; }
static inline bool    code_seen_P(const char *code_PROGMEM) { return (strchr_pointer = strstr_P(CMDBUFFER_CURRENT_STRING, code_PROGMEM)) != NULL; }
   278c4:	20 91 38 12 	lds	r18, 0x1238	; 0x801238 <bufindr>
   278c8:	30 91 39 12 	lds	r19, 0x1239	; 0x801239 <bufindr+0x1>
   278cc:	bc 01       	movw	r22, r24
   278ce:	c9 01       	movw	r24, r18
   278d0:	82 5b       	subi	r24, 0xB2	; 178
   278d2:	9f 4e       	sbci	r25, 0xEF	; 239
   278d4:	0f 94 e7 a1 	call	0x343ce	; 0x343ce <strstr_P>
   278d8:	9c 01       	movw	r18, r24
   278da:	90 93 bc 04 	sts	0x04BC, r25	; 0x8004bc <strchr_pointer+0x1>
   278de:	80 93 bb 04 	sts	0x04BB, r24	; 0x8004bb <strchr_pointer>
   278e2:	81 e0       	ldi	r24, 0x01	; 1
   278e4:	23 2b       	or	r18, r19
   278e6:	09 f4       	brne	.+2      	; 0x278ea <code_seen_P(char const*) [clone .lto_priv.409]+0x26>
   278e8:	80 e0       	ldi	r24, 0x00	; 0
   278ea:	08 95       	ret

000278ec <planner_calc_sd_length()>:
  }
}

uint16_t planner_calc_sd_length()
{
	uint8_t _block_buffer_head = block_buffer_head;
   278ec:	60 91 3e 0d 	lds	r22, 0x0D3E	; 0x800d3e <block_buffer_head>
	uint8_t _block_buffer_tail = block_buffer_tail;
   278f0:	90 91 3f 0d 	lds	r25, 0x0D3F	; 0x800d3f <block_buffer_tail>
	uint16_t sdlen = 0;
   278f4:	30 e0       	ldi	r19, 0x00	; 0
   278f6:	20 e0       	ldi	r18, 0x00	; 0
	while (_block_buffer_head != _block_buffer_tail)
	{
		sdlen += block_buffer[_block_buffer_tail].sdlen;
   278f8:	8e e6       	ldi	r24, 0x6E	; 110
uint16_t planner_calc_sd_length()
{
	uint8_t _block_buffer_head = block_buffer_head;
	uint8_t _block_buffer_tail = block_buffer_tail;
	uint16_t sdlen = 0;
	while (_block_buffer_head != _block_buffer_tail)
   278fa:	96 17       	cp	r25, r22
   278fc:	61 f0       	breq	.+24     	; 0x27916 <planner_calc_sd_length()+0x2a>
	{
		sdlen += block_buffer[_block_buffer_tail].sdlen;
   278fe:	89 9f       	mul	r24, r25
   27900:	f0 01       	movw	r30, r0
   27902:	11 24       	eor	r1, r1
   27904:	e6 53       	subi	r30, 0x36	; 54
   27906:	f9 4f       	sbci	r31, 0xF9	; 249
   27908:	40 81       	ld	r20, Z
   2790a:	51 81       	ldd	r21, Z+1	; 0x01
   2790c:	24 0f       	add	r18, r20
   2790e:	35 1f       	adc	r19, r21
	    _block_buffer_tail = (_block_buffer_tail + 1) & (BLOCK_BUFFER_SIZE - 1);
   27910:	9f 5f       	subi	r25, 0xFF	; 255
   27912:	9f 70       	andi	r25, 0x0F	; 15
   27914:	f2 cf       	rjmp	.-28     	; 0x278fa <planner_calc_sd_length()+0xe>
	}
	return sdlen;
}
   27916:	c9 01       	movw	r24, r18
   27918:	08 95       	ret

0002791a <planner_add_sd_length(unsigned int)>:
}
#endif /* PLANNER_DIAGNOSTICS */

void planner_add_sd_length(uint16_t sdlen)
{
  if (block_buffer_head != block_buffer_tail) {
   2791a:	30 91 3e 0d 	lds	r19, 0x0D3E	; 0x800d3e <block_buffer_head>
   2791e:	20 91 3f 0d 	lds	r18, 0x0D3F	; 0x800d3f <block_buffer_tail>
   27922:	32 17       	cp	r19, r18
   27924:	91 f0       	breq	.+36     	; 0x2794a <planner_add_sd_length(unsigned int)+0x30>
    // The planner buffer is not empty. Get the index of the last buffer line entered,
    // which is (block_buffer_head - 1) modulo BLOCK_BUFFER_SIZE.
    block_buffer[prev_block_index(block_buffer_head)].sdlen += sdlen;
   27926:	e0 91 3e 0d 	lds	r30, 0x0D3E	; 0x800d3e <block_buffer_head>
}


// Returns the index of the previous block in the ring buffer
static inline uint8_t prev_block_index(uint8_t block_index) {
  if (block_index == 0)
   2792a:	e1 11       	cpse	r30, r1
   2792c:	01 c0       	rjmp	.+2      	; 0x27930 <planner_add_sd_length(unsigned int)+0x16>
    block_index = BLOCK_BUFFER_SIZE;
   2792e:	e0 e1       	ldi	r30, 0x10	; 16
  -- block_index;
   27930:	e1 50       	subi	r30, 0x01	; 1
void planner_add_sd_length(uint16_t sdlen)
{
  if (block_buffer_head != block_buffer_tail) {
    // The planner buffer is not empty. Get the index of the last buffer line entered,
    // which is (block_buffer_head - 1) modulo BLOCK_BUFFER_SIZE.
    block_buffer[prev_block_index(block_buffer_head)].sdlen += sdlen;
   27932:	2e e6       	ldi	r18, 0x6E	; 110
   27934:	e2 9f       	mul	r30, r18
   27936:	f0 01       	movw	r30, r0
   27938:	11 24       	eor	r1, r1
   2793a:	e6 53       	subi	r30, 0x36	; 54
   2793c:	f9 4f       	sbci	r31, 0xF9	; 249
   2793e:	20 81       	ld	r18, Z
   27940:	31 81       	ldd	r19, Z+1	; 0x01
   27942:	82 0f       	add	r24, r18
   27944:	93 1f       	adc	r25, r19
   27946:	91 83       	std	Z+1, r25	; 0x01
   27948:	80 83       	st	Z, r24
  } else {
    // There is no line stored in the planner buffer, which means the last command does not need to be revertible,
    // at a power panic, so the length of this command may be forgotten.
  }
}
   2794a:	08 95       	ret

0002794c <reset_acceleration_rates()>:
}
#endif //PREVENT_DANGEROUS_EXTRUDE

// Calculate the steps/s^2 acceleration rates, based on the mm/s^s
void reset_acceleration_rates()
{
   2794c:	cf 92       	push	r12
   2794e:	df 92       	push	r13
   27950:	ef 92       	push	r14
   27952:	ff 92       	push	r15
   27954:	0f 93       	push	r16
   27956:	1f 93       	push	r17
   27958:	cf 93       	push	r28
   2795a:	df 93       	push	r29
   2795c:	0b e6       	ldi	r16, 0x6B	; 107
   2795e:	1d e0       	ldi	r17, 0x0D	; 13
   27960:	cb ea       	ldi	r28, 0xAB	; 171
   27962:	d4 e0       	ldi	r29, 0x04	; 4
   27964:	8b eb       	ldi	r24, 0xBB	; 187
   27966:	c8 2e       	mov	r12, r24
   27968:	84 e0       	ldi	r24, 0x04	; 4
   2796a:	d8 2e       	mov	r13, r24
   2796c:	78 01       	movw	r14, r16
   2796e:	0c 5f       	subi	r16, 0xFC	; 252
   27970:	1f 4f       	sbci	r17, 0xFF	; 255
	for(int8_t i=0; i < NUM_AXIS; i++)
        max_acceleration_steps_per_s2[i] = max_acceleration_mm_per_s2[i] * cs.axis_steps_per_mm[i];
   27972:	f7 01       	movw	r30, r14
   27974:	60 a1       	ldd	r22, Z+32	; 0x20
   27976:	71 a1       	ldd	r23, Z+33	; 0x21
   27978:	82 a1       	ldd	r24, Z+34	; 0x22
   2797a:	93 a1       	ldd	r25, Z+35	; 0x23
   2797c:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   27980:	f7 01       	movw	r30, r14
   27982:	20 81       	ld	r18, Z
   27984:	31 81       	ldd	r19, Z+1	; 0x01
   27986:	42 81       	ldd	r20, Z+2	; 0x02
   27988:	53 81       	ldd	r21, Z+3	; 0x03
   2798a:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2798e:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   27992:	69 93       	st	Y+, r22
   27994:	79 93       	st	Y+, r23
   27996:	89 93       	st	Y+, r24
   27998:	99 93       	st	Y+, r25
#endif //PREVENT_DANGEROUS_EXTRUDE

// Calculate the steps/s^2 acceleration rates, based on the mm/s^s
void reset_acceleration_rates()
{
	for(int8_t i=0; i < NUM_AXIS; i++)
   2799a:	cc 16       	cp	r12, r28
   2799c:	dd 06       	cpc	r13, r29
   2799e:	31 f7       	brne	.-52     	; 0x2796c <reset_acceleration_rates()+0x20>
        max_acceleration_steps_per_s2[i] = max_acceleration_mm_per_s2[i] * cs.axis_steps_per_mm[i];
}
   279a0:	df 91       	pop	r29
   279a2:	cf 91       	pop	r28
   279a4:	1f 91       	pop	r17
   279a6:	0f 91       	pop	r16
   279a8:	ff 90       	pop	r15
   279aa:	ef 90       	pop	r14
   279ac:	df 90       	pop	r13
   279ae:	cf 90       	pop	r12
   279b0:	08 95       	ret

000279b2 <plan_set_e_position(float const&)>:
}

void plan_set_e_position(const float &e)
{
  #ifdef LIN_ADVANCE
  position_float[E_AXIS] = e;
   279b2:	fc 01       	movw	r30, r24
   279b4:	40 81       	ld	r20, Z
   279b6:	51 81       	ldd	r21, Z+1	; 0x01
   279b8:	62 81       	ldd	r22, Z+2	; 0x02
   279ba:	73 81       	ldd	r23, Z+3	; 0x03
   279bc:	40 93 42 04 	sts	0x0442, r20	; 0x800442 <position_float+0xc>
   279c0:	50 93 43 04 	sts	0x0443, r21	; 0x800443 <position_float+0xd>
   279c4:	60 93 44 04 	sts	0x0444, r22	; 0x800444 <position_float+0xe>
   279c8:	70 93 45 04 	sts	0x0445, r23	; 0x800445 <position_float+0xf>
  #endif
  position[E_AXIS] = lround(e*cs.axis_steps_per_mm[E_AXIS]);
   279cc:	20 91 77 0d 	lds	r18, 0x0D77	; 0x800d77 <cs+0x10>
   279d0:	30 91 78 0d 	lds	r19, 0x0D78	; 0x800d78 <cs+0x11>
   279d4:	40 91 79 0d 	lds	r20, 0x0D79	; 0x800d79 <cs+0x12>
   279d8:	50 91 7a 0d 	lds	r21, 0x0D7A	; 0x800d7a <cs+0x13>
   279dc:	60 81       	ld	r22, Z
   279de:	71 81       	ldd	r23, Z+1	; 0x01
   279e0:	82 81       	ldd	r24, Z+2	; 0x02
   279e2:	93 81       	ldd	r25, Z+3	; 0x03
   279e4:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   279e8:	0f 94 45 a8 	call	0x3508a	; 0x3508a <lround>
   279ec:	ec e3       	ldi	r30, 0x3C	; 60
   279ee:	f6 e0       	ldi	r31, 0x06	; 6
   279f0:	64 87       	std	Z+12, r22	; 0x0c
   279f2:	75 87       	std	Z+13, r23	; 0x0d
   279f4:	86 87       	std	Z+14, r24	; 0x0e
   279f6:	97 87       	std	Z+15, r25	; 0x0f
  CRITICAL_SECTION_END;
}

void st_set_e_position(const long &e)
{
  CRITICAL_SECTION_START;
   279f8:	8f b7       	in	r24, 0x3f	; 63
   279fa:	f8 94       	cli
  count_position[E_AXIS] = e;
   279fc:	44 85       	ldd	r20, Z+12	; 0x0c
   279fe:	55 85       	ldd	r21, Z+13	; 0x0d
   27a00:	66 85       	ldd	r22, Z+14	; 0x0e
   27a02:	77 85       	ldd	r23, Z+15	; 0x0f
   27a04:	40 93 58 06 	sts	0x0658, r20	; 0x800658 <count_position+0xc>
   27a08:	50 93 59 06 	sts	0x0659, r21	; 0x800659 <count_position+0xd>
   27a0c:	60 93 5a 06 	sts	0x065A, r22	; 0x80065a <count_position+0xe>
   27a10:	70 93 5b 06 	sts	0x065B, r23	; 0x80065b <count_position+0xf>
  CRITICAL_SECTION_END;
   27a14:	8f bf       	out	0x3f, r24	; 63
  st_set_e_position(position[E_AXIS]);
}
   27a16:	08 95       	ret

00027a18 <plan_set_z_position(float const&)>:

// Only useful in the bed leveling routine, when the mesh bed leveling is off.
void plan_set_z_position(const float &z)
{
  #ifdef LIN_ADVANCE
  position_float[Z_AXIS] = z;
   27a18:	fc 01       	movw	r30, r24
   27a1a:	40 81       	ld	r20, Z
   27a1c:	51 81       	ldd	r21, Z+1	; 0x01
   27a1e:	62 81       	ldd	r22, Z+2	; 0x02
   27a20:	73 81       	ldd	r23, Z+3	; 0x03
   27a22:	40 93 3e 04 	sts	0x043E, r20	; 0x80043e <position_float+0x8>
   27a26:	50 93 3f 04 	sts	0x043F, r21	; 0x80043f <position_float+0x9>
   27a2a:	60 93 40 04 	sts	0x0440, r22	; 0x800440 <position_float+0xa>
   27a2e:	70 93 41 04 	sts	0x0441, r23	; 0x800441 <position_float+0xb>
  #endif
  position[Z_AXIS] = lround(z*cs.axis_steps_per_mm[Z_AXIS]);
   27a32:	20 91 73 0d 	lds	r18, 0x0D73	; 0x800d73 <cs+0xc>
   27a36:	30 91 74 0d 	lds	r19, 0x0D74	; 0x800d74 <cs+0xd>
   27a3a:	40 91 75 0d 	lds	r20, 0x0D75	; 0x800d75 <cs+0xe>
   27a3e:	50 91 76 0d 	lds	r21, 0x0D76	; 0x800d76 <cs+0xf>
   27a42:	60 81       	ld	r22, Z
   27a44:	71 81       	ldd	r23, Z+1	; 0x01
   27a46:	82 81       	ldd	r24, Z+2	; 0x02
   27a48:	93 81       	ldd	r25, Z+3	; 0x03
   27a4a:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   27a4e:	0f 94 45 a8 	call	0x3508a	; 0x3508a <lround>
   27a52:	60 93 44 06 	sts	0x0644, r22	; 0x800644 <position+0x8>
   27a56:	70 93 45 06 	sts	0x0645, r23	; 0x800645 <position+0x9>
   27a5a:	80 93 46 06 	sts	0x0646, r24	; 0x800646 <position+0xa>
   27a5e:	90 93 47 06 	sts	0x0647, r25	; 0x800647 <position+0xb>
  st_set_position(position);
   27a62:	0d 94 65 79 	jmp	0x2f2ca	; 0x2f2ca <st_set_position(long const*) [clone .constprop.125]>

00027a66 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)>:

// Add a new linear movement to the buffer. steps_x, _y and _z is the absolute position in
// mm. Microseconds specify how many microseconds the move should take to perform. To aid acceleration
// calculation the caller must also provide the physical length of the line in millimeters.
void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate, const float* gcode_start_position, uint16_t segment_idx)
{
   27a66:	2f 92       	push	r2
   27a68:	3f 92       	push	r3
   27a6a:	4f 92       	push	r4
   27a6c:	5f 92       	push	r5
   27a6e:	6f 92       	push	r6
   27a70:	7f 92       	push	r7
   27a72:	8f 92       	push	r8
   27a74:	9f 92       	push	r9
   27a76:	af 92       	push	r10
   27a78:	bf 92       	push	r11
   27a7a:	cf 92       	push	r12
   27a7c:	df 92       	push	r13
   27a7e:	ef 92       	push	r14
   27a80:	ff 92       	push	r15
   27a82:	0f 93       	push	r16
   27a84:	1f 93       	push	r17
   27a86:	cf 93       	push	r28
   27a88:	df 93       	push	r29
   27a8a:	cd b7       	in	r28, 0x3d	; 61
   27a8c:	de b7       	in	r29, 0x3e	; 62
   27a8e:	c4 58       	subi	r28, 0x84	; 132
   27a90:	d1 09       	sbc	r29, r1
   27a92:	0f b6       	in	r0, 0x3f	; 63
   27a94:	f8 94       	cli
   27a96:	de bf       	out	0x3e, r29	; 62
   27a98:	0f be       	out	0x3f, r0	; 63
   27a9a:	cd bf       	out	0x3d, r28	; 61
   27a9c:	69 a3       	std	Y+33, r22	; 0x21
   27a9e:	7a a3       	std	Y+34, r23	; 0x22
   27aa0:	8b a3       	std	Y+35, r24	; 0x23
   27aa2:	9c a3       	std	Y+36, r25	; 0x24
   27aa4:	2d a3       	std	Y+37, r18	; 0x25
   27aa6:	3e a3       	std	Y+38, r19	; 0x26
   27aa8:	4f a3       	std	Y+39, r20	; 0x27
   27aaa:	58 a7       	std	Y+40, r21	; 0x28
   27aac:	a7 96       	adiw	r28, 0x27	; 39
   27aae:	ec ae       	std	Y+60, r14	; 0x3c
   27ab0:	fd ae       	std	Y+61, r15	; 0x3d
   27ab2:	0e af       	std	Y+62, r16	; 0x3e
   27ab4:	1f af       	std	Y+63, r17	; 0x3f
   27ab6:	a7 97       	sbiw	r28, 0x27	; 39
   27ab8:	a9 96       	adiw	r28, 0x29	; 41
   27aba:	df ae       	std	Y+63, r13	; 0x3f
   27abc:	ce ae       	std	Y+62, r12	; 0x3e
   27abe:	a9 97       	sbiw	r28, 0x29	; 41
   27ac0:	89 ae       	std	Y+57, r8	; 0x39
   27ac2:	99 aa       	std	Y+49, r9	; 0x31
   27ac4:	ad ae       	std	Y+61, r10	; 0x3d
   27ac6:	bd aa       	std	Y+53, r11	; 0x35
   27ac8:	c6 56       	subi	r28, 0x66	; 102
   27aca:	df 4f       	sbci	r29, 0xFF	; 255
   27acc:	08 81       	ld	r16, Y
   27ace:	19 81       	ldd	r17, Y+1	; 0x01
   27ad0:	ca 59       	subi	r28, 0x9A	; 154
   27ad2:	d0 40       	sbci	r29, 0x00	; 0
  // CRITICAL_SECTION_START; //prevent stack overflow in ISR
  // printf_P(PSTR("plan_buffer_line(%f, %f, %f, %f, %f, %u, [%f,%f,%f,%f], %u)\n"), x, y, z, e, feed_rate, extruder, gcode_start_position[0], gcode_start_position[1], gcode_start_position[2], gcode_start_position[3], segment_idx);
  // CRITICAL_SECTION_END;

  // Calculate the buffer head after we push this byte
  uint8_t next_buffer_head = next_block_index(block_buffer_head);
   27ad4:	80 91 3e 0d 	lds	r24, 0x0D3E	; 0x800d3e <block_buffer_head>
static bool plan_reset_next_e_sched;

// Returns the index of the next block in the ring buffer
// NOTE: Removed modulo (%) operator, which uses an expensive divide and multiplication.
static inline uint8_t next_block_index(uint8_t block_index) {
  if (++ block_index == BLOCK_BUFFER_SIZE)
   27ad8:	8f 5f       	subi	r24, 0xFF	; 255
   27ada:	a0 96       	adiw	r28, 0x20	; 32
   27adc:	8f af       	std	Y+63, r24	; 0x3f
   27ade:	a0 97       	sbiw	r28, 0x20	; 32
   27ae0:	80 31       	cpi	r24, 0x10	; 16
   27ae2:	19 f4       	brne	.+6      	; 0x27aea <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x84>
    block_index = 0;
   27ae4:	a0 96       	adiw	r28, 0x20	; 32
   27ae6:	1f ae       	std	Y+63, r1	; 0x3f
   27ae8:	a0 97       	sbiw	r28, 0x20	; 32
  // Calculate the buffer head after we push this byte
  uint8_t next_buffer_head = next_block_index(block_buffer_head);

  // If the buffer is full: good! That means we are well ahead of the robot.
  // Rest here until there is room in the buffer.
  if (block_buffer_tail == next_buffer_head) {
   27aea:	80 91 3f 0d 	lds	r24, 0x0D3F	; 0x800d3f <block_buffer_tail>
   27aee:	a0 96       	adiw	r28, 0x20	; 32
   27af0:	2f ad       	ldd	r18, Y+63	; 0x3f
   27af2:	a0 97       	sbiw	r28, 0x20	; 32
   27af4:	82 13       	cpse	r24, r18
   27af6:	0f c0       	rjmp	.+30     	; 0x27b16 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xb0>
      do {
          manage_heater();
   27af8:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
          // Vojtech: Don't disable motors inside the planner!
          manage_inactivity(false);
   27afc:	80 e0       	ldi	r24, 0x00	; 0
   27afe:	0e 94 34 8c 	call	0x11868	; 0x11868 <manage_inactivity(bool)>
          lcd_update(0);
   27b02:	80 e0       	ldi	r24, 0x00	; 0
   27b04:	0e 94 f9 6e 	call	0xddf2	; 0xddf2 <lcd_update(unsigned char)>
      } while (block_buffer_tail == next_buffer_head);
   27b08:	80 91 3f 0d 	lds	r24, 0x0D3F	; 0x800d3f <block_buffer_tail>
   27b0c:	a0 96       	adiw	r28, 0x20	; 32
   27b0e:	3f ad       	ldd	r19, Y+63	; 0x3f
   27b10:	a0 97       	sbiw	r28, 0x20	; 32
   27b12:	83 17       	cp	r24, r19
   27b14:	89 f3       	breq	.-30     	; 0x27af8 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x92>
  }
#ifdef PLANNER_DIAGNOSTICS
  planner_update_queue_min_counter();
#endif /* PLANNER_DIAGNOSTICS */
  if(planner_aborted) {
   27b16:	40 91 42 0d 	lds	r20, 0x0D42	; 0x800d42 <planner_aborted>
   27b1a:	a1 96       	adiw	r28, 0x21	; 33
   27b1c:	4f af       	std	Y+63, r20	; 0x3f
   27b1e:	a1 97       	sbiw	r28, 0x21	; 33
   27b20:	44 23       	and	r20, r20
   27b22:	11 f1       	breq	.+68     	; 0x27b68 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x102>
      // avoid planning the block early if aborted
      SERIAL_ECHO_START;
   27b24:	8e ec       	ldi	r24, 0xCE	; 206
   27b26:	91 ea       	ldi	r25, 0xA1	; 161
   27b28:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
      SERIAL_ECHOLNRPGM(_n("Move aborted"));
   27b2c:	86 e3       	ldi	r24, 0x36	; 54
   27b2e:	9a e6       	ldi	r25, 0x6A	; 106
   27b30:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
  // The stepper timer interrupt will run continuously from now on.
  // If there are no planner blocks to be executed by the stepper routine,
  // the stepper interrupt ticks at 1kHz to wake up and pick a block
  // from the planner queue if available.
  ENABLE_STEPPER_DRIVER_INTERRUPT();
}
   27b34:	cc 57       	subi	r28, 0x7C	; 124
   27b36:	df 4f       	sbci	r29, 0xFF	; 255
   27b38:	0f b6       	in	r0, 0x3f	; 63
   27b3a:	f8 94       	cli
   27b3c:	de bf       	out	0x3e, r29	; 62
   27b3e:	0f be       	out	0x3f, r0	; 63
   27b40:	cd bf       	out	0x3d, r28	; 61
   27b42:	df 91       	pop	r29
   27b44:	cf 91       	pop	r28
   27b46:	1f 91       	pop	r17
   27b48:	0f 91       	pop	r16
   27b4a:	ff 90       	pop	r15
   27b4c:	ef 90       	pop	r14
   27b4e:	df 90       	pop	r13
   27b50:	cf 90       	pop	r12
   27b52:	bf 90       	pop	r11
   27b54:	af 90       	pop	r10
   27b56:	9f 90       	pop	r9
   27b58:	8f 90       	pop	r8
   27b5a:	7f 90       	pop	r7
   27b5c:	6f 90       	pop	r6
   27b5e:	5f 90       	pop	r5
   27b60:	4f 90       	pop	r4
   27b62:	3f 90       	pop	r3
   27b64:	2f 90       	pop	r2
   27b66:	08 95       	ret
      SERIAL_ECHOLNRPGM(_n("Move aborted"));
      return;
  }

  // Prepare to set up new block
  block_t *block = &block_buffer[block_buffer_head];
   27b68:	90 91 3e 0d 	lds	r25, 0x0D3E	; 0x800d3e <block_buffer_head>
   27b6c:	29 2e       	mov	r2, r25
   27b6e:	31 2c       	mov	r3, r1
   27b70:	8e e6       	ldi	r24, 0x6E	; 110
   27b72:	98 9f       	mul	r25, r24
   27b74:	d0 01       	movw	r26, r0
   27b76:	11 24       	eor	r1, r1
   27b78:	a3 96       	adiw	r28, 0x23	; 35
   27b7a:	bf af       	std	Y+63, r27	; 0x3f
   27b7c:	ae af       	std	Y+62, r26	; 0x3e
   27b7e:	a3 97       	sbiw	r28, 0x23	; 35

  // Mark block as not busy (Not executed by the stepper interrupt, could be still tinkered with.)
  block->busy = false;
   27b80:	cd 01       	movw	r24, r26
   27b82:	82 5a       	subi	r24, 0xA2	; 162
   27b84:	99 4f       	sbci	r25, 0xF9	; 249
   27b86:	fc 01       	movw	r30, r24
   27b88:	e9 5b       	subi	r30, 0xB9	; 185
   27b8a:	ff 4f       	sbci	r31, 0xFF	; 255
   27b8c:	10 82       	st	Z, r1

  // Set sdlen for calculating sd position
  block->sdlen = 0;
   27b8e:	84 59       	subi	r24, 0x94	; 148
   27b90:	9f 4f       	sbci	r25, 0xFF	; 255
   27b92:	fc 01       	movw	r30, r24
   27b94:	11 82       	std	Z+1, r1	; 0x01
   27b96:	10 82       	st	Z, r1

  // Save original start position of the move
  if (gcode_start_position)
   27b98:	01 15       	cp	r16, r1
   27b9a:	11 05       	cpc	r17, r1
   27b9c:	11 f4       	brne	.+4      	; 0x27ba2 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x13c>
   27b9e:	0d 94 20 48 	jmp	0x29040	; 0x29040 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x15da>
      memcpy(block->gcode_start_position, gcode_start_position, sizeof(block_t::gcode_start_position));
   27ba2:	80 e1       	ldi	r24, 0x10	; 16
   27ba4:	f8 01       	movw	r30, r16
   27ba6:	aa 54       	subi	r26, 0x4A	; 74
   27ba8:	b9 4f       	sbci	r27, 0xF9	; 249
  else
      memcpy(block->gcode_start_position, current_position, sizeof(block_t::gcode_start_position));
   27baa:	01 90       	ld	r0, Z+
   27bac:	0d 92       	st	X+, r0
   27bae:	8a 95       	dec	r24
   27bb0:	e1 f7       	brne	.-8      	; 0x27baa <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x144>

  // Save the index of this segment (when a single G0/1/2/3 command plans multiple segments)
  block->segment_idx = segment_idx;
   27bb2:	8e e6       	ldi	r24, 0x6E	; 110
   27bb4:	82 9d       	mul	r24, r2
   27bb6:	80 01       	movw	r16, r0
   27bb8:	83 9d       	mul	r24, r3
   27bba:	10 0d       	add	r17, r0
   27bbc:	11 24       	eor	r1, r1
   27bbe:	02 5a       	subi	r16, 0xA2	; 162
   27bc0:	19 4f       	sbci	r17, 0xF9	; 249
   27bc2:	f8 01       	movw	r30, r16
   27bc4:	e8 59       	subi	r30, 0x98	; 152
   27bc6:	ff 4f       	sbci	r31, 0xFF	; 255
   27bc8:	c4 56       	subi	r28, 0x64	; 100
   27bca:	df 4f       	sbci	r29, 0xFF	; 255
   27bcc:	88 81       	ld	r24, Y
   27bce:	99 81       	ldd	r25, Y+1	; 0x01
   27bd0:	cc 59       	subi	r28, 0x9C	; 156
   27bd2:	d0 40       	sbci	r29, 0x00	; 0
   27bd4:	91 83       	std	Z+1, r25	; 0x01
   27bd6:	80 83       	st	Z, r24

  // Save the global feedrate at scheduling time
  block->gcode_feedrate = feedrate;
   27bd8:	06 59       	subi	r16, 0x96	; 150
   27bda:	1f 4f       	sbci	r17, 0xFF	; 255
   27bdc:	60 91 7a 02 	lds	r22, 0x027A	; 0x80027a <feedrate>
   27be0:	70 91 7b 02 	lds	r23, 0x027B	; 0x80027b <feedrate+0x1>
   27be4:	80 91 7c 02 	lds	r24, 0x027C	; 0x80027c <feedrate+0x2>
   27be8:	90 91 7d 02 	lds	r25, 0x027D	; 0x80027d <feedrate+0x3>
   27bec:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   27bf0:	d8 01       	movw	r26, r16
   27bf2:	6d 93       	st	X+, r22
   27bf4:	7c 93       	st	X, r23

  // Reset the starting E position when requested
  if (plan_reset_next_e_queue)
   27bf6:	80 91 21 04 	lds	r24, 0x0421	; 0x800421 <_ZL23plan_reset_next_e_queue.lto_priv.443>
   27bfa:	88 23       	and	r24, r24
   27bfc:	a9 f0       	breq	.+42     	; 0x27c28 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1c2>
  {
      position[E_AXIS] = 0;
   27bfe:	10 92 48 06 	sts	0x0648, r1	; 0x800648 <position+0xc>
   27c02:	10 92 49 06 	sts	0x0649, r1	; 0x800649 <position+0xd>
   27c06:	10 92 4a 06 	sts	0x064A, r1	; 0x80064a <position+0xe>
   27c0a:	10 92 4b 06 	sts	0x064B, r1	; 0x80064b <position+0xf>
#ifdef LIN_ADVANCE
      position_float[E_AXIS] = 0;
   27c0e:	10 92 42 04 	sts	0x0442, r1	; 0x800442 <position_float+0xc>
   27c12:	10 92 43 04 	sts	0x0443, r1	; 0x800443 <position_float+0xd>
   27c16:	10 92 44 04 	sts	0x0444, r1	; 0x800444 <position_float+0xe>
   27c1a:	10 92 45 04 	sts	0x0445, r1	; 0x800445 <position_float+0xf>
#endif

      // the block might still be discarded later, but we need to ensure the lower-level
      // count_position is also reset correctly for consistent results!
      plan_reset_next_e_queue = false;
   27c1e:	10 92 21 04 	sts	0x0421, r1	; 0x800421 <_ZL23plan_reset_next_e_queue.lto_priv.443>
      plan_reset_next_e_sched = true;
   27c22:	81 e0       	ldi	r24, 0x01	; 1
   27c24:	80 93 20 04 	sts	0x0420, r24	; 0x800420 <_ZL23plan_reset_next_e_sched.lto_priv.444>
  }

  // Apply the machine correction matrix.
  world2machine(x, y);
   27c28:	be 01       	movw	r22, r28
   27c2a:	6b 5d       	subi	r22, 0xDB	; 219
   27c2c:	7f 4f       	sbci	r23, 0xFF	; 255
   27c2e:	ce 01       	movw	r24, r28
   27c30:	81 96       	adiw	r24, 0x21	; 33
   27c32:	0e 94 76 68 	call	0xd0ec	; 0xd0ec <world2machine(float&, float&)>

  // The target position of the tool in absolute steps
  // Calculate target position in absolute steps
  //this should be done after the wait, because otherwise a M92 code within the gcode disrupts this calculation somehow
  long target[4];
  target[X_AXIS] = lround(x*cs.axis_steps_per_mm[X_AXIS]);
   27c36:	c9 a0       	ldd	r12, Y+33	; 0x21
   27c38:	da a0       	ldd	r13, Y+34	; 0x22
   27c3a:	eb a0       	ldd	r14, Y+35	; 0x23
   27c3c:	fc a0       	ldd	r15, Y+36	; 0x24
   27c3e:	20 91 6b 0d 	lds	r18, 0x0D6B	; 0x800d6b <cs+0x4>
   27c42:	30 91 6c 0d 	lds	r19, 0x0D6C	; 0x800d6c <cs+0x5>
   27c46:	40 91 6d 0d 	lds	r20, 0x0D6D	; 0x800d6d <cs+0x6>
   27c4a:	50 91 6e 0d 	lds	r21, 0x0D6E	; 0x800d6e <cs+0x7>
   27c4e:	c7 01       	movw	r24, r14
   27c50:	b6 01       	movw	r22, r12
   27c52:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   27c56:	0f 94 45 a8 	call	0x3508a	; 0x3508a <lround>
   27c5a:	c3 58       	subi	r28, 0x83	; 131
   27c5c:	df 4f       	sbci	r29, 0xFF	; 255
   27c5e:	68 83       	st	Y, r22
   27c60:	79 83       	std	Y+1, r23	; 0x01
   27c62:	8a 83       	std	Y+2, r24	; 0x02
   27c64:	9b 83       	std	Y+3, r25	; 0x03
   27c66:	cd 57       	subi	r28, 0x7D	; 125
   27c68:	d0 40       	sbci	r29, 0x00	; 0
  target[Y_AXIS] = lround(y*cs.axis_steps_per_mm[Y_AXIS]);
   27c6a:	8d a0       	ldd	r8, Y+37	; 0x25
   27c6c:	9e a0       	ldd	r9, Y+38	; 0x26
   27c6e:	af a0       	ldd	r10, Y+39	; 0x27
   27c70:	b8 a4       	ldd	r11, Y+40	; 0x28
   27c72:	20 91 6f 0d 	lds	r18, 0x0D6F	; 0x800d6f <cs+0x8>
   27c76:	30 91 70 0d 	lds	r19, 0x0D70	; 0x800d70 <cs+0x9>
   27c7a:	40 91 71 0d 	lds	r20, 0x0D71	; 0x800d71 <cs+0xa>
   27c7e:	50 91 72 0d 	lds	r21, 0x0D72	; 0x800d72 <cs+0xb>
   27c82:	c5 01       	movw	r24, r10
   27c84:	b4 01       	movw	r22, r8
   27c86:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   27c8a:	0f 94 45 a8 	call	0x3508a	; 0x3508a <lround>
   27c8e:	cf 57       	subi	r28, 0x7F	; 127
   27c90:	df 4f       	sbci	r29, 0xFF	; 255
   27c92:	68 83       	st	Y, r22
   27c94:	79 83       	std	Y+1, r23	; 0x01
   27c96:	8a 83       	std	Y+2, r24	; 0x02
   27c98:	9b 83       	std	Y+3, r25	; 0x03
   27c9a:	c1 58       	subi	r28, 0x81	; 129
   27c9c:	d0 40       	sbci	r29, 0x00	; 0
#ifdef MESH_BED_LEVELING
    if (mbl.active){
   27c9e:	80 91 09 13 	lds	r24, 0x1309	; 0x801309 <mbl>
   27ca2:	88 23       	and	r24, r24
   27ca4:	11 f4       	brne	.+4      	; 0x27caa <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x244>
   27ca6:	0d 94 27 48 	jmp	0x2904e	; 0x2904e <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x15e8>
        target[Z_AXIS] = lround((z+mbl.get_z(x, y))*cs.axis_steps_per_mm[Z_AXIS]);
   27caa:	a5 01       	movw	r20, r10
   27cac:	94 01       	movw	r18, r8
   27cae:	c7 01       	movw	r24, r14
   27cb0:	b6 01       	movw	r22, r12
   27cb2:	0f 94 78 91 	call	0x322f0	; 0x322f0 <mesh_bed_leveling::get_z(float, float) [clone .constprop.344]>
   27cb6:	a7 96       	adiw	r28, 0x27	; 39
   27cb8:	2c ad       	ldd	r18, Y+60	; 0x3c
   27cba:	3d ad       	ldd	r19, Y+61	; 0x3d
   27cbc:	4e ad       	ldd	r20, Y+62	; 0x3e
   27cbe:	5f ad       	ldd	r21, Y+63	; 0x3f
   27cc0:	a7 97       	sbiw	r28, 0x27	; 39
   27cc2:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   27cc6:	20 91 73 0d 	lds	r18, 0x0D73	; 0x800d73 <cs+0xc>
   27cca:	30 91 74 0d 	lds	r19, 0x0D74	; 0x800d74 <cs+0xd>
   27cce:	40 91 75 0d 	lds	r20, 0x0D75	; 0x800d75 <cs+0xe>
   27cd2:	50 91 76 0d 	lds	r21, 0x0D76	; 0x800d76 <cs+0xf>
    }else{
        target[Z_AXIS] = lround(z*cs.axis_steps_per_mm[Z_AXIS]);
   27cd6:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   27cda:	0f 94 45 a8 	call	0x3508a	; 0x3508a <lround>
   27cde:	e5 96       	adiw	r28, 0x35	; 53
   27ce0:	6c af       	std	Y+60, r22	; 0x3c
   27ce2:	7d af       	std	Y+61, r23	; 0x3d
   27ce4:	8e af       	std	Y+62, r24	; 0x3e
   27ce6:	9f af       	std	Y+63, r25	; 0x3f
   27ce8:	e5 97       	sbiw	r28, 0x35	; 53
    }
#else
    target[Z_AXIS] = lround(z*cs.axis_steps_per_mm[Z_AXIS]);
#endif // ENABLE_MESH_BED_LEVELING
  target[E_AXIS] = lround(e*cs.axis_steps_per_mm[E_AXIS]);
   27cea:	a9 96       	adiw	r28, 0x29	; 41
   27cec:	ee ad       	ldd	r30, Y+62	; 0x3e
   27cee:	ff ad       	ldd	r31, Y+63	; 0x3f
   27cf0:	a9 97       	sbiw	r28, 0x29	; 41
   27cf2:	80 80       	ld	r8, Z
   27cf4:	91 80       	ldd	r9, Z+1	; 0x01
   27cf6:	a2 80       	ldd	r10, Z+2	; 0x02
   27cf8:	b3 80       	ldd	r11, Z+3	; 0x03
   27cfa:	20 91 77 0d 	lds	r18, 0x0D77	; 0x800d77 <cs+0x10>
   27cfe:	30 91 78 0d 	lds	r19, 0x0D78	; 0x800d78 <cs+0x11>
   27d02:	40 91 79 0d 	lds	r20, 0x0D79	; 0x800d79 <cs+0x12>
   27d06:	50 91 7a 0d 	lds	r21, 0x0D7A	; 0x800d7a <cs+0x13>
   27d0a:	c5 01       	movw	r24, r10
   27d0c:	b4 01       	movw	r22, r8
   27d0e:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   27d12:	0f 94 45 a8 	call	0x3508a	; 0x3508a <lround>
   27d16:	ad 96       	adiw	r28, 0x2d	; 45
   27d18:	6c af       	std	Y+60, r22	; 0x3c
   27d1a:	7d af       	std	Y+61, r23	; 0x3d
   27d1c:	8e af       	std	Y+62, r24	; 0x3e
   27d1e:	9f af       	std	Y+63, r25	; 0x3f
   27d20:	ad 97       	sbiw	r28, 0x2d	; 45

  // Calculate subtraction to re-use result in many places
  // This saves memory and speeds up calculations
  int32_t de = target[E_AXIS] - position[E_AXIS];
   27d22:	80 91 48 06 	lds	r24, 0x0648	; 0x800648 <position+0xc>
   27d26:	90 91 49 06 	lds	r25, 0x0649	; 0x800649 <position+0xd>
   27d2a:	a0 91 4a 06 	lds	r26, 0x064A	; 0x80064a <position+0xe>
   27d2e:	b0 91 4b 06 	lds	r27, 0x064B	; 0x80064b <position+0xf>
   27d32:	ad 96       	adiw	r28, 0x2d	; 45
   27d34:	4c ac       	ldd	r4, Y+60	; 0x3c
   27d36:	5d ac       	ldd	r5, Y+61	; 0x3d
   27d38:	6e ac       	ldd	r6, Y+62	; 0x3e
   27d3a:	7f ac       	ldd	r7, Y+63	; 0x3f
   27d3c:	ad 97       	sbiw	r28, 0x2d	; 45
   27d3e:	48 1a       	sub	r4, r24
   27d40:	59 0a       	sbc	r5, r25
   27d42:	6a 0a       	sbc	r6, r26
   27d44:	7b 0a       	sbc	r7, r27
  int32_t dx = target[X_AXIS] - position[X_AXIS];
   27d46:	80 91 3c 06 	lds	r24, 0x063C	; 0x80063c <position>
   27d4a:	90 91 3d 06 	lds	r25, 0x063D	; 0x80063d <position+0x1>
   27d4e:	a0 91 3e 06 	lds	r26, 0x063E	; 0x80063e <position+0x2>
   27d52:	b0 91 3f 06 	lds	r27, 0x063F	; 0x80063f <position+0x3>
   27d56:	c3 58       	subi	r28, 0x83	; 131
   27d58:	df 4f       	sbci	r29, 0xFF	; 255
   27d5a:	c8 80       	ld	r12, Y
   27d5c:	d9 80       	ldd	r13, Y+1	; 0x01
   27d5e:	ea 80       	ldd	r14, Y+2	; 0x02
   27d60:	fb 80       	ldd	r15, Y+3	; 0x03
   27d62:	cd 57       	subi	r28, 0x7D	; 125
   27d64:	d0 40       	sbci	r29, 0x00	; 0
   27d66:	c8 1a       	sub	r12, r24
   27d68:	d9 0a       	sbc	r13, r25
   27d6a:	ea 0a       	sbc	r14, r26
   27d6c:	fb 0a       	sbc	r15, r27
  int32_t dy = target[Y_AXIS] - position[Y_AXIS];
   27d6e:	80 91 40 06 	lds	r24, 0x0640	; 0x800640 <position+0x4>
   27d72:	90 91 41 06 	lds	r25, 0x0641	; 0x800641 <position+0x5>
   27d76:	a0 91 42 06 	lds	r26, 0x0642	; 0x800642 <position+0x6>
   27d7a:	b0 91 43 06 	lds	r27, 0x0643	; 0x800643 <position+0x7>
   27d7e:	cf 57       	subi	r28, 0x7F	; 127
   27d80:	df 4f       	sbci	r29, 0xFF	; 255
   27d82:	28 81       	ld	r18, Y
   27d84:	39 81       	ldd	r19, Y+1	; 0x01
   27d86:	4a 81       	ldd	r20, Y+2	; 0x02
   27d88:	5b 81       	ldd	r21, Y+3	; 0x03
   27d8a:	c1 58       	subi	r28, 0x81	; 129
   27d8c:	d0 40       	sbci	r29, 0x00	; 0
   27d8e:	28 1b       	sub	r18, r24
   27d90:	39 0b       	sbc	r19, r25
   27d92:	4a 0b       	sbc	r20, r26
   27d94:	5b 0b       	sbc	r21, r27
   27d96:	29 a7       	std	Y+41, r18	; 0x29
   27d98:	3a a7       	std	Y+42, r19	; 0x2a
   27d9a:	4b a7       	std	Y+43, r20	; 0x2b
   27d9c:	5c a7       	std	Y+44, r21	; 0x2c
  int32_t dz = target[Z_AXIS] - position[Z_AXIS];
   27d9e:	80 91 44 06 	lds	r24, 0x0644	; 0x800644 <position+0x8>
   27da2:	90 91 45 06 	lds	r25, 0x0645	; 0x800645 <position+0x9>
   27da6:	a0 91 46 06 	lds	r26, 0x0646	; 0x800646 <position+0xa>
   27daa:	b0 91 47 06 	lds	r27, 0x0647	; 0x800647 <position+0xb>
   27dae:	e5 96       	adiw	r28, 0x35	; 53
   27db0:	2c ad       	ldd	r18, Y+60	; 0x3c
   27db2:	3d ad       	ldd	r19, Y+61	; 0x3d
   27db4:	4e ad       	ldd	r20, Y+62	; 0x3e
   27db6:	5f ad       	ldd	r21, Y+63	; 0x3f
   27db8:	e5 97       	sbiw	r28, 0x35	; 53
   27dba:	28 1b       	sub	r18, r24
   27dbc:	39 0b       	sbc	r19, r25
   27dbe:	4a 0b       	sbc	r20, r26
   27dc0:	5b 0b       	sbc	r21, r27
   27dc2:	2d a7       	std	Y+45, r18	; 0x2d
   27dc4:	3e a7       	std	Y+46, r19	; 0x2e
   27dc6:	4f a7       	std	Y+47, r20	; 0x2f
   27dc8:	58 ab       	std	Y+48, r21	; 0x30

  #ifdef PREVENT_DANGEROUS_EXTRUDE
  if(de)
   27dca:	41 14       	cp	r4, r1
   27dcc:	51 04       	cpc	r5, r1
   27dce:	61 04       	cpc	r6, r1
   27dd0:	71 04       	cpc	r7, r1
   27dd2:	09 f4       	brne	.+2      	; 0x27dd6 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x370>
   27dd4:	80 c0       	rjmp	.+256    	; 0x27ed6 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x470>
  {
    if((int)degHotend(active_extruder)<extrude_min_temp)
   27dd6:	60 91 5a 0d 	lds	r22, 0x0D5A	; 0x800d5a <current_temperature>
   27dda:	70 91 5b 0d 	lds	r23, 0x0D5B	; 0x800d5b <current_temperature+0x1>
   27dde:	80 91 5c 0d 	lds	r24, 0x0D5C	; 0x800d5c <current_temperature+0x2>
   27de2:	90 91 5d 0d 	lds	r25, 0x0D5D	; 0x800d5d <current_temperature+0x3>
   27de6:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   27dea:	20 91 57 02 	lds	r18, 0x0257	; 0x800257 <extrude_min_temp>
   27dee:	30 91 58 02 	lds	r19, 0x0258	; 0x800258 <extrude_min_temp+0x1>
   27df2:	62 17       	cp	r22, r18
   27df4:	73 07       	cpc	r23, r19
   27df6:	0c f5       	brge	.+66     	; 0x27e3a <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x3d4>
    {
      position[E_AXIS]=target[E_AXIS]; //behave as if the move really took place, but ignore E part
   27df8:	ad 96       	adiw	r28, 0x2d	; 45
   27dfa:	8c ad       	ldd	r24, Y+60	; 0x3c
   27dfc:	9d ad       	ldd	r25, Y+61	; 0x3d
   27dfe:	ae ad       	ldd	r26, Y+62	; 0x3e
   27e00:	bf ad       	ldd	r27, Y+63	; 0x3f
   27e02:	ad 97       	sbiw	r28, 0x2d	; 45
   27e04:	80 93 48 06 	sts	0x0648, r24	; 0x800648 <position+0xc>
   27e08:	90 93 49 06 	sts	0x0649, r25	; 0x800649 <position+0xd>
   27e0c:	a0 93 4a 06 	sts	0x064A, r26	; 0x80064a <position+0xe>
   27e10:	b0 93 4b 06 	sts	0x064B, r27	; 0x80064b <position+0xf>
      #ifdef LIN_ADVANCE
      position_float[E_AXIS] = e;
   27e14:	80 92 42 04 	sts	0x0442, r8	; 0x800442 <position_float+0xc>
   27e18:	90 92 43 04 	sts	0x0443, r9	; 0x800443 <position_float+0xd>
   27e1c:	a0 92 44 04 	sts	0x0444, r10	; 0x800444 <position_float+0xe>
   27e20:	b0 92 45 04 	sts	0x0445, r11	; 0x800445 <position_float+0xf>
      #endif
      de = 0; // no difference
      SERIAL_ECHO_START;
   27e24:	8e ec       	ldi	r24, 0xCE	; 206
   27e26:	91 ea       	ldi	r25, 0xA1	; 161
   27e28:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
      SERIAL_ECHOLNRPGM(_n(" cold extrusion prevented"));////MSG_ERR_COLD_EXTRUDE_STOP
   27e2c:	8c e1       	ldi	r24, 0x1C	; 28
   27e2e:	9a e6       	ldi	r25, 0x6A	; 106
   27e30:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
    {
      position[E_AXIS]=target[E_AXIS]; //behave as if the move really took place, but ignore E part
      #ifdef LIN_ADVANCE
      position_float[E_AXIS] = e;
      #endif
      de = 0; // no difference
   27e34:	41 2c       	mov	r4, r1
   27e36:	51 2c       	mov	r5, r1
   27e38:	32 01       	movw	r6, r4
      SERIAL_ECHO_START;
      SERIAL_ECHOLNRPGM(_n(" cold extrusion prevented"));////MSG_ERR_COLD_EXTRUDE_STOP
    }

    #ifdef PREVENT_LENGTHY_EXTRUDE
    if(labs(de) > cs.axis_steps_per_mm[E_AXIS]*EXTRUDE_MAXLENGTH)
   27e3a:	c3 01       	movw	r24, r6
   27e3c:	b2 01       	movw	r22, r4
   27e3e:	77 fe       	sbrs	r7, 7
   27e40:	07 c0       	rjmp	.+14     	; 0x27e50 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x3ea>
   27e42:	66 27       	eor	r22, r22
   27e44:	77 27       	eor	r23, r23
   27e46:	cb 01       	movw	r24, r22
   27e48:	64 19       	sub	r22, r4
   27e4a:	75 09       	sbc	r23, r5
   27e4c:	86 09       	sbc	r24, r6
   27e4e:	97 09       	sbc	r25, r7
   27e50:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   27e54:	4b 01       	movw	r8, r22
   27e56:	5c 01       	movw	r10, r24
   27e58:	20 e0       	ldi	r18, 0x00	; 0
   27e5a:	30 e0       	ldi	r19, 0x00	; 0
   27e5c:	48 ee       	ldi	r20, 0xE8	; 232
   27e5e:	53 e4       	ldi	r21, 0x43	; 67
   27e60:	60 91 77 0d 	lds	r22, 0x0D77	; 0x800d77 <cs+0x10>
   27e64:	70 91 78 0d 	lds	r23, 0x0D78	; 0x800d78 <cs+0x11>
   27e68:	80 91 79 0d 	lds	r24, 0x0D79	; 0x800d79 <cs+0x12>
   27e6c:	90 91 7a 0d 	lds	r25, 0x0D7A	; 0x800d7a <cs+0x13>
   27e70:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   27e74:	9b 01       	movw	r18, r22
   27e76:	ac 01       	movw	r20, r24
   27e78:	c5 01       	movw	r24, r10
   27e7a:	b4 01       	movw	r22, r8
   27e7c:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   27e80:	18 16       	cp	r1, r24
   27e82:	4c f5       	brge	.+82     	; 0x27ed6 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x470>
    {
      position[E_AXIS]=target[E_AXIS]; //behave as if the move really took place, but ignore E part
   27e84:	ad 96       	adiw	r28, 0x2d	; 45
   27e86:	2c ad       	ldd	r18, Y+60	; 0x3c
   27e88:	3d ad       	ldd	r19, Y+61	; 0x3d
   27e8a:	4e ad       	ldd	r20, Y+62	; 0x3e
   27e8c:	5f ad       	ldd	r21, Y+63	; 0x3f
   27e8e:	ad 97       	sbiw	r28, 0x2d	; 45
   27e90:	20 93 48 06 	sts	0x0648, r18	; 0x800648 <position+0xc>
   27e94:	30 93 49 06 	sts	0x0649, r19	; 0x800649 <position+0xd>
   27e98:	40 93 4a 06 	sts	0x064A, r20	; 0x80064a <position+0xe>
   27e9c:	50 93 4b 06 	sts	0x064B, r21	; 0x80064b <position+0xf>
      #ifdef LIN_ADVANCE
      position_float[E_AXIS] = e;
   27ea0:	a9 96       	adiw	r28, 0x29	; 41
   27ea2:	ee ad       	ldd	r30, Y+62	; 0x3e
   27ea4:	ff ad       	ldd	r31, Y+63	; 0x3f
   27ea6:	a9 97       	sbiw	r28, 0x29	; 41
   27ea8:	80 81       	ld	r24, Z
   27eaa:	91 81       	ldd	r25, Z+1	; 0x01
   27eac:	a2 81       	ldd	r26, Z+2	; 0x02
   27eae:	b3 81       	ldd	r27, Z+3	; 0x03
   27eb0:	80 93 42 04 	sts	0x0442, r24	; 0x800442 <position_float+0xc>
   27eb4:	90 93 43 04 	sts	0x0443, r25	; 0x800443 <position_float+0xd>
   27eb8:	a0 93 44 04 	sts	0x0444, r26	; 0x800444 <position_float+0xe>
   27ebc:	b0 93 45 04 	sts	0x0445, r27	; 0x800445 <position_float+0xf>
      #endif
      de = 0; // no difference
      SERIAL_ECHO_START;
   27ec0:	8e ec       	ldi	r24, 0xCE	; 206
   27ec2:	91 ea       	ldi	r25, 0xA1	; 161
   27ec4:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
      SERIAL_ECHOLNRPGM(_n(" too long extrusion prevented"));////MSG_ERR_LONG_EXTRUDE_STOP
   27ec8:	8e ef       	ldi	r24, 0xFE	; 254
   27eca:	99 e6       	ldi	r25, 0x69	; 105
   27ecc:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
    {
      position[E_AXIS]=target[E_AXIS]; //behave as if the move really took place, but ignore E part
      #ifdef LIN_ADVANCE
      position_float[E_AXIS] = e;
      #endif
      de = 0; // no difference
   27ed0:	41 2c       	mov	r4, r1
   27ed2:	51 2c       	mov	r5, r1
   27ed4:	32 01       	movw	r6, r4
  #endif //PREVENT_DANGEROUS_EXTRUDE

  // Number of steps for each axis
#ifndef COREXY
// default non-h-bot planning
block->steps[X_AXIS].wide = labs(dx);
   27ed6:	8e e6       	ldi	r24, 0x6E	; 110
   27ed8:	82 9d       	mul	r24, r2
   27eda:	f0 01       	movw	r30, r0
   27edc:	83 9d       	mul	r24, r3
   27ede:	f0 0d       	add	r31, r0
   27ee0:	11 24       	eor	r1, r1
   27ee2:	e2 5a       	subi	r30, 0xA2	; 162
   27ee4:	f9 4f       	sbci	r31, 0xF9	; 249
   27ee6:	d7 01       	movw	r26, r14
   27ee8:	c6 01       	movw	r24, r12
   27eea:	f7 fe       	sbrs	r15, 7
   27eec:	07 c0       	rjmp	.+14     	; 0x27efc <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x496>
   27eee:	88 27       	eor	r24, r24
   27ef0:	99 27       	eor	r25, r25
   27ef2:	dc 01       	movw	r26, r24
   27ef4:	8c 19       	sub	r24, r12
   27ef6:	9d 09       	sbc	r25, r13
   27ef8:	ae 09       	sbc	r26, r14
   27efa:	bf 09       	sbc	r27, r15
   27efc:	80 83       	st	Z, r24
   27efe:	91 83       	std	Z+1, r25	; 0x01
   27f00:	a2 83       	std	Z+2, r26	; 0x02
   27f02:	b3 83       	std	Z+3, r27	; 0x03
block->steps[Y_AXIS].wide = labs(dy);
   27f04:	8e e6       	ldi	r24, 0x6E	; 110
   27f06:	82 9d       	mul	r24, r2
   27f08:	f0 01       	movw	r30, r0
   27f0a:	83 9d       	mul	r24, r3
   27f0c:	f0 0d       	add	r31, r0
   27f0e:	11 24       	eor	r1, r1
   27f10:	e2 5a       	subi	r30, 0xA2	; 162
   27f12:	f9 4f       	sbci	r31, 0xF9	; 249
   27f14:	89 a5       	ldd	r24, Y+41	; 0x29
   27f16:	9a a5       	ldd	r25, Y+42	; 0x2a
   27f18:	ab a5       	ldd	r26, Y+43	; 0x2b
   27f1a:	bc a5       	ldd	r27, Y+44	; 0x2c
   27f1c:	b7 ff       	sbrs	r27, 7
   27f1e:	07 c0       	rjmp	.+14     	; 0x27f2e <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x4c8>
   27f20:	b0 95       	com	r27
   27f22:	a0 95       	com	r26
   27f24:	90 95       	com	r25
   27f26:	81 95       	neg	r24
   27f28:	9f 4f       	sbci	r25, 0xFF	; 255
   27f2a:	af 4f       	sbci	r26, 0xFF	; 255
   27f2c:	bf 4f       	sbci	r27, 0xFF	; 255
   27f2e:	84 83       	std	Z+4, r24	; 0x04
   27f30:	95 83       	std	Z+5, r25	; 0x05
   27f32:	a6 83       	std	Z+6, r26	; 0x06
   27f34:	b7 83       	std	Z+7, r27	; 0x07
// corexy planning
// these equations follow the form of the dA and dB equations on http://www.corexy.com/theory.html
block->steps[X_AXIS].wide = labs(dx + dy);
block->steps[Y_AXIS].wide = labs(dx - dy);
#endif
  block->steps[Z_AXIS].wide = labs(dz);
   27f36:	8e e6       	ldi	r24, 0x6E	; 110
   27f38:	82 9d       	mul	r24, r2
   27f3a:	f0 01       	movw	r30, r0
   27f3c:	83 9d       	mul	r24, r3
   27f3e:	f0 0d       	add	r31, r0
   27f40:	11 24       	eor	r1, r1
   27f42:	e2 5a       	subi	r30, 0xA2	; 162
   27f44:	f9 4f       	sbci	r31, 0xF9	; 249
   27f46:	8d a5       	ldd	r24, Y+45	; 0x2d
   27f48:	9e a5       	ldd	r25, Y+46	; 0x2e
   27f4a:	af a5       	ldd	r26, Y+47	; 0x2f
   27f4c:	b8 a9       	ldd	r27, Y+48	; 0x30
   27f4e:	b7 ff       	sbrs	r27, 7
   27f50:	07 c0       	rjmp	.+14     	; 0x27f60 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x4fa>
   27f52:	b0 95       	com	r27
   27f54:	a0 95       	com	r26
   27f56:	90 95       	com	r25
   27f58:	81 95       	neg	r24
   27f5a:	9f 4f       	sbci	r25, 0xFF	; 255
   27f5c:	af 4f       	sbci	r26, 0xFF	; 255
   27f5e:	bf 4f       	sbci	r27, 0xFF	; 255
   27f60:	80 87       	std	Z+8, r24	; 0x08
   27f62:	91 87       	std	Z+9, r25	; 0x09
   27f64:	a2 87       	std	Z+10, r26	; 0x0a
   27f66:	b3 87       	std	Z+11, r27	; 0x0b
  block->steps[E_AXIS].wide = labs(de);
   27f68:	b3 01       	movw	r22, r6
   27f6a:	a2 01       	movw	r20, r4
   27f6c:	77 fe       	sbrs	r7, 7
   27f6e:	07 c0       	rjmp	.+14     	; 0x27f7e <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x518>
   27f70:	44 27       	eor	r20, r20
   27f72:	55 27       	eor	r21, r21
   27f74:	ba 01       	movw	r22, r20
   27f76:	44 19       	sub	r20, r4
   27f78:	55 09       	sbc	r21, r5
   27f7a:	66 09       	sbc	r22, r6
   27f7c:	77 09       	sbc	r23, r7
   27f7e:	8e e6       	ldi	r24, 0x6E	; 110
   27f80:	82 9d       	mul	r24, r2
   27f82:	f0 01       	movw	r30, r0
   27f84:	83 9d       	mul	r24, r3
   27f86:	f0 0d       	add	r31, r0
   27f88:	11 24       	eor	r1, r1
   27f8a:	e2 5a       	subi	r30, 0xA2	; 162
   27f8c:	f9 4f       	sbci	r31, 0xF9	; 249
   27f8e:	44 87       	std	Z+12, r20	; 0x0c
   27f90:	55 87       	std	Z+13, r21	; 0x0d
   27f92:	66 87       	std	Z+14, r22	; 0x0e
   27f94:	77 87       	std	Z+15, r23	; 0x0f
  block->step_event_count.wide = max(block->steps[X_AXIS].wide, max(block->steps[Y_AXIS].wide, max(block->steps[Z_AXIS].wide, block->steps[E_AXIS].wide)));
   27f96:	00 81       	ld	r16, Z
   27f98:	11 81       	ldd	r17, Z+1	; 0x01
   27f9a:	22 81       	ldd	r18, Z+2	; 0x02
   27f9c:	33 81       	ldd	r19, Z+3	; 0x03
   27f9e:	84 81       	ldd	r24, Z+4	; 0x04
   27fa0:	95 81       	ldd	r25, Z+5	; 0x05
   27fa2:	a6 81       	ldd	r26, Z+6	; 0x06
   27fa4:	b7 81       	ldd	r27, Z+7	; 0x07
   27fa6:	80 17       	cp	r24, r16
   27fa8:	91 07       	cpc	r25, r17
   27faa:	a2 07       	cpc	r26, r18
   27fac:	b3 07       	cpc	r27, r19
   27fae:	14 f4       	brge	.+4      	; 0x27fb4 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x54e>
   27fb0:	d9 01       	movw	r26, r18
   27fb2:	c8 01       	movw	r24, r16
   27fb4:	ee e6       	ldi	r30, 0x6E	; 110
   27fb6:	be 2e       	mov	r11, r30
   27fb8:	b2 9c       	mul	r11, r2
   27fba:	f0 01       	movw	r30, r0
   27fbc:	b3 9c       	mul	r11, r3
   27fbe:	f0 0d       	add	r31, r0
   27fc0:	11 24       	eor	r1, r1
   27fc2:	e2 5a       	subi	r30, 0xA2	; 162
   27fc4:	f9 4f       	sbci	r31, 0xF9	; 249
   27fc6:	80 84       	ldd	r8, Z+8	; 0x08
   27fc8:	91 84       	ldd	r9, Z+9	; 0x09
   27fca:	a2 84       	ldd	r10, Z+10	; 0x0a
   27fcc:	b3 84       	ldd	r11, Z+11	; 0x0b
   27fce:	88 15       	cp	r24, r8
   27fd0:	99 05       	cpc	r25, r9
   27fd2:	aa 05       	cpc	r26, r10
   27fd4:	bb 05       	cpc	r27, r11
   27fd6:	14 f4       	brge	.+4      	; 0x27fdc <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x576>
   27fd8:	d5 01       	movw	r26, r10
   27fda:	c4 01       	movw	r24, r8
   27fdc:	84 17       	cp	r24, r20
   27fde:	95 07       	cpc	r25, r21
   27fe0:	a6 07       	cpc	r26, r22
   27fe2:	b7 07       	cpc	r27, r23
   27fe4:	14 f4       	brge	.+4      	; 0x27fea <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x584>
   27fe6:	db 01       	movw	r26, r22
   27fe8:	ca 01       	movw	r24, r20
   27fea:	4e e6       	ldi	r20, 0x6E	; 110
   27fec:	42 9d       	mul	r20, r2
   27fee:	f0 01       	movw	r30, r0
   27ff0:	43 9d       	mul	r20, r3
   27ff2:	f0 0d       	add	r31, r0
   27ff4:	11 24       	eor	r1, r1
   27ff6:	e2 5a       	subi	r30, 0xA2	; 162
   27ff8:	f9 4f       	sbci	r31, 0xF9	; 249
   27ffa:	80 8b       	std	Z+16, r24	; 0x10
   27ffc:	91 8b       	std	Z+17, r25	; 0x11
   27ffe:	a2 8b       	std	Z+18, r26	; 0x12
   28000:	b3 8b       	std	Z+19, r27	; 0x13

  // Bail if this is a zero-length block
  if (block->step_event_count.wide <= dropsegments)
   28002:	06 97       	sbiw	r24, 0x06	; 6
   28004:	a1 05       	cpc	r26, r1
   28006:	b1 05       	cpc	r27, r1
   28008:	0c f4       	brge	.+2      	; 0x2800c <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x5a6>
   2800a:	94 cd       	rjmp	.-1240   	; 0x27b34 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xce>
    planner_update_queue_min_counter();
#endif /* PLANNER_DIAGNOSTICS */
    return;
  }

  block->fan_speed = fanSpeed;
   2800c:	80 91 55 12 	lds	r24, 0x1255	; 0x801255 <fanSpeed>
   28010:	df 01       	movw	r26, r30
   28012:	aa 5b       	subi	r26, 0xBA	; 186
   28014:	bf 4f       	sbci	r27, 0xFF	; 255
   28016:	8c 93       	st	X, r24

  // Compute direction bits for this block
  block->direction_bits = 0;
#ifndef COREXY
  if (dx < 0) block->direction_bits |= _BV(X_AXIS);
   28018:	f7 fe       	sbrs	r15, 7
   2801a:	02 c0       	rjmp	.+4      	; 0x28020 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x5ba>
   2801c:	0d 94 37 48 	jmp	0x2906e	; 0x2906e <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1608>
  }

  block->fan_speed = fanSpeed;

  // Compute direction bits for this block
  block->direction_bits = 0;
   28020:	10 8e       	std	Z+24, r1	; 0x18
#ifndef COREXY
  if (dx < 0) block->direction_bits |= _BV(X_AXIS);
  if (dy < 0) block->direction_bits |= _BV(Y_AXIS);
   28022:	89 a5       	ldd	r24, Y+41	; 0x29
   28024:	9a a5       	ldd	r25, Y+42	; 0x2a
   28026:	ab a5       	ldd	r26, Y+43	; 0x2b
   28028:	bc a5       	ldd	r27, Y+44	; 0x2c
   2802a:	b7 ff       	sbrs	r27, 7
   2802c:	0b c0       	rjmp	.+22     	; 0x28044 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x5de>
   2802e:	8e e6       	ldi	r24, 0x6E	; 110
   28030:	82 9d       	mul	r24, r2
   28032:	f0 01       	movw	r30, r0
   28034:	83 9d       	mul	r24, r3
   28036:	f0 0d       	add	r31, r0
   28038:	11 24       	eor	r1, r1
   2803a:	e2 5a       	subi	r30, 0xA2	; 162
   2803c:	f9 4f       	sbci	r31, 0xF9	; 249
   2803e:	80 8d       	ldd	r24, Z+24	; 0x18
   28040:	82 60       	ori	r24, 0x02	; 2
   28042:	80 8f       	std	Z+24, r24	; 0x18
#else
  if (dx + dy < 0) block->direction_bits |= _BV(X_AXIS);
  if (dx - dy < 0) block->direction_bits |= _BV(Y_AXIS);
#endif
  if (dz < 0) block->direction_bits |= _BV(Z_AXIS);
   28044:	8d a5       	ldd	r24, Y+45	; 0x2d
   28046:	9e a5       	ldd	r25, Y+46	; 0x2e
   28048:	af a5       	ldd	r26, Y+47	; 0x2f
   2804a:	b8 a9       	ldd	r27, Y+48	; 0x30
   2804c:	b7 ff       	sbrs	r27, 7
   2804e:	0b c0       	rjmp	.+22     	; 0x28066 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x600>
   28050:	8e e6       	ldi	r24, 0x6E	; 110
   28052:	82 9d       	mul	r24, r2
   28054:	f0 01       	movw	r30, r0
   28056:	83 9d       	mul	r24, r3
   28058:	f0 0d       	add	r31, r0
   2805a:	11 24       	eor	r1, r1
   2805c:	e2 5a       	subi	r30, 0xA2	; 162
   2805e:	f9 4f       	sbci	r31, 0xF9	; 249
   28060:	80 8d       	ldd	r24, Z+24	; 0x18
   28062:	84 60       	ori	r24, 0x04	; 4
   28064:	80 8f       	std	Z+24, r24	; 0x18
  if (de < 0) block->direction_bits |= _BV(E_AXIS);
   28066:	77 fe       	sbrs	r7, 7
   28068:	0b c0       	rjmp	.+22     	; 0x28080 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x61a>
   2806a:	8e e6       	ldi	r24, 0x6E	; 110
   2806c:	82 9d       	mul	r24, r2
   2806e:	f0 01       	movw	r30, r0
   28070:	83 9d       	mul	r24, r3
   28072:	f0 0d       	add	r31, r0
   28074:	11 24       	eor	r1, r1
   28076:	e2 5a       	subi	r30, 0xA2	; 162
   28078:	f9 4f       	sbci	r31, 0xF9	; 249
   2807a:	80 8d       	ldd	r24, Z+24	; 0x18
   2807c:	88 60       	ori	r24, 0x08	; 8
   2807e:	80 8f       	std	Z+24, r24	; 0x18
  {
    enable_x();
    enable_y();
  }
  #else
  if(block->steps[X_AXIS].wide != 0) enable_x();
   28080:	01 2b       	or	r16, r17
   28082:	02 2b       	or	r16, r18
   28084:	03 2b       	or	r16, r19
   28086:	09 f0       	breq	.+2      	; 0x2808a <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x624>
   28088:	17 98       	cbi	0x02, 7	; 2
  if(block->steps[Y_AXIS].wide != 0) enable_y();
   2808a:	8e e6       	ldi	r24, 0x6E	; 110
   2808c:	82 9d       	mul	r24, r2
   2808e:	f0 01       	movw	r30, r0
   28090:	83 9d       	mul	r24, r3
   28092:	f0 0d       	add	r31, r0
   28094:	11 24       	eor	r1, r1
   28096:	e2 5a       	subi	r30, 0xA2	; 162
   28098:	f9 4f       	sbci	r31, 0xF9	; 249
   2809a:	84 81       	ldd	r24, Z+4	; 0x04
   2809c:	95 81       	ldd	r25, Z+5	; 0x05
   2809e:	a6 81       	ldd	r26, Z+6	; 0x06
   280a0:	b7 81       	ldd	r27, Z+7	; 0x07
   280a2:	89 2b       	or	r24, r25
   280a4:	8a 2b       	or	r24, r26
   280a6:	8b 2b       	or	r24, r27
   280a8:	09 f0       	breq	.+2      	; 0x280ac <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x646>
   280aa:	16 98       	cbi	0x02, 6	; 2
  #endif
  if(block->steps[Z_AXIS].wide != 0) enable_z();
   280ac:	8e e6       	ldi	r24, 0x6E	; 110
   280ae:	82 9d       	mul	r24, r2
   280b0:	f0 01       	movw	r30, r0
   280b2:	83 9d       	mul	r24, r3
   280b4:	f0 0d       	add	r31, r0
   280b6:	11 24       	eor	r1, r1
   280b8:	e2 5a       	subi	r30, 0xA2	; 162
   280ba:	f9 4f       	sbci	r31, 0xF9	; 249
   280bc:	80 85       	ldd	r24, Z+8	; 0x08
   280be:	91 85       	ldd	r25, Z+9	; 0x09
   280c0:	a2 85       	ldd	r26, Z+10	; 0x0a
   280c2:	b3 85       	ldd	r27, Z+11	; 0x0b
   280c4:	89 2b       	or	r24, r25
   280c6:	8a 2b       	or	r24, r26
   280c8:	8b 2b       	or	r24, r27
   280ca:	09 f0       	breq	.+2      	; 0x280ce <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x668>
   280cc:	15 98       	cbi	0x02, 5	; 2
  if(block->steps[E_AXIS].wide != 0) enable_e0();
   280ce:	8e e6       	ldi	r24, 0x6E	; 110
   280d0:	82 9d       	mul	r24, r2
   280d2:	f0 01       	movw	r30, r0
   280d4:	83 9d       	mul	r24, r3
   280d6:	f0 0d       	add	r31, r0
   280d8:	11 24       	eor	r1, r1
   280da:	e2 5a       	subi	r30, 0xA2	; 162
   280dc:	f9 4f       	sbci	r31, 0xF9	; 249
   280de:	84 85       	ldd	r24, Z+12	; 0x0c
   280e0:	95 85       	ldd	r25, Z+13	; 0x0d
   280e2:	a6 85       	ldd	r26, Z+14	; 0x0e
   280e4:	b7 85       	ldd	r27, Z+15	; 0x0f
   280e6:	89 2b       	or	r24, r25
   280e8:	8a 2b       	or	r24, r26
   280ea:	8b 2b       	or	r24, r27
   280ec:	09 f0       	breq	.+2      	; 0x280f0 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x68a>
   280ee:	14 98       	cbi	0x02, 4	; 2

  if (block->steps[E_AXIS].wide == 0)
   280f0:	8e e6       	ldi	r24, 0x6E	; 110
   280f2:	82 9d       	mul	r24, r2
   280f4:	f0 01       	movw	r30, r0
   280f6:	83 9d       	mul	r24, r3
   280f8:	f0 0d       	add	r31, r0
   280fa:	11 24       	eor	r1, r1
   280fc:	e2 5a       	subi	r30, 0xA2	; 162
   280fe:	f9 4f       	sbci	r31, 0xF9	; 249
   28100:	24 85       	ldd	r18, Z+12	; 0x0c
   28102:	35 85       	ldd	r19, Z+13	; 0x0d
   28104:	46 85       	ldd	r20, Z+14	; 0x0e
   28106:	57 85       	ldd	r21, Z+15	; 0x0f
   28108:	2a 96       	adiw	r28, 0x0a	; 10
   2810a:	2c af       	std	Y+60, r18	; 0x3c
   2810c:	3d af       	std	Y+61, r19	; 0x3d
   2810e:	4e af       	std	Y+62, r20	; 0x3e
   28110:	5f af       	std	Y+63, r21	; 0x3f
   28112:	2a 97       	sbiw	r28, 0x0a	; 10
   28114:	23 2b       	or	r18, r19
   28116:	24 2b       	or	r18, r20
   28118:	25 2b       	or	r18, r21
   2811a:	09 f0       	breq	.+2      	; 0x2811e <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x6b8>
   2811c:	ac c7       	rjmp	.+3928   	; 0x29076 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1610>
  {
    if(feed_rate<cs.mintravelfeedrate) feed_rate=cs.mintravelfeedrate;
   2811e:	a0 90 a7 0d 	lds	r10, 0x0DA7	; 0x800da7 <cs+0x40>
   28122:	b0 90 a8 0d 	lds	r11, 0x0DA8	; 0x800da8 <cs+0x41>
   28126:	00 91 a9 0d 	lds	r16, 0x0DA9	; 0x800da9 <cs+0x42>
   2812a:	10 91 aa 0d 	lds	r17, 0x0DAA	; 0x800daa <cs+0x43>
  }
  else
  {
    if(feed_rate<cs.minimumfeedrate) feed_rate=cs.minimumfeedrate;
   2812e:	29 ad       	ldd	r18, Y+57	; 0x39
   28130:	39 a9       	ldd	r19, Y+49	; 0x31
   28132:	4d ad       	ldd	r20, Y+61	; 0x3d
   28134:	5d a9       	ldd	r21, Y+53	; 0x35
   28136:	b5 01       	movw	r22, r10
   28138:	c8 01       	movw	r24, r16
   2813a:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   2813e:	18 16       	cp	r1, r24
   28140:	24 f4       	brge	.+8      	; 0x2814a <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x6e4>
   28142:	a9 ae       	std	Y+57, r10	; 0x39
   28144:	b9 aa       	std	Y+49, r11	; 0x31
   28146:	0d af       	std	Y+61, r16	; 0x3d
   28148:	1d ab       	std	Y+53, r17	; 0x35
So we need to create other 2 "AXIS", named X_HEAD and Y_HEAD, meaning the real displacement of the Head.
Having the real displacement of the head, we can calculate the total movement length and apply the desired speed.
*/
  #ifndef COREXY
    float delta_mm[4];
    delta_mm[X_AXIS] = dx / cs.axis_steps_per_mm[X_AXIS];
   2814a:	c7 01       	movw	r24, r14
   2814c:	b6 01       	movw	r22, r12
   2814e:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   28152:	20 91 6b 0d 	lds	r18, 0x0D6B	; 0x800d6b <cs+0x4>
   28156:	30 91 6c 0d 	lds	r19, 0x0D6C	; 0x800d6c <cs+0x5>
   2815a:	40 91 6d 0d 	lds	r20, 0x0D6D	; 0x800d6d <cs+0x6>
   2815e:	50 91 6e 0d 	lds	r21, 0x0D6E	; 0x800d6e <cs+0x7>
   28162:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   28166:	4b 01       	movw	r8, r22
   28168:	5c 01       	movw	r10, r24
   2816a:	89 82       	std	Y+1, r8	; 0x01
   2816c:	9a 82       	std	Y+2, r9	; 0x02
   2816e:	ab 82       	std	Y+3, r10	; 0x03
   28170:	bc 82       	std	Y+4, r11	; 0x04
    delta_mm[Y_AXIS] = dy / cs.axis_steps_per_mm[Y_AXIS];
   28172:	69 a5       	ldd	r22, Y+41	; 0x29
   28174:	7a a5       	ldd	r23, Y+42	; 0x2a
   28176:	8b a5       	ldd	r24, Y+43	; 0x2b
   28178:	9c a5       	ldd	r25, Y+44	; 0x2c
   2817a:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   2817e:	20 91 6f 0d 	lds	r18, 0x0D6F	; 0x800d6f <cs+0x8>
   28182:	30 91 70 0d 	lds	r19, 0x0D70	; 0x800d70 <cs+0x9>
   28186:	40 91 71 0d 	lds	r20, 0x0D71	; 0x800d71 <cs+0xa>
   2818a:	50 91 72 0d 	lds	r21, 0x0D72	; 0x800d72 <cs+0xb>
   2818e:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   28192:	6b 01       	movw	r12, r22
   28194:	7c 01       	movw	r14, r24
   28196:	cd 82       	std	Y+5, r12	; 0x05
   28198:	de 82       	std	Y+6, r13	; 0x06
   2819a:	ef 82       	std	Y+7, r14	; 0x07
   2819c:	f8 86       	std	Y+8, r15	; 0x08
    delta_mm[X_HEAD] = dx / cs.axis_steps_per_mm[X_AXIS];
    delta_mm[Y_HEAD] = dy / cs.axis_steps_per_mm[Y_AXIS];
    delta_mm[X_AXIS] = (dx + dy) / cs.axis_steps_per_mm[X_AXIS];
    delta_mm[Y_AXIS] = (dx - dy) / cs.axis_steps_per_mm[Y_AXIS];
  #endif
  delta_mm[Z_AXIS] = dz / cs.axis_steps_per_mm[Z_AXIS];
   2819e:	6d a5       	ldd	r22, Y+45	; 0x2d
   281a0:	7e a5       	ldd	r23, Y+46	; 0x2e
   281a2:	8f a5       	ldd	r24, Y+47	; 0x2f
   281a4:	98 a9       	ldd	r25, Y+48	; 0x30
   281a6:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   281aa:	20 91 73 0d 	lds	r18, 0x0D73	; 0x800d73 <cs+0xc>
   281ae:	30 91 74 0d 	lds	r19, 0x0D74	; 0x800d74 <cs+0xd>
   281b2:	40 91 75 0d 	lds	r20, 0x0D75	; 0x800d75 <cs+0xe>
   281b6:	50 91 76 0d 	lds	r21, 0x0D76	; 0x800d76 <cs+0xf>
   281ba:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   281be:	22 96       	adiw	r28, 0x02	; 2
   281c0:	6c af       	std	Y+60, r22	; 0x3c
   281c2:	7d af       	std	Y+61, r23	; 0x3d
   281c4:	8e af       	std	Y+62, r24	; 0x3e
   281c6:	9f af       	std	Y+63, r25	; 0x3f
   281c8:	22 97       	sbiw	r28, 0x02	; 2
   281ca:	69 87       	std	Y+9, r22	; 0x09
   281cc:	7a 87       	std	Y+10, r23	; 0x0a
   281ce:	8b 87       	std	Y+11, r24	; 0x0b
   281d0:	9c 87       	std	Y+12, r25	; 0x0c
  delta_mm[E_AXIS] = de / cs.axis_steps_per_mm[E_AXIS];
   281d2:	c3 01       	movw	r24, r6
   281d4:	b2 01       	movw	r22, r4
   281d6:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   281da:	20 91 77 0d 	lds	r18, 0x0D77	; 0x800d77 <cs+0x10>
   281de:	30 91 78 0d 	lds	r19, 0x0D78	; 0x800d78 <cs+0x11>
   281e2:	40 91 79 0d 	lds	r20, 0x0D79	; 0x800d79 <cs+0x12>
   281e6:	50 91 7a 0d 	lds	r21, 0x0D7A	; 0x800d7a <cs+0x13>
   281ea:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   281ee:	26 96       	adiw	r28, 0x06	; 6
   281f0:	6c af       	std	Y+60, r22	; 0x3c
   281f2:	7d af       	std	Y+61, r23	; 0x3d
   281f4:	8e af       	std	Y+62, r24	; 0x3e
   281f6:	9f af       	std	Y+63, r25	; 0x3f
   281f8:	26 97       	sbiw	r28, 0x06	; 6
   281fa:	6d 87       	std	Y+13, r22	; 0x0d
   281fc:	7e 87       	std	Y+14, r23	; 0x0e
   281fe:	8f 87       	std	Y+15, r24	; 0x0f
   28200:	98 8b       	std	Y+16, r25	; 0x10
  if ( block->steps[X_AXIS].wide <=dropsegments && block->steps[Y_AXIS].wide <=dropsegments && block->steps[Z_AXIS].wide <=dropsegments )
   28202:	8e e6       	ldi	r24, 0x6E	; 110
   28204:	82 9d       	mul	r24, r2
   28206:	f0 01       	movw	r30, r0
   28208:	83 9d       	mul	r24, r3
   2820a:	f0 0d       	add	r31, r0
   2820c:	11 24       	eor	r1, r1
   2820e:	e2 5a       	subi	r30, 0xA2	; 162
   28210:	f9 4f       	sbci	r31, 0xF9	; 249
   28212:	80 81       	ld	r24, Z
   28214:	91 81       	ldd	r25, Z+1	; 0x01
   28216:	a2 81       	ldd	r26, Z+2	; 0x02
   28218:	b3 81       	ldd	r27, Z+3	; 0x03
   2821a:	2e 96       	adiw	r28, 0x0e	; 14
   2821c:	8c af       	std	Y+60, r24	; 0x3c
   2821e:	9d af       	std	Y+61, r25	; 0x3d
   28220:	ae af       	std	Y+62, r26	; 0x3e
   28222:	bf af       	std	Y+63, r27	; 0x3f
   28224:	2e 97       	sbiw	r28, 0x0e	; 14
   28226:	06 97       	sbiw	r24, 0x06	; 6
   28228:	a1 05       	cpc	r26, r1
   2822a:	b1 05       	cpc	r27, r1
   2822c:	0c f0       	brlt	.+2      	; 0x28230 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x7ca>
   2822e:	2c c7       	rjmp	.+3672   	; 0x29088 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1622>
   28230:	84 81       	ldd	r24, Z+4	; 0x04
   28232:	95 81       	ldd	r25, Z+5	; 0x05
   28234:	a6 81       	ldd	r26, Z+6	; 0x06
   28236:	b7 81       	ldd	r27, Z+7	; 0x07
   28238:	06 97       	sbiw	r24, 0x06	; 6
   2823a:	a1 05       	cpc	r26, r1
   2823c:	b1 05       	cpc	r27, r1
   2823e:	0c f0       	brlt	.+2      	; 0x28242 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x7dc>
   28240:	23 c7       	rjmp	.+3654   	; 0x29088 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1622>
   28242:	80 85       	ldd	r24, Z+8	; 0x08
   28244:	91 85       	ldd	r25, Z+9	; 0x09
   28246:	a2 85       	ldd	r26, Z+10	; 0x0a
   28248:	b3 85       	ldd	r27, Z+11	; 0x0b
   2824a:	06 97       	sbiw	r24, 0x06	; 6
   2824c:	a1 05       	cpc	r26, r1
   2824e:	b1 05       	cpc	r27, r1
   28250:	0c f0       	brlt	.+2      	; 0x28254 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x7ee>
   28252:	1a c7       	rjmp	.+3636   	; 0x29088 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1622>
  {
    block->millimeters = fabs(delta_mm[E_AXIS]);
   28254:	26 96       	adiw	r28, 0x06	; 6
   28256:	8c ad       	ldd	r24, Y+60	; 0x3c
   28258:	9d ad       	ldd	r25, Y+61	; 0x3d
   2825a:	ae ad       	ldd	r26, Y+62	; 0x3e
   2825c:	bf ad       	ldd	r27, Y+63	; 0x3f
   2825e:	26 97       	sbiw	r28, 0x06	; 6
   28260:	bf 77       	andi	r27, 0x7F	; 127
   28262:	85 a7       	std	Z+45, r24	; 0x2d
   28264:	96 a7       	std	Z+46, r25	; 0x2e
   28266:	a7 a7       	std	Z+47, r26	; 0x2f
   28268:	b0 ab       	std	Z+48, r27	; 0x30
      block->millimeters = sqrt(square(delta_mm[X_AXIS]) + square(delta_mm[Y_AXIS]) + square(delta_mm[Z_AXIS]));
	#else
	  block->millimeters = sqrt(square(delta_mm[X_HEAD]) + square(delta_mm[Y_HEAD]) + square(delta_mm[Z_AXIS]));
    #endif
  }
  float inverse_millimeters = 1.0/block->millimeters;  // Inverse millimeters to remove multiple divides
   2826a:	8e e6       	ldi	r24, 0x6E	; 110
   2826c:	82 9d       	mul	r24, r2
   2826e:	f0 01       	movw	r30, r0
   28270:	83 9d       	mul	r24, r3
   28272:	f0 0d       	add	r31, r0
   28274:	11 24       	eor	r1, r1
   28276:	e2 5a       	subi	r30, 0xA2	; 162
   28278:	f9 4f       	sbci	r31, 0xF9	; 249
   2827a:	45 a4       	ldd	r4, Z+45	; 0x2d
   2827c:	56 a4       	ldd	r5, Z+46	; 0x2e
   2827e:	67 a4       	ldd	r6, Z+47	; 0x2f
   28280:	70 a8       	ldd	r7, Z+48	; 0x30
   28282:	a3 01       	movw	r20, r6
   28284:	92 01       	movw	r18, r4
   28286:	60 e0       	ldi	r22, 0x00	; 0
   28288:	70 e0       	ldi	r23, 0x00	; 0
   2828a:	80 e8       	ldi	r24, 0x80	; 128
   2828c:	9f e3       	ldi	r25, 0x3F	; 63
   2828e:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>

    // Calculate speed in mm/second for each axis. No divide by zero due to previous checks.
  float inverse_second = feed_rate * inverse_millimeters;
   28292:	29 ad       	ldd	r18, Y+57	; 0x39
   28294:	39 a9       	ldd	r19, Y+49	; 0x31
   28296:	4d ad       	ldd	r20, Y+61	; 0x3d
   28298:	5d a9       	ldd	r21, Y+53	; 0x35
   2829a:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2829e:	6b 01       	movw	r12, r22
   282a0:	7c 01       	movw	r14, r24
	return (block_buffer_head != block_buffer_tail);
}

//return the nr of buffered moves
FORCE_INLINE uint8_t moves_planned() {
    return (block_buffer_head + BLOCK_BUFFER_SIZE - block_buffer_tail) & (BLOCK_BUFFER_SIZE - 1);
   282a2:	80 91 3e 0d 	lds	r24, 0x0D3E	; 0x800d3e <block_buffer_head>
   282a6:	90 91 3f 0d 	lds	r25, 0x0D3F	; 0x800d3f <block_buffer_tail>
   282aa:	89 1b       	sub	r24, r25
   282ac:	8f 70       	andi	r24, 0x0F	; 15
   282ae:	8d af       	std	Y+61, r24	; 0x3d

  // slow down when de buffer starts to empty, rather than wait at the corner for a buffer refill
#ifdef SLOWDOWN
  //FIXME Vojtech: Why moves_queued > 1? Why not >=1?
  // Can we somehow differentiate the filling of the buffer at the start of a g-code from a buffer draining situation?
  if (moves_queued > 1 && moves_queued < (BLOCK_BUFFER_SIZE >> 1)) {
   282b0:	82 50       	subi	r24, 0x02	; 2
   282b2:	86 30       	cpi	r24, 0x06	; 6
   282b4:	08 f0       	brcs	.+2      	; 0x282b8 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x852>
   282b6:	40 c0       	rjmp	.+128    	; 0x28338 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x8d2>
      // segment time in micro seconds
      unsigned long segment_time = lround(1000000.0/inverse_second);
   282b8:	a7 01       	movw	r20, r14
   282ba:	96 01       	movw	r18, r12
   282bc:	60 e0       	ldi	r22, 0x00	; 0
   282be:	74 e2       	ldi	r23, 0x24	; 36
   282c0:	84 e7       	ldi	r24, 0x74	; 116
   282c2:	99 e4       	ldi	r25, 0x49	; 73
   282c4:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   282c8:	0f 94 45 a8 	call	0x3508a	; 0x3508a <lround>
   282cc:	4b 01       	movw	r8, r22
   282ce:	5c 01       	movw	r10, r24
      if (segment_time < cs.min_segment_time_us)
   282d0:	80 91 ab 0d 	lds	r24, 0x0DAB	; 0x800dab <cs+0x44>
   282d4:	90 91 ac 0d 	lds	r25, 0x0DAC	; 0x800dac <cs+0x45>
   282d8:	a0 91 ad 0d 	lds	r26, 0x0DAD	; 0x800dad <cs+0x46>
   282dc:	b0 91 ae 0d 	lds	r27, 0x0DAE	; 0x800dae <cs+0x47>
   282e0:	88 16       	cp	r8, r24
   282e2:	99 06       	cpc	r9, r25
   282e4:	aa 06       	cpc	r10, r26
   282e6:	bb 06       	cpc	r11, r27
   282e8:	38 f5       	brcc	.+78     	; 0x28338 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x8d2>
          // buffer is draining, add extra time.  The amount of time added increases if the buffer is still emptied more.
          inverse_second=1000000.0/(segment_time+lround(2*(cs.min_segment_time_us-segment_time)/moves_queued));
   282ea:	bc 01       	movw	r22, r24
   282ec:	cd 01       	movw	r24, r26
   282ee:	68 19       	sub	r22, r8
   282f0:	79 09       	sbc	r23, r9
   282f2:	8a 09       	sbc	r24, r10
   282f4:	9b 09       	sbc	r25, r11
   282f6:	66 0f       	add	r22, r22
   282f8:	77 1f       	adc	r23, r23
   282fa:	88 1f       	adc	r24, r24
   282fc:	99 1f       	adc	r25, r25
   282fe:	ad ad       	ldd	r26, Y+61	; 0x3d
   28300:	2a 2f       	mov	r18, r26
   28302:	30 e0       	ldi	r19, 0x00	; 0
   28304:	50 e0       	ldi	r21, 0x00	; 0
   28306:	40 e0       	ldi	r20, 0x00	; 0
   28308:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
   2830c:	ca 01       	movw	r24, r20
   2830e:	b9 01       	movw	r22, r18
   28310:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   28314:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   28318:	68 0d       	add	r22, r8
   2831a:	79 1d       	adc	r23, r9
   2831c:	8a 1d       	adc	r24, r10
   2831e:	9b 1d       	adc	r25, r11
   28320:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   28324:	9b 01       	movw	r18, r22
   28326:	ac 01       	movw	r20, r24
   28328:	60 e0       	ldi	r22, 0x00	; 0
   2832a:	74 e2       	ldi	r23, 0x24	; 36
   2832c:	84 e7       	ldi	r24, 0x74	; 116
   2832e:	99 e4       	ldi	r25, 0x49	; 73
   28330:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   28334:	6b 01       	movw	r12, r22
   28336:	7c 01       	movw	r14, r24
  }
#endif // SLOWDOWN

  block->nominal_speed = block->millimeters * inverse_second; // (mm/sec) Always > 0
   28338:	a3 01       	movw	r20, r6
   2833a:	92 01       	movw	r18, r4
   2833c:	c7 01       	movw	r24, r14
   2833e:	b6 01       	movw	r22, r12
   28340:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   28344:	6d ab       	std	Y+53, r22	; 0x35
   28346:	7e ab       	std	Y+54, r23	; 0x36
   28348:	8f ab       	std	Y+55, r24	; 0x37
   2834a:	98 af       	std	Y+56, r25	; 0x38
   2834c:	8e e6       	ldi	r24, 0x6E	; 110
   2834e:	82 9d       	mul	r24, r2
   28350:	80 01       	movw	r16, r0
   28352:	83 9d       	mul	r24, r3
   28354:	10 0d       	add	r17, r0
   28356:	11 24       	eor	r1, r1
   28358:	02 5a       	subi	r16, 0xA2	; 162
   2835a:	19 4f       	sbci	r17, 0xF9	; 249
   2835c:	2d a9       	ldd	r18, Y+53	; 0x35
   2835e:	3e a9       	ldd	r19, Y+54	; 0x36
   28360:	4f a9       	ldd	r20, Y+55	; 0x37
   28362:	58 ad       	ldd	r21, Y+56	; 0x38
   28364:	d8 01       	movw	r26, r16
   28366:	91 96       	adiw	r26, 0x21	; 33
   28368:	2d 93       	st	X+, r18
   2836a:	3d 93       	st	X+, r19
   2836c:	4d 93       	st	X+, r20
   2836e:	5c 93       	st	X, r21
   28370:	94 97       	sbiw	r26, 0x24	; 36
  block->nominal_rate = ceil(block->step_event_count.wide * inverse_second); // (step/sec) Always > 0
   28372:	50 96       	adiw	r26, 0x10	; 16
   28374:	6d 91       	ld	r22, X+
   28376:	7d 91       	ld	r23, X+
   28378:	8d 91       	ld	r24, X+
   2837a:	9c 91       	ld	r25, X
   2837c:	53 97       	sbiw	r26, 0x13	; 19
   2837e:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   28382:	69 af       	std	Y+57, r22	; 0x39
   28384:	7a af       	std	Y+58, r23	; 0x3a
   28386:	8b af       	std	Y+59, r24	; 0x3b
   28388:	9c af       	std	Y+60, r25	; 0x3c
   2838a:	9b 01       	movw	r18, r22
   2838c:	ac 01       	movw	r20, r24
   2838e:	c7 01       	movw	r24, r14
   28390:	b6 01       	movw	r22, r12
   28392:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   28396:	0f 94 e6 a5 	call	0x34bcc	; 0x34bcc <ceil>
   2839a:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   2839e:	62 96       	adiw	r28, 0x12	; 18
   283a0:	6c af       	std	Y+60, r22	; 0x3c
   283a2:	7d af       	std	Y+61, r23	; 0x3d
   283a4:	8e af       	std	Y+62, r24	; 0x3e
   283a6:	9f af       	std	Y+63, r25	; 0x3f
   283a8:	62 97       	sbiw	r28, 0x12	; 18
   283aa:	f8 01       	movw	r30, r16
   283ac:	66 ab       	std	Z+54, r22	; 0x36
   283ae:	77 ab       	std	Z+55, r23	; 0x37
   283b0:	80 af       	std	Z+56, r24	; 0x38
   283b2:	91 af       	std	Z+57, r25	; 0x39
   283b4:	9e 01       	movw	r18, r28
   283b6:	2f 5f       	subi	r18, 0xFF	; 255
   283b8:	3f 4f       	sbci	r19, 0xFF	; 255
   283ba:	3a ab       	std	Y+50, r19	; 0x32
   283bc:	29 ab       	std	Y+49, r18	; 0x31
   283be:	ae 01       	movw	r20, r28
   283c0:	4f 5e       	subi	r20, 0xEF	; 239
   283c2:	5f 4f       	sbci	r21, 0xFF	; 255
   283c4:	6e 96       	adiw	r28, 0x1e	; 30
   283c6:	5f af       	std	Y+63, r21	; 0x3f
   283c8:	4e af       	std	Y+62, r20	; 0x3e
   283ca:	6e 97       	sbiw	r28, 0x1e	; 30
   283cc:	8b e7       	ldi	r24, 0x7B	; 123
   283ce:	9d e0       	ldi	r25, 0x0D	; 13
   283d0:	68 96       	adiw	r28, 0x18	; 24
   283d2:	9f af       	std	Y+63, r25	; 0x3f
   283d4:	8e af       	std	Y+62, r24	; 0x3e
   283d6:	68 97       	sbiw	r28, 0x18	; 24
   283d8:	6c 96       	adiw	r28, 0x1c	; 28
   283da:	5f af       	std	Y+63, r21	; 0x3f
   283dc:	4e af       	std	Y+62, r20	; 0x3e
   283de:	6c 97       	sbiw	r28, 0x1c	; 28

  // Calculate and limit speed in mm/sec for each axis
  float current_speed[4];
  float speed_factor = 1.0; //factor <=1 do decrease speed
   283e0:	19 a6       	std	Y+41, r1	; 0x29
   283e2:	1d a6       	std	Y+45, r1	; 0x2d
   283e4:	00 e8       	ldi	r16, 0x80	; 128
   283e6:	1f e3       	ldi	r17, 0x3F	; 63
  for(int i=0; i < 4; i++)
  {
    current_speed[i] = delta_mm[i] * inverse_second;
   283e8:	a9 a9       	ldd	r26, Y+49	; 0x31
   283ea:	ba a9       	ldd	r27, Y+50	; 0x32
   283ec:	2d 91       	ld	r18, X+
   283ee:	3d 91       	ld	r19, X+
   283f0:	4d 91       	ld	r20, X+
   283f2:	5d 91       	ld	r21, X+
   283f4:	ba ab       	std	Y+50, r27	; 0x32
   283f6:	a9 ab       	std	Y+49, r26	; 0x31
   283f8:	c7 01       	movw	r24, r14
   283fa:	b6 01       	movw	r22, r12
   283fc:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   28400:	6c 96       	adiw	r28, 0x1c	; 28
   28402:	ee ad       	ldd	r30, Y+62	; 0x3e
   28404:	ff ad       	ldd	r31, Y+63	; 0x3f
   28406:	6c 97       	sbiw	r28, 0x1c	; 28
   28408:	61 93       	st	Z+, r22
   2840a:	71 93       	st	Z+, r23
   2840c:	81 93       	st	Z+, r24
   2840e:	91 93       	st	Z+, r25
   28410:	6c 96       	adiw	r28, 0x1c	; 28
   28412:	ff af       	std	Y+63, r31	; 0x3f
   28414:	ee af       	std	Y+62, r30	; 0x3e
   28416:	6c 97       	sbiw	r28, 0x1c	; 28
	if(fabs(current_speed[i]) > max_feedrate[i])
   28418:	4b 01       	movw	r8, r22
   2841a:	5c 01       	movw	r10, r24
   2841c:	e8 94       	clt
   2841e:	b7 f8       	bld	r11, 7
   28420:	68 96       	adiw	r28, 0x18	; 24
   28422:	ae ad       	ldd	r26, Y+62	; 0x3e
   28424:	bf ad       	ldd	r27, Y+63	; 0x3f
   28426:	68 97       	sbiw	r28, 0x18	; 24
   28428:	2d 91       	ld	r18, X+
   2842a:	3d 91       	ld	r19, X+
   2842c:	4d 91       	ld	r20, X+
   2842e:	5d 91       	ld	r21, X+
   28430:	68 96       	adiw	r28, 0x18	; 24
   28432:	bf af       	std	Y+63, r27	; 0x3f
   28434:	ae af       	std	Y+62, r26	; 0x3e
   28436:	68 97       	sbiw	r28, 0x18	; 24
   28438:	66 96       	adiw	r28, 0x16	; 22
   2843a:	2c af       	std	Y+60, r18	; 0x3c
   2843c:	3d af       	std	Y+61, r19	; 0x3d
   2843e:	4e af       	std	Y+62, r20	; 0x3e
   28440:	5f af       	std	Y+63, r21	; 0x3f
   28442:	66 97       	sbiw	r28, 0x16	; 22
   28444:	c5 01       	movw	r24, r10
   28446:	b4 01       	movw	r22, r8
   28448:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   2844c:	18 16       	cp	r1, r24
   2844e:	b4 f4       	brge	.+44     	; 0x2847c <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xa16>
	{
      speed_factor = min(speed_factor, max_feedrate[i] / fabs(current_speed[i]));
   28450:	a5 01       	movw	r20, r10
   28452:	94 01       	movw	r18, r8
   28454:	66 96       	adiw	r28, 0x16	; 22
   28456:	6c ad       	ldd	r22, Y+60	; 0x3c
   28458:	7d ad       	ldd	r23, Y+61	; 0x3d
   2845a:	8e ad       	ldd	r24, Y+62	; 0x3e
   2845c:	9f ad       	ldd	r25, Y+63	; 0x3f
   2845e:	66 97       	sbiw	r28, 0x16	; 22
   28460:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   28464:	4b 01       	movw	r8, r22
   28466:	5c 01       	movw	r10, r24
   28468:	29 a5       	ldd	r18, Y+41	; 0x29
   2846a:	3d a5       	ldd	r19, Y+45	; 0x2d
   2846c:	a8 01       	movw	r20, r16
   2846e:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   28472:	18 16       	cp	r1, r24
   28474:	1c f0       	brlt	.+6      	; 0x2847c <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xa16>
   28476:	89 a6       	std	Y+41, r8	; 0x29
   28478:	9d a6       	std	Y+45, r9	; 0x2d
   2847a:	85 01       	movw	r16, r10
  block->nominal_rate = ceil(block->step_event_count.wide * inverse_second); // (step/sec) Always > 0

  // Calculate and limit speed in mm/sec for each axis
  float current_speed[4];
  float speed_factor = 1.0; //factor <=1 do decrease speed
  for(int i=0; i < 4; i++)
   2847c:	6e 96       	adiw	r28, 0x1e	; 30
   2847e:	ee ad       	ldd	r30, Y+62	; 0x3e
   28480:	ff ad       	ldd	r31, Y+63	; 0x3f
   28482:	6e 97       	sbiw	r28, 0x1e	; 30
   28484:	29 a9       	ldd	r18, Y+49	; 0x31
   28486:	3a a9       	ldd	r19, Y+50	; 0x32
   28488:	e2 17       	cp	r30, r18
   2848a:	f3 07       	cpc	r31, r19
   2848c:	09 f0       	breq	.+2      	; 0x28490 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xa2a>
   2848e:	ac cf       	rjmp	.-168    	; 0x283e8 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x982>
      speed_factor = min(speed_factor, max_feedrate[i] / fabs(current_speed[i]));
	}
  }

  // Correct the speed
  if( speed_factor < 1.0)
   28490:	20 e0       	ldi	r18, 0x00	; 0
   28492:	30 e0       	ldi	r19, 0x00	; 0
   28494:	40 e8       	ldi	r20, 0x80	; 128
   28496:	5f e3       	ldi	r21, 0x3F	; 63
   28498:	69 a5       	ldd	r22, Y+41	; 0x29
   2849a:	7d a5       	ldd	r23, Y+45	; 0x2d
   2849c:	c8 01       	movw	r24, r16
   2849e:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   284a2:	87 ff       	sbrs	r24, 7
   284a4:	50 c0       	rjmp	.+160    	; 0x28546 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xae0>
   284a6:	6e 96       	adiw	r28, 0x1e	; 30
   284a8:	ae ac       	ldd	r10, Y+62	; 0x3e
   284aa:	bf ac       	ldd	r11, Y+63	; 0x3f
   284ac:	6e 97       	sbiw	r28, 0x1e	; 30
   284ae:	30 e1       	ldi	r19, 0x10	; 16
   284b0:	a3 0e       	add	r10, r19
   284b2:	b1 1c       	adc	r11, r1
   284b4:	6e 96       	adiw	r28, 0x1e	; 30
   284b6:	ce ac       	ldd	r12, Y+62	; 0x3e
   284b8:	df ac       	ldd	r13, Y+63	; 0x3f
   284ba:	6e 97       	sbiw	r28, 0x1e	; 30
  {
    for(unsigned char i=0; i < 4; i++)
    {
      current_speed[i] *= speed_factor;
   284bc:	d6 01       	movw	r26, r12
   284be:	6d 91       	ld	r22, X+
   284c0:	7d 91       	ld	r23, X+
   284c2:	8d 91       	ld	r24, X+
   284c4:	9d 91       	ld	r25, X+
   284c6:	6d 01       	movw	r12, r26
   284c8:	7d 01       	movw	r14, r26
   284ca:	b4 e0       	ldi	r27, 0x04	; 4
   284cc:	eb 1a       	sub	r14, r27
   284ce:	f1 08       	sbc	r15, r1
   284d0:	29 a5       	ldd	r18, Y+41	; 0x29
   284d2:	3d a5       	ldd	r19, Y+45	; 0x2d
   284d4:	a8 01       	movw	r20, r16
   284d6:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   284da:	f7 01       	movw	r30, r14
   284dc:	60 83       	st	Z, r22
   284de:	71 83       	std	Z+1, r23	; 0x01
   284e0:	82 83       	std	Z+2, r24	; 0x02
   284e2:	93 83       	std	Z+3, r25	; 0x03
  }

  // Correct the speed
  if( speed_factor < 1.0)
  {
    for(unsigned char i=0; i < 4; i++)
   284e4:	ac 14       	cp	r10, r12
   284e6:	bd 04       	cpc	r11, r13
   284e8:	49 f7       	brne	.-46     	; 0x284bc <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xa56>
    {
      current_speed[i] *= speed_factor;
    }
    block->nominal_speed *= speed_factor;
   284ea:	2e e6       	ldi	r18, 0x6E	; 110
   284ec:	22 9d       	mul	r18, r2
   284ee:	c0 01       	movw	r24, r0
   284f0:	23 9d       	mul	r18, r3
   284f2:	90 0d       	add	r25, r0
   284f4:	11 24       	eor	r1, r1
   284f6:	9c 01       	movw	r18, r24
   284f8:	22 5a       	subi	r18, 0xA2	; 162
   284fa:	39 4f       	sbci	r19, 0xF9	; 249
   284fc:	79 01       	movw	r14, r18
   284fe:	29 a5       	ldd	r18, Y+41	; 0x29
   28500:	3d a5       	ldd	r19, Y+45	; 0x2d
   28502:	a8 01       	movw	r20, r16
   28504:	6d a9       	ldd	r22, Y+53	; 0x35
   28506:	7e a9       	ldd	r23, Y+54	; 0x36
   28508:	8f a9       	ldd	r24, Y+55	; 0x37
   2850a:	98 ad       	ldd	r25, Y+56	; 0x38
   2850c:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   28510:	d7 01       	movw	r26, r14
   28512:	91 96       	adiw	r26, 0x21	; 33
   28514:	6d 93       	st	X+, r22
   28516:	7d 93       	st	X+, r23
   28518:	8d 93       	st	X+, r24
   2851a:	9c 93       	st	X, r25
   2851c:	94 97       	sbiw	r26, 0x24	; 36
    block->nominal_rate *= speed_factor;
   2851e:	62 96       	adiw	r28, 0x12	; 18
   28520:	6c ad       	ldd	r22, Y+60	; 0x3c
   28522:	7d ad       	ldd	r23, Y+61	; 0x3d
   28524:	8e ad       	ldd	r24, Y+62	; 0x3e
   28526:	9f ad       	ldd	r25, Y+63	; 0x3f
   28528:	62 97       	sbiw	r28, 0x12	; 18
   2852a:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   2852e:	29 a5       	ldd	r18, Y+41	; 0x29
   28530:	3d a5       	ldd	r19, Y+45	; 0x2d
   28532:	a8 01       	movw	r20, r16
   28534:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   28538:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   2853c:	f7 01       	movw	r30, r14
   2853e:	66 ab       	std	Z+54, r22	; 0x36
   28540:	77 ab       	std	Z+55, r23	; 0x37
   28542:	80 af       	std	Z+56, r24	; 0x38
   28544:	91 af       	std	Z+57, r25	; 0x39
  float e_D_ratio = 0;
#endif
  // Compute and limit the acceleration rate for the trapezoid generator.
  // block->step_event_count ... event count of the fastest axis
  // block->millimeters ... Euclidian length of the XYZ movement or the E length, if no XYZ movement.
  float steps_per_mm = block->step_event_count.wide/block->millimeters;
   28546:	a3 01       	movw	r20, r6
   28548:	92 01       	movw	r18, r4
   2854a:	69 ad       	ldd	r22, Y+57	; 0x39
   2854c:	7a ad       	ldd	r23, Y+58	; 0x3a
   2854e:	8b ad       	ldd	r24, Y+59	; 0x3b
   28550:	9c ad       	ldd	r25, Y+60	; 0x3c
   28552:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   28556:	69 a7       	std	Y+41, r22	; 0x29
   28558:	7a a7       	std	Y+42, r23	; 0x2a
   2855a:	8b a7       	std	Y+43, r24	; 0x2b
   2855c:	9c a7       	std	Y+44, r25	; 0x2c
  uint32_t accel;
  if(block->steps[X_AXIS].wide == 0 && block->steps[Y_AXIS].wide == 0 && block->steps[Z_AXIS].wide == 0)
   2855e:	2e 96       	adiw	r28, 0x0e	; 14
   28560:	2c ad       	ldd	r18, Y+60	; 0x3c
   28562:	3d ad       	ldd	r19, Y+61	; 0x3d
   28564:	4e ad       	ldd	r20, Y+62	; 0x3e
   28566:	5f ad       	ldd	r21, Y+63	; 0x3f
   28568:	2e 97       	sbiw	r28, 0x0e	; 14
   2856a:	23 2b       	or	r18, r19
   2856c:	24 2b       	or	r18, r20
   2856e:	25 2b       	or	r18, r21
   28570:	09 f0       	breq	.+2      	; 0x28574 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xb0e>
   28572:	b9 c5       	rjmp	.+2930   	; 0x290e6 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1680>
   28574:	8e e6       	ldi	r24, 0x6E	; 110
   28576:	82 9d       	mul	r24, r2
   28578:	80 01       	movw	r16, r0
   2857a:	83 9d       	mul	r24, r3
   2857c:	10 0d       	add	r17, r0
   2857e:	11 24       	eor	r1, r1
   28580:	02 5a       	subi	r16, 0xA2	; 162
   28582:	19 4f       	sbci	r17, 0xF9	; 249
   28584:	f8 01       	movw	r30, r16
   28586:	84 81       	ldd	r24, Z+4	; 0x04
   28588:	95 81       	ldd	r25, Z+5	; 0x05
   2858a:	a6 81       	ldd	r26, Z+6	; 0x06
   2858c:	b7 81       	ldd	r27, Z+7	; 0x07
   2858e:	89 2b       	or	r24, r25
   28590:	8a 2b       	or	r24, r26
   28592:	8b 2b       	or	r24, r27
   28594:	09 f0       	breq	.+2      	; 0x28598 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xb32>
   28596:	a7 c5       	rjmp	.+2894   	; 0x290e6 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1680>
   28598:	80 85       	ldd	r24, Z+8	; 0x08
   2859a:	91 85       	ldd	r25, Z+9	; 0x09
   2859c:	a2 85       	ldd	r26, Z+10	; 0x0a
   2859e:	b3 85       	ldd	r27, Z+11	; 0x0b
   285a0:	89 2b       	or	r24, r25
   285a2:	8a 2b       	or	r24, r26
   285a4:	8b 2b       	or	r24, r27
   285a6:	09 f0       	breq	.+2      	; 0x285aa <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xb44>
   285a8:	9e c5       	rjmp	.+2876   	; 0x290e6 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1680>
  {
    accel = ceil(cs.retract_acceleration * steps_per_mm); // convert to: acceleration steps/sec^2
   285aa:	20 91 9f 0d 	lds	r18, 0x0D9F	; 0x800d9f <cs+0x38>
   285ae:	30 91 a0 0d 	lds	r19, 0x0DA0	; 0x800da0 <cs+0x39>
   285b2:	40 91 a1 0d 	lds	r20, 0x0DA1	; 0x800da1 <cs+0x3a>
   285b6:	50 91 a2 0d 	lds	r21, 0x0DA2	; 0x800da2 <cs+0x3b>
   285ba:	69 a5       	ldd	r22, Y+41	; 0x29
   285bc:	7a a5       	ldd	r23, Y+42	; 0x2a
   285be:	8b a5       	ldd	r24, Y+43	; 0x2b
   285c0:	9c a5       	ldd	r25, Y+44	; 0x2c
   285c2:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   285c6:	0f 94 e6 a5 	call	0x34bcc	; 0x34bcc <ceil>
   285ca:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   285ce:	2b 01       	movw	r4, r22
   285d0:	3c 01       	movw	r6, r24
    #ifdef LIN_ADVANCE
    block->use_advance_lead = false;
   285d2:	f8 01       	movw	r30, r16
   285d4:	e4 5b       	subi	r30, 0xB4	; 180
   285d6:	ff 4f       	sbci	r31, 0xFF	; 255
   285d8:	10 82       	st	Z, r1
    block->nominal_speed *= speed_factor;
    block->nominal_rate *= speed_factor;
  }

#ifdef LIN_ADVANCE
  float e_D_ratio = 0;
   285da:	6a 96       	adiw	r28, 0x1a	; 26
   285dc:	1c ae       	std	Y+60, r1	; 0x3c
   285de:	1d ae       	std	Y+61, r1	; 0x3d
   285e0:	1e ae       	std	Y+62, r1	; 0x3e
   285e2:	1f ae       	std	Y+63, r1	; 0x3f
   285e4:	6a 97       	sbiw	r28, 0x1a	; 26
        if (max_possible < accel) accel = max_possible;
      }
    }
  }
  // Acceleration of the segment, in mm/sec^2
  block->acceleration_steps_per_s2 = accel;
   285e6:	8e e6       	ldi	r24, 0x6E	; 110
   285e8:	82 9d       	mul	r24, r2
   285ea:	80 01       	movw	r16, r0
   285ec:	83 9d       	mul	r24, r3
   285ee:	10 0d       	add	r17, r0
   285f0:	11 24       	eor	r1, r1
   285f2:	02 5a       	subi	r16, 0xA2	; 162
   285f4:	19 4f       	sbci	r17, 0xF9	; 249
   285f6:	f8 01       	movw	r30, r16
   285f8:	ee 5b       	subi	r30, 0xBE	; 190
   285fa:	ff 4f       	sbci	r31, 0xFF	; 255
   285fc:	40 82       	st	Z, r4
   285fe:	51 82       	std	Z+1, r5	; 0x01
   28600:	62 82       	std	Z+2, r6	; 0x02
   28602:	73 82       	std	Z+3, r7	; 0x03
  block->acceleration = accel / steps_per_mm;
   28604:	c3 01       	movw	r24, r6
   28606:	b2 01       	movw	r22, r4
   28608:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   2860c:	6b 01       	movw	r12, r22
   2860e:	7c 01       	movw	r14, r24
   28610:	29 a5       	ldd	r18, Y+41	; 0x29
   28612:	3a a5       	ldd	r19, Y+42	; 0x2a
   28614:	4b a5       	ldd	r20, Y+43	; 0x2b
   28616:	5c a5       	ldd	r21, Y+44	; 0x2c
   28618:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   2861c:	e1 96       	adiw	r28, 0x31	; 49
   2861e:	6c af       	std	Y+60, r22	; 0x3c
   28620:	7d af       	std	Y+61, r23	; 0x3d
   28622:	8e af       	std	Y+62, r24	; 0x3e
   28624:	9f af       	std	Y+63, r25	; 0x3f
   28626:	e1 97       	sbiw	r28, 0x31	; 49
   28628:	f8 01       	movw	r30, r16
   2862a:	61 ab       	std	Z+49, r22	; 0x31
   2862c:	72 ab       	std	Z+50, r23	; 0x32
   2862e:	83 ab       	std	Z+51, r24	; 0x33
   28630:	94 ab       	std	Z+52, r25	; 0x34
  block->acceleration_rate = (uint32_t)(accel * (float(1UL << 24) / ((F_CPU) / 8.0f)));
   28632:	2d eb       	ldi	r18, 0xBD	; 189
   28634:	37 e3       	ldi	r19, 0x37	; 55
   28636:	46 e0       	ldi	r20, 0x06	; 6
   28638:	51 e4       	ldi	r21, 0x41	; 65
   2863a:	c7 01       	movw	r24, r14
   2863c:	b6 01       	movw	r22, r12
   2863e:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   28642:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   28646:	d8 01       	movw	r26, r16
   28648:	54 96       	adiw	r26, 0x14	; 20
   2864a:	6d 93       	st	X+, r22
   2864c:	7d 93       	st	X+, r23
   2864e:	8d 93       	st	X+, r24
   28650:	9c 93       	st	X, r25
   28652:	57 97       	sbiw	r26, 0x17	; 23

  // Start with a safe speed.
  // Safe speed is the speed, from which the machine may halt to stop immediately.
  float safe_speed = block->nominal_speed;
   28654:	91 96       	adiw	r26, 0x21	; 33
   28656:	bc 91       	ld	r27, X
   28658:	27 96       	adiw	r28, 0x07	; 7
   2865a:	bf af       	std	Y+63, r27	; 0x3f
   2865c:	27 97       	sbiw	r28, 0x07	; 7
   2865e:	f8 01       	movw	r30, r16
   28660:	f2 a1       	ldd	r31, Z+34	; 0x22
   28662:	2b 96       	adiw	r28, 0x0b	; 11
   28664:	ff af       	std	Y+63, r31	; 0x3f
   28666:	2b 97       	sbiw	r28, 0x0b	; 11
   28668:	d8 01       	movw	r26, r16
   2866a:	93 96       	adiw	r26, 0x23	; 35
   2866c:	bc 91       	ld	r27, X
   2866e:	2f 96       	adiw	r28, 0x0f	; 15
   28670:	bf af       	std	Y+63, r27	; 0x3f
   28672:	2f 97       	sbiw	r28, 0x0f	; 15
   28674:	f8 01       	movw	r30, r16
   28676:	f4 a1       	ldd	r31, Z+36	; 0x24
   28678:	63 96       	adiw	r28, 0x13	; 19
   2867a:	ff af       	std	Y+63, r31	; 0x3f
   2867c:	63 97       	sbiw	r28, 0x13	; 19
   2867e:	2f ea       	ldi	r18, 0xAF	; 175
   28680:	3d e0       	ldi	r19, 0x0D	; 13
   28682:	ed 96       	adiw	r28, 0x3d	; 61
   28684:	3f af       	std	Y+63, r19	; 0x3f
   28686:	2e af       	std	Y+62, r18	; 0x3e
   28688:	ed 97       	sbiw	r28, 0x3d	; 61
   2868a:	6e 96       	adiw	r28, 0x1e	; 30
   2868c:	4e ac       	ldd	r4, Y+62	; 0x3e
   2868e:	5f ac       	ldd	r5, Y+63	; 0x3f
   28690:	6e 97       	sbiw	r28, 0x1e	; 30
   28692:	30 e1       	ldi	r19, 0x10	; 16
   28694:	43 0e       	add	r4, r19
   28696:	51 1c       	adc	r5, r1
   28698:	0f ea       	ldi	r16, 0xAF	; 175
   2869a:	1d e0       	ldi	r17, 0x0D	; 13
   2869c:	6e 96       	adiw	r28, 0x1e	; 30
   2869e:	6e ac       	ldd	r6, Y+62	; 0x3e
   286a0:	7f ac       	ldd	r7, Y+63	; 0x3f
   286a2:	6e 97       	sbiw	r28, 0x1e	; 30
   286a4:	27 96       	adiw	r28, 0x07	; 7
   286a6:	4f ad       	ldd	r20, Y+63	; 0x3f
   286a8:	27 97       	sbiw	r28, 0x07	; 7
   286aa:	49 a7       	std	Y+41, r20	; 0x29
   286ac:	2b 96       	adiw	r28, 0x0b	; 11
   286ae:	5f ad       	ldd	r21, Y+63	; 0x3f
   286b0:	2b 97       	sbiw	r28, 0x0b	; 11
   286b2:	5d a7       	std	Y+45, r21	; 0x2d
   286b4:	b9 af       	std	Y+57, r27	; 0x39
   286b6:	f9 ab       	std	Y+49, r31	; 0x31
  bool  limited = false;
   286b8:	1d aa       	std	Y+53, r1	; 0x35
  for (uint8_t axis = 0; axis < 4; ++ axis) {
      float jerk = fabs(current_speed[axis]);
   286ba:	d3 01       	movw	r26, r6
   286bc:	8d 90       	ld	r8, X+
   286be:	9d 90       	ld	r9, X+
   286c0:	ad 90       	ld	r10, X+
   286c2:	bd 90       	ld	r11, X+
   286c4:	3d 01       	movw	r6, r26
   286c6:	e8 94       	clt
   286c8:	b7 f8       	bld	r11, 7
      if (jerk > cs.max_jerk[axis]) {
   286ca:	f8 01       	movw	r30, r16
   286cc:	c1 90       	ld	r12, Z+
   286ce:	d1 90       	ld	r13, Z+
   286d0:	e1 90       	ld	r14, Z+
   286d2:	f1 90       	ld	r15, Z+
   286d4:	8f 01       	movw	r16, r30
   286d6:	a5 01       	movw	r20, r10
   286d8:	94 01       	movw	r18, r8
   286da:	c7 01       	movw	r24, r14
   286dc:	b6 01       	movw	r22, r12
   286de:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   286e2:	87 ff       	sbrs	r24, 7
   286e4:	3a c0       	rjmp	.+116    	; 0x2875a <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xcf4>
          // The actual jerk is lower, if it has been limited by the XY jerk.
          if (limited) {
   286e6:	fd a9       	ldd	r31, Y+53	; 0x35
   286e8:	ff 23       	and	r31, r31
   286ea:	09 f4       	brne	.+2      	; 0x286ee <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xc88>
   286ec:	7e c6       	rjmp	.+3324   	; 0x293ea <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1984>
              // Spare one division by a following gymnastics:
              // Instead of jerk *= safe_speed / block->nominal_speed,
              // multiply max_jerk[axis] by the divisor.
              jerk *= safe_speed;
   286ee:	29 a5       	ldd	r18, Y+41	; 0x29
   286f0:	3d a5       	ldd	r19, Y+45	; 0x2d
   286f2:	49 ad       	ldd	r20, Y+57	; 0x39
   286f4:	59 a9       	ldd	r21, Y+49	; 0x31
   286f6:	c5 01       	movw	r24, r10
   286f8:	b4 01       	movw	r22, r8
   286fa:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   286fe:	4b 01       	movw	r8, r22
   28700:	5c 01       	movw	r10, r24
              float mjerk = cs.max_jerk[axis] * block->nominal_speed;
   28702:	a7 01       	movw	r20, r14
   28704:	96 01       	movw	r18, r12
   28706:	27 96       	adiw	r28, 0x07	; 7
   28708:	6f ad       	ldd	r22, Y+63	; 0x3f
   2870a:	27 97       	sbiw	r28, 0x07	; 7
   2870c:	2b 96       	adiw	r28, 0x0b	; 11
   2870e:	7f ad       	ldd	r23, Y+63	; 0x3f
   28710:	2b 97       	sbiw	r28, 0x0b	; 11
   28712:	2f 96       	adiw	r28, 0x0f	; 15
   28714:	8f ad       	ldd	r24, Y+63	; 0x3f
   28716:	2f 97       	sbiw	r28, 0x0f	; 15
   28718:	63 96       	adiw	r28, 0x13	; 19
   2871a:	9f ad       	ldd	r25, Y+63	; 0x3f
   2871c:	63 97       	sbiw	r28, 0x13	; 19
   2871e:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   28722:	6b 01       	movw	r12, r22
   28724:	7c 01       	movw	r14, r24
              if (jerk > mjerk) {
   28726:	ac 01       	movw	r20, r24
   28728:	9b 01       	movw	r18, r22
   2872a:	c5 01       	movw	r24, r10
   2872c:	b4 01       	movw	r22, r8
   2872e:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   28732:	18 16       	cp	r1, r24
   28734:	94 f4       	brge	.+36     	; 0x2875a <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xcf4>
                  safe_speed *= mjerk / jerk;
   28736:	a5 01       	movw	r20, r10
   28738:	94 01       	movw	r18, r8
   2873a:	c7 01       	movw	r24, r14
   2873c:	b6 01       	movw	r22, r12
   2873e:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   28742:	9b 01       	movw	r18, r22
   28744:	ac 01       	movw	r20, r24
   28746:	69 a5       	ldd	r22, Y+41	; 0x29
   28748:	7d a5       	ldd	r23, Y+45	; 0x2d
   2874a:	89 ad       	ldd	r24, Y+57	; 0x39
   2874c:	99 a9       	ldd	r25, Y+49	; 0x31
   2874e:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   28752:	69 a7       	std	Y+41, r22	; 0x29
   28754:	7d a7       	std	Y+45, r23	; 0x2d
   28756:	89 af       	std	Y+57, r24	; 0x39
   28758:	99 ab       	std	Y+49, r25	; 0x31

  // Start with a safe speed.
  // Safe speed is the speed, from which the machine may halt to stop immediately.
  float safe_speed = block->nominal_speed;
  bool  limited = false;
  for (uint8_t axis = 0; axis < 4; ++ axis) {
   2875a:	46 14       	cp	r4, r6
   2875c:	57 04       	cpc	r5, r7
   2875e:	09 f0       	breq	.+2      	; 0x28762 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xcfc>
   28760:	ac cf       	rjmp	.-168    	; 0x286ba <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xc54>
          }
      }
  }

  // Reset the block flag.
  block->flag = 0;
   28762:	8e e6       	ldi	r24, 0x6E	; 110
   28764:	82 9d       	mul	r24, r2
   28766:	f0 01       	movw	r30, r0
   28768:	83 9d       	mul	r24, r3
   2876a:	f0 0d       	add	r31, r0
   2876c:	11 24       	eor	r1, r1
   2876e:	e2 5a       	subi	r30, 0xA2	; 162
   28770:	f9 4f       	sbci	r31, 0xF9	; 249
   28772:	15 aa       	std	Z+53, r1	; 0x35

  if (plan_reset_next_e_sched)
   28774:	80 91 20 04 	lds	r24, 0x0420	; 0x800420 <_ZL23plan_reset_next_e_sched.lto_priv.444>
   28778:	88 23       	and	r24, r24
   2877a:	21 f0       	breq	.+8      	; 0x28784 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xd1e>
  {
      // finally propagate a pending reset
      block->flag |= BLOCK_FLAG_E_RESET;
   2877c:	80 e1       	ldi	r24, 0x10	; 16
   2877e:	85 ab       	std	Z+53, r24	; 0x35
      plan_reset_next_e_sched = false;
   28780:	10 92 20 04 	sts	0x0420, r1	; 0x800420 <_ZL23plan_reset_next_e_sched.lto_priv.444>
  float vmax_junction;

  //FIXME Vojtech: Why only if at least two lines are planned in the queue?
  // Is it because we don't want to tinker with the first buffer line, which
  // is likely to be executed by the stepper interrupt routine soon?
  if (moves_queued > 1 && previous_nominal_speed > 0.0001f) {
   28784:	3d ad       	ldd	r19, Y+61	; 0x3d
   28786:	32 30       	cpi	r19, 0x02	; 2
   28788:	08 f4       	brcc	.+2      	; 0x2878c <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xd26>
   2878a:	8f c6       	rjmp	.+3358   	; 0x294aa <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1a44>
   2878c:	40 91 22 04 	lds	r20, 0x0422	; 0x800422 <_ZL22previous_nominal_speed.lto_priv.445>
   28790:	6b 96       	adiw	r28, 0x1b	; 27
   28792:	4f af       	std	Y+63, r20	; 0x3f
   28794:	6b 97       	sbiw	r28, 0x1b	; 27
   28796:	50 91 23 04 	lds	r21, 0x0423	; 0x800423 <_ZL22previous_nominal_speed.lto_priv.445+0x1>
   2879a:	6f 96       	adiw	r28, 0x1f	; 31
   2879c:	5f af       	std	Y+63, r21	; 0x3f
   2879e:	6f 97       	sbiw	r28, 0x1f	; 31
   287a0:	00 91 24 04 	lds	r16, 0x0424	; 0x800424 <_ZL22previous_nominal_speed.lto_priv.445+0x2>
   287a4:	10 91 25 04 	lds	r17, 0x0425	; 0x800425 <_ZL22previous_nominal_speed.lto_priv.445+0x3>
   287a8:	27 e1       	ldi	r18, 0x17	; 23
   287aa:	37 eb       	ldi	r19, 0xB7	; 183
   287ac:	41 ed       	ldi	r20, 0xD1	; 209
   287ae:	58 e3       	ldi	r21, 0x38	; 56
   287b0:	6b 96       	adiw	r28, 0x1b	; 27
   287b2:	6f ad       	ldd	r22, Y+63	; 0x3f
   287b4:	6b 97       	sbiw	r28, 0x1b	; 27
   287b6:	6f 96       	adiw	r28, 0x1f	; 31
   287b8:	7f ad       	ldd	r23, Y+63	; 0x3f
   287ba:	6f 97       	sbiw	r28, 0x1f	; 31
   287bc:	c8 01       	movw	r24, r16
   287be:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   287c2:	18 16       	cp	r1, r24
   287c4:	0c f0       	brlt	.+2      	; 0x287c8 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xd62>
   287c6:	71 c6       	rjmp	.+3298   	; 0x294aa <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1a44>
      // If this maximum velocity allowed is lower than the minimum of the entry / exit safe velocities,
      // then the machine is not coasting anymore and the safe entry / exit velocities shall be used.

      // The junction velocity will be shared between successive segments. Limit the junction velocity to their minimum.
      bool prev_speed_larger = previous_nominal_speed > block->nominal_speed;
      float smaller_speed_factor = prev_speed_larger ? (block->nominal_speed / previous_nominal_speed) : (previous_nominal_speed / block->nominal_speed);
   287c8:	6b 96       	adiw	r28, 0x1b	; 27
   287ca:	2f ad       	ldd	r18, Y+63	; 0x3f
   287cc:	6b 97       	sbiw	r28, 0x1b	; 27
   287ce:	6f 96       	adiw	r28, 0x1f	; 31
   287d0:	3f ad       	ldd	r19, Y+63	; 0x3f
   287d2:	6f 97       	sbiw	r28, 0x1f	; 31
   287d4:	a8 01       	movw	r20, r16
   287d6:	27 96       	adiw	r28, 0x07	; 7
   287d8:	6f ad       	ldd	r22, Y+63	; 0x3f
   287da:	27 97       	sbiw	r28, 0x07	; 7
   287dc:	2b 96       	adiw	r28, 0x0b	; 11
   287de:	7f ad       	ldd	r23, Y+63	; 0x3f
   287e0:	2b 97       	sbiw	r28, 0x0b	; 11
   287e2:	2f 96       	adiw	r28, 0x0f	; 15
   287e4:	8f ad       	ldd	r24, Y+63	; 0x3f
   287e6:	2f 97       	sbiw	r28, 0x0f	; 15
   287e8:	63 96       	adiw	r28, 0x13	; 19
   287ea:	9f ad       	ldd	r25, Y+63	; 0x3f
   287ec:	63 97       	sbiw	r28, 0x13	; 19
   287ee:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   287f2:	87 ff       	sbrs	r24, 7
   287f4:	01 c6       	rjmp	.+3074   	; 0x293f8 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1992>
   287f6:	6b 96       	adiw	r28, 0x1b	; 27
   287f8:	2f ad       	ldd	r18, Y+63	; 0x3f
   287fa:	6b 97       	sbiw	r28, 0x1b	; 27
   287fc:	6f 96       	adiw	r28, 0x1f	; 31
   287fe:	3f ad       	ldd	r19, Y+63	; 0x3f
   28800:	6f 97       	sbiw	r28, 0x1f	; 31
   28802:	a8 01       	movw	r20, r16
   28804:	27 96       	adiw	r28, 0x07	; 7
   28806:	6f ad       	ldd	r22, Y+63	; 0x3f
   28808:	27 97       	sbiw	r28, 0x07	; 7
   2880a:	2b 96       	adiw	r28, 0x0b	; 11
   2880c:	7f ad       	ldd	r23, Y+63	; 0x3f
   2880e:	2b 97       	sbiw	r28, 0x0b	; 11
   28810:	2f 96       	adiw	r28, 0x0f	; 15
   28812:	8f ad       	ldd	r24, Y+63	; 0x3f
   28814:	2f 97       	sbiw	r28, 0x0f	; 15
   28816:	63 96       	adiw	r28, 0x13	; 19
   28818:	9f ad       	ldd	r25, Y+63	; 0x3f
   2881a:	63 97       	sbiw	r28, 0x13	; 19
   2881c:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   28820:	eb 96       	adiw	r28, 0x3b	; 59
   28822:	6c af       	std	Y+60, r22	; 0x3c
   28824:	7d af       	std	Y+61, r23	; 0x3d
   28826:	8e af       	std	Y+62, r24	; 0x3e
   28828:	9f af       	std	Y+63, r25	; 0x3f
   2882a:	eb 97       	sbiw	r28, 0x3b	; 59
      // Pick the smaller of the nominal speeds. Higher speed shall not be achieved at the junction during coasting.
      vmax_junction = prev_speed_larger ? block->nominal_speed : previous_nominal_speed;
   2882c:	27 96       	adiw	r28, 0x07	; 7
   2882e:	8f ad       	ldd	r24, Y+63	; 0x3f
   28830:	27 97       	sbiw	r28, 0x07	; 7
   28832:	8d af       	std	Y+61, r24	; 0x3d
   28834:	2b 96       	adiw	r28, 0x0b	; 11
   28836:	9f ad       	ldd	r25, Y+63	; 0x3f
   28838:	2b 97       	sbiw	r28, 0x0b	; 11
   2883a:	9d ab       	std	Y+53, r25	; 0x35
   2883c:	2f 96       	adiw	r28, 0x0f	; 15
   2883e:	af ad       	ldd	r26, Y+63	; 0x3f
   28840:	2f 97       	sbiw	r28, 0x0f	; 15
   28842:	ae af       	std	Y+62, r26	; 0x3e
   28844:	63 96       	adiw	r28, 0x13	; 19
   28846:	bf ad       	ldd	r27, Y+63	; 0x3f
   28848:	63 97       	sbiw	r28, 0x13	; 19
   2884a:	23 96       	adiw	r28, 0x03	; 3
   2884c:	bf af       	std	Y+63, r27	; 0x3f
   2884e:	23 97       	sbiw	r28, 0x03	; 3
   28850:	26 e2       	ldi	r18, 0x26	; 38
   28852:	34 e0       	ldi	r19, 0x04	; 4
   28854:	e7 96       	adiw	r28, 0x37	; 55
   28856:	3f af       	std	Y+63, r19	; 0x3f
   28858:	2e af       	std	Y+62, r18	; 0x3e
   2885a:	e7 97       	sbiw	r28, 0x37	; 55
      // Factor to multiply the previous / current nominal velocities to get componentwise limited velocities.
      float v_factor = 1.f;
   2885c:	41 2c       	mov	r4, r1
   2885e:	51 2c       	mov	r5, r1
   28860:	30 e8       	ldi	r19, 0x80	; 128
   28862:	63 2e       	mov	r6, r19
   28864:	3f e3       	ldi	r19, 0x3F	; 63
   28866:	73 2e       	mov	r7, r19
      limited = false;
      // Now limit the jerk in all axes.
      for (uint8_t axis = 0; axis < 4; ++ axis) {
          // Limit an axis. We have to differentiate coasting from the reversal of an axis movement, or a full stop.
          float v_exit  = previous_speed[axis];
   28868:	e7 96       	adiw	r28, 0x37	; 55
   2886a:	ae ad       	ldd	r26, Y+62	; 0x3e
   2886c:	bf ad       	ldd	r27, Y+63	; 0x3f
   2886e:	e7 97       	sbiw	r28, 0x37	; 55
   28870:	8d 90       	ld	r8, X+
   28872:	9d 90       	ld	r9, X+
   28874:	ad 90       	ld	r10, X+
   28876:	bd 90       	ld	r11, X+
   28878:	e7 96       	adiw	r28, 0x37	; 55
   2887a:	bf af       	std	Y+63, r27	; 0x3f
   2887c:	ae af       	std	Y+62, r26	; 0x3e
   2887e:	e7 97       	sbiw	r28, 0x37	; 55
          float v_entry = current_speed [axis];
   28880:	6e 96       	adiw	r28, 0x1e	; 30
   28882:	ee ad       	ldd	r30, Y+62	; 0x3e
   28884:	ff ad       	ldd	r31, Y+63	; 0x3f
   28886:	6e 97       	sbiw	r28, 0x1e	; 30
   28888:	c1 90       	ld	r12, Z+
   2888a:	d1 90       	ld	r13, Z+
   2888c:	e1 90       	ld	r14, Z+
   2888e:	f1 90       	ld	r15, Z+
   28890:	6e 96       	adiw	r28, 0x1e	; 30
   28892:	ff af       	std	Y+63, r31	; 0x3f
   28894:	ee af       	std	Y+62, r30	; 0x3e
   28896:	6e 97       	sbiw	r28, 0x1e	; 30
          if (prev_speed_larger)
   28898:	6b 96       	adiw	r28, 0x1b	; 27
   2889a:	2f ad       	ldd	r18, Y+63	; 0x3f
   2889c:	6b 97       	sbiw	r28, 0x1b	; 27
   2889e:	6f 96       	adiw	r28, 0x1f	; 31
   288a0:	3f ad       	ldd	r19, Y+63	; 0x3f
   288a2:	6f 97       	sbiw	r28, 0x1f	; 31
   288a4:	a8 01       	movw	r20, r16
   288a6:	27 96       	adiw	r28, 0x07	; 7
   288a8:	6f ad       	ldd	r22, Y+63	; 0x3f
   288aa:	27 97       	sbiw	r28, 0x07	; 7
   288ac:	2b 96       	adiw	r28, 0x0b	; 11
   288ae:	7f ad       	ldd	r23, Y+63	; 0x3f
   288b0:	2b 97       	sbiw	r28, 0x0b	; 11
   288b2:	2f 96       	adiw	r28, 0x0f	; 15
   288b4:	8f ad       	ldd	r24, Y+63	; 0x3f
   288b6:	2f 97       	sbiw	r28, 0x0f	; 15
   288b8:	63 96       	adiw	r28, 0x13	; 19
   288ba:	9f ad       	ldd	r25, Y+63	; 0x3f
   288bc:	63 97       	sbiw	r28, 0x13	; 19
   288be:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   288c2:	87 ff       	sbrs	r24, 7
   288c4:	0c c0       	rjmp	.+24     	; 0x288de <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xe78>
              v_exit *= smaller_speed_factor;
   288c6:	eb 96       	adiw	r28, 0x3b	; 59
   288c8:	2c ad       	ldd	r18, Y+60	; 0x3c
   288ca:	3d ad       	ldd	r19, Y+61	; 0x3d
   288cc:	4e ad       	ldd	r20, Y+62	; 0x3e
   288ce:	5f ad       	ldd	r21, Y+63	; 0x3f
   288d0:	eb 97       	sbiw	r28, 0x3b	; 59
   288d2:	c5 01       	movw	r24, r10
   288d4:	b4 01       	movw	r22, r8
   288d6:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   288da:	4b 01       	movw	r8, r22
   288dc:	5c 01       	movw	r10, r24
          if (limited) {
   288de:	a1 96       	adiw	r28, 0x21	; 33
   288e0:	ff ad       	ldd	r31, Y+63	; 0x3f
   288e2:	a1 97       	sbiw	r28, 0x21	; 33
   288e4:	ff 23       	and	r31, r31
   288e6:	81 f0       	breq	.+32     	; 0x28908 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xea2>
              v_exit  *= v_factor;
   288e8:	a3 01       	movw	r20, r6
   288ea:	92 01       	movw	r18, r4
   288ec:	c5 01       	movw	r24, r10
   288ee:	b4 01       	movw	r22, r8
   288f0:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   288f4:	4b 01       	movw	r8, r22
   288f6:	5c 01       	movw	r10, r24
              v_entry *= v_factor;
   288f8:	a3 01       	movw	r20, r6
   288fa:	92 01       	movw	r18, r4
   288fc:	c7 01       	movw	r24, r14
   288fe:	b6 01       	movw	r22, r12
   28900:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   28904:	6b 01       	movw	r12, r22
   28906:	7c 01       	movw	r14, r24
          }
          // Calculate the jerk depending on whether the axis is coasting in the same direction or reversing a direction.
          float jerk =
              (v_exit > v_entry) ?
   28908:	a7 01       	movw	r20, r14
   2890a:	96 01       	movw	r18, r12
   2890c:	c5 01       	movw	r24, r10
   2890e:	b4 01       	movw	r22, r8
   28910:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
                  ((v_entry > 0.f || v_exit < 0.f) ?
   28914:	20 e0       	ldi	r18, 0x00	; 0
   28916:	30 e0       	ldi	r19, 0x00	; 0
   28918:	a9 01       	movw	r20, r18
              v_exit  *= v_factor;
              v_entry *= v_factor;
          }
          // Calculate the jerk depending on whether the axis is coasting in the same direction or reversing a direction.
          float jerk =
              (v_exit > v_entry) ?
   2891a:	18 16       	cp	r1, r24
   2891c:	0c f0       	brlt	.+2      	; 0x28920 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xeba>
   2891e:	a3 c5       	rjmp	.+2886   	; 0x29466 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1a00>
                  ((v_entry > 0.f || v_exit < 0.f) ?
   28920:	c7 01       	movw	r24, r14
   28922:	b6 01       	movw	r22, r12
   28924:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   28928:	18 16       	cp	r1, r24
   2892a:	4c f0       	brlt	.+18     	; 0x2893e <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xed8>
   2892c:	20 e0       	ldi	r18, 0x00	; 0
   2892e:	30 e0       	ldi	r19, 0x00	; 0
   28930:	a9 01       	movw	r20, r18
   28932:	c5 01       	movw	r24, r10
   28934:	b4 01       	movw	r22, r8
   28936:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   2893a:	87 ff       	sbrs	r24, 7
   2893c:	85 c5       	rjmp	.+2826   	; 0x29448 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x19e2>
   2893e:	a7 01       	movw	r20, r14
   28940:	96 01       	movw	r18, r12
   28942:	c5 01       	movw	r24, r10
   28944:	b4 01       	movw	r22, r8
                      // coasting
                      (v_exit - v_entry) :
                      // axis reversal
                      max(v_exit, - v_entry)) :
                  // v_exit <= v_entry
                  ((v_entry < 0.f || v_exit > 0.f) ?
   28946:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   2894a:	6b 01       	movw	r12, r22
   2894c:	7c 01       	movw	r14, r24
                      // coasting
                      (v_entry - v_exit) :
                      // axis reversal
                      max(- v_exit, v_entry));
          if (jerk > cs.max_jerk[axis]) {
   2894e:	ed 96       	adiw	r28, 0x3d	; 61
   28950:	ae ad       	ldd	r26, Y+62	; 0x3e
   28952:	bf ad       	ldd	r27, Y+63	; 0x3f
   28954:	ed 97       	sbiw	r28, 0x3d	; 61
   28956:	8d 90       	ld	r8, X+
   28958:	9d 90       	ld	r9, X+
   2895a:	ad 90       	ld	r10, X+
   2895c:	bd 90       	ld	r11, X+
   2895e:	ed 96       	adiw	r28, 0x3d	; 61
   28960:	bf af       	std	Y+63, r27	; 0x3f
   28962:	ae af       	std	Y+62, r26	; 0x3e
   28964:	ed 97       	sbiw	r28, 0x3d	; 61
   28966:	a5 01       	movw	r20, r10
   28968:	94 01       	movw	r18, r8
   2896a:	c7 01       	movw	r24, r14
   2896c:	b6 01       	movw	r22, r12
   2896e:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   28972:	18 16       	cp	r1, r24
   28974:	94 f4       	brge	.+36     	; 0x2899a <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xf34>
              v_factor *= cs.max_jerk[axis] / jerk;
   28976:	a7 01       	movw	r20, r14
   28978:	96 01       	movw	r18, r12
   2897a:	c5 01       	movw	r24, r10
   2897c:	b4 01       	movw	r22, r8
   2897e:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   28982:	9b 01       	movw	r18, r22
   28984:	ac 01       	movw	r20, r24
   28986:	c3 01       	movw	r24, r6
   28988:	b2 01       	movw	r22, r4
   2898a:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2898e:	2b 01       	movw	r4, r22
   28990:	3c 01       	movw	r6, r24
              limited = true;
   28992:	b1 e0       	ldi	r27, 0x01	; 1
   28994:	a1 96       	adiw	r28, 0x21	; 33
   28996:	bf af       	std	Y+63, r27	; 0x3f
   28998:	a1 97       	sbiw	r28, 0x21	; 33
      vmax_junction = prev_speed_larger ? block->nominal_speed : previous_nominal_speed;
      // Factor to multiply the previous / current nominal velocities to get componentwise limited velocities.
      float v_factor = 1.f;
      limited = false;
      // Now limit the jerk in all axes.
      for (uint8_t axis = 0; axis < 4; ++ axis) {
   2899a:	e6 e3       	ldi	r30, 0x36	; 54
   2899c:	f4 e0       	ldi	r31, 0x04	; 4
   2899e:	e7 96       	adiw	r28, 0x37	; 55
   289a0:	2e ad       	ldd	r18, Y+62	; 0x3e
   289a2:	3f ad       	ldd	r19, Y+63	; 0x3f
   289a4:	e7 97       	sbiw	r28, 0x37	; 55
   289a6:	e2 17       	cp	r30, r18
   289a8:	f3 07       	cpc	r31, r19
   289aa:	09 f0       	breq	.+2      	; 0x289ae <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xf48>
   289ac:	5d cf       	rjmp	.-326    	; 0x28868 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xe02>
          if (jerk > cs.max_jerk[axis]) {
              v_factor *= cs.max_jerk[axis] / jerk;
              limited = true;
          }
      }
      if (limited)
   289ae:	a1 96       	adiw	r28, 0x21	; 33
   289b0:	3f ad       	ldd	r19, Y+63	; 0x3f
   289b2:	a1 97       	sbiw	r28, 0x21	; 33
   289b4:	33 23       	and	r19, r19
   289b6:	81 f0       	breq	.+32     	; 0x289d8 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xf72>
          vmax_junction *= v_factor;
   289b8:	a3 01       	movw	r20, r6
   289ba:	92 01       	movw	r18, r4
   289bc:	6d ad       	ldd	r22, Y+61	; 0x3d
   289be:	7d a9       	ldd	r23, Y+53	; 0x35
   289c0:	8e ad       	ldd	r24, Y+62	; 0x3e
   289c2:	23 96       	adiw	r28, 0x03	; 3
   289c4:	9f ad       	ldd	r25, Y+63	; 0x3f
   289c6:	23 97       	sbiw	r28, 0x03	; 3
   289c8:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   289cc:	6d af       	std	Y+61, r22	; 0x3d
   289ce:	7d ab       	std	Y+53, r23	; 0x35
   289d0:	8e af       	std	Y+62, r24	; 0x3e
   289d2:	23 96       	adiw	r28, 0x03	; 3
   289d4:	9f af       	std	Y+63, r25	; 0x3f
   289d6:	23 97       	sbiw	r28, 0x03	; 3
      // Now the transition velocity is known, which maximizes the shared exit / entry velocity while
      // respecting the jerk factors, it may be possible, that applying separate safe exit / entry velocities will achieve faster prints.
      float vmax_junction_threshold = vmax_junction * 0.99f;
   289d8:	24 ea       	ldi	r18, 0xA4	; 164
   289da:	30 e7       	ldi	r19, 0x70	; 112
   289dc:	4d e7       	ldi	r20, 0x7D	; 125
   289de:	5f e3       	ldi	r21, 0x3F	; 63
   289e0:	6d ad       	ldd	r22, Y+61	; 0x3d
   289e2:	7d a9       	ldd	r23, Y+53	; 0x35
   289e4:	8e ad       	ldd	r24, Y+62	; 0x3e
   289e6:	23 96       	adiw	r28, 0x03	; 3
   289e8:	9f ad       	ldd	r25, Y+63	; 0x3f
   289ea:	23 97       	sbiw	r28, 0x03	; 3
   289ec:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   289f0:	6b 01       	movw	r12, r22
   289f2:	7c 01       	movw	r14, r24
      if (previous_safe_speed > vmax_junction_threshold && safe_speed > vmax_junction_threshold) {
   289f4:	ac 01       	movw	r20, r24
   289f6:	9b 01       	movw	r18, r22
   289f8:	60 91 a3 04 	lds	r22, 0x04A3	; 0x8004a3 <previous_safe_speed>
   289fc:	70 91 a4 04 	lds	r23, 0x04A4	; 0x8004a4 <previous_safe_speed+0x1>
   28a00:	80 91 a5 04 	lds	r24, 0x04A5	; 0x8004a5 <previous_safe_speed+0x2>
   28a04:	90 91 a6 04 	lds	r25, 0x04A6	; 0x8004a6 <previous_safe_speed+0x3>
   28a08:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   28a0c:	18 16       	cp	r1, r24
   28a0e:	fc f4       	brge	.+62     	; 0x28a4e <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xfe8>
   28a10:	29 a5       	ldd	r18, Y+41	; 0x29
   28a12:	3d a5       	ldd	r19, Y+45	; 0x2d
   28a14:	49 ad       	ldd	r20, Y+57	; 0x39
   28a16:	59 a9       	ldd	r21, Y+49	; 0x31
   28a18:	c7 01       	movw	r24, r14
   28a1a:	b6 01       	movw	r22, r12
   28a1c:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   28a20:	87 ff       	sbrs	r24, 7
   28a22:	15 c0       	rjmp	.+42     	; 0x28a4e <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xfe8>
          // Not coasting. The machine will stop and start the movements anyway,
          // better to start the segment from start.
          block->flag |= BLOCK_FLAG_START_FROM_FULL_HALT;
   28a24:	8e e6       	ldi	r24, 0x6E	; 110
   28a26:	82 9d       	mul	r24, r2
   28a28:	f0 01       	movw	r30, r0
   28a2a:	83 9d       	mul	r24, r3
   28a2c:	f0 0d       	add	r31, r0
   28a2e:	11 24       	eor	r1, r1
   28a30:	e2 5a       	subi	r30, 0xA2	; 162
   28a32:	f9 4f       	sbci	r31, 0xF9	; 249
   28a34:	85 a9       	ldd	r24, Z+53	; 0x35
   28a36:	84 60       	ori	r24, 0x04	; 4
   28a38:	85 ab       	std	Z+53, r24	; 0x35
   28a3a:	49 a5       	ldd	r20, Y+41	; 0x29
   28a3c:	4d af       	std	Y+61, r20	; 0x3d
   28a3e:	5d a5       	ldd	r21, Y+45	; 0x2d
   28a40:	5d ab       	std	Y+53, r21	; 0x35
   28a42:	89 ad       	ldd	r24, Y+57	; 0x39
   28a44:	8e af       	std	Y+62, r24	; 0x3e
   28a46:	99 a9       	ldd	r25, Y+49	; 0x31
   28a48:	23 96       	adiw	r28, 0x03	; 3
   28a4a:	9f af       	std	Y+63, r25	; 0x3f
   28a4c:	23 97       	sbiw	r28, 0x03	; 3
      block->flag |= BLOCK_FLAG_START_FROM_FULL_HALT;
      vmax_junction = safe_speed;
  }

  // Max entry speed of this block equals the max exit speed of the previous block.
  block->max_entry_speed = vmax_junction;
   28a4e:	8e e6       	ldi	r24, 0x6E	; 110
   28a50:	82 9d       	mul	r24, r2
   28a52:	80 01       	movw	r16, r0
   28a54:	83 9d       	mul	r24, r3
   28a56:	10 0d       	add	r17, r0
   28a58:	11 24       	eor	r1, r1
   28a5a:	02 5a       	subi	r16, 0xA2	; 162
   28a5c:	19 4f       	sbci	r17, 0xF9	; 249
   28a5e:	8d ad       	ldd	r24, Y+61	; 0x3d
   28a60:	9d a9       	ldd	r25, Y+53	; 0x35
   28a62:	ae ad       	ldd	r26, Y+62	; 0x3e
   28a64:	23 96       	adiw	r28, 0x03	; 3
   28a66:	bf ad       	ldd	r27, Y+63	; 0x3f
   28a68:	23 97       	sbiw	r28, 0x03	; 3
   28a6a:	f8 01       	movw	r30, r16
   28a6c:	81 a7       	std	Z+41, r24	; 0x29
   28a6e:	92 a7       	std	Z+42, r25	; 0x2a
   28a70:	a3 a7       	std	Z+43, r26	; 0x2b
   28a72:	b4 a7       	std	Z+44, r27	; 0x2c
// Calculates the maximum allowable entry speed, when you must be able to reach target_velocity using the
// decceleration within the allotted distance.
FORCE_INLINE float max_allowable_entry_speed(float decceleration, float target_velocity, float distance)
{
    // assert(decceleration < 0);
    return  sqrt(target_velocity*target_velocity-2*decceleration*distance);
   28a74:	29 a5       	ldd	r18, Y+41	; 0x29
   28a76:	3d a5       	ldd	r19, Y+45	; 0x2d
   28a78:	49 ad       	ldd	r20, Y+57	; 0x39
   28a7a:	59 a9       	ldd	r21, Y+49	; 0x31
   28a7c:	69 a5       	ldd	r22, Y+41	; 0x29
   28a7e:	7d a5       	ldd	r23, Y+45	; 0x2d
   28a80:	89 ad       	ldd	r24, Y+57	; 0x39
   28a82:	99 a9       	ldd	r25, Y+49	; 0x31
   28a84:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   28a88:	6b 01       	movw	r12, r22
   28a8a:	7c 01       	movw	r14, r24

  // Max entry speed of this block equals the max exit speed of the previous block.
  block->max_entry_speed = vmax_junction;

  // Initialize block entry speed. Compute based on deceleration to safe_speed.
  double v_allowable = max_allowable_entry_speed(-block->acceleration,safe_speed,block->millimeters);
   28a8c:	e1 96       	adiw	r28, 0x31	; 49
   28a8e:	6c ad       	ldd	r22, Y+60	; 0x3c
   28a90:	7d ad       	ldd	r23, Y+61	; 0x3d
   28a92:	8e ad       	ldd	r24, Y+62	; 0x3e
   28a94:	9f ad       	ldd	r25, Y+63	; 0x3f
   28a96:	e1 97       	sbiw	r28, 0x31	; 49
   28a98:	90 58       	subi	r25, 0x80	; 128
// Calculates the maximum allowable entry speed, when you must be able to reach target_velocity using the
// decceleration within the allotted distance.
FORCE_INLINE float max_allowable_entry_speed(float decceleration, float target_velocity, float distance)
{
    // assert(decceleration < 0);
    return  sqrt(target_velocity*target_velocity-2*decceleration*distance);
   28a9a:	9b 01       	movw	r18, r22
   28a9c:	ac 01       	movw	r20, r24
   28a9e:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   28aa2:	d8 01       	movw	r26, r16
   28aa4:	9d 96       	adiw	r26, 0x2d	; 45
   28aa6:	2d 91       	ld	r18, X+
   28aa8:	3d 91       	ld	r19, X+
   28aaa:	4d 91       	ld	r20, X+
   28aac:	5c 91       	ld	r21, X
   28aae:	d0 97       	sbiw	r26, 0x30	; 48
   28ab0:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   28ab4:	9b 01       	movw	r18, r22
   28ab6:	ac 01       	movw	r20, r24
   28ab8:	c7 01       	movw	r24, r14
   28aba:	b6 01       	movw	r22, r12
   28abc:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   28ac0:	0f 94 d6 a8 	call	0x351ac	; 0x351ac <sqrt>
   28ac4:	d6 2e       	mov	r13, r22
   28ac6:	e7 2e       	mov	r14, r23
   28ac8:	8c 01       	movw	r16, r24
  // Max entry speed of this block equals the max exit speed of the previous block.
  block->max_entry_speed = vmax_junction;

  // Initialize block entry speed. Compute based on deceleration to safe_speed.
  double v_allowable = max_allowable_entry_speed(-block->acceleration,safe_speed,block->millimeters);
  block->entry_speed = min(vmax_junction, v_allowable);
   28aca:	2d ad       	ldd	r18, Y+61	; 0x3d
   28acc:	3d a9       	ldd	r19, Y+53	; 0x35
   28ace:	4e ad       	ldd	r20, Y+62	; 0x3e
   28ad0:	23 96       	adiw	r28, 0x03	; 3
   28ad2:	5f ad       	ldd	r21, Y+63	; 0x3f
   28ad4:	23 97       	sbiw	r28, 0x03	; 3
   28ad6:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   28ada:	18 16       	cp	r1, r24
   28adc:	34 f0       	brlt	.+12     	; 0x28aea <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1084>
   28ade:	dd ae       	std	Y+61, r13	; 0x3d
   28ae0:	ed aa       	std	Y+53, r14	; 0x35
   28ae2:	0e af       	std	Y+62, r16	; 0x3e
   28ae4:	23 96       	adiw	r28, 0x03	; 3
   28ae6:	1f af       	std	Y+63, r17	; 0x3f
   28ae8:	23 97       	sbiw	r28, 0x03	; 3
   28aea:	8e e6       	ldi	r24, 0x6E	; 110
   28aec:	82 9d       	mul	r24, r2
   28aee:	f0 01       	movw	r30, r0
   28af0:	83 9d       	mul	r24, r3
   28af2:	f0 0d       	add	r31, r0
   28af4:	11 24       	eor	r1, r1
   28af6:	e2 5a       	subi	r30, 0xA2	; 162
   28af8:	f9 4f       	sbci	r31, 0xF9	; 249
   28afa:	8d ad       	ldd	r24, Y+61	; 0x3d
   28afc:	9d a9       	ldd	r25, Y+53	; 0x35
   28afe:	ae ad       	ldd	r26, Y+62	; 0x3e
   28b00:	23 96       	adiw	r28, 0x03	; 3
   28b02:	bf ad       	ldd	r27, Y+63	; 0x3f
   28b04:	23 97       	sbiw	r28, 0x03	; 3
   28b06:	85 a3       	std	Z+37, r24	; 0x25
   28b08:	96 a3       	std	Z+38, r25	; 0x26
   28b0a:	a7 a3       	std	Z+39, r26	; 0x27
   28b0c:	b0 a7       	std	Z+40, r27	; 0x28
  // junction speeds in deceleration and acceleration, respectively. This is due to how the current
  // block nominal speed limits both the current and next maximum junction speeds. Hence, in both
  // the reverse and forward planners, the corresponding block junction speed will always be at the
  // the maximum junction speed and may always be ignored for any speed reduction checks.
  // Always calculate trapezoid for new block
  block->flag |= (block->nominal_speed <= v_allowable) ? (BLOCK_FLAG_NOMINAL_LENGTH | BLOCK_FLAG_RECALCULATE) : BLOCK_FLAG_RECALCULATE;
   28b0e:	f5 a8       	ldd	r15, Z+53	; 0x35
   28b10:	2d 2d       	mov	r18, r13
   28b12:	3e 2d       	mov	r19, r14
   28b14:	a8 01       	movw	r20, r16
   28b16:	27 96       	adiw	r28, 0x07	; 7
   28b18:	6f ad       	ldd	r22, Y+63	; 0x3f
   28b1a:	27 97       	sbiw	r28, 0x07	; 7
   28b1c:	2b 96       	adiw	r28, 0x0b	; 11
   28b1e:	7f ad       	ldd	r23, Y+63	; 0x3f
   28b20:	2b 97       	sbiw	r28, 0x0b	; 11
   28b22:	2f 96       	adiw	r28, 0x0f	; 15
   28b24:	8f ad       	ldd	r24, Y+63	; 0x3f
   28b26:	2f 97       	sbiw	r28, 0x0f	; 15
   28b28:	63 96       	adiw	r28, 0x13	; 19
   28b2a:	9f ad       	ldd	r25, Y+63	; 0x3f
   28b2c:	63 97       	sbiw	r28, 0x13	; 19
   28b2e:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   28b32:	18 16       	cp	r1, r24
   28b34:	0c f4       	brge	.+2      	; 0x28b38 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x10d2>
   28b36:	cf c4       	rjmp	.+2462   	; 0x294d6 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1a70>
   28b38:	83 e0       	ldi	r24, 0x03	; 3
   28b3a:	9e e6       	ldi	r25, 0x6E	; 110
   28b3c:	92 9d       	mul	r25, r2
   28b3e:	80 01       	movw	r16, r0
   28b40:	93 9d       	mul	r25, r3
   28b42:	10 0d       	add	r17, r0
   28b44:	11 24       	eor	r1, r1
   28b46:	02 5a       	subi	r16, 0xA2	; 162
   28b48:	19 4f       	sbci	r17, 0xF9	; 249
   28b4a:	f8 2a       	or	r15, r24
   28b4c:	f8 01       	movw	r30, r16
   28b4e:	f5 aa       	std	Z+53, r15	; 0x35

  // Update previous path unit_vector and nominal speed
  memcpy(previous_speed, current_speed, sizeof(previous_speed)); // previous_speed[] = current_speed[]
   28b50:	80 e1       	ldi	r24, 0x10	; 16
   28b52:	fe 01       	movw	r30, r28
   28b54:	71 96       	adiw	r30, 0x11	; 17
   28b56:	a6 e2       	ldi	r26, 0x26	; 38
   28b58:	b4 e0       	ldi	r27, 0x04	; 4
   28b5a:	01 90       	ld	r0, Z+
   28b5c:	0d 92       	st	X+, r0
   28b5e:	8a 95       	dec	r24
   28b60:	e1 f7       	brne	.-8      	; 0x28b5a <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x10f4>
  previous_nominal_speed = block->nominal_speed;
   28b62:	27 96       	adiw	r28, 0x07	; 7
   28b64:	8f ad       	ldd	r24, Y+63	; 0x3f
   28b66:	27 97       	sbiw	r28, 0x07	; 7
   28b68:	2b 96       	adiw	r28, 0x0b	; 11
   28b6a:	9f ad       	ldd	r25, Y+63	; 0x3f
   28b6c:	2b 97       	sbiw	r28, 0x0b	; 11
   28b6e:	2f 96       	adiw	r28, 0x0f	; 15
   28b70:	af ad       	ldd	r26, Y+63	; 0x3f
   28b72:	2f 97       	sbiw	r28, 0x0f	; 15
   28b74:	63 96       	adiw	r28, 0x13	; 19
   28b76:	bf ad       	ldd	r27, Y+63	; 0x3f
   28b78:	63 97       	sbiw	r28, 0x13	; 19
   28b7a:	80 93 22 04 	sts	0x0422, r24	; 0x800422 <_ZL22previous_nominal_speed.lto_priv.445>
   28b7e:	90 93 23 04 	sts	0x0423, r25	; 0x800423 <_ZL22previous_nominal_speed.lto_priv.445+0x1>
   28b82:	a0 93 24 04 	sts	0x0424, r26	; 0x800424 <_ZL22previous_nominal_speed.lto_priv.445+0x2>
   28b86:	b0 93 25 04 	sts	0x0425, r27	; 0x800425 <_ZL22previous_nominal_speed.lto_priv.445+0x3>
  previous_safe_speed = safe_speed;
   28b8a:	89 a5       	ldd	r24, Y+41	; 0x29
   28b8c:	9d a5       	ldd	r25, Y+45	; 0x2d
   28b8e:	a9 ad       	ldd	r26, Y+57	; 0x39
   28b90:	b9 a9       	ldd	r27, Y+49	; 0x31
   28b92:	80 93 a3 04 	sts	0x04A3, r24	; 0x8004a3 <previous_safe_speed>
   28b96:	90 93 a4 04 	sts	0x04A4, r25	; 0x8004a4 <previous_safe_speed+0x1>
   28b9a:	a0 93 a5 04 	sts	0x04A5, r26	; 0x8004a5 <previous_safe_speed+0x2>
   28b9e:	b0 93 a6 04 	sts	0x04A6, r27	; 0x8004a6 <previous_safe_speed+0x3>

  // Precalculate the division, so when all the trapezoids in the planner queue get recalculated, the division is not repeated.
  block->speed_factor = block->nominal_rate / block->nominal_speed;
   28ba2:	d8 01       	movw	r26, r16
   28ba4:	d6 96       	adiw	r26, 0x36	; 54
   28ba6:	6d 91       	ld	r22, X+
   28ba8:	7d 91       	ld	r23, X+
   28baa:	8d 91       	ld	r24, X+
   28bac:	9c 91       	ld	r25, X
   28bae:	d9 97       	sbiw	r26, 0x39	; 57
   28bb0:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   28bb4:	27 96       	adiw	r28, 0x07	; 7
   28bb6:	2f ad       	ldd	r18, Y+63	; 0x3f
   28bb8:	27 97       	sbiw	r28, 0x07	; 7
   28bba:	2b 96       	adiw	r28, 0x0b	; 11
   28bbc:	3f ad       	ldd	r19, Y+63	; 0x3f
   28bbe:	2b 97       	sbiw	r28, 0x0b	; 11
   28bc0:	2f 96       	adiw	r28, 0x0f	; 15
   28bc2:	4f ad       	ldd	r20, Y+63	; 0x3f
   28bc4:	2f 97       	sbiw	r28, 0x0f	; 15
   28bc6:	63 96       	adiw	r28, 0x13	; 19
   28bc8:	5f ad       	ldd	r21, Y+63	; 0x3f
   28bca:	63 97       	sbiw	r28, 0x13	; 19
   28bcc:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   28bd0:	2b 01       	movw	r4, r22
   28bd2:	3c 01       	movw	r6, r24
   28bd4:	f8 01       	movw	r30, r16
   28bd6:	e8 5b       	subi	r30, 0xB8	; 184
   28bd8:	ff 4f       	sbci	r31, 0xFF	; 255
   28bda:	40 82       	st	Z, r4
   28bdc:	51 82       	std	Z+1, r5	; 0x01
   28bde:	62 82       	std	Z+2, r6	; 0x02
   28be0:	73 82       	std	Z+3, r7	; 0x03

#ifdef LIN_ADVANCE
  if (block->use_advance_lead) {
   28be2:	34 96       	adiw	r30, 0x04	; 4
   28be4:	80 81       	ld	r24, Z
   28be6:	88 23       	and	r24, r24
   28be8:	09 f4       	brne	.+2      	; 0x28bec <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1186>
   28bea:	89 c0       	rjmp	.+274    	; 0x28cfe <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1298>
      // calculate the compression ratio for the segment (the required advance steps are computed
      // during trapezoid planning)
      float adv_comp = extruder_advance_K * e_D_ratio * cs.axis_steps_per_mm[E_AXIS]; // (step/(mm/s))
   28bec:	20 91 a7 04 	lds	r18, 0x04A7	; 0x8004a7 <extruder_advance_K>
   28bf0:	30 91 a8 04 	lds	r19, 0x04A8	; 0x8004a8 <extruder_advance_K+0x1>
   28bf4:	40 91 a9 04 	lds	r20, 0x04A9	; 0x8004a9 <extruder_advance_K+0x2>
   28bf8:	50 91 aa 04 	lds	r21, 0x04AA	; 0x8004aa <extruder_advance_K+0x3>
   28bfc:	6a 96       	adiw	r28, 0x1a	; 26
   28bfe:	6c ad       	ldd	r22, Y+60	; 0x3c
   28c00:	7d ad       	ldd	r23, Y+61	; 0x3d
   28c02:	8e ad       	ldd	r24, Y+62	; 0x3e
   28c04:	9f ad       	ldd	r25, Y+63	; 0x3f
   28c06:	6a 97       	sbiw	r28, 0x1a	; 26
   28c08:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   28c0c:	4b 01       	movw	r8, r22
   28c0e:	5c 01       	movw	r10, r24
   28c10:	c0 90 77 0d 	lds	r12, 0x0D77	; 0x800d77 <cs+0x10>
   28c14:	d0 90 78 0d 	lds	r13, 0x0D78	; 0x800d78 <cs+0x11>
   28c18:	e0 90 79 0d 	lds	r14, 0x0D79	; 0x800d79 <cs+0x12>
   28c1c:	f0 90 7a 0d 	lds	r15, 0x0D7A	; 0x800d7a <cs+0x13>
      block->adv_comp = adv_comp / block->speed_factor; // step/(step/min)
   28c20:	0c 5a       	subi	r16, 0xAC	; 172
   28c22:	1f 4f       	sbci	r17, 0xFF	; 255

#ifdef LIN_ADVANCE
  if (block->use_advance_lead) {
      // calculate the compression ratio for the segment (the required advance steps are computed
      // during trapezoid planning)
      float adv_comp = extruder_advance_K * e_D_ratio * cs.axis_steps_per_mm[E_AXIS]; // (step/(mm/s))
   28c24:	a7 01       	movw	r20, r14
   28c26:	96 01       	movw	r18, r12
   28c28:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
      block->adv_comp = adv_comp / block->speed_factor; // step/(step/min)
   28c2c:	a3 01       	movw	r20, r6
   28c2e:	92 01       	movw	r18, r4
   28c30:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   28c34:	f8 01       	movw	r30, r16
   28c36:	60 83       	st	Z, r22
   28c38:	71 83       	std	Z+1, r23	; 0x01
   28c3a:	82 83       	std	Z+2, r24	; 0x02
   28c3c:	93 83       	std	Z+3, r25	; 0x03

      float advance_speed;
      if (e_D_ratio > 0)
   28c3e:	20 e0       	ldi	r18, 0x00	; 0
   28c40:	30 e0       	ldi	r19, 0x00	; 0
   28c42:	a9 01       	movw	r20, r18
   28c44:	6a 96       	adiw	r28, 0x1a	; 26
   28c46:	6c ad       	ldd	r22, Y+60	; 0x3c
   28c48:	7d ad       	ldd	r23, Y+61	; 0x3d
   28c4a:	8e ad       	ldd	r24, Y+62	; 0x3e
   28c4c:	9f ad       	ldd	r25, Y+63	; 0x3f
   28c4e:	6a 97       	sbiw	r28, 0x1a	; 26
   28c50:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   28c54:	18 16       	cp	r1, r24
   28c56:	0c f0       	brlt	.+2      	; 0x28c5a <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x11f4>
   28c58:	40 c4       	rjmp	.+2176   	; 0x294da <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1a74>
          advance_speed = (extruder_advance_K * e_D_ratio * block->acceleration * cs.axis_steps_per_mm[E_AXIS]);
   28c5a:	a5 01       	movw	r20, r10
   28c5c:	94 01       	movw	r18, r8
   28c5e:	e1 96       	adiw	r28, 0x31	; 49
   28c60:	6c ad       	ldd	r22, Y+60	; 0x3c
   28c62:	7d ad       	ldd	r23, Y+61	; 0x3d
   28c64:	8e ad       	ldd	r24, Y+62	; 0x3e
   28c66:	9f ad       	ldd	r25, Y+63	; 0x3f
   28c68:	e1 97       	sbiw	r28, 0x31	; 49
   28c6a:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   28c6e:	a7 01       	movw	r20, r14
   28c70:	96 01       	movw	r18, r12
      else
          advance_speed = cs.max_jerk[E_AXIS] * cs.axis_steps_per_mm[E_AXIS];
   28c72:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   28c76:	6b 01       	movw	r12, r22
   28c78:	7c 01       	movw	r14, r24

      // to save more space we avoid another copy of calc_timer and go through slow division, but we
      // still need to replicate the *exact* same step grouping policy (see below)
      if (advance_speed > MAX_STEP_FREQUENCY) advance_speed = MAX_STEP_FREQUENCY;
   28c7a:	20 e0       	ldi	r18, 0x00	; 0
   28c7c:	30 e4       	ldi	r19, 0x40	; 64
   28c7e:	4c e1       	ldi	r20, 0x1C	; 28
   28c80:	57 e4       	ldi	r21, 0x47	; 71
   28c82:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   28c86:	18 16       	cp	r1, r24
   28c88:	3c f4       	brge	.+14     	; 0x28c98 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1232>
   28c8a:	c1 2c       	mov	r12, r1
   28c8c:	20 e4       	ldi	r18, 0x40	; 64
   28c8e:	d2 2e       	mov	r13, r18
   28c90:	2c e1       	ldi	r18, 0x1C	; 28
   28c92:	e2 2e       	mov	r14, r18
   28c94:	27 e4       	ldi	r18, 0x47	; 71
   28c96:	f2 2e       	mov	r15, r18
      float advance_rate = (F_CPU / 8.0) / advance_speed;
   28c98:	a7 01       	movw	r20, r14
   28c9a:	96 01       	movw	r18, r12
   28c9c:	60 e0       	ldi	r22, 0x00	; 0
   28c9e:	74 e2       	ldi	r23, 0x24	; 36
   28ca0:	84 ef       	ldi	r24, 0xF4	; 244
   28ca2:	99 e4       	ldi	r25, 0x49	; 73
   28ca4:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   28ca8:	4b 01       	movw	r8, r22
   28caa:	5c 01       	movw	r10, r24
      if (advance_speed > 20000) {
   28cac:	20 e0       	ldi	r18, 0x00	; 0
   28cae:	30 e4       	ldi	r19, 0x40	; 64
   28cb0:	4c e9       	ldi	r20, 0x9C	; 156
   28cb2:	56 e4       	ldi	r21, 0x46	; 70
   28cb4:	c7 01       	movw	r24, r14
   28cb6:	b6 01       	movw	r22, r12
   28cb8:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   28cbc:	18 16       	cp	r1, r24
   28cbe:	0c f0       	brlt	.+2      	; 0x28cc2 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x125c>
   28cc0:	17 c4       	rjmp	.+2094   	; 0x294f0 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1a8a>
          block->advance_rate = advance_rate * 4;
   28cc2:	8e e6       	ldi	r24, 0x6E	; 110
   28cc4:	82 9d       	mul	r24, r2
   28cc6:	80 01       	movw	r16, r0
   28cc8:	83 9d       	mul	r24, r3
   28cca:	10 0d       	add	r17, r0
   28ccc:	11 24       	eor	r1, r1
   28cce:	02 5a       	subi	r16, 0xA2	; 162
   28cd0:	19 4f       	sbci	r17, 0xF9	; 249
   28cd2:	78 01       	movw	r14, r16
   28cd4:	fd e4       	ldi	r31, 0x4D	; 77
   28cd6:	ef 0e       	add	r14, r31
   28cd8:	f1 1c       	adc	r15, r1
   28cda:	20 e0       	ldi	r18, 0x00	; 0
   28cdc:	30 e0       	ldi	r19, 0x00	; 0
   28cde:	40 e8       	ldi	r20, 0x80	; 128
   28ce0:	50 e4       	ldi	r21, 0x40	; 64
   28ce2:	c5 01       	movw	r24, r10
   28ce4:	b4 01       	movw	r22, r8
   28ce6:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   28cea:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   28cee:	d7 01       	movw	r26, r14
   28cf0:	6d 93       	st	X+, r22
   28cf2:	7c 93       	st	X, r23
          block->advance_step_loops = 4;
   28cf4:	f8 01       	movw	r30, r16
   28cf6:	ed 5a       	subi	r30, 0xAD	; 173
   28cf8:	ff 4f       	sbci	r31, 0xFF	; 255
   28cfa:	84 e0       	ldi	r24, 0x04	; 4
          // never overflow the internal accumulator with very low rates
          if (advance_rate < UINT16_MAX)
              block->advance_rate = advance_rate;
          else
              block->advance_rate = UINT16_MAX;
          block->advance_step_loops = 1;
   28cfc:	80 83       	st	Z, r24
          SERIAL_ECHOLNPGM("LA: More than 2 steps per eISR loop executed.");
      #endif
  }
#endif

  calculate_trapezoid_for_block(block, block->entry_speed, safe_speed);
   28cfe:	09 a5       	ldd	r16, Y+41	; 0x29
   28d00:	1d a5       	ldd	r17, Y+45	; 0x2d
   28d02:	29 ad       	ldd	r18, Y+57	; 0x39
   28d04:	39 a9       	ldd	r19, Y+49	; 0x31
   28d06:	4d ad       	ldd	r20, Y+61	; 0x3d
   28d08:	5d a9       	ldd	r21, Y+53	; 0x35
   28d0a:	6e ad       	ldd	r22, Y+62	; 0x3e
   28d0c:	23 96       	adiw	r28, 0x03	; 3
   28d0e:	7f ad       	ldd	r23, Y+63	; 0x3f
   28d10:	23 97       	sbiw	r28, 0x03	; 3
   28d12:	a3 96       	adiw	r28, 0x23	; 35
   28d14:	8e ad       	ldd	r24, Y+62	; 0x3e
   28d16:	9f ad       	ldd	r25, Y+63	; 0x3f
   28d18:	a3 97       	sbiw	r28, 0x23	; 35
   28d1a:	82 5a       	subi	r24, 0xA2	; 162
   28d1c:	99 4f       	sbci	r25, 0xF9	; 249
   28d1e:	0f 94 d6 08 	call	0x211ac	; 0x211ac <calculate_trapezoid_for_block(block_t*, float, float)>

  if (block->step_event_count.wide <= 32767)
   28d22:	8e e6       	ldi	r24, 0x6E	; 110
   28d24:	82 9d       	mul	r24, r2
   28d26:	f0 01       	movw	r30, r0
   28d28:	83 9d       	mul	r24, r3
   28d2a:	f0 0d       	add	r31, r0
   28d2c:	11 24       	eor	r1, r1
   28d2e:	e2 5a       	subi	r30, 0xA2	; 162
   28d30:	f9 4f       	sbci	r31, 0xF9	; 249
   28d32:	80 89       	ldd	r24, Z+16	; 0x10
   28d34:	91 89       	ldd	r25, Z+17	; 0x11
   28d36:	a2 89       	ldd	r26, Z+18	; 0x12
   28d38:	b3 89       	ldd	r27, Z+19	; 0x13
   28d3a:	81 15       	cp	r24, r1
   28d3c:	90 48       	sbci	r25, 0x80	; 128
   28d3e:	a1 05       	cpc	r26, r1
   28d40:	b1 05       	cpc	r27, r1
   28d42:	18 f4       	brcc	.+6      	; 0x28d4a <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x12e4>
    block->flag |= BLOCK_FLAG_DDA_LOWRES;
   28d44:	85 a9       	ldd	r24, Z+53	; 0x35
   28d46:	88 60       	ori	r24, 0x08	; 8
   28d48:	85 ab       	std	Z+53, r24	; 0x35

  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
   28d4a:	8f b7       	in	r24, 0x3f	; 63
    return 1;
}

static __inline__ uint8_t __iCliRetVal(void)
{
    cli();
   28d4c:	f8 94       	cli
      // Move the buffer head ensuring the current block hasn't been cancelled from an isr context
      // (this is possible both during crash detection *and* uvlo, thus needing a global cli)
      if(planner_aborted) return;
   28d4e:	90 91 42 0d 	lds	r25, 0x0D42	; 0x800d42 <planner_aborted>
   28d52:	91 11       	cpse	r25, r1
   28d54:	93 c4       	rjmp	.+2342   	; 0x2967c <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1c16>
      block_buffer_head = next_buffer_head;
   28d56:	a0 96       	adiw	r28, 0x20	; 32
   28d58:	3f ad       	ldd	r19, Y+63	; 0x3f
   28d5a:	a0 97       	sbiw	r28, 0x20	; 32
   28d5c:	30 93 3e 0d 	sts	0x0D3E, r19	; 0x800d3e <block_buffer_head>
    (void)__s;
}

static __inline__ void __iRestore(const  uint8_t *__s)
{
    SREG = *__s;
   28d60:	8f bf       	out	0x3f, r24	; 63
  }

  // Update position
  memcpy(position, target, sizeof(target)); // position[] = target[]
   28d62:	c3 58       	subi	r28, 0x83	; 131
   28d64:	df 4f       	sbci	r29, 0xFF	; 255
   28d66:	88 81       	ld	r24, Y
   28d68:	99 81       	ldd	r25, Y+1	; 0x01
   28d6a:	aa 81       	ldd	r26, Y+2	; 0x02
   28d6c:	bb 81       	ldd	r27, Y+3	; 0x03
   28d6e:	cd 57       	subi	r28, 0x7D	; 125
   28d70:	d0 40       	sbci	r29, 0x00	; 0
   28d72:	80 93 3c 06 	sts	0x063C, r24	; 0x80063c <position>
   28d76:	90 93 3d 06 	sts	0x063D, r25	; 0x80063d <position+0x1>
   28d7a:	a0 93 3e 06 	sts	0x063E, r26	; 0x80063e <position+0x2>
   28d7e:	b0 93 3f 06 	sts	0x063F, r27	; 0x80063f <position+0x3>
   28d82:	cf 57       	subi	r28, 0x7F	; 127
   28d84:	df 4f       	sbci	r29, 0xFF	; 255
   28d86:	28 81       	ld	r18, Y
   28d88:	39 81       	ldd	r19, Y+1	; 0x01
   28d8a:	4a 81       	ldd	r20, Y+2	; 0x02
   28d8c:	5b 81       	ldd	r21, Y+3	; 0x03
   28d8e:	c1 58       	subi	r28, 0x81	; 129
   28d90:	d0 40       	sbci	r29, 0x00	; 0
   28d92:	20 93 40 06 	sts	0x0640, r18	; 0x800640 <position+0x4>
   28d96:	30 93 41 06 	sts	0x0641, r19	; 0x800641 <position+0x5>
   28d9a:	40 93 42 06 	sts	0x0642, r20	; 0x800642 <position+0x6>
   28d9e:	50 93 43 06 	sts	0x0643, r21	; 0x800643 <position+0x7>
   28da2:	e5 96       	adiw	r28, 0x35	; 53
   28da4:	8c ad       	ldd	r24, Y+60	; 0x3c
   28da6:	9d ad       	ldd	r25, Y+61	; 0x3d
   28da8:	ae ad       	ldd	r26, Y+62	; 0x3e
   28daa:	bf ad       	ldd	r27, Y+63	; 0x3f
   28dac:	e5 97       	sbiw	r28, 0x35	; 53
   28dae:	80 93 44 06 	sts	0x0644, r24	; 0x800644 <position+0x8>
   28db2:	90 93 45 06 	sts	0x0645, r25	; 0x800645 <position+0x9>
   28db6:	a0 93 46 06 	sts	0x0646, r26	; 0x800646 <position+0xa>
   28dba:	b0 93 47 06 	sts	0x0647, r27	; 0x800647 <position+0xb>
   28dbe:	ad 96       	adiw	r28, 0x2d	; 45
   28dc0:	2c ad       	ldd	r18, Y+60	; 0x3c
   28dc2:	3d ad       	ldd	r19, Y+61	; 0x3d
   28dc4:	4e ad       	ldd	r20, Y+62	; 0x3e
   28dc6:	5f ad       	ldd	r21, Y+63	; 0x3f
   28dc8:	ad 97       	sbiw	r28, 0x2d	; 45
   28dca:	20 93 48 06 	sts	0x0648, r18	; 0x800648 <position+0xc>
   28dce:	30 93 49 06 	sts	0x0649, r19	; 0x800649 <position+0xd>
   28dd2:	40 93 4a 06 	sts	0x064A, r20	; 0x80064a <position+0xe>
   28dd6:	50 93 4b 06 	sts	0x064B, r21	; 0x80064b <position+0xf>

  #ifdef LIN_ADVANCE
  position_float[X_AXIS] = x;
   28dda:	89 a1       	ldd	r24, Y+33	; 0x21
   28ddc:	9a a1       	ldd	r25, Y+34	; 0x22
   28dde:	ab a1       	ldd	r26, Y+35	; 0x23
   28de0:	bc a1       	ldd	r27, Y+36	; 0x24
   28de2:	80 93 36 04 	sts	0x0436, r24	; 0x800436 <position_float>
   28de6:	90 93 37 04 	sts	0x0437, r25	; 0x800437 <position_float+0x1>
   28dea:	a0 93 38 04 	sts	0x0438, r26	; 0x800438 <position_float+0x2>
   28dee:	b0 93 39 04 	sts	0x0439, r27	; 0x800439 <position_float+0x3>
  position_float[Y_AXIS] = y;
   28df2:	8d a1       	ldd	r24, Y+37	; 0x25
   28df4:	9e a1       	ldd	r25, Y+38	; 0x26
   28df6:	af a1       	ldd	r26, Y+39	; 0x27
   28df8:	b8 a5       	ldd	r27, Y+40	; 0x28
   28dfa:	80 93 3a 04 	sts	0x043A, r24	; 0x80043a <position_float+0x4>
   28dfe:	90 93 3b 04 	sts	0x043B, r25	; 0x80043b <position_float+0x5>
   28e02:	a0 93 3c 04 	sts	0x043C, r26	; 0x80043c <position_float+0x6>
   28e06:	b0 93 3d 04 	sts	0x043D, r27	; 0x80043d <position_float+0x7>
  position_float[Z_AXIS] = z;
   28e0a:	a7 96       	adiw	r28, 0x27	; 39
   28e0c:	8c ad       	ldd	r24, Y+60	; 0x3c
   28e0e:	9d ad       	ldd	r25, Y+61	; 0x3d
   28e10:	ae ad       	ldd	r26, Y+62	; 0x3e
   28e12:	bf ad       	ldd	r27, Y+63	; 0x3f
   28e14:	a7 97       	sbiw	r28, 0x27	; 39
   28e16:	80 93 3e 04 	sts	0x043E, r24	; 0x80043e <position_float+0x8>
   28e1a:	90 93 3f 04 	sts	0x043F, r25	; 0x80043f <position_float+0x9>
   28e1e:	a0 93 40 04 	sts	0x0440, r26	; 0x800440 <position_float+0xa>
   28e22:	b0 93 41 04 	sts	0x0441, r27	; 0x800441 <position_float+0xb>
  position_float[E_AXIS] = e;
   28e26:	a9 96       	adiw	r28, 0x29	; 41
   28e28:	ee ad       	ldd	r30, Y+62	; 0x3e
   28e2a:	ff ad       	ldd	r31, Y+63	; 0x3f
   28e2c:	a9 97       	sbiw	r28, 0x29	; 41
   28e2e:	80 81       	ld	r24, Z
   28e30:	91 81       	ldd	r25, Z+1	; 0x01
   28e32:	a2 81       	ldd	r26, Z+2	; 0x02
   28e34:	b3 81       	ldd	r27, Z+3	; 0x03
   28e36:	80 93 42 04 	sts	0x0442, r24	; 0x800442 <position_float+0xc>
   28e3a:	90 93 43 04 	sts	0x0443, r25	; 0x800443 <position_float+0xd>
   28e3e:	a0 93 44 04 	sts	0x0444, r26	; 0x800444 <position_float+0xe>
   28e42:	b0 93 45 04 	sts	0x0445, r27	; 0x800445 <position_float+0xf>
void planner_recalculate(const float &safe_final_speed)
{
    // Reverse pass
    // Make a local copy of block_buffer_tail, because the interrupt can alter it
    // by consuming the blocks, therefore shortening the queue.
    uint8_t tail = block_buffer_tail;
   28e46:	f0 90 3f 0d 	lds	r15, 0x0D3F	; 0x800d3f <block_buffer_tail>
    block_t *prev, *current, *next;

//    SERIAL_ECHOLNPGM("planner_recalculate - 1");

    // At least three blocks are in the queue?
    uint8_t n_blocks = (block_buffer_head + BLOCK_BUFFER_SIZE - tail) & (BLOCK_BUFFER_SIZE - 1);
   28e4a:	80 91 3e 0d 	lds	r24, 0x0D3E	; 0x800d3e <block_buffer_head>
   28e4e:	8f 19       	sub	r24, r15
   28e50:	8f 70       	andi	r24, 0x0F	; 15
    if (n_blocks >= 3) {
   28e52:	83 30       	cpi	r24, 0x03	; 3
   28e54:	40 f1       	brcs	.+80     	; 0x28ea6 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1440>
        // Initialize the last tripple of blocks.
        block_index = prev_block_index(block_buffer_head);
   28e56:	10 91 3e 0d 	lds	r17, 0x0D3E	; 0x800d3e <block_buffer_head>
}


// Returns the index of the previous block in the ring buffer
static inline uint8_t prev_block_index(uint8_t block_index) {
  if (block_index == 0)
   28e5a:	11 11       	cpse	r17, r1
   28e5c:	01 c0       	rjmp	.+2      	; 0x28e60 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x13fa>
    block_index = BLOCK_BUFFER_SIZE;
   28e5e:	10 e1       	ldi	r17, 0x10	; 16
  -- block_index;
   28e60:	11 50       	subi	r17, 0x01	; 1
    // At least three blocks are in the queue?
    uint8_t n_blocks = (block_buffer_head + BLOCK_BUFFER_SIZE - tail) & (BLOCK_BUFFER_SIZE - 1);
    if (n_blocks >= 3) {
        // Initialize the last tripple of blocks.
        block_index = prev_block_index(block_buffer_head);
        next        = block_buffer + block_index;
   28e62:	fe e6       	ldi	r31, 0x6E	; 110
   28e64:	1f 9f       	mul	r17, r31
   28e66:	c0 01       	movw	r24, r0
   28e68:	11 24       	eor	r1, r1
   28e6a:	9c 01       	movw	r18, r24
   28e6c:	22 5a       	subi	r18, 0xA2	; 162
   28e6e:	39 4f       	sbci	r19, 0xF9	; 249
   28e70:	59 01       	movw	r10, r18
}


// Returns the index of the previous block in the ring buffer
static inline uint8_t prev_block_index(uint8_t block_index) {
  if (block_index == 0)
   28e72:	11 11       	cpse	r17, r1
   28e74:	01 c0       	rjmp	.+2      	; 0x28e78 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1412>
    block_index = BLOCK_BUFFER_SIZE;
   28e76:	10 e1       	ldi	r17, 0x10	; 16
  -- block_index;
   28e78:	11 50       	subi	r17, 0x01	; 1
    uint8_t n_blocks = (block_buffer_head + BLOCK_BUFFER_SIZE - tail) & (BLOCK_BUFFER_SIZE - 1);
    if (n_blocks >= 3) {
        // Initialize the last tripple of blocks.
        block_index = prev_block_index(block_buffer_head);
        next        = block_buffer + block_index;
        current     = block_buffer + (block_index = prev_block_index(block_index));
   28e7a:	3e e6       	ldi	r19, 0x6E	; 110
   28e7c:	13 9f       	mul	r17, r19
   28e7e:	c0 01       	movw	r24, r0
   28e80:	11 24       	eor	r1, r1
   28e82:	ac 01       	movw	r20, r24
   28e84:	42 5a       	subi	r20, 0xA2	; 162
   28e86:	59 4f       	sbci	r21, 0xF9	; 249
   28e88:	6a 01       	movw	r12, r20
                    // min(current->max_entry_speed, sqrt(next->entry_speed*next->entry_speed+2*current->acceleration*current->millimeters));
                    min(current->max_entry_speed, max_allowable_entry_speed(-current->acceleration,next->entry_speed,current->millimeters));
                current->flag |= BLOCK_FLAG_RECALCULATE;
            }
            next = current;
            current = block_buffer + (block_index = prev_block_index(block_index));
   28e8a:	9e e6       	ldi	r25, 0x6E	; 110
   28e8c:	69 2e       	mov	r6, r25
        current     = block_buffer + (block_index = prev_block_index(block_index));
        // No need to recalculate the last block, it has already been set by the plan_buffer_line() function.
        // Vojtech thinks, that one shall not touch the entry speed of the very first block as well, because
        // 1) it may already be running at the stepper interrupt,
        // 2) there is no way to limit it when going in the forward direction.
        while (block_index != tail) {
   28e8e:	f1 16       	cp	r15, r17
   28e90:	69 f0       	breq	.+26     	; 0x28eac <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1446>
            if (current->flag & BLOCK_FLAG_START_FROM_FULL_HALT) {
   28e92:	d6 01       	movw	r26, r12
   28e94:	d5 96       	adiw	r26, 0x35	; 53
   28e96:	0c 91       	ld	r16, X
   28e98:	02 ff       	sbrs	r16, 2
   28e9a:	7e c3       	rjmp	.+1788   	; 0x29598 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1b32>
                // Don't modify the entry velocity of the starting block.
                // Also don't modify the trapezoids before this block, they are finalized already, prepared
                // for the stepper interrupt routine to use them.
                tail = block_index;
                // Update the number of blocks to process.
                n_blocks = (block_buffer_head + BLOCK_BUFFER_SIZE - tail) & (BLOCK_BUFFER_SIZE - 1);
   28e9c:	80 91 3e 0d 	lds	r24, 0x0D3E	; 0x800d3e <block_buffer_head>
   28ea0:	81 1b       	sub	r24, r17
   28ea2:	8f 70       	andi	r24, 0x0F	; 15
   28ea4:	f1 2e       	mov	r15, r17
    }

//    SERIAL_ECHOLNPGM("planner_recalculate - 2");

    // Forward pass and recalculate the trapezoids.
    if (n_blocks >= 2) {
   28ea6:	82 30       	cpi	r24, 0x02	; 2
   28ea8:	08 f4       	brcc	.+2      	; 0x28eac <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1446>
   28eaa:	a3 c0       	rjmp	.+326    	; 0x28ff2 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x158c>
        // Better to limit the velocities using the already processed block, if it is available, so rather use the saved tail.
        block_index = tail;
        prev    = block_buffer + block_index;
   28eac:	3e e6       	ldi	r19, 0x6E	; 110
   28eae:	f3 9e       	mul	r15, r19
   28eb0:	c0 01       	movw	r24, r0
   28eb2:	11 24       	eor	r1, r1
   28eb4:	ac 01       	movw	r20, r24
   28eb6:	42 5a       	subi	r20, 0xA2	; 162
   28eb8:	59 4f       	sbci	r21, 0xF9	; 249
   28eba:	5a 01       	movw	r10, r20
static bool plan_reset_next_e_sched;

// Returns the index of the next block in the ring buffer
// NOTE: Removed modulo (%) operator, which uses an expensive divide and multiplication.
static inline uint8_t next_block_index(uint8_t block_index) {
  if (++ block_index == BLOCK_BUFFER_SIZE)
   28ebc:	f3 94       	inc	r15
   28ebe:	50 e1       	ldi	r21, 0x10	; 16
   28ec0:	f5 12       	cpse	r15, r21
   28ec2:	01 c0       	rjmp	.+2      	; 0x28ec6 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1460>
    block_index = 0;
   28ec4:	f1 2c       	mov	r15, r1
    // Forward pass and recalculate the trapezoids.
    if (n_blocks >= 2) {
        // Better to limit the velocities using the already processed block, if it is available, so rather use the saved tail.
        block_index = tail;
        prev    = block_buffer + block_index;
        current = block_buffer + (block_index = next_block_index(block_index));
   28ec6:	ae e6       	ldi	r26, 0x6E	; 110
   28ec8:	fa 9e       	mul	r15, r26
   28eca:	c0 01       	movw	r24, r0
   28ecc:	11 24       	eor	r1, r1
   28ece:	fc 01       	movw	r30, r24
   28ed0:	e2 5a       	subi	r30, 0xA2	; 162
   28ed2:	f9 4f       	sbci	r31, 0xF9	; 249
   28ed4:	6f 01       	movw	r12, r30
                calculate_trapezoid_for_block(prev, prev->entry_speed, current->entry_speed);
                // Reset current only to ensure next trapezoid is computed.
                prev->flag &= ~BLOCK_FLAG_RECALCULATE;
            }
            prev = current;
            current = block_buffer + (block_index = next_block_index(block_index));
   28ed6:	8e e6       	ldi	r24, 0x6E	; 110
   28ed8:	88 2e       	mov	r8, r24
        do {
            // If the previous block is an acceleration block, but it is not long enough to complete the
            // full speed change within the block, we need to adjust the entry speed accordingly. Entry
            // speeds have already been reset, maximized, and reverse planned by reverse planner.
            // If nominal length is true, max junction speed is guaranteed to be reached. No need to recheck.
            if (! (prev->flag & BLOCK_FLAG_NOMINAL_LENGTH) && prev->entry_speed < current->entry_speed) {
   28eda:	d5 01       	movw	r26, r10
   28edc:	d5 96       	adiw	r26, 0x35	; 53
   28ede:	8c 91       	ld	r24, X
   28ee0:	d5 97       	sbiw	r26, 0x35	; 53
   28ee2:	81 fd       	sbrc	r24, 1
   28ee4:	5a c0       	rjmp	.+180    	; 0x28f9a <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1534>
   28ee6:	95 96       	adiw	r26, 0x25	; 37
   28ee8:	4d 90       	ld	r4, X+
   28eea:	5d 90       	ld	r5, X+
   28eec:	6d 90       	ld	r6, X+
   28eee:	7c 90       	ld	r7, X
   28ef0:	98 97       	sbiw	r26, 0x28	; 40
   28ef2:	f6 01       	movw	r30, r12
   28ef4:	95 a0       	ldd	r9, Z+37	; 0x25
   28ef6:	e6 a0       	ldd	r14, Z+38	; 0x26
   28ef8:	07 a1       	ldd	r16, Z+39	; 0x27
   28efa:	10 a5       	ldd	r17, Z+40	; 0x28
   28efc:	29 2d       	mov	r18, r9
   28efe:	3e 2d       	mov	r19, r14
   28f00:	a8 01       	movw	r20, r16
   28f02:	c3 01       	movw	r24, r6
   28f04:	b2 01       	movw	r22, r4
   28f06:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   28f0a:	87 ff       	sbrs	r24, 7
   28f0c:	46 c0       	rjmp	.+140    	; 0x28f9a <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1534>
// Calculates the maximum allowable entry speed, when you must be able to reach target_velocity using the
// decceleration within the allotted distance.
FORCE_INLINE float max_allowable_entry_speed(float decceleration, float target_velocity, float distance)
{
    // assert(decceleration < 0);
    return  sqrt(target_velocity*target_velocity-2*decceleration*distance);
   28f0e:	a3 01       	movw	r20, r6
   28f10:	92 01       	movw	r18, r4
   28f12:	c3 01       	movw	r24, r6
   28f14:	b2 01       	movw	r22, r4
   28f16:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   28f1a:	2b 01       	movw	r4, r22
   28f1c:	3c 01       	movw	r6, r24
            // If the previous block is an acceleration block, but it is not long enough to complete the
            // full speed change within the block, we need to adjust the entry speed accordingly. Entry
            // speeds have already been reset, maximized, and reverse planned by reverse planner.
            // If nominal length is true, max junction speed is guaranteed to be reached. No need to recheck.
            if (! (prev->flag & BLOCK_FLAG_NOMINAL_LENGTH) && prev->entry_speed < current->entry_speed) {
                float entry_speed = min(current->entry_speed, max_allowable_entry_speed(-prev->acceleration,prev->entry_speed,prev->millimeters));
   28f1e:	d5 01       	movw	r26, r10
   28f20:	d1 96       	adiw	r26, 0x31	; 49
   28f22:	6d 91       	ld	r22, X+
   28f24:	7d 91       	ld	r23, X+
   28f26:	8d 91       	ld	r24, X+
   28f28:	9c 91       	ld	r25, X
   28f2a:	d4 97       	sbiw	r26, 0x34	; 52
   28f2c:	90 58       	subi	r25, 0x80	; 128
// Calculates the maximum allowable entry speed, when you must be able to reach target_velocity using the
// decceleration within the allotted distance.
FORCE_INLINE float max_allowable_entry_speed(float decceleration, float target_velocity, float distance)
{
    // assert(decceleration < 0);
    return  sqrt(target_velocity*target_velocity-2*decceleration*distance);
   28f2e:	9b 01       	movw	r18, r22
   28f30:	ac 01       	movw	r20, r24
   28f32:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   28f36:	f5 01       	movw	r30, r10
   28f38:	25 a5       	ldd	r18, Z+45	; 0x2d
   28f3a:	36 a5       	ldd	r19, Z+46	; 0x2e
   28f3c:	47 a5       	ldd	r20, Z+47	; 0x2f
   28f3e:	50 a9       	ldd	r21, Z+48	; 0x30
   28f40:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   28f44:	9b 01       	movw	r18, r22
   28f46:	ac 01       	movw	r20, r24
   28f48:	c3 01       	movw	r24, r6
   28f4a:	b2 01       	movw	r22, r4
   28f4c:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   28f50:	0f 94 d6 a8 	call	0x351ac	; 0x351ac <sqrt>
   28f54:	2b 01       	movw	r4, r22
   28f56:	3c 01       	movw	r6, r24
            // If the previous block is an acceleration block, but it is not long enough to complete the
            // full speed change within the block, we need to adjust the entry speed accordingly. Entry
            // speeds have already been reset, maximized, and reverse planned by reverse planner.
            // If nominal length is true, max junction speed is guaranteed to be reached. No need to recheck.
            if (! (prev->flag & BLOCK_FLAG_NOMINAL_LENGTH) && prev->entry_speed < current->entry_speed) {
                float entry_speed = min(current->entry_speed, max_allowable_entry_speed(-prev->acceleration,prev->entry_speed,prev->millimeters));
   28f58:	9b 01       	movw	r18, r22
   28f5a:	ac 01       	movw	r20, r24
   28f5c:	69 2d       	mov	r22, r9
   28f5e:	7e 2d       	mov	r23, r14
   28f60:	c8 01       	movw	r24, r16
   28f62:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   28f66:	87 ff       	sbrs	r24, 7
   28f68:	03 c0       	rjmp	.+6      	; 0x28f70 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x150a>
   28f6a:	49 2c       	mov	r4, r9
   28f6c:	5e 2c       	mov	r5, r14
   28f6e:	38 01       	movw	r6, r16
                // Check for junction speed change
                if (current->entry_speed != entry_speed) {
   28f70:	92 01       	movw	r18, r4
   28f72:	a3 01       	movw	r20, r6
   28f74:	69 2d       	mov	r22, r9
   28f76:	7e 2d       	mov	r23, r14
   28f78:	c8 01       	movw	r24, r16
   28f7a:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   28f7e:	88 23       	and	r24, r24
   28f80:	61 f0       	breq	.+24     	; 0x28f9a <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1534>
   28f82:	d6 01       	movw	r26, r12
   28f84:	d5 96       	adiw	r26, 0x35	; 53
   28f86:	2c 91       	ld	r18, X
                    current->entry_speed = entry_speed;
   28f88:	c2 01       	movw	r24, r4
   28f8a:	d3 01       	movw	r26, r6
   28f8c:	f6 01       	movw	r30, r12
   28f8e:	85 a3       	std	Z+37, r24	; 0x25
   28f90:	96 a3       	std	Z+38, r25	; 0x26
   28f92:	a7 a3       	std	Z+39, r26	; 0x27
   28f94:	b0 a7       	std	Z+40, r27	; 0x28
                    current->flag |= BLOCK_FLAG_RECALCULATE;
   28f96:	21 60       	ori	r18, 0x01	; 1
   28f98:	25 ab       	std	Z+53, r18	; 0x35
                }
            }
            // Recalculate if current block entry or exit junction speed has changed.
            if ((prev->flag | current->flag) & BLOCK_FLAG_RECALCULATE) {
   28f9a:	d5 01       	movw	r26, r10
   28f9c:	d5 96       	adiw	r26, 0x35	; 53
   28f9e:	8c 91       	ld	r24, X
   28fa0:	d5 97       	sbiw	r26, 0x35	; 53
   28fa2:	f6 01       	movw	r30, r12
   28fa4:	95 a9       	ldd	r25, Z+53	; 0x35
   28fa6:	89 2b       	or	r24, r25
   28fa8:	80 ff       	sbrs	r24, 0
   28faa:	14 c0       	rjmp	.+40     	; 0x28fd4 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x156e>
                // NOTE: Entry and exit factors always > 0 by all previous logic operations.
                calculate_trapezoid_for_block(prev, prev->entry_speed, current->entry_speed);
   28fac:	05 a1       	ldd	r16, Z+37	; 0x25
   28fae:	16 a1       	ldd	r17, Z+38	; 0x26
   28fb0:	27 a1       	ldd	r18, Z+39	; 0x27
   28fb2:	30 a5       	ldd	r19, Z+40	; 0x28
   28fb4:	95 96       	adiw	r26, 0x25	; 37
   28fb6:	4d 91       	ld	r20, X+
   28fb8:	5d 91       	ld	r21, X+
   28fba:	6d 91       	ld	r22, X+
   28fbc:	7c 91       	ld	r23, X
   28fbe:	98 97       	sbiw	r26, 0x28	; 40
   28fc0:	c5 01       	movw	r24, r10
   28fc2:	0f 94 d6 08 	call	0x211ac	; 0x211ac <calculate_trapezoid_for_block(block_t*, float, float)>
                // Reset current only to ensure next trapezoid is computed.
                prev->flag &= ~BLOCK_FLAG_RECALCULATE;
   28fc6:	d5 01       	movw	r26, r10
   28fc8:	d5 96       	adiw	r26, 0x35	; 53
   28fca:	8c 91       	ld	r24, X
   28fcc:	d5 97       	sbiw	r26, 0x35	; 53
   28fce:	8e 7f       	andi	r24, 0xFE	; 254
   28fd0:	d5 96       	adiw	r26, 0x35	; 53
   28fd2:	8c 93       	st	X, r24
static bool plan_reset_next_e_sched;

// Returns the index of the next block in the ring buffer
// NOTE: Removed modulo (%) operator, which uses an expensive divide and multiplication.
static inline uint8_t next_block_index(uint8_t block_index) {
  if (++ block_index == BLOCK_BUFFER_SIZE)
   28fd4:	f3 94       	inc	r15
   28fd6:	b0 e1       	ldi	r27, 0x10	; 16
   28fd8:	fb 12       	cpse	r15, r27
   28fda:	01 c0       	rjmp	.+2      	; 0x28fde <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1578>
    block_index = 0;
   28fdc:	f1 2c       	mov	r15, r1
                calculate_trapezoid_for_block(prev, prev->entry_speed, current->entry_speed);
                // Reset current only to ensure next trapezoid is computed.
                prev->flag &= ~BLOCK_FLAG_RECALCULATE;
            }
            prev = current;
            current = block_buffer + (block_index = next_block_index(block_index));
   28fde:	f8 9c       	mul	r15, r8
   28fe0:	c0 01       	movw	r24, r0
   28fe2:	11 24       	eor	r1, r1
   28fe4:	82 5a       	subi	r24, 0xA2	; 162
   28fe6:	99 4f       	sbci	r25, 0xF9	; 249
        } while (block_index != block_buffer_head);
   28fe8:	20 91 3e 0d 	lds	r18, 0x0D3E	; 0x800d3e <block_buffer_head>
                // NOTE: Entry and exit factors always > 0 by all previous logic operations.
                calculate_trapezoid_for_block(prev, prev->entry_speed, current->entry_speed);
                // Reset current only to ensure next trapezoid is computed.
                prev->flag &= ~BLOCK_FLAG_RECALCULATE;
            }
            prev = current;
   28fec:	56 01       	movw	r10, r12
            current = block_buffer + (block_index = next_block_index(block_index));
        } while (block_index != block_buffer_head);
   28fee:	f2 12       	cpse	r15, r18
   28ff0:	43 c3       	rjmp	.+1670   	; 0x29678 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1c12>
    }

//    SERIAL_ECHOLNPGM("planner_recalculate - 3");

    // Last/newest block in buffer. Exit speed is set with safe_final_speed. Always recalculated.
    current = block_buffer + prev_block_index(block_buffer_head);
   28ff2:	80 91 3e 0d 	lds	r24, 0x0D3E	; 0x800d3e <block_buffer_head>
}


// Returns the index of the previous block in the ring buffer
static inline uint8_t prev_block_index(uint8_t block_index) {
  if (block_index == 0)
   28ff6:	81 11       	cpse	r24, r1
   28ff8:	01 c0       	rjmp	.+2      	; 0x28ffc <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1596>
    block_index = BLOCK_BUFFER_SIZE;
   28ffa:	80 e1       	ldi	r24, 0x10	; 16
  -- block_index;
   28ffc:	81 50       	subi	r24, 0x01	; 1
    }

//    SERIAL_ECHOLNPGM("planner_recalculate - 3");

    // Last/newest block in buffer. Exit speed is set with safe_final_speed. Always recalculated.
    current = block_buffer + prev_block_index(block_buffer_head);
   28ffe:	ee e6       	ldi	r30, 0x6E	; 110
   29000:	8e 9f       	mul	r24, r30
   29002:	c0 01       	movw	r24, r0
   29004:	11 24       	eor	r1, r1
   29006:	9c 01       	movw	r18, r24
   29008:	22 5a       	subi	r18, 0xA2	; 162
   2900a:	39 4f       	sbci	r19, 0xF9	; 249
   2900c:	79 01       	movw	r14, r18
    calculate_trapezoid_for_block(current, current->entry_speed, safe_final_speed);
   2900e:	d9 01       	movw	r26, r18
   29010:	95 96       	adiw	r26, 0x25	; 37
   29012:	4d 91       	ld	r20, X+
   29014:	5d 91       	ld	r21, X+
   29016:	6d 91       	ld	r22, X+
   29018:	7c 91       	ld	r23, X
   2901a:	98 97       	sbiw	r26, 0x28	; 40
   2901c:	09 a5       	ldd	r16, Y+41	; 0x29
   2901e:	1d a5       	ldd	r17, Y+45	; 0x2d
   29020:	29 ad       	ldd	r18, Y+57	; 0x39
   29022:	39 a9       	ldd	r19, Y+49	; 0x31
   29024:	c7 01       	movw	r24, r14
   29026:	0f 94 d6 08 	call	0x211ac	; 0x211ac <calculate_trapezoid_for_block(block_t*, float, float)>
    current->flag &= ~BLOCK_FLAG_RECALCULATE;
   2902a:	f7 01       	movw	r30, r14
   2902c:	85 a9       	ldd	r24, Z+53	; 0x35
   2902e:	8e 7f       	andi	r24, 0xFE	; 254
   29030:	85 ab       	std	Z+53, r24	; 0x35

  // The stepper timer interrupt will run continuously from now on.
  // If there are no planner blocks to be executed by the stepper routine,
  // the stepper interrupt ticks at 1kHz to wake up and pick a block
  // from the planner queue if available.
  ENABLE_STEPPER_DRIVER_INTERRUPT();
   29032:	80 91 6f 00 	lds	r24, 0x006F	; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f>
   29036:	82 60       	ori	r24, 0x02	; 2
   29038:	80 93 6f 00 	sts	0x006F, r24	; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f>
   2903c:	0d 94 9a 3d 	jmp	0x27b34	; 0x27b34 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xce>

  // Save original start position of the move
  if (gcode_start_position)
      memcpy(block->gcode_start_position, gcode_start_position, sizeof(block_t::gcode_start_position));
  else
      memcpy(block->gcode_start_position, current_position, sizeof(block_t::gcode_start_position));
   29040:	aa 54       	subi	r26, 0x4A	; 74
   29042:	b9 4f       	sbci	r27, 0xF9	; 249
   29044:	80 e1       	ldi	r24, 0x10	; 16
   29046:	e1 e6       	ldi	r30, 0x61	; 97
   29048:	f2 e1       	ldi	r31, 0x12	; 18
   2904a:	0d 94 d5 3d 	jmp	0x27baa	; 0x27baa <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x144>
  target[Y_AXIS] = lround(y*cs.axis_steps_per_mm[Y_AXIS]);
#ifdef MESH_BED_LEVELING
    if (mbl.active){
        target[Z_AXIS] = lround((z+mbl.get_z(x, y))*cs.axis_steps_per_mm[Z_AXIS]);
    }else{
        target[Z_AXIS] = lround(z*cs.axis_steps_per_mm[Z_AXIS]);
   2904e:	20 91 73 0d 	lds	r18, 0x0D73	; 0x800d73 <cs+0xc>
   29052:	30 91 74 0d 	lds	r19, 0x0D74	; 0x800d74 <cs+0xd>
   29056:	40 91 75 0d 	lds	r20, 0x0D75	; 0x800d75 <cs+0xe>
   2905a:	50 91 76 0d 	lds	r21, 0x0D76	; 0x800d76 <cs+0xf>
   2905e:	a7 96       	adiw	r28, 0x27	; 39
   29060:	6c ad       	ldd	r22, Y+60	; 0x3c
   29062:	7d ad       	ldd	r23, Y+61	; 0x3d
   29064:	8e ad       	ldd	r24, Y+62	; 0x3e
   29066:	9f ad       	ldd	r25, Y+63	; 0x3f
   29068:	a7 97       	sbiw	r28, 0x27	; 39
   2906a:	0d 94 6b 3e 	jmp	0x27cd6	; 0x27cd6 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x270>
  block->fan_speed = fanSpeed;

  // Compute direction bits for this block
  block->direction_bits = 0;
#ifndef COREXY
  if (dx < 0) block->direction_bits |= _BV(X_AXIS);
   2906e:	81 e0       	ldi	r24, 0x01	; 1
   29070:	80 8f       	std	Z+24, r24	; 0x18
   29072:	0d 94 11 40 	jmp	0x28022	; 0x28022 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x5bc>
  {
    if(feed_rate<cs.mintravelfeedrate) feed_rate=cs.mintravelfeedrate;
  }
  else
  {
    if(feed_rate<cs.minimumfeedrate) feed_rate=cs.minimumfeedrate;
   29076:	a0 90 a3 0d 	lds	r10, 0x0DA3	; 0x800da3 <cs+0x3c>
   2907a:	b0 90 a4 0d 	lds	r11, 0x0DA4	; 0x800da4 <cs+0x3d>
   2907e:	00 91 a5 0d 	lds	r16, 0x0DA5	; 0x800da5 <cs+0x3e>
   29082:	10 91 a6 0d 	lds	r17, 0x0DA6	; 0x800da6 <cs+0x3f>
   29086:	53 c8       	rjmp	.-3930   	; 0x2812e <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x6c8>
    block->millimeters = fabs(delta_mm[E_AXIS]);
  }
  else
  {
    #ifndef COREXY
      block->millimeters = sqrt(square(delta_mm[X_AXIS]) + square(delta_mm[Y_AXIS]) + square(delta_mm[Z_AXIS]));
   29088:	c5 01       	movw	r24, r10
   2908a:	b4 01       	movw	r22, r8
   2908c:	0f 94 a9 9e 	call	0x33d52	; 0x33d52 <square>
   29090:	4b 01       	movw	r8, r22
   29092:	5c 01       	movw	r10, r24
   29094:	c7 01       	movw	r24, r14
   29096:	b6 01       	movw	r22, r12
   29098:	0f 94 a9 9e 	call	0x33d52	; 0x33d52 <square>
   2909c:	9b 01       	movw	r18, r22
   2909e:	ac 01       	movw	r20, r24
   290a0:	c5 01       	movw	r24, r10
   290a2:	b4 01       	movw	r22, r8
   290a4:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   290a8:	6b 01       	movw	r12, r22
   290aa:	7c 01       	movw	r14, r24
   290ac:	22 96       	adiw	r28, 0x02	; 2
   290ae:	6c ad       	ldd	r22, Y+60	; 0x3c
   290b0:	7d ad       	ldd	r23, Y+61	; 0x3d
   290b2:	8e ad       	ldd	r24, Y+62	; 0x3e
   290b4:	9f ad       	ldd	r25, Y+63	; 0x3f
   290b6:	22 97       	sbiw	r28, 0x02	; 2
   290b8:	0f 94 a9 9e 	call	0x33d52	; 0x33d52 <square>
   290bc:	9b 01       	movw	r18, r22
   290be:	ac 01       	movw	r20, r24
   290c0:	c7 01       	movw	r24, r14
   290c2:	b6 01       	movw	r22, r12
   290c4:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   290c8:	0f 94 d6 a8 	call	0x351ac	; 0x351ac <sqrt>
   290cc:	2e e6       	ldi	r18, 0x6E	; 110
   290ce:	22 9d       	mul	r18, r2
   290d0:	f0 01       	movw	r30, r0
   290d2:	23 9d       	mul	r18, r3
   290d4:	f0 0d       	add	r31, r0
   290d6:	11 24       	eor	r1, r1
   290d8:	e2 5a       	subi	r30, 0xA2	; 162
   290da:	f9 4f       	sbci	r31, 0xF9	; 249
   290dc:	65 a7       	std	Z+45, r22	; 0x2d
   290de:	76 a7       	std	Z+46, r23	; 0x2e
   290e0:	87 a7       	std	Z+47, r24	; 0x2f
   290e2:	90 ab       	std	Z+48, r25	; 0x30
   290e4:	c2 c8       	rjmp	.-3708   	; 0x2826a <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x804>
    block->use_advance_lead = false;
    #endif
  }
  else
  {
    accel = ceil((block->steps[E_AXIS].wide ? cs.acceleration : cs.travel_acceleration) * steps_per_mm); // convert to: acceleration steps/sec^2
   290e6:	2a 96       	adiw	r28, 0x0a	; 10
   290e8:	2c ad       	ldd	r18, Y+60	; 0x3c
   290ea:	3d ad       	ldd	r19, Y+61	; 0x3d
   290ec:	4e ad       	ldd	r20, Y+62	; 0x3e
   290ee:	5f ad       	ldd	r21, Y+63	; 0x3f
   290f0:	2a 97       	sbiw	r28, 0x0a	; 10
   290f2:	23 2b       	or	r18, r19
   290f4:	24 2b       	or	r18, r20
   290f6:	25 2b       	or	r18, r21
   290f8:	09 f4       	brne	.+2      	; 0x290fc <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1696>
   290fa:	0e c1       	rjmp	.+540    	; 0x29318 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x18b2>
   290fc:	60 91 9b 0d 	lds	r22, 0x0D9B	; 0x800d9b <cs+0x34>
   29100:	70 91 9c 0d 	lds	r23, 0x0D9C	; 0x800d9c <cs+0x35>
   29104:	80 91 9d 0d 	lds	r24, 0x0D9D	; 0x800d9d <cs+0x36>
   29108:	90 91 9e 0d 	lds	r25, 0x0D9E	; 0x800d9e <cs+0x37>
   2910c:	29 a5       	ldd	r18, Y+41	; 0x29
   2910e:	3a a5       	ldd	r19, Y+42	; 0x2a
   29110:	4b a5       	ldd	r20, Y+43	; 0x2b
   29112:	5c a5       	ldd	r21, Y+44	; 0x2c
   29114:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   29118:	0f 94 e6 a5 	call	0x34bcc	; 0x34bcc <ceil>
   2911c:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   29120:	2b 01       	movw	r4, r22
   29122:	3c 01       	movw	r6, r24
     *
     * extruder_advance_K       : There is an advance factor set.
     * delta_mm[E_AXIS] >= 0    : Extruding or traveling, but _not_ retracting.
     * |delta_mm[Z_AXIS]| < 0.5 : Z is only moved for leveling (_not_ for priming)
     */
    block->use_advance_lead = extruder_advance_K > 0
   29124:	80 91 a7 04 	lds	r24, 0x04A7	; 0x8004a7 <extruder_advance_K>
   29128:	90 91 a8 04 	lds	r25, 0x04A8	; 0x8004a8 <extruder_advance_K+0x1>
   2912c:	a0 91 a9 04 	lds	r26, 0x04A9	; 0x8004a9 <extruder_advance_K+0x2>
   29130:	b0 91 aa 04 	lds	r27, 0x04AA	; 0x8004aa <extruder_advance_K+0x3>
   29134:	8d a7       	std	Y+45, r24	; 0x2d
   29136:	9e a7       	std	Y+46, r25	; 0x2e
   29138:	af a7       	std	Y+47, r26	; 0x2f
   2913a:	b8 ab       	std	Y+48, r27	; 0x30
                              && delta_mm[E_AXIS] >= 0
                              && fabs(delta_mm[Z_AXIS]) < 0.5;
   2913c:	20 e0       	ldi	r18, 0x00	; 0
   2913e:	30 e0       	ldi	r19, 0x00	; 0
   29140:	a9 01       	movw	r20, r18
   29142:	bc 01       	movw	r22, r24
   29144:	cd 01       	movw	r24, r26
   29146:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   2914a:	18 16       	cp	r1, r24
   2914c:	0c f0       	brlt	.+2      	; 0x29150 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x16ea>
   2914e:	ed c0       	rjmp	.+474    	; 0x2932a <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x18c4>
     * extruder_advance_K       : There is an advance factor set.
     * delta_mm[E_AXIS] >= 0    : Extruding or traveling, but _not_ retracting.
     * |delta_mm[Z_AXIS]| < 0.5 : Z is only moved for leveling (_not_ for priming)
     */
    block->use_advance_lead = extruder_advance_K > 0
                              && delta_mm[E_AXIS] >= 0
   29150:	20 e0       	ldi	r18, 0x00	; 0
   29152:	30 e0       	ldi	r19, 0x00	; 0
   29154:	a9 01       	movw	r20, r18
   29156:	26 96       	adiw	r28, 0x06	; 6
   29158:	6c ad       	ldd	r22, Y+60	; 0x3c
   2915a:	7d ad       	ldd	r23, Y+61	; 0x3d
   2915c:	8e ad       	ldd	r24, Y+62	; 0x3e
   2915e:	9f ad       	ldd	r25, Y+63	; 0x3f
   29160:	26 97       	sbiw	r28, 0x06	; 6
   29162:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   29166:	87 fd       	sbrc	r24, 7
   29168:	e0 c0       	rjmp	.+448    	; 0x2932a <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x18c4>
                              && fabs(delta_mm[Z_AXIS]) < 0.5;
   2916a:	22 96       	adiw	r28, 0x02	; 2
   2916c:	6c ad       	ldd	r22, Y+60	; 0x3c
   2916e:	7d ad       	ldd	r23, Y+61	; 0x3d
   29170:	8e ad       	ldd	r24, Y+62	; 0x3e
   29172:	9f ad       	ldd	r25, Y+63	; 0x3f
   29174:	22 97       	sbiw	r28, 0x02	; 2
   29176:	9f 77       	andi	r25, 0x7F	; 127
   29178:	20 e0       	ldi	r18, 0x00	; 0
   2917a:	30 e0       	ldi	r19, 0x00	; 0
   2917c:	40 e0       	ldi	r20, 0x00	; 0
   2917e:	5f e3       	ldi	r21, 0x3F	; 63
   29180:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   29184:	87 ff       	sbrs	r24, 7
   29186:	d1 c0       	rjmp	.+418    	; 0x2932a <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x18c4>
     *
     * extruder_advance_K       : There is an advance factor set.
     * delta_mm[E_AXIS] >= 0    : Extruding or traveling, but _not_ retracting.
     * |delta_mm[Z_AXIS]| < 0.5 : Z is only moved for leveling (_not_ for priming)
     */
    block->use_advance_lead = extruder_advance_K > 0
   29188:	8e e6       	ldi	r24, 0x6E	; 110
   2918a:	82 9d       	mul	r24, r2
   2918c:	80 01       	movw	r16, r0
   2918e:	83 9d       	mul	r24, r3
   29190:	10 0d       	add	r17, r0
   29192:	11 24       	eor	r1, r1
   29194:	06 55       	subi	r16, 0x56	; 86
   29196:	19 4f       	sbci	r17, 0xF9	; 249
   29198:	81 e0       	ldi	r24, 0x01	; 1
   2919a:	d8 01       	movw	r26, r16
   2919c:	8c 93       	st	X, r24
        float delta_e = (e - position_float[E_AXIS]) / extruder_multiplier[extruder];
#else
        // M221/FLOW only adjusts for an incorrect source diameter
        float delta_e = (e - position_float[E_AXIS]);
#endif
        float delta_D = sqrt(sq(x - position_float[X_AXIS])
   2919e:	20 91 36 04 	lds	r18, 0x0436	; 0x800436 <position_float>
   291a2:	30 91 37 04 	lds	r19, 0x0437	; 0x800437 <position_float+0x1>
   291a6:	40 91 38 04 	lds	r20, 0x0438	; 0x800438 <position_float+0x2>
   291aa:	50 91 39 04 	lds	r21, 0x0439	; 0x800439 <position_float+0x3>
   291ae:	69 a1       	ldd	r22, Y+33	; 0x21
   291b0:	7a a1       	ldd	r23, Y+34	; 0x22
   291b2:	8b a1       	ldd	r24, Y+35	; 0x23
   291b4:	9c a1       	ldd	r25, Y+36	; 0x24
   291b6:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   291ba:	69 ab       	std	Y+49, r22	; 0x31
   291bc:	7a ab       	std	Y+50, r23	; 0x32
   291be:	8b ab       	std	Y+51, r24	; 0x33
   291c0:	9c ab       	std	Y+52, r25	; 0x34
                             + sq(y - position_float[Y_AXIS])
   291c2:	20 91 3a 04 	lds	r18, 0x043A	; 0x80043a <position_float+0x4>
   291c6:	30 91 3b 04 	lds	r19, 0x043B	; 0x80043b <position_float+0x5>
   291ca:	40 91 3c 04 	lds	r20, 0x043C	; 0x80043c <position_float+0x6>
   291ce:	50 91 3d 04 	lds	r21, 0x043D	; 0x80043d <position_float+0x7>
   291d2:	6d a1       	ldd	r22, Y+37	; 0x25
   291d4:	7e a1       	ldd	r23, Y+38	; 0x26
   291d6:	8f a1       	ldd	r24, Y+39	; 0x27
   291d8:	98 a5       	ldd	r25, Y+40	; 0x28
   291da:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   291de:	4b 01       	movw	r8, r22
   291e0:	5c 01       	movw	r10, r24
                             + sq(z - position_float[Z_AXIS]));
   291e2:	20 91 3e 04 	lds	r18, 0x043E	; 0x80043e <position_float+0x8>
   291e6:	30 91 3f 04 	lds	r19, 0x043F	; 0x80043f <position_float+0x9>
   291ea:	40 91 40 04 	lds	r20, 0x0440	; 0x800440 <position_float+0xa>
   291ee:	50 91 41 04 	lds	r21, 0x0441	; 0x800441 <position_float+0xb>
   291f2:	a7 96       	adiw	r28, 0x27	; 39
   291f4:	6c ad       	ldd	r22, Y+60	; 0x3c
   291f6:	7d ad       	ldd	r23, Y+61	; 0x3d
   291f8:	8e ad       	ldd	r24, Y+62	; 0x3e
   291fa:	9f ad       	ldd	r25, Y+63	; 0x3f
   291fc:	a7 97       	sbiw	r28, 0x27	; 39
   291fe:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   29202:	6b 01       	movw	r12, r22
   29204:	7c 01       	movw	r14, r24
        float delta_e = (e - position_float[E_AXIS]) / extruder_multiplier[extruder];
#else
        // M221/FLOW only adjusts for an incorrect source diameter
        float delta_e = (e - position_float[E_AXIS]);
#endif
        float delta_D = sqrt(sq(x - position_float[X_AXIS])
   29206:	29 a9       	ldd	r18, Y+49	; 0x31
   29208:	3a a9       	ldd	r19, Y+50	; 0x32
   2920a:	4b a9       	ldd	r20, Y+51	; 0x33
   2920c:	5c a9       	ldd	r21, Y+52	; 0x34
   2920e:	ca 01       	movw	r24, r20
   29210:	b9 01       	movw	r22, r18
   29212:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   29216:	69 ab       	std	Y+49, r22	; 0x31
   29218:	7a ab       	std	Y+50, r23	; 0x32
   2921a:	8b ab       	std	Y+51, r24	; 0x33
   2921c:	9c ab       	std	Y+52, r25	; 0x34
                             + sq(y - position_float[Y_AXIS])
   2921e:	a5 01       	movw	r20, r10
   29220:	94 01       	movw	r18, r8
   29222:	c5 01       	movw	r24, r10
   29224:	b4 01       	movw	r22, r8
   29226:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2922a:	9b 01       	movw	r18, r22
   2922c:	ac 01       	movw	r20, r24
   2922e:	69 a9       	ldd	r22, Y+49	; 0x31
   29230:	7a a9       	ldd	r23, Y+50	; 0x32
   29232:	8b a9       	ldd	r24, Y+51	; 0x33
   29234:	9c a9       	ldd	r25, Y+52	; 0x34
   29236:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   2923a:	4b 01       	movw	r8, r22
   2923c:	5c 01       	movw	r10, r24
                             + sq(z - position_float[Z_AXIS]));
   2923e:	a7 01       	movw	r20, r14
   29240:	96 01       	movw	r18, r12
   29242:	c7 01       	movw	r24, r14
   29244:	b6 01       	movw	r22, r12
   29246:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2924a:	9b 01       	movw	r18, r22
   2924c:	ac 01       	movw	r20, r24
   2924e:	c5 01       	movw	r24, r10
   29250:	b4 01       	movw	r22, r8
   29252:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
        float delta_e = (e - position_float[E_AXIS]) / extruder_multiplier[extruder];
#else
        // M221/FLOW only adjusts for an incorrect source diameter
        float delta_e = (e - position_float[E_AXIS]);
#endif
        float delta_D = sqrt(sq(x - position_float[X_AXIS])
   29256:	0f 94 d6 a8 	call	0x351ac	; 0x351ac <sqrt>
   2925a:	6b 01       	movw	r12, r22
   2925c:	7c 01       	movw	r14, r24
#ifdef LA_FLOWADJ
        // M221/FLOW should change uniformly the extrusion thickness
        float delta_e = (e - position_float[E_AXIS]) / extruder_multiplier[extruder];
#else
        // M221/FLOW only adjusts for an incorrect source diameter
        float delta_e = (e - position_float[E_AXIS]);
   2925e:	20 91 42 04 	lds	r18, 0x0442	; 0x800442 <position_float+0xc>
   29262:	30 91 43 04 	lds	r19, 0x0443	; 0x800443 <position_float+0xd>
   29266:	40 91 44 04 	lds	r20, 0x0444	; 0x800444 <position_float+0xe>
   2926a:	50 91 45 04 	lds	r21, 0x0445	; 0x800445 <position_float+0xf>
   2926e:	a9 96       	adiw	r28, 0x29	; 41
   29270:	ee ad       	ldd	r30, Y+62	; 0x3e
   29272:	ff ad       	ldd	r31, Y+63	; 0x3f
   29274:	a9 97       	sbiw	r28, 0x29	; 41
   29276:	60 81       	ld	r22, Z
   29278:	71 81       	ldd	r23, Z+1	; 0x01
   2927a:	82 81       	ldd	r24, Z+2	; 0x02
   2927c:	93 81       	ldd	r25, Z+3	; 0x03
   2927e:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
                             + sq(y - position_float[Y_AXIS])
                             + sq(z - position_float[Z_AXIS]));

        // all extrusion moves with LA require a compression which is proportional to the
        // extrusion_length to distance ratio (e/D)
        e_D_ratio = delta_e / delta_D;
   29282:	a7 01       	movw	r20, r14
   29284:	96 01       	movw	r18, r12
   29286:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   2928a:	6a 96       	adiw	r28, 0x1a	; 26
   2928c:	6c af       	std	Y+60, r22	; 0x3c
   2928e:	7d af       	std	Y+61, r23	; 0x3d
   29290:	8e af       	std	Y+62, r24	; 0x3e
   29292:	9f af       	std	Y+63, r25	; 0x3f
   29294:	6a 97       	sbiw	r28, 0x1a	; 26

        // Check for unusual high e_D ratio to detect if a retract move was combined with the last
        // print move due to min. steps per segment. Never execute this with advance! This assumes
        // no one will use a retract length of 0mm < retr_length < ~0.2mm and no one will print
        // 100mm wide lines using 3mm filament or 35mm wide lines using 1.75mm filament.
        if (e_D_ratio > 3.0)
   29296:	20 e0       	ldi	r18, 0x00	; 0
   29298:	30 e0       	ldi	r19, 0x00	; 0
   2929a:	40 e4       	ldi	r20, 0x40	; 64
   2929c:	50 e4       	ldi	r21, 0x40	; 64
   2929e:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   292a2:	18 16       	cp	r1, r24
   292a4:	0c f4       	brge	.+2      	; 0x292a8 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1842>
   292a6:	9e c0       	rjmp	.+316    	; 0x293e4 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x197e>
            block->use_advance_lead = false;
        else if (e_D_ratio > 0) {
   292a8:	20 e0       	ldi	r18, 0x00	; 0
   292aa:	30 e0       	ldi	r19, 0x00	; 0
   292ac:	a9 01       	movw	r20, r18
   292ae:	6a 96       	adiw	r28, 0x1a	; 26
   292b0:	6c ad       	ldd	r22, Y+60	; 0x3c
   292b2:	7d ad       	ldd	r23, Y+61	; 0x3d
   292b4:	8e ad       	ldd	r24, Y+62	; 0x3e
   292b6:	9f ad       	ldd	r25, Y+63	; 0x3f
   292b8:	6a 97       	sbiw	r28, 0x1a	; 26
   292ba:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   292be:	18 16       	cp	r1, r24
   292c0:	0c f0       	brlt	.+2      	; 0x292c4 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x185e>
   292c2:	42 c0       	rjmp	.+132    	; 0x29348 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x18e2>
            const uint32_t max_accel_steps_per_s2 = ceil(cs.max_jerk[E_AXIS] / (extruder_advance_K * e_D_ratio) * steps_per_mm);
   292c4:	6a 96       	adiw	r28, 0x1a	; 26
   292c6:	2c ad       	ldd	r18, Y+60	; 0x3c
   292c8:	3d ad       	ldd	r19, Y+61	; 0x3d
   292ca:	4e ad       	ldd	r20, Y+62	; 0x3e
   292cc:	5f ad       	ldd	r21, Y+63	; 0x3f
   292ce:	6a 97       	sbiw	r28, 0x1a	; 26
   292d0:	6d a5       	ldd	r22, Y+45	; 0x2d
   292d2:	7e a5       	ldd	r23, Y+46	; 0x2e
   292d4:	8f a5       	ldd	r24, Y+47	; 0x2f
   292d6:	98 a9       	ldd	r25, Y+48	; 0x30
   292d8:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   292dc:	9b 01       	movw	r18, r22
   292de:	ac 01       	movw	r20, r24
   292e0:	60 91 bb 0d 	lds	r22, 0x0DBB	; 0x800dbb <cs+0x54>
   292e4:	70 91 bc 0d 	lds	r23, 0x0DBC	; 0x800dbc <cs+0x55>
   292e8:	80 91 bd 0d 	lds	r24, 0x0DBD	; 0x800dbd <cs+0x56>
   292ec:	90 91 be 0d 	lds	r25, 0x0DBE	; 0x800dbe <cs+0x57>
   292f0:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   292f4:	29 a5       	ldd	r18, Y+41	; 0x29
   292f6:	3a a5       	ldd	r19, Y+42	; 0x2a
   292f8:	4b a5       	ldd	r20, Y+43	; 0x2b
   292fa:	5c a5       	ldd	r21, Y+44	; 0x2c
   292fc:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   29300:	0f 94 e6 a5 	call	0x34bcc	; 0x34bcc <ceil>
   29304:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   29308:	64 15       	cp	r22, r4
   2930a:	75 05       	cpc	r23, r5
   2930c:	86 05       	cpc	r24, r6
   2930e:	97 05       	cpc	r25, r7
   29310:	d8 f4       	brcc	.+54     	; 0x29348 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x18e2>
   29312:	2b 01       	movw	r4, r22
   29314:	3c 01       	movw	r6, r24
   29316:	18 c0       	rjmp	.+48     	; 0x29348 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x18e2>
    block->use_advance_lead = false;
    #endif
  }
  else
  {
    accel = ceil((block->steps[E_AXIS].wide ? cs.acceleration : cs.travel_acceleration) * steps_per_mm); // convert to: acceleration steps/sec^2
   29318:	60 91 27 0e 	lds	r22, 0x0E27	; 0x800e27 <cs+0xc0>
   2931c:	70 91 28 0e 	lds	r23, 0x0E28	; 0x800e28 <cs+0xc1>
   29320:	80 91 29 0e 	lds	r24, 0x0E29	; 0x800e29 <cs+0xc2>
   29324:	90 91 2a 0e 	lds	r25, 0x0E2A	; 0x800e2a <cs+0xc3>
   29328:	f1 ce       	rjmp	.-542    	; 0x2910c <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x16a6>
     *
     * extruder_advance_K       : There is an advance factor set.
     * delta_mm[E_AXIS] >= 0    : Extruding or traveling, but _not_ retracting.
     * |delta_mm[Z_AXIS]| < 0.5 : Z is only moved for leveling (_not_ for priming)
     */
    block->use_advance_lead = extruder_advance_K > 0
   2932a:	8e e6       	ldi	r24, 0x6E	; 110
   2932c:	82 9d       	mul	r24, r2
   2932e:	f0 01       	movw	r30, r0
   29330:	83 9d       	mul	r24, r3
   29332:	f0 0d       	add	r31, r0
   29334:	11 24       	eor	r1, r1
   29336:	e6 55       	subi	r30, 0x56	; 86
   29338:	f9 4f       	sbci	r31, 0xF9	; 249
   2933a:	10 82       	st	Z, r1
    block->nominal_speed *= speed_factor;
    block->nominal_rate *= speed_factor;
  }

#ifdef LIN_ADVANCE
  float e_D_ratio = 0;
   2933c:	6a 96       	adiw	r28, 0x1a	; 26
   2933e:	1c ae       	std	Y+60, r1	; 0x3c
   29340:	1d ae       	std	Y+61, r1	; 0x3d
   29342:	1e ae       	std	Y+62, r1	; 0x3e
   29344:	1f ae       	std	Y+63, r1	; 0x3f
   29346:	6a 97       	sbiw	r28, 0x1a	; 26
   29348:	10 e0       	ldi	r17, 0x00	; 0
   2934a:	00 e0       	ldi	r16, 0x00	; 0
    #endif

    // Limit acceleration per axis
    for (uint8_t axis = 0; axis < NUM_AXIS; axis++)
    {
      if(block->steps[axis].wide && max_acceleration_steps_per_s2[axis] < accel)
   2934c:	a3 96       	adiw	r28, 0x23	; 35
   2934e:	ee ad       	ldd	r30, Y+62	; 0x3e
   29350:	ff ad       	ldd	r31, Y+63	; 0x3f
   29352:	a3 97       	sbiw	r28, 0x23	; 35
   29354:	e0 0f       	add	r30, r16
   29356:	f1 1f       	adc	r31, r17
   29358:	e2 5a       	subi	r30, 0xA2	; 162
   2935a:	f9 4f       	sbci	r31, 0xF9	; 249
   2935c:	c0 80       	ld	r12, Z
   2935e:	d1 80       	ldd	r13, Z+1	; 0x01
   29360:	e2 80       	ldd	r14, Z+2	; 0x02
   29362:	f3 80       	ldd	r15, Z+3	; 0x03
   29364:	c1 14       	cp	r12, r1
   29366:	d1 04       	cpc	r13, r1
   29368:	e1 04       	cpc	r14, r1
   2936a:	f1 04       	cpc	r15, r1
   2936c:	a1 f1       	breq	.+104    	; 0x293d6 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1970>
   2936e:	f8 01       	movw	r30, r16
   29370:	e5 55       	subi	r30, 0x55	; 85
   29372:	fb 4f       	sbci	r31, 0xFB	; 251
   29374:	60 81       	ld	r22, Z
   29376:	71 81       	ldd	r23, Z+1	; 0x01
   29378:	82 81       	ldd	r24, Z+2	; 0x02
   2937a:	93 81       	ldd	r25, Z+3	; 0x03
   2937c:	64 15       	cp	r22, r4
   2937e:	75 05       	cpc	r23, r5
   29380:	86 05       	cpc	r24, r6
   29382:	97 05       	cpc	r25, r7
   29384:	40 f5       	brcc	.+80     	; 0x293d6 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1970>
      {
        const float max_possible = float(max_acceleration_steps_per_s2[axis]) * float(block->step_event_count.wide) / float(block->steps[axis].wide);
   29386:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   2938a:	29 ad       	ldd	r18, Y+57	; 0x39
   2938c:	3a ad       	ldd	r19, Y+58	; 0x3a
   2938e:	4b ad       	ldd	r20, Y+59	; 0x3b
   29390:	5c ad       	ldd	r21, Y+60	; 0x3c
   29392:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   29396:	4b 01       	movw	r8, r22
   29398:	5c 01       	movw	r10, r24
   2939a:	c7 01       	movw	r24, r14
   2939c:	b6 01       	movw	r22, r12
   2939e:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   293a2:	9b 01       	movw	r18, r22
   293a4:	ac 01       	movw	r20, r24
   293a6:	c5 01       	movw	r24, r10
   293a8:	b4 01       	movw	r22, r8
   293aa:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   293ae:	6b 01       	movw	r12, r22
   293b0:	7c 01       	movw	r14, r24
        if (max_possible < accel) accel = max_possible;
   293b2:	c3 01       	movw	r24, r6
   293b4:	b2 01       	movw	r22, r4
   293b6:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   293ba:	9b 01       	movw	r18, r22
   293bc:	ac 01       	movw	r20, r24
   293be:	c7 01       	movw	r24, r14
   293c0:	b6 01       	movw	r22, r12
   293c2:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   293c6:	87 ff       	sbrs	r24, 7
   293c8:	06 c0       	rjmp	.+12     	; 0x293d6 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1970>
   293ca:	c7 01       	movw	r24, r14
   293cc:	b6 01       	movw	r22, r12
   293ce:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   293d2:	2b 01       	movw	r4, r22
   293d4:	3c 01       	movw	r6, r24
   293d6:	0c 5f       	subi	r16, 0xFC	; 252
   293d8:	1f 4f       	sbci	r17, 0xFF	; 255
        }
    }
    #endif

    // Limit acceleration per axis
    for (uint8_t axis = 0; axis < NUM_AXIS; axis++)
   293da:	00 31       	cpi	r16, 0x10	; 16
   293dc:	11 05       	cpc	r17, r1
   293de:	09 f0       	breq	.+2      	; 0x293e2 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x197c>
   293e0:	b5 cf       	rjmp	.-150    	; 0x2934c <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x18e6>
   293e2:	01 c9       	rjmp	.-3582   	; 0x285e6 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xb80>
        // Check for unusual high e_D ratio to detect if a retract move was combined with the last
        // print move due to min. steps per segment. Never execute this with advance! This assumes
        // no one will use a retract length of 0mm < retr_length < ~0.2mm and no one will print
        // 100mm wide lines using 3mm filament or 35mm wide lines using 1.75mm filament.
        if (e_D_ratio > 3.0)
            block->use_advance_lead = false;
   293e4:	d8 01       	movw	r26, r16
   293e6:	1c 92       	st	X, r1
   293e8:	af cf       	rjmp	.-162    	; 0x29348 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x18e2>
              if (jerk > mjerk) {
                  safe_speed *= mjerk / jerk;
                  limited = true;
              }
          } else {
              safe_speed = cs.max_jerk[axis];
   293ea:	c9 a6       	std	Y+41, r12	; 0x29
   293ec:	dd a6       	std	Y+45, r13	; 0x2d
   293ee:	e9 ae       	std	Y+57, r14	; 0x39
   293f0:	f9 aa       	std	Y+49, r15	; 0x31
              limited = true;
   293f2:	21 e0       	ldi	r18, 0x01	; 1
   293f4:	2d ab       	std	Y+53, r18	; 0x35
   293f6:	b1 c9       	rjmp	.-3230   	; 0x2875a <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xcf4>
      // If this maximum velocity allowed is lower than the minimum of the entry / exit safe velocities,
      // then the machine is not coasting anymore and the safe entry / exit velocities shall be used.

      // The junction velocity will be shared between successive segments. Limit the junction velocity to their minimum.
      bool prev_speed_larger = previous_nominal_speed > block->nominal_speed;
      float smaller_speed_factor = prev_speed_larger ? (block->nominal_speed / previous_nominal_speed) : (previous_nominal_speed / block->nominal_speed);
   293f8:	27 96       	adiw	r28, 0x07	; 7
   293fa:	2f ad       	ldd	r18, Y+63	; 0x3f
   293fc:	27 97       	sbiw	r28, 0x07	; 7
   293fe:	2b 96       	adiw	r28, 0x0b	; 11
   29400:	3f ad       	ldd	r19, Y+63	; 0x3f
   29402:	2b 97       	sbiw	r28, 0x0b	; 11
   29404:	2f 96       	adiw	r28, 0x0f	; 15
   29406:	4f ad       	ldd	r20, Y+63	; 0x3f
   29408:	2f 97       	sbiw	r28, 0x0f	; 15
   2940a:	63 96       	adiw	r28, 0x13	; 19
   2940c:	5f ad       	ldd	r21, Y+63	; 0x3f
   2940e:	63 97       	sbiw	r28, 0x13	; 19
   29410:	6b 96       	adiw	r28, 0x1b	; 27
   29412:	6f ad       	ldd	r22, Y+63	; 0x3f
   29414:	6b 97       	sbiw	r28, 0x1b	; 27
   29416:	6f 96       	adiw	r28, 0x1f	; 31
   29418:	7f ad       	ldd	r23, Y+63	; 0x3f
   2941a:	6f 97       	sbiw	r28, 0x1f	; 31
   2941c:	c8 01       	movw	r24, r16
   2941e:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   29422:	eb 96       	adiw	r28, 0x3b	; 59
   29424:	6c af       	std	Y+60, r22	; 0x3c
   29426:	7d af       	std	Y+61, r23	; 0x3d
   29428:	8e af       	std	Y+62, r24	; 0x3e
   2942a:	9f af       	std	Y+63, r25	; 0x3f
   2942c:	eb 97       	sbiw	r28, 0x3b	; 59
      // Pick the smaller of the nominal speeds. Higher speed shall not be achieved at the junction during coasting.
      vmax_junction = prev_speed_larger ? block->nominal_speed : previous_nominal_speed;
   2942e:	6b 96       	adiw	r28, 0x1b	; 27
   29430:	ef ad       	ldd	r30, Y+63	; 0x3f
   29432:	6b 97       	sbiw	r28, 0x1b	; 27
   29434:	ed af       	std	Y+61, r30	; 0x3d
   29436:	6f 96       	adiw	r28, 0x1f	; 31
   29438:	ff ad       	ldd	r31, Y+63	; 0x3f
   2943a:	6f 97       	sbiw	r28, 0x1f	; 31
   2943c:	fd ab       	std	Y+53, r31	; 0x35
   2943e:	0e af       	std	Y+62, r16	; 0x3e
   29440:	23 96       	adiw	r28, 0x03	; 3
   29442:	1f af       	std	Y+63, r17	; 0x3f
   29444:	23 97       	sbiw	r28, 0x03	; 3
   29446:	04 ca       	rjmp	.-3064   	; 0x28850 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xdea>
              (v_exit > v_entry) ?
                  ((v_entry > 0.f || v_exit < 0.f) ?
                      // coasting
                      (v_exit - v_entry) :
                      // axis reversal
                      max(v_exit, - v_entry)) :
   29448:	f7 fa       	bst	r15, 7
   2944a:	f0 94       	com	r15
   2944c:	f7 f8       	bld	r15, 7
   2944e:	f0 94       	com	r15
   29450:	a5 01       	movw	r20, r10
   29452:	94 01       	movw	r18, r8
   29454:	c7 01       	movw	r24, r14
   29456:	b6 01       	movw	r22, r12
   29458:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   2945c:	87 ff       	sbrs	r24, 7
   2945e:	77 ca       	rjmp	.-2834   	; 0x2894e <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xee8>
                  // v_exit <= v_entry
                  ((v_entry < 0.f || v_exit > 0.f) ?
                      // coasting
                      (v_entry - v_exit) :
                      // axis reversal
                      max(- v_exit, v_entry));
   29460:	75 01       	movw	r14, r10
   29462:	64 01       	movw	r12, r8
   29464:	74 ca       	rjmp	.-2840   	; 0x2894e <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xee8>
                      // coasting
                      (v_exit - v_entry) :
                      // axis reversal
                      max(v_exit, - v_entry)) :
                  // v_exit <= v_entry
                  ((v_entry < 0.f || v_exit > 0.f) ?
   29466:	c7 01       	movw	r24, r14
   29468:	b6 01       	movw	r22, r12
   2946a:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   2946e:	87 fd       	sbrc	r24, 7
   29470:	09 c0       	rjmp	.+18     	; 0x29484 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1a1e>
   29472:	20 e0       	ldi	r18, 0x00	; 0
   29474:	30 e0       	ldi	r19, 0x00	; 0
   29476:	a9 01       	movw	r20, r18
   29478:	c5 01       	movw	r24, r10
   2947a:	b4 01       	movw	r22, r8
   2947c:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   29480:	18 16       	cp	r1, r24
   29482:	2c f4       	brge	.+10     	; 0x2948e <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1a28>
   29484:	a5 01       	movw	r20, r10
   29486:	94 01       	movw	r18, r8
   29488:	c7 01       	movw	r24, r14
   2948a:	b6 01       	movw	r22, r12
   2948c:	5c ca       	rjmp	.-2888   	; 0x28946 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xee0>
                      // coasting
                      (v_entry - v_exit) :
                      // axis reversal
                      max(- v_exit, v_entry));
   2948e:	b7 fa       	bst	r11, 7
   29490:	b0 94       	com	r11
   29492:	b7 f8       	bld	r11, 7
   29494:	b0 94       	com	r11
   29496:	a7 01       	movw	r20, r14
   29498:	96 01       	movw	r18, r12
   2949a:	c5 01       	movw	r24, r10
   2949c:	b4 01       	movw	r22, r8
   2949e:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   294a2:	18 16       	cp	r1, r24
   294a4:	0c f0       	brlt	.+2      	; 0x294a8 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1a42>
   294a6:	53 ca       	rjmp	.-2906   	; 0x2894e <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xee8>
   294a8:	db cf       	rjmp	.-74     	; 0x29460 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x19fa>
          // better to start the segment from start.
          block->flag |= BLOCK_FLAG_START_FROM_FULL_HALT;
          vmax_junction = safe_speed;
      }
  } else {
      block->flag |= BLOCK_FLAG_START_FROM_FULL_HALT;
   294aa:	8e e6       	ldi	r24, 0x6E	; 110
   294ac:	82 9d       	mul	r24, r2
   294ae:	f0 01       	movw	r30, r0
   294b0:	83 9d       	mul	r24, r3
   294b2:	f0 0d       	add	r31, r0
   294b4:	11 24       	eor	r1, r1
   294b6:	e2 5a       	subi	r30, 0xA2	; 162
   294b8:	f9 4f       	sbci	r31, 0xF9	; 249
   294ba:	85 a9       	ldd	r24, Z+53	; 0x35
   294bc:	84 60       	ori	r24, 0x04	; 4
   294be:	85 ab       	std	Z+53, r24	; 0x35
   294c0:	a9 a5       	ldd	r26, Y+41	; 0x29
   294c2:	ad af       	std	Y+61, r26	; 0x3d
   294c4:	bd a5       	ldd	r27, Y+45	; 0x2d
   294c6:	bd ab       	std	Y+53, r27	; 0x35
   294c8:	e9 ad       	ldd	r30, Y+57	; 0x39
   294ca:	ee af       	std	Y+62, r30	; 0x3e
   294cc:	f9 a9       	ldd	r31, Y+49	; 0x31
   294ce:	23 96       	adiw	r28, 0x03	; 3
   294d0:	ff af       	std	Y+63, r31	; 0x3f
   294d2:	23 97       	sbiw	r28, 0x03	; 3
   294d4:	bc ca       	rjmp	.-2696   	; 0x28a4e <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xfe8>
  // junction speeds in deceleration and acceleration, respectively. This is due to how the current
  // block nominal speed limits both the current and next maximum junction speeds. Hence, in both
  // the reverse and forward planners, the corresponding block junction speed will always be at the
  // the maximum junction speed and may always be ignored for any speed reduction checks.
  // Always calculate trapezoid for new block
  block->flag |= (block->nominal_speed <= v_allowable) ? (BLOCK_FLAG_NOMINAL_LENGTH | BLOCK_FLAG_RECALCULATE) : BLOCK_FLAG_RECALCULATE;
   294d6:	81 e0       	ldi	r24, 0x01	; 1
   294d8:	30 cb       	rjmp	.-2464   	; 0x28b3a <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x10d4>

      float advance_speed;
      if (e_D_ratio > 0)
          advance_speed = (extruder_advance_K * e_D_ratio * block->acceleration * cs.axis_steps_per_mm[E_AXIS]);
      else
          advance_speed = cs.max_jerk[E_AXIS] * cs.axis_steps_per_mm[E_AXIS];
   294da:	20 91 bb 0d 	lds	r18, 0x0DBB	; 0x800dbb <cs+0x54>
   294de:	30 91 bc 0d 	lds	r19, 0x0DBC	; 0x800dbc <cs+0x55>
   294e2:	40 91 bd 0d 	lds	r20, 0x0DBD	; 0x800dbd <cs+0x56>
   294e6:	50 91 be 0d 	lds	r21, 0x0DBE	; 0x800dbe <cs+0x57>
   294ea:	c7 01       	movw	r24, r14
   294ec:	b6 01       	movw	r22, r12
   294ee:	c1 cb       	rjmp	.-2174   	; 0x28c72 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x120c>
      float advance_rate = (F_CPU / 8.0) / advance_speed;
      if (advance_speed > 20000) {
          block->advance_rate = advance_rate * 4;
          block->advance_step_loops = 4;
      }
      else if (advance_speed > 10000) {
   294f0:	20 e0       	ldi	r18, 0x00	; 0
   294f2:	30 e4       	ldi	r19, 0x40	; 64
   294f4:	4c e1       	ldi	r20, 0x1C	; 28
   294f6:	56 e4       	ldi	r21, 0x46	; 70
   294f8:	c7 01       	movw	r24, r14
   294fa:	b6 01       	movw	r22, r12
   294fc:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   29500:	18 16       	cp	r1, r24
   29502:	d4 f4       	brge	.+52     	; 0x29538 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1ad2>
          block->advance_rate = advance_rate * 2;
   29504:	8e e6       	ldi	r24, 0x6E	; 110
   29506:	82 9d       	mul	r24, r2
   29508:	80 01       	movw	r16, r0
   2950a:	83 9d       	mul	r24, r3
   2950c:	10 0d       	add	r17, r0
   2950e:	11 24       	eor	r1, r1
   29510:	02 5a       	subi	r16, 0xA2	; 162
   29512:	19 4f       	sbci	r17, 0xF9	; 249
   29514:	78 01       	movw	r14, r16
   29516:	bd e4       	ldi	r27, 0x4D	; 77
   29518:	eb 0e       	add	r14, r27
   2951a:	f1 1c       	adc	r15, r1
   2951c:	a5 01       	movw	r20, r10
   2951e:	94 01       	movw	r18, r8
   29520:	c5 01       	movw	r24, r10
   29522:	b4 01       	movw	r22, r8
   29524:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   29528:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   2952c:	f7 01       	movw	r30, r14
   2952e:	71 83       	std	Z+1, r23	; 0x01
   29530:	60 83       	st	Z, r22
          block->advance_step_loops = 2;
   29532:	36 96       	adiw	r30, 0x06	; 6
   29534:	82 e0       	ldi	r24, 0x02	; 2
   29536:	e2 cb       	rjmp	.-2108   	; 0x28cfc <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1296>
      }
      else
      {
          // never overflow the internal accumulator with very low rates
          if (advance_rate < UINT16_MAX)
   29538:	20 e0       	ldi	r18, 0x00	; 0
   2953a:	3f ef       	ldi	r19, 0xFF	; 255
   2953c:	4f e7       	ldi	r20, 0x7F	; 127
   2953e:	57 e4       	ldi	r21, 0x47	; 71
   29540:	c5 01       	movw	r24, r10
   29542:	b4 01       	movw	r22, r8
   29544:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   29548:	87 ff       	sbrs	r24, 7
   2954a:	19 c0       	rjmp	.+50     	; 0x2957e <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1b18>
              block->advance_rate = advance_rate;
   2954c:	8e e6       	ldi	r24, 0x6E	; 110
   2954e:	82 9d       	mul	r24, r2
   29550:	80 01       	movw	r16, r0
   29552:	83 9d       	mul	r24, r3
   29554:	10 0d       	add	r17, r0
   29556:	11 24       	eor	r1, r1
   29558:	05 55       	subi	r16, 0x55	; 85
   2955a:	19 4f       	sbci	r17, 0xF9	; 249
   2955c:	c5 01       	movw	r24, r10
   2955e:	b4 01       	movw	r22, r8
   29560:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   29564:	d8 01       	movw	r26, r16
   29566:	6d 93       	st	X+, r22
   29568:	7c 93       	st	X, r23
          else
              block->advance_rate = UINT16_MAX;
          block->advance_step_loops = 1;
   2956a:	8e e6       	ldi	r24, 0x6E	; 110
   2956c:	82 9d       	mul	r24, r2
   2956e:	f0 01       	movw	r30, r0
   29570:	83 9d       	mul	r24, r3
   29572:	f0 0d       	add	r31, r0
   29574:	11 24       	eor	r1, r1
   29576:	ef 54       	subi	r30, 0x4F	; 79
   29578:	f9 4f       	sbci	r31, 0xF9	; 249
   2957a:	81 e0       	ldi	r24, 0x01	; 1
   2957c:	bf cb       	rjmp	.-2178   	; 0x28cfc <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1296>
      {
          // never overflow the internal accumulator with very low rates
          if (advance_rate < UINT16_MAX)
              block->advance_rate = advance_rate;
          else
              block->advance_rate = UINT16_MAX;
   2957e:	8e e6       	ldi	r24, 0x6E	; 110
   29580:	82 9d       	mul	r24, r2
   29582:	f0 01       	movw	r30, r0
   29584:	83 9d       	mul	r24, r3
   29586:	f0 0d       	add	r31, r0
   29588:	11 24       	eor	r1, r1
   2958a:	e5 55       	subi	r30, 0x55	; 85
   2958c:	f9 4f       	sbci	r31, 0xF9	; 249
   2958e:	8f ef       	ldi	r24, 0xFF	; 255
   29590:	9f ef       	ldi	r25, 0xFF	; 255
   29592:	91 83       	std	Z+1, r25	; 0x01
   29594:	80 83       	st	Z, r24
   29596:	e9 cf       	rjmp	.-46     	; 0x2956a <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1b04>
                break;
            }
            // If entry speed is already at the maximum entry speed, no need to recheck. Block is cruising.
            // If not, block in state of acceleration or deceleration. Reset entry speed to maximum and
            // check for maximum allowable speed reductions to ensure maximum possible planned speed.
            if (current->entry_speed != current->max_entry_speed) {
   29598:	f6 01       	movw	r30, r12
   2959a:	71 a4       	ldd	r7, Z+41	; 0x29
   2959c:	82 a4       	ldd	r8, Z+42	; 0x2a
   2959e:	93 a4       	ldd	r9, Z+43	; 0x2b
   295a0:	e4 a4       	ldd	r14, Z+44	; 0x2c
   295a2:	27 2d       	mov	r18, r7
   295a4:	38 2d       	mov	r19, r8
   295a6:	49 2d       	mov	r20, r9
   295a8:	5e 2d       	mov	r21, r14
   295aa:	65 a1       	ldd	r22, Z+37	; 0x25
   295ac:	76 a1       	ldd	r23, Z+38	; 0x26
   295ae:	87 a1       	ldd	r24, Z+39	; 0x27
   295b0:	90 a5       	ldd	r25, Z+40	; 0x28
   295b2:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   295b6:	88 23       	and	r24, r24
   295b8:	09 f4       	brne	.+2      	; 0x295bc <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1b56>
   295ba:	51 c0       	rjmp	.+162    	; 0x2965e <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1bf8>
                // If nominal length true, max junction speed is guaranteed to be reached even if decelerating to a jerk-from-zero velocity.
                // Only compute for max allowable speed if block is decelerating and nominal length is false.
                // entry_speed is uint16_t, 24 bits would be sufficient for block->acceleration and block->millimiteres, if scaled to um.
                // therefore an optimized assembly 24bit x 24bit -> 32bit multiply would be more than sufficient
                // together with an assembly 32bit->16bit sqrt function.
                current->entry_speed = ((current->flag & BLOCK_FLAG_NOMINAL_LENGTH) || current->max_entry_speed <= next->entry_speed) ?
   295bc:	01 fd       	sbrc	r16, 1
   295be:	44 c0       	rjmp	.+136    	; 0x29648 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1be2>
   295c0:	d5 01       	movw	r26, r10
   295c2:	95 96       	adiw	r26, 0x25	; 37
   295c4:	2d 90       	ld	r2, X+
   295c6:	3d 90       	ld	r3, X+
   295c8:	4d 90       	ld	r4, X+
   295ca:	5c 90       	ld	r5, X
   295cc:	98 97       	sbiw	r26, 0x28	; 40
   295ce:	a2 01       	movw	r20, r4
   295d0:	91 01       	movw	r18, r2
   295d2:	67 2d       	mov	r22, r7
   295d4:	78 2d       	mov	r23, r8
   295d6:	89 2d       	mov	r24, r9
   295d8:	9e 2d       	mov	r25, r14
   295da:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   295de:	18 16       	cp	r1, r24
   295e0:	9c f5       	brge	.+102    	; 0x29648 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1be2>
// Calculates the maximum allowable entry speed, when you must be able to reach target_velocity using the
// decceleration within the allotted distance.
FORCE_INLINE float max_allowable_entry_speed(float decceleration, float target_velocity, float distance)
{
    // assert(decceleration < 0);
    return  sqrt(target_velocity*target_velocity-2*decceleration*distance);
   295e2:	a2 01       	movw	r20, r4
   295e4:	91 01       	movw	r18, r2
   295e6:	c2 01       	movw	r24, r4
   295e8:	b1 01       	movw	r22, r2
   295ea:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   295ee:	1b 01       	movw	r2, r22
   295f0:	2c 01       	movw	r4, r24
                // therefore an optimized assembly 24bit x 24bit -> 32bit multiply would be more than sufficient
                // together with an assembly 32bit->16bit sqrt function.
                current->entry_speed = ((current->flag & BLOCK_FLAG_NOMINAL_LENGTH) || current->max_entry_speed <= next->entry_speed) ?
                    current->max_entry_speed :
                    // min(current->max_entry_speed, sqrt(next->entry_speed*next->entry_speed+2*current->acceleration*current->millimeters));
                    min(current->max_entry_speed, max_allowable_entry_speed(-current->acceleration,next->entry_speed,current->millimeters));
   295f2:	f6 01       	movw	r30, r12
   295f4:	61 a9       	ldd	r22, Z+49	; 0x31
   295f6:	72 a9       	ldd	r23, Z+50	; 0x32
   295f8:	83 a9       	ldd	r24, Z+51	; 0x33
   295fa:	94 a9       	ldd	r25, Z+52	; 0x34
   295fc:	90 58       	subi	r25, 0x80	; 128
// Calculates the maximum allowable entry speed, when you must be able to reach target_velocity using the
// decceleration within the allotted distance.
FORCE_INLINE float max_allowable_entry_speed(float decceleration, float target_velocity, float distance)
{
    // assert(decceleration < 0);
    return  sqrt(target_velocity*target_velocity-2*decceleration*distance);
   295fe:	9b 01       	movw	r18, r22
   29600:	ac 01       	movw	r20, r24
   29602:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   29606:	d6 01       	movw	r26, r12
   29608:	9d 96       	adiw	r26, 0x2d	; 45
   2960a:	2d 91       	ld	r18, X+
   2960c:	3d 91       	ld	r19, X+
   2960e:	4d 91       	ld	r20, X+
   29610:	5c 91       	ld	r21, X
   29612:	d0 97       	sbiw	r26, 0x30	; 48
   29614:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   29618:	9b 01       	movw	r18, r22
   2961a:	ac 01       	movw	r20, r24
   2961c:	c2 01       	movw	r24, r4
   2961e:	b1 01       	movw	r22, r2
   29620:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   29624:	0f 94 d6 a8 	call	0x351ac	; 0x351ac <sqrt>
   29628:	2b 01       	movw	r4, r22
   2962a:	5c 01       	movw	r10, r24
                // therefore an optimized assembly 24bit x 24bit -> 32bit multiply would be more than sufficient
                // together with an assembly 32bit->16bit sqrt function.
                current->entry_speed = ((current->flag & BLOCK_FLAG_NOMINAL_LENGTH) || current->max_entry_speed <= next->entry_speed) ?
                    current->max_entry_speed :
                    // min(current->max_entry_speed, sqrt(next->entry_speed*next->entry_speed+2*current->acceleration*current->millimeters));
                    min(current->max_entry_speed, max_allowable_entry_speed(-current->acceleration,next->entry_speed,current->millimeters));
   2962c:	9b 01       	movw	r18, r22
   2962e:	ac 01       	movw	r20, r24
   29630:	67 2d       	mov	r22, r7
   29632:	78 2d       	mov	r23, r8
   29634:	89 2d       	mov	r24, r9
   29636:	9e 2d       	mov	r25, r14
   29638:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   2963c:	87 fd       	sbrc	r24, 7
   2963e:	04 c0       	rjmp	.+8      	; 0x29648 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1be2>
   29640:	74 2c       	mov	r7, r4
   29642:	85 2c       	mov	r8, r5
   29644:	9a 2c       	mov	r9, r10
   29646:	eb 2c       	mov	r14, r11
                // If nominal length true, max junction speed is guaranteed to be reached even if decelerating to a jerk-from-zero velocity.
                // Only compute for max allowable speed if block is decelerating and nominal length is false.
                // entry_speed is uint16_t, 24 bits would be sufficient for block->acceleration and block->millimiteres, if scaled to um.
                // therefore an optimized assembly 24bit x 24bit -> 32bit multiply would be more than sufficient
                // together with an assembly 32bit->16bit sqrt function.
                current->entry_speed = ((current->flag & BLOCK_FLAG_NOMINAL_LENGTH) || current->max_entry_speed <= next->entry_speed) ?
   29648:	87 2d       	mov	r24, r7
   2964a:	98 2d       	mov	r25, r8
   2964c:	a9 2d       	mov	r26, r9
   2964e:	be 2d       	mov	r27, r14
   29650:	f6 01       	movw	r30, r12
   29652:	85 a3       	std	Z+37, r24	; 0x25
   29654:	96 a3       	std	Z+38, r25	; 0x26
   29656:	a7 a3       	std	Z+39, r26	; 0x27
   29658:	b0 a7       	std	Z+40, r27	; 0x28
                    current->max_entry_speed :
                    // min(current->max_entry_speed, sqrt(next->entry_speed*next->entry_speed+2*current->acceleration*current->millimeters));
                    min(current->max_entry_speed, max_allowable_entry_speed(-current->acceleration,next->entry_speed,current->millimeters));
                current->flag |= BLOCK_FLAG_RECALCULATE;
   2965a:	01 60       	ori	r16, 0x01	; 1
   2965c:	05 ab       	std	Z+53, r16	; 0x35
}


// Returns the index of the previous block in the ring buffer
static inline uint8_t prev_block_index(uint8_t block_index) {
  if (block_index == 0)
   2965e:	11 11       	cpse	r17, r1
   29660:	01 c0       	rjmp	.+2      	; 0x29664 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1bfe>
    block_index = BLOCK_BUFFER_SIZE;
   29662:	10 e1       	ldi	r17, 0x10	; 16
  -- block_index;
   29664:	11 50       	subi	r17, 0x01	; 1
                    // min(current->max_entry_speed, sqrt(next->entry_speed*next->entry_speed+2*current->acceleration*current->millimeters));
                    min(current->max_entry_speed, max_allowable_entry_speed(-current->acceleration,next->entry_speed,current->millimeters));
                current->flag |= BLOCK_FLAG_RECALCULATE;
            }
            next = current;
            current = block_buffer + (block_index = prev_block_index(block_index));
   29666:	16 9d       	mul	r17, r6
   29668:	c0 01       	movw	r24, r0
   2966a:	11 24       	eor	r1, r1
                    current->max_entry_speed :
                    // min(current->max_entry_speed, sqrt(next->entry_speed*next->entry_speed+2*current->acceleration*current->millimeters));
                    min(current->max_entry_speed, max_allowable_entry_speed(-current->acceleration,next->entry_speed,current->millimeters));
                current->flag |= BLOCK_FLAG_RECALCULATE;
            }
            next = current;
   2966c:	56 01       	movw	r10, r12
            current = block_buffer + (block_index = prev_block_index(block_index));
   2966e:	9c 01       	movw	r18, r24
   29670:	22 5a       	subi	r18, 0xA2	; 162
   29672:	39 4f       	sbci	r19, 0xF9	; 249
   29674:	69 01       	movw	r12, r18
   29676:	0b cc       	rjmp	.-2026   	; 0x28e8e <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1428>
                calculate_trapezoid_for_block(prev, prev->entry_speed, current->entry_speed);
                // Reset current only to ensure next trapezoid is computed.
                prev->flag &= ~BLOCK_FLAG_RECALCULATE;
            }
            prev = current;
            current = block_buffer + (block_index = next_block_index(block_index));
   29678:	6c 01       	movw	r12, r24
   2967a:	2f cc       	rjmp	.-1954   	; 0x28eda <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0x1474>
   2967c:	8f bf       	out	0x3f, r24	; 63
    __asm__ volatile ("" ::: "memory");
   2967e:	0d 94 9a 3d 	jmp	0x27b34	; 0x27b34 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)+0xce>

00029682 <plan_set_position_curposXYZE()>:

void plan_buffer_line_destinationXYZE(float feed_rate) {
    plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feed_rate);
}

void plan_set_position_curposXYZE(){
   29682:	4f 92       	push	r4
   29684:	5f 92       	push	r5
   29686:	6f 92       	push	r6
   29688:	7f 92       	push	r7
   2968a:	8f 92       	push	r8
   2968c:	9f 92       	push	r9
   2968e:	af 92       	push	r10
   29690:	bf 92       	push	r11
   29692:	cf 92       	push	r12
   29694:	df 92       	push	r13
   29696:	ef 92       	push	r14
   29698:	ff 92       	push	r15
   2969a:	cf 93       	push	r28
   2969c:	df 93       	push	r29
   2969e:	cd b7       	in	r28, 0x3d	; 61
   296a0:	de b7       	in	r29, 0x3e	; 62
   296a2:	2c 97       	sbiw	r28, 0x0c	; 12
   296a4:	0f b6       	in	r0, 0x3f	; 63
   296a6:	f8 94       	cli
   296a8:	de bf       	out	0x3e, r29	; 62
   296aa:	0f be       	out	0x3f, r0	; 63
   296ac:	cd bf       	out	0x3d, r28	; 61
    plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
   296ae:	c0 90 69 12 	lds	r12, 0x1269	; 0x801269 <current_position+0x8>
   296b2:	d0 90 6a 12 	lds	r13, 0x126A	; 0x80126a <current_position+0x9>
   296b6:	e0 90 6b 12 	lds	r14, 0x126B	; 0x80126b <current_position+0xa>
   296ba:	f0 90 6c 12 	lds	r15, 0x126C	; 0x80126c <current_position+0xb>
   296be:	80 91 65 12 	lds	r24, 0x1265	; 0x801265 <current_position+0x4>
   296c2:	90 91 66 12 	lds	r25, 0x1266	; 0x801266 <current_position+0x5>
   296c6:	a0 91 67 12 	lds	r26, 0x1267	; 0x801267 <current_position+0x6>
   296ca:	b0 91 68 12 	lds	r27, 0x1268	; 0x801268 <current_position+0x7>
   296ce:	40 91 61 12 	lds	r20, 0x1261	; 0x801261 <current_position>
   296d2:	50 91 62 12 	lds	r21, 0x1262	; 0x801262 <current_position+0x1>
   296d6:	60 91 63 12 	lds	r22, 0x1263	; 0x801263 <current_position+0x2>
   296da:	70 91 64 12 	lds	r23, 0x1264	; 0x801264 <current_position+0x3>
   296de:	4d 83       	std	Y+5, r20	; 0x05
   296e0:	5e 83       	std	Y+6, r21	; 0x06
   296e2:	6f 83       	std	Y+7, r22	; 0x07
   296e4:	78 87       	std	Y+8, r23	; 0x08
   296e6:	89 83       	std	Y+1, r24	; 0x01
   296e8:	9a 83       	std	Y+2, r25	; 0x02
   296ea:	ab 83       	std	Y+3, r26	; 0x03
   296ec:	bc 83       	std	Y+4, r27	; 0x04
  ENABLE_STEPPER_DRIVER_INTERRUPT();
}

void plan_set_position(float x, float y, float z, const float &e)
{
    world2machine(x, y);
   296ee:	be 01       	movw	r22, r28
   296f0:	6f 5f       	subi	r22, 0xFF	; 255
   296f2:	7f 4f       	sbci	r23, 0xFF	; 255
   296f4:	ce 01       	movw	r24, r28
   296f6:	05 96       	adiw	r24, 0x05	; 5
   296f8:	0e 94 76 68 	call	0xd0ec	; 0xd0ec <world2machine(float&, float&)>

  position[X_AXIS] = lround(x*cs.axis_steps_per_mm[X_AXIS]);
   296fc:	4d 80       	ldd	r4, Y+5	; 0x05
   296fe:	5e 80       	ldd	r5, Y+6	; 0x06
   29700:	6f 80       	ldd	r6, Y+7	; 0x07
   29702:	78 84       	ldd	r7, Y+8	; 0x08
   29704:	20 91 6b 0d 	lds	r18, 0x0D6B	; 0x800d6b <cs+0x4>
   29708:	30 91 6c 0d 	lds	r19, 0x0D6C	; 0x800d6c <cs+0x5>
   2970c:	40 91 6d 0d 	lds	r20, 0x0D6D	; 0x800d6d <cs+0x6>
   29710:	50 91 6e 0d 	lds	r21, 0x0D6E	; 0x800d6e <cs+0x7>
   29714:	c3 01       	movw	r24, r6
   29716:	b2 01       	movw	r22, r4
   29718:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2971c:	0f 94 45 a8 	call	0x3508a	; 0x3508a <lround>
   29720:	60 93 3c 06 	sts	0x063C, r22	; 0x80063c <position>
   29724:	70 93 3d 06 	sts	0x063D, r23	; 0x80063d <position+0x1>
   29728:	80 93 3e 06 	sts	0x063E, r24	; 0x80063e <position+0x2>
   2972c:	90 93 3f 06 	sts	0x063F, r25	; 0x80063f <position+0x3>
  position[Y_AXIS] = lround(y*cs.axis_steps_per_mm[Y_AXIS]);
   29730:	89 80       	ldd	r8, Y+1	; 0x01
   29732:	9a 80       	ldd	r9, Y+2	; 0x02
   29734:	ab 80       	ldd	r10, Y+3	; 0x03
   29736:	bc 80       	ldd	r11, Y+4	; 0x04
   29738:	20 91 6f 0d 	lds	r18, 0x0D6F	; 0x800d6f <cs+0x8>
   2973c:	30 91 70 0d 	lds	r19, 0x0D70	; 0x800d70 <cs+0x9>
   29740:	40 91 71 0d 	lds	r20, 0x0D71	; 0x800d71 <cs+0xa>
   29744:	50 91 72 0d 	lds	r21, 0x0D72	; 0x800d72 <cs+0xb>
   29748:	c5 01       	movw	r24, r10
   2974a:	b4 01       	movw	r22, r8
   2974c:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   29750:	0f 94 45 a8 	call	0x3508a	; 0x3508a <lround>
   29754:	60 93 40 06 	sts	0x0640, r22	; 0x800640 <position+0x4>
   29758:	70 93 41 06 	sts	0x0641, r23	; 0x800641 <position+0x5>
   2975c:	80 93 42 06 	sts	0x0642, r24	; 0x800642 <position+0x6>
   29760:	90 93 43 06 	sts	0x0643, r25	; 0x800643 <position+0x7>
#ifdef MESH_BED_LEVELING
  position[Z_AXIS] = mbl.active ?
   29764:	80 91 09 13 	lds	r24, 0x1309	; 0x801309 <mbl>
   29768:	88 23       	and	r24, r24
   2976a:	09 f4       	brne	.+2      	; 0x2976e <plan_set_position_curposXYZE()+0xec>
   2976c:	8c c0       	rjmp	.+280    	; 0x29886 <plan_set_position_curposXYZE()+0x204>
    lround((z+mbl.get_z(x, y))*cs.axis_steps_per_mm[Z_AXIS]) :
   2976e:	a5 01       	movw	r20, r10
   29770:	94 01       	movw	r18, r8
   29772:	c3 01       	movw	r24, r6
   29774:	b2 01       	movw	r22, r4
   29776:	0f 94 78 91 	call	0x322f0	; 0x322f0 <mesh_bed_leveling::get_z(float, float) [clone .constprop.344]>
   2977a:	9b 01       	movw	r18, r22
   2977c:	ac 01       	movw	r20, r24
   2977e:	c7 01       	movw	r24, r14
   29780:	b6 01       	movw	r22, r12
   29782:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   29786:	20 91 73 0d 	lds	r18, 0x0D73	; 0x800d73 <cs+0xc>
   2978a:	30 91 74 0d 	lds	r19, 0x0D74	; 0x800d74 <cs+0xd>
   2978e:	40 91 75 0d 	lds	r20, 0x0D75	; 0x800d75 <cs+0xe>
   29792:	50 91 76 0d 	lds	r21, 0x0D76	; 0x800d76 <cs+0xf>
    lround(z*cs.axis_steps_per_mm[Z_AXIS]);
   29796:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
    world2machine(x, y);

  position[X_AXIS] = lround(x*cs.axis_steps_per_mm[X_AXIS]);
  position[Y_AXIS] = lround(y*cs.axis_steps_per_mm[Y_AXIS]);
#ifdef MESH_BED_LEVELING
  position[Z_AXIS] = mbl.active ?
   2979a:	0f 94 45 a8 	call	0x3508a	; 0x3508a <lround>
   2979e:	60 93 44 06 	sts	0x0644, r22	; 0x800644 <position+0x8>
   297a2:	70 93 45 06 	sts	0x0645, r23	; 0x800645 <position+0x9>
   297a6:	80 93 46 06 	sts	0x0646, r24	; 0x800646 <position+0xa>
   297aa:	90 93 47 06 	sts	0x0647, r25	; 0x800647 <position+0xb>
    lround((z+mbl.get_z(x, y))*cs.axis_steps_per_mm[Z_AXIS]) :
    lround(z*cs.axis_steps_per_mm[Z_AXIS]);
#else
  position[Z_AXIS] = lround(z*cs.axis_steps_per_mm[Z_AXIS]);
#endif // ENABLE_MESH_BED_LEVELING
  position[E_AXIS] = lround(e*cs.axis_steps_per_mm[E_AXIS]);
   297ae:	80 91 6d 12 	lds	r24, 0x126D	; 0x80126d <current_position+0xc>
   297b2:	90 91 6e 12 	lds	r25, 0x126E	; 0x80126e <current_position+0xd>
   297b6:	a0 91 6f 12 	lds	r26, 0x126F	; 0x80126f <current_position+0xe>
   297ba:	b0 91 70 12 	lds	r27, 0x1270	; 0x801270 <current_position+0xf>
   297be:	89 87       	std	Y+9, r24	; 0x09
   297c0:	9a 87       	std	Y+10, r25	; 0x0a
   297c2:	ab 87       	std	Y+11, r26	; 0x0b
   297c4:	bc 87       	std	Y+12, r27	; 0x0c
   297c6:	20 91 77 0d 	lds	r18, 0x0D77	; 0x800d77 <cs+0x10>
   297ca:	30 91 78 0d 	lds	r19, 0x0D78	; 0x800d78 <cs+0x11>
   297ce:	40 91 79 0d 	lds	r20, 0x0D79	; 0x800d79 <cs+0x12>
   297d2:	50 91 7a 0d 	lds	r21, 0x0D7A	; 0x800d7a <cs+0x13>
   297d6:	bc 01       	movw	r22, r24
   297d8:	cd 01       	movw	r24, r26
   297da:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   297de:	0f 94 45 a8 	call	0x3508a	; 0x3508a <lround>
   297e2:	60 93 48 06 	sts	0x0648, r22	; 0x800648 <position+0xc>
   297e6:	70 93 49 06 	sts	0x0649, r23	; 0x800649 <position+0xd>
   297ea:	80 93 4a 06 	sts	0x064A, r24	; 0x80064a <position+0xe>
   297ee:	90 93 4b 06 	sts	0x064B, r25	; 0x80064b <position+0xf>
  #ifdef LIN_ADVANCE
  position_float[X_AXIS] = x;
   297f2:	40 92 36 04 	sts	0x0436, r4	; 0x800436 <position_float>
   297f6:	50 92 37 04 	sts	0x0437, r5	; 0x800437 <position_float+0x1>
   297fa:	60 92 38 04 	sts	0x0438, r6	; 0x800438 <position_float+0x2>
   297fe:	70 92 39 04 	sts	0x0439, r7	; 0x800439 <position_float+0x3>
  position_float[Y_AXIS] = y;
   29802:	80 92 3a 04 	sts	0x043A, r8	; 0x80043a <position_float+0x4>
   29806:	90 92 3b 04 	sts	0x043B, r9	; 0x80043b <position_float+0x5>
   2980a:	a0 92 3c 04 	sts	0x043C, r10	; 0x80043c <position_float+0x6>
   2980e:	b0 92 3d 04 	sts	0x043D, r11	; 0x80043d <position_float+0x7>
  position_float[Z_AXIS] = z;
   29812:	c0 92 3e 04 	sts	0x043E, r12	; 0x80043e <position_float+0x8>
   29816:	d0 92 3f 04 	sts	0x043F, r13	; 0x80043f <position_float+0x9>
   2981a:	e0 92 40 04 	sts	0x0440, r14	; 0x800440 <position_float+0xa>
   2981e:	f0 92 41 04 	sts	0x0441, r15	; 0x800441 <position_float+0xb>
  position_float[E_AXIS] = e;
   29822:	89 85       	ldd	r24, Y+9	; 0x09
   29824:	9a 85       	ldd	r25, Y+10	; 0x0a
   29826:	ab 85       	ldd	r26, Y+11	; 0x0b
   29828:	bc 85       	ldd	r27, Y+12	; 0x0c
   2982a:	80 93 42 04 	sts	0x0442, r24	; 0x800442 <position_float+0xc>
   2982e:	90 93 43 04 	sts	0x0443, r25	; 0x800443 <position_float+0xd>
   29832:	a0 93 44 04 	sts	0x0444, r26	; 0x800444 <position_float+0xe>
   29836:	b0 93 45 04 	sts	0x0445, r27	; 0x800445 <position_float+0xf>
  #endif
  st_set_position(position);
   2983a:	0f 94 65 79 	call	0x2f2ca	; 0x2f2ca <st_set_position(long const*) [clone .constprop.125]>
  previous_nominal_speed = 0.0; // Resets planner junction speeds. Assumes start from rest.
   2983e:	10 92 22 04 	sts	0x0422, r1	; 0x800422 <_ZL22previous_nominal_speed.lto_priv.445>
   29842:	10 92 23 04 	sts	0x0423, r1	; 0x800423 <_ZL22previous_nominal_speed.lto_priv.445+0x1>
   29846:	10 92 24 04 	sts	0x0424, r1	; 0x800424 <_ZL22previous_nominal_speed.lto_priv.445+0x2>
   2984a:	10 92 25 04 	sts	0x0425, r1	; 0x800425 <_ZL22previous_nominal_speed.lto_priv.445+0x3>
  memset(previous_speed, 0, sizeof(previous_speed));
   2984e:	e6 e2       	ldi	r30, 0x26	; 38
   29850:	f4 e0       	ldi	r31, 0x04	; 4
   29852:	80 e1       	ldi	r24, 0x10	; 16
   29854:	df 01       	movw	r26, r30
   29856:	1d 92       	st	X+, r1
   29858:	8a 95       	dec	r24
   2985a:	e9 f7       	brne	.-6      	; 0x29856 <plan_set_position_curposXYZE()+0x1d4>
    plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feed_rate);
}

void plan_set_position_curposXYZE(){
    plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
}
   2985c:	2c 96       	adiw	r28, 0x0c	; 12
   2985e:	0f b6       	in	r0, 0x3f	; 63
   29860:	f8 94       	cli
   29862:	de bf       	out	0x3e, r29	; 62
   29864:	0f be       	out	0x3f, r0	; 63
   29866:	cd bf       	out	0x3d, r28	; 61
   29868:	df 91       	pop	r29
   2986a:	cf 91       	pop	r28
   2986c:	ff 90       	pop	r15
   2986e:	ef 90       	pop	r14
   29870:	df 90       	pop	r13
   29872:	cf 90       	pop	r12
   29874:	bf 90       	pop	r11
   29876:	af 90       	pop	r10
   29878:	9f 90       	pop	r9
   2987a:	8f 90       	pop	r8
   2987c:	7f 90       	pop	r7
   2987e:	6f 90       	pop	r6
   29880:	5f 90       	pop	r5
   29882:	4f 90       	pop	r4
   29884:	08 95       	ret
  position[X_AXIS] = lround(x*cs.axis_steps_per_mm[X_AXIS]);
  position[Y_AXIS] = lround(y*cs.axis_steps_per_mm[Y_AXIS]);
#ifdef MESH_BED_LEVELING
  position[Z_AXIS] = mbl.active ?
    lround((z+mbl.get_z(x, y))*cs.axis_steps_per_mm[Z_AXIS]) :
    lround(z*cs.axis_steps_per_mm[Z_AXIS]);
   29886:	20 91 73 0d 	lds	r18, 0x0D73	; 0x800d73 <cs+0xc>
   2988a:	30 91 74 0d 	lds	r19, 0x0D74	; 0x800d74 <cs+0xd>
   2988e:	40 91 75 0d 	lds	r20, 0x0D75	; 0x800d75 <cs+0xe>
   29892:	50 91 76 0d 	lds	r21, 0x0D76	; 0x800d76 <cs+0xf>
   29896:	c7 01       	movw	r24, r14
   29898:	b6 01       	movw	r22, r12
   2989a:	7d cf       	rjmp	.-262    	; 0x29796 <plan_set_position_curposXYZE()+0x114>

0002989c <plan_buffer_line_destinationXYZE(float)>:

void plan_buffer_line_curposXYZE(float feed_rate) {
    plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], feed_rate);
}

void plan_buffer_line_destinationXYZE(float feed_rate) {
   2989c:	8f 92       	push	r8
   2989e:	9f 92       	push	r9
   298a0:	af 92       	push	r10
   298a2:	bf 92       	push	r11
   298a4:	cf 92       	push	r12
   298a6:	df 92       	push	r13
   298a8:	ef 92       	push	r14
   298aa:	ff 92       	push	r15
   298ac:	0f 93       	push	r16
   298ae:	1f 93       	push	r17
   298b0:	4b 01       	movw	r8, r22
   298b2:	5c 01       	movw	r10, r24
    plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feed_rate);
   298b4:	e9 e2       	ldi	r30, 0x29	; 41
   298b6:	f6 e0       	ldi	r31, 0x06	; 6
   298b8:	e0 84       	ldd	r14, Z+8	; 0x08
   298ba:	f1 84       	ldd	r15, Z+9	; 0x09
   298bc:	02 85       	ldd	r16, Z+10	; 0x0a
   298be:	13 85       	ldd	r17, Z+11	; 0x0b
   298c0:	24 81       	ldd	r18, Z+4	; 0x04
   298c2:	35 81       	ldd	r19, Z+5	; 0x05
   298c4:	46 81       	ldd	r20, Z+6	; 0x06
   298c6:	57 81       	ldd	r21, Z+7	; 0x07
   298c8:	60 81       	ld	r22, Z
   298ca:	71 81       	ldd	r23, Z+1	; 0x01
   298cc:	82 81       	ldd	r24, Z+2	; 0x02
   298ce:	93 81       	ldd	r25, Z+3	; 0x03
   298d0:	1f 92       	push	r1
   298d2:	1f 92       	push	r1
   298d4:	1f 92       	push	r1
   298d6:	1f 92       	push	r1
   298d8:	e5 e3       	ldi	r30, 0x35	; 53
   298da:	ce 2e       	mov	r12, r30
   298dc:	e6 e0       	ldi	r30, 0x06	; 6
   298de:	de 2e       	mov	r13, r30
   298e0:	0f 94 33 3d 	call	0x27a66	; 0x27a66 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)>
   298e4:	0f 90       	pop	r0
   298e6:	0f 90       	pop	r0
   298e8:	0f 90       	pop	r0
   298ea:	0f 90       	pop	r0
}
   298ec:	1f 91       	pop	r17
   298ee:	0f 91       	pop	r16
   298f0:	ff 90       	pop	r15
   298f2:	ef 90       	pop	r14
   298f4:	df 90       	pop	r13
   298f6:	cf 90       	pop	r12
   298f8:	bf 90       	pop	r11
   298fa:	af 90       	pop	r10
   298fc:	9f 90       	pop	r9
   298fe:	8f 90       	pop	r8
   29900:	08 95       	ret

00029902 <plan_buffer_line_curposXYZE(float)>:
    // Reset position sync requests
    plan_reset_next_e_queue = false;
    plan_reset_next_e_sched = false;
}

void plan_buffer_line_curposXYZE(float feed_rate) {
   29902:	8f 92       	push	r8
   29904:	9f 92       	push	r9
   29906:	af 92       	push	r10
   29908:	bf 92       	push	r11
   2990a:	cf 92       	push	r12
   2990c:	df 92       	push	r13
   2990e:	ef 92       	push	r14
   29910:	ff 92       	push	r15
   29912:	0f 93       	push	r16
   29914:	1f 93       	push	r17
   29916:	4b 01       	movw	r8, r22
   29918:	5c 01       	movw	r10, r24
    plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], feed_rate);
   2991a:	e1 e6       	ldi	r30, 0x61	; 97
   2991c:	f2 e1       	ldi	r31, 0x12	; 18
   2991e:	e0 84       	ldd	r14, Z+8	; 0x08
   29920:	f1 84       	ldd	r15, Z+9	; 0x09
   29922:	02 85       	ldd	r16, Z+10	; 0x0a
   29924:	13 85       	ldd	r17, Z+11	; 0x0b
   29926:	24 81       	ldd	r18, Z+4	; 0x04
   29928:	35 81       	ldd	r19, Z+5	; 0x05
   2992a:	46 81       	ldd	r20, Z+6	; 0x06
   2992c:	57 81       	ldd	r21, Z+7	; 0x07
   2992e:	60 81       	ld	r22, Z
   29930:	71 81       	ldd	r23, Z+1	; 0x01
   29932:	82 81       	ldd	r24, Z+2	; 0x02
   29934:	93 81       	ldd	r25, Z+3	; 0x03
   29936:	1f 92       	push	r1
   29938:	1f 92       	push	r1
   2993a:	1f 92       	push	r1
   2993c:	1f 92       	push	r1
   2993e:	ed e6       	ldi	r30, 0x6D	; 109
   29940:	ce 2e       	mov	r12, r30
   29942:	e2 e1       	ldi	r30, 0x12	; 18
   29944:	de 2e       	mov	r13, r30
   29946:	0f 94 33 3d 	call	0x27a66	; 0x27a66 <plan_buffer_line(float, float, float, float const&, float, float const*, unsigned int)>
   2994a:	0f 90       	pop	r0
   2994c:	0f 90       	pop	r0
   2994e:	0f 90       	pop	r0
   29950:	0f 90       	pop	r0
}
   29952:	1f 91       	pop	r17
   29954:	0f 91       	pop	r16
   29956:	ff 90       	pop	r15
   29958:	ef 90       	pop	r14
   2995a:	df 90       	pop	r13
   2995c:	cf 90       	pop	r12
   2995e:	bf 90       	pop	r11
   29960:	af 90       	pop	r10
   29962:	9f 90       	pop	r9
   29964:	8f 90       	pop	r8
   29966:	08 95       	ret

00029968 <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]>:
	}
}


static void _lcd_move(const char *name, uint8_t axis, int min, int max)
{
   29968:	2f 92       	push	r2
   2996a:	3f 92       	push	r3
   2996c:	4f 92       	push	r4
   2996e:	5f 92       	push	r5
   29970:	6f 92       	push	r6
   29972:	7f 92       	push	r7
   29974:	9f 92       	push	r9
   29976:	af 92       	push	r10
   29978:	bf 92       	push	r11
   2997a:	cf 92       	push	r12
   2997c:	df 92       	push	r13
   2997e:	ef 92       	push	r14
   29980:	ff 92       	push	r15
   29982:	0f 93       	push	r16
   29984:	1f 93       	push	r17
   29986:	cf 93       	push	r28
   29988:	df 93       	push	r29
    if (homing_flag || mesh_bed_leveling_flag)
   2998a:	70 91 71 12 	lds	r23, 0x1271	; 0x801271 <homing_flag>
   2998e:	71 11       	cpse	r23, r1
   29990:	04 c0       	rjmp	.+8      	; 0x2999a <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]+0x32>
   29992:	70 91 72 12 	lds	r23, 0x1272	; 0x801272 <mesh_bed_leveling_flag>
   29996:	77 23       	and	r23, r23
   29998:	99 f0       	breq	.+38     	; 0x299c0 <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]+0x58>
	    lcd_set_cursor(0, 1);
		menu_draw_float31(name, current_position[axis]);
	}
	if (menu_leaving || LCD_CLICKED) (void)enable_endstops(_md->endstopsEnabledPrevious);
    menu_back_if_clicked();
}
   2999a:	df 91       	pop	r29
   2999c:	cf 91       	pop	r28
   2999e:	1f 91       	pop	r17
   299a0:	0f 91       	pop	r16
   299a2:	ff 90       	pop	r15
   299a4:	ef 90       	pop	r14
   299a6:	df 90       	pop	r13
   299a8:	cf 90       	pop	r12
   299aa:	bf 90       	pop	r11
   299ac:	af 90       	pop	r10
   299ae:	9f 90       	pop	r9
   299b0:	7f 90       	pop	r7
   299b2:	6f 90       	pop	r6
   299b4:	5f 90       	pop	r5
   299b6:	4f 90       	pop	r4
   299b8:	3f 90       	pop	r3
   299ba:	2f 90       	pop	r2
static void _lcd_move(const char *name, uint8_t axis, int min, int max)
{
    if (homing_flag || mesh_bed_leveling_flag)
    {
        // printer entered a new state where axis move is forbidden
        menu_back();
   299bc:	0c 94 1b 63 	jmp	0xc636	; 0xc636 <menu_back()>
		bool initialized;              // 1byte
		bool endstopsEnabledPrevious;  // 1byte
	} _menu_data_t;
	static_assert(sizeof(menu_data)>= sizeof(_menu_data_t),"_menu_data_t doesn't fit into menu_data");
	_menu_data_t* _md = (_menu_data_t*)&(menu_data[0]);
	if (!_md->initialized)
   299c0:	70 91 96 03 	lds	r23, 0x0396	; 0x800396 <menu_data>
   299c4:	71 11       	cpse	r23, r1
   299c6:	09 c0       	rjmp	.+18     	; 0x299da <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]+0x72>
  return hit;
}

bool enable_endstops(bool check)
{
  bool old = check_endstops;
   299c8:	70 91 77 02 	lds	r23, 0x0277	; 0x800277 <_ZL14check_endstops.lto_priv.387>
  check_endstops = check;
   299cc:	10 92 77 02 	sts	0x0277, r1	; 0x800277 <_ZL14check_endstops.lto_priv.387>
	{
		_md->endstopsEnabledPrevious = enable_endstops(false);
   299d0:	70 93 97 03 	sts	0x0397, r23	; 0x800397 <menu_data+0x1>
		_md->initialized = true;
   299d4:	71 e0       	ldi	r23, 0x01	; 1
   299d6:	70 93 96 03 	sts	0x0396, r23	; 0x800396 <menu_data>
   299da:	19 01       	movw	r2, r18
   299dc:	6a 01       	movw	r12, r20
   299de:	c6 2f       	mov	r28, r22
   299e0:	d9 2f       	mov	r29, r25
   299e2:	98 2e       	mov	r9, r24
	}
	if (lcd_encoder != 0)
   299e4:	80 91 1e 06 	lds	r24, 0x061E	; 0x80061e <lcd_encoder>
   299e8:	90 91 1f 06 	lds	r25, 0x061F	; 0x80061f <lcd_encoder+0x1>
   299ec:	89 2b       	or	r24, r25
   299ee:	09 f4       	brne	.+2      	; 0x299f2 <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]+0x8a>
   299f0:	71 c0       	rjmp	.+226    	; 0x29ad4 <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]+0x16c>
	{
		refresh_cmd_timeout();
   299f2:	0e 94 41 65 	call	0xca82	; 0xca82 <refresh_cmd_timeout()>
}

FORCE_INLINE bool planner_queue_full() {
    uint8_t next_block_index = block_buffer_head;
   299f6:	80 91 3e 0d 	lds	r24, 0x0D3E	; 0x800d3e <block_buffer_head>
    if (++ next_block_index == BLOCK_BUFFER_SIZE)
   299fa:	8f 5f       	subi	r24, 0xFF	; 255
   299fc:	80 31       	cpi	r24, 0x10	; 16
   299fe:	09 f4       	brne	.+2      	; 0x29a02 <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]+0x9a>
        next_block_index = 0;
   29a00:	80 e0       	ldi	r24, 0x00	; 0
    return block_buffer_tail == next_block_index;
   29a02:	90 91 3f 0d 	lds	r25, 0x0D3F	; 0x800d3f <block_buffer_tail>
		if (! planner_queue_full())
   29a06:	98 17       	cp	r25, r24
   29a08:	09 f4       	brne	.+2      	; 0x29a0c <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]+0xa4>
   29a0a:	64 c0       	rjmp	.+200    	; 0x29ad4 <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]+0x16c>
		{
			current_position[axis] += lcd_encoder;
   29a0c:	84 e0       	ldi	r24, 0x04	; 4
   29a0e:	c8 9f       	mul	r28, r24
   29a10:	80 01       	movw	r16, r0
   29a12:	11 24       	eor	r1, r1
   29a14:	f8 01       	movw	r30, r16
   29a16:	ef 59       	subi	r30, 0x9F	; 159
   29a18:	fd 4e       	sbci	r31, 0xED	; 237
   29a1a:	5f 01       	movw	r10, r30
   29a1c:	60 91 1e 06 	lds	r22, 0x061E	; 0x80061e <lcd_encoder>
   29a20:	70 91 1f 06 	lds	r23, 0x061F	; 0x80061f <lcd_encoder+0x1>
   29a24:	07 2e       	mov	r0, r23
   29a26:	00 0c       	add	r0, r0
   29a28:	88 0b       	sbc	r24, r24
   29a2a:	99 0b       	sbc	r25, r25
   29a2c:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   29a30:	f5 01       	movw	r30, r10
   29a32:	20 81       	ld	r18, Z
   29a34:	31 81       	ldd	r19, Z+1	; 0x01
   29a36:	42 81       	ldd	r20, Z+2	; 0x02
   29a38:	53 81       	ldd	r21, Z+3	; 0x03
   29a3a:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   29a3e:	2b 01       	movw	r4, r22
   29a40:	3c 01       	movw	r6, r24
			if (min_software_endstops && current_position[axis] < min) current_position[axis] = min;
   29a42:	b6 01       	movw	r22, r12
   29a44:	dd 0c       	add	r13, r13
   29a46:	88 0b       	sbc	r24, r24
   29a48:	99 0b       	sbc	r25, r25
   29a4a:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   29a4e:	6b 01       	movw	r12, r22
   29a50:	7c 01       	movw	r14, r24
   29a52:	ac 01       	movw	r20, r24
   29a54:	9b 01       	movw	r18, r22
   29a56:	c3 01       	movw	r24, r6
   29a58:	b2 01       	movw	r22, r4
   29a5a:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   29a5e:	f5 01       	movw	r30, r10
   29a60:	87 fd       	sbrc	r24, 7
   29a62:	7d c0       	rjmp	.+250    	; 0x29b5e <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]+0x1f6>
	if (lcd_encoder != 0)
	{
		refresh_cmd_timeout();
		if (! planner_queue_full())
		{
			current_position[axis] += lcd_encoder;
   29a64:	40 82       	st	Z, r4
   29a66:	51 82       	std	Z+1, r5	; 0x01
   29a68:	62 82       	std	Z+2, r6	; 0x02
   29a6a:	73 82       	std	Z+3, r7	; 0x03
			if (min_software_endstops && current_position[axis] < min) current_position[axis] = min;
			if (max_software_endstops && current_position[axis] > max) current_position[axis] = max;
   29a6c:	b1 01       	movw	r22, r2
   29a6e:	33 0c       	add	r3, r3
   29a70:	88 0b       	sbc	r24, r24
   29a72:	99 0b       	sbc	r25, r25
   29a74:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   29a78:	2b 01       	movw	r4, r22
   29a7a:	3c 01       	movw	r6, r24
   29a7c:	c8 01       	movw	r24, r16
   29a7e:	8f 59       	subi	r24, 0x9F	; 159
   29a80:	9d 4e       	sbci	r25, 0xED	; 237
   29a82:	7c 01       	movw	r14, r24
   29a84:	a3 01       	movw	r20, r6
   29a86:	92 01       	movw	r18, r4
   29a88:	fc 01       	movw	r30, r24
   29a8a:	60 81       	ld	r22, Z
   29a8c:	71 81       	ldd	r23, Z+1	; 0x01
   29a8e:	82 81       	ldd	r24, Z+2	; 0x02
   29a90:	93 81       	ldd	r25, Z+3	; 0x03
   29a92:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   29a96:	18 16       	cp	r1, r24
   29a98:	2c f4       	brge	.+10     	; 0x29aa4 <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]+0x13c>
   29a9a:	f7 01       	movw	r30, r14
   29a9c:	40 82       	st	Z, r4
   29a9e:	51 82       	std	Z+1, r5	; 0x01
   29aa0:	62 82       	std	Z+2, r6	; 0x02
   29aa2:	73 82       	std	Z+3, r7	; 0x03
			lcd_encoder = 0;
   29aa4:	10 92 1f 06 	sts	0x061F, r1	; 0x80061f <lcd_encoder+0x1>
   29aa8:	10 92 1e 06 	sts	0x061E, r1	; 0x80061e <lcd_encoder>
			world2machine_clamp(current_position[X_AXIS], current_position[Y_AXIS]);
   29aac:	65 e6       	ldi	r22, 0x65	; 101
   29aae:	72 e1       	ldi	r23, 0x12	; 18
   29ab0:	81 e6       	ldi	r24, 0x61	; 97
   29ab2:	92 e1       	ldi	r25, 0x12	; 18
   29ab4:	0e 94 1e 69 	call	0xd23c	; 0xd23c <world2machine_clamp(float&, float&)>
			plan_buffer_line_curposXYZE(get_feedrate_mm_s(manual_feedrate[axis]));
   29ab8:	f8 01       	movw	r30, r16
   29aba:	e0 52       	subi	r30, 0x20	; 32
   29abc:	fd 4f       	sbci	r31, 0xFD	; 253
   29abe:	60 81       	ld	r22, Z
   29ac0:	71 81       	ldd	r23, Z+1	; 0x01
   29ac2:	82 81       	ldd	r24, Z+2	; 0x02
   29ac4:	93 81       	ldd	r25, Z+3	; 0x03
   29ac6:	0e 94 45 65 	call	0xca8a	; 0xca8a <get_feedrate_mm_s(float)>
   29aca:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
			lcd_draw_update = 1;
   29ace:	81 e0       	ldi	r24, 0x01	; 1
   29ad0:	80 93 59 02 	sts	0x0259, r24	; 0x800259 <lcd_draw_update>
		}
	}
	if (lcd_draw_update)
   29ad4:	80 91 59 02 	lds	r24, 0x0259	; 0x800259 <lcd_draw_update>
   29ad8:	88 23       	and	r24, r24
   29ada:	11 f1       	breq	.+68     	; 0x29b20 <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]+0x1b8>
	{
	    lcd_set_cursor(0, 1);
   29adc:	61 e0       	ldi	r22, 0x01	; 1
   29ade:	80 e0       	ldi	r24, 0x00	; 0
   29ae0:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
		menu_draw_float31(name, current_position[axis]);
   29ae4:	84 e0       	ldi	r24, 0x04	; 4
   29ae6:	c8 9f       	mul	r28, r24
   29ae8:	f0 01       	movw	r30, r0
   29aea:	11 24       	eor	r1, r1
   29aec:	ef 59       	subi	r30, 0x9F	; 159
   29aee:	fd 4e       	sbci	r31, 0xED	; 237
//! The text needs to come with a colon ":", this function does not append it anymore.
//! That resulted in a much shorter implementation (234628B -> 234476B)
//! There are similar functions around which may be shortened in a similar way
void menu_draw_float31(const char* str, float val)
{
	lcd_printf_P(menu_fmt_float31, str, val);
   29af0:	83 81       	ldd	r24, Z+3	; 0x03
   29af2:	8f 93       	push	r24
   29af4:	82 81       	ldd	r24, Z+2	; 0x02
   29af6:	8f 93       	push	r24
   29af8:	81 81       	ldd	r24, Z+1	; 0x01
   29afa:	8f 93       	push	r24
   29afc:	80 81       	ld	r24, Z
   29afe:	8f 93       	push	r24
   29b00:	df 93       	push	r29
   29b02:	9f 92       	push	r9
   29b04:	8a e5       	ldi	r24, 0x5A	; 90
   29b06:	92 e8       	ldi	r25, 0x82	; 130
   29b08:	9f 93       	push	r25
   29b0a:	8f 93       	push	r24
   29b0c:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
   29b10:	ed b7       	in	r30, 0x3d	; 61
   29b12:	fe b7       	in	r31, 0x3e	; 62
   29b14:	38 96       	adiw	r30, 0x08	; 8
   29b16:	0f b6       	in	r0, 0x3f	; 63
   29b18:	f8 94       	cli
   29b1a:	fe bf       	out	0x3e, r31	; 62
   29b1c:	0f be       	out	0x3f, r0	; 63
   29b1e:	ed bf       	out	0x3d, r30	; 61
	}
	if (menu_leaving || LCD_CLICKED) (void)enable_endstops(_md->endstopsEnabledPrevious);
   29b20:	80 91 c4 03 	lds	r24, 0x03C4	; 0x8003c4 <menu_leaving>
   29b24:	81 11       	cpse	r24, r1
   29b26:	04 c0       	rjmp	.+8      	; 0x29b30 <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]+0x1c8>
   29b28:	80 91 95 03 	lds	r24, 0x0395	; 0x800395 <lcd_click_trigger>
   29b2c:	88 23       	and	r24, r24
   29b2e:	21 f0       	breq	.+8      	; 0x29b38 <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]+0x1d0>
   29b30:	80 91 97 03 	lds	r24, 0x0397	; 0x800397 <menu_data+0x1>
   29b34:	80 93 77 02 	sts	0x0277, r24	; 0x800277 <_ZL14check_endstops.lto_priv.387>
    menu_back_if_clicked();
}
   29b38:	df 91       	pop	r29
   29b3a:	cf 91       	pop	r28
   29b3c:	1f 91       	pop	r17
   29b3e:	0f 91       	pop	r16
   29b40:	ff 90       	pop	r15
   29b42:	ef 90       	pop	r14
   29b44:	df 90       	pop	r13
   29b46:	cf 90       	pop	r12
   29b48:	bf 90       	pop	r11
   29b4a:	af 90       	pop	r10
   29b4c:	9f 90       	pop	r9
   29b4e:	7f 90       	pop	r7
   29b50:	6f 90       	pop	r6
   29b52:	5f 90       	pop	r5
   29b54:	4f 90       	pop	r4
   29b56:	3f 90       	pop	r3
   29b58:	2f 90       	pop	r2
	{
	    lcd_set_cursor(0, 1);
		menu_draw_float31(name, current_position[axis]);
	}
	if (menu_leaving || LCD_CLICKED) (void)enable_endstops(_md->endstopsEnabledPrevious);
    menu_back_if_clicked();
   29b5a:	0c 94 06 74 	jmp	0xe80c	; 0xe80c <menu_back_if_clicked()>
	{
		refresh_cmd_timeout();
		if (! planner_queue_full())
		{
			current_position[axis] += lcd_encoder;
			if (min_software_endstops && current_position[axis] < min) current_position[axis] = min;
   29b5e:	c0 82       	st	Z, r12
   29b60:	d1 82       	std	Z+1, r13	; 0x01
   29b62:	e2 82       	std	Z+2, r14	; 0x02
   29b64:	f3 82       	std	Z+3, r15	; 0x03
   29b66:	82 cf       	rjmp	.-252    	; 0x29a6c <_lcd_move(char const*, unsigned char, int, int) [clone .lto_priv.408]+0x104>

00029b68 <planner_reset_position()>:
#endif /* PLANNER_DIAGNOSTICS */

extern volatile uint32_t step_events_completed; // The number of step events executed in the current block

void planner_reset_position()
{
   29b68:	4f 92       	push	r4
   29b6a:	5f 92       	push	r5
   29b6c:	6f 92       	push	r6
   29b6e:	7f 92       	push	r7
   29b70:	8f 92       	push	r8
   29b72:	9f 92       	push	r9
   29b74:	af 92       	push	r10
   29b76:	bf 92       	push	r11
   29b78:	cf 92       	push	r12
   29b7a:	df 92       	push	r13
   29b7c:	ef 92       	push	r14
   29b7e:	ff 92       	push	r15
   29b80:	cf 93       	push	r28
    // First update the planner's current position in the physical motor steps.
    position[X_AXIS] = st_get_position(X_AXIS);
   29b82:	80 e0       	ldi	r24, 0x00	; 0
   29b84:	0f 94 d9 1a 	call	0x235b2	; 0x235b2 <st_get_position(unsigned char)>
   29b88:	60 93 3c 06 	sts	0x063C, r22	; 0x80063c <position>
   29b8c:	70 93 3d 06 	sts	0x063D, r23	; 0x80063d <position+0x1>
   29b90:	80 93 3e 06 	sts	0x063E, r24	; 0x80063e <position+0x2>
   29b94:	90 93 3f 06 	sts	0x063F, r25	; 0x80063f <position+0x3>
    position[Y_AXIS] = st_get_position(Y_AXIS);
   29b98:	81 e0       	ldi	r24, 0x01	; 1
   29b9a:	0f 94 d9 1a 	call	0x235b2	; 0x235b2 <st_get_position(unsigned char)>
   29b9e:	60 93 40 06 	sts	0x0640, r22	; 0x800640 <position+0x4>
   29ba2:	70 93 41 06 	sts	0x0641, r23	; 0x800641 <position+0x5>
   29ba6:	80 93 42 06 	sts	0x0642, r24	; 0x800642 <position+0x6>
   29baa:	90 93 43 06 	sts	0x0643, r25	; 0x800643 <position+0x7>
    position[Z_AXIS] = st_get_position(Z_AXIS);
   29bae:	82 e0       	ldi	r24, 0x02	; 2
   29bb0:	0f 94 d9 1a 	call	0x235b2	; 0x235b2 <st_get_position(unsigned char)>
   29bb4:	60 93 44 06 	sts	0x0644, r22	; 0x800644 <position+0x8>
   29bb8:	70 93 45 06 	sts	0x0645, r23	; 0x800645 <position+0x9>
   29bbc:	80 93 46 06 	sts	0x0646, r24	; 0x800646 <position+0xa>
   29bc0:	90 93 47 06 	sts	0x0647, r25	; 0x800647 <position+0xb>
    position[E_AXIS] = st_get_position(E_AXIS);
   29bc4:	83 e0       	ldi	r24, 0x03	; 3
   29bc6:	0f 94 d9 1a 	call	0x235b2	; 0x235b2 <st_get_position(unsigned char)>
   29bca:	60 93 48 06 	sts	0x0648, r22	; 0x800648 <position+0xc>
   29bce:	70 93 49 06 	sts	0x0649, r23	; 0x800649 <position+0xd>
   29bd2:	80 93 4a 06 	sts	0x064A, r24	; 0x80064a <position+0xe>
   29bd6:	90 93 4b 06 	sts	0x064B, r25	; 0x80064b <position+0xf>

    // Second update the current position of the front end.
    current_position[X_AXIS] = st_get_position_mm(X_AXIS);
   29bda:	80 e0       	ldi	r24, 0x00	; 0
   29bdc:	0f 94 e7 1a 	call	0x235ce	; 0x235ce <st_get_position_mm(unsigned char)>
   29be0:	60 93 61 12 	sts	0x1261, r22	; 0x801261 <current_position>
   29be4:	70 93 62 12 	sts	0x1262, r23	; 0x801262 <current_position+0x1>
   29be8:	80 93 63 12 	sts	0x1263, r24	; 0x801263 <current_position+0x2>
   29bec:	90 93 64 12 	sts	0x1264, r25	; 0x801264 <current_position+0x3>
    current_position[Y_AXIS] = st_get_position_mm(Y_AXIS);
   29bf0:	81 e0       	ldi	r24, 0x01	; 1
   29bf2:	0f 94 e7 1a 	call	0x235ce	; 0x235ce <st_get_position_mm(unsigned char)>
   29bf6:	60 93 65 12 	sts	0x1265, r22	; 0x801265 <current_position+0x4>
   29bfa:	70 93 66 12 	sts	0x1266, r23	; 0x801266 <current_position+0x5>
   29bfe:	80 93 67 12 	sts	0x1267, r24	; 0x801267 <current_position+0x6>
   29c02:	90 93 68 12 	sts	0x1268, r25	; 0x801268 <current_position+0x7>
    current_position[Z_AXIS] = st_get_position_mm(Z_AXIS);
   29c06:	82 e0       	ldi	r24, 0x02	; 2
   29c08:	0f 94 e7 1a 	call	0x235ce	; 0x235ce <st_get_position_mm(unsigned char)>
   29c0c:	60 93 69 12 	sts	0x1269, r22	; 0x801269 <current_position+0x8>
   29c10:	70 93 6a 12 	sts	0x126A, r23	; 0x80126a <current_position+0x9>
   29c14:	80 93 6b 12 	sts	0x126B, r24	; 0x80126b <current_position+0xa>
   29c18:	90 93 6c 12 	sts	0x126C, r25	; 0x80126c <current_position+0xb>
    current_position[E_AXIS] = st_get_position_mm(E_AXIS);
   29c1c:	83 e0       	ldi	r24, 0x03	; 3
   29c1e:	0f 94 e7 1a 	call	0x235ce	; 0x235ce <st_get_position_mm(unsigned char)>
   29c22:	60 93 6d 12 	sts	0x126D, r22	; 0x80126d <current_position+0xc>
   29c26:	70 93 6e 12 	sts	0x126E, r23	; 0x80126e <current_position+0xd>
   29c2a:	80 93 6f 12 	sts	0x126F, r24	; 0x80126f <current_position+0xe>
   29c2e:	90 93 70 12 	sts	0x1270, r25	; 0x801270 <current_position+0xf>

    // Apply the mesh bed leveling correction to the Z axis.
#ifdef MESH_BED_LEVELING
    if (mbl.active) {
   29c32:	80 91 09 13 	lds	r24, 0x1309	; 0x801309 <mbl>
   29c36:	88 23       	and	r24, r24
   29c38:	31 f1       	breq	.+76     	; 0x29c86 <planner_reset_position()+0x11e>
#if 1
        // Undo the bed level correction so the current Z position is reversible wrt. the machine coordinates.
        // This does not necessary mean that the Z position will be the same as linearly interpolated from the source G-code line.
        current_position[Z_AXIS] -= mbl.get_z(current_position[X_AXIS], current_position[Y_AXIS]);
   29c3a:	20 91 65 12 	lds	r18, 0x1265	; 0x801265 <current_position+0x4>
   29c3e:	30 91 66 12 	lds	r19, 0x1266	; 0x801266 <current_position+0x5>
   29c42:	40 91 67 12 	lds	r20, 0x1267	; 0x801267 <current_position+0x6>
   29c46:	50 91 68 12 	lds	r21, 0x1268	; 0x801268 <current_position+0x7>
   29c4a:	60 91 61 12 	lds	r22, 0x1261	; 0x801261 <current_position>
   29c4e:	70 91 62 12 	lds	r23, 0x1262	; 0x801262 <current_position+0x1>
   29c52:	80 91 63 12 	lds	r24, 0x1263	; 0x801263 <current_position+0x2>
   29c56:	90 91 64 12 	lds	r25, 0x1264	; 0x801264 <current_position+0x3>
   29c5a:	0f 94 78 91 	call	0x322f0	; 0x322f0 <mesh_bed_leveling::get_z(float, float) [clone .constprop.344]>
   29c5e:	9b 01       	movw	r18, r22
   29c60:	ac 01       	movw	r20, r24
   29c62:	60 91 69 12 	lds	r22, 0x1269	; 0x801269 <current_position+0x8>
   29c66:	70 91 6a 12 	lds	r23, 0x126A	; 0x80126a <current_position+0x9>
   29c6a:	80 91 6b 12 	lds	r24, 0x126B	; 0x80126b <current_position+0xa>
   29c6e:	90 91 6c 12 	lds	r25, 0x126C	; 0x80126c <current_position+0xb>
   29c72:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   29c76:	60 93 69 12 	sts	0x1269, r22	; 0x801269 <current_position+0x8>
   29c7a:	70 93 6a 12 	sts	0x126A, r23	; 0x80126a <current_position+0x9>
   29c7e:	80 93 6b 12 	sts	0x126B, r24	; 0x80126b <current_position+0xa>
   29c82:	90 93 6c 12 	sts	0x126C, r25	; 0x80126c <current_position+0xb>
	}
}

inline void machine2world(float &x, float &y)
{
	if (world2machine_correction_mode == WORLD2MACHINE_CORRECTION_NONE) {
   29c86:	c0 91 a2 04 	lds	r28, 0x04A2	; 0x8004a2 <world2machine_correction_mode>
   29c8a:	cc 23       	and	r28, r28
   29c8c:	09 f4       	brne	.+2      	; 0x29c90 <planner_reset_position()+0x128>
   29c8e:	9a c0       	rjmp	.+308    	; 0x29dc4 <planner_reset_position()+0x25c>
		// No correction.
	} else {
		if (world2machine_correction_mode & WORLD2MACHINE_CORRECTION_SHIFT) {
   29c90:	c0 ff       	sbrs	r28, 0
   29c92:	34 c0       	rjmp	.+104    	; 0x29cfc <planner_reset_position()+0x194>
			// Then add the offset.
			x -= world2machine_shift[0];
   29c94:	20 91 9a 04 	lds	r18, 0x049A	; 0x80049a <world2machine_shift>
   29c98:	30 91 9b 04 	lds	r19, 0x049B	; 0x80049b <world2machine_shift+0x1>
   29c9c:	40 91 9c 04 	lds	r20, 0x049C	; 0x80049c <world2machine_shift+0x2>
   29ca0:	50 91 9d 04 	lds	r21, 0x049D	; 0x80049d <world2machine_shift+0x3>
   29ca4:	60 91 61 12 	lds	r22, 0x1261	; 0x801261 <current_position>
   29ca8:	70 91 62 12 	lds	r23, 0x1262	; 0x801262 <current_position+0x1>
   29cac:	80 91 63 12 	lds	r24, 0x1263	; 0x801263 <current_position+0x2>
   29cb0:	90 91 64 12 	lds	r25, 0x1264	; 0x801264 <current_position+0x3>
   29cb4:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   29cb8:	60 93 61 12 	sts	0x1261, r22	; 0x801261 <current_position>
   29cbc:	70 93 62 12 	sts	0x1262, r23	; 0x801262 <current_position+0x1>
   29cc0:	80 93 63 12 	sts	0x1263, r24	; 0x801263 <current_position+0x2>
   29cc4:	90 93 64 12 	sts	0x1264, r25	; 0x801264 <current_position+0x3>
			y -= world2machine_shift[1];
   29cc8:	20 91 9e 04 	lds	r18, 0x049E	; 0x80049e <world2machine_shift+0x4>
   29ccc:	30 91 9f 04 	lds	r19, 0x049F	; 0x80049f <world2machine_shift+0x5>
   29cd0:	40 91 a0 04 	lds	r20, 0x04A0	; 0x8004a0 <world2machine_shift+0x6>
   29cd4:	50 91 a1 04 	lds	r21, 0x04A1	; 0x8004a1 <world2machine_shift+0x7>
   29cd8:	60 91 65 12 	lds	r22, 0x1265	; 0x801265 <current_position+0x4>
   29cdc:	70 91 66 12 	lds	r23, 0x1266	; 0x801266 <current_position+0x5>
   29ce0:	80 91 67 12 	lds	r24, 0x1267	; 0x801267 <current_position+0x6>
   29ce4:	90 91 68 12 	lds	r25, 0x1268	; 0x801268 <current_position+0x7>
   29ce8:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   29cec:	60 93 65 12 	sts	0x1265, r22	; 0x801265 <current_position+0x4>
   29cf0:	70 93 66 12 	sts	0x1266, r23	; 0x801266 <current_position+0x5>
   29cf4:	80 93 67 12 	sts	0x1267, r24	; 0x801267 <current_position+0x6>
   29cf8:	90 93 68 12 	sts	0x1268, r25	; 0x801268 <current_position+0x7>
		}
		if (world2machine_correction_mode & WORLD2MACHINE_CORRECTION_SKEW) {
   29cfc:	c1 ff       	sbrs	r28, 1
   29cfe:	62 c0       	rjmp	.+196    	; 0x29dc4 <planner_reset_position()+0x25c>
			// Firs the skew & rotation correction.
			float out_x = world2machine_rotation_and_skew_inv[0][0] * x + world2machine_rotation_and_skew_inv[0][1] * y;
   29d00:	80 90 61 12 	lds	r8, 0x1261	; 0x801261 <current_position>
   29d04:	90 90 62 12 	lds	r9, 0x1262	; 0x801262 <current_position+0x1>
   29d08:	a0 90 63 12 	lds	r10, 0x1263	; 0x801263 <current_position+0x2>
   29d0c:	b0 90 64 12 	lds	r11, 0x1264	; 0x801264 <current_position+0x3>
   29d10:	c0 90 65 12 	lds	r12, 0x1265	; 0x801265 <current_position+0x4>
   29d14:	d0 90 66 12 	lds	r13, 0x1266	; 0x801266 <current_position+0x5>
   29d18:	e0 90 67 12 	lds	r14, 0x1267	; 0x801267 <current_position+0x6>
   29d1c:	f0 90 68 12 	lds	r15, 0x1268	; 0x801268 <current_position+0x7>
			float out_y = world2machine_rotation_and_skew_inv[1][0] * x + world2machine_rotation_and_skew_inv[1][1] * y;
   29d20:	20 91 92 04 	lds	r18, 0x0492	; 0x800492 <world2machine_rotation_and_skew_inv+0x8>
   29d24:	30 91 93 04 	lds	r19, 0x0493	; 0x800493 <world2machine_rotation_and_skew_inv+0x9>
   29d28:	40 91 94 04 	lds	r20, 0x0494	; 0x800494 <world2machine_rotation_and_skew_inv+0xa>
   29d2c:	50 91 95 04 	lds	r21, 0x0495	; 0x800495 <world2machine_rotation_and_skew_inv+0xb>
   29d30:	c5 01       	movw	r24, r10
   29d32:	b4 01       	movw	r22, r8
   29d34:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   29d38:	2b 01       	movw	r4, r22
   29d3a:	3c 01       	movw	r6, r24
   29d3c:	20 91 96 04 	lds	r18, 0x0496	; 0x800496 <world2machine_rotation_and_skew_inv+0xc>
   29d40:	30 91 97 04 	lds	r19, 0x0497	; 0x800497 <world2machine_rotation_and_skew_inv+0xd>
   29d44:	40 91 98 04 	lds	r20, 0x0498	; 0x800498 <world2machine_rotation_and_skew_inv+0xe>
   29d48:	50 91 99 04 	lds	r21, 0x0499	; 0x800499 <world2machine_rotation_and_skew_inv+0xf>
   29d4c:	c7 01       	movw	r24, r14
   29d4e:	b6 01       	movw	r22, r12
   29d50:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   29d54:	9b 01       	movw	r18, r22
   29d56:	ac 01       	movw	r20, r24
   29d58:	c3 01       	movw	r24, r6
   29d5a:	b2 01       	movw	r22, r4
   29d5c:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   29d60:	2b 01       	movw	r4, r22
   29d62:	3c 01       	movw	r6, r24
			x -= world2machine_shift[0];
			y -= world2machine_shift[1];
		}
		if (world2machine_correction_mode & WORLD2MACHINE_CORRECTION_SKEW) {
			// Firs the skew & rotation correction.
			float out_x = world2machine_rotation_and_skew_inv[0][0] * x + world2machine_rotation_and_skew_inv[0][1] * y;
   29d64:	20 91 8a 04 	lds	r18, 0x048A	; 0x80048a <world2machine_rotation_and_skew_inv>
   29d68:	30 91 8b 04 	lds	r19, 0x048B	; 0x80048b <world2machine_rotation_and_skew_inv+0x1>
   29d6c:	40 91 8c 04 	lds	r20, 0x048C	; 0x80048c <world2machine_rotation_and_skew_inv+0x2>
   29d70:	50 91 8d 04 	lds	r21, 0x048D	; 0x80048d <world2machine_rotation_and_skew_inv+0x3>
   29d74:	c5 01       	movw	r24, r10
   29d76:	b4 01       	movw	r22, r8
   29d78:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   29d7c:	4b 01       	movw	r8, r22
   29d7e:	5c 01       	movw	r10, r24
   29d80:	20 91 8e 04 	lds	r18, 0x048E	; 0x80048e <world2machine_rotation_and_skew_inv+0x4>
   29d84:	30 91 8f 04 	lds	r19, 0x048F	; 0x80048f <world2machine_rotation_and_skew_inv+0x5>
   29d88:	40 91 90 04 	lds	r20, 0x0490	; 0x800490 <world2machine_rotation_and_skew_inv+0x6>
   29d8c:	50 91 91 04 	lds	r21, 0x0491	; 0x800491 <world2machine_rotation_and_skew_inv+0x7>
   29d90:	c7 01       	movw	r24, r14
   29d92:	b6 01       	movw	r22, r12
   29d94:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   29d98:	9b 01       	movw	r18, r22
   29d9a:	ac 01       	movw	r20, r24
   29d9c:	c5 01       	movw	r24, r10
   29d9e:	b4 01       	movw	r22, r8
   29da0:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
			float out_y = world2machine_rotation_and_skew_inv[1][0] * x + world2machine_rotation_and_skew_inv[1][1] * y;
			x = out_x;
   29da4:	60 93 61 12 	sts	0x1261, r22	; 0x801261 <current_position>
   29da8:	70 93 62 12 	sts	0x1262, r23	; 0x801262 <current_position+0x1>
   29dac:	80 93 63 12 	sts	0x1263, r24	; 0x801263 <current_position+0x2>
   29db0:	90 93 64 12 	sts	0x1264, r25	; 0x801264 <current_position+0x3>
			y = out_y;
   29db4:	40 92 65 12 	sts	0x1265, r4	; 0x801265 <current_position+0x4>
   29db8:	50 92 66 12 	sts	0x1266, r5	; 0x801266 <current_position+0x5>
   29dbc:	60 92 67 12 	sts	0x1267, r6	; 0x801267 <current_position+0x6>
   29dc0:	70 92 68 12 	sts	0x1268, r7	; 0x801268 <current_position+0x7>
    }
#endif

    // Apply inverse world correction matrix.
    machine2world(current_position[X_AXIS], current_position[Y_AXIS]);
    set_destination_to_current();
   29dc4:	0e 94 ae 66 	call	0xcd5c	; 0xcd5c <set_destination_to_current()>
#ifdef LIN_ADVANCE
    memcpy(position_float, current_position, sizeof(position_float));
   29dc8:	80 e1       	ldi	r24, 0x10	; 16
   29dca:	e1 e6       	ldi	r30, 0x61	; 97
   29dcc:	f2 e1       	ldi	r31, 0x12	; 18
   29dce:	a6 e3       	ldi	r26, 0x36	; 54
   29dd0:	b4 e0       	ldi	r27, 0x04	; 4
   29dd2:	01 90       	ld	r0, Z+
   29dd4:	0d 92       	st	X+, r0
   29dd6:	8a 95       	dec	r24
   29dd8:	e1 f7       	brne	.-8      	; 0x29dd2 <planner_reset_position()+0x26a>
#endif
}
   29dda:	cf 91       	pop	r28
   29ddc:	ff 90       	pop	r15
   29dde:	ef 90       	pop	r14
   29de0:	df 90       	pop	r13
   29de2:	cf 90       	pop	r12
   29de4:	bf 90       	pop	r11
   29de6:	af 90       	pop	r10
   29de8:	9f 90       	pop	r9
   29dea:	8f 90       	pop	r8
   29dec:	7f 90       	pop	r7
   29dee:	6f 90       	pop	r6
   29df0:	5f 90       	pop	r5
   29df2:	4f 90       	pop	r4
   29df4:	08 95       	ret

00029df6 <planner_abort_hard()>:

void planner_abort_hard()
{
    // Abort the stepper routine and flush the planner queue.
    DISABLE_STEPPER_DRIVER_INTERRUPT();
   29df6:	80 91 6f 00 	lds	r24, 0x006F	; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f>
   29dfa:	8d 7f       	andi	r24, 0xFD	; 253
   29dfc:	80 93 6f 00 	sts	0x006F, r24	; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f>

    // Now the front-end (the Marlin_main.cpp with its current_position) is out of sync.
    planner_reset_position();
   29e00:	0f 94 b4 4d 	call	0x29b68	; 0x29b68 <planner_reset_position()>

    // Relay to planner wait routine that the current line shall be canceled.
    planner_aborted = true;
   29e04:	81 e0       	ldi	r24, 0x01	; 1
   29e06:	80 93 42 0d 	sts	0x0D42, r24	; 0x800d42 <planner_aborted>
}


void quickStop()
{
  DISABLE_STEPPER_DRIVER_INTERRUPT();
   29e0a:	80 91 6f 00 	lds	r24, 0x006F	; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f>
   29e0e:	8d 7f       	andi	r24, 0xFD	; 253
   29e10:	80 93 6f 00 	sts	0x006F, r24	; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f>
  return(block);
}

// Returns true if the buffer has a queued block, false otherwise
FORCE_INLINE bool blocks_queued() {
	return (block_buffer_head != block_buffer_tail);
   29e14:	90 91 3e 0d 	lds	r25, 0x0D3E	; 0x800d3e <block_buffer_head>
   29e18:	80 91 3f 0d 	lds	r24, 0x0D3F	; 0x800d3f <block_buffer_tail>
  while (blocks_queued()) plan_discard_current_block();
   29e1c:	98 17       	cp	r25, r24
   29e1e:	69 f0       	breq	.+26     	; 0x29e3a <planner_abort_hard()+0x44>
extern volatile uint8_t block_buffer_tail;
// Called when the current block is no longer needed. Discards the block and makes the memory
// available for new blocks.
FORCE_INLINE void plan_discard_current_block()
{
  if (block_buffer_head != block_buffer_tail) {
   29e20:	90 91 3e 0d 	lds	r25, 0x0D3E	; 0x800d3e <block_buffer_head>
   29e24:	80 91 3f 0d 	lds	r24, 0x0D3F	; 0x800d3f <block_buffer_tail>
   29e28:	98 17       	cp	r25, r24
   29e2a:	a1 f3       	breq	.-24     	; 0x29e14 <planner_abort_hard()+0x1e>
    block_buffer_tail = (block_buffer_tail + 1) & (BLOCK_BUFFER_SIZE - 1);
   29e2c:	80 91 3f 0d 	lds	r24, 0x0D3F	; 0x800d3f <block_buffer_tail>
   29e30:	8f 5f       	subi	r24, 0xFF	; 255
   29e32:	8f 70       	andi	r24, 0x0F	; 15
   29e34:	80 93 3f 0d 	sts	0x0D3F, r24	; 0x800d3f <block_buffer_tail>
   29e38:	ed cf       	rjmp	.-38     	; 0x29e14 <planner_abort_hard()+0x1e>
  current_block = NULL;
   29e3a:	10 92 52 12 	sts	0x1252, r1	; 0x801252 <current_block+0x1>
   29e3e:	10 92 51 12 	sts	0x1251, r1	; 0x801251 <current_block>
#ifdef LIN_ADVANCE
  nextAdvanceISR = ADV_NEVER;
   29e42:	8f ef       	ldi	r24, 0xFF	; 255
   29e44:	9f ef       	ldi	r25, 0xFF	; 255
   29e46:	90 93 4d 04 	sts	0x044D, r25	; 0x80044d <_ZL14nextAdvanceISR.lto_priv.439+0x1>
   29e4a:	80 93 4c 04 	sts	0x044C, r24	; 0x80044c <_ZL14nextAdvanceISR.lto_priv.439>
  current_adv_steps = 0;
   29e4e:	10 92 49 04 	sts	0x0449, r1	; 0x800449 <_ZL17current_adv_steps.lto_priv.441+0x1>
   29e52:	10 92 48 04 	sts	0x0448, r1	; 0x800448 <_ZL17current_adv_steps.lto_priv.441>
#endif
  st_reset_timer();
   29e56:	0f 94 4c 1b 	call	0x23698	; 0x23698 <st_reset_timer()>
  ENABLE_STEPPER_DRIVER_INTERRUPT();
   29e5a:	80 91 6f 00 	lds	r24, 0x006F	; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f>
   29e5e:	82 60       	ori	r24, 0x02	; 2
   29e60:	80 93 6f 00 	sts	0x006F, r24	; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f>

    // Clear the planner queue, reset and re-enable the stepper timer.
    quickStop();

    // Resets planner junction speeds. Assumes start from rest.
    previous_nominal_speed = 0.0;
   29e64:	10 92 22 04 	sts	0x0422, r1	; 0x800422 <_ZL22previous_nominal_speed.lto_priv.445>
   29e68:	10 92 23 04 	sts	0x0423, r1	; 0x800423 <_ZL22previous_nominal_speed.lto_priv.445+0x1>
   29e6c:	10 92 24 04 	sts	0x0424, r1	; 0x800424 <_ZL22previous_nominal_speed.lto_priv.445+0x2>
   29e70:	10 92 25 04 	sts	0x0425, r1	; 0x800425 <_ZL22previous_nominal_speed.lto_priv.445+0x3>
    memset(previous_speed, 0, sizeof(previous_speed));
   29e74:	e6 e2       	ldi	r30, 0x26	; 38
   29e76:	f4 e0       	ldi	r31, 0x04	; 4
   29e78:	80 e1       	ldi	r24, 0x10	; 16
   29e7a:	df 01       	movw	r26, r30
   29e7c:	1d 92       	st	X+, r1
   29e7e:	8a 95       	dec	r24
   29e80:	e9 f7       	brne	.-6      	; 0x29e7c <planner_abort_hard()+0x86>

    // Reset position sync requests
    plan_reset_next_e_queue = false;
   29e82:	10 92 21 04 	sts	0x0421, r1	; 0x800421 <_ZL23plan_reset_next_e_queue.lto_priv.443>
    plan_reset_next_e_sched = false;
   29e86:	10 92 20 04 	sts	0x0420, r1	; 0x800420 <_ZL23plan_reset_next_e_sched.lto_priv.444>
}
   29e8a:	08 95       	ret

00029e8c <pat9125_wr_reg(unsigned char, unsigned char) [clone .lto_priv.370]>:
    pat9125_PID2 = 0xff;
    return 0;
}

static void pat9125_wr_reg(uint8_t addr, uint8_t data)
{
   29e8c:	cf 93       	push	r28
   29e8e:	c6 2f       	mov	r28, r22
}


uint8_t twi_w8(uint8_t address, uint8_t reg, uint8_t data)
{
  if(twi_start(address, reg))
   29e90:	0f 94 66 6d 	call	0x2dacc	; 0x2dacc <twi_start(unsigned char, unsigned char) [clone .constprop.215]>
   29e94:	81 11       	cpse	r24, r1
   29e96:	0f c0       	rjmp	.+30     	; 0x29eb6 <pat9125_wr_reg(unsigned char, unsigned char) [clone .lto_priv.370]+0x2a>
      return 1;

  // send data
  TWDR = data;
   29e98:	c0 93 bb 00 	sts	0x00BB, r28	; 0x8000bb <__TEXT_REGION_LENGTH__+0x7c20bb>
  TWCR = _BV(TWEN) | _BV(TWINT);
   29e9c:	84 e8       	ldi	r24, 0x84	; 132
   29e9e:	80 93 bc 00 	sts	0x00BC, r24	; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc>
  if(twi_wait(TW_MT_DATA_ACK))
   29ea2:	88 e2       	ldi	r24, 0x28	; 40
   29ea4:	0f 94 5a 0e 	call	0x21cb4	; 0x21cb4 <twi_wait(unsigned char) [clone .lto_priv.368]>
   29ea8:	81 11       	cpse	r24, r1
   29eaa:	05 c0       	rjmp	.+10     	; 0x29eb6 <pat9125_wr_reg(unsigned char, unsigned char) [clone .lto_priv.370]+0x2a>
}


static void twi_stop()
{
  TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTO);
   29eac:	84 e9       	ldi	r24, 0x94	; 148
   29eae:	80 93 bc 00 	sts	0x00BC, r24	; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc>

 error:
    pat9125_PID1 = 0xff;
    pat9125_PID2 = 0xff;
    return;
}
   29eb2:	cf 91       	pop	r28
   29eb4:	08 95       	ret
        goto error;
#endif
    return;

 error:
    pat9125_PID1 = 0xff;
   29eb6:	8f ef       	ldi	r24, 0xFF	; 255
   29eb8:	80 93 66 0d 	sts	0x0D66, r24	; 0x800d66 <pat9125_PID1>
    pat9125_PID2 = 0xff;
   29ebc:	80 93 65 0d 	sts	0x0D65, r24	; 0x800d65 <pat9125_PID2>
   29ec0:	f8 cf       	rjmp	.-16     	; 0x29eb2 <pat9125_wr_reg(unsigned char, unsigned char) [clone .lto_priv.370]+0x26>

00029ec2 <pat9125_rd_reg(unsigned char) [clone .lto_priv.369]>:
	}
	return 0;
}

static uint8_t pat9125_rd_reg(uint8_t addr)
{
   29ec2:	cf 93       	push	r28
}


uint8_t twi_r8(uint8_t address, uint8_t reg, uint8_t* data)
{
  if(twi_start(address, reg))
   29ec4:	0f 94 66 6d 	call	0x2dacc	; 0x2dacc <twi_start(unsigned char, unsigned char) [clone .constprop.215]>
   29ec8:	81 11       	cpse	r24, r1
   29eca:	21 c0       	rjmp	.+66     	; 0x29f0e <pat9125_rd_reg(unsigned char) [clone .lto_priv.369]+0x4c>
      return 1;

  // repeat start
  TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTA);
   29ecc:	84 ea       	ldi	r24, 0xA4	; 164
   29ece:	80 93 bc 00 	sts	0x00BC, r24	; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc>
  if(twi_wait(TW_REP_START))
   29ed2:	80 e1       	ldi	r24, 0x10	; 16
   29ed4:	0f 94 5a 0e 	call	0x21cb4	; 0x21cb4 <twi_wait(unsigned char) [clone .lto_priv.368]>
   29ed8:	81 11       	cpse	r24, r1
   29eda:	19 c0       	rjmp	.+50     	; 0x29f0e <pat9125_rd_reg(unsigned char) [clone .lto_priv.369]+0x4c>
      return 2;

  // start receiving
  TWDR = TW_READ | (address << 1);
   29edc:	8b ee       	ldi	r24, 0xEB	; 235
   29ede:	80 93 bb 00 	sts	0x00BB, r24	; 0x8000bb <__TEXT_REGION_LENGTH__+0x7c20bb>
  TWCR = _BV(TWEN) | _BV(TWINT);
   29ee2:	c4 e8       	ldi	r28, 0x84	; 132
   29ee4:	c0 93 bc 00 	sts	0x00BC, r28	; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc>
  if(twi_wait(TW_MR_SLA_ACK))
   29ee8:	80 e4       	ldi	r24, 0x40	; 64
   29eea:	0f 94 5a 0e 	call	0x21cb4	; 0x21cb4 <twi_wait(unsigned char) [clone .lto_priv.368]>
   29eee:	81 11       	cpse	r24, r1
   29ef0:	0e c0       	rjmp	.+28     	; 0x29f0e <pat9125_rd_reg(unsigned char) [clone .lto_priv.369]+0x4c>
      return 3;

  // receive data
  TWCR = _BV(TWEN) | _BV(TWINT);
   29ef2:	c0 93 bc 00 	sts	0x00BC, r28	; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc>
  if(twi_wait(TW_MR_DATA_NACK))
   29ef6:	88 e5       	ldi	r24, 0x58	; 88
   29ef8:	0f 94 5a 0e 	call	0x21cb4	; 0x21cb4 <twi_wait(unsigned char) [clone .lto_priv.368]>
   29efc:	81 11       	cpse	r24, r1
   29efe:	07 c0       	rjmp	.+14     	; 0x29f0e <pat9125_rd_reg(unsigned char) [clone .lto_priv.369]+0x4c>
      return 4;

  *data = TWDR;
   29f00:	80 91 bb 00 	lds	r24, 0x00BB	; 0x8000bb <__TEXT_REGION_LENGTH__+0x7c20bb>
}


static void twi_stop()
{
  TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTO);
   29f04:	94 e9       	ldi	r25, 0x94	; 148
   29f06:	90 93 bc 00 	sts	0x00BC, r25	; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc>

 error:
    pat9125_PID1 = 0xff;
    pat9125_PID2 = 0xff;
    return 0;
}
   29f0a:	cf 91       	pop	r28
   29f0c:	08 95       	ret
        goto error;
#endif
	return data;

 error:
    pat9125_PID1 = 0xff;
   29f0e:	8f ef       	ldi	r24, 0xFF	; 255
   29f10:	80 93 66 0d 	sts	0x0D66, r24	; 0x800d66 <pat9125_PID1>
    pat9125_PID2 = 0xff;
   29f14:	80 93 65 0d 	sts	0x0D65, r24	; 0x800d65 <pat9125_PID2>
    return 0;
   29f18:	80 e0       	ldi	r24, 0x00	; 0
   29f1a:	f7 cf       	rjmp	.-18     	; 0x29f0a <pat9125_rd_reg(unsigned char) [clone .lto_priv.369]+0x48>

00029f1c <pat9125_wr_seq(unsigned char const*) [clone .lto_priv.371]>:
	pat9125_wr_reg(addr, data);
	return pat9125_rd_reg(addr) == data;
}

static uint8_t pat9125_wr_seq(const uint8_t* seq)
{
   29f1c:	0f 93       	push	r16
   29f1e:	1f 93       	push	r17
   29f20:	cf 93       	push	r28
   29f22:	df 93       	push	r29
   29f24:	8c 01       	movw	r16, r24
	for (;;) {
		const uint8_t addr = pgm_read_byte(seq++);
   29f26:	f8 01       	movw	r30, r16
   29f28:	d4 91       	lpm	r29, Z
		if (addr == 0xff)
   29f2a:	df 3f       	cpi	r29, 0xFF	; 255
   29f2c:	99 f0       	breq	.+38     	; 0x29f54 <pat9125_wr_seq(unsigned char const*) [clone .lto_priv.371]+0x38>
			break;
		if (!pat9125_wr_reg_verify(addr, pgm_read_byte(seq++)))
   29f2e:	31 96       	adiw	r30, 0x01	; 1
   29f30:	c4 91       	lpm	r28, Z
    return;
}

static uint8_t pat9125_wr_reg_verify(uint8_t addr, uint8_t data)
{
	pat9125_wr_reg(addr, data);
   29f32:	6c 2f       	mov	r22, r28
   29f34:	8d 2f       	mov	r24, r29
   29f36:	0f 94 46 4f 	call	0x29e8c	; 0x29e8c <pat9125_wr_reg(unsigned char, unsigned char) [clone .lto_priv.370]>
	return pat9125_rd_reg(addr) == data;
   29f3a:	8d 2f       	mov	r24, r29
   29f3c:	0f 94 61 4f 	call	0x29ec2	; 0x29ec2 <pat9125_rd_reg(unsigned char) [clone .lto_priv.369]>
{
	for (;;) {
		const uint8_t addr = pgm_read_byte(seq++);
		if (addr == 0xff)
			break;
		if (!pat9125_wr_reg_verify(addr, pgm_read_byte(seq++)))
   29f40:	0e 5f       	subi	r16, 0xFE	; 254
   29f42:	1f 4f       	sbci	r17, 0xFF	; 255
   29f44:	c8 17       	cp	r28, r24
   29f46:	79 f3       	breq	.-34     	; 0x29f26 <pat9125_wr_seq(unsigned char const*) [clone .lto_priv.371]+0xa>
			// Verification of the register write failed.
			return 0;
   29f48:	80 e0       	ldi	r24, 0x00	; 0
	}
	return 1;
}
   29f4a:	df 91       	pop	r29
   29f4c:	cf 91       	pop	r28
   29f4e:	1f 91       	pop	r17
   29f50:	0f 91       	pop	r16
   29f52:	08 95       	ret
			break;
		if (!pat9125_wr_reg_verify(addr, pgm_read_byte(seq++)))
			// Verification of the register write failed.
			return 0;
	}
	return 1;
   29f54:	81 e0       	ldi	r24, 0x01	; 1
   29f56:	f9 cf       	rjmp	.-14     	; 0x29f4a <pat9125_wr_seq(unsigned char const*) [clone .lto_priv.371]+0x2e>

00029f58 <pat9125_update()>:

	return 1;
}

uint8_t pat9125_update(void)
{
   29f58:	cf 93       	push	r28
   29f5a:	df 93       	push	r29
	if ((pat9125_PID1 == 0x31) && (pat9125_PID2 == 0x91))
   29f5c:	80 91 66 0d 	lds	r24, 0x0D66	; 0x800d66 <pat9125_PID1>
   29f60:	81 33       	cpi	r24, 0x31	; 49
   29f62:	21 f0       	breq	.+8      	; 0x29f6c <pat9125_update()+0x14>
			pat9125_x += iDX;
			pat9125_y += iDY;
		}
		return 1;
	}
	return 0;
   29f64:	80 e0       	ldi	r24, 0x00	; 0
}
   29f66:	df 91       	pop	r29
   29f68:	cf 91       	pop	r28
   29f6a:	08 95       	ret
	return 1;
}

uint8_t pat9125_update(void)
{
	if ((pat9125_PID1 == 0x31) && (pat9125_PID2 == 0x91))
   29f6c:	80 91 65 0d 	lds	r24, 0x0D65	; 0x800d65 <pat9125_PID2>
   29f70:	81 39       	cpi	r24, 0x91	; 145
   29f72:	c1 f7       	brne	.-16     	; 0x29f64 <pat9125_update()+0xc>
	{
		uint8_t ucMotion = pat9125_rd_reg(PAT9125_MOTION);
   29f74:	82 e0       	ldi	r24, 0x02	; 2
   29f76:	0f 94 61 4f 	call	0x29ec2	; 0x29ec2 <pat9125_rd_reg(unsigned char) [clone .lto_priv.369]>
   29f7a:	c8 2f       	mov	r28, r24
		pat9125_b = pat9125_rd_reg(PAT9125_FRAME);
   29f7c:	87 e1       	ldi	r24, 0x17	; 23
   29f7e:	0f 94 61 4f 	call	0x29ec2	; 0x29ec2 <pat9125_rd_reg(unsigned char) [clone .lto_priv.369]>
   29f82:	80 93 63 0d 	sts	0x0D63, r24	; 0x800d63 <pat9125_b>
		pat9125_s = pat9125_rd_reg(PAT9125_SHUTTER);
   29f86:	84 e1       	ldi	r24, 0x14	; 20
   29f88:	0f 94 61 4f 	call	0x29ec2	; 0x29ec2 <pat9125_rd_reg(unsigned char) [clone .lto_priv.369]>
   29f8c:	80 93 64 0d 	sts	0x0D64, r24	; 0x800d64 <pat9125_s>
		if (pat9125_PID1 == 0xff) return 0;
   29f90:	80 91 66 0d 	lds	r24, 0x0D66	; 0x800d66 <pat9125_PID1>
   29f94:	8f 3f       	cpi	r24, 0xFF	; 255
   29f96:	31 f3       	breq	.-52     	; 0x29f64 <pat9125_update()+0xc>
		if (ucMotion & 0x80)
   29f98:	c7 ff       	sbrs	r28, 7
   29f9a:	36 c0       	rjmp	.+108    	; 0x2a008 <pat9125_update()+0xb0>
		{
			uint16_t ucXL = pat9125_rd_reg(PAT9125_DELTA_XL);
   29f9c:	83 e0       	ldi	r24, 0x03	; 3
   29f9e:	0f 94 61 4f 	call	0x29ec2	; 0x29ec2 <pat9125_rd_reg(unsigned char) [clone .lto_priv.369]>
   29fa2:	d8 2f       	mov	r29, r24
			uint16_t ucYL = pat9125_rd_reg(PAT9125_DELTA_YL);
   29fa4:	84 e0       	ldi	r24, 0x04	; 4
   29fa6:	0f 94 61 4f 	call	0x29ec2	; 0x29ec2 <pat9125_rd_reg(unsigned char) [clone .lto_priv.369]>
   29faa:	c8 2f       	mov	r28, r24
			uint16_t ucXYH = pat9125_rd_reg(PAT9125_DELTA_XYH);
   29fac:	82 e1       	ldi	r24, 0x12	; 18
   29fae:	0f 94 61 4f 	call	0x29ec2	; 0x29ec2 <pat9125_rd_reg(unsigned char) [clone .lto_priv.369]>
			if (pat9125_PID1 == 0xff) return 0;
   29fb2:	90 91 66 0d 	lds	r25, 0x0D66	; 0x800d66 <pat9125_PID1>
   29fb6:	9f 3f       	cpi	r25, 0xFF	; 255
   29fb8:	a9 f2       	breq	.-86     	; 0x29f64 <pat9125_update()+0xc>
		if (pat9125_PID1 == 0xff) return 0;
		if (ucMotion & 0x80)
		{
			uint16_t ucXL = pat9125_rd_reg(PAT9125_DELTA_XL);
			uint16_t ucYL = pat9125_rd_reg(PAT9125_DELTA_YL);
			uint16_t ucXYH = pat9125_rd_reg(PAT9125_DELTA_XYH);
   29fba:	90 e0       	ldi	r25, 0x00	; 0
			if (pat9125_PID1 == 0xff) return 0;
			int16_t iDX = ucXL | ((ucXYH << 4) & 0xf00);
   29fbc:	9c 01       	movw	r18, r24
   29fbe:	44 e0       	ldi	r20, 0x04	; 4
   29fc0:	22 0f       	add	r18, r18
   29fc2:	33 1f       	adc	r19, r19
   29fc4:	4a 95       	dec	r20
   29fc6:	e1 f7       	brne	.-8      	; 0x29fc0 <pat9125_update()+0x68>
   29fc8:	22 27       	eor	r18, r18
   29fca:	3f 70       	andi	r19, 0x0F	; 15
   29fcc:	2d 2b       	or	r18, r29
			int16_t iDY = ucYL | ((ucXYH << 8) & 0xf00);
   29fce:	98 2f       	mov	r25, r24
   29fd0:	88 27       	eor	r24, r24
   29fd2:	88 27       	eor	r24, r24
   29fd4:	9f 70       	andi	r25, 0x0F	; 15
   29fd6:	8c 2b       	or	r24, r28
			if (iDX & 0x800) iDX -= 4096;
   29fd8:	33 fd       	sbrc	r19, 3
   29fda:	30 51       	subi	r19, 0x10	; 16
			if (iDY & 0x800) iDY -= 4096;
   29fdc:	93 fd       	sbrc	r25, 3
   29fde:	90 51       	subi	r25, 0x10	; 16
			pat9125_x += iDX;
   29fe0:	40 91 89 03 	lds	r20, 0x0389	; 0x800389 <pat9125_x>
   29fe4:	50 91 8a 03 	lds	r21, 0x038A	; 0x80038a <pat9125_x+0x1>
   29fe8:	24 0f       	add	r18, r20
   29fea:	35 1f       	adc	r19, r21
   29fec:	30 93 8a 03 	sts	0x038A, r19	; 0x80038a <pat9125_x+0x1>
   29ff0:	20 93 89 03 	sts	0x0389, r18	; 0x800389 <pat9125_x>
			pat9125_y += iDY;
   29ff4:	20 91 38 0e 	lds	r18, 0x0E38	; 0x800e38 <pat9125_y>
   29ff8:	30 91 39 0e 	lds	r19, 0x0E39	; 0x800e39 <pat9125_y+0x1>
   29ffc:	82 0f       	add	r24, r18
   29ffe:	93 1f       	adc	r25, r19
   2a000:	90 93 39 0e 	sts	0x0E39, r25	; 0x800e39 <pat9125_y+0x1>
   2a004:	80 93 38 0e 	sts	0x0E38, r24	; 0x800e38 <pat9125_y>
		}
		return 1;
   2a008:	81 e0       	ldi	r24, 0x01	; 1
   2a00a:	ad cf       	rjmp	.-166    	; 0x29f66 <pat9125_update()+0xe>

0002a00c <MMU2::ScreenUpdateEnable()>:
void FullScreenMsgRestoringTemperature(){
    lcd_display_message_fullscreen_P(_T(MSG_MMU_RESTORE_TEMP));
}

void ScreenUpdateEnable(){
    lcd_update_enable(true);
   2a00c:	81 e0       	ldi	r24, 0x01	; 1
   2a00e:	0c 94 38 70 	jmp	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>

0002a012 <MMU2::FullScreenMsg(char const*, unsigned char) [clone .lto_priv.375]>:

void MakeSound(SoundType s){
    Sound_MakeSound( (eSOUND_TYPE)s);
}

static void FullScreenMsg(const char *pgmS, uint8_t slot){
   2a012:	0f 93       	push	r16
   2a014:	1f 93       	push	r17
   2a016:	cf 93       	push	r28
   2a018:	8c 01       	movw	r16, r24
   2a01a:	c6 2f       	mov	r28, r22
    lcd_update_enable(false);
   2a01c:	80 e0       	ldi	r24, 0x00	; 0
   2a01e:	0e 94 38 70 	call	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>
    lcd_clear();
   2a022:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
    lcd_puts_at_P(0, 1, pgmS);
   2a026:	a8 01       	movw	r20, r16
   2a028:	61 e0       	ldi	r22, 0x01	; 1
   2a02a:	80 e0       	ldi	r24, 0x00	; 0
   2a02c:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
}

void lcd_print(long n, int base)
{
	if (base == 0)
		lcd_write(n);
   2a030:	80 e2       	ldi	r24, 0x20	; 32
   2a032:	0e 94 a2 70 	call	0xe144	; 0xe144 <lcd_write(unsigned char) [clone .lto_priv.402]>
    lcd_print(' ');
    lcd_print(slot + 1);
   2a036:	6c 2f       	mov	r22, r28
   2a038:	70 e0       	ldi	r23, 0x00	; 0
   2a03a:	6f 5f       	subi	r22, 0xFF	; 255
   2a03c:	7f 4f       	sbci	r23, 0xFF	; 255
	lcd_print((unsigned long) b, base);
}

void lcd_print(int n, int base)
{
	lcd_print((long) n, base);
   2a03e:	07 2e       	mov	r0, r23
   2a040:	00 0c       	add	r0, r0
   2a042:	88 0b       	sbc	r24, r24
   2a044:	99 0b       	sbc	r25, r25
}
   2a046:	cf 91       	pop	r28
   2a048:	1f 91       	pop	r17
   2a04a:	0f 91       	pop	r16
   2a04c:	0c 94 db 71 	jmp	0xe3b6	; 0xe3b6 <lcd_print(long, int) [clone .part.3]>

0002a050 <MMU2::IncrementMMUFails()>:
    eeprom_increment_byte((uint8_t *)EEPROM_MMU_LOAD_FAIL);
    eeprom_increment_word((uint16_t *)EEPROM_MMU_LOAD_FAIL_TOT);
}

void IncrementMMUFails(){
    eeprom_increment_byte((uint8_t *)EEPROM_MMU_FAIL);
   2a050:	82 ed       	ldi	r24, 0xD2	; 210
   2a052:	9e e0       	ldi	r25, 0x0E	; 14
   2a054:	0e 94 7c 78 	call	0xf0f8	; 0xf0f8 <eeprom_increment_byte(unsigned char*)>
    eeprom_increment_word((uint16_t *)EEPROM_MMU_FAIL_TOT);
   2a058:	83 ed       	ldi	r24, 0xD3	; 211
   2a05a:	9e e0       	ldi	r25, 0x0E	; 14
   2a05c:	0c 94 6f 78 	jmp	0xf0de	; 0xf0de <eeprom_increment_word(unsigned int*)>

0002a060 <MMU2::ReportErrorHookDynamicRender()>:
    inline bool Running() const {
        return state == State::Running;
    }

    inline bool FindaPressed() const {
        return regs8[0];
   2a060:	41 e0       	ldi	r20, 0x01	; 1
   2a062:	80 91 d7 12 	lds	r24, 0x12D7	; 0x8012d7 <MMU2::mmu2+0x45>
   2a066:	81 11       	cpse	r24, r1
   2a068:	01 c0       	rjmp	.+2      	; 0x2a06c <MMU2::ReportErrorHookDynamicRender()+0xc>
   2a06a:	40 e0       	ldi	r20, 0x00	; 0
 * @brief Renders any characters that will be updated live on the MMU error screen.
 *Currently, this is FINDA and Filament Sensor status and Extruder temperature.
 */
extern void ReportErrorHookDynamicRender(void){
    // beware - this optimization abuses the fact, that FindaDetectsFilament returns 0 or 1 and '0' is followed by '1' in the ASCII table
    lcd_putc_at(3, 2, mmu2.FindaDetectsFilament() + '0');
   2a06c:	40 5d       	subi	r20, 0xD0	; 208
   2a06e:	62 e0       	ldi	r22, 0x02	; 2
   2a070:	83 e0       	ldi	r24, 0x03	; 3
   2a072:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
class PAT9125_sensor: public Filament_sensor {
public:
    void init();
    void deinit();
    bool update();
    bool getFilamentPresent() const { return filterFilPresent; }
   2a076:	41 e0       	ldi	r20, 0x01	; 1
   2a078:	80 91 fe 16 	lds	r24, 0x16FE	; 0x8016fe <fsensor+0xd>
   2a07c:	81 11       	cpse	r24, r1
   2a07e:	01 c0       	rjmp	.+2      	; 0x2a082 <MMU2::ReportErrorHookDynamicRender()+0x22>
   2a080:	40 e0       	ldi	r20, 0x00	; 0
    lcd_putc_at(8, 2, fsensor.getFilamentPresent() + '0');
   2a082:	40 5d       	subi	r20, 0xD0	; 208
   2a084:	62 e0       	ldi	r22, 0x02	; 2
   2a086:	88 e0       	ldi	r24, 0x08	; 8
   2a088:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>

    // print active/changing filament slot
    lcd_set_cursor(10, 2);
   2a08c:	62 e0       	ldi	r22, 0x02	; 2
   2a08e:	8a e0       	ldi	r24, 0x0A	; 10
   2a090:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
    lcdui_print_extruder();
   2a094:	0f 94 e6 07 	call	0x20fcc	; 0x20fcc <lcdui_print_extruder()>

    // Print active extruder temperature
    lcd_set_cursor(16, 2);
   2a098:	62 e0       	ldi	r22, 0x02	; 2
   2a09a:	80 e1       	ldi	r24, 0x10	; 16
   2a09c:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
    lcd_printf_P(PSTR("%3d"), (int)(degHotend(0) + 0.5));
   2a0a0:	20 e0       	ldi	r18, 0x00	; 0
   2a0a2:	30 e0       	ldi	r19, 0x00	; 0
   2a0a4:	40 e0       	ldi	r20, 0x00	; 0
   2a0a6:	5f e3       	ldi	r21, 0x3F	; 63
   2a0a8:	60 91 5a 0d 	lds	r22, 0x0D5A	; 0x800d5a <current_temperature>
   2a0ac:	70 91 5b 0d 	lds	r23, 0x0D5B	; 0x800d5b <current_temperature+0x1>
   2a0b0:	80 91 5c 0d 	lds	r24, 0x0D5C	; 0x800d5c <current_temperature+0x2>
   2a0b4:	90 91 5d 0d 	lds	r25, 0x0D5D	; 0x800d5d <current_temperature+0x3>
   2a0b8:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   2a0bc:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   2a0c0:	7f 93       	push	r23
   2a0c2:	6f 93       	push	r22
   2a0c4:	83 ed       	ldi	r24, 0xD3	; 211
   2a0c6:	97 e8       	ldi	r25, 0x87	; 135
   2a0c8:	9f 93       	push	r25
   2a0ca:	8f 93       	push	r24
   2a0cc:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
   2a0d0:	0f 90       	pop	r0
   2a0d2:	0f 90       	pop	r0
   2a0d4:	0f 90       	pop	r0
   2a0d6:	0f 90       	pop	r0
}
   2a0d8:	08 95       	ret

0002a0da <modules::protocol::Protocol::Nibble2Char(unsigned char)>:
            return 0;
        }
    }

    static constexpr uint8_t Nibble2Char(uint8_t n) {
        switch (n) {
   2a0da:	8a 30       	cpi	r24, 0x0A	; 10
   2a0dc:	20 f0       	brcs	.+8      	; 0x2a0e6 <modules::protocol::Protocol::Nibble2Char(unsigned char)+0xc>
   2a0de:	80 31       	cpi	r24, 0x10	; 16
   2a0e0:	20 f4       	brcc	.+8      	; 0x2a0ea <modules::protocol::Protocol::Nibble2Char(unsigned char)+0x10>
        case 0xb:
        case 0xc:
        case 0xd:
        case 0xe:
        case 0xf:
            return n - 10 + 'a';
   2a0e2:	89 5a       	subi	r24, 0xA9	; 169
   2a0e4:	08 95       	ret
        case 5:
        case 6:
        case 7:
        case 8:
        case 9:
            return n + '0';
   2a0e6:	80 5d       	subi	r24, 0xD0	; 208
   2a0e8:	08 95       	ret
        case 0xd:
        case 0xe:
        case 0xf:
            return n - 10 + 'a';
        default:
            return 0;
   2a0ea:	80 e0       	ldi	r24, 0x00	; 0
        }
    }
   2a0ec:	08 95       	ret

0002a0ee <modules::protocol::Protocol::UInt8ToHex(unsigned char, unsigned char*) [clone .part.2]>:
    i += AppendCRC(rsp.CRC(), txbuff + i);
    txbuff[i] = '\n';
    return i + 1;
}

uint8_t Protocol::UInt8ToHex(uint8_t value, uint8_t *dst) {
   2a0ee:	0f 93       	push	r16
   2a0f0:	1f 93       	push	r17
   2a0f2:	cf 93       	push	r28
   2a0f4:	df 93       	push	r29
   2a0f6:	08 2f       	mov	r16, r24
   2a0f8:	eb 01       	movw	r28, r22
    if (value == 0) {
        *dst = '0';
        return 1;
    }

    uint8_t v = value >> 4U;
   2a0fa:	90 e0       	ldi	r25, 0x00	; 0
   2a0fc:	24 e0       	ldi	r18, 0x04	; 4
   2a0fe:	95 95       	asr	r25
   2a100:	87 95       	ror	r24
   2a102:	2a 95       	dec	r18
   2a104:	e1 f7       	brne	.-8      	; 0x2a0fe <modules::protocol::Protocol::UInt8ToHex(unsigned char, unsigned char*) [clone .part.2]+0x10>
    uint8_t charsOut = 1;
   2a106:	11 e0       	ldi	r17, 0x01	; 1
    if (v != 0) { // skip the first '0' if any
   2a108:	00 97       	sbiw	r24, 0x00	; 0
   2a10a:	21 f0       	breq	.+8      	; 0x2a114 <modules::protocol::Protocol::UInt8ToHex(unsigned char, unsigned char*) [clone .part.2]+0x26>
        *dst = Nibble2Char(v);
   2a10c:	0f 94 6d 50 	call	0x2a0da	; 0x2a0da <modules::protocol::Protocol::Nibble2Char(unsigned char)>
   2a110:	89 93       	st	Y+, r24
        ++dst;
        charsOut = 2;
   2a112:	12 e0       	ldi	r17, 0x02	; 2
    }
    v = value & 0xfU;
    *dst = Nibble2Char(v);
   2a114:	80 2f       	mov	r24, r16
   2a116:	8f 70       	andi	r24, 0x0F	; 15
   2a118:	0f 94 6d 50 	call	0x2a0da	; 0x2a0da <modules::protocol::Protocol::Nibble2Char(unsigned char)>
   2a11c:	88 83       	st	Y, r24
    return charsOut;
}
   2a11e:	81 2f       	mov	r24, r17
   2a120:	df 91       	pop	r29
   2a122:	cf 91       	pop	r28
   2a124:	1f 91       	pop	r17
   2a126:	0f 91       	pop	r16
   2a128:	08 95       	ret

0002a12a <modules::protocol::Protocol::Char2Nibble(unsigned char)>:
    }
    static constexpr bool IsHexDigit(uint8_t c) {
        return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f');
    }
    static constexpr uint8_t Char2Nibble(uint8_t c) {
        switch (c) {
   2a12a:	80 33       	cpi	r24, 0x30	; 48
   2a12c:	30 f0       	brcs	.+12     	; 0x2a13a <modules::protocol::Protocol::Char2Nibble(unsigned char)+0x10>
   2a12e:	8a 33       	cpi	r24, 0x3A	; 58
   2a130:	30 f0       	brcs	.+12     	; 0x2a13e <modules::protocol::Protocol::Char2Nibble(unsigned char)+0x14>
   2a132:	9f e9       	ldi	r25, 0x9F	; 159
   2a134:	98 0f       	add	r25, r24
   2a136:	96 30       	cpi	r25, 0x06	; 6
   2a138:	20 f0       	brcs	.+8      	; 0x2a142 <modules::protocol::Protocol::Char2Nibble(unsigned char)+0x18>
        case 'd':
        case 'e':
        case 'f':
            return c - 'a' + 10;
        default:
            return 0;
   2a13a:	80 e0       	ldi	r24, 0x00	; 0
        }
    }
   2a13c:	08 95       	ret
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
            return c - '0';
   2a13e:	80 53       	subi	r24, 0x30	; 48
   2a140:	08 95       	ret
        case 'b':
        case 'c':
        case 'd':
        case 'e':
        case 'f':
            return c - 'a' + 10;
   2a142:	87 55       	subi	r24, 0x57	; 87
   2a144:	08 95       	ret

0002a146 <modules::protocol::RequestMsg::ComputeCRC8() const>:
    /// CRC8 check - please note we abuse this byte for CRC of ResponseMsgs as well.
    /// The crc8 byte itself is not added into the CRC computation (obviously ;) )
    /// Beware - adding any members of this data structure may need changing the way CRC is being computed!
    uint8_t crc8;

    constexpr uint8_t ComputeCRC8() const {
   2a146:	cf 93       	push	r28
   2a148:	df 93       	push	r29
   2a14a:	ec 01       	movw	r28, r24
        uint8_t crc = 0;
        crc = modules::crc::CRC8::CCITT_updateCX(0, (uint8_t)code);
   2a14c:	68 81       	ld	r22, Y
   2a14e:	80 e0       	ldi	r24, 0x00	; 0
   2a150:	0f 94 a3 03 	call	0x20746	; 0x20746 <modules::crc::CRC8::CCITT_updateCX(unsigned char, unsigned char)>
        crc = modules::crc::CRC8::CCITT_updateCX(crc, value);
   2a154:	69 81       	ldd	r22, Y+1	; 0x01
   2a156:	0f 94 a3 03 	call	0x20746	; 0x20746 <modules::crc::CRC8::CCITT_updateCX(unsigned char, unsigned char)>
        crc = modules::crc::CRC8::CCITT_updateW(crc, value2);
   2a15a:	6a 81       	ldd	r22, Y+2	; 0x02
   2a15c:	cb 81       	ldd	r28, Y+3	; 0x03
            uint8_t b[2];
            uint16_t w;
            explicit constexpr inline U(uint16_t w)
                : w(w) {}
        } u(w);
        return CCITT_updateCX(CCITT_updateCX(crc, u.b[0]), u.b[1]);
   2a15e:	0f 94 a3 03 	call	0x20746	; 0x20746 <modules::crc::CRC8::CCITT_updateCX(unsigned char, unsigned char)>
   2a162:	6c 2f       	mov	r22, r28
        return crc;
    }
   2a164:	df 91       	pop	r29
   2a166:	cf 91       	pop	r28
   2a168:	0d 94 a3 03 	jmp	0x20746	; 0x20746 <modules::crc::CRC8::CCITT_updateCX(unsigned char, unsigned char)>

0002a16c <modules::protocol::ResponseMsg::ComputeCRC8() const>:
struct ResponseMsg {
    RequestMsg request; ///< response is always preceeded by the request message
    ResponseMsgParamCodes paramCode; ///< code of the parameter
    uint16_t paramValue; ///< value of the parameter

    constexpr uint8_t ComputeCRC8() const {
   2a16c:	cf 93       	push	r28
   2a16e:	df 93       	push	r29
   2a170:	ec 01       	movw	r28, r24
        uint8_t crc = request.ComputeCRC8();
   2a172:	0f 94 a3 50 	call	0x2a146	; 0x2a146 <modules::protocol::RequestMsg::ComputeCRC8() const>
        crc = modules::crc::CRC8::CCITT_updateCX(crc, (uint8_t)paramCode);
   2a176:	6d 81       	ldd	r22, Y+5	; 0x05
   2a178:	0f 94 a3 03 	call	0x20746	; 0x20746 <modules::crc::CRC8::CCITT_updateCX(unsigned char, unsigned char)>
        crc = modules::crc::CRC8::CCITT_updateW(crc, paramValue);
   2a17c:	6e 81       	ldd	r22, Y+6	; 0x06
   2a17e:	cf 81       	ldd	r28, Y+7	; 0x07
   2a180:	0f 94 a3 03 	call	0x20746	; 0x20746 <modules::crc::CRC8::CCITT_updateCX(unsigned char, unsigned char)>
   2a184:	6c 2f       	mov	r22, r28
        return crc;
    }
   2a186:	df 91       	pop	r29
   2a188:	cf 91       	pop	r28
   2a18a:	0d 94 a3 03 	jmp	0x20746	; 0x20746 <modules::crc::CRC8::CCITT_updateCX(unsigned char, unsigned char)>

0002a18e <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>:
        return crc;
    }

    /// @param code of the request message
    /// @param value of the request message
    inline constexpr RequestMsg(RequestMsgCodes code, uint8_t value)
   2a18e:	cf 93       	push	r28
   2a190:	df 93       	push	r29
   2a192:	ec 01       	movw	r28, r24
        : code(code)
        , value(value)
        , value2(0)
        , crc8(ComputeCRC8()) {
   2a194:	68 83       	st	Y, r22
   2a196:	49 83       	std	Y+1, r20	; 0x01
   2a198:	1b 82       	std	Y+3, r1	; 0x03
   2a19a:	1a 82       	std	Y+2, r1	; 0x02
   2a19c:	0f 94 a3 50 	call	0x2a146	; 0x2a146 <modules::protocol::RequestMsg::ComputeCRC8() const>
   2a1a0:	8c 83       	std	Y+4, r24	; 0x04
    }
   2a1a2:	df 91       	pop	r29
   2a1a4:	cf 91       	pop	r28
   2a1a6:	08 95       	ret

0002a1a8 <MMU2::Disable_E0()>:
void Enable_E0() {
    enable_e0();
}

void Disable_E0() {
    disable_e0();
   2a1a8:	14 9a       	sbi	0x02, 4	; 2
}
   2a1aa:	08 95       	ret

0002a1ac <MMU2::extruder_move(float, float)>:
static void planner_line_to_current_position_sync(float feedRate_mm_s){
    planner_line_to_current_position(feedRate_mm_s);
    planner_synchronize();
}

void extruder_move(float delta, float feedRate) {
   2a1ac:	cf 92       	push	r12
   2a1ae:	df 92       	push	r13
   2a1b0:	ef 92       	push	r14
   2a1b2:	ff 92       	push	r15
   2a1b4:	cf 93       	push	r28
   2a1b6:	df 93       	push	r29
   2a1b8:	69 01       	movw	r12, r18
   2a1ba:	7a 01       	movw	r14, r20
    current_position[E_AXIS] += delta;
   2a1bc:	c1 e6       	ldi	r28, 0x61	; 97
   2a1be:	d2 e1       	ldi	r29, 0x12	; 18
   2a1c0:	9b 01       	movw	r18, r22
   2a1c2:	ac 01       	movw	r20, r24
   2a1c4:	6c 85       	ldd	r22, Y+12	; 0x0c
   2a1c6:	7d 85       	ldd	r23, Y+13	; 0x0d
   2a1c8:	8e 85       	ldd	r24, Y+14	; 0x0e
   2a1ca:	9f 85       	ldd	r25, Y+15	; 0x0f
   2a1cc:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   2a1d0:	6c 87       	std	Y+12, r22	; 0x0c
   2a1d2:	7d 87       	std	Y+13, r23	; 0x0d
   2a1d4:	8e 87       	std	Y+14, r24	; 0x0e
   2a1d6:	9f 87       	std	Y+15, r25	; 0x0f
#include "temperature.h"

namespace MMU2 {

static void planner_line_to_current_position(float feedRate_mm_s){
     plan_buffer_line_curposXYZE(feedRate_mm_s);
   2a1d8:	c7 01       	movw	r24, r14
   2a1da:	b6 01       	movw	r22, r12
}

void extruder_move(float delta, float feedRate) {
    current_position[E_AXIS] += delta;
    planner_line_to_current_position(feedRate);
}
   2a1dc:	df 91       	pop	r29
   2a1de:	cf 91       	pop	r28
   2a1e0:	ff 90       	pop	r15
   2a1e2:	ef 90       	pop	r14
   2a1e4:	df 90       	pop	r13
   2a1e6:	cf 90       	pop	r12
#include "temperature.h"

namespace MMU2 {

static void planner_line_to_current_position(float feedRate_mm_s){
     plan_buffer_line_curposXYZE(feedRate_mm_s);
   2a1e8:	0d 94 81 4c 	jmp	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>

0002a1ec <go_to_current(float) [clone .lto_priv.377]>:
    st_synchronize();
}

static inline void go_to_current(float fr)
{
    plan_buffer_line_curposXYZE(fr);
   2a1ec:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
    st_synchronize();
   2a1f0:	0d 94 fb 1a 	jmp	0x235f6	; 0x235f6 <st_synchronize()>

0002a1f4 <MMU2::LogEchoEvent_P(char const*)>:
#include "mmu2_log.h"

namespace MMU2 {

void LogErrorEvent_P(const char *msg){
   2a1f4:	cf 93       	push	r28
   2a1f6:	df 93       	push	r29
   2a1f8:	ec 01       	movw	r28, r24
    SERIAL_ECHO_START; //!@todo Decide MMU errors  on serial line
   2a1fa:	8e ec       	ldi	r24, 0xCE	; 206
   2a1fc:	91 ea       	ldi	r25, 0xA1	; 161
   2a1fe:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    SERIAL_MMU2();
   2a202:	8d ec       	ldi	r24, 0xCD	; 205
   2a204:	97 e8       	ldi	r25, 0x87	; 135
   2a206:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    SERIAL_ECHOLNRPGM(msg);
   2a20a:	ce 01       	movw	r24, r28
}
   2a20c:	df 91       	pop	r29
   2a20e:	cf 91       	pop	r28
namespace MMU2 {

void LogErrorEvent_P(const char *msg){
    SERIAL_ECHO_START; //!@todo Decide MMU errors  on serial line
    SERIAL_MMU2();
    SERIAL_ECHOLNRPGM(msg);
   2a210:	0c 94 bd 7c 	jmp	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>

0002a214 <MMU2::WhereIsFilament()>:
#include "Filament_sensor.h"

namespace MMU2 {

FilamentState WhereIsFilament(){
    return fsensor.getFilamentPresent() ? FilamentState::AT_FSENSOR : FilamentState::NOT_PRESENT;
   2a214:	81 e0       	ldi	r24, 0x01	; 1
   2a216:	90 91 fe 16 	lds	r25, 0x16FE	; 0x8016fe <fsensor+0xd>
   2a21a:	91 11       	cpse	r25, r1
   2a21c:	01 c0       	rjmp	.+2      	; 0x2a220 <MMU2::WhereIsFilament()+0xc>
   2a21e:	80 e0       	ldi	r24, 0x00	; 0
}
   2a220:	08 95       	ret

0002a222 <MMU2::PrusaErrorCodeIndex(ErrorCode)>:
constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) {
    return (uint16_t)ec & (uint16_t)mask;
}

uint8_t PrusaErrorCodeIndex(ErrorCode ec) {
    switch (ec) {
   2a222:	89 32       	cpi	r24, 0x29	; 41
   2a224:	20 e8       	ldi	r18, 0x80	; 128
   2a226:	92 07       	cpc	r25, r18
   2a228:	09 f4       	brne	.+2      	; 0x2a22c <MMU2::PrusaErrorCodeIndex(ErrorCode)+0xa>
   2a22a:	97 c0       	rjmp	.+302    	; 0x2a35a <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x138>
   2a22c:	08 f0       	brcs	.+2      	; 0x2a230 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0xe>
   2a22e:	48 c0       	rjmp	.+144    	; 0x2a2c0 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x9e>
   2a230:	86 30       	cpi	r24, 0x06	; 6
   2a232:	60 e8       	ldi	r22, 0x80	; 128
   2a234:	96 07       	cpc	r25, r22
   2a236:	09 f4       	brne	.+2      	; 0x2a23a <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x18>
   2a238:	9a c0       	rjmp	.+308    	; 0x2a36e <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x14c>
   2a23a:	30 f5       	brcc	.+76     	; 0x2a288 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x66>
   2a23c:	83 30       	cpi	r24, 0x03	; 3
   2a23e:	40 e8       	ldi	r20, 0x80	; 128
   2a240:	94 07       	cpc	r25, r20
   2a242:	09 f4       	brne	.+2      	; 0x2a246 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x24>
   2a244:	80 c0       	rjmp	.+256    	; 0x2a346 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x124>
   2a246:	a8 f4       	brcc	.+42     	; 0x2a272 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x50>
   2a248:	81 30       	cpi	r24, 0x01	; 1
   2a24a:	20 e8       	ldi	r18, 0x80	; 128
   2a24c:	92 07       	cpc	r25, r18
   2a24e:	09 f4       	brne	.+2      	; 0x2a252 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x30>
   2a250:	17 c1       	rjmp	.+558    	; 0x2a480 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x25e>
   2a252:	82 30       	cpi	r24, 0x02	; 2
   2a254:	40 e8       	ldi	r20, 0x80	; 128
   2a256:	94 07       	cpc	r25, r20
   2a258:	09 f4       	brne	.+2      	; 0x2a25c <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x3a>
   2a25a:	73 c0       	rjmp	.+230    	; 0x2a342 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x120>
static_assert(FindErrorIndex(ERR_MECHANICAL_FINDA_FILAMENT_STUCK) == 1);
static_assert(FindErrorIndex(ERR_MECHANICAL_FSENSOR_DIDNT_TRIGGER) == 2);
static_assert(FindErrorIndex(ERR_MECHANICAL_FSENSOR_FILAMENT_STUCK) == 3);

constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) {
    return (ErrorCode)((uint16_t)a & (uint16_t)b);
   2a25c:	9c 01       	movw	r18, r24
    }

    // Electrical issues which can be detected somehow.
    // Need to be placed before TMC-related errors in order to process couples of error bits between single ones
    // and to keep the code size down.
    if (ContainsBit(ec, ErrorCode::TMC_PULLEY_BIT)) {
   2a25e:	86 ff       	sbrs	r24, 6
   2a260:	8e c0       	rjmp	.+284    	; 0x2a37e <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x15c>
static_assert(FindErrorIndex(ERR_MECHANICAL_FINDA_FILAMENT_STUCK) == 1);
static_assert(FindErrorIndex(ERR_MECHANICAL_FSENSOR_DIDNT_TRIGGER) == 2);
static_assert(FindErrorIndex(ERR_MECHANICAL_FSENSOR_FILAMENT_STUCK) == 3);

constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) {
    return (ErrorCode)((uint16_t)a & (uint16_t)b);
   2a262:	22 27       	eor	r18, r18
   2a264:	32 7c       	andi	r19, 0xC2	; 194

    // Electrical issues which can be detected somehow.
    // Need to be placed before TMC-related errors in order to process couples of error bits between single ones
    // and to keep the code size down.
    if (ContainsBit(ec, ErrorCode::TMC_PULLEY_BIT)) {
        if ((ec & ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION) == ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION) {
   2a266:	21 15       	cp	r18, r1
   2a268:	32 4c       	sbci	r19, 0xC2	; 194
   2a26a:	09 f0       	breq	.+2      	; 0x2a26e <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x4c>
   2a26c:	9e c0       	rjmp	.+316    	; 0x2a3aa <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x188>
            return FindErrorIndex(ERR_ELECTRICAL_MMU_PULLEY_SELFTEST_FAILED);
   2a26e:	8e e1       	ldi	r24, 0x1E	; 30
   2a270:	08 95       	ret
constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) {
    return (uint16_t)ec & (uint16_t)mask;
}

uint8_t PrusaErrorCodeIndex(ErrorCode ec) {
    switch (ec) {
   2a272:	84 30       	cpi	r24, 0x04	; 4
   2a274:	60 e8       	ldi	r22, 0x80	; 128
   2a276:	96 07       	cpc	r25, r22
   2a278:	09 f4       	brne	.+2      	; 0x2a27c <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x5a>
   2a27a:	67 c0       	rjmp	.+206    	; 0x2a34a <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x128>
   2a27c:	85 30       	cpi	r24, 0x05	; 5
   2a27e:	20 e8       	ldi	r18, 0x80	; 128
   2a280:	92 07       	cpc	r25, r18
   2a282:	61 f7       	brne	.-40     	; 0x2a25c <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x3a>
    case ErrorCode::MMU_NOT_RESPONDING:
        return FindErrorIndex(ERR_CONNECT_MMU_NOT_RESPONDING);
    case ErrorCode::PROTOCOL_ERROR:
        return FindErrorIndex(ERR_CONNECT_COMMUNICATION_ERROR);
    case ErrorCode::FILAMENT_ALREADY_LOADED:
        return FindErrorIndex(ERR_SYSTEM_FILAMENT_ALREADY_LOADED);
   2a284:	84 e2       	ldi	r24, 0x24	; 36
   2a286:	08 95       	ret
constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) {
    return (uint16_t)ec & (uint16_t)mask;
}

uint8_t PrusaErrorCodeIndex(ErrorCode ec) {
    switch (ec) {
   2a288:	8a 30       	cpi	r24, 0x0A	; 10
   2a28a:	40 e8       	ldi	r20, 0x80	; 128
   2a28c:	94 07       	cpc	r25, r20
   2a28e:	09 f4       	brne	.+2      	; 0x2a292 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x70>
   2a290:	5e c0       	rjmp	.+188    	; 0x2a34e <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x12c>
   2a292:	58 f4       	brcc	.+22     	; 0x2a2aa <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x88>
   2a294:	88 30       	cpi	r24, 0x08	; 8
   2a296:	20 e8       	ldi	r18, 0x80	; 128
   2a298:	92 07       	cpc	r25, r18
   2a29a:	09 f4       	brne	.+2      	; 0x2a29e <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x7c>
   2a29c:	6e c0       	rjmp	.+220    	; 0x2a37a <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x158>
   2a29e:	89 30       	cpi	r24, 0x09	; 9
   2a2a0:	40 e8       	ldi	r20, 0x80	; 128
   2a2a2:	94 07       	cpc	r25, r20
   2a2a4:	d9 f6       	brne	.-74     	; 0x2a25c <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x3a>
    case ErrorCode::FSENSOR_DIDNT_SWITCH_ON:
        return FindErrorIndex(ERR_MECHANICAL_FSENSOR_DIDNT_TRIGGER);
    case ErrorCode::FSENSOR_DIDNT_SWITCH_OFF:
        return FindErrorIndex(ERR_MECHANICAL_FSENSOR_FILAMENT_STUCK);
    case ErrorCode::FSENSOR_TOO_EARLY:
        return FindErrorIndex(ERR_MECHANICAL_FSENSOR_TOO_EARLY);
   2a2a6:	85 e0       	ldi	r24, 0x05	; 5
   2a2a8:	08 95       	ret
constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) {
    return (uint16_t)ec & (uint16_t)mask;
}

uint8_t PrusaErrorCodeIndex(ErrorCode ec) {
    switch (ec) {
   2a2aa:	8c 30       	cpi	r24, 0x0C	; 12
   2a2ac:	60 e8       	ldi	r22, 0x80	; 128
   2a2ae:	96 07       	cpc	r25, r22
   2a2b0:	09 f4       	brne	.+2      	; 0x2a2b4 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x92>
   2a2b2:	51 c0       	rjmp	.+162    	; 0x2a356 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x134>
   2a2b4:	8d 30       	cpi	r24, 0x0D	; 13
   2a2b6:	20 e8       	ldi	r18, 0x80	; 128
   2a2b8:	92 07       	cpc	r25, r18
   2a2ba:	81 f6       	brne	.-96     	; 0x2a25c <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x3a>
    case ErrorCode::INTERNAL:
        return FindErrorIndex(ERR_SYSTEM_FW_RUNTIME_ERROR);
    case ErrorCode::FINDA_VS_EEPROM_DISREPANCY:
        return FindErrorIndex(ERR_SYSTEM_UNLOAD_MANUALLY);
    case ErrorCode::MCU_UNDERVOLTAGE_VCC:
        return FindErrorIndex(ERR_ELECTRICAL_MMU_MCU_ERROR);
   2a2bc:	81 e2       	ldi	r24, 0x21	; 33
   2a2be:	08 95       	ret
constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) {
    return (uint16_t)ec & (uint16_t)mask;
}

uint8_t PrusaErrorCodeIndex(ErrorCode ec) {
    switch (ec) {
   2a2c0:	8f 32       	cpi	r24, 0x2F	; 47
   2a2c2:	40 e8       	ldi	r20, 0x80	; 128
   2a2c4:	94 07       	cpc	r25, r20
   2a2c6:	09 f4       	brne	.+2      	; 0x2a2ca <MMU2::PrusaErrorCodeIndex(ErrorCode)+0xa8>
   2a2c8:	56 c0       	rjmp	.+172    	; 0x2a376 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x154>
   2a2ca:	e0 f4       	brcc	.+56     	; 0x2a304 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0xe2>
   2a2cc:	8c 32       	cpi	r24, 0x2C	; 44
   2a2ce:	20 e8       	ldi	r18, 0x80	; 128
   2a2d0:	92 07       	cpc	r25, r18
   2a2d2:	09 f4       	brne	.+2      	; 0x2a2d6 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0xb4>
   2a2d4:	4e c0       	rjmp	.+156    	; 0x2a372 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x150>
   2a2d6:	58 f4       	brcc	.+22     	; 0x2a2ee <MMU2::PrusaErrorCodeIndex(ErrorCode)+0xcc>
   2a2d8:	8a 32       	cpi	r24, 0x2A	; 42
   2a2da:	60 e8       	ldi	r22, 0x80	; 128
   2a2dc:	96 07       	cpc	r25, r22
   2a2de:	c9 f1       	breq	.+114    	; 0x2a352 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x130>
   2a2e0:	8b 32       	cpi	r24, 0x2B	; 43
   2a2e2:	20 e8       	ldi	r18, 0x80	; 128
   2a2e4:	92 07       	cpc	r25, r18
   2a2e6:	09 f0       	breq	.+2      	; 0x2a2ea <MMU2::PrusaErrorCodeIndex(ErrorCode)+0xc8>
   2a2e8:	b9 cf       	rjmp	.-142    	; 0x2a25c <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x3a>
    case ErrorCode::FILAMENT_ALREADY_LOADED:
        return FindErrorIndex(ERR_SYSTEM_FILAMENT_ALREADY_LOADED);
    case ErrorCode::INVALID_TOOL:
        return FindErrorIndex(ERR_SYSTEM_INVALID_TOOL);
    case ErrorCode::QUEUE_FULL:
        return FindErrorIndex(ERR_SYSTEM_QUEUE_FULL);
   2a2ea:	86 e2       	ldi	r24, 0x26	; 38
   2a2ec:	08 95       	ret
constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) {
    return (uint16_t)ec & (uint16_t)mask;
}

uint8_t PrusaErrorCodeIndex(ErrorCode ec) {
    switch (ec) {
   2a2ee:	8d 32       	cpi	r24, 0x2D	; 45
   2a2f0:	40 e8       	ldi	r20, 0x80	; 128
   2a2f2:	94 07       	cpc	r25, r20
   2a2f4:	d1 f1       	breq	.+116    	; 0x2a36a <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x148>
   2a2f6:	8e 32       	cpi	r24, 0x2E	; 46
   2a2f8:	60 e8       	ldi	r22, 0x80	; 128
   2a2fa:	96 07       	cpc	r25, r22
   2a2fc:	09 f0       	breq	.+2      	; 0x2a300 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0xde>
   2a2fe:	ae cf       	rjmp	.-164    	; 0x2a25c <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x3a>
        return FindErrorIndex(ERR_MECHANICAL_IDLER_CANNOT_HOME);
    case ErrorCode::MOVE_IDLER_FAILED:
        return FindErrorIndex(ERR_MECHANICAL_IDLER_CANNOT_MOVE);

    case ErrorCode::MMU_NOT_RESPONDING:
        return FindErrorIndex(ERR_CONNECT_MMU_NOT_RESPONDING);
   2a300:	82 e2       	ldi	r24, 0x22	; 34
   2a302:	08 95       	ret
constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) {
    return (uint16_t)ec & (uint16_t)mask;
}

uint8_t PrusaErrorCodeIndex(ErrorCode ec) {
    switch (ec) {
   2a304:	87 38       	cpi	r24, 0x87	; 135
   2a306:	20 e8       	ldi	r18, 0x80	; 128
   2a308:	92 07       	cpc	r25, r18
   2a30a:	49 f1       	breq	.+82     	; 0x2a35e <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x13c>
   2a30c:	58 f4       	brcc	.+22     	; 0x2a324 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x102>
   2a30e:	87 34       	cpi	r24, 0x47	; 71
   2a310:	60 e8       	ldi	r22, 0x80	; 128
   2a312:	96 07       	cpc	r25, r22
   2a314:	29 f0       	breq	.+10     	; 0x2a320 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0xfe>
   2a316:	8b 34       	cpi	r24, 0x4B	; 75
   2a318:	20 e8       	ldi	r18, 0x80	; 128
   2a31a:	92 07       	cpc	r25, r18
   2a31c:	09 f0       	breq	.+2      	; 0x2a320 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0xfe>
   2a31e:	9e cf       	rjmp	.-196    	; 0x2a25c <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x3a>
    case ErrorCode::FILAMENT_CHANGE:
        return FindErrorIndex(ERR_SYSTEM_FILAMENT_CHANGE);

    case ErrorCode::STALLED_PULLEY:
    case ErrorCode::MOVE_PULLEY_FAILED:
        return FindErrorIndex(ERR_MECHANICAL_PULLEY_CANNOT_MOVE);
   2a320:	84 e0       	ldi	r24, 0x04	; 4
   2a322:	08 95       	ret
constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) {
    return (uint16_t)ec & (uint16_t)mask;
}

uint8_t PrusaErrorCodeIndex(ErrorCode ec) {
    switch (ec) {
   2a324:	87 30       	cpi	r24, 0x07	; 7
   2a326:	41 e8       	ldi	r20, 0x81	; 129
   2a328:	94 07       	cpc	r25, r20
   2a32a:	d9 f0       	breq	.+54     	; 0x2a362 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x140>
   2a32c:	8b 30       	cpi	r24, 0x0B	; 11
   2a32e:	61 e8       	ldi	r22, 0x81	; 129
   2a330:	96 07       	cpc	r25, r22
   2a332:	c9 f0       	breq	.+50     	; 0x2a366 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x144>
   2a334:	8b 38       	cpi	r24, 0x8B	; 139
   2a336:	20 e8       	ldi	r18, 0x80	; 128
   2a338:	92 07       	cpc	r25, r18
   2a33a:	09 f0       	breq	.+2      	; 0x2a33e <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x11c>
   2a33c:	8f cf       	rjmp	.-226    	; 0x2a25c <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x3a>
        return FindErrorIndex(ERR_MECHANICAL_PULLEY_CANNOT_MOVE);

    case ErrorCode::HOMING_SELECTOR_FAILED:
        return FindErrorIndex(ERR_MECHANICAL_SELECTOR_CANNOT_HOME);
    case ErrorCode::MOVE_SELECTOR_FAILED:
        return FindErrorIndex(ERR_MECHANICAL_SELECTOR_CANNOT_MOVE);
   2a33e:	89 e0       	ldi	r24, 0x09	; 9
   2a340:	08 95       	ret
uint8_t PrusaErrorCodeIndex(ErrorCode ec) {
    switch (ec) {
    case ErrorCode::FINDA_DIDNT_SWITCH_ON:
        return FindErrorIndex(ERR_MECHANICAL_FINDA_DIDNT_TRIGGER);
    case ErrorCode::FINDA_DIDNT_SWITCH_OFF:
        return FindErrorIndex(ERR_MECHANICAL_FINDA_FILAMENT_STUCK);
   2a342:	81 e0       	ldi	r24, 0x01	; 1
   2a344:	08 95       	ret
    case ErrorCode::FSENSOR_DIDNT_SWITCH_ON:
        return FindErrorIndex(ERR_MECHANICAL_FSENSOR_DIDNT_TRIGGER);
   2a346:	82 e0       	ldi	r24, 0x02	; 2
   2a348:	08 95       	ret
    case ErrorCode::FSENSOR_DIDNT_SWITCH_OFF:
        return FindErrorIndex(ERR_MECHANICAL_FSENSOR_FILAMENT_STUCK);
   2a34a:	83 e0       	ldi	r24, 0x03	; 3
   2a34c:	08 95       	ret
    case ErrorCode::FSENSOR_TOO_EARLY:
        return FindErrorIndex(ERR_MECHANICAL_FSENSOR_TOO_EARLY);
    case ErrorCode::FINDA_FLICKERS:
        return FindErrorIndex(ERR_MECHANICAL_INSPECT_FINDA);
   2a34e:	86 e0       	ldi	r24, 0x06	; 6
   2a350:	08 95       	ret
    case ErrorCode::LOAD_TO_EXTRUDER_FAILED:
        return FindErrorIndex(ERR_MECHANICAL_LOAD_TO_EXTRUDER_FAILED);
   2a352:	87 e0       	ldi	r24, 0x07	; 7
   2a354:	08 95       	ret
    case ErrorCode::FILAMENT_EJECTED:
        return FindErrorIndex(ERR_SYSTEM_FILAMENT_EJECTED);
   2a356:	8a e2       	ldi	r24, 0x2A	; 42
   2a358:	08 95       	ret
    case ErrorCode::FILAMENT_CHANGE:
        return FindErrorIndex(ERR_SYSTEM_FILAMENT_CHANGE);
   2a35a:	8b e2       	ldi	r24, 0x2B	; 43
   2a35c:	08 95       	ret
    case ErrorCode::STALLED_PULLEY:
    case ErrorCode::MOVE_PULLEY_FAILED:
        return FindErrorIndex(ERR_MECHANICAL_PULLEY_CANNOT_MOVE);

    case ErrorCode::HOMING_SELECTOR_FAILED:
        return FindErrorIndex(ERR_MECHANICAL_SELECTOR_CANNOT_HOME);
   2a35e:	88 e0       	ldi	r24, 0x08	; 8
   2a360:	08 95       	ret
    case ErrorCode::MOVE_SELECTOR_FAILED:
        return FindErrorIndex(ERR_MECHANICAL_SELECTOR_CANNOT_MOVE);

    case ErrorCode::HOMING_IDLER_FAILED:
        return FindErrorIndex(ERR_MECHANICAL_IDLER_CANNOT_HOME);
   2a362:	8a e0       	ldi	r24, 0x0A	; 10
   2a364:	08 95       	ret
    case ErrorCode::MOVE_IDLER_FAILED:
        return FindErrorIndex(ERR_MECHANICAL_IDLER_CANNOT_MOVE);
   2a366:	8b e0       	ldi	r24, 0x0B	; 11
   2a368:	08 95       	ret

    case ErrorCode::MMU_NOT_RESPONDING:
        return FindErrorIndex(ERR_CONNECT_MMU_NOT_RESPONDING);
    case ErrorCode::PROTOCOL_ERROR:
        return FindErrorIndex(ERR_CONNECT_COMMUNICATION_ERROR);
   2a36a:	83 e2       	ldi	r24, 0x23	; 35
   2a36c:	08 95       	ret
    case ErrorCode::FILAMENT_ALREADY_LOADED:
        return FindErrorIndex(ERR_SYSTEM_FILAMENT_ALREADY_LOADED);
    case ErrorCode::INVALID_TOOL:
        return FindErrorIndex(ERR_SYSTEM_INVALID_TOOL);
   2a36e:	85 e2       	ldi	r24, 0x25	; 37
   2a370:	08 95       	ret
    case ErrorCode::QUEUE_FULL:
        return FindErrorIndex(ERR_SYSTEM_QUEUE_FULL);
    case ErrorCode::VERSION_MISMATCH:
        return FindErrorIndex(ERR_SYSTEM_FW_UPDATE_NEEDED);
   2a372:	87 e2       	ldi	r24, 0x27	; 39
   2a374:	08 95       	ret
    case ErrorCode::INTERNAL:
        return FindErrorIndex(ERR_SYSTEM_FW_RUNTIME_ERROR);
   2a376:	88 e2       	ldi	r24, 0x28	; 40
   2a378:	08 95       	ret
    case ErrorCode::FINDA_VS_EEPROM_DISREPANCY:
        return FindErrorIndex(ERR_SYSTEM_UNLOAD_MANUALLY);
   2a37a:	89 e2       	ldi	r24, 0x29	; 41
   2a37c:	08 95       	ret
    // and to keep the code size down.
    if (ContainsBit(ec, ErrorCode::TMC_PULLEY_BIT)) {
        if ((ec & ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION) == ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION) {
            return FindErrorIndex(ERR_ELECTRICAL_MMU_PULLEY_SELFTEST_FAILED);
        }
    } else if (ContainsBit(ec, ErrorCode::TMC_SELECTOR_BIT)) {
   2a37e:	87 ff       	sbrs	r24, 7
   2a380:	07 c0       	rjmp	.+14     	; 0x2a390 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x16e>
static_assert(FindErrorIndex(ERR_MECHANICAL_FINDA_FILAMENT_STUCK) == 1);
static_assert(FindErrorIndex(ERR_MECHANICAL_FSENSOR_DIDNT_TRIGGER) == 2);
static_assert(FindErrorIndex(ERR_MECHANICAL_FSENSOR_FILAMENT_STUCK) == 3);

constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) {
    return (ErrorCode)((uint16_t)a & (uint16_t)b);
   2a382:	22 27       	eor	r18, r18
   2a384:	32 7c       	andi	r19, 0xC2	; 194
    if (ContainsBit(ec, ErrorCode::TMC_PULLEY_BIT)) {
        if ((ec & ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION) == ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION) {
            return FindErrorIndex(ERR_ELECTRICAL_MMU_PULLEY_SELFTEST_FAILED);
        }
    } else if (ContainsBit(ec, ErrorCode::TMC_SELECTOR_BIT)) {
        if ((ec & ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION) == ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION) {
   2a386:	21 15       	cp	r18, r1
   2a388:	32 4c       	sbci	r19, 0xC2	; 194
   2a38a:	a1 f5       	brne	.+104    	; 0x2a3f4 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x1d2>
            return FindErrorIndex(ERR_ELECTRICAL_MMU_SELECTOR_SELFTEST_FAILED);
   2a38c:	8f e1       	ldi	r24, 0x1F	; 31
   2a38e:	08 95       	ret
        }
    } else if (ContainsBit(ec, ErrorCode::TMC_IDLER_BIT)) {
   2a390:	22 27       	eor	r18, r18
   2a392:	31 70       	andi	r19, 0x01	; 1
   2a394:	90 ff       	sbrs	r25, 0
   2a396:	52 c0       	rjmp	.+164    	; 0x2a43c <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x21a>
static_assert(FindErrorIndex(ERR_MECHANICAL_FINDA_FILAMENT_STUCK) == 1);
static_assert(FindErrorIndex(ERR_MECHANICAL_FSENSOR_DIDNT_TRIGGER) == 2);
static_assert(FindErrorIndex(ERR_MECHANICAL_FSENSOR_FILAMENT_STUCK) == 3);

constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) {
    return (ErrorCode)((uint16_t)a & (uint16_t)b);
   2a398:	ac 01       	movw	r20, r24
   2a39a:	44 27       	eor	r20, r20
   2a39c:	52 7c       	andi	r21, 0xC2	; 194
    } else if (ContainsBit(ec, ErrorCode::TMC_SELECTOR_BIT)) {
        if ((ec & ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION) == ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION) {
            return FindErrorIndex(ERR_ELECTRICAL_MMU_SELECTOR_SELFTEST_FAILED);
        }
    } else if (ContainsBit(ec, ErrorCode::TMC_IDLER_BIT)) {
        if ((ec & ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION) == ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION) {
   2a39e:	41 15       	cp	r20, r1
   2a3a0:	52 4c       	sbci	r21, 0xC2	; 194
   2a3a2:	09 f0       	breq	.+2      	; 0x2a3a6 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x184>
   2a3a4:	4b c0       	rjmp	.+150    	; 0x2a43c <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x21a>
            return FindErrorIndex(ERR_ELECTRICAL_MMU_IDLER_SELFTEST_FAILED);
   2a3a6:	80 e2       	ldi	r24, 0x20	; 32
   2a3a8:	08 95       	ret
constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) {
    return (ErrorCode)((uint16_t)a & (uint16_t)b);
}

constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) {
    return (uint16_t)ec & (uint16_t)mask;
   2a3aa:	9c 01       	movw	r18, r24
   2a3ac:	22 27       	eor	r18, r18
   2a3ae:	32 78       	andi	r19, 0x82	; 130

    // TMC-related errors - multiple of these can occur at once
    // - in such a case we report the first which gets found/converted into Prusa-Error-Codes (usually the fact, that one TMC has an issue is serious enough)
    // By carefully ordering the checks here we can prioritize the errors being reported to the user.
    if (ContainsBit(ec, ErrorCode::TMC_PULLEY_BIT)) {
        if (ContainsBit(ec, ErrorCode::TMC_IOIN_MISMATCH)) {
   2a3b0:	23 2b       	or	r18, r19
   2a3b2:	09 f0       	breq	.+2      	; 0x2a3b6 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x194>
   2a3b4:	67 c0       	rjmp	.+206    	; 0x2a484 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x262>
constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) {
    return (ErrorCode)((uint16_t)a & (uint16_t)b);
}

constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) {
    return (uint16_t)ec & (uint16_t)mask;
   2a3b6:	9c 01       	movw	r18, r24
   2a3b8:	22 27       	eor	r18, r18
   2a3ba:	34 78       	andi	r19, 0x84	; 132
    // By carefully ordering the checks here we can prioritize the errors being reported to the user.
    if (ContainsBit(ec, ErrorCode::TMC_PULLEY_BIT)) {
        if (ContainsBit(ec, ErrorCode::TMC_IOIN_MISMATCH)) {
            return FindErrorIndex(ERR_ELECTRICAL_TMC_PULLEY_DRIVER_ERROR);
        }
        if (ContainsBit(ec, ErrorCode::TMC_RESET)) {
   2a3bc:	23 2b       	or	r18, r19
   2a3be:	09 f0       	breq	.+2      	; 0x2a3c2 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x1a0>
   2a3c0:	63 c0       	rjmp	.+198    	; 0x2a488 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x266>
constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) {
    return (ErrorCode)((uint16_t)a & (uint16_t)b);
}

constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) {
    return (uint16_t)ec & (uint16_t)mask;
   2a3c2:	9c 01       	movw	r18, r24
   2a3c4:	22 27       	eor	r18, r18
   2a3c6:	38 78       	andi	r19, 0x88	; 136
            return FindErrorIndex(ERR_ELECTRICAL_TMC_PULLEY_DRIVER_ERROR);
        }
        if (ContainsBit(ec, ErrorCode::TMC_RESET)) {
            return FindErrorIndex(ERR_ELECTRICAL_TMC_PULLEY_DRIVER_RESET);
        }
        if (ContainsBit(ec, ErrorCode::TMC_UNDERVOLTAGE_ON_CHARGE_PUMP)) {
   2a3c8:	23 2b       	or	r18, r19
   2a3ca:	09 f0       	breq	.+2      	; 0x2a3ce <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x1ac>
   2a3cc:	5f c0       	rjmp	.+190    	; 0x2a48c <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x26a>
constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) {
    return (ErrorCode)((uint16_t)a & (uint16_t)b);
}

constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) {
    return (uint16_t)ec & (uint16_t)mask;
   2a3ce:	9c 01       	movw	r18, r24
   2a3d0:	22 27       	eor	r18, r18
   2a3d2:	30 79       	andi	r19, 0x90	; 144
            return FindErrorIndex(ERR_ELECTRICAL_TMC_PULLEY_DRIVER_RESET);
        }
        if (ContainsBit(ec, ErrorCode::TMC_UNDERVOLTAGE_ON_CHARGE_PUMP)) {
            return FindErrorIndex(ERR_ELECTRICAL_TMC_PULLEY_UNDERVOLTAGE_ERROR);
        }
        if (ContainsBit(ec, ErrorCode::TMC_SHORT_TO_GROUND)) {
   2a3d4:	23 2b       	or	r18, r19
   2a3d6:	09 f0       	breq	.+2      	; 0x2a3da <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x1b8>
   2a3d8:	5b c0       	rjmp	.+182    	; 0x2a490 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x26e>
constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) {
    return (ErrorCode)((uint16_t)a & (uint16_t)b);
}

constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) {
    return (uint16_t)ec & (uint16_t)mask;
   2a3da:	9c 01       	movw	r18, r24
   2a3dc:	22 27       	eor	r18, r18
   2a3de:	30 7a       	andi	r19, 0xA0	; 160
            return FindErrorIndex(ERR_ELECTRICAL_TMC_PULLEY_UNDERVOLTAGE_ERROR);
        }
        if (ContainsBit(ec, ErrorCode::TMC_SHORT_TO_GROUND)) {
            return FindErrorIndex(ERR_ELECTRICAL_TMC_PULLEY_DRIVER_SHORTED);
        }
        if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_WARN)) {
   2a3e0:	23 2b       	or	r18, r19
   2a3e2:	09 f0       	breq	.+2      	; 0x2a3e6 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x1c4>
   2a3e4:	57 c0       	rjmp	.+174    	; 0x2a494 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x272>
constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) {
    return (ErrorCode)((uint16_t)a & (uint16_t)b);
}

constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) {
    return (uint16_t)ec & (uint16_t)mask;
   2a3e6:	88 27       	eor	r24, r24
   2a3e8:	90 7c       	andi	r25, 0xC0	; 192
            return FindErrorIndex(ERR_ELECTRICAL_TMC_PULLEY_DRIVER_SHORTED);
        }
        if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_WARN)) {
            return FindErrorIndex(ERR_TEMPERATURE_WARNING_TMC_PULLEY_TOO_HOT);
        }
        if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_ERROR)) {
   2a3ea:	89 2b       	or	r24, r25
   2a3ec:	09 f4       	brne	.+2      	; 0x2a3f0 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x1ce>
   2a3ee:	68 c0       	rjmp	.+208    	; 0x2a4c0 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x29e>
            return FindErrorIndex(ERR_TEMPERATURE_TMC_PULLEY_OVERHEAT_ERROR);
   2a3f0:	8f e0       	ldi	r24, 0x0F	; 15
   2a3f2:	08 95       	ret
constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) {
    return (ErrorCode)((uint16_t)a & (uint16_t)b);
}

constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) {
    return (uint16_t)ec & (uint16_t)mask;
   2a3f4:	9c 01       	movw	r18, r24
   2a3f6:	22 27       	eor	r18, r18
   2a3f8:	32 78       	andi	r19, 0x82	; 130
        }
        if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_ERROR)) {
            return FindErrorIndex(ERR_TEMPERATURE_TMC_PULLEY_OVERHEAT_ERROR);
        }
    } else if (ContainsBit(ec, ErrorCode::TMC_SELECTOR_BIT)) {
        if (ContainsBit(ec, ErrorCode::TMC_IOIN_MISMATCH)) {
   2a3fa:	23 2b       	or	r18, r19
   2a3fc:	09 f0       	breq	.+2      	; 0x2a400 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x1de>
   2a3fe:	4c c0       	rjmp	.+152    	; 0x2a498 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x276>
constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) {
    return (ErrorCode)((uint16_t)a & (uint16_t)b);
}

constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) {
    return (uint16_t)ec & (uint16_t)mask;
   2a400:	9c 01       	movw	r18, r24
   2a402:	22 27       	eor	r18, r18
   2a404:	34 78       	andi	r19, 0x84	; 132
        }
    } else if (ContainsBit(ec, ErrorCode::TMC_SELECTOR_BIT)) {
        if (ContainsBit(ec, ErrorCode::TMC_IOIN_MISMATCH)) {
            return FindErrorIndex(ERR_ELECTRICAL_TMC_SELECTOR_DRIVER_ERROR);
        }
        if (ContainsBit(ec, ErrorCode::TMC_RESET)) {
   2a406:	23 2b       	or	r18, r19
   2a408:	09 f0       	breq	.+2      	; 0x2a40c <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x1ea>
   2a40a:	48 c0       	rjmp	.+144    	; 0x2a49c <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x27a>
constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) {
    return (ErrorCode)((uint16_t)a & (uint16_t)b);
}

constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) {
    return (uint16_t)ec & (uint16_t)mask;
   2a40c:	9c 01       	movw	r18, r24
   2a40e:	22 27       	eor	r18, r18
   2a410:	38 78       	andi	r19, 0x88	; 136
            return FindErrorIndex(ERR_ELECTRICAL_TMC_SELECTOR_DRIVER_ERROR);
        }
        if (ContainsBit(ec, ErrorCode::TMC_RESET)) {
            return FindErrorIndex(ERR_ELECTRICAL_TMC_SELECTOR_DRIVER_RESET);
        }
        if (ContainsBit(ec, ErrorCode::TMC_UNDERVOLTAGE_ON_CHARGE_PUMP)) {
   2a412:	23 2b       	or	r18, r19
   2a414:	09 f0       	breq	.+2      	; 0x2a418 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x1f6>
   2a416:	44 c0       	rjmp	.+136    	; 0x2a4a0 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x27e>
constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) {
    return (ErrorCode)((uint16_t)a & (uint16_t)b);
}

constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) {
    return (uint16_t)ec & (uint16_t)mask;
   2a418:	9c 01       	movw	r18, r24
   2a41a:	22 27       	eor	r18, r18
   2a41c:	30 79       	andi	r19, 0x90	; 144
            return FindErrorIndex(ERR_ELECTRICAL_TMC_SELECTOR_DRIVER_RESET);
        }
        if (ContainsBit(ec, ErrorCode::TMC_UNDERVOLTAGE_ON_CHARGE_PUMP)) {
            return FindErrorIndex(ERR_ELECTRICAL_TMC_SELECTOR_UNDERVOLTAGE_ERROR);
        }
        if (ContainsBit(ec, ErrorCode::TMC_SHORT_TO_GROUND)) {
   2a41e:	23 2b       	or	r18, r19
   2a420:	09 f0       	breq	.+2      	; 0x2a424 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x202>
   2a422:	40 c0       	rjmp	.+128    	; 0x2a4a4 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x282>
constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) {
    return (ErrorCode)((uint16_t)a & (uint16_t)b);
}

constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) {
    return (uint16_t)ec & (uint16_t)mask;
   2a424:	9c 01       	movw	r18, r24
   2a426:	22 27       	eor	r18, r18
   2a428:	30 7a       	andi	r19, 0xA0	; 160
            return FindErrorIndex(ERR_ELECTRICAL_TMC_SELECTOR_UNDERVOLTAGE_ERROR);
        }
        if (ContainsBit(ec, ErrorCode::TMC_SHORT_TO_GROUND)) {
            return FindErrorIndex(ERR_ELECTRICAL_TMC_SELECTOR_DRIVER_SHORTED);
        }
        if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_WARN)) {
   2a42a:	23 2b       	or	r18, r19
   2a42c:	e9 f5       	brne	.+122    	; 0x2a4a8 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x286>
constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) {
    return (ErrorCode)((uint16_t)a & (uint16_t)b);
}

constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) {
    return (uint16_t)ec & (uint16_t)mask;
   2a42e:	88 27       	eor	r24, r24
   2a430:	90 7c       	andi	r25, 0xC0	; 192
            return FindErrorIndex(ERR_ELECTRICAL_TMC_SELECTOR_DRIVER_SHORTED);
        }
        if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_WARN)) {
            return FindErrorIndex(ERR_TEMPERATURE_WARNING_TMC_SELECTOR_TOO_HOT);
        }
        if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_ERROR)) {
   2a432:	89 2b       	or	r24, r25
   2a434:	09 f4       	brne	.+2      	; 0x2a438 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x216>
   2a436:	44 c0       	rjmp	.+136    	; 0x2a4c0 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x29e>
            return FindErrorIndex(ERR_TEMPERATURE_TMC_SELECTOR_OVERHEAT_ERROR);
   2a438:	80 e1       	ldi	r24, 0x10	; 16
   2a43a:	08 95       	ret
        }
    } else if (ContainsBit(ec, ErrorCode::TMC_IDLER_BIT)) {
   2a43c:	23 2b       	or	r18, r19
   2a43e:	09 f4       	brne	.+2      	; 0x2a442 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x220>
   2a440:	3f c0       	rjmp	.+126    	; 0x2a4c0 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x29e>
constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) {
    return (ErrorCode)((uint16_t)a & (uint16_t)b);
}

constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) {
    return (uint16_t)ec & (uint16_t)mask;
   2a442:	9c 01       	movw	r18, r24
   2a444:	22 27       	eor	r18, r18
   2a446:	32 78       	andi	r19, 0x82	; 130
        }
        if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_ERROR)) {
            return FindErrorIndex(ERR_TEMPERATURE_TMC_SELECTOR_OVERHEAT_ERROR);
        }
    } else if (ContainsBit(ec, ErrorCode::TMC_IDLER_BIT)) {
        if (ContainsBit(ec, ErrorCode::TMC_IOIN_MISMATCH)) {
   2a448:	23 2b       	or	r18, r19
   2a44a:	81 f5       	brne	.+96     	; 0x2a4ac <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x28a>
constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) {
    return (ErrorCode)((uint16_t)a & (uint16_t)b);
}

constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) {
    return (uint16_t)ec & (uint16_t)mask;
   2a44c:	9c 01       	movw	r18, r24
   2a44e:	22 27       	eor	r18, r18
   2a450:	34 78       	andi	r19, 0x84	; 132
        }
    } else if (ContainsBit(ec, ErrorCode::TMC_IDLER_BIT)) {
        if (ContainsBit(ec, ErrorCode::TMC_IOIN_MISMATCH)) {
            return FindErrorIndex(ERR_ELECTRICAL_TMC_IDLER_DRIVER_ERROR);
        }
        if (ContainsBit(ec, ErrorCode::TMC_RESET)) {
   2a452:	23 2b       	or	r18, r19
   2a454:	69 f5       	brne	.+90     	; 0x2a4b0 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x28e>
constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) {
    return (ErrorCode)((uint16_t)a & (uint16_t)b);
}

constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) {
    return (uint16_t)ec & (uint16_t)mask;
   2a456:	9c 01       	movw	r18, r24
   2a458:	22 27       	eor	r18, r18
   2a45a:	38 78       	andi	r19, 0x88	; 136
            return FindErrorIndex(ERR_ELECTRICAL_TMC_IDLER_DRIVER_ERROR);
        }
        if (ContainsBit(ec, ErrorCode::TMC_RESET)) {
            return FindErrorIndex(ERR_ELECTRICAL_TMC_IDLER_DRIVER_RESET);
        }
        if (ContainsBit(ec, ErrorCode::TMC_UNDERVOLTAGE_ON_CHARGE_PUMP)) {
   2a45c:	23 2b       	or	r18, r19
   2a45e:	51 f5       	brne	.+84     	; 0x2a4b4 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x292>
constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) {
    return (ErrorCode)((uint16_t)a & (uint16_t)b);
}

constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) {
    return (uint16_t)ec & (uint16_t)mask;
   2a460:	9c 01       	movw	r18, r24
   2a462:	22 27       	eor	r18, r18
   2a464:	30 79       	andi	r19, 0x90	; 144
            return FindErrorIndex(ERR_ELECTRICAL_TMC_IDLER_DRIVER_RESET);
        }
        if (ContainsBit(ec, ErrorCode::TMC_UNDERVOLTAGE_ON_CHARGE_PUMP)) {
            return FindErrorIndex(ERR_ELECTRICAL_TMC_IDLER_UNDERVOLTAGE_ERROR);
        }
        if (ContainsBit(ec, ErrorCode::TMC_SHORT_TO_GROUND)) {
   2a466:	23 2b       	or	r18, r19
   2a468:	39 f5       	brne	.+78     	; 0x2a4b8 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x296>
constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) {
    return (ErrorCode)((uint16_t)a & (uint16_t)b);
}

constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) {
    return (uint16_t)ec & (uint16_t)mask;
   2a46a:	9c 01       	movw	r18, r24
   2a46c:	22 27       	eor	r18, r18
   2a46e:	30 7a       	andi	r19, 0xA0	; 160
            return FindErrorIndex(ERR_ELECTRICAL_TMC_IDLER_UNDERVOLTAGE_ERROR);
        }
        if (ContainsBit(ec, ErrorCode::TMC_SHORT_TO_GROUND)) {
            return FindErrorIndex(ERR_ELECTRICAL_TMC_IDLER_DRIVER_SHORTED);
        }
        if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_WARN)) {
   2a470:	23 2b       	or	r18, r19
   2a472:	21 f5       	brne	.+72     	; 0x2a4bc <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x29a>
constexpr ErrorCode operator&(ErrorCode a, ErrorCode b) {
    return (ErrorCode)((uint16_t)a & (uint16_t)b);
}

constexpr bool ContainsBit(ErrorCode ec, ErrorCode mask) {
    return (uint16_t)ec & (uint16_t)mask;
   2a474:	88 27       	eor	r24, r24
   2a476:	90 7c       	andi	r25, 0xC0	; 192
            return FindErrorIndex(ERR_ELECTRICAL_TMC_IDLER_DRIVER_SHORTED);
        }
        if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_WARN)) {
            return FindErrorIndex(ERR_TEMPERATURE_WARNING_TMC_IDLER_TOO_HOT);
        }
        if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_ERROR)) {
   2a478:	89 2b       	or	r24, r25
   2a47a:	11 f1       	breq	.+68     	; 0x2a4c0 <MMU2::PrusaErrorCodeIndex(ErrorCode)+0x29e>
            return FindErrorIndex(ERR_TEMPERATURE_TMC_IDLER_OVERHEAT_ERROR);
   2a47c:	81 e1       	ldi	r24, 0x11	; 17
   2a47e:	08 95       	ret
}

uint8_t PrusaErrorCodeIndex(ErrorCode ec) {
    switch (ec) {
    case ErrorCode::FINDA_DIDNT_SWITCH_ON:
        return FindErrorIndex(ERR_MECHANICAL_FINDA_DIDNT_TRIGGER);
   2a480:	80 e0       	ldi	r24, 0x00	; 0
   2a482:	08 95       	ret
    // TMC-related errors - multiple of these can occur at once
    // - in such a case we report the first which gets found/converted into Prusa-Error-Codes (usually the fact, that one TMC has an issue is serious enough)
    // By carefully ordering the checks here we can prioritize the errors being reported to the user.
    if (ContainsBit(ec, ErrorCode::TMC_PULLEY_BIT)) {
        if (ContainsBit(ec, ErrorCode::TMC_IOIN_MISMATCH)) {
            return FindErrorIndex(ERR_ELECTRICAL_TMC_PULLEY_DRIVER_ERROR);
   2a484:	82 e1       	ldi	r24, 0x12	; 18
   2a486:	08 95       	ret
        }
        if (ContainsBit(ec, ErrorCode::TMC_RESET)) {
            return FindErrorIndex(ERR_ELECTRICAL_TMC_PULLEY_DRIVER_RESET);
   2a488:	85 e1       	ldi	r24, 0x15	; 21
   2a48a:	08 95       	ret
        }
        if (ContainsBit(ec, ErrorCode::TMC_UNDERVOLTAGE_ON_CHARGE_PUMP)) {
            return FindErrorIndex(ERR_ELECTRICAL_TMC_PULLEY_UNDERVOLTAGE_ERROR);
   2a48c:	88 e1       	ldi	r24, 0x18	; 24
   2a48e:	08 95       	ret
        }
        if (ContainsBit(ec, ErrorCode::TMC_SHORT_TO_GROUND)) {
            return FindErrorIndex(ERR_ELECTRICAL_TMC_PULLEY_DRIVER_SHORTED);
   2a490:	8b e1       	ldi	r24, 0x1B	; 27
   2a492:	08 95       	ret
        }
        if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_WARN)) {
            return FindErrorIndex(ERR_TEMPERATURE_WARNING_TMC_PULLEY_TOO_HOT);
   2a494:	8c e0       	ldi	r24, 0x0C	; 12
   2a496:	08 95       	ret
        if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_ERROR)) {
            return FindErrorIndex(ERR_TEMPERATURE_TMC_PULLEY_OVERHEAT_ERROR);
        }
    } else if (ContainsBit(ec, ErrorCode::TMC_SELECTOR_BIT)) {
        if (ContainsBit(ec, ErrorCode::TMC_IOIN_MISMATCH)) {
            return FindErrorIndex(ERR_ELECTRICAL_TMC_SELECTOR_DRIVER_ERROR);
   2a498:	83 e1       	ldi	r24, 0x13	; 19
   2a49a:	08 95       	ret
        }
        if (ContainsBit(ec, ErrorCode::TMC_RESET)) {
            return FindErrorIndex(ERR_ELECTRICAL_TMC_SELECTOR_DRIVER_RESET);
   2a49c:	86 e1       	ldi	r24, 0x16	; 22
   2a49e:	08 95       	ret
        }
        if (ContainsBit(ec, ErrorCode::TMC_UNDERVOLTAGE_ON_CHARGE_PUMP)) {
            return FindErrorIndex(ERR_ELECTRICAL_TMC_SELECTOR_UNDERVOLTAGE_ERROR);
   2a4a0:	89 e1       	ldi	r24, 0x19	; 25
   2a4a2:	08 95       	ret
        }
        if (ContainsBit(ec, ErrorCode::TMC_SHORT_TO_GROUND)) {
            return FindErrorIndex(ERR_ELECTRICAL_TMC_SELECTOR_DRIVER_SHORTED);
   2a4a4:	8c e1       	ldi	r24, 0x1C	; 28
   2a4a6:	08 95       	ret
        }
        if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_WARN)) {
            return FindErrorIndex(ERR_TEMPERATURE_WARNING_TMC_SELECTOR_TOO_HOT);
   2a4a8:	8d e0       	ldi	r24, 0x0D	; 13
   2a4aa:	08 95       	ret
        if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_ERROR)) {
            return FindErrorIndex(ERR_TEMPERATURE_TMC_SELECTOR_OVERHEAT_ERROR);
        }
    } else if (ContainsBit(ec, ErrorCode::TMC_IDLER_BIT)) {
        if (ContainsBit(ec, ErrorCode::TMC_IOIN_MISMATCH)) {
            return FindErrorIndex(ERR_ELECTRICAL_TMC_IDLER_DRIVER_ERROR);
   2a4ac:	84 e1       	ldi	r24, 0x14	; 20
   2a4ae:	08 95       	ret
        }
        if (ContainsBit(ec, ErrorCode::TMC_RESET)) {
            return FindErrorIndex(ERR_ELECTRICAL_TMC_IDLER_DRIVER_RESET);
   2a4b0:	87 e1       	ldi	r24, 0x17	; 23
   2a4b2:	08 95       	ret
        }
        if (ContainsBit(ec, ErrorCode::TMC_UNDERVOLTAGE_ON_CHARGE_PUMP)) {
            return FindErrorIndex(ERR_ELECTRICAL_TMC_IDLER_UNDERVOLTAGE_ERROR);
   2a4b4:	8a e1       	ldi	r24, 0x1A	; 26
   2a4b6:	08 95       	ret
        }
        if (ContainsBit(ec, ErrorCode::TMC_SHORT_TO_GROUND)) {
            return FindErrorIndex(ERR_ELECTRICAL_TMC_IDLER_DRIVER_SHORTED);
   2a4b8:	8d e1       	ldi	r24, 0x1D	; 29
   2a4ba:	08 95       	ret
        }
        if (ContainsBit(ec, ErrorCode::TMC_OVER_TEMPERATURE_WARN)) {
            return FindErrorIndex(ERR_TEMPERATURE_WARNING_TMC_IDLER_TOO_HOT);
   2a4bc:	8e e0       	ldi	r24, 0x0E	; 14
   2a4be:	08 95       	ret
            return FindErrorIndex(ERR_TEMPERATURE_TMC_IDLER_OVERHEAT_ERROR);
        }
    }

    // if nothing got caught, return a generic error
    return FindErrorIndex(ERR_OTHER_UNKNOWN_ERROR);
   2a4c0:	8c e2       	ldi	r24, 0x2C	; 44
}
   2a4c2:	08 95       	ret

0002a4c4 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]>:

bool TuneMenuEntered() {
    return putErrorScreenToSleep;
}

void ReportErrorHook(CommandInProgress /*cip*/, ErrorCode ec, uint8_t /*es*/) {
   2a4c4:	cf 92       	push	r12
   2a4c6:	df 92       	push	r13
   2a4c8:	ef 92       	push	r14
   2a4ca:	ff 92       	push	r15
   2a4cc:	0f 93       	push	r16
   2a4ce:	1f 93       	push	r17
   2a4d0:	cf 93       	push	r28
   2a4d2:	df 93       	push	r29
    if (putErrorScreenToSleep) return;

    if (mmu2.MMUCurrentErrorCode() == ErrorCode::OK && mmu2.MMULastErrorSource() == MMU2::ErrorSourceMMU) {
   2a4d4:	20 91 d2 12 	lds	r18, 0x12D2	; 0x8012d2 <MMU2::mmu2+0x40>
   2a4d8:	30 91 d3 12 	lds	r19, 0x12D3	; 0x8012d3 <MMU2::mmu2+0x41>
   2a4dc:	21 30       	cpi	r18, 0x01	; 1
   2a4de:	31 05       	cpc	r19, r1
   2a4e0:	39 f4       	brne	.+14     	; 0x2a4f0 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x2c>
   2a4e2:	20 91 fb 12 	lds	r18, 0x12FB	; 0x8012fb <MMU2::mmu2+0x69>
   2a4e6:	21 30       	cpi	r18, 0x01	; 1
   2a4e8:	19 f4       	brne	.+6      	; 0x2a4f0 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x2c>
        // If the error code suddenly changes to OK, that means
        // a button was pushed on the MMU and the LCD should
        // dismiss the error screen until MMU raises a new error
        ReportErrorHookState = ReportErrorHookStates::DISMISS_ERROR_SCREEN;
   2a4ea:	22 e0       	ldi	r18, 0x02	; 2
   2a4ec:	20 93 89 04 	sts	0x0489, r18	; 0x800489 <MMU2::ReportErrorHookState>
    }

    const uint8_t ei = PrusaErrorCodeIndex((ErrorCode)ec);
   2a4f0:	0f 94 11 51 	call	0x2a222	; 0x2a222 <MMU2::PrusaErrorCodeIndex(ErrorCode)>
   2a4f4:	d8 2f       	mov	r29, r24

    switch ((uint8_t)ReportErrorHookState) {
   2a4f6:	80 91 89 04 	lds	r24, 0x0489	; 0x800489 <MMU2::ReportErrorHookState>
   2a4fa:	81 30       	cpi	r24, 0x01	; 1
   2a4fc:	09 f4       	brne	.+2      	; 0x2a500 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x3c>
   2a4fe:	64 c0       	rjmp	.+200    	; 0x2a5c8 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x104>
   2a500:	60 f0       	brcs	.+24     	; 0x2a51a <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x56>
   2a502:	82 30       	cpi	r24, 0x02	; 2
   2a504:	09 f4       	brne	.+2      	; 0x2a508 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x44>
   2a506:	f4 c0       	rjmp	.+488    	; 0x2a6f0 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x22c>
        ReportErrorHookState = ReportErrorHookStates::RENDER_ERROR_SCREEN;
        break;
    default:
        break;
    }
}
   2a508:	df 91       	pop	r29
   2a50a:	cf 91       	pop	r28
   2a50c:	1f 91       	pop	r17
   2a50e:	0f 91       	pop	r16
   2a510:	ff 90       	pop	r15
   2a512:	ef 90       	pop	r14
   2a514:	df 90       	pop	r13
   2a516:	cf 90       	pop	r12
   2a518:	08 95       	ret

    const uint8_t ei = PrusaErrorCodeIndex((ErrorCode)ec);

    switch ((uint8_t)ReportErrorHookState) {
    case (uint8_t)ReportErrorHookStates::RENDER_ERROR_SCREEN:
        KEEPALIVE_STATE(PAUSED_FOR_USER);
   2a51a:	84 e0       	ldi	r24, 0x04	; 4
   2a51c:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
const char *PrusaErrorDesc(uint8_t i) {
    return (const char *)pgm_read_ptr(errorDescs + i);
}

uint8_t PrusaErrorButtons(uint8_t i) {
    return pgm_read_byte(errorButtons + i);
   2a520:	0d 2f       	mov	r16, r29
   2a522:	10 e0       	ldi	r17, 0x00	; 0
   2a524:	f8 01       	movw	r30, r16
   2a526:	e9 5c       	subi	r30, 0xC9	; 201
   2a528:	f7 47       	sbci	r31, 0x77	; 119
   2a52a:	c4 91       	lpm	r28, Z
    //! |>Retry   >Done    >W|     <- buttons
    bool two_choices = false;

    // Read and determine what operations should be shown on the menu
    const uint8_t button_operation   = PrusaErrorButtons(ei);
    const uint8_t button_op_right = BUTTON_OP_RIGHT(button_operation);
   2a52c:	fc 2e       	mov	r15, r28
   2a52e:	f2 94       	swap	r15
   2a530:	6f e0       	ldi	r22, 0x0F	; 15
   2a532:	f6 22       	and	r15, r22
    const uint8_t button_op_middle  = BUTTON_OP_MIDDLE(button_operation);
   2a534:	cf 70       	andi	r28, 0x0F	; 15
    if (button_op_right == (uint8_t)ButtonOperations::NoOperation){
        // Two operations not specified, the error menu should only show two choices
        two_choices = true;
    }

    lcd_update_enable(false);
   2a536:	80 e0       	ldi	r24, 0x00	; 0
   2a538:	0e 94 38 70 	call	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>
    lcd_clear();
   2a53c:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>
    // if nothing got caught, return a generic error
    return FindErrorIndex(ERR_OTHER_UNKNOWN_ERROR);
}

uint16_t PrusaErrorCode(uint8_t i) {
    return pgm_read_word(errorCodes + i);
   2a540:	00 0f       	add	r16, r16
   2a542:	11 1f       	adc	r17, r17
   2a544:	f8 01       	movw	r30, r16
   2a546:	ec 59       	subi	r30, 0x9C	; 156
   2a548:	f7 47       	sbci	r31, 0x77	; 119
   2a54a:	c5 90       	lpm	r12, Z+
   2a54c:	d4 90       	lpm	r13, Z
}

const char *PrusaErrorTitle(uint8_t i) {
    return (const char *)pgm_read_ptr(errorTitles + i);
   2a54e:	00 5e       	subi	r16, 0xE0	; 224
   2a550:	10 46       	sbci	r17, 0x60	; 96
   2a552:	f8 01       	movw	r30, r16
   2a554:	85 91       	lpm	r24, Z+
   2a556:	94 91       	lpm	r25, Z

    // Print title and header
    lcd_printf_P(PSTR("%.20S\nprusa.io/04%hu"), _T(PrusaErrorTitle(ei)), PrusaErrorCode(ei) );
   2a558:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   2a55c:	df 92       	push	r13
   2a55e:	cf 92       	push	r12
   2a560:	9f 93       	push	r25
   2a562:	8f 93       	push	r24
   2a564:	80 ed       	ldi	r24, 0xD0	; 208
   2a566:	98 e8       	ldi	r25, 0x88	; 136
   2a568:	9f 93       	push	r25
   2a56a:	8f 93       	push	r24
   2a56c:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
    lcd_show_choices_prompt_P(two_choices ? LCD_LEFT_BUTTON_CHOICE : LCD_MIDDLE_BUTTON_CHOICE, _T(PrusaErrorButtonTitle(button_op_middle)), two_choices ? PrusaErrorButtonMore() : _T(PrusaErrorButtonTitle(button_op_right)), two_choices ? 18 : 9, two_choices ? nullptr : PrusaErrorButtonMore());
}

void ReportErrorHookSensorLineRender(){
    // Render static characters in third line
    lcd_puts_at_P(0, 2, PSTR("FI:  FS:    >  " LCD_STR_THERMOMETER "   " LCD_STR_DEGREE));
   2a570:	4b ea       	ldi	r20, 0xAB	; 171
   2a572:	5f e9       	ldi	r21, 0x9F	; 159
   2a574:	62 e0       	ldi	r22, 0x02	; 2
   2a576:	80 e0       	ldi	r24, 0x00	; 0
   2a578:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
    lcd_printf_P(PSTR("%.20S\nprusa.io/04%hu"), _T(PrusaErrorTitle(ei)), PrusaErrorCode(ei) );

    ReportErrorHookSensorLineRender();

    // Render the choices
    lcd_show_choices_prompt_P(two_choices ? LCD_LEFT_BUTTON_CHOICE : LCD_MIDDLE_BUTTON_CHOICE, _T(PrusaErrorButtonTitle(button_op_middle)), two_choices ? PrusaErrorButtonMore() : _T(PrusaErrorButtonTitle(button_op_right)), two_choices ? 18 : 9, two_choices ? nullptr : PrusaErrorButtonMore());
   2a57c:	0f 90       	pop	r0
   2a57e:	0f 90       	pop	r0
   2a580:	0f 90       	pop	r0
   2a582:	0f 90       	pop	r0
   2a584:	0f 90       	pop	r0
   2a586:	0f 90       	pop	r0
   2a588:	f1 10       	cpse	r15, r1
   2a58a:	c6 c0       	rjmp	.+396    	; 0x2a718 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x254>
   2a58c:	10 e0       	ldi	r17, 0x00	; 0
   2a58e:	00 e0       	ldi	r16, 0x00	; 0
   2a590:	42 e1       	ldi	r20, 0x12	; 18
   2a592:	e4 2e       	mov	r14, r20
   2a594:	5c ef       	ldi	r21, 0xFC	; 252
   2a596:	c5 2e       	mov	r12, r21
   2a598:	59 e6       	ldi	r21, 0x69	; 105
   2a59a:	d5 2e       	mov	r13, r21
    return pgm_read_byte(errorButtons + i);
}

const char *PrusaErrorButtonTitle(uint8_t bi) {
    // -1 represents the hidden NoOperation button which is not drawn in any way
    return (const char *)pgm_read_ptr(btnOperation + bi - 1);
   2a59c:	ec 2f       	mov	r30, r28
   2a59e:	f0 e0       	ldi	r31, 0x00	; 0
   2a5a0:	ee 0f       	add	r30, r30
   2a5a2:	ff 1f       	adc	r31, r31
   2a5a4:	e4 54       	subi	r30, 0x44	; 68
   2a5a6:	f7 47       	sbci	r31, 0x77	; 119
   2a5a8:	85 91       	lpm	r24, Z+
   2a5aa:	94 91       	lpm	r25, Z
   2a5ac:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   2a5b0:	bc 01       	movw	r22, r24
   2a5b2:	81 e0       	ldi	r24, 0x01	; 1
   2a5b4:	f1 10       	cpse	r15, r1
   2a5b6:	01 c0       	rjmp	.+2      	; 0x2a5ba <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0xf6>
   2a5b8:	80 e0       	ldi	r24, 0x00	; 0
   2a5ba:	2e 2d       	mov	r18, r14
   2a5bc:	a6 01       	movw	r20, r12
   2a5be:	0e 94 71 df 	call	0x1bee2	; 0x1bee2 <lcd_show_choices_prompt_P(unsigned char, char const*, char const*, unsigned char, char const*)>

    switch ((uint8_t)ReportErrorHookState) {
    case (uint8_t)ReportErrorHookStates::RENDER_ERROR_SCREEN:
        KEEPALIVE_STATE(PAUSED_FOR_USER);
        ReportErrorHookStaticRender(ei);
        ReportErrorHookState = ReportErrorHookStates::MONITOR_SELECTION;
   2a5c2:	81 e0       	ldi	r24, 0x01	; 1
   2a5c4:	80 93 89 04 	sts	0x0489, r24	; 0x800489 <MMU2::ReportErrorHookState>
        [[fallthrough]];
    case (uint8_t)ReportErrorHookStates::MONITOR_SELECTION:
        is_mmu_error_monitor_active = true;
   2a5c8:	81 e0       	ldi	r24, 0x01	; 1
   2a5ca:	80 93 5c 06 	sts	0x065C, r24	; 0x80065c <_ZN4MMU2L27is_mmu_error_monitor_activeE.lto_priv.447>
        ReportErrorHookDynamicRender(); // Render dynamic characters
   2a5ce:	0f 94 30 50 	call	0x2a060	; 0x2a060 <MMU2::ReportErrorHookDynamicRender()>
        sound_wait_for_user();
   2a5d2:	0f 94 62 28 	call	0x250c4	; 0x250c4 <sound_wait_for_user()>
const char *PrusaErrorDesc(uint8_t i) {
    return (const char *)pgm_read_ptr(errorDescs + i);
}

uint8_t PrusaErrorButtons(uint8_t i) {
    return pgm_read_byte(errorButtons + i);
   2a5d6:	0d 2f       	mov	r16, r29
   2a5d8:	10 e0       	ldi	r17, 0x00	; 0
   2a5da:	f8 01       	movw	r30, r16
   2a5dc:	e9 5c       	subi	r30, 0xC9	; 201
   2a5de:	f7 47       	sbci	r31, 0x77	; 119
   2a5e0:	c4 91       	lpm	r28, Z
    bool two_choices = false;
    static uint8_t reset_button_selection;

    // Read and determine what operations should be shown on the menu
    const uint8_t button_operation   = PrusaErrorButtons(ei);
    const uint8_t button_op_right = BUTTON_OP_RIGHT(button_operation);
   2a5e2:	dc 2f       	mov	r29, r28
   2a5e4:	d2 95       	swap	r29
   2a5e6:	df 70       	andi	r29, 0x0F	; 15
    if (button_op_right == (uint8_t)ButtonOperations::NoOperation){
        // Two operations not specified, the error menu should only show two choices
        two_choices = true;
    }

    static int8_t current_selection = two_choices ? LCD_LEFT_BUTTON_CHOICE : LCD_MIDDLE_BUTTON_CHOICE;
   2a5e8:	80 91 81 04 	lds	r24, 0x0481	; 0x800481 <guard variable for MMU2::ReportErrorHookMonitor(unsigned char)::current_selection>
   2a5ec:	81 11       	cpse	r24, r1
   2a5ee:	09 c0       	rjmp	.+18     	; 0x2a602 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x13e>
   2a5f0:	81 e0       	ldi	r24, 0x01	; 1
   2a5f2:	d1 11       	cpse	r29, r1
   2a5f4:	01 c0       	rjmp	.+2      	; 0x2a5f8 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x134>
   2a5f6:	80 e0       	ldi	r24, 0x00	; 0
   2a5f8:	80 93 80 04 	sts	0x0480, r24	; 0x800480 <MMU2::ReportErrorHookMonitor(unsigned char)::current_selection>
   2a5fc:	81 e0       	ldi	r24, 0x01	; 1
   2a5fe:	80 93 81 04 	sts	0x0481, r24	; 0x800481 <guard variable for MMU2::ReportErrorHookMonitor(unsigned char)::current_selection>
    static int8_t choice_selected = -1;

    if (reset_button_selection) {
   2a602:	80 91 7f 04 	lds	r24, 0x047F	; 0x80047f <MMU2::ReportErrorHookMonitor(unsigned char)::reset_button_selection>
   2a606:	88 23       	and	r24, r24
   2a608:	41 f0       	breq	.+16     	; 0x2a61a <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x156>
        // If a new error screen is shown, we must reset the button selection
        // Default selection is different depending on how many buttons are present
        current_selection = two_choices ? LCD_LEFT_BUTTON_CHOICE : LCD_MIDDLE_BUTTON_CHOICE;
   2a60a:	81 e0       	ldi	r24, 0x01	; 1
   2a60c:	d1 11       	cpse	r29, r1
   2a60e:	01 c0       	rjmp	.+2      	; 0x2a612 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x14e>
   2a610:	80 e0       	ldi	r24, 0x00	; 0
   2a612:	80 93 80 04 	sts	0x0480, r24	; 0x800480 <MMU2::ReportErrorHookMonitor(unsigned char)::current_selection>
        choice_selected = -1;
        reset_button_selection = 0;
   2a616:	10 92 7f 04 	sts	0x047F, r1	; 0x80047f <MMU2::ReportErrorHookMonitor(unsigned char)::reset_button_selection>
    }

    // Check if knob was rotated
    if (lcd_encoder) {
   2a61a:	20 91 1e 06 	lds	r18, 0x061E	; 0x80061e <lcd_encoder>
   2a61e:	30 91 1f 06 	lds	r19, 0x061F	; 0x80061f <lcd_encoder+0x1>
   2a622:	21 15       	cp	r18, r1
   2a624:	31 05       	cpc	r19, r1
   2a626:	b9 f1       	breq	.+110    	; 0x2a696 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x1d2>
   2a628:	80 91 80 04 	lds	r24, 0x0480	; 0x800480 <MMU2::ReportErrorHookMonitor(unsigned char)::current_selection>
        if (two_choices == false) { // third_choice is not nullptr, safe to dereference
   2a62c:	dd 23       	and	r29, r29
   2a62e:	61 f0       	breq	.+24     	; 0x2a648 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x184>
            if (lcd_encoder < 0 && current_selection != LCD_LEFT_BUTTON_CHOICE) {
   2a630:	37 ff       	sbrs	r19, 7
   2a632:	06 c0       	rjmp	.+12     	; 0x2a640 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x17c>
   2a634:	88 23       	and	r24, r24
   2a636:	69 f0       	breq	.+26     	; 0x2a652 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x18e>
                // Rotating knob counter clockwise
                current_selection--;
   2a638:	81 50       	subi	r24, 0x01	; 1
            if (lcd_encoder < 0 && current_selection != LCD_LEFT_BUTTON_CHOICE) {
                // Rotating knob counter clockwise
                current_selection = LCD_LEFT_BUTTON_CHOICE;
            } else if (lcd_encoder > 0 && current_selection != LCD_MIDDLE_BUTTON_CHOICE) {
                // Rotating knob clockwise
                current_selection = LCD_MIDDLE_BUTTON_CHOICE;
   2a63a:	80 93 80 04 	sts	0x0480, r24	; 0x800480 <MMU2::ReportErrorHookMonitor(unsigned char)::current_selection>
   2a63e:	09 c0       	rjmp	.+18     	; 0x2a652 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x18e>
    if (lcd_encoder) {
        if (two_choices == false) { // third_choice is not nullptr, safe to dereference
            if (lcd_encoder < 0 && current_selection != LCD_LEFT_BUTTON_CHOICE) {
                // Rotating knob counter clockwise
                current_selection--;
            } else if (lcd_encoder > 0 && current_selection != LCD_RIGHT_BUTTON_CHOICE) {
   2a640:	82 30       	cpi	r24, 0x02	; 2
   2a642:	39 f0       	breq	.+14     	; 0x2a652 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x18e>
                // Rotating knob clockwise
                current_selection++;
   2a644:	8f 5f       	subi	r24, 0xFF	; 255
   2a646:	f9 cf       	rjmp	.-14     	; 0x2a63a <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x176>
            }
        } else {
            if (lcd_encoder < 0 && current_selection != LCD_LEFT_BUTTON_CHOICE) {
   2a648:	37 ff       	sbrs	r19, 7
   2a64a:	41 c0       	rjmp	.+130    	; 0x2a6ce <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x20a>
   2a64c:	81 11       	cpse	r24, r1
                // Rotating knob counter clockwise
                current_selection = LCD_LEFT_BUTTON_CHOICE;
   2a64e:	10 92 80 04 	sts	0x0480, r1	; 0x800480 <MMU2::ReportErrorHookMonitor(unsigned char)::current_selection>
        //! ----------------------
        //! |>(left)   >(mid)    |
        //! ----------------------
        //! @endcode
        //
        lcd_putc_at(0, 3, current_selection == LCD_LEFT_BUTTON_CHOICE ? '>': ' ');
   2a652:	80 91 80 04 	lds	r24, 0x0480	; 0x800480 <MMU2::ReportErrorHookMonitor(unsigned char)::current_selection>
   2a656:	4e e3       	ldi	r20, 0x3E	; 62
   2a658:	81 11       	cpse	r24, r1
   2a65a:	40 e2       	ldi	r20, 0x20	; 32
   2a65c:	63 e0       	ldi	r22, 0x03	; 3
   2a65e:	80 e0       	ldi	r24, 0x00	; 0
   2a660:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
   2a664:	80 91 80 04 	lds	r24, 0x0480	; 0x800480 <MMU2::ReportErrorHookMonitor(unsigned char)::current_selection>
        if (two_choices == false)
   2a668:	dd 23       	and	r29, r29
   2a66a:	b1 f1       	breq	.+108    	; 0x2a6d8 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x214>
        {
            lcd_putc_at(9, 3, current_selection == LCD_MIDDLE_BUTTON_CHOICE ? '>': ' ');
   2a66c:	4e e3       	ldi	r20, 0x3E	; 62
   2a66e:	81 30       	cpi	r24, 0x01	; 1
   2a670:	09 f0       	breq	.+2      	; 0x2a674 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x1b0>
   2a672:	40 e2       	ldi	r20, 0x20	; 32
   2a674:	63 e0       	ldi	r22, 0x03	; 3
   2a676:	89 e0       	ldi	r24, 0x09	; 9
   2a678:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
            lcd_putc_at(18, 3, current_selection == LCD_RIGHT_BUTTON_CHOICE ? '>': ' ');
   2a67c:	80 91 80 04 	lds	r24, 0x0480	; 0x800480 <MMU2::ReportErrorHookMonitor(unsigned char)::current_selection>
   2a680:	82 30       	cpi	r24, 0x02	; 2
   2a682:	61 f5       	brne	.+88     	; 0x2a6dc <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x218>
        } else {
            // More button for two button screen
            lcd_putc_at(18, 3, current_selection == LCD_MIDDLE_BUTTON_CHOICE ? '>': ' ');
   2a684:	4e e3       	ldi	r20, 0x3E	; 62
   2a686:	63 e0       	ldi	r22, 0x03	; 3
   2a688:	82 e1       	ldi	r24, 0x12	; 18
   2a68a:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
        }
        // Consume rotation event
        lcd_encoder = 0;
   2a68e:	10 92 1f 06 	sts	0x061F, r1	; 0x80061f <lcd_encoder+0x1>
   2a692:	10 92 1e 06 	sts	0x061E, r1	; 0x80061e <lcd_encoder>
    }

    // Check if knob was clicked and consume the event
    if (lcd_clicked()) {
   2a696:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   2a69a:	88 23       	and	r24, r24
   2a69c:	09 f4       	brne	.+2      	; 0x2a6a0 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x1dc>
   2a69e:	34 cf       	rjmp	.-408    	; 0x2a508 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x44>
        choice_selected = current_selection;
   2a6a0:	80 91 80 04 	lds	r24, 0x0480	; 0x800480 <MMU2::ReportErrorHookMonitor(unsigned char)::current_selection>
    } else {
        // continue monitoring
        return ret;
    }

    if ((two_choices && choice_selected == LCD_MIDDLE_BUTTON_CHOICE)      // Two choices and middle button selected
   2a6a4:	d1 11       	cpse	r29, r1
   2a6a6:	1c c0       	rjmp	.+56     	; 0x2a6e0 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x21c>
   2a6a8:	81 30       	cpi	r24, 0x01	; 1
   2a6aa:	89 f5       	brne	.+98     	; 0x2a70e <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x24a>
const char *PrusaErrorTitle(uint8_t i) {
    return (const char *)pgm_read_ptr(errorTitles + i);
}

const char *PrusaErrorDesc(uint8_t i) {
    return (const char *)pgm_read_ptr(errorDescs + i);
   2a6ac:	f8 01       	movw	r30, r16
   2a6ae:	ee 0f       	add	r30, r30
   2a6b0:	ff 1f       	adc	r31, r31
   2a6b2:	e3 52       	subi	r30, 0x23	; 35
   2a6b4:	f8 47       	sbci	r31, 0x78	; 120
   2a6b6:	85 91       	lpm	r24, Z+
   2a6b8:	94 91       	lpm	r25, Z
        || (!two_choices && choice_selected == LCD_RIGHT_BUTTON_CHOICE)) // Three choices and right most button selected
    {
        // 'More' show error description
        lcd_show_fullscreen_message_and_wait_P(_T(PrusaErrorDesc(ei)));
   2a6ba:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   2a6be:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
        SetButtonResponse((ButtonOperations)button_op_middle);
        ret = 2;
    }

    // Next MMU error screen should reset the choice selection
    reset_button_selection = 1;
   2a6c2:	81 e0       	ldi	r24, 0x01	; 1
   2a6c4:	80 93 7f 04 	sts	0x047F, r24	; 0x80047f <MMU2::ReportErrorHookMonitor(unsigned char)::reset_button_selection>
                lcd_return_to_status();
                sound_wait_for_user_reset();
                // Reset the state in case a new error is reported
                is_mmu_error_monitor_active = false;
                KEEPALIVE_STATE(IN_HANDLER);
                ReportErrorHookState = ReportErrorHookStates::RENDER_ERROR_SCREEN;
   2a6c8:	10 92 89 04 	sts	0x0489, r1	; 0x800489 <MMU2::ReportErrorHookState>
   2a6cc:	1d cf       	rjmp	.-454    	; 0x2a508 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x44>
            }
        } else {
            if (lcd_encoder < 0 && current_selection != LCD_LEFT_BUTTON_CHOICE) {
                // Rotating knob counter clockwise
                current_selection = LCD_LEFT_BUTTON_CHOICE;
            } else if (lcd_encoder > 0 && current_selection != LCD_MIDDLE_BUTTON_CHOICE) {
   2a6ce:	81 30       	cpi	r24, 0x01	; 1
   2a6d0:	09 f4       	brne	.+2      	; 0x2a6d4 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x210>
   2a6d2:	bf cf       	rjmp	.-130    	; 0x2a652 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x18e>
                // Rotating knob clockwise
                current_selection = LCD_MIDDLE_BUTTON_CHOICE;
   2a6d4:	81 e0       	ldi	r24, 0x01	; 1
   2a6d6:	b1 cf       	rjmp	.-158    	; 0x2a63a <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x176>
        {
            lcd_putc_at(9, 3, current_selection == LCD_MIDDLE_BUTTON_CHOICE ? '>': ' ');
            lcd_putc_at(18, 3, current_selection == LCD_RIGHT_BUTTON_CHOICE ? '>': ' ');
        } else {
            // More button for two button screen
            lcd_putc_at(18, 3, current_selection == LCD_MIDDLE_BUTTON_CHOICE ? '>': ' ');
   2a6d8:	81 30       	cpi	r24, 0x01	; 1
   2a6da:	a1 f2       	breq	.-88     	; 0x2a684 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x1c0>
   2a6dc:	40 e2       	ldi	r20, 0x20	; 32
   2a6de:	d3 cf       	rjmp	.-90     	; 0x2a686 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x1c2>
        // continue monitoring
        return ret;
    }

    if ((two_choices && choice_selected == LCD_MIDDLE_BUTTON_CHOICE)      // Two choices and middle button selected
        || (!two_choices && choice_selected == LCD_RIGHT_BUTTON_CHOICE)) // Three choices and right most button selected
   2a6e0:	82 30       	cpi	r24, 0x02	; 2
   2a6e2:	21 f3       	breq	.-56     	; 0x2a6ac <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x1e8>
    {
        // 'More' show error description
        lcd_show_fullscreen_message_and_wait_P(_T(PrusaErrorDesc(ei)));
        ret = 1;
    } else if(choice_selected == LCD_MIDDLE_BUTTON_CHOICE) {
   2a6e4:	81 30       	cpi	r24, 0x01	; 1
   2a6e6:	99 f4       	brne	.+38     	; 0x2a70e <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x24a>

    return Buttons::NoButton;
}

void SetButtonResponse(ButtonOperations rsp) {
    buttonSelectedOperation = rsp;
   2a6e8:	d0 93 44 0d 	sts	0x0D44, r29	; 0x800d44 <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.450>
        SetButtonResponse((ButtonOperations)button_op_middle);
        ret = 2;
    }

    // Next MMU error screen should reset the choice selection
    reset_button_selection = 1;
   2a6ec:	80 93 7f 04 	sts	0x047F, r24	; 0x80047f <MMU2::ReportErrorHookMonitor(unsigned char)::reset_button_selection>
                // More button selected, change state
                ReportErrorHookState = ReportErrorHookStates::RENDER_ERROR_SCREEN;
                break;
            case 2:
                // Exit error screen and enable lcd updates
                lcd_update_enable(true);
   2a6f0:	81 e0       	ldi	r24, 0x01	; 1
   2a6f2:	0e 94 38 70 	call	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>
                lcd_return_to_status();
   2a6f6:	0f 94 d5 07 	call	0x20faa	; 0x20faa <lcd_return_to_status()>
   2a6fa:	10 92 be 04 	sts	0x04BE, r1	; 0x8004be <_ZL10beep_timer.lto_priv.499>

/// @brief Resets the global state of sound_wait_for_user()
void sound_wait_for_user_reset()
{
     beep_timer.stop();
     bFirst = false;
   2a6fe:	10 92 c1 04 	sts	0x04C1, r1	; 0x8004c1 <_ZL6bFirst.lto_priv.500>
                sound_wait_for_user_reset();
                // Reset the state in case a new error is reported
                is_mmu_error_monitor_active = false;
   2a702:	10 92 5c 06 	sts	0x065C, r1	; 0x80065c <_ZN4MMU2L27is_mmu_error_monitor_activeE.lto_priv.447>
                KEEPALIVE_STATE(IN_HANDLER);
   2a706:	82 e0       	ldi	r24, 0x02	; 2
   2a708:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
   2a70c:	dd cf       	rjmp	.-70     	; 0x2a6c8 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x204>
    static uint8_t reset_button_selection;

    // Read and determine what operations should be shown on the menu
    const uint8_t button_operation   = PrusaErrorButtons(ei);
    const uint8_t button_op_right = BUTTON_OP_RIGHT(button_operation);
    const uint8_t button_op_middle  = BUTTON_OP_MIDDLE(button_operation);
   2a70e:	cf 70       	andi	r28, 0x0F	; 15
   2a710:	c0 93 44 0d 	sts	0x0D44, r28	; 0x800d44 <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.450>
        SetButtonResponse((ButtonOperations)button_op_middle);
        ret = 2;
    }

    // Next MMU error screen should reset the choice selection
    reset_button_selection = 1;
   2a714:	81 e0       	ldi	r24, 0x01	; 1
   2a716:	ea cf       	rjmp	.-44     	; 0x2a6ec <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0x228>
    return pgm_read_byte(errorButtons + i);
}

const char *PrusaErrorButtonTitle(uint8_t bi) {
    // -1 represents the hidden NoOperation button which is not drawn in any way
    return (const char *)pgm_read_ptr(btnOperation + bi - 1);
   2a718:	ef 2d       	mov	r30, r15
   2a71a:	f0 e0       	ldi	r31, 0x00	; 0
   2a71c:	ee 0f       	add	r30, r30
   2a71e:	ff 1f       	adc	r31, r31
   2a720:	e4 54       	subi	r30, 0x44	; 68
   2a722:	f7 47       	sbci	r31, 0x77	; 119
   2a724:	85 91       	lpm	r24, Z+
   2a726:	94 91       	lpm	r25, Z
    lcd_printf_P(PSTR("%.20S\nprusa.io/04%hu"), _T(PrusaErrorTitle(ei)), PrusaErrorCode(ei) );

    ReportErrorHookSensorLineRender();

    // Render the choices
    lcd_show_choices_prompt_P(two_choices ? LCD_LEFT_BUTTON_CHOICE : LCD_MIDDLE_BUTTON_CHOICE, _T(PrusaErrorButtonTitle(button_op_middle)), two_choices ? PrusaErrorButtonMore() : _T(PrusaErrorButtonTitle(button_op_right)), two_choices ? 18 : 9, two_choices ? nullptr : PrusaErrorButtonMore());
   2a728:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   2a72c:	6c 01       	movw	r12, r24
   2a72e:	0c ef       	ldi	r16, 0xFC	; 252
   2a730:	19 e6       	ldi	r17, 0x69	; 105
   2a732:	99 e0       	ldi	r25, 0x09	; 9
   2a734:	e9 2e       	mov	r14, r25
   2a736:	32 cf       	rjmp	.-412    	; 0x2a59c <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]+0xd8>

0002a738 <MMU2::ButtonAvailable(ErrorCode)>:
    buttonSelectedOperation = ButtonOperations::NoOperation; // Reset operation
    return result;
}

Buttons ButtonAvailable(ErrorCode ec) {
    uint8_t ei = PrusaErrorCodeIndex(ec);
   2a738:	0f 94 11 51 	call	0x2a222	; 0x2a222 <MMU2::PrusaErrorCodeIndex(ErrorCode)>
    // if nothing got caught, return a generic error
    return FindErrorIndex(ERR_OTHER_UNKNOWN_ERROR);
}

uint16_t PrusaErrorCode(uint8_t i) {
    return pgm_read_word(errorCodes + i);
   2a73c:	e8 2f       	mov	r30, r24
   2a73e:	f0 e0       	ldi	r31, 0x00	; 0
   2a740:	ee 0f       	add	r30, r30
   2a742:	ff 1f       	adc	r31, r31
   2a744:	ec 59       	subi	r30, 0x9C	; 156
   2a746:	f7 47       	sbci	r31, 0x77	; 119
   2a748:	25 91       	lpm	r18, Z+
   2a74a:	34 91       	lpm	r19, Z

    // The list of responses which occur in mmu error dialogs
    // Return button index or perform some action on the MK3 by itself (like Reset MMU)
    // Based on Prusa-Error-Codes errors_list.h
    // So far hardcoded, but shall be generated in the future
    switch ( PrusaErrorCode(ei) ) {
   2a74c:	23 33       	cpi	r18, 0x33	; 51
   2a74e:	81 e0       	ldi	r24, 0x01	; 1
   2a750:	38 07       	cpc	r19, r24
   2a752:	08 f0       	brcs	.+2      	; 0x2a756 <MMU2::ButtonAvailable(ErrorCode)+0x1e>
   2a754:	41 c0       	rjmp	.+130    	; 0x2a7d8 <MMU2::ButtonAvailable(ErrorCode)+0xa0>
   2a756:	2d 32       	cpi	r18, 0x2D	; 45
   2a758:	81 e0       	ldi	r24, 0x01	; 1
   2a75a:	38 07       	cpc	r19, r24
   2a75c:	78 f5       	brcc	.+94     	; 0x2a7bc <MMU2::ButtonAvailable(ErrorCode)+0x84>
   2a75e:	2e 37       	cpi	r18, 0x7E	; 126
   2a760:	31 05       	cpc	r19, r1
   2a762:	09 f4       	brne	.+2      	; 0x2a766 <MMU2::ButtonAvailable(ErrorCode)+0x2e>
   2a764:	83 c0       	rjmp	.+262    	; 0x2a86c <MMU2::ButtonAvailable(ErrorCode)+0x134>
   2a766:	f0 f4       	brcc	.+60     	; 0x2a7a4 <MMU2::ButtonAvailable(ErrorCode)+0x6c>
   2a768:	2c 36       	cpi	r18, 0x6C	; 108
   2a76a:	31 05       	cpc	r19, r1
   2a76c:	09 f4       	brne	.+2      	; 0x2a770 <MMU2::ButtonAvailable(ErrorCode)+0x38>
   2a76e:	85 c0       	rjmp	.+266    	; 0x2a87a <MMU2::ButtonAvailable(ErrorCode)+0x142>
   2a770:	30 f4       	brcc	.+12     	; 0x2a77e <MMU2::ButtonAvailable(ErrorCode)+0x46>
   2a772:	25 36       	cpi	r18, 0x65	; 101
   2a774:	31 05       	cpc	r19, r1
   2a776:	08 f0       	brcs	.+2      	; 0x2a77a <MMU2::ButtonAvailable(ErrorCode)+0x42>
   2a778:	79 c0       	rjmp	.+242    	; 0x2a86c <MMU2::ButtonAvailable(ErrorCode)+0x134>

    default:
        break;
    }

    return Buttons::NoButton;
   2a77a:	8f ef       	ldi	r24, 0xFF	; 255
   2a77c:	08 95       	ret

    // The list of responses which occur in mmu error dialogs
    // Return button index or perform some action on the MK3 by itself (like Reset MMU)
    // Based on Prusa-Error-Codes errors_list.h
    // So far hardcoded, but shall be generated in the future
    switch ( PrusaErrorCode(ei) ) {
   2a77e:	24 37       	cpi	r18, 0x74	; 116
   2a780:	31 05       	cpc	r19, r1
   2a782:	09 f4       	brne	.+2      	; 0x2a786 <MMU2::ButtonAvailable(ErrorCode)+0x4e>
   2a784:	73 c0       	rjmp	.+230    	; 0x2a86c <MMU2::ButtonAvailable(ErrorCode)+0x134>
   2a786:	2d 37       	cpi	r18, 0x7D	; 125
   2a788:	31 05       	cpc	r19, r1
   2a78a:	19 f0       	breq	.+6      	; 0x2a792 <MMU2::ButtonAvailable(ErrorCode)+0x5a>
   2a78c:	23 37       	cpi	r18, 0x73	; 115
   2a78e:	31 05       	cpc	r19, r1
   2a790:	a1 f7       	brne	.-24     	; 0x2a77a <MMU2::ButtonAvailable(ErrorCode)+0x42>
            break;
        }
        break;
    case ERR_MECHANICAL_SELECTOR_CANNOT_HOME:
    case ERR_MECHANICAL_IDLER_CANNOT_HOME:
        switch (buttonSelectedOperation) {
   2a792:	80 91 44 0d 	lds	r24, 0x0D44	; 0x800d44 <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.450>
   2a796:	81 30       	cpi	r24, 0x01	; 1
   2a798:	09 f4       	brne	.+2      	; 0x2a79c <MMU2::ButtonAvailable(ErrorCode)+0x64>
   2a79a:	6d c0       	rjmp	.+218    	; 0x2a876 <MMU2::ButtonAvailable(ErrorCode)+0x13e>
   2a79c:	87 30       	cpi	r24, 0x07	; 7
   2a79e:	69 f7       	brne	.-38     	; 0x2a77a <MMU2::ButtonAvailable(ErrorCode)+0x42>
        // may be allow move selector right and left in the future
        case ButtonOperations::Tune: // Tune Stallguard threshold
            return Buttons::TuneMMU;
   2a7a0:	88 e0       	ldi	r24, 0x08	; 8
   2a7a2:	08 95       	ret

    // The list of responses which occur in mmu error dialogs
    // Return button index or perform some action on the MK3 by itself (like Reset MMU)
    // Based on Prusa-Error-Codes errors_list.h
    // So far hardcoded, but shall be generated in the future
    switch ( PrusaErrorCode(ei) ) {
   2a7a4:	23 3d       	cpi	r18, 0xD3	; 211
   2a7a6:	31 05       	cpc	r19, r1
   2a7a8:	09 f4       	brne	.+2      	; 0x2a7ac <MMU2::ButtonAvailable(ErrorCode)+0x74>
   2a7aa:	6e c0       	rjmp	.+220    	; 0x2a888 <MMU2::ButtonAvailable(ErrorCode)+0x150>
   2a7ac:	50 f4       	brcc	.+20     	; 0x2a7c2 <MMU2::ButtonAvailable(ErrorCode)+0x8a>
   2a7ae:	29 3c       	cpi	r18, 0xC9	; 201
   2a7b0:	31 05       	cpc	r19, r1
   2a7b2:	09 f4       	brne	.+2      	; 0x2a7b6 <MMU2::ButtonAvailable(ErrorCode)+0x7e>
   2a7b4:	69 c0       	rjmp	.+210    	; 0x2a888 <MMU2::ButtonAvailable(ErrorCode)+0x150>
   2a7b6:	2a 3c       	cpi	r18, 0xCA	; 202
   2a7b8:	31 05       	cpc	r19, r1
   2a7ba:	f9 f6       	brne	.-66     	; 0x2a77a <MMU2::ButtonAvailable(ErrorCode)+0x42>
    case ERR_ELECTRICAL_MMU_IDLER_SELFTEST_FAILED:

    case ERR_SYSTEM_QUEUE_FULL:
    case ERR_SYSTEM_FW_RUNTIME_ERROR:
    case ERR_ELECTRICAL_MMU_MCU_ERROR:
        switch (buttonSelectedOperation) {
   2a7bc:	80 91 44 0d 	lds	r24, 0x0D44	; 0x800d44 <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.450>
   2a7c0:	67 c0       	rjmp	.+206    	; 0x2a890 <MMU2::ButtonAvailable(ErrorCode)+0x158>

    // The list of responses which occur in mmu error dialogs
    // Return button index or perform some action on the MK3 by itself (like Reset MMU)
    // Based on Prusa-Error-Codes errors_list.h
    // So far hardcoded, but shall be generated in the future
    switch ( PrusaErrorCode(ei) ) {
   2a7c2:	2d 3d       	cpi	r18, 0xDD	; 221
   2a7c4:	31 05       	cpc	r19, r1
   2a7c6:	09 f4       	brne	.+2      	; 0x2a7ca <MMU2::ButtonAvailable(ErrorCode)+0x92>
   2a7c8:	5f c0       	rjmp	.+190    	; 0x2a888 <MMU2::ButtonAvailable(ErrorCode)+0x150>
   2a7ca:	2e 3d       	cpi	r18, 0xDE	; 222
   2a7cc:	31 05       	cpc	r19, r1
   2a7ce:	b1 f3       	breq	.-20     	; 0x2a7bc <MMU2::ButtonAvailable(ErrorCode)+0x84>
   2a7d0:	24 3d       	cpi	r18, 0xD4	; 212
   2a7d2:	31 05       	cpc	r19, r1
   2a7d4:	91 f6       	brne	.-92     	; 0x2a77a <MMU2::ButtonAvailable(ErrorCode)+0x42>
   2a7d6:	f2 cf       	rjmp	.-28     	; 0x2a7bc <MMU2::ButtonAvailable(ErrorCode)+0x84>
   2a7d8:	25 3f       	cpi	r18, 0xF5	; 245
   2a7da:	81 e0       	ldi	r24, 0x01	; 1
   2a7dc:	38 07       	cpc	r19, r24
   2a7de:	09 f4       	brne	.+2      	; 0x2a7e2 <MMU2::ButtonAvailable(ErrorCode)+0xaa>
   2a7e0:	5c c0       	rjmp	.+184    	; 0x2a89a <MMU2::ButtonAvailable(ErrorCode)+0x162>
   2a7e2:	f8 f4       	brcc	.+62     	; 0x2a822 <MMU2::ButtonAvailable(ErrorCode)+0xea>
   2a7e4:	26 34       	cpi	r18, 0x46	; 70
   2a7e6:	81 e0       	ldi	r24, 0x01	; 1
   2a7e8:	38 07       	cpc	r19, r24
   2a7ea:	58 f4       	brcc	.+22     	; 0x2a802 <MMU2::ButtonAvailable(ErrorCode)+0xca>
   2a7ec:	21 34       	cpi	r18, 0x41	; 65
   2a7ee:	81 e0       	ldi	r24, 0x01	; 1
   2a7f0:	38 07       	cpc	r19, r24
   2a7f2:	20 f7       	brcc	.-56     	; 0x2a7bc <MMU2::ButtonAvailable(ErrorCode)+0x84>
   2a7f4:	27 53       	subi	r18, 0x37	; 55
   2a7f6:	31 40       	sbci	r19, 0x01	; 1
   2a7f8:	25 30       	cpi	r18, 0x05	; 5
   2a7fa:	31 05       	cpc	r19, r1
   2a7fc:	08 f0       	brcs	.+2      	; 0x2a800 <MMU2::ButtonAvailable(ErrorCode)+0xc8>
   2a7fe:	bd cf       	rjmp	.-134    	; 0x2a77a <MMU2::ButtonAvailable(ErrorCode)+0x42>
   2a800:	dd cf       	rjmp	.-70     	; 0x2a7bc <MMU2::ButtonAvailable(ErrorCode)+0x84>
   2a802:	21 59       	subi	r18, 0x91	; 145
   2a804:	31 40       	sbci	r19, 0x01	; 1
   2a806:	22 30       	cpi	r18, 0x02	; 2
   2a808:	31 05       	cpc	r19, r1
   2a80a:	08 f0       	brcs	.+2      	; 0x2a80e <MMU2::ButtonAvailable(ErrorCode)+0xd6>
   2a80c:	b6 cf       	rjmp	.-148    	; 0x2a77a <MMU2::ButtonAvailable(ErrorCode)+0x42>
        }
        break;
    case ERR_CONNECT_MMU_NOT_RESPONDING:
    case ERR_CONNECT_COMMUNICATION_ERROR:
    case ERR_SYSTEM_FW_UPDATE_NEEDED:
        switch (buttonSelectedOperation) {
   2a80e:	80 91 44 0d 	lds	r24, 0x0D44	; 0x800d44 <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.450>
   2a812:	83 30       	cpi	r24, 0x03	; 3
   2a814:	09 f4       	brne	.+2      	; 0x2a818 <MMU2::ButtonAvailable(ErrorCode)+0xe0>
   2a816:	3f c0       	rjmp	.+126    	; 0x2a896 <MMU2::ButtonAvailable(ErrorCode)+0x15e>
   2a818:	89 30       	cpi	r24, 0x09	; 9
   2a81a:	09 f0       	breq	.+2      	; 0x2a81e <MMU2::ButtonAvailable(ErrorCode)+0xe6>
   2a81c:	ae cf       	rjmp	.-164    	; 0x2a77a <MMU2::ButtonAvailable(ErrorCode)+0x42>
        case ButtonOperations::DisableMMU: // "Disable"
            return Buttons::DisableMMU;
   2a81e:	87 e0       	ldi	r24, 0x07	; 7
   2a820:	08 95       	ret

    // The list of responses which occur in mmu error dialogs
    // Return button index or perform some action on the MK3 by itself (like Reset MMU)
    // Based on Prusa-Error-Codes errors_list.h
    // So far hardcoded, but shall be generated in the future
    switch ( PrusaErrorCode(ei) ) {
   2a822:	29 3f       	cpi	r18, 0xF9	; 249
   2a824:	81 e0       	ldi	r24, 0x01	; 1
   2a826:	38 07       	cpc	r19, r24
   2a828:	49 f2       	breq	.-110    	; 0x2a7bc <MMU2::ButtonAvailable(ErrorCode)+0x84>
   2a82a:	70 f4       	brcc	.+28     	; 0x2a848 <MMU2::ButtonAvailable(ErrorCode)+0x110>
   2a82c:	27 3f       	cpi	r18, 0xF7	; 247
   2a82e:	81 e0       	ldi	r24, 0x01	; 1
   2a830:	38 07       	cpc	r19, r24
   2a832:	21 f2       	breq	.-120    	; 0x2a7bc <MMU2::ButtonAvailable(ErrorCode)+0x84>
   2a834:	60 f7       	brcc	.-40     	; 0x2a80e <MMU2::ButtonAvailable(ErrorCode)+0xd6>
            break;
        }
        break;

    case ERR_SYSTEM_INVALID_TOOL:
        switch (buttonSelectedOperation) {
   2a836:	80 91 44 0d 	lds	r24, 0x0D44	; 0x800d44 <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.450>
   2a83a:	83 30       	cpi	r24, 0x03	; 3
   2a83c:	61 f1       	breq	.+88     	; 0x2a896 <MMU2::ButtonAvailable(ErrorCode)+0x15e>
   2a83e:	88 30       	cpi	r24, 0x08	; 8
   2a840:	09 f0       	breq	.+2      	; 0x2a844 <MMU2::ButtonAvailable(ErrorCode)+0x10c>
   2a842:	9b cf       	rjmp	.-202    	; 0x2a77a <MMU2::ButtonAvailable(ErrorCode)+0x42>
        case ButtonOperations::StopPrint: // "Stop print"
            return Buttons::StopPrint;
   2a844:	86 e0       	ldi	r24, 0x06	; 6
   2a846:	08 95       	ret

    // The list of responses which occur in mmu error dialogs
    // Return button index or perform some action on the MK3 by itself (like Reset MMU)
    // Based on Prusa-Error-Codes errors_list.h
    // So far hardcoded, but shall be generated in the future
    switch ( PrusaErrorCode(ei) ) {
   2a848:	2b 3f       	cpi	r18, 0xFB	; 251
   2a84a:	81 e0       	ldi	r24, 0x01	; 1
   2a84c:	38 07       	cpc	r19, r24
   2a84e:	a9 f0       	breq	.+42     	; 0x2a87a <MMU2::ButtonAvailable(ErrorCode)+0x142>
   2a850:	68 f0       	brcs	.+26     	; 0x2a86c <MMU2::ButtonAvailable(ErrorCode)+0x134>
   2a852:	2c 3f       	cpi	r18, 0xFC	; 252
   2a854:	31 40       	sbci	r19, 0x01	; 1
   2a856:	09 f0       	breq	.+2      	; 0x2a85a <MMU2::ButtonAvailable(ErrorCode)+0x122>
   2a858:	90 cf       	rjmp	.-224    	; 0x2a77a <MMU2::ButtonAvailable(ErrorCode)+0x42>
        default:
            break;
        }
        break;
    case ERR_SYSTEM_FILAMENT_CHANGE:
        switch (buttonSelectedOperation) {
   2a85a:	80 91 44 0d 	lds	r24, 0x0D44	; 0x800d44 <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.450>
   2a85e:	85 30       	cpi	r24, 0x05	; 5
   2a860:	89 f0       	breq	.+34     	; 0x2a884 <MMU2::ButtonAvailable(ErrorCode)+0x14c>
   2a862:	86 30       	cpi	r24, 0x06	; 6
   2a864:	09 f0       	breq	.+2      	; 0x2a868 <MMU2::ButtonAvailable(ErrorCode)+0x130>
   2a866:	89 cf       	rjmp	.-238    	; 0x2a77a <MMU2::ButtonAvailable(ErrorCode)+0x42>
        case ButtonOperations::Load:
            return Buttons::Load;
        case ButtonOperations::Eject:
            return Buttons::Eject;
   2a868:	85 e0       	ldi	r24, 0x05	; 5
   2a86a:	08 95       	ret
    case ERR_MECHANICAL_INSPECT_FINDA:
    case ERR_MECHANICAL_SELECTOR_CANNOT_MOVE:
    case ERR_MECHANICAL_IDLER_CANNOT_MOVE:
    case ERR_MECHANICAL_PULLEY_CANNOT_MOVE:
    case ERR_SYSTEM_UNLOAD_MANUALLY:
        switch (buttonSelectedOperation) {
   2a86c:	80 91 44 0d 	lds	r24, 0x0D44	; 0x800d44 <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.450>
   2a870:	81 30       	cpi	r24, 0x01	; 1
   2a872:	09 f0       	breq	.+2      	; 0x2a876 <MMU2::ButtonAvailable(ErrorCode)+0x13e>
   2a874:	82 cf       	rjmp	.-252    	; 0x2a77a <MMU2::ButtonAvailable(ErrorCode)+0x42>
        switch (buttonSelectedOperation) {
        // may be allow move selector right and left in the future
        case ButtonOperations::Tune: // Tune Stallguard threshold
            return Buttons::TuneMMU;
        case ButtonOperations::Retry: // "Repeat action"
            return Buttons::Middle;
   2a876:	81 e0       	ldi	r24, 0x01	; 1
   2a878:	08 95       	ret
            break;
        }
        break;
    case ERR_MECHANICAL_LOAD_TO_EXTRUDER_FAILED:
    case ERR_SYSTEM_FILAMENT_EJECTED:
        switch (buttonSelectedOperation) {
   2a87a:	80 91 44 0d 	lds	r24, 0x0D44	; 0x800d44 <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.450>
   2a87e:	82 30       	cpi	r24, 0x02	; 2
   2a880:	d1 f3       	breq	.-12     	; 0x2a876 <MMU2::ButtonAvailable(ErrorCode)+0x13e>
   2a882:	7b cf       	rjmp	.-266    	; 0x2a77a <MMU2::ButtonAvailable(ErrorCode)+0x42>
        }
        break;
    case ERR_SYSTEM_FILAMENT_CHANGE:
        switch (buttonSelectedOperation) {
        case ButtonOperations::Load:
            return Buttons::Load;
   2a884:	84 e0       	ldi	r24, 0x04	; 4
   2a886:	08 95       	ret
        }
        break;
    case ERR_TEMPERATURE_WARNING_TMC_PULLEY_TOO_HOT:
    case ERR_TEMPERATURE_WARNING_TMC_SELECTOR_TOO_HOT:
    case ERR_TEMPERATURE_WARNING_TMC_IDLER_TOO_HOT:
        switch (buttonSelectedOperation) {
   2a888:	80 91 44 0d 	lds	r24, 0x0D44	; 0x800d44 <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.450>
   2a88c:	82 30       	cpi	r24, 0x02	; 2
   2a88e:	61 f0       	breq	.+24     	; 0x2a8a8 <MMU2::ButtonAvailable(ErrorCode)+0x170>
    case ERR_ELECTRICAL_MMU_IDLER_SELFTEST_FAILED:

    case ERR_SYSTEM_QUEUE_FULL:
    case ERR_SYSTEM_FW_RUNTIME_ERROR:
    case ERR_ELECTRICAL_MMU_MCU_ERROR:
        switch (buttonSelectedOperation) {
   2a890:	83 30       	cpi	r24, 0x03	; 3
   2a892:	09 f0       	breq	.+2      	; 0x2a896 <MMU2::ButtonAvailable(ErrorCode)+0x15e>
   2a894:	72 cf       	rjmp	.-284    	; 0x2a77a <MMU2::ButtonAvailable(ErrorCode)+0x42>
    case ERR_TEMPERATURE_WARNING_TMC_IDLER_TOO_HOT:
        switch (buttonSelectedOperation) {
        case ButtonOperations::Continue: // "Continue"
            return Buttons::Left;
        case ButtonOperations::ResetMMU: // "Reset MMU"
            return Buttons::ResetMMU;
   2a896:	83 e0       	ldi	r24, 0x03	; 3
    default:
        break;
    }

    return Buttons::NoButton;
}
   2a898:	08 95       	ret
        default:
            break;
        }
        break;
    case ERR_SYSTEM_FILAMENT_ALREADY_LOADED:
        switch (buttonSelectedOperation) {
   2a89a:	80 91 44 0d 	lds	r24, 0x0D44	; 0x800d44 <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.450>
   2a89e:	82 30       	cpi	r24, 0x02	; 2
   2a8a0:	29 f0       	breq	.+10     	; 0x2a8ac <MMU2::ButtonAvailable(ErrorCode)+0x174>
   2a8a2:	84 30       	cpi	r24, 0x04	; 4
   2a8a4:	09 f0       	breq	.+2      	; 0x2a8a8 <MMU2::ButtonAvailable(ErrorCode)+0x170>
   2a8a6:	69 cf       	rjmp	.-302    	; 0x2a77a <MMU2::ButtonAvailable(ErrorCode)+0x42>
    case ERR_TEMPERATURE_WARNING_TMC_PULLEY_TOO_HOT:
    case ERR_TEMPERATURE_WARNING_TMC_SELECTOR_TOO_HOT:
    case ERR_TEMPERATURE_WARNING_TMC_IDLER_TOO_HOT:
        switch (buttonSelectedOperation) {
        case ButtonOperations::Continue: // "Continue"
            return Buttons::Left;
   2a8a8:	82 e0       	ldi	r24, 0x02	; 2
   2a8aa:	08 95       	ret
    case ERR_SYSTEM_FILAMENT_ALREADY_LOADED:
        switch (buttonSelectedOperation) {
        case ButtonOperations::Unload: // "Unload"
            return Buttons::Left;
        case ButtonOperations::Continue: // "Proceed/Continue"
            return Buttons::Right;
   2a8ac:	80 e0       	ldi	r24, 0x00	; 0
   2a8ae:	08 95       	ret

0002a8b0 <void MMU2::waitForHotendTargetTemp<MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}>(unsigned int, MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}) [clone .isra.0] [clone .lto_priv.374]>:
#endif

namespace MMU2 {

template <typename F>
void waitForHotendTargetTemp(uint16_t delay, F f) {
   2a8b0:	cf 93       	push	r28
   2a8b2:	df 93       	push	r29
   2a8b4:	ec 01       	movw	r28, r24
int16_t thermal_degTargetHotend() {
    return degTargetHotend(0);
}

int16_t thermal_degHotend() {
    return degHotend(0);
   2a8b6:	60 91 5a 0d 	lds	r22, 0x0D5A	; 0x800d5a <current_temperature>
   2a8ba:	70 91 5b 0d 	lds	r23, 0x0D5B	; 0x800d5b <current_temperature+0x1>
   2a8be:	80 91 5c 0d 	lds	r24, 0x0D5C	; 0x800d5c <current_temperature+0x2>
   2a8c2:	90 91 5d 0d 	lds	r25, 0x0D5D	; 0x800d5d <current_temperature+0x3>
   2a8c6:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
    while (((thermal_degTargetHotend() - thermal_degHotend()) > 5)) {
   2a8ca:	20 91 5d 12 	lds	r18, 0x125D	; 0x80125d <target_temperature>
   2a8ce:	30 91 5e 12 	lds	r19, 0x125E	; 0x80125e <target_temperature+0x1>
   2a8d2:	c9 01       	movw	r24, r18
   2a8d4:	86 1b       	sub	r24, r22
   2a8d6:	97 0b       	sbc	r25, r23
   2a8d8:	06 97       	sbiw	r24, 0x06	; 6
   2a8da:	24 f0       	brlt	.+8      	; 0x2a8e4 <void MMU2::waitForHotendTargetTemp<MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}>(unsigned int, MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}) [clone .isra.0] [clone .lto_priv.374]+0x34>
void thermal_setTargetHotend(int16_t t) {
    setTargetHotend(t);
}

void safe_delay_keep_alive(uint16_t t) {
    delay_keep_alive(t);
   2a8dc:	ce 01       	movw	r24, r28
   2a8de:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
   2a8e2:	e9 cf       	rjmp	.-46     	; 0x2a8b6 <void MMU2::waitForHotendTargetTemp<MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}>(unsigned int, MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}) [clone .isra.0] [clone .lto_priv.374]+0x6>
        f();
        safe_delay_keep_alive(delay);
    }
}
   2a8e4:	df 91       	pop	r29
   2a8e6:	cf 91       	pop	r28
   2a8e8:	08 95       	ret

0002a8ea <mbl_point_measurement_valid(unsigned char, unsigned char)>:
}

//parameter ix: index of mesh bed leveling point in X-axis (for meas_points == 7 is valid range from 0 to 6; for meas_points == 3 is valid range from 0 to 2 )
//parameter iy: index of mesh bed leveling point in Y-axis (for meas_points == 7 is valid range from 0 to 6; for meas_points == 3 is valid range from 0 to 2 )
//function returns true if point is considered valid (typicaly in safe distance from magnet or another object which inflences PINDA measurements)
bool mbl_point_measurement_valid(uint8_t ix, uint8_t iy) {
   2a8ea:	cf 93       	push	r28
   2a8ec:	df 93       	push	r29
   2a8ee:	00 d0       	rcall	.+0      	; 0x2a8f0 <mbl_point_measurement_valid(unsigned char, unsigned char)+0x6>
   2a8f0:	00 d0       	rcall	.+0      	; 0x2a8f2 <mbl_point_measurement_valid(unsigned char, unsigned char)+0x8>
   2a8f2:	1f 92       	push	r1
   2a8f4:	cd b7       	in	r28, 0x3d	; 61
   2a8f6:	de b7       	in	r29, 0x3e	; 62
	    //"human readable" heatbed plan
		//magnet proximity influence Z coordinate measurements significantly (40 - 100 um)
		//0 - measurement point is above magnet and Z coordinate can be influenced negatively
		//1 - we should be in safe distance from magnets, measurement should be accurate
		if ((ix >= MESH_NUM_X_POINTS) || (iy >= MESH_NUM_Y_POINTS))
   2a8f8:	87 30       	cpi	r24, 0x07	; 7
   2a8fa:	50 f5       	brcc	.+84     	; 0x2a950 <mbl_point_measurement_valid(unsigned char, unsigned char)+0x66>
   2a8fc:	67 30       	cpi	r22, 0x07	; 7
   2a8fe:	40 f5       	brcc	.+80     	; 0x2a950 <mbl_point_measurement_valid(unsigned char, unsigned char)+0x66>
            return false;

		uint8_t valid_points_mask[7] = {
   2a900:	97 e0       	ldi	r25, 0x07	; 7
   2a902:	ed eb       	ldi	r30, 0xBD	; 189
   2a904:	f2 e0       	ldi	r31, 0x02	; 2
   2a906:	de 01       	movw	r26, r28
   2a908:	11 96       	adiw	r26, 0x01	; 1
   2a90a:	01 90       	ld	r0, Z+
   2a90c:	0d 92       	st	X+, r0
   2a90e:	9a 95       	dec	r25
   2a910:	e1 f7       	brne	.-8      	; 0x2a90a <mbl_point_measurement_valid(unsigned char, unsigned char)+0x20>
			0b1110111,//2
			0b1111111,//1
			0b1111111,//0
		//[0,0]
		};
        return (valid_points_mask[6 - iy] & (1 << (6 - ix)));
   2a912:	46 e0       	ldi	r20, 0x06	; 6
   2a914:	50 e0       	ldi	r21, 0x00	; 0
   2a916:	fa 01       	movw	r30, r20
   2a918:	e6 1b       	sub	r30, r22
   2a91a:	f1 09       	sbc	r31, r1
   2a91c:	21 e0       	ldi	r18, 0x01	; 1
   2a91e:	30 e0       	ldi	r19, 0x00	; 0
   2a920:	2c 0f       	add	r18, r28
   2a922:	3d 1f       	adc	r19, r29
   2a924:	e2 0f       	add	r30, r18
   2a926:	f3 1f       	adc	r31, r19
   2a928:	20 81       	ld	r18, Z
   2a92a:	30 e0       	ldi	r19, 0x00	; 0
   2a92c:	48 1b       	sub	r20, r24
   2a92e:	51 09       	sbc	r21, r1
   2a930:	c9 01       	movw	r24, r18
   2a932:	02 c0       	rjmp	.+4      	; 0x2a938 <mbl_point_measurement_valid(unsigned char, unsigned char)+0x4e>
   2a934:	95 95       	asr	r25
   2a936:	87 95       	ror	r24
   2a938:	4a 95       	dec	r20
   2a93a:	e2 f7       	brpl	.-8      	; 0x2a934 <mbl_point_measurement_valid(unsigned char, unsigned char)+0x4a>
   2a93c:	81 70       	andi	r24, 0x01	; 1
}
   2a93e:	27 96       	adiw	r28, 0x07	; 7
   2a940:	0f b6       	in	r0, 0x3f	; 63
   2a942:	f8 94       	cli
   2a944:	de bf       	out	0x3e, r29	; 62
   2a946:	0f be       	out	0x3f, r0	; 63
   2a948:	cd bf       	out	0x3d, r28	; 61
   2a94a:	df 91       	pop	r29
   2a94c:	cf 91       	pop	r28
   2a94e:	08 95       	ret
	    //"human readable" heatbed plan
		//magnet proximity influence Z coordinate measurements significantly (40 - 100 um)
		//0 - measurement point is above magnet and Z coordinate can be influenced negatively
		//1 - we should be in safe distance from magnets, measurement should be accurate
		if ((ix >= MESH_NUM_X_POINTS) || (iy >= MESH_NUM_Y_POINTS))
            return false;
   2a950:	80 e0       	ldi	r24, 0x00	; 0
   2a952:	f5 cf       	rjmp	.-22     	; 0x2a93e <mbl_point_measurement_valid(unsigned char, unsigned char)+0x54>

0002a954 <babystep_undo()>:
    shift_z(- float(babystepLoadZ) / float(cs.axis_steps_per_mm[Z_AXIS]));
}

void babystep_undo()
{
      shift_z(float(babystepLoadZ) / float(cs.axis_steps_per_mm[Z_AXIS]));
   2a954:	60 91 26 06 	lds	r22, 0x0626	; 0x800626 <_ZL13babystepLoadZ.lto_priv.452>
   2a958:	70 91 27 06 	lds	r23, 0x0627	; 0x800627 <_ZL13babystepLoadZ.lto_priv.452+0x1>
   2a95c:	07 2e       	mov	r0, r23
   2a95e:	00 0c       	add	r0, r0
   2a960:	88 0b       	sbc	r24, r24
   2a962:	99 0b       	sbc	r25, r25
   2a964:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   2a968:	20 91 73 0d 	lds	r18, 0x0D73	; 0x800d73 <cs+0xc>
   2a96c:	30 91 74 0d 	lds	r19, 0x0D74	; 0x800d74 <cs+0xd>
   2a970:	40 91 75 0d 	lds	r20, 0x0D75	; 0x800d75 <cs+0xe>
   2a974:	50 91 76 0d 	lds	r21, 0x0D76	; 0x800d76 <cs+0xf>
   2a978:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   2a97c:	0e 94 a6 5e 	call	0xbd4c	; 0xbd4c <shift_z(float) [clone .lto_priv.488]>
      babystepLoadZ = 0;
   2a980:	10 92 27 06 	sts	0x0627, r1	; 0x800627 <_ZL13babystepLoadZ.lto_priv.452+0x1>
   2a984:	10 92 26 06 	sts	0x0626, r1	; 0x800626 <_ZL13babystepLoadZ.lto_priv.452>
}
   2a988:	08 95       	ret

0002a98a <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)>:
 * the value zero, false, is returned for failure.
 * Reasons for failure include this file is already open, \a dirFile is not
 * a directory, \a path is invalid, the file does not exist
 * or can't be opened in the access mode specified by oflag.
 */
bool SdBaseFile::open(SdBaseFile* dirFile, const char* path, uint8_t oflag) {
   2a98a:	2f 92       	push	r2
   2a98c:	3f 92       	push	r3
   2a98e:	4f 92       	push	r4
   2a990:	5f 92       	push	r5
   2a992:	6f 92       	push	r6
   2a994:	7f 92       	push	r7
   2a996:	8f 92       	push	r8
   2a998:	9f 92       	push	r9
   2a99a:	af 92       	push	r10
   2a99c:	bf 92       	push	r11
   2a99e:	cf 92       	push	r12
   2a9a0:	df 92       	push	r13
   2a9a2:	ef 92       	push	r14
   2a9a4:	ff 92       	push	r15
   2a9a6:	0f 93       	push	r16
   2a9a8:	1f 93       	push	r17
   2a9aa:	cf 93       	push	r28
   2a9ac:	df 93       	push	r29
   2a9ae:	cd b7       	in	r28, 0x3d	; 61
   2a9b0:	de b7       	in	r29, 0x3e	; 62
   2a9b2:	c2 54       	subi	r28, 0x42	; 66
   2a9b4:	d1 09       	sbc	r29, r1
   2a9b6:	0f b6       	in	r0, 0x3f	; 63
   2a9b8:	f8 94       	cli
   2a9ba:	de bf       	out	0x3e, r29	; 62
   2a9bc:	0f be       	out	0x3f, r0	; 63
   2a9be:	cd bf       	out	0x3d, r28	; 61
   2a9c0:	4c 01       	movw	r8, r24
   2a9c2:	5b 01       	movw	r10, r22
   2a9c4:	6a 01       	movw	r12, r20
   2a9c6:	32 2e       	mov	r3, r18
 * \brief Base class for SdFile with Print and C++ streams.
 */
class SdBaseFile {
 public:
  /** Create an instance. */
  SdBaseFile() : writeError(false), type_(FAT_FILE_TYPE_CLOSED) {}
   2a9c8:	19 82       	std	Y+1, r1	; 0x01
   2a9ca:	1c 82       	std	Y+4, r1	; 0x04
   2a9cc:	1c 8e       	std	Y+28, r1	; 0x1c
   2a9ce:	1f 8e       	std	Y+31, r1	; 0x1f
  uint8_t dname[11];
  SdBaseFile dir1, dir2;
  SdBaseFile *parent = dirFile;
  SdBaseFile *sub = &dir1;

  if (!dirFile) goto fail;
   2a9d0:	67 2b       	or	r22, r23
   2a9d2:	21 f5       	brne	.+72     	; 0x2aa1c <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x92>
    sub = parent != &dir1 ? &dir1 : &dir2;
  }
  return open(parent, dname, oflag);

 fail:
  return false;
   2a9d4:	10 e0       	ldi	r17, 0x00	; 0
 * a directory, \a path is invalid, the file does not exist
 * or can't be opened in the access mode specified by oflag.
 */
bool SdBaseFile::open(SdBaseFile* dirFile, const char* path, uint8_t oflag) {
  uint8_t dname[11];
  SdBaseFile dir1, dir2;
   2a9d6:	ce 01       	movw	r24, r28
   2a9d8:	4c 96       	adiw	r24, 0x1c	; 28
   2a9da:	0e 94 ab 79 	call	0xf356	; 0xf356 <SdBaseFile::~SdBaseFile()>
   2a9de:	ce 01       	movw	r24, r28
   2a9e0:	01 96       	adiw	r24, 0x01	; 1
   2a9e2:	0e 94 ab 79 	call	0xf356	; 0xf356 <SdBaseFile::~SdBaseFile()>
  }
  return open(parent, dname, oflag);

 fail:
  return false;
}
   2a9e6:	81 2f       	mov	r24, r17
   2a9e8:	ce 5b       	subi	r28, 0xBE	; 190
   2a9ea:	df 4f       	sbci	r29, 0xFF	; 255
   2a9ec:	0f b6       	in	r0, 0x3f	; 63
   2a9ee:	f8 94       	cli
   2a9f0:	de bf       	out	0x3e, r29	; 62
   2a9f2:	0f be       	out	0x3f, r0	; 63
   2a9f4:	cd bf       	out	0x3d, r28	; 61
   2a9f6:	df 91       	pop	r29
   2a9f8:	cf 91       	pop	r28
   2a9fa:	1f 91       	pop	r17
   2a9fc:	0f 91       	pop	r16
   2a9fe:	ff 90       	pop	r15
   2aa00:	ef 90       	pop	r14
   2aa02:	df 90       	pop	r13
   2aa04:	cf 90       	pop	r12
   2aa06:	bf 90       	pop	r11
   2aa08:	af 90       	pop	r10
   2aa0a:	9f 90       	pop	r9
   2aa0c:	8f 90       	pop	r8
   2aa0e:	7f 90       	pop	r7
   2aa10:	6f 90       	pop	r6
   2aa12:	5f 90       	pop	r5
   2aa14:	4f 90       	pop	r4
   2aa16:	3f 90       	pop	r3
   2aa18:	2f 90       	pop	r2
   2aa1a:	08 95       	ret
  SdBaseFile *sub = &dir1;

  if (!dirFile) goto fail;

  // error if already open
  if (isOpen()) goto fail;
   2aa1c:	fc 01       	movw	r30, r24
   2aa1e:	83 81       	ldd	r24, Z+3	; 0x03
   2aa20:	81 11       	cpse	r24, r1
   2aa22:	d8 cf       	rjmp	.-80     	; 0x2a9d4 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x4a>

  if (*path == '/') {
   2aa24:	fa 01       	movw	r30, r20
   2aa26:	80 81       	ld	r24, Z
   2aa28:	8f 32       	cpi	r24, 0x2F	; 47
   2aa2a:	c1 f4       	brne	.+48     	; 0x2aa5c <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0xd2>
   2aa2c:	ca 01       	movw	r24, r20
   2aa2e:	6c 01       	movw	r12, r24
   2aa30:	01 96       	adiw	r24, 0x01	; 1
    while (*path == '/') path++;
   2aa32:	f6 01       	movw	r30, r12
   2aa34:	20 81       	ld	r18, Z
   2aa36:	2f 32       	cpi	r18, 0x2F	; 47
   2aa38:	d1 f3       	breq	.-12     	; 0x2aa2e <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0xa4>
  bool isOpen() const {return type_ != FAT_FILE_TYPE_CLOSED;}
  /** \return True if this is a subdirectory else false. */
  bool isSubDir() const {return type_ == FAT_FILE_TYPE_SUBDIR;}
  /** \return True if this is the root directory. */
  bool isRoot() const {
    return type_ == FAT_FILE_TYPE_ROOT_FIXED || type_ == FAT_FILE_TYPE_ROOT32;
   2aa3a:	f5 01       	movw	r30, r10
   2aa3c:	83 81       	ldd	r24, Z+3	; 0x03
   2aa3e:	82 50       	subi	r24, 0x02	; 2
    if (!dirFile->isRoot()) {
   2aa40:	82 30       	cpi	r24, 0x02	; 2
   2aa42:	60 f0       	brcs	.+24     	; 0x2aa5c <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0xd2>
      if (!dir2.openRoot(dirFile->vol_)) goto fail;
   2aa44:	61 8d       	ldd	r22, Z+25	; 0x19
   2aa46:	72 8d       	ldd	r23, Z+26	; 0x1a
   2aa48:	ce 01       	movw	r24, r28
   2aa4a:	4c 96       	adiw	r24, 0x1c	; 28
   2aa4c:	0f 94 42 2c 	call	0x25884	; 0x25884 <SdBaseFile::openRoot(SdVolume*)>
      parent = &dir2;
   2aa50:	8e 01       	movw	r16, r28
   2aa52:	04 5e       	subi	r16, 0xE4	; 228
   2aa54:	1f 4f       	sbci	r17, 0xFF	; 255
  if (isOpen()) goto fail;

  if (*path == '/') {
    while (*path == '/') path++;
    if (!dirFile->isRoot()) {
      if (!dir2.openRoot(dirFile->vol_)) goto fail;
   2aa56:	81 11       	cpse	r24, r1
   2aa58:	02 c0       	rjmp	.+4      	; 0x2aa5e <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0xd4>
   2aa5a:	bc cf       	rjmp	.-136    	; 0x2a9d4 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x4a>
  // error if already open
  if (isOpen()) goto fail;

  if (*path == '/') {
    while (*path == '/') path++;
    if (!dirFile->isRoot()) {
   2aa5c:	85 01       	movw	r16, r10
    while (*path == '/') path++;
    if (!*path) break;
    if (!sub->open(parent, dname, O_READ)) goto fail;
    if (parent != dirFile) parent->close();
    parent = sub;
    sub = parent != &dir1 ? &dir1 : &dir2;
   2aa5e:	ce 01       	movw	r24, r28
   2aa60:	01 96       	adiw	r24, 0x01	; 1
   2aa62:	7c 01       	movw	r14, r24
   2aa64:	3c 01       	movw	r6, r24
   2aa66:	2e 01       	movw	r4, r28
   2aa68:	9c e1       	ldi	r25, 0x1C	; 28
   2aa6a:	49 0e       	add	r4, r25
   2aa6c:	51 1c       	adc	r5, r1
   2aa6e:	23 96       	adiw	r28, 0x03	; 3
   2aa70:	ef ae       	std	Y+63, r14	; 0x3f
   2aa72:	23 97       	sbiw	r28, 0x03	; 3
   2aa74:	2f 2c       	mov	r2, r15
   2aa76:	fe 01       	movw	r30, r28
   2aa78:	f7 96       	adiw	r30, 0x37	; 55
   2aa7a:	cf 01       	movw	r24, r30
   2aa7c:	0b 96       	adiw	r24, 0x0b	; 11
   2aa7e:	af 01       	movw	r20, r30
bool SdBaseFile::make83Name(const char* str, uint8_t* name, const char** ptr) {
  uint8_t c;
  uint8_t n = 7;  // max index for part before dot
  uint8_t i = 0;
  // blank fill name and extension
  while (i < 11) name[i++] = ' ';
   2aa80:	20 e2       	ldi	r18, 0x20	; 32
   2aa82:	21 93       	st	Z+, r18
   2aa84:	e8 17       	cp	r30, r24
   2aa86:	f9 07       	cpc	r31, r25
   2aa88:	d9 f7       	brne	.-10     	; 0x2aa80 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0xf6>
   2aa8a:	96 01       	movw	r18, r12
  i = 0;
   2aa8c:	90 e0       	ldi	r25, 0x00	; 0
}
//------------------------------------------------------------------------------
// format directory name field from a 8.3 name string
bool SdBaseFile::make83Name(const char* str, uint8_t* name, const char** ptr) {
  uint8_t c;
  uint8_t n = 7;  // max index for part before dot
   2aa8e:	67 e0       	ldi	r22, 0x07	; 7
  uint8_t i = 0;
  // blank fill name and extension
  while (i < 11) name[i++] = ' ';
  i = 0;
  while (*str != '\0' && *str != '/') {
   2aa90:	d9 01       	movw	r26, r18
   2aa92:	8d 91       	ld	r24, X+
   2aa94:	88 23       	and	r24, r24
   2aa96:	49 f1       	breq	.+82     	; 0x2aaea <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x160>
   2aa98:	8f 32       	cpi	r24, 0x2F	; 47
   2aa9a:	39 f1       	breq	.+78     	; 0x2aaea <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x160>
    c = *str++;
   2aa9c:	28 2f       	mov	r18, r24
    if (c == '.') {
   2aa9e:	8e 32       	cpi	r24, 0x2E	; 46
   2aaa0:	39 f4       	brne	.+14     	; 0x2aab0 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x126>
      if (n == 10) goto fail;  // only one dot allowed
   2aaa2:	6a 30       	cpi	r22, 0x0A	; 10
   2aaa4:	09 f4       	brne	.+2      	; 0x2aaa8 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x11e>
   2aaa6:	96 cf       	rjmp	.-212    	; 0x2a9d4 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x4a>
      n = 10;  // max index for full 8.3 name
      i = 8;   // place for extension
   2aaa8:	98 e0       	ldi	r25, 0x08	; 8
  i = 0;
  while (*str != '\0' && *str != '/') {
    c = *str++;
    if (c == '.') {
      if (n == 10) goto fail;  // only one dot allowed
      n = 10;  // max index for full 8.3 name
   2aaaa:	6a e0       	ldi	r22, 0x0A	; 10
   2aaac:	9d 01       	movw	r18, r26
   2aaae:	f0 cf       	rjmp	.-32     	; 0x2aa90 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x106>
   2aab0:	eb e8       	ldi	r30, 0x8B	; 139
   2aab2:	fb e8       	ldi	r31, 0x8B	; 139
      //PGM_P p = PSTR("|<>^+=?/[];,*\"\\");
      // 2019-08-27 really?
      // Microsoft defines, that only a subset of these characters is not allowed.
      PGM_P p = PSTR("|<>?/*\"\\");
      uint8_t b;
      while ((b = pgm_read_byte(p++))) if (b == c) goto fail;
   2aab4:	34 91       	lpm	r19, Z
   2aab6:	33 23       	and	r19, r19
   2aab8:	21 f0       	breq	.+8      	; 0x2aac2 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x138>
   2aaba:	31 96       	adiw	r30, 0x01	; 1
   2aabc:	83 13       	cpse	r24, r19
   2aabe:	fa cf       	rjmp	.-12     	; 0x2aab4 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x12a>
   2aac0:	89 cf       	rjmp	.-238    	; 0x2a9d4 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x4a>
      // check size and only allow ASCII printable characters
      if (i > n || c < 0X21 || c > 0X7E)goto fail;
   2aac2:	69 17       	cp	r22, r25
   2aac4:	08 f4       	brcc	.+2      	; 0x2aac8 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x13e>
   2aac6:	86 cf       	rjmp	.-244    	; 0x2a9d4 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x4a>
   2aac8:	3f ed       	ldi	r19, 0xDF	; 223
   2aaca:	38 0f       	add	r19, r24
   2aacc:	3e 35       	cpi	r19, 0x5E	; 94
   2aace:	08 f0       	brcs	.+2      	; 0x2aad2 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x148>
   2aad0:	81 cf       	rjmp	.-254    	; 0x2a9d4 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x4a>
      // only upper case allowed in 8.3 names - convert lower to upper
      name[i++] = (c < 'a' || c > 'z') ?  (c) : (c + ('A' - 'a'));
   2aad2:	3f e9       	ldi	r19, 0x9F	; 159
   2aad4:	38 0f       	add	r19, r24
   2aad6:	3a 31       	cpi	r19, 0x1A	; 26
   2aad8:	10 f4       	brcc	.+4      	; 0x2aade <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x154>
   2aada:	20 ee       	ldi	r18, 0xE0	; 224
   2aadc:	28 0f       	add	r18, r24
   2aade:	fa 01       	movw	r30, r20
   2aae0:	e9 0f       	add	r30, r25
   2aae2:	f1 1d       	adc	r31, r1
   2aae4:	20 83       	st	Z, r18
   2aae6:	9f 5f       	subi	r25, 0xFF	; 255
   2aae8:	e1 cf       	rjmp	.-62     	; 0x2aaac <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x122>
      if (!dir2.openRoot(dirFile->vol_)) goto fail;
      parent = &dir2;
    }
  }
  while (1) {
    if (!make83Name(path, dname, &path)) goto fail;
   2aaea:	8f a9       	ldd	r24, Y+55	; 0x37
   2aaec:	80 32       	cpi	r24, 0x20	; 32
   2aaee:	09 f4       	brne	.+2      	; 0x2aaf2 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x168>
   2aaf0:	71 cf       	rjmp	.-286    	; 0x2a9d4 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x4a>
   2aaf2:	69 01       	movw	r12, r18
    while (*path == '/') path++;
   2aaf4:	f9 01       	movw	r30, r18
   2aaf6:	80 81       	ld	r24, Z
   2aaf8:	2f 5f       	subi	r18, 0xFF	; 255
   2aafa:	3f 4f       	sbci	r19, 0xFF	; 255
   2aafc:	8f 32       	cpi	r24, 0x2F	; 47
   2aafe:	c9 f3       	breq	.-14     	; 0x2aaf2 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x168>
    if (!*path) break;
   2ab00:	88 23       	and	r24, r24
   2ab02:	d9 f0       	breq	.+54     	; 0x2ab3a <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x1b0>
    if (!sub->open(parent, dname, O_READ)) goto fail;
   2ab04:	21 e0       	ldi	r18, 0x01	; 1
   2ab06:	b8 01       	movw	r22, r16
   2ab08:	c7 01       	movw	r24, r14
   2ab0a:	0f 94 b0 30 	call	0x26160	; 0x26160 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)>
   2ab0e:	88 23       	and	r24, r24
   2ab10:	09 f4       	brne	.+2      	; 0x2ab14 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x18a>
   2ab12:	60 cf       	rjmp	.-320    	; 0x2a9d4 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x4a>
    if (parent != dirFile) parent->close();
   2ab14:	0a 15       	cp	r16, r10
   2ab16:	1b 05       	cpc	r17, r11
   2ab18:	19 f0       	breq	.+6      	; 0x2ab20 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x196>
   2ab1a:	c8 01       	movw	r24, r16
   2ab1c:	0f 94 e9 2e 	call	0x25dd2	; 0x25dd2 <SdBaseFile::close()>
    parent = sub;
    sub = parent != &dir1 ? &dir1 : &dir2;
   2ab20:	94 2d       	mov	r25, r4
   2ab22:	85 2d       	mov	r24, r5
   2ab24:	6e 14       	cp	r6, r14
   2ab26:	7f 04       	cpc	r7, r15
   2ab28:	21 f0       	breq	.+8      	; 0x2ab32 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x1a8>
   2ab2a:	23 96       	adiw	r28, 0x03	; 3
   2ab2c:	9f ad       	ldd	r25, Y+63	; 0x3f
   2ab2e:	23 97       	sbiw	r28, 0x03	; 3
   2ab30:	82 2d       	mov	r24, r2
   2ab32:	87 01       	movw	r16, r14
   2ab34:	e9 2e       	mov	r14, r25
   2ab36:	f8 2e       	mov	r15, r24
   2ab38:	9e cf       	rjmp	.-196    	; 0x2aa76 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0xec>
  }
  return open(parent, dname, oflag);
   2ab3a:	23 2d       	mov	r18, r3
   2ab3c:	b8 01       	movw	r22, r16
   2ab3e:	c4 01       	movw	r24, r8
   2ab40:	0f 94 b0 30 	call	0x26160	; 0x26160 <SdBaseFile::open(SdBaseFile*, unsigned char const*, unsigned char)>
   2ab44:	18 2f       	mov	r17, r24
   2ab46:	47 cf       	rjmp	.-370    	; 0x2a9d6 <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)+0x4c>

0002ab48 <SdFile::gfUpdateCurrentPosition(unsigned int) [clone .constprop.221]>:
}

// think twice before allowing this to inline - manipulating 4B longs is costly
// moreover - this function has its parameters in registers only, so no heavy stack usage besides the call/ret
void __attribute__((noinline)) SdFile::gfUpdateCurrentPosition(uint16_t inc){
    curPosition_ += inc;
   2ab48:	ef e6       	ldi	r30, 0x6F	; 111
   2ab4a:	f6 e1       	ldi	r31, 0x16	; 22
   2ab4c:	40 81       	ld	r20, Z
   2ab4e:	51 81       	ldd	r21, Z+1	; 0x01
   2ab50:	62 81       	ldd	r22, Z+2	; 0x02
   2ab52:	73 81       	ldd	r23, Z+3	; 0x03
   2ab54:	48 0f       	add	r20, r24
   2ab56:	59 1f       	adc	r21, r25
   2ab58:	61 1d       	adc	r22, r1
   2ab5a:	71 1d       	adc	r23, r1
   2ab5c:	40 83       	st	Z, r20
   2ab5e:	51 83       	std	Z+1, r21	; 0x01
   2ab60:	62 83       	std	Z+2, r22	; 0x02
   2ab62:	73 83       	std	Z+3, r23	; 0x03
}
   2ab64:	08 95       	ret

0002ab66 <CLAMP_median(float*, unsigned char, float) [clone .constprop.82]>:
float median(float *points, const uint8_t num_points){
	sort(points, num_points);
	return points[num_points / 2];
}

float __attribute__ ((noinline)) CLAMP_median(float *shifts, uint8_t blocks, float norm){
   2ab66:	2f 92       	push	r2
   2ab68:	3f 92       	push	r3
   2ab6a:	4f 92       	push	r4
   2ab6c:	5f 92       	push	r5
   2ab6e:	6f 92       	push	r6
   2ab70:	7f 92       	push	r7
   2ab72:	8f 92       	push	r8
   2ab74:	9f 92       	push	r9
   2ab76:	af 92       	push	r10
   2ab78:	bf 92       	push	r11
   2ab7a:	cf 92       	push	r12
   2ab7c:	df 92       	push	r13
   2ab7e:	ef 92       	push	r14
   2ab80:	ff 92       	push	r15
   2ab82:	0f 93       	push	r16
   2ab84:	1f 93       	push	r17
   2ab86:	cf 93       	push	r28
   2ab88:	df 93       	push	r29
   2ab8a:	00 d0       	rcall	.+0      	; 0x2ab8c <CLAMP_median(float*, unsigned char, float) [clone .constprop.82]+0x26>
   2ab8c:	1f 92       	push	r1
   2ab8e:	1f 92       	push	r1
   2ab90:	cd b7       	in	r28, 0x3d	; 61
   2ab92:	de b7       	in	r29, 0x3e	; 62
   2ab94:	1c 01       	movw	r2, r24
   2ab96:	2a 01       	movw	r4, r20
   2ab98:	3b 01       	movw	r6, r22
   2ab9a:	00 e2       	ldi	r16, 0x20	; 32
   2ab9c:	10 e0       	ldi	r17, 0x00	; 0

/// slow bubble sort but short
void sort(float *points, const uint8_t num_points){
	/// one direction bubble sort
	for (uint8_t i = 0; i < num_points; ++i){
		for (uint8_t j = 0; j < num_points - i - 1; ++j){
   2ab9e:	19 82       	std	Y+1, r1	; 0x01
   2aba0:	99 81       	ldd	r25, Y+1	; 0x01
   2aba2:	89 2f       	mov	r24, r25
   2aba4:	90 e0       	ldi	r25, 0x00	; 0
   2aba6:	9b 83       	std	Y+3, r25	; 0x03
   2aba8:	8a 83       	std	Y+2, r24	; 0x02
   2abaa:	80 17       	cp	r24, r16
   2abac:	91 07       	cpc	r25, r17
   2abae:	9c f5       	brge	.+102    	; 0x2ac16 <CLAMP_median(float*, unsigned char, float) [clone .constprop.82]+0xb0>
			if (points[j] > points[j + 1])
   2abb0:	88 0f       	add	r24, r24
   2abb2:	99 1f       	adc	r25, r25
   2abb4:	88 0f       	add	r24, r24
   2abb6:	99 1f       	adc	r25, r25
   2abb8:	9d 83       	std	Y+5, r25	; 0x05
   2abba:	8c 83       	std	Y+4, r24	; 0x04
   2abbc:	82 0d       	add	r24, r2
   2abbe:	93 1d       	adc	r25, r3
   2abc0:	9b 83       	std	Y+3, r25	; 0x03
   2abc2:	8a 83       	std	Y+2, r24	; 0x02
   2abc4:	fc 01       	movw	r30, r24
   2abc6:	c0 80       	ld	r12, Z
   2abc8:	d1 80       	ldd	r13, Z+1	; 0x01
   2abca:	e2 80       	ldd	r14, Z+2	; 0x02
   2abcc:	f3 80       	ldd	r15, Z+3	; 0x03
   2abce:	8c 81       	ldd	r24, Y+4	; 0x04
   2abd0:	9d 81       	ldd	r25, Y+5	; 0x05
   2abd2:	04 96       	adiw	r24, 0x04	; 4
   2abd4:	82 0d       	add	r24, r2
   2abd6:	93 1d       	adc	r25, r3
   2abd8:	9d 83       	std	Y+5, r25	; 0x05
   2abda:	8c 83       	std	Y+4, r24	; 0x04
   2abdc:	fc 01       	movw	r30, r24
   2abde:	80 80       	ld	r8, Z
   2abe0:	91 80       	ldd	r9, Z+1	; 0x01
   2abe2:	a2 80       	ldd	r10, Z+2	; 0x02
   2abe4:	b3 80       	ldd	r11, Z+3	; 0x03
   2abe6:	a5 01       	movw	r20, r10
   2abe8:	94 01       	movw	r18, r8
   2abea:	c7 01       	movw	r24, r14
   2abec:	b6 01       	movw	r22, r12
   2abee:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   2abf2:	18 16       	cp	r1, r24
   2abf4:	64 f4       	brge	.+24     	; 0x2ac0e <CLAMP_median(float*, unsigned char, float) [clone .constprop.82]+0xa8>
				SWAP(points[j], points[j + 1]);
   2abf6:	ea 81       	ldd	r30, Y+2	; 0x02
   2abf8:	fb 81       	ldd	r31, Y+3	; 0x03
   2abfa:	80 82       	st	Z, r8
   2abfc:	91 82       	std	Z+1, r9	; 0x01
   2abfe:	a2 82       	std	Z+2, r10	; 0x02
   2ac00:	b3 82       	std	Z+3, r11	; 0x03
   2ac02:	ec 81       	ldd	r30, Y+4	; 0x04
   2ac04:	fd 81       	ldd	r31, Y+5	; 0x05
   2ac06:	c0 82       	st	Z, r12
   2ac08:	d1 82       	std	Z+1, r13	; 0x01
   2ac0a:	e2 82       	std	Z+2, r14	; 0x02
   2ac0c:	f3 82       	std	Z+3, r15	; 0x03

/// slow bubble sort but short
void sort(float *points, const uint8_t num_points){
	/// one direction bubble sort
	for (uint8_t i = 0; i < num_points; ++i){
		for (uint8_t j = 0; j < num_points - i - 1; ++j){
   2ac0e:	f9 81       	ldd	r31, Y+1	; 0x01
   2ac10:	ff 5f       	subi	r31, 0xFF	; 255
   2ac12:	f9 83       	std	Y+1, r31	; 0x01
   2ac14:	c5 cf       	rjmp	.-118    	; 0x2aba0 <CLAMP_median(float*, unsigned char, float) [clone .constprop.82]+0x3a>
   2ac16:	01 50       	subi	r16, 0x01	; 1
   2ac18:	11 09       	sbc	r17, r1
   2ac1a:	08 f6       	brcc	.-126    	; 0x2ab9e <CLAMP_median(float*, unsigned char, float) [clone .constprop.82]+0x38>

/// sort array and returns median value
/// don't send empty array or nullptr
float median(float *points, const uint8_t num_points){
	sort(points, num_points);
	return points[num_points / 2];
   2ac1c:	f1 01       	movw	r30, r2
   2ac1e:	e0 5c       	subi	r30, 0xC0	; 192
   2ac20:	ff 4f       	sbci	r31, 0xFF	; 255
}

float __attribute__ ((noinline)) CLAMP_median(float *shifts, uint8_t blocks, float norm){
    const constexpr float max_change = 0.5f; ///< avoids too fast changes (avoid oscillation)
    return CLAMP( median(shifts, blocks) * norm, -max_change, max_change);
   2ac22:	20 81       	ld	r18, Z
   2ac24:	31 81       	ldd	r19, Z+1	; 0x01
   2ac26:	42 81       	ldd	r20, Z+2	; 0x02
   2ac28:	53 81       	ldd	r21, Z+3	; 0x03
   2ac2a:	c3 01       	movw	r24, r6
   2ac2c:	b2 01       	movw	r22, r4
   2ac2e:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2ac32:	6b 01       	movw	r12, r22
   2ac34:	7c 01       	movw	r14, r24
   2ac36:	20 e0       	ldi	r18, 0x00	; 0
   2ac38:	30 e0       	ldi	r19, 0x00	; 0
   2ac3a:	40 e0       	ldi	r20, 0x00	; 0
   2ac3c:	5f eb       	ldi	r21, 0xBF	; 191
   2ac3e:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   2ac42:	87 fd       	sbrc	r24, 7
   2ac44:	10 c0       	rjmp	.+32     	; 0x2ac66 <CLAMP_median(float*, unsigned char, float) [clone .constprop.82]+0x100>
   2ac46:	20 e0       	ldi	r18, 0x00	; 0
   2ac48:	30 e0       	ldi	r19, 0x00	; 0
   2ac4a:	40 e0       	ldi	r20, 0x00	; 0
   2ac4c:	5f e3       	ldi	r21, 0x3F	; 63
   2ac4e:	c7 01       	movw	r24, r14
   2ac50:	b6 01       	movw	r22, r12
   2ac52:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   2ac56:	18 16       	cp	r1, r24
   2ac58:	5c f4       	brge	.+22     	; 0x2ac70 <CLAMP_median(float*, unsigned char, float) [clone .constprop.82]+0x10a>
   2ac5a:	c1 2c       	mov	r12, r1
   2ac5c:	d1 2c       	mov	r13, r1
   2ac5e:	e1 2c       	mov	r14, r1
   2ac60:	8f e3       	ldi	r24, 0x3F	; 63
   2ac62:	f8 2e       	mov	r15, r24
   2ac64:	05 c0       	rjmp	.+10     	; 0x2ac70 <CLAMP_median(float*, unsigned char, float) [clone .constprop.82]+0x10a>
   2ac66:	c1 2c       	mov	r12, r1
   2ac68:	d1 2c       	mov	r13, r1
   2ac6a:	e1 2c       	mov	r14, r1
   2ac6c:	9f eb       	ldi	r25, 0xBF	; 191
   2ac6e:	f9 2e       	mov	r15, r25
}
   2ac70:	c7 01       	movw	r24, r14
   2ac72:	b6 01       	movw	r22, r12
   2ac74:	0f 90       	pop	r0
   2ac76:	0f 90       	pop	r0
   2ac78:	0f 90       	pop	r0
   2ac7a:	0f 90       	pop	r0
   2ac7c:	0f 90       	pop	r0
   2ac7e:	df 91       	pop	r29
   2ac80:	cf 91       	pop	r28
   2ac82:	1f 91       	pop	r17
   2ac84:	0f 91       	pop	r16
   2ac86:	ff 90       	pop	r15
   2ac88:	ef 90       	pop	r14
   2ac8a:	df 90       	pop	r13
   2ac8c:	cf 90       	pop	r12
   2ac8e:	bf 90       	pop	r11
   2ac90:	af 90       	pop	r10
   2ac92:	9f 90       	pop	r9
   2ac94:	8f 90       	pop	r8
   2ac96:	7f 90       	pop	r7
   2ac98:	6f 90       	pop	r6
   2ac9a:	5f 90       	pop	r5
   2ac9c:	4f 90       	pop	r4
   2ac9e:	3f 90       	pop	r3
   2aca0:	2f 90       	pop	r2
   2aca2:	08 95       	ret

0002aca4 <MMU2::ProtocolLogic::RecordUARTActivity() [clone .constprop.338]>:
bool ProtocolLogic::Elapsed(uint32_t timeout) const {
    return _millis() >= (lastUARTActivityMs + timeout);
}

void ProtocolLogic::RecordUARTActivity() {
    lastUARTActivityMs = _millis();
   2aca4:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   2aca8:	60 93 a1 12 	sts	0x12A1, r22	; 0x8012a1 <MMU2::mmu2+0xf>
   2acac:	70 93 a2 12 	sts	0x12A2, r23	; 0x8012a2 <MMU2::mmu2+0x10>
   2acb0:	80 93 a3 12 	sts	0x12A3, r24	; 0x8012a3 <MMU2::mmu2+0x11>
   2acb4:	90 93 a4 12 	sts	0x12A4, r25	; 0x8012a4 <MMU2::mmu2+0x12>
}
   2acb8:	08 95       	ret

0002acba <MMU2::ProtocolLogic::DecrementRetryAttempts() [clone .constprop.269]>:
    }
    return (uint8_t)ReqMsg().code;
}

void ProtocolLogic::DecrementRetryAttempts() {
    if (inAutoRetry && retryAttempts) {
   2acba:	80 91 e7 12 	lds	r24, 0x12E7	; 0x8012e7 <MMU2::mmu2+0x55>
   2acbe:	88 23       	and	r24, r24
   2acc0:	69 f0       	breq	.+26     	; 0x2acdc <MMU2::ProtocolLogic::DecrementRetryAttempts() [clone .constprop.269]+0x22>
   2acc2:	80 91 e6 12 	lds	r24, 0x12E6	; 0x8012e6 <MMU2::mmu2+0x54>
   2acc6:	88 23       	and	r24, r24
   2acc8:	49 f0       	breq	.+18     	; 0x2acdc <MMU2::ProtocolLogic::DecrementRetryAttempts() [clone .constprop.269]+0x22>
        SERIAL_ECHOLNPGM("DecrementRetryAttempts");
   2acca:	85 e4       	ldi	r24, 0x45	; 69
   2accc:	91 ea       	ldi	r25, 0xA1	; 161
   2acce:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
        retryAttempts--;
   2acd2:	80 91 e6 12 	lds	r24, 0x12E6	; 0x8012e6 <MMU2::mmu2+0x54>
   2acd6:	81 50       	subi	r24, 0x01	; 1
   2acd8:	80 93 e6 12 	sts	0x12E6, r24	; 0x8012e6 <MMU2::mmu2+0x54>
    }
}
   2acdc:	08 95       	ret

0002acde <MMU2::ProtocolLogic::LogError(char const*) [clone .constprop.286]>:
        MMU2_ECHO_MSGLN(tmp);
    }
    strncpy(lastMsg, tmp, rqs);
}

void ProtocolLogic::LogError(const char *reason_P) {
   2acde:	9f 92       	push	r9
   2ace0:	af 92       	push	r10
   2ace2:	bf 92       	push	r11
   2ace4:	cf 92       	push	r12
   2ace6:	df 92       	push	r13
   2ace8:	ef 92       	push	r14
   2acea:	ff 92       	push	r15
   2acec:	0f 93       	push	r16
   2acee:	1f 93       	push	r17
   2acf0:	cf 93       	push	r28
   2acf2:	df 93       	push	r29
   2acf4:	cd b7       	in	r28, 0x3d	; 61
   2acf6:	de b7       	in	r29, 0x3e	; 62
   2acf8:	e0 97       	sbiw	r28, 0x30	; 48
   2acfa:	0f b6       	in	r0, 0x3f	; 63
   2acfc:	f8 94       	cli
   2acfe:	de bf       	out	0x3e, r29	; 62
   2ad00:	0f be       	out	0x3f, r0	; 63
   2ad02:	cd bf       	out	0x3d, r28	; 61
   2ad04:	8c 01       	movw	r16, r24
    }
}

void ProtocolLogic::FormatLastReceivedBytes(char *dst) {
    for (uint8_t i = 0; i < lastReceivedBytes.size(); ++i) {
        uint8_t b = lastReceivedBytes[(lrb - i - 1) % lastReceivedBytes.size()];
   2ad06:	e0 90 cf 12 	lds	r14, 0x12CF	; 0x8012cf <MMU2::mmu2+0x3d>
   2ad0a:	fe 01       	movw	r30, r28
   2ad0c:	31 96       	adiw	r30, 0x01	; 1
   2ad0e:	21 e0       	ldi	r18, 0x01	; 1
   2ad10:	30 e0       	ldi	r19, 0x00	; 0
   2ad12:	5f 01       	movw	r10, r30
   2ad14:	f1 2c       	mov	r15, r1
   2ad16:	40 e1       	ldi	r20, 0x10	; 16
   2ad18:	c4 2e       	mov	r12, r20
   2ad1a:	d1 2c       	mov	r13, r1
        dst[i * 3] = NibbleToChar(b >> 4);
        dst[i * 3 + 1] = NibbleToChar(b & 0xf);
        dst[i * 3 + 2] = ' ';
   2ad1c:	50 e2       	ldi	r21, 0x20	; 32
   2ad1e:	95 2e       	mov	r9, r21
    }
}

void ProtocolLogic::FormatLastReceivedBytes(char *dst) {
    for (uint8_t i = 0; i < lastReceivedBytes.size(); ++i) {
        uint8_t b = lastReceivedBytes[(lrb - i - 1) % lastReceivedBytes.size()];
   2ad20:	c7 01       	movw	r24, r14
   2ad22:	82 1b       	sub	r24, r18
   2ad24:	93 0b       	sbc	r25, r19
   2ad26:	b6 01       	movw	r22, r12
   2ad28:	0f 94 bd a4 	call	0x3497a	; 0x3497a <__divmodhi4>
   2ad2c:	dc 01       	movw	r26, r24
   2ad2e:	bb 27       	eor	r27, r27
   2ad30:	ae 56       	subi	r26, 0x6E	; 110
   2ad32:	bd 4e       	sbci	r27, 0xED	; 237
   2ad34:	9d 96       	adiw	r26, 0x2d	; 45
   2ad36:	8c 91       	ld	r24, X
        dst[i * 3] = NibbleToChar(b >> 4);
   2ad38:	48 2f       	mov	r20, r24
   2ad3a:	50 e0       	ldi	r21, 0x00	; 0
   2ad3c:	94 e0       	ldi	r25, 0x04	; 4
   2ad3e:	55 95       	asr	r21
   2ad40:	47 95       	ror	r20
   2ad42:	9a 95       	dec	r25
   2ad44:	e1 f7       	brne	.-8      	; 0x2ad3e <MMU2::ProtocolLogic::LogError(char const*) [clone .constprop.286]+0x60>
    lastReceivedBytes[lrb] = c;
    lrb = (lrb + 1) % lastReceivedBytes.size();
}

constexpr char NibbleToChar(uint8_t c) {
    switch (c) {
   2ad46:	96 ef       	ldi	r25, 0xF6	; 246
   2ad48:	94 0f       	add	r25, r20
   2ad4a:	96 30       	cpi	r25, 0x06	; 6
   2ad4c:	a8 f1       	brcs	.+106    	; 0x2adb8 <MMU2::ProtocolLogic::LogError(char const*) [clone .constprop.286]+0xda>
    case 5:
    case 6:
    case 7:
    case 8:
    case 9:
        return c + '0';
   2ad4e:	40 5d       	subi	r20, 0xD0	; 208
}

void ProtocolLogic::FormatLastReceivedBytes(char *dst) {
    for (uint8_t i = 0; i < lastReceivedBytes.size(); ++i) {
        uint8_t b = lastReceivedBytes[(lrb - i - 1) % lastReceivedBytes.size()];
        dst[i * 3] = NibbleToChar(b >> 4);
   2ad50:	40 83       	st	Z, r20
        dst[i * 3 + 1] = NibbleToChar(b & 0xf);
   2ad52:	8f 70       	andi	r24, 0x0F	; 15
    lastReceivedBytes[lrb] = c;
    lrb = (lrb + 1) % lastReceivedBytes.size();
}

constexpr char NibbleToChar(uint8_t c) {
    switch (c) {
   2ad54:	96 ef       	ldi	r25, 0xF6	; 246
   2ad56:	98 0f       	add	r25, r24
   2ad58:	96 30       	cpi	r25, 0x06	; 6
   2ad5a:	80 f1       	brcs	.+96     	; 0x2adbc <MMU2::ProtocolLogic::LogError(char const*) [clone .constprop.286]+0xde>
    case 5:
    case 6:
    case 7:
    case 8:
    case 9:
        return c + '0';
   2ad5c:	80 5d       	subi	r24, 0xD0	; 208

void ProtocolLogic::FormatLastReceivedBytes(char *dst) {
    for (uint8_t i = 0; i < lastReceivedBytes.size(); ++i) {
        uint8_t b = lastReceivedBytes[(lrb - i - 1) % lastReceivedBytes.size()];
        dst[i * 3] = NibbleToChar(b >> 4);
        dst[i * 3 + 1] = NibbleToChar(b & 0xf);
   2ad5e:	81 83       	std	Z+1, r24	; 0x01
        dst[i * 3 + 2] = ' ';
   2ad60:	92 82       	std	Z+2, r9	; 0x02
   2ad62:	2f 5f       	subi	r18, 0xFF	; 255
   2ad64:	3f 4f       	sbci	r19, 0xFF	; 255
   2ad66:	33 96       	adiw	r30, 0x03	; 3
        return 0;
    }
}

void ProtocolLogic::FormatLastReceivedBytes(char *dst) {
    for (uint8_t i = 0; i < lastReceivedBytes.size(); ++i) {
   2ad68:	21 31       	cpi	r18, 0x11	; 17
   2ad6a:	31 05       	cpc	r19, r1
   2ad6c:	c9 f6       	brne	.-78     	; 0x2ad20 <MMU2::ProtocolLogic::LogError(char const*) [clone .constprop.286]+0x42>
        uint8_t b = lastReceivedBytes[(lrb - i - 1) % lastReceivedBytes.size()];
        dst[i * 3] = NibbleToChar(b >> 4);
        dst[i * 3 + 1] = NibbleToChar(b & 0xf);
        dst[i * 3 + 2] = ' ';
    }
    dst[(lastReceivedBytes.size() - 1) * 3 + 2] = 0; // terminate properly
   2ad6e:	18 aa       	std	Y+48, r1	; 0x30

void ProtocolLogic::LogError(const char *reason_P) {
    char lrb[lastReceivedBytes.size() * 3];
    FormatLastReceivedBytes(lrb);

    MMU2_ERROR_MSGRPGM(reason_P);
   2ad70:	8e ec       	ldi	r24, 0xCE	; 206
   2ad72:	91 ea       	ldi	r25, 0xA1	; 161
   2ad74:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   2ad78:	88 ec       	ldi	r24, 0xC8	; 200
   2ad7a:	91 ea       	ldi	r25, 0xA1	; 161
   2ad7c:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   2ad80:	c8 01       	movw	r24, r16
   2ad82:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    SERIAL_ECHOPGM(", last bytes: ");
   2ad86:	80 e7       	ldi	r24, 0x70	; 112
   2ad88:	91 ea       	ldi	r25, 0xA1	; 161
   2ad8a:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    SERIAL_ECHOLN(lrb);
   2ad8e:	c5 01       	movw	r24, r10
   2ad90:	0e 94 a1 87 	call	0x10f42	; 0x10f42 <MarlinSerial::println(char const*)>
}
   2ad94:	e0 96       	adiw	r28, 0x30	; 48
   2ad96:	0f b6       	in	r0, 0x3f	; 63
   2ad98:	f8 94       	cli
   2ad9a:	de bf       	out	0x3e, r29	; 62
   2ad9c:	0f be       	out	0x3f, r0	; 63
   2ad9e:	cd bf       	out	0x3d, r28	; 61
   2ada0:	df 91       	pop	r29
   2ada2:	cf 91       	pop	r28
   2ada4:	1f 91       	pop	r17
   2ada6:	0f 91       	pop	r16
   2ada8:	ff 90       	pop	r15
   2adaa:	ef 90       	pop	r14
   2adac:	df 90       	pop	r13
   2adae:	cf 90       	pop	r12
   2adb0:	bf 90       	pop	r11
   2adb2:	af 90       	pop	r10
   2adb4:	9f 90       	pop	r9
   2adb6:	08 95       	ret
    case 11:
    case 12:
    case 13:
    case 14:
    case 15:
        return (c - 10) + 'a';
   2adb8:	49 5a       	subi	r20, 0xA9	; 169
   2adba:	ca cf       	rjmp	.-108    	; 0x2ad50 <MMU2::ProtocolLogic::LogError(char const*) [clone .constprop.286]+0x72>
   2adbc:	89 5a       	subi	r24, 0xA9	; 169
   2adbe:	cf cf       	rjmp	.-98     	; 0x2ad5e <MMU2::ProtocolLogic::LogError(char const*) [clone .constprop.286]+0x80>

0002adc0 <MMU2::ProtocolLogic::SuppressShortDropOuts(char const*, MMU2::StepStatus) [clone .constprop.283]>:
    char lrb[lastReceivedBytes.size()];
    FormatLastResponseMsgAndClearLRB(lrb);
    MMU2_ECHO_MSGLN(lrb);
}

StepStatus ProtocolLogic::SuppressShortDropOuts(const char *msg_P, StepStatus ss) {
   2adc0:	9c 01       	movw	r18, r24
    SERIAL_ECHOLNPGM("RSTCommTimeout");
    dataTO.Reset();
}

bool DropOutFilter::Record(StepStatus ss) {
    if (occurrences == maxOccurrences) {
   2adc2:	90 91 a6 12 	lds	r25, 0x12A6	; 0x8012a6 <MMU2::mmu2+0x14>
   2adc6:	9a 30       	cpi	r25, 0x0A	; 10
   2adc8:	11 f4       	brne	.+4      	; 0x2adce <MMU2::ProtocolLogic::SuppressShortDropOuts(char const*, MMU2::StepStatus) [clone .constprop.283]+0xe>
        cause = ss;
   2adca:	60 93 a5 12 	sts	0x12A5, r22	; 0x8012a5 <MMU2::mmu2+0x13>
    }
    --occurrences;
   2adce:	91 50       	subi	r25, 0x01	; 1
   2add0:	90 93 a6 12 	sts	0x12A6, r25	; 0x8012a6 <MMU2::mmu2+0x14>
    FormatLastResponseMsgAndClearLRB(lrb);
    MMU2_ECHO_MSGLN(lrb);
}

StepStatus ProtocolLogic::SuppressShortDropOuts(const char *msg_P, StepStatus ss) {
    if (dataTO.Record(ss)) {
   2add4:	91 11       	cpse	r25, r1
   2add6:	0d c0       	rjmp	.+26     	; 0x2adf2 <MMU2::ProtocolLogic::SuppressShortDropOuts(char const*, MMU2::StepStatus) [clone .constprop.283]+0x32>
   2add8:	c9 01       	movw	r24, r18
        LogError(msg_P);
   2adda:	0f 94 6f 56 	call	0x2acde	; 0x2acde <MMU2::ProtocolLogic::LogError(char const*) [clone .constprop.286]>
    SERIAL_ECHOLNPGM("ResetRetryAttempts");
    retryAttempts = MAX_RETRIES;
}

void ProtocolLogic::ResetCommunicationTimeoutAttempts() {
    SERIAL_ECHOLNPGM("RSTCommTimeout");
   2adde:	81 e6       	ldi	r24, 0x61	; 97
   2ade0:	91 ea       	ldi	r25, 0xA1	; 161
   2ade2:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>

    /// @returns the initial cause which started this drop out event
    inline StepStatus InitialCause() const { return cause; }

    /// Rearms the object for further processing - basically call this once the MMU responds with something meaningful (e.g. S0 A2)
    inline void Reset() { occurrences = maxOccurrences; }
   2ade6:	8a e0       	ldi	r24, 0x0A	; 10
   2ade8:	80 93 a6 12 	sts	0x12A6, r24	; 0x8012a6 <MMU2::mmu2+0x14>
   2adec:	80 91 a5 12 	lds	r24, 0x12A5	; 0x8012a5 <MMU2::mmu2+0x13>
   2adf0:	08 95       	ret
    if (dataTO.Record(ss)) {
        LogError(msg_P);
        ResetCommunicationTimeoutAttempts(); // prepare for another run of consecutive retries before firing an error
        return dataTO.InitialCause();
    } else {
        return Processing; // suppress short drop outs of communication
   2adf2:	80 e0       	ldi	r24, 0x00	; 0
    }
}
   2adf4:	08 95       	ret

0002adf6 <MMU2::ProtocolLogic::LogRequestMsg(unsigned char const*, unsigned char) [clone .constprop.337]>:
    }
    *dst = 0; // terminate properly
    lrb = 0; // reset the input buffer index in case of a clean message
}

void ProtocolLogic::LogRequestMsg(const uint8_t *txbuff, uint8_t size) {
   2adf6:	cf 93       	push	r28
   2adf8:	df 93       	push	r29
   2adfa:	cd b7       	in	r28, 0x3d	; 61
   2adfc:	de b7       	in	r29, 0x3e	; 62
   2adfe:	2e 97       	sbiw	r28, 0x0e	; 14
   2ae00:	0f b6       	in	r0, 0x3f	; 63
   2ae02:	f8 94       	cli
   2ae04:	de bf       	out	0x3e, r29	; 62
   2ae06:	0f be       	out	0x3f, r0	; 63
   2ae08:	cd bf       	out	0x3d, r28	; 61
    constexpr uint_fast8_t rqs = modules::protocol::Protocol::MaxRequestSize() + 1;
    char tmp[rqs] = ">";
   2ae0a:	2e e3       	ldi	r18, 0x3E	; 62
   2ae0c:	30 e0       	ldi	r19, 0x00	; 0
   2ae0e:	3a 83       	std	Y+2, r19	; 0x02
   2ae10:	29 83       	std	Y+1, r18	; 0x01
   2ae12:	fe 01       	movw	r30, r28
   2ae14:	33 96       	adiw	r30, 0x03	; 3
   2ae16:	2c e0       	ldi	r18, 0x0C	; 12
   2ae18:	df 01       	movw	r26, r30
   2ae1a:	1d 92       	st	X+, r1
   2ae1c:	2a 95       	dec	r18
   2ae1e:	e9 f7       	brne	.-6      	; 0x2ae1a <MMU2::ProtocolLogic::LogRequestMsg(unsigned char const*, unsigned char) [clone .constprop.337]+0x24>
   2ae20:	de 01       	movw	r26, r28
   2ae22:	12 96       	adiw	r26, 0x02	; 2
   2ae24:	48 2f       	mov	r20, r24
   2ae26:	fc 01       	movw	r30, r24
   2ae28:	9d 01       	movw	r18, r26
    static char lastMsg[rqs] = "";
    for (uint8_t i = 0; i < size; ++i) {
   2ae2a:	8e 2f       	mov	r24, r30
   2ae2c:	84 1b       	sub	r24, r20
   2ae2e:	86 17       	cp	r24, r22
   2ae30:	40 f4       	brcc	.+16     	; 0x2ae42 <MMU2::ProtocolLogic::LogRequestMsg(unsigned char const*, unsigned char) [clone .constprop.337]+0x4c>
        uint8_t b = txbuff[i];
   2ae32:	81 91       	ld	r24, Z+
        // Check for printable character, including space
        if (b < 32 || b > 127) {
   2ae34:	90 ee       	ldi	r25, 0xE0	; 224
   2ae36:	98 0f       	add	r25, r24
   2ae38:	90 36       	cpi	r25, 0x60	; 96
   2ae3a:	08 f0       	brcs	.+2      	; 0x2ae3e <MMU2::ProtocolLogic::LogRequestMsg(unsigned char const*, unsigned char) [clone .constprop.337]+0x48>
            b = '.';
   2ae3c:	8e e2       	ldi	r24, 0x2E	; 46
        }
        tmp[i + 1] = b;
   2ae3e:	8d 93       	st	X+, r24
   2ae40:	f4 cf       	rjmp	.-24     	; 0x2ae2a <MMU2::ProtocolLogic::LogRequestMsg(unsigned char const*, unsigned char) [clone .constprop.337]+0x34>
    }
    tmp[size + 1] = 0;
   2ae42:	f9 01       	movw	r30, r18
   2ae44:	e6 0f       	add	r30, r22
   2ae46:	f1 1d       	adc	r31, r1
   2ae48:	10 82       	st	Z, r1
    if (!strncmp_P(tmp, PSTR(">S0*c6."), rqs) && !strncmp(lastMsg, tmp, rqs)) {
   2ae4a:	4e e0       	ldi	r20, 0x0E	; 14
   2ae4c:	50 e0       	ldi	r21, 0x00	; 0
   2ae4e:	64 ed       	ldi	r22, 0xD4	; 212
   2ae50:	71 ea       	ldi	r23, 0xA1	; 161
   2ae52:	ce 01       	movw	r24, r28
   2ae54:	01 96       	adiw	r24, 0x01	; 1
   2ae56:	0f 94 bf a1 	call	0x3437e	; 0x3437e <strncmp_P>
   2ae5a:	89 2b       	or	r24, r25
   2ae5c:	59 f4       	brne	.+22     	; 0x2ae74 <MMU2::ProtocolLogic::LogRequestMsg(unsigned char const*, unsigned char) [clone .constprop.337]+0x7e>
   2ae5e:	4e e0       	ldi	r20, 0x0E	; 14
   2ae60:	50 e0       	ldi	r21, 0x00	; 0
   2ae62:	be 01       	movw	r22, r28
   2ae64:	6f 5f       	subi	r22, 0xFF	; 255
   2ae66:	7f 4f       	sbci	r23, 0xFF	; 255
   2ae68:	82 e8       	ldi	r24, 0x82	; 130
   2ae6a:	92 e1       	ldi	r25, 0x12	; 18
   2ae6c:	0f 94 52 aa 	call	0x354a4	; 0x354a4 <strncmp>
   2ae70:	89 2b       	or	r24, r25
   2ae72:	61 f0       	breq	.+24     	; 0x2ae8c <MMU2::ProtocolLogic::LogRequestMsg(unsigned char const*, unsigned char) [clone .constprop.337]+0x96>
        // especially when the MMU is not connected.
        // We'll lose the ability to see if the printer is actually
        // trying to find the MMU, but since it has been reliable in the past
        // we can live without it for now.
    } else {
        MMU2_ECHO_MSGLN(tmp);
   2ae74:	8e ec       	ldi	r24, 0xCE	; 206
   2ae76:	91 ea       	ldi	r25, 0xA1	; 161
   2ae78:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   2ae7c:	88 ec       	ldi	r24, 0xC8	; 200
   2ae7e:	91 ea       	ldi	r25, 0xA1	; 161
   2ae80:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   2ae84:	ce 01       	movw	r24, r28
   2ae86:	01 96       	adiw	r24, 0x01	; 1
   2ae88:	0e 94 a1 87 	call	0x10f42	; 0x10f42 <MarlinSerial::println(char const*)>
    }
    strncpy(lastMsg, tmp, rqs);
   2ae8c:	4e e0       	ldi	r20, 0x0E	; 14
   2ae8e:	50 e0       	ldi	r21, 0x00	; 0
   2ae90:	be 01       	movw	r22, r28
   2ae92:	6f 5f       	subi	r22, 0xFF	; 255
   2ae94:	7f 4f       	sbci	r23, 0xFF	; 255
   2ae96:	82 e8       	ldi	r24, 0x82	; 130
   2ae98:	92 e1       	ldi	r25, 0x12	; 18
   2ae9a:	0f 94 60 aa 	call	0x354c0	; 0x354c0 <strncpy>
}
   2ae9e:	2e 96       	adiw	r28, 0x0e	; 14
   2aea0:	0f b6       	in	r0, 0x3f	; 63
   2aea2:	f8 94       	cli
   2aea4:	de bf       	out	0x3e, r29	; 62
   2aea6:	0f be       	out	0x3f, r0	; 63
   2aea8:	cd bf       	out	0x3d, r28	; 61
   2aeaa:	df 91       	pop	r29
   2aeac:	cf 91       	pop	r28
   2aeae:	08 95       	ret

0002aeb0 <MMU2::ProtocolLogic::SendMsg(modules::protocol::RequestMsg) [clone .constprop.335]>:
        return CommunicationTimeout;
    }
    return Processing;
}

void ProtocolLogic::SendMsg(RequestMsg rq) {
   2aeb0:	cf 92       	push	r12
   2aeb2:	df 92       	push	r13
   2aeb4:	ef 92       	push	r14
   2aeb6:	ff 92       	push	r15
   2aeb8:	1f 93       	push	r17
   2aeba:	cf 93       	push	r28
   2aebc:	df 93       	push	r29
   2aebe:	cd b7       	in	r28, 0x3d	; 61
   2aec0:	de b7       	in	r29, 0x3e	; 62
   2aec2:	62 97       	sbiw	r28, 0x12	; 18
   2aec4:	0f b6       	in	r0, 0x3f	; 63
   2aec6:	f8 94       	cli
   2aec8:	de bf       	out	0x3e, r29	; 62
   2aeca:	0f be       	out	0x3f, r0	; 63
   2aecc:	cd bf       	out	0x3d, r28	; 61
   2aece:	4e 87       	std	Y+14, r20	; 0x0e
   2aed0:	5f 87       	std	Y+15, r21	; 0x0f
   2aed2:	68 8b       	std	Y+16, r22	; 0x10
   2aed4:	79 8b       	std	Y+17, r23	; 0x11
   2aed6:	8a 8b       	std	Y+18, r24	; 0x12
        }
    }
}

uint8_t Protocol::EncodeRequest(const RequestMsg &msg, uint8_t *txbuff) {
    txbuff[0] = (uint8_t)msg.code;
   2aed8:	49 83       	std	Y+1, r20	; 0x01
    uint8_t i = 1 + UInt8ToHex(msg.value, txbuff + 1);
   2aeda:	85 2f       	mov	r24, r21
    txbuff[i] = '\n';
    return i + 1;
}

uint8_t Protocol::UInt8ToHex(uint8_t value, uint8_t *dst) {
    if (value == 0) {
   2aedc:	51 11       	cpse	r21, r1
   2aede:	31 c0       	rjmp	.+98     	; 0x2af42 <MMU2::ProtocolLogic::SendMsg(modules::protocol::RequestMsg) [clone .constprop.335]+0x92>
        *dst = '0';
   2aee0:	80 e3       	ldi	r24, 0x30	; 48
   2aee2:	8a 83       	std	Y+2, r24	; 0x02
        return 1;
   2aee4:	11 e0       	ldi	r17, 0x01	; 1

uint8_t Protocol::EncodeRequest(const RequestMsg &msg, uint8_t *txbuff) {
    txbuff[0] = (uint8_t)msg.code;
    uint8_t i = 1 + UInt8ToHex(msg.value, txbuff + 1);

    i += AppendCRC(msg.CRC(), txbuff + i);
   2aee6:	e1 e0       	ldi	r30, 0x01	; 1
   2aee8:	e1 0f       	add	r30, r17
   2aeea:	81 e0       	ldi	r24, 0x01	; 1
   2aeec:	90 e0       	ldi	r25, 0x00	; 0
   2aeee:	8c 0f       	add	r24, r28
   2aef0:	9d 1f       	adc	r25, r29
   2aef2:	8e 0f       	add	r24, r30
   2aef4:	91 1d       	adc	r25, r1
   2aef6:	fc 01       	movw	r30, r24
   2aef8:	8a 89       	ldd	r24, Y+18	; 0x12
    dst[i] = ' ';
    return i + 1;
}

uint8_t Protocol::AppendCRC(uint8_t crc, uint8_t *dst) {
    dst[0] = '*'; // reprap-style separator of CRC
   2aefa:	9a e2       	ldi	r25, 0x2A	; 42
   2aefc:	90 83       	st	Z, r25
    txbuff[i] = '\n';
    return i + 1;
}

uint8_t Protocol::UInt8ToHex(uint8_t value, uint8_t *dst) {
    if (value == 0) {
   2aefe:	81 11       	cpse	r24, r1
   2af00:	27 c0       	rjmp	.+78     	; 0x2af50 <MMU2::ProtocolLogic::SendMsg(modules::protocol::RequestMsg) [clone .constprop.335]+0xa0>
        *dst = '0';
   2af02:	80 e3       	ldi	r24, 0x30	; 48
   2af04:	81 83       	std	Z+1, r24	; 0x01
        return 1;
   2af06:	81 e0       	ldi	r24, 0x01	; 1

uint8_t Protocol::EncodeRequest(const RequestMsg &msg, uint8_t *txbuff) {
    txbuff[0] = (uint8_t)msg.code;
    uint8_t i = 1 + UInt8ToHex(msg.value, txbuff + 1);

    i += AppendCRC(msg.CRC(), txbuff + i);
   2af08:	1e 5f       	subi	r17, 0xFE	; 254
   2af0a:	18 0f       	add	r17, r24

    txbuff[i] = '\n';
   2af0c:	e1 e0       	ldi	r30, 0x01	; 1
   2af0e:	f0 e0       	ldi	r31, 0x00	; 0
   2af10:	ec 0f       	add	r30, r28
   2af12:	fd 1f       	adc	r31, r29
   2af14:	e1 0f       	add	r30, r17
   2af16:	f1 1d       	adc	r31, r1
   2af18:	8a e0       	ldi	r24, 0x0A	; 10
   2af1a:	80 83       	st	Z, r24
    ++i;
   2af1c:	1f 5f       	subi	r17, 0xFF	; 255
    // Buddy FW cannot use stack-allocated txbuff - DMA doesn't work with CCMRAM
    // No restrictions on MK3/S/+ though
    uint8_t txbuff[Protocol::MaxRequestSize()];
#endif
    uint8_t len = Protocol::EncodeRequest(rq, txbuff);
    uart->write(txbuff, len);
   2af1e:	fe 01       	movw	r30, r28
   2af20:	31 96       	adiw	r30, 0x01	; 1
   2af22:	7f 01       	movw	r14, r30
void MMU2Serial::flush() {
    // @@TODO - clear the output buffer
}

void MMU2Serial::write(const uint8_t *buffer, size_t size) {
    while(size--){
   2af24:	6f 01       	movw	r12, r30
   2af26:	c1 0e       	add	r12, r17
   2af28:	d1 1c       	adc	r13, r1
   2af2a:	ec 14       	cp	r14, r12
   2af2c:	fd 04       	cpc	r15, r13
   2af2e:	b1 f0       	breq	.+44     	; 0x2af5c <MMU2::ProtocolLogic::SendMsg(modules::protocol::RequestMsg) [clone .constprop.335]+0xac>
        fputc(*buffer, uart2io);
   2af30:	f7 01       	movw	r30, r14
   2af32:	81 91       	ld	r24, Z+
   2af34:	7f 01       	movw	r14, r30
   2af36:	64 e7       	ldi	r22, 0x74	; 116
   2af38:	72 e1       	ldi	r23, 0x12	; 18
   2af3a:	90 e0       	ldi	r25, 0x00	; 0
   2af3c:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
   2af40:	f4 cf       	rjmp	.-24     	; 0x2af2a <MMU2::ProtocolLogic::SendMsg(modules::protocol::RequestMsg) [clone .constprop.335]+0x7a>
   2af42:	be 01       	movw	r22, r28
   2af44:	6e 5f       	subi	r22, 0xFE	; 254
   2af46:	7f 4f       	sbci	r23, 0xFF	; 255
   2af48:	0f 94 77 50 	call	0x2a0ee	; 0x2a0ee <modules::protocol::Protocol::UInt8ToHex(unsigned char, unsigned char*) [clone .part.2]>
   2af4c:	18 2f       	mov	r17, r24
   2af4e:	cb cf       	rjmp	.-106    	; 0x2aee6 <MMU2::ProtocolLogic::SendMsg(modules::protocol::RequestMsg) [clone .constprop.335]+0x36>
    return i + 1;
}

uint8_t Protocol::AppendCRC(uint8_t crc, uint8_t *dst) {
    dst[0] = '*'; // reprap-style separator of CRC
    return 1 + UInt8ToHex(crc, dst + 1);
   2af50:	bf 01       	movw	r22, r30
   2af52:	6f 5f       	subi	r22, 0xFF	; 255
   2af54:	7f 4f       	sbci	r23, 0xFF	; 255
   2af56:	0f 94 77 50 	call	0x2a0ee	; 0x2a0ee <modules::protocol::Protocol::UInt8ToHex(unsigned char, unsigned char*) [clone .part.2]>
   2af5a:	d6 cf       	rjmp	.-84     	; 0x2af08 <MMU2::ProtocolLogic::SendMsg(modules::protocol::RequestMsg) [clone .constprop.335]+0x58>
    LogRequestMsg(txbuff, len);
   2af5c:	61 2f       	mov	r22, r17
   2af5e:	ce 01       	movw	r24, r28
   2af60:	01 96       	adiw	r24, 0x01	; 1
   2af62:	0f 94 fb 56 	call	0x2adf6	; 0x2adf6 <MMU2::ProtocolLogic::LogRequestMsg(unsigned char const*, unsigned char) [clone .constprop.337]>
    RecordUARTActivity();
   2af66:	0f 94 52 56 	call	0x2aca4	; 0x2aca4 <MMU2::ProtocolLogic::RecordUARTActivity() [clone .constprop.338]>
}
   2af6a:	62 96       	adiw	r28, 0x12	; 18
   2af6c:	0f b6       	in	r0, 0x3f	; 63
   2af6e:	f8 94       	cli
   2af70:	de bf       	out	0x3e, r29	; 62
   2af72:	0f be       	out	0x3f, r0	; 63
   2af74:	cd bf       	out	0x3d, r28	; 61
   2af76:	df 91       	pop	r29
   2af78:	cf 91       	pop	r28
   2af7a:	1f 91       	pop	r17
   2af7c:	ff 90       	pop	r15
   2af7e:	ef 90       	pop	r14
   2af80:	df 90       	pop	r13
   2af82:	cf 90       	pop	r12
   2af84:	08 95       	ret

0002af86 <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.331]>:
void ProtocolLogic::SendReadRegister(uint8_t index, ScopeState nextState) {
    SendMsg(RequestMsg(RequestMsgCodes::Read, index));
    scopeState = nextState;
}

void ProtocolLogic::SendWriteRegister(uint8_t index, uint16_t value, ScopeState nextState) {
   2af86:	8f 92       	push	r8
   2af88:	9f 92       	push	r9
   2af8a:	af 92       	push	r10
   2af8c:	bf 92       	push	r11
   2af8e:	df 92       	push	r13
   2af90:	ef 92       	push	r14
   2af92:	ff 92       	push	r15
   2af94:	0f 93       	push	r16
   2af96:	1f 93       	push	r17
   2af98:	cf 93       	push	r28
   2af9a:	df 93       	push	r29
   2af9c:	cd b7       	in	r28, 0x3d	; 61
   2af9e:	de b7       	in	r29, 0x3e	; 62
   2afa0:	67 97       	sbiw	r28, 0x17	; 23
   2afa2:	0f b6       	in	r0, 0x3f	; 63
   2afa4:	f8 94       	cli
   2afa6:	de bf       	out	0x3e, r29	; 62
   2afa8:	0f be       	out	0x3f, r0	; 63
   2afaa:	cd bf       	out	0x3d, r28	; 61
   2afac:	18 2f       	mov	r17, r24
   2afae:	7b 01       	movw	r14, r22
   2afb0:	d4 2e       	mov	r13, r20
    /// @param value to write into the register
    inline constexpr RequestMsg(RequestMsgCodes code, uint8_t address, uint16_t value)
        : code(code)
        , value(address)
        , value2(value)
        , crc8(ComputeCRC8()) {
   2afb2:	07 e5       	ldi	r16, 0x57	; 87
   2afb4:	0b 8b       	std	Y+19, r16	; 0x13
   2afb6:	8c 8b       	std	Y+20, r24	; 0x14
   2afb8:	7e 8b       	std	Y+22, r23	; 0x16
   2afba:	6d 8b       	std	Y+21, r22	; 0x15
   2afbc:	ce 01       	movw	r24, r28
   2afbe:	43 96       	adiw	r24, 0x13	; 19
   2afc0:	0f 94 a3 50 	call	0x2a146	; 0x2a146 <modules::protocol::RequestMsg::ComputeCRC8() const>
   2afc4:	8f 8b       	std	Y+23, r24	; 0x17
   2afc6:	0e 87       	std	Y+14, r16	; 0x0e
   2afc8:	1f 87       	std	Y+15, r17	; 0x0f
   2afca:	f9 8a       	std	Y+17, r15	; 0x11
   2afcc:	e8 8a       	std	Y+16, r14	; 0x10
   2afce:	ce 01       	movw	r24, r28
   2afd0:	0e 96       	adiw	r24, 0x0e	; 14
   2afd2:	0f 94 a3 50 	call	0x2a146	; 0x2a146 <modules::protocol::RequestMsg::ComputeCRC8() const>
   2afd6:	8a 8b       	std	Y+18, r24	; 0x12
    }
    return charsOut;
}

uint8_t Protocol::BeginEncodeRequest(const RequestMsg &msg, uint8_t *dst) {
    dst[0] = (uint8_t)msg.code;
   2afd8:	09 83       	std	Y+1, r16	; 0x01
    txbuff[i] = '\n';
    return i + 1;
}

uint8_t Protocol::UInt8ToHex(uint8_t value, uint8_t *dst) {
    if (value == 0) {
   2afda:	11 11       	cpse	r17, r1
   2afdc:	27 c0       	rjmp	.+78     	; 0x2b02c <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.331]+0xa6>
        *dst = '0';
   2afde:	80 e3       	ldi	r24, 0x30	; 48
   2afe0:	8a 83       	std	Y+2, r24	; 0x02
        return 1;
   2afe2:	81 e0       	ldi	r24, 0x01	; 1
}

uint8_t Protocol::BeginEncodeRequest(const RequestMsg &msg, uint8_t *dst) {
    dst[0] = (uint8_t)msg.code;

    uint8_t i = 1 + UInt8ToHex(msg.value, dst + 1);
   2afe4:	e1 e0       	ldi	r30, 0x01	; 1
   2afe6:	e8 0f       	add	r30, r24

    dst[i] = ' ';
   2afe8:	21 e0       	ldi	r18, 0x01	; 1
   2afea:	30 e0       	ldi	r19, 0x00	; 0
   2afec:	2c 0f       	add	r18, r28
   2afee:	3d 1f       	adc	r19, r29
   2aff0:	2e 0f       	add	r18, r30
   2aff2:	31 1d       	adc	r19, r1
   2aff4:	f9 01       	movw	r30, r18
   2aff6:	90 e2       	ldi	r25, 0x20	; 32
   2aff8:	90 83       	st	Z, r25
    return i + 1;
   2affa:	02 e0       	ldi	r16, 0x02	; 2
   2affc:	08 0f       	add	r16, r24

uint8_t Protocol::EncodeWriteRequest(uint8_t address, uint16_t value, uint8_t *txbuff) {
    const RequestMsg msg(RequestMsgCodes::Write, address, value);
    uint8_t i = BeginEncodeRequest(msg, txbuff);
    // dump the value
    i += UInt16ToHex(value, txbuff + i);
   2affe:	aa 24       	eor	r10, r10
   2b000:	a3 94       	inc	r10
   2b002:	b1 2c       	mov	r11, r1
   2b004:	ac 0e       	add	r10, r28
   2b006:	bd 1e       	adc	r11, r29
   2b008:	a0 0e       	add	r10, r16
   2b00a:	b1 1c       	adc	r11, r1
    return charsOut;
}

uint8_t Protocol::UInt16ToHex(uint16_t value, uint8_t *dst) {
    constexpr uint16_t topNibbleMask = 0xf000;
    if (value == 0) {
   2b00c:	e1 14       	cp	r14, r1
   2b00e:	f1 04       	cpc	r15, r1
   2b010:	39 f1       	breq	.+78     	; 0x2b060 <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.331]+0xda>
        *dst = '0';
        return 1;
    }
    // skip initial zeros
    uint8_t charsOut = 4;
   2b012:	14 e0       	ldi	r17, 0x04	; 4
    while ((value & topNibbleMask) == 0) {
   2b014:	c7 01       	movw	r24, r14
   2b016:	88 27       	eor	r24, r24
   2b018:	90 7f       	andi	r25, 0xF0	; 240
   2b01a:	89 2b       	or	r24, r25
   2b01c:	71 f4       	brne	.+28     	; 0x2b03a <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.331]+0xb4>
        value <<= 4U;
   2b01e:	24 e0       	ldi	r18, 0x04	; 4
   2b020:	ee 0c       	add	r14, r14
   2b022:	ff 1c       	adc	r15, r15
   2b024:	2a 95       	dec	r18
   2b026:	e1 f7       	brne	.-8      	; 0x2b020 <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.331]+0x9a>
        --charsOut;
   2b028:	11 50       	subi	r17, 0x01	; 1
   2b02a:	f4 cf       	rjmp	.-24     	; 0x2b014 <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.331]+0x8e>
   2b02c:	be 01       	movw	r22, r28
   2b02e:	6e 5f       	subi	r22, 0xFE	; 254
   2b030:	7f 4f       	sbci	r23, 0xFF	; 255
   2b032:	81 2f       	mov	r24, r17
   2b034:	0f 94 77 50 	call	0x2a0ee	; 0x2a0ee <modules::protocol::Protocol::UInt8ToHex(unsigned char, unsigned char*) [clone .part.2]>
   2b038:	d5 cf       	rjmp	.-86     	; 0x2afe4 <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.331]+0x5e>
        *dst = '0';
        return 1;
    }
    // skip initial zeros
    uint8_t charsOut = 4;
    while ((value & topNibbleMask) == 0) {
   2b03a:	45 01       	movw	r8, r10
        value <<= 4U;
        --charsOut;
    }
    for (uint8_t i = 0; i < charsOut; ++i) {
   2b03c:	88 2d       	mov	r24, r8
   2b03e:	8a 19       	sub	r24, r10
   2b040:	81 17       	cp	r24, r17
   2b042:	90 f4       	brcc	.+36     	; 0x2b068 <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.331]+0xe2>
        uint8_t n = (value & topNibbleMask) >> (8U + 4U);
        value <<= 4U;
        *dst = Nibble2Char(n);
   2b044:	8f 2d       	mov	r24, r15
   2b046:	82 95       	swap	r24
   2b048:	8f 70       	andi	r24, 0x0F	; 15
   2b04a:	94 e0       	ldi	r25, 0x04	; 4
   2b04c:	ee 0c       	add	r14, r14
   2b04e:	ff 1c       	adc	r15, r15
   2b050:	9a 95       	dec	r25
   2b052:	e1 f7       	brne	.-8      	; 0x2b04c <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.331]+0xc6>
   2b054:	0f 94 6d 50 	call	0x2a0da	; 0x2a0da <modules::protocol::Protocol::Nibble2Char(unsigned char)>
   2b058:	f4 01       	movw	r30, r8
   2b05a:	81 93       	st	Z+, r24
   2b05c:	4f 01       	movw	r8, r30
   2b05e:	ee cf       	rjmp	.-36     	; 0x2b03c <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.331]+0xb6>
}

uint8_t Protocol::UInt16ToHex(uint16_t value, uint8_t *dst) {
    constexpr uint16_t topNibbleMask = 0xf000;
    if (value == 0) {
        *dst = '0';
   2b060:	80 e3       	ldi	r24, 0x30	; 48
   2b062:	f5 01       	movw	r30, r10
   2b064:	80 83       	st	Z, r24
        return 1;
   2b066:	11 e0       	ldi	r17, 0x01	; 1

uint8_t Protocol::EncodeWriteRequest(uint8_t address, uint16_t value, uint8_t *txbuff) {
    const RequestMsg msg(RequestMsgCodes::Write, address, value);
    uint8_t i = BeginEncodeRequest(msg, txbuff);
    // dump the value
    i += UInt16ToHex(value, txbuff + i);
   2b068:	10 0f       	add	r17, r16

    i += AppendCRC(msg.CRC(), txbuff + i);
   2b06a:	e1 e0       	ldi	r30, 0x01	; 1
   2b06c:	f0 e0       	ldi	r31, 0x00	; 0
   2b06e:	ec 0f       	add	r30, r28
   2b070:	fd 1f       	adc	r31, r29
   2b072:	e1 0f       	add	r30, r17
   2b074:	f1 1d       	adc	r31, r1
   2b076:	8a 89       	ldd	r24, Y+18	; 0x12
    dst[i] = ' ';
    return i + 1;
}

uint8_t Protocol::AppendCRC(uint8_t crc, uint8_t *dst) {
    dst[0] = '*'; // reprap-style separator of CRC
   2b078:	9a e2       	ldi	r25, 0x2A	; 42
   2b07a:	90 83       	st	Z, r25
    txbuff[i] = '\n';
    return i + 1;
}

uint8_t Protocol::UInt8ToHex(uint8_t value, uint8_t *dst) {
    if (value == 0) {
   2b07c:	81 11       	cpse	r24, r1
   2b07e:	21 c0       	rjmp	.+66     	; 0x2b0c2 <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.331]+0x13c>
        *dst = '0';
   2b080:	80 e3       	ldi	r24, 0x30	; 48
   2b082:	81 83       	std	Z+1, r24	; 0x01
        return 1;
   2b084:	81 e0       	ldi	r24, 0x01	; 1
   2b086:	1f 5f       	subi	r17, 0xFF	; 255
    const RequestMsg msg(RequestMsgCodes::Write, address, value);
    uint8_t i = BeginEncodeRequest(msg, txbuff);
    // dump the value
    i += UInt16ToHex(value, txbuff + i);

    i += AppendCRC(msg.CRC(), txbuff + i);
   2b088:	18 0f       	add	r17, r24

    txbuff[i] = '\n';
   2b08a:	e1 e0       	ldi	r30, 0x01	; 1
   2b08c:	f0 e0       	ldi	r31, 0x00	; 0
   2b08e:	ec 0f       	add	r30, r28
   2b090:	fd 1f       	adc	r31, r29
   2b092:	e1 0f       	add	r30, r17
   2b094:	f1 1d       	adc	r31, r1
   2b096:	8a e0       	ldi	r24, 0x0A	; 10
   2b098:	80 83       	st	Z, r24
    ++i;
   2b09a:	1f 5f       	subi	r17, 0xFF	; 255
    // Buddy FW cannot use stack-allocated txbuff - DMA doesn't work with CCMRAM
    // No restrictions on MK3/S/+ though
    uint8_t txbuff[Protocol::MaxRequestSize()];
#endif
    uint8_t len = Protocol::EncodeWriteRequest(rq.value, rq.value2, txbuff);
    uart->write(txbuff, len);
   2b09c:	9e 01       	movw	r18, r28
   2b09e:	2f 5f       	subi	r18, 0xFF	; 255
   2b0a0:	3f 4f       	sbci	r19, 0xFF	; 255
   2b0a2:	79 01       	movw	r14, r18
void MMU2Serial::flush() {
    // @@TODO - clear the output buffer
}

void MMU2Serial::write(const uint8_t *buffer, size_t size) {
    while(size--){
   2b0a4:	59 01       	movw	r10, r18
   2b0a6:	a1 0e       	add	r10, r17
   2b0a8:	b1 1c       	adc	r11, r1
   2b0aa:	ea 14       	cp	r14, r10
   2b0ac:	fb 04       	cpc	r15, r11
   2b0ae:	79 f0       	breq	.+30     	; 0x2b0ce <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.331]+0x148>
        fputc(*buffer, uart2io);
   2b0b0:	f7 01       	movw	r30, r14
   2b0b2:	81 91       	ld	r24, Z+
   2b0b4:	7f 01       	movw	r14, r30
   2b0b6:	64 e7       	ldi	r22, 0x74	; 116
   2b0b8:	72 e1       	ldi	r23, 0x12	; 18
   2b0ba:	90 e0       	ldi	r25, 0x00	; 0
   2b0bc:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
   2b0c0:	f4 cf       	rjmp	.-24     	; 0x2b0aa <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.331]+0x124>
    return i + 1;
}

uint8_t Protocol::AppendCRC(uint8_t crc, uint8_t *dst) {
    dst[0] = '*'; // reprap-style separator of CRC
    return 1 + UInt8ToHex(crc, dst + 1);
   2b0c2:	bf 01       	movw	r22, r30
   2b0c4:	6f 5f       	subi	r22, 0xFF	; 255
   2b0c6:	7f 4f       	sbci	r23, 0xFF	; 255
   2b0c8:	0f 94 77 50 	call	0x2a0ee	; 0x2a0ee <modules::protocol::Protocol::UInt8ToHex(unsigned char, unsigned char*) [clone .part.2]>
   2b0cc:	dc cf       	rjmp	.-72     	; 0x2b086 <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.331]+0x100>
    LogRequestMsg(txbuff, len);
   2b0ce:	61 2f       	mov	r22, r17
   2b0d0:	ce 01       	movw	r24, r28
   2b0d2:	01 96       	adiw	r24, 0x01	; 1
   2b0d4:	0f 94 fb 56 	call	0x2adf6	; 0x2adf6 <MMU2::ProtocolLogic::LogRequestMsg(unsigned char const*, unsigned char) [clone .constprop.337]>
    RecordUARTActivity();
   2b0d8:	0f 94 52 56 	call	0x2aca4	; 0x2aca4 <MMU2::ProtocolLogic::RecordUARTActivity() [clone .constprop.338]>
    scopeState = nextState;
}

void ProtocolLogic::SendWriteRegister(uint8_t index, uint16_t value, ScopeState nextState) {
    SendWriteMsg(RequestMsg(RequestMsgCodes::Write, index, value));
    scopeState = nextState;
   2b0dc:	d0 92 95 12 	sts	0x1295, r13	; 0x801295 <MMU2::mmu2+0x3>
}
   2b0e0:	67 96       	adiw	r28, 0x17	; 23
   2b0e2:	0f b6       	in	r0, 0x3f	; 63
   2b0e4:	f8 94       	cli
   2b0e6:	de bf       	out	0x3e, r29	; 62
   2b0e8:	0f be       	out	0x3f, r0	; 63
   2b0ea:	cd bf       	out	0x3d, r28	; 61
   2b0ec:	df 91       	pop	r29
   2b0ee:	cf 91       	pop	r28
   2b0f0:	1f 91       	pop	r17
   2b0f2:	0f 91       	pop	r16
   2b0f4:	ff 90       	pop	r15
   2b0f6:	ef 90       	pop	r14
   2b0f8:	df 90       	pop	r13
   2b0fa:	bf 90       	pop	r11
   2b0fc:	af 90       	pop	r10
   2b0fe:	9f 90       	pop	r9
   2b100:	8f 90       	pop	r8
   2b102:	08 95       	ret

0002b104 <MMU2::ProtocolLogic::ProcessWritingInitRegister() [clone .constprop.277]>:
    regIndex = 0;
    SendWriteRegister(pgm_read_byte(initRegs8Addrs + regIndex), initRegs8[regIndex], ScopeState::WritingInitRegisters);
}

bool __attribute__((noinline)) ProtocolLogic::ProcessWritingInitRegister() {
    ++regIndex;
   2b104:	20 91 e0 12 	lds	r18, 0x12E0	; 0x8012e0 <MMU2::mmu2+0x4e>
   2b108:	2f 5f       	subi	r18, 0xFF	; 255
   2b10a:	20 93 e0 12 	sts	0x12E0, r18	; 0x8012e0 <MMU2::mmu2+0x4e>
    if (regIndex >= initRegs8Count) {
   2b10e:	22 30       	cpi	r18, 0x02	; 2
   2b110:	78 f4       	brcc	.+30     	; 0x2b130 <MMU2::ProtocolLogic::ProcessWritingInitRegister() [clone .constprop.277]+0x2c>
        return true;
    } else {
        SendWriteRegister(pgm_read_byte(initRegs8Addrs + regIndex), initRegs8[regIndex], ScopeState::WritingInitRegisters);
   2b112:	30 e0       	ldi	r19, 0x00	; 0
   2b114:	f9 01       	movw	r30, r18
   2b116:	e1 5a       	subi	r30, 0xA1	; 161
   2b118:	fe 45       	sbci	r31, 0x5E	; 94
   2b11a:	84 91       	lpm	r24, Z
   2b11c:	22 52       	subi	r18, 0x22	; 34
   2b11e:	3d 4e       	sbci	r19, 0xED	; 237
   2b120:	f9 01       	movw	r30, r18
   2b122:	60 81       	ld	r22, Z
   2b124:	70 e0       	ldi	r23, 0x00	; 0
   2b126:	49 e0       	ldi	r20, 0x09	; 9
   2b128:	0f 94 c3 57 	call	0x2af86	; 0x2af86 <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.331]>
    }
    return false;
   2b12c:	80 e0       	ldi	r24, 0x00	; 0
   2b12e:	08 95       	ret
}

bool __attribute__((noinline)) ProtocolLogic::ProcessWritingInitRegister() {
    ++regIndex;
    if (regIndex >= initRegs8Count) {
        return true;
   2b130:	81 e0       	ldi	r24, 0x01	; 1
    } else {
        SendWriteRegister(pgm_read_byte(initRegs8Addrs + regIndex), initRegs8[regIndex], ScopeState::WritingInitRegisters);
    }
    return false;
}
   2b132:	08 95       	ret

0002b134 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.77]>:
}

/// Searches for best match of pattern by shifting it
/// Returns rate of match and the best location
/// max match = 132, min match = 0
uint8_t xyzcal_find_pattern_12x12_in_32x32(uint8_t* pixels, uint16_t* pattern, uint8_t* pc, uint8_t* pr){
   2b134:	2f 92       	push	r2
   2b136:	3f 92       	push	r3
   2b138:	4f 92       	push	r4
   2b13a:	5f 92       	push	r5
   2b13c:	6f 92       	push	r6
   2b13e:	7f 92       	push	r7
   2b140:	8f 92       	push	r8
   2b142:	9f 92       	push	r9
   2b144:	af 92       	push	r10
   2b146:	bf 92       	push	r11
   2b148:	cf 92       	push	r12
   2b14a:	df 92       	push	r13
   2b14c:	ef 92       	push	r14
   2b14e:	ff 92       	push	r15
   2b150:	0f 93       	push	r16
   2b152:	1f 93       	push	r17
   2b154:	cf 93       	push	r28
   2b156:	df 93       	push	r29
   2b158:	00 d0       	rcall	.+0      	; 0x2b15a <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.77]+0x26>
   2b15a:	1f 92       	push	r1
   2b15c:	1f 92       	push	r1
   2b15e:	cd b7       	in	r28, 0x3d	; 61
   2b160:	de b7       	in	r29, 0x3e	; 62
   2b162:	2b 01       	movw	r4, r22
   2b164:	1a 01       	movw	r2, r20
   2b166:	f1 2c       	mov	r15, r1
   2b168:	e1 2c       	mov	r14, r1
	if (!pixels || !pattern || !pc || !pr)
		return -1;
	uint8_t max_c = 0;
	uint8_t max_r = 0;
	uint8_t max_match = 0;
   2b16a:	1c 82       	std	Y+4, r1	; 0x04
/// max match = 132, min match = 0
uint8_t xyzcal_find_pattern_12x12_in_32x32(uint8_t* pixels, uint16_t* pattern, uint8_t* pc, uint8_t* pr){
	if (!pixels || !pattern || !pc || !pr)
		return -1;
	uint8_t max_c = 0;
	uint8_t max_r = 0;
   2b16c:	1d 82       	std	Y+5, r1	; 0x05
/// Returns rate of match and the best location
/// max match = 132, min match = 0
uint8_t xyzcal_find_pattern_12x12_in_32x32(uint8_t* pixels, uint16_t* pattern, uint8_t* pc, uint8_t* pr){
	if (!pixels || !pattern || !pc || !pr)
		return -1;
	uint8_t max_c = 0;
   2b16e:	10 e0       	ldi	r17, 0x00	; 0
	uint8_t max_r = 0;
	uint8_t max_match = 0;

	// DBG(_n("Matching:\n"));
	/// pixel precision
	for (uint8_t r = 0; r < (32 - 12); ++r){
   2b170:	50 e0       	ldi	r21, 0x00	; 0
			/// skip corners (3 pixels in each)
			if (((i == 0) || (i == 11)) && ((j < 2) || (j >= 10))) continue;
			if (((j == 0) || (j == 11)) && ((i < 2) || (i >= 10))) continue;
			const uint16_t idx = (c + j) + 32 * ((uint16_t)r + i);
			const bool high_pix = pixels[idx] > thr;
			const bool high_pat = pattern[i] & (1 << j);
   2b172:	66 24       	eor	r6, r6
   2b174:	63 94       	inc	r6
   2b176:	71 2c       	mov	r7, r1
	uint8_t max_r = 0;
	uint8_t max_match = 0;

	// DBG(_n("Matching:\n"));
	/// pixel precision
	for (uint8_t r = 0; r < (32 - 12); ++r){
   2b178:	70 e0       	ldi	r23, 0x00	; 0
   2b17a:	60 e0       	ldi	r22, 0x00	; 0
   2b17c:	97 01       	movw	r18, r14
   2b17e:	22 5a       	subi	r18, 0xA2	; 162
   2b180:	39 4f       	sbci	r19, 0xF9	; 249
   2b182:	3a 83       	std	Y+2, r19	; 0x02
   2b184:	29 83       	std	Y+1, r18	; 0x01
   2b186:	86 2e       	mov	r8, r22
   2b188:	c9 80       	ldd	r12, Y+1	; 0x01
   2b18a:	da 80       	ldd	r13, Y+2	; 0x02
   2b18c:	c6 0e       	add	r12, r22
   2b18e:	d7 1e       	adc	r13, r23
   2b190:	fc 01       	movw	r30, r24

/// Returns rate of match
/// max match = 132, min match = 0
uint8_t xyzcal_match_pattern_12x12_in_32x32(uint16_t* pattern, uint8_t* pixels, uint8_t c, uint8_t r){
	uint8_t thr = 16;
	uint8_t match = 0;
   2b192:	00 e0       	ldi	r16, 0x00	; 0
	for (uint8_t i = 0; i < 12; ++i){
   2b194:	40 e0       	ldi	r20, 0x00	; 0
   2b196:	30 e0       	ldi	r19, 0x00	; 0
   2b198:	20 e0       	ldi	r18, 0x00	; 0
		for (uint8_t j = 0; j < 12; ++j){
			/// skip corners (3 pixels in each)
			if (((i == 0) || (i == 11)) && ((j < 2) || (j >= 10))) continue;
			if (((j == 0) || (j == 11)) && ((i < 2) || (i >= 10))) continue;
   2b19a:	ae ef       	ldi	r26, 0xFE	; 254
   2b19c:	a4 0f       	add	r26, r20
   2b19e:	ab 83       	std	Y+3, r26	; 0x03
	uint8_t thr = 16;
	uint8_t match = 0;
	for (uint8_t i = 0; i < 12; ++i){
		for (uint8_t j = 0; j < 12; ++j){
			/// skip corners (3 pixels in each)
			if (((i == 0) || (i == 11)) && ((j < 2) || (j >= 10))) continue;
   2b1a0:	44 23       	and	r20, r20
   2b1a2:	19 f0       	breq	.+6      	; 0x2b1aa <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.77]+0x76>
   2b1a4:	4b 30       	cpi	r20, 0x0B	; 11
   2b1a6:	09 f0       	breq	.+2      	; 0x2b1aa <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.77]+0x76>
   2b1a8:	7d c0       	rjmp	.+250    	; 0x2b2a4 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.77]+0x170>
   2b1aa:	ae ef       	ldi	r26, 0xFE	; 254
   2b1ac:	a2 0f       	add	r26, r18
   2b1ae:	a8 30       	cpi	r26, 0x08	; 8
   2b1b0:	08 f4       	brcc	.+2      	; 0x2b1b4 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.77]+0x80>
   2b1b2:	7a c0       	rjmp	.+244    	; 0x2b2a8 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.77]+0x174>
   2b1b4:	2f 5f       	subi	r18, 0xFF	; 255
   2b1b6:	3f 4f       	sbci	r19, 0xFF	; 255
/// max match = 132, min match = 0
uint8_t xyzcal_match_pattern_12x12_in_32x32(uint16_t* pattern, uint8_t* pixels, uint8_t c, uint8_t r){
	uint8_t thr = 16;
	uint8_t match = 0;
	for (uint8_t i = 0; i < 12; ++i){
		for (uint8_t j = 0; j < 12; ++j){
   2b1b8:	2c 30       	cpi	r18, 0x0C	; 12
   2b1ba:	31 05       	cpc	r19, r1
   2b1bc:	89 f7       	brne	.-30     	; 0x2b1a0 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.77]+0x6c>
/// Returns rate of match
/// max match = 132, min match = 0
uint8_t xyzcal_match_pattern_12x12_in_32x32(uint16_t* pattern, uint8_t* pixels, uint8_t c, uint8_t r){
	uint8_t thr = 16;
	uint8_t match = 0;
	for (uint8_t i = 0; i < 12; ++i){
   2b1be:	4f 5f       	subi	r20, 0xFF	; 255
   2b1c0:	20 e2       	ldi	r18, 0x20	; 32
   2b1c2:	c2 0e       	add	r12, r18
   2b1c4:	d1 1c       	adc	r13, r1
   2b1c6:	32 96       	adiw	r30, 0x02	; 2
   2b1c8:	4c 30       	cpi	r20, 0x0C	; 12
   2b1ca:	29 f7       	brne	.-54     	; 0x2b196 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.77]+0x62>
	// DBG(_n("Matching:\n"));
	/// pixel precision
	for (uint8_t r = 0; r < (32 - 12); ++r){
		for (uint8_t c = 0; c < (32 - 12); ++c){
			const uint8_t match = xyzcal_match_pattern_12x12_in_32x32(pattern, pixels, c, r);
			if (max_match < match){
   2b1cc:	3c 81       	ldd	r19, Y+4	; 0x04
   2b1ce:	30 17       	cp	r19, r16
   2b1d0:	18 f4       	brcc	.+6      	; 0x2b1d8 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.77]+0xa4>
   2b1d2:	0c 83       	std	Y+4, r16	; 0x04
   2b1d4:	5d 83       	std	Y+5, r21	; 0x05
   2b1d6:	18 2d       	mov	r17, r8
   2b1d8:	6f 5f       	subi	r22, 0xFF	; 255
   2b1da:	7f 4f       	sbci	r23, 0xFF	; 255
	uint8_t max_match = 0;

	// DBG(_n("Matching:\n"));
	/// pixel precision
	for (uint8_t r = 0; r < (32 - 12); ++r){
		for (uint8_t c = 0; c < (32 - 12); ++c){
   2b1dc:	64 31       	cpi	r22, 0x14	; 20
   2b1de:	71 05       	cpc	r23, r1
   2b1e0:	91 f6       	brne	.-92     	; 0x2b186 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.77]+0x52>
	uint8_t max_r = 0;
	uint8_t max_match = 0;

	// DBG(_n("Matching:\n"));
	/// pixel precision
	for (uint8_t r = 0; r < (32 - 12); ++r){
   2b1e2:	5f 5f       	subi	r21, 0xFF	; 255
   2b1e4:	a0 e2       	ldi	r26, 0x20	; 32
   2b1e6:	ea 0e       	add	r14, r26
   2b1e8:	f1 1c       	adc	r15, r1
   2b1ea:	54 31       	cpi	r21, 0x14	; 20
   2b1ec:	29 f6       	brne	.-118    	; 0x2b178 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.77]+0x44>
			// DBG(_n("%d "), match);
		}
		// DBG(_n("\n"));
	}
    //@size=278
	DBG(_n("Pattern center [%f %f], match %f%%\n"), max_c + 5.5f, max_r + 5.5f, max_match / 1.32f);
   2b1ee:	ec 81       	ldd	r30, Y+4	; 0x04
   2b1f0:	6e 2f       	mov	r22, r30
   2b1f2:	70 e0       	ldi	r23, 0x00	; 0
   2b1f4:	90 e0       	ldi	r25, 0x00	; 0
   2b1f6:	80 e0       	ldi	r24, 0x00	; 0
   2b1f8:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   2b1fc:	23 ec       	ldi	r18, 0xC3	; 195
   2b1fe:	35 ef       	ldi	r19, 0xF5	; 245
   2b200:	48 ea       	ldi	r20, 0xA8	; 168
   2b202:	5f e3       	ldi	r21, 0x3F	; 63
   2b204:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   2b208:	9f 93       	push	r25
   2b20a:	8f 93       	push	r24
   2b20c:	7f 93       	push	r23
   2b20e:	6f 93       	push	r22
   2b210:	fd 81       	ldd	r31, Y+5	; 0x05
   2b212:	6f 2f       	mov	r22, r31
   2b214:	70 e0       	ldi	r23, 0x00	; 0
   2b216:	90 e0       	ldi	r25, 0x00	; 0
   2b218:	80 e0       	ldi	r24, 0x00	; 0
   2b21a:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   2b21e:	20 e0       	ldi	r18, 0x00	; 0
   2b220:	30 e0       	ldi	r19, 0x00	; 0
   2b222:	40 eb       	ldi	r20, 0xB0	; 176
   2b224:	50 e4       	ldi	r21, 0x40	; 64
   2b226:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   2b22a:	9f 93       	push	r25
   2b22c:	8f 93       	push	r24
   2b22e:	7f 93       	push	r23
   2b230:	6f 93       	push	r22
   2b232:	61 2f       	mov	r22, r17
   2b234:	70 e0       	ldi	r23, 0x00	; 0
   2b236:	90 e0       	ldi	r25, 0x00	; 0
   2b238:	80 e0       	ldi	r24, 0x00	; 0
   2b23a:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   2b23e:	20 e0       	ldi	r18, 0x00	; 0
   2b240:	30 e0       	ldi	r19, 0x00	; 0
   2b242:	40 eb       	ldi	r20, 0xB0	; 176
   2b244:	50 e4       	ldi	r21, 0x40	; 64
   2b246:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   2b24a:	9f 93       	push	r25
   2b24c:	8f 93       	push	r24
   2b24e:	7f 93       	push	r23
   2b250:	6f 93       	push	r22
   2b252:	81 ec       	ldi	r24, 0xC1	; 193
   2b254:	9c e9       	ldi	r25, 0x9C	; 156
   2b256:	9f 93       	push	r25
   2b258:	8f 93       	push	r24
   2b25a:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>

	*pc = max_c;
   2b25e:	f2 01       	movw	r30, r4
   2b260:	10 83       	st	Z, r17
	*pr = max_r;
   2b262:	2d 81       	ldd	r18, Y+5	; 0x05
   2b264:	f1 01       	movw	r30, r2
   2b266:	20 83       	st	Z, r18
   2b268:	0f b6       	in	r0, 0x3f	; 63
   2b26a:	f8 94       	cli
   2b26c:	de bf       	out	0x3e, r29	; 62
   2b26e:	0f be       	out	0x3f, r0	; 63
   2b270:	cd bf       	out	0x3d, r28	; 61
	return max_match;
}
   2b272:	8c 81       	ldd	r24, Y+4	; 0x04
   2b274:	0f 90       	pop	r0
   2b276:	0f 90       	pop	r0
   2b278:	0f 90       	pop	r0
   2b27a:	0f 90       	pop	r0
   2b27c:	0f 90       	pop	r0
   2b27e:	df 91       	pop	r29
   2b280:	cf 91       	pop	r28
   2b282:	1f 91       	pop	r17
   2b284:	0f 91       	pop	r16
   2b286:	ff 90       	pop	r15
   2b288:	ef 90       	pop	r14
   2b28a:	df 90       	pop	r13
   2b28c:	cf 90       	pop	r12
   2b28e:	bf 90       	pop	r11
   2b290:	af 90       	pop	r10
   2b292:	9f 90       	pop	r9
   2b294:	8f 90       	pop	r8
   2b296:	7f 90       	pop	r7
   2b298:	6f 90       	pop	r6
   2b29a:	5f 90       	pop	r5
   2b29c:	4f 90       	pop	r4
   2b29e:	3f 90       	pop	r3
   2b2a0:	2f 90       	pop	r2
   2b2a2:	08 95       	ret
	uint8_t match = 0;
	for (uint8_t i = 0; i < 12; ++i){
		for (uint8_t j = 0; j < 12; ++j){
			/// skip corners (3 pixels in each)
			if (((i == 0) || (i == 11)) && ((j < 2) || (j >= 10))) continue;
			if (((j == 0) || (j == 11)) && ((i < 2) || (i >= 10))) continue;
   2b2a4:	22 23       	and	r18, r18
   2b2a6:	11 f0       	breq	.+4      	; 0x2b2ac <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.77]+0x178>
   2b2a8:	2b 30       	cpi	r18, 0x0B	; 11
   2b2aa:	21 f4       	brne	.+8      	; 0x2b2b4 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.77]+0x180>
   2b2ac:	ab 81       	ldd	r26, Y+3	; 0x03
   2b2ae:	a8 30       	cpi	r26, 0x08	; 8
   2b2b0:	08 f0       	brcs	.+2      	; 0x2b2b4 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.77]+0x180>
   2b2b2:	80 cf       	rjmp	.-256    	; 0x2b1b4 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.77]+0x80>
			const uint16_t idx = (c + j) + 32 * ((uint16_t)r + i);
			const bool high_pix = pixels[idx] > thr;
   2b2b4:	99 24       	eor	r9, r9
   2b2b6:	93 94       	inc	r9
   2b2b8:	d6 01       	movw	r26, r12
   2b2ba:	a2 0f       	add	r26, r18
   2b2bc:	b3 1f       	adc	r27, r19
   2b2be:	ac 91       	ld	r26, X
   2b2c0:	a1 31       	cpi	r26, 0x11	; 17
   2b2c2:	08 f4       	brcc	.+2      	; 0x2b2c6 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.77]+0x192>
   2b2c4:	91 2c       	mov	r9, r1
			const bool high_pat = pattern[i] & (1 << j);
   2b2c6:	a0 80       	ld	r10, Z
   2b2c8:	b1 80       	ldd	r11, Z+1	; 0x01
   2b2ca:	d3 01       	movw	r26, r6
   2b2cc:	02 2e       	mov	r0, r18
   2b2ce:	02 c0       	rjmp	.+4      	; 0x2b2d4 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.77]+0x1a0>
   2b2d0:	aa 0f       	add	r26, r26
   2b2d2:	bb 1f       	adc	r27, r27
   2b2d4:	0a 94       	dec	r0
   2b2d6:	e2 f7       	brpl	.-8      	; 0x2b2d0 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.77]+0x19c>
   2b2d8:	aa 21       	and	r26, r10
   2b2da:	bb 21       	and	r27, r11
   2b2dc:	bb 24       	eor	r11, r11
   2b2de:	b3 94       	inc	r11
   2b2e0:	ab 2b       	or	r26, r27
   2b2e2:	09 f4       	brne	.+2      	; 0x2b2e6 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.77]+0x1b2>
   2b2e4:	b1 2c       	mov	r11, r1
			if (high_pix == high_pat)
   2b2e6:	9b 10       	cpse	r9, r11
   2b2e8:	65 cf       	rjmp	.-310    	; 0x2b1b4 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.77]+0x80>
				match++;
   2b2ea:	0f 5f       	subi	r16, 0xFF	; 255
   2b2ec:	63 cf       	rjmp	.-314    	; 0x2b1b4 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.77]+0x80>

0002b2ee <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]>:
 * \return The value one, true, is returned for success and
 * the value zero, false, is returned for failure.  Reasons for
 * failure include not finding a valid partition, not finding a valid
 * FAT file system in the specified partition or an I/O error.
 */
bool SdVolume::init(Sd2Card* dev, uint8_t part) {
   2b2ee:	8f 92       	push	r8
   2b2f0:	9f 92       	push	r9
   2b2f2:	af 92       	push	r10
   2b2f4:	bf 92       	push	r11
   2b2f6:	cf 92       	push	r12
   2b2f8:	df 92       	push	r13
   2b2fa:	ef 92       	push	r14
   2b2fc:	ff 92       	push	r15
   2b2fe:	cf 93       	push	r28
   2b300:	df 93       	push	r29
  uint32_t totalBlocks;
  uint32_t volumeStartBlock = 0;
  fat32_boot_t* fbs;

  sdCard_ = dev;
   2b302:	24 e4       	ldi	r18, 0x44	; 68
   2b304:	36 e1       	ldi	r19, 0x16	; 22
   2b306:	30 93 44 0e 	sts	0x0E44, r19	; 0x800e44 <SdVolume::sdCard_+0x1>
   2b30a:	20 93 43 0e 	sts	0x0E43, r18	; 0x800e43 <SdVolume::sdCard_>
  fatType_ = 0;
   2b30e:	10 92 60 16 	sts	0x1660, r1	; 0x801660 <card+0x28b>
  allocSearchStart_ = 2;
   2b312:	42 e0       	ldi	r20, 0x02	; 2
   2b314:	50 e0       	ldi	r21, 0x00	; 0
   2b316:	60 e0       	ldi	r22, 0x00	; 0
   2b318:	70 e0       	ldi	r23, 0x00	; 0
   2b31a:	40 93 49 16 	sts	0x1649, r20	; 0x801649 <card+0x274>
   2b31e:	50 93 4a 16 	sts	0x164A, r21	; 0x80164a <card+0x275>
   2b322:	60 93 4b 16 	sts	0x164B, r22	; 0x80164b <card+0x276>
   2b326:	70 93 4c 16 	sts	0x164C, r23	; 0x80164c <card+0x277>
  cacheDirty_ = 0;  // cacheFlush() will write block if true
   2b32a:	10 92 42 0e 	sts	0x0E42, r1	; 0x800e42 <SdVolume::cacheDirty_>
  cacheMirrorBlock_ = 0;
   2b32e:	10 92 3e 0e 	sts	0x0E3E, r1	; 0x800e3e <SdVolume::cacheMirrorBlock_>
   2b332:	10 92 3f 0e 	sts	0x0E3F, r1	; 0x800e3f <SdVolume::cacheMirrorBlock_+0x1>
   2b336:	10 92 40 0e 	sts	0x0E40, r1	; 0x800e40 <SdVolume::cacheMirrorBlock_+0x2>
   2b33a:	10 92 41 0e 	sts	0x0E41, r1	; 0x800e41 <SdVolume::cacheMirrorBlock_+0x3>
  cacheBlockNumber_ = 0XFFFFFFFF;
   2b33e:	4f ef       	ldi	r20, 0xFF	; 255
   2b340:	5f ef       	ldi	r21, 0xFF	; 255
   2b342:	ba 01       	movw	r22, r20
   2b344:	40 93 3a 0e 	sts	0x0E3A, r20	; 0x800e3a <SdVolume::cacheBlockNumber_>
   2b348:	50 93 3b 0e 	sts	0x0E3B, r21	; 0x800e3b <SdVolume::cacheBlockNumber_+0x1>
   2b34c:	60 93 3c 0e 	sts	0x0E3C, r22	; 0x800e3c <SdVolume::cacheBlockNumber_+0x2>
   2b350:	70 93 3d 0e 	sts	0x0E3D, r23	; 0x800e3d <SdVolume::cacheBlockNumber_+0x3>

  // if part == 0 assume super floppy with FAT boot sector in block zero
  // if part > 0 assume mbr volume with partition table
  if (part) {
   2b354:	88 23       	and	r24, r24
   2b356:	09 f4       	brne	.+2      	; 0x2b35a <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]+0x6c>
   2b358:	70 c0       	rjmp	.+224    	; 0x2b43a <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]+0x14c>
    if (part > 4)goto fail;
    if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) goto fail;
   2b35a:	40 e0       	ldi	r20, 0x00	; 0
   2b35c:	60 e0       	ldi	r22, 0x00	; 0
   2b35e:	70 e0       	ldi	r23, 0x00	; 0
   2b360:	cb 01       	movw	r24, r22
   2b362:	0f 94 86 2a 	call	0x2550c	; 0x2550c <SdVolume::cacheRawBlock(unsigned long, bool)>
   2b366:	81 11       	cpse	r24, r1
   2b368:	0d c0       	rjmp	.+26     	; 0x2b384 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]+0x96>
    fatType_ = 32;
  }
  return true;

 fail:
  return false;
   2b36a:	c0 e0       	ldi	r28, 0x00	; 0
}
   2b36c:	8c 2f       	mov	r24, r28
   2b36e:	df 91       	pop	r29
   2b370:	cf 91       	pop	r28
   2b372:	ff 90       	pop	r15
   2b374:	ef 90       	pop	r14
   2b376:	df 90       	pop	r13
   2b378:	cf 90       	pop	r12
   2b37a:	bf 90       	pop	r11
   2b37c:	af 90       	pop	r10
   2b37e:	9f 90       	pop	r9
   2b380:	8f 90       	pop	r8
   2b382:	08 95       	ret
  // if part > 0 assume mbr volume with partition table
  if (part) {
    if (part > 4)goto fail;
    if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) goto fail;
    part_t* p = &cacheBuffer_.mbr.part[part-1];
    if ((p->boot & 0X7F) !=0  ||
   2b384:	80 91 04 10 	lds	r24, 0x1004	; 0x801004 <SdVolume::cacheBuffer_+0x1be>
   2b388:	8f 77       	andi	r24, 0x7F	; 127
   2b38a:	79 f7       	brne	.-34     	; 0x2b36a <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]+0x7c>
   2b38c:	80 91 10 10 	lds	r24, 0x1010	; 0x801010 <SdVolume::cacheBuffer_+0x1ca>
   2b390:	90 91 11 10 	lds	r25, 0x1011	; 0x801011 <SdVolume::cacheBuffer_+0x1cb>
   2b394:	a0 91 12 10 	lds	r26, 0x1012	; 0x801012 <SdVolume::cacheBuffer_+0x1cc>
   2b398:	b0 91 13 10 	lds	r27, 0x1013	; 0x801013 <SdVolume::cacheBuffer_+0x1cd>
   2b39c:	84 36       	cpi	r24, 0x64	; 100
   2b39e:	91 05       	cpc	r25, r1
   2b3a0:	a1 05       	cpc	r26, r1
   2b3a2:	b1 05       	cpc	r27, r1
   2b3a4:	10 f3       	brcs	.-60     	; 0x2b36a <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]+0x7c>
      p->totalSectors < 100 ||
      p->firstSector == 0) {
   2b3a6:	c0 90 0c 10 	lds	r12, 0x100C	; 0x80100c <SdVolume::cacheBuffer_+0x1c6>
   2b3aa:	d0 90 0d 10 	lds	r13, 0x100D	; 0x80100d <SdVolume::cacheBuffer_+0x1c7>
   2b3ae:	e0 90 0e 10 	lds	r14, 0x100E	; 0x80100e <SdVolume::cacheBuffer_+0x1c8>
   2b3b2:	f0 90 0f 10 	lds	r15, 0x100F	; 0x80100f <SdVolume::cacheBuffer_+0x1c9>
  if (part) {
    if (part > 4)goto fail;
    if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) goto fail;
    part_t* p = &cacheBuffer_.mbr.part[part-1];
    if ((p->boot & 0X7F) !=0  ||
      p->totalSectors < 100 ||
   2b3b6:	c1 14       	cp	r12, r1
   2b3b8:	d1 04       	cpc	r13, r1
   2b3ba:	e1 04       	cpc	r14, r1
   2b3bc:	f1 04       	cpc	r15, r1
   2b3be:	a9 f2       	breq	.-86     	; 0x2b36a <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]+0x7c>
      // not a valid partition
      goto fail;
    }
    volumeStartBlock = p->firstSector;
  }
  if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) goto fail;
   2b3c0:	40 e0       	ldi	r20, 0x00	; 0
   2b3c2:	c7 01       	movw	r24, r14
   2b3c4:	b6 01       	movw	r22, r12
   2b3c6:	0f 94 86 2a 	call	0x2550c	; 0x2550c <SdVolume::cacheRawBlock(unsigned long, bool)>
   2b3ca:	c8 2f       	mov	r28, r24
   2b3cc:	88 23       	and	r24, r24
   2b3ce:	69 f2       	breq	.-102    	; 0x2b36a <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]+0x7c>
  fbs = &cacheBuffer_.fbs32;
  if (fbs->bytesPerSector != 512 ||
   2b3d0:	80 91 51 0e 	lds	r24, 0x0E51	; 0x800e51 <SdVolume::cacheBuffer_+0xb>
   2b3d4:	90 91 52 0e 	lds	r25, 0x0E52	; 0x800e52 <SdVolume::cacheBuffer_+0xc>
   2b3d8:	81 15       	cp	r24, r1
   2b3da:	92 40       	sbci	r25, 0x02	; 2
   2b3dc:	31 f6       	brne	.-116    	; 0x2b36a <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]+0x7c>
    fbs->fatCount == 0 ||
   2b3de:	a0 91 56 0e 	lds	r26, 0x0E56	; 0x800e56 <SdVolume::cacheBuffer_+0x10>
    }
    volumeStartBlock = p->firstSector;
  }
  if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) goto fail;
  fbs = &cacheBuffer_.fbs32;
  if (fbs->bytesPerSector != 512 ||
   2b3e2:	aa 23       	and	r26, r26
   2b3e4:	11 f2       	breq	.-124    	; 0x2b36a <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]+0x7c>
    fbs->fatCount == 0 ||
    fbs->reservedSectorCount == 0 ||
   2b3e6:	60 91 54 0e 	lds	r22, 0x0E54	; 0x800e54 <SdVolume::cacheBuffer_+0xe>
   2b3ea:	70 91 55 0e 	lds	r23, 0x0E55	; 0x800e55 <SdVolume::cacheBuffer_+0xf>
    volumeStartBlock = p->firstSector;
  }
  if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) goto fail;
  fbs = &cacheBuffer_.fbs32;
  if (fbs->bytesPerSector != 512 ||
    fbs->fatCount == 0 ||
   2b3ee:	61 15       	cp	r22, r1
   2b3f0:	71 05       	cpc	r23, r1
   2b3f2:	09 f4       	brne	.+2      	; 0x2b3f6 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]+0x108>
   2b3f4:	ba cf       	rjmp	.-140    	; 0x2b36a <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]+0x7c>
    fbs->reservedSectorCount == 0 ||
    fbs->sectorsPerCluster == 0) {
   2b3f6:	20 91 53 0e 	lds	r18, 0x0E53	; 0x800e53 <SdVolume::cacheBuffer_+0xd>
  }
  if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) goto fail;
  fbs = &cacheBuffer_.fbs32;
  if (fbs->bytesPerSector != 512 ||
    fbs->fatCount == 0 ||
    fbs->reservedSectorCount == 0 ||
   2b3fa:	22 23       	and	r18, r18
   2b3fc:	09 f4       	brne	.+2      	; 0x2b400 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]+0x112>
   2b3fe:	b5 cf       	rjmp	.-150    	; 0x2b36a <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]+0x7c>
    fbs->sectorsPerCluster == 0) {
       // not valid FAT volume
      goto fail;
  }
  fatCount_ = fbs->fatCount;
   2b400:	a0 93 5b 16 	sts	0x165B, r26	; 0x80165b <card+0x286>
  blocksPerCluster_ = fbs->sectorsPerCluster;
   2b404:	20 93 4d 16 	sts	0x164D, r18	; 0x80164d <card+0x278>
  // determine shift that is same as multiply by blocksPerCluster_
  clusterSizeShift_ = 0;
   2b408:	90 e0       	ldi	r25, 0x00	; 0
   2b40a:	80 e0       	ldi	r24, 0x00	; 0
  while (blocksPerCluster_ != (1 << clusterSizeShift_)) {
   2b40c:	30 e0       	ldi	r19, 0x00	; 0
   2b40e:	e1 e0       	ldi	r30, 0x01	; 1
   2b410:	f0 e0       	ldi	r31, 0x00	; 0
   2b412:	d8 2f       	mov	r29, r24
   2b414:	af 01       	movw	r20, r30
   2b416:	08 2e       	mov	r0, r24
   2b418:	02 c0       	rjmp	.+4      	; 0x2b41e <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]+0x130>
   2b41a:	44 0f       	add	r20, r20
   2b41c:	55 1f       	adc	r21, r21
   2b41e:	0a 94       	dec	r0
   2b420:	e2 f7       	brpl	.-8      	; 0x2b41a <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]+0x12c>
   2b422:	24 17       	cp	r18, r20
   2b424:	35 07       	cpc	r19, r21
   2b426:	69 f0       	breq	.+26     	; 0x2b442 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]+0x154>
   2b428:	41 e0       	ldi	r20, 0x01	; 1
   2b42a:	48 0f       	add	r20, r24
   2b42c:	01 96       	adiw	r24, 0x01	; 1
    // error if not power of 2
    if (clusterSizeShift_++ > 7) goto fail;
   2b42e:	89 30       	cpi	r24, 0x09	; 9
   2b430:	91 05       	cpc	r25, r1
   2b432:	79 f7       	brne	.-34     	; 0x2b412 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]+0x124>
   2b434:	40 93 56 16 	sts	0x1656, r20	; 0x801656 <card+0x281>
   2b438:	98 cf       	rjmp	.-208    	; 0x2b36a <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]+0x7c>
 * failure include not finding a valid partition, not finding a valid
 * FAT file system in the specified partition or an I/O error.
 */
bool SdVolume::init(Sd2Card* dev, uint8_t part) {
  uint32_t totalBlocks;
  uint32_t volumeStartBlock = 0;
   2b43a:	c1 2c       	mov	r12, r1
   2b43c:	d1 2c       	mov	r13, r1
   2b43e:	76 01       	movw	r14, r12
   2b440:	bf cf       	rjmp	.-130    	; 0x2b3c0 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]+0xd2>
   2b442:	80 93 56 16 	sts	0x1656, r24	; 0x801656 <card+0x281>
  clusterSizeShift_ = 0;
  while (blocksPerCluster_ != (1 << clusterSizeShift_)) {
    // error if not power of 2
    if (clusterSizeShift_++ > 7) goto fail;
  }
  blocksPerFat_ = fbs->sectorsPerFat16 ?
   2b446:	20 91 5c 0e 	lds	r18, 0x0E5C	; 0x800e5c <SdVolume::cacheBuffer_+0x16>
   2b44a:	30 91 5d 0e 	lds	r19, 0x0E5D	; 0x800e5d <SdVolume::cacheBuffer_+0x17>
   2b44e:	50 e0       	ldi	r21, 0x00	; 0
   2b450:	40 e0       	ldi	r20, 0x00	; 0
   2b452:	21 15       	cp	r18, r1
   2b454:	31 05       	cpc	r19, r1
   2b456:	41 f4       	brne	.+16     	; 0x2b468 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]+0x17a>
   2b458:	20 91 6a 0e 	lds	r18, 0x0E6A	; 0x800e6a <SdVolume::cacheBuffer_+0x24>
   2b45c:	30 91 6b 0e 	lds	r19, 0x0E6B	; 0x800e6b <SdVolume::cacheBuffer_+0x25>
   2b460:	40 91 6c 0e 	lds	r20, 0x0E6C	; 0x800e6c <SdVolume::cacheBuffer_+0x26>
   2b464:	50 91 6d 0e 	lds	r21, 0x0E6D	; 0x800e6d <SdVolume::cacheBuffer_+0x27>
   2b468:	20 93 4e 16 	sts	0x164E, r18	; 0x80164e <card+0x279>
   2b46c:	30 93 4f 16 	sts	0x164F, r19	; 0x80164f <card+0x27a>
   2b470:	40 93 50 16 	sts	0x1650, r20	; 0x801650 <card+0x27b>
   2b474:	50 93 51 16 	sts	0x1651, r21	; 0x801651 <card+0x27c>
                    fbs->sectorsPerFat16 : fbs->sectorsPerFat32;

  fatStartBlock_ = volumeStartBlock + fbs->reservedSectorCount;
   2b478:	46 01       	movw	r8, r12
   2b47a:	57 01       	movw	r10, r14
   2b47c:	86 0e       	add	r8, r22
   2b47e:	97 1e       	adc	r9, r23
   2b480:	a1 1c       	adc	r10, r1
   2b482:	b1 1c       	adc	r11, r1
   2b484:	80 92 5c 16 	sts	0x165C, r8	; 0x80165c <card+0x287>
   2b488:	90 92 5d 16 	sts	0x165D, r9	; 0x80165d <card+0x288>
   2b48c:	a0 92 5e 16 	sts	0x165E, r10	; 0x80165e <card+0x289>
   2b490:	b0 92 5f 16 	sts	0x165F, r11	; 0x80165f <card+0x28a>

  // count for FAT16 zero for FAT32
  rootDirEntryCount_ = fbs->rootDirEntryCount;
   2b494:	e0 91 57 0e 	lds	r30, 0x0E57	; 0x800e57 <SdVolume::cacheBuffer_+0x11>
   2b498:	f0 91 58 0e 	lds	r31, 0x0E58	; 0x800e58 <SdVolume::cacheBuffer_+0x12>
   2b49c:	f0 93 62 16 	sts	0x1662, r31	; 0x801662 <card+0x28d>
   2b4a0:	e0 93 61 16 	sts	0x1661, r30	; 0x801661 <card+0x28c>

  // directory start for FAT16 dataStart for FAT32
  rootDirStart_ = fatStartBlock_ + fbs->fatCount * blocksPerFat_;
   2b4a4:	b0 e0       	ldi	r27, 0x00	; 0
   2b4a6:	0f 94 75 a4 	call	0x348ea	; 0x348ea <__muluhisi3>
   2b4aa:	dc 01       	movw	r26, r24
   2b4ac:	cb 01       	movw	r24, r22
   2b4ae:	88 0d       	add	r24, r8
   2b4b0:	99 1d       	adc	r25, r9
   2b4b2:	aa 1d       	adc	r26, r10
   2b4b4:	bb 1d       	adc	r27, r11
   2b4b6:	80 93 63 16 	sts	0x1663, r24	; 0x801663 <card+0x28e>
   2b4ba:	90 93 64 16 	sts	0x1664, r25	; 0x801664 <card+0x28f>
   2b4be:	a0 93 65 16 	sts	0x1665, r26	; 0x801665 <card+0x290>
   2b4c2:	b0 93 66 16 	sts	0x1666, r27	; 0x801666 <card+0x291>

  // data start for FAT16 and FAT32
  dataStartBlock_ = rootDirStart_ + ((32 * fbs->rootDirEntryCount + 511)/512);
   2b4c6:	25 e0       	ldi	r18, 0x05	; 5
   2b4c8:	ee 0f       	add	r30, r30
   2b4ca:	ff 1f       	adc	r31, r31
   2b4cc:	2a 95       	dec	r18
   2b4ce:	e1 f7       	brne	.-8      	; 0x2b4c8 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]+0x1da>
   2b4d0:	e1 50       	subi	r30, 0x01	; 1
   2b4d2:	fe 4f       	sbci	r31, 0xFE	; 254
   2b4d4:	ef 2f       	mov	r30, r31
   2b4d6:	ff 27       	eor	r31, r31
   2b4d8:	e6 95       	lsr	r30
   2b4da:	8e 0f       	add	r24, r30
   2b4dc:	9f 1f       	adc	r25, r31
   2b4de:	a1 1d       	adc	r26, r1
   2b4e0:	b1 1d       	adc	r27, r1
   2b4e2:	80 93 57 16 	sts	0x1657, r24	; 0x801657 <card+0x282>
   2b4e6:	90 93 58 16 	sts	0x1658, r25	; 0x801658 <card+0x283>
   2b4ea:	a0 93 59 16 	sts	0x1659, r26	; 0x801659 <card+0x284>
   2b4ee:	b0 93 5a 16 	sts	0x165A, r27	; 0x80165a <card+0x285>

  // total blocks for FAT16 or FAT32
  totalBlocks = fbs->totalSectors16 ?
   2b4f2:	80 90 59 0e 	lds	r8, 0x0E59	; 0x800e59 <SdVolume::cacheBuffer_+0x13>
   2b4f6:	90 90 5a 0e 	lds	r9, 0x0E5A	; 0x800e5a <SdVolume::cacheBuffer_+0x14>
   2b4fa:	b1 2c       	mov	r11, r1
   2b4fc:	a1 2c       	mov	r10, r1
   2b4fe:	81 14       	cp	r8, r1
   2b500:	91 04       	cpc	r9, r1
   2b502:	41 f4       	brne	.+16     	; 0x2b514 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]+0x226>
   2b504:	80 90 66 0e 	lds	r8, 0x0E66	; 0x800e66 <SdVolume::cacheBuffer_+0x20>
   2b508:	90 90 67 0e 	lds	r9, 0x0E67	; 0x800e67 <SdVolume::cacheBuffer_+0x21>
   2b50c:	a0 90 68 0e 	lds	r10, 0x0E68	; 0x800e68 <SdVolume::cacheBuffer_+0x22>
   2b510:	b0 90 69 0e 	lds	r11, 0x0E69	; 0x800e69 <SdVolume::cacheBuffer_+0x23>
                           fbs->totalSectors16 : fbs->totalSectors32;
  // total data blocks
  clusterCount_ = totalBlocks - (dataStartBlock_ - volumeStartBlock);
   2b514:	c8 1a       	sub	r12, r24
   2b516:	d9 0a       	sbc	r13, r25
   2b518:	ea 0a       	sbc	r14, r26
   2b51a:	fb 0a       	sbc	r15, r27
   2b51c:	c8 0c       	add	r12, r8
   2b51e:	d9 1c       	adc	r13, r9
   2b520:	ea 1c       	adc	r14, r10
   2b522:	fb 1c       	adc	r15, r11

  // divide by cluster size to get cluster count
  clusterCount_ >>= clusterSizeShift_;
   2b524:	04 c0       	rjmp	.+8      	; 0x2b52e <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]+0x240>
   2b526:	f6 94       	lsr	r15
   2b528:	e7 94       	ror	r14
   2b52a:	d7 94       	ror	r13
   2b52c:	c7 94       	ror	r12
   2b52e:	da 95       	dec	r29
   2b530:	d2 f7       	brpl	.-12     	; 0x2b526 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]+0x238>
   2b532:	c0 92 52 16 	sts	0x1652, r12	; 0x801652 <card+0x27d>
   2b536:	d0 92 53 16 	sts	0x1653, r13	; 0x801653 <card+0x27e>
   2b53a:	e0 92 54 16 	sts	0x1654, r14	; 0x801654 <card+0x27f>
   2b53e:	f0 92 55 16 	sts	0x1655, r15	; 0x801655 <card+0x280>

  // FAT type is determined by cluster count
  if (clusterCount_ < 4085) {
   2b542:	85 ef       	ldi	r24, 0xF5	; 245
   2b544:	c8 16       	cp	r12, r24
   2b546:	8f e0       	ldi	r24, 0x0F	; 15
   2b548:	d8 06       	cpc	r13, r24
   2b54a:	e1 04       	cpc	r14, r1
   2b54c:	f1 04       	cpc	r15, r1
   2b54e:	20 f4       	brcc	.+8      	; 0x2b558 <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]+0x26a>
    fatType_ = 12;
   2b550:	8c e0       	ldi	r24, 0x0C	; 12
   2b552:	80 93 60 16 	sts	0x1660, r24	; 0x801660 <card+0x28b>
   2b556:	09 cf       	rjmp	.-494    	; 0x2b36a <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]+0x7c>
    if (!FAT12_SUPPORT) goto fail;
  } else if (clusterCount_ < 65525) {
    fatType_ = 16;
   2b558:	80 e1       	ldi	r24, 0x10	; 16

  // FAT type is determined by cluster count
  if (clusterCount_ < 4085) {
    fatType_ = 12;
    if (!FAT12_SUPPORT) goto fail;
  } else if (clusterCount_ < 65525) {
   2b55a:	25 ef       	ldi	r18, 0xF5	; 245
   2b55c:	c2 16       	cp	r12, r18
   2b55e:	2f ef       	ldi	r18, 0xFF	; 255
   2b560:	d2 06       	cpc	r13, r18
   2b562:	e1 04       	cpc	r14, r1
   2b564:	f1 04       	cpc	r15, r1
   2b566:	88 f0       	brcs	.+34     	; 0x2b58a <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]+0x29c>
    fatType_ = 16;
  } else {
    rootDirStart_ = fbs->fat32RootCluster;
   2b568:	80 91 72 0e 	lds	r24, 0x0E72	; 0x800e72 <SdVolume::cacheBuffer_+0x2c>
   2b56c:	90 91 73 0e 	lds	r25, 0x0E73	; 0x800e73 <SdVolume::cacheBuffer_+0x2d>
   2b570:	a0 91 74 0e 	lds	r26, 0x0E74	; 0x800e74 <SdVolume::cacheBuffer_+0x2e>
   2b574:	b0 91 75 0e 	lds	r27, 0x0E75	; 0x800e75 <SdVolume::cacheBuffer_+0x2f>
   2b578:	80 93 63 16 	sts	0x1663, r24	; 0x801663 <card+0x28e>
   2b57c:	90 93 64 16 	sts	0x1664, r25	; 0x801664 <card+0x28f>
   2b580:	a0 93 65 16 	sts	0x1665, r26	; 0x801665 <card+0x290>
   2b584:	b0 93 66 16 	sts	0x1666, r27	; 0x801666 <card+0x291>
    fatType_ = 32;
   2b588:	80 e2       	ldi	r24, 0x20	; 32
   2b58a:	80 93 60 16 	sts	0x1660, r24	; 0x801660 <card+0x28b>
   2b58e:	ee ce       	rjmp	.-548    	; 0x2b36c <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]+0x7e>

0002b590 <SdFile::gfEnsureBlock() [clone .constprop.219]>:
    // make the rdptr point to a safe location - end of file
    gfReadPtr = gfBlockBuffBegin() + 512;
    return -1;
}

bool SdFile::gfEnsureBlock(){
   2b590:	0f 93       	push	r16
   2b592:	1f 93       	push	r17
    // this comparison is heavy-weight, especially when there is another one inside cacheRawBlock
    // but it is necessary to avoid computing of terminateOfs if not needed
    if( gfBlock != vol_->cacheBlockNumber_ ){
   2b594:	60 91 84 16 	lds	r22, 0x1684	; 0x801684 <card+0x2af>
   2b598:	70 91 85 16 	lds	r23, 0x1685	; 0x801685 <card+0x2b0>
   2b59c:	80 91 86 16 	lds	r24, 0x1686	; 0x801686 <card+0x2b1>
   2b5a0:	90 91 87 16 	lds	r25, 0x1687	; 0x801687 <card+0x2b2>
   2b5a4:	00 91 3a 0e 	lds	r16, 0x0E3A	; 0x800e3a <SdVolume::cacheBlockNumber_>
   2b5a8:	10 91 3b 0e 	lds	r17, 0x0E3B	; 0x800e3b <SdVolume::cacheBlockNumber_+0x1>
   2b5ac:	20 91 3c 0e 	lds	r18, 0x0E3C	; 0x800e3c <SdVolume::cacheBlockNumber_+0x2>
   2b5b0:	30 91 3d 0e 	lds	r19, 0x0E3D	; 0x800e3d <SdVolume::cacheBlockNumber_+0x3>
   2b5b4:	60 17       	cp	r22, r16
   2b5b6:	71 07       	cpc	r23, r17
   2b5b8:	82 07       	cpc	r24, r18
   2b5ba:	93 07       	cpc	r25, r19
   2b5bc:	39 f1       	breq	.+78     	; 0x2b60c <SdFile::gfEnsureBlock() [clone .constprop.219]+0x7c>
        if ( ! vol_->cacheRawBlock(gfBlock, SdVolume::CACHE_FOR_READ)){
   2b5be:	40 e0       	ldi	r20, 0x00	; 0
   2b5c0:	0f 94 86 2a 	call	0x2550c	; 0x2550c <SdVolume::cacheRawBlock(unsigned long, bool)>
   2b5c4:	88 23       	and	r24, r24
   2b5c6:	f9 f0       	breq	.+62     	; 0x2b606 <SdFile::gfEnsureBlock() [clone .constprop.219]+0x76>
            return false;
        }
        // terminate with a '\n'
        const uint32_t terminateOfs = fileSize_ - gfOffset;
   2b5c8:	20 91 88 16 	lds	r18, 0x1688	; 0x801688 <card+0x2b3>
   2b5cc:	30 91 89 16 	lds	r19, 0x1689	; 0x801689 <card+0x2b4>
   2b5d0:	40 91 78 16 	lds	r20, 0x1678	; 0x801678 <card+0x2a3>
   2b5d4:	50 91 79 16 	lds	r21, 0x1679	; 0x801679 <card+0x2a4>
   2b5d8:	60 91 7a 16 	lds	r22, 0x167A	; 0x80167a <card+0x2a5>
   2b5dc:	70 91 7b 16 	lds	r23, 0x167B	; 0x80167b <card+0x2a6>
   2b5e0:	42 1b       	sub	r20, r18
   2b5e2:	53 0b       	sbc	r21, r19
   2b5e4:	61 09       	sbc	r22, r1
   2b5e6:	71 09       	sbc	r23, r1
        vol_->cache()->data[ terminateOfs < 512 ? terminateOfs : 512 ] = '\n';
   2b5e8:	41 30       	cpi	r20, 0x01	; 1
   2b5ea:	92 e0       	ldi	r25, 0x02	; 2
   2b5ec:	59 07       	cpc	r21, r25
   2b5ee:	61 05       	cpc	r22, r1
   2b5f0:	71 05       	cpc	r23, r1
   2b5f2:	20 f0       	brcs	.+8      	; 0x2b5fc <SdFile::gfEnsureBlock() [clone .constprop.219]+0x6c>
   2b5f4:	40 e0       	ldi	r20, 0x00	; 0
   2b5f6:	52 e0       	ldi	r21, 0x02	; 2
   2b5f8:	60 e0       	ldi	r22, 0x00	; 0
   2b5fa:	70 e0       	ldi	r23, 0x00	; 0
   2b5fc:	4a 5b       	subi	r20, 0xBA	; 186
   2b5fe:	51 4f       	sbci	r21, 0xF1	; 241
   2b600:	9a e0       	ldi	r25, 0x0A	; 10
   2b602:	fa 01       	movw	r30, r20
   2b604:	90 83       	st	Z, r25
    }
    return true;
}
   2b606:	1f 91       	pop	r17
   2b608:	0f 91       	pop	r16
   2b60a:	08 95       	ret
        }
        // terminate with a '\n'
        const uint32_t terminateOfs = fileSize_ - gfOffset;
        vol_->cache()->data[ terminateOfs < 512 ? terminateOfs : 512 ] = '\n';
    }
    return true;
   2b60c:	81 e0       	ldi	r24, 0x01	; 1
   2b60e:	fb cf       	rjmp	.-10     	; 0x2b606 <SdFile::gfEnsureBlock() [clone .constprop.219]+0x76>

0002b610 <MMU2::MMU2::HelpUnloadToFinda() [clone .constprop.179]>:
        break;
    }
}

void __attribute__((noinline)) MMU2::HelpUnloadToFinda() {
    extruder_move(-MMU2_RETRY_UNLOAD_TO_FINDA_LENGTH, MMU2_RETRY_UNLOAD_TO_FINDA_FEED_RATE);
   2b610:	20 e0       	ldi	r18, 0x00	; 0
   2b612:	30 e0       	ldi	r19, 0x00	; 0
   2b614:	40 ea       	ldi	r20, 0xA0	; 160
   2b616:	52 e4       	ldi	r21, 0x42	; 66
   2b618:	60 e0       	ldi	r22, 0x00	; 0
   2b61a:	70 e0       	ldi	r23, 0x00	; 0
   2b61c:	80 ea       	ldi	r24, 0xA0	; 160
   2b61e:	92 ec       	ldi	r25, 0xC2	; 194
   2b620:	0d 94 d6 50 	jmp	0x2a1ac	; 0x2a1ac <MMU2::extruder_move(float, float)>

0002b624 <MMU2::MMU2::SaveHotendTemp(bool) [clone .constprop.117]>:
void MMU2::Home(uint8_t mode) {
    logic.Home(mode);
}

void MMU2::SaveHotendTemp(bool turn_off_nozzle) {
    if (mmu_print_saved & SavedState::Cooldown) {
   2b624:	90 91 02 13 	lds	r25, 0x1302	; 0x801302 <MMU2::mmu2+0x70>
   2b628:	91 fd       	sbrc	r25, 1
   2b62a:	17 c0       	rjmp	.+46     	; 0x2b65a <MMU2::MMU2::SaveHotendTemp(bool) [clone .constprop.117]+0x36>
        return;
    }

    if (turn_off_nozzle && !(mmu_print_saved & SavedState::CooldownPending)) {
   2b62c:	88 23       	and	r24, r24
   2b62e:	a9 f0       	breq	.+42     	; 0x2b65a <MMU2::MMU2::SaveHotendTemp(bool) [clone .constprop.117]+0x36>
   2b630:	92 fd       	sbrc	r25, 2
   2b632:	13 c0       	rjmp	.+38     	; 0x2b65a <MMU2::MMU2::SaveHotendTemp(bool) [clone .constprop.117]+0x36>
        Disable_E0();
   2b634:	0f 94 d4 50 	call	0x2a1a8	; 0x2a1a8 <MMU2::Disable_E0()>
        resume_hotend_temp = thermal_degTargetHotend();
   2b638:	80 91 5d 12 	lds	r24, 0x125D	; 0x80125d <target_temperature>
   2b63c:	90 91 5e 12 	lds	r25, 0x125E	; 0x80125e <target_temperature+0x1>
   2b640:	90 93 f7 12 	sts	0x12F7, r25	; 0x8012f7 <MMU2::mmu2+0x65>
   2b644:	80 93 f6 12 	sts	0x12F6, r24	; 0x8012f6 <MMU2::mmu2+0x64>
        mmu_print_saved |= SavedState::CooldownPending;
   2b648:	80 91 02 13 	lds	r24, 0x1302	; 0x801302 <MMU2::mmu2+0x70>
   2b64c:	84 60       	ori	r24, 0x04	; 4
   2b64e:	80 93 02 13 	sts	0x1302, r24	; 0x801302 <MMU2::mmu2+0x70>
        LogEchoEvent_P(PSTR("Heater cooldown pending"));
   2b652:	8d ef       	ldi	r24, 0xFD	; 253
   2b654:	9d e9       	ldi	r25, 0x9D	; 157
   2b656:	0d 94 fa 50 	jmp	0x2a1f4	; 0x2a1f4 <MMU2::LogEchoEvent_P(char const*)>
    }
}
   2b65a:	08 95       	ret

0002b65c <MMU2::MMU2::ResumeUnpark() [clone .constprop.119]>:
        ScreenClear();
    }
}

void MMU2::ResumeUnpark() {
    if (mmu_print_saved & SavedState::ParkExtruder) {
   2b65c:	80 91 02 13 	lds	r24, 0x1302	; 0x801302 <MMU2::mmu2+0x70>
   2b660:	80 ff       	sbrs	r24, 0
   2b662:	45 c0       	rjmp	.+138    	; 0x2b6ee <MMU2::MMU2::ResumeUnpark() [clone .constprop.119]+0x92>
        LogEchoEvent_P(PSTR("Resuming XYZ"));
   2b664:	85 e1       	ldi	r24, 0x15	; 21
   2b666:	9e e9       	ldi	r25, 0x9E	; 158
   2b668:	0f 94 fa 50 	call	0x2a1f4	; 0x2a1f4 <MMU2::LogEchoEvent_P(char const*)>

        // Move XY to starting position, then Z
        motion_do_blocking_move_to_xy(resume_position.xyz[0], resume_position.xyz[1], feedRate_t(NOZZLE_PARK_XY_FEEDRATE));
   2b66c:	80 91 ee 12 	lds	r24, 0x12EE	; 0x8012ee <MMU2::mmu2+0x5c>
   2b670:	90 91 ef 12 	lds	r25, 0x12EF	; 0x8012ef <MMU2::mmu2+0x5d>
   2b674:	a0 91 f0 12 	lds	r26, 0x12F0	; 0x8012f0 <MMU2::mmu2+0x5e>
   2b678:	b0 91 f1 12 	lds	r27, 0x12F1	; 0x8012f1 <MMU2::mmu2+0x5f>
pos3d planner_current_position() {
    return pos3d(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS]);
}

void motion_do_blocking_move_to_xy(float rx, float ry, float feedRate_mm_s) {
    current_position[X_AXIS] = rx;
   2b67c:	40 91 ea 12 	lds	r20, 0x12EA	; 0x8012ea <MMU2::mmu2+0x58>
   2b680:	50 91 eb 12 	lds	r21, 0x12EB	; 0x8012eb <MMU2::mmu2+0x59>
   2b684:	60 91 ec 12 	lds	r22, 0x12EC	; 0x8012ec <MMU2::mmu2+0x5a>
   2b688:	70 91 ed 12 	lds	r23, 0x12ED	; 0x8012ed <MMU2::mmu2+0x5b>
   2b68c:	40 93 61 12 	sts	0x1261, r20	; 0x801261 <current_position>
   2b690:	50 93 62 12 	sts	0x1262, r21	; 0x801262 <current_position+0x1>
   2b694:	60 93 63 12 	sts	0x1263, r22	; 0x801263 <current_position+0x2>
   2b698:	70 93 64 12 	sts	0x1264, r23	; 0x801264 <current_position+0x3>
    current_position[Y_AXIS] = ry;
   2b69c:	80 93 65 12 	sts	0x1265, r24	; 0x801265 <current_position+0x4>
   2b6a0:	90 93 66 12 	sts	0x1266, r25	; 0x801266 <current_position+0x5>
   2b6a4:	a0 93 67 12 	sts	0x1267, r26	; 0x801267 <current_position+0x6>
   2b6a8:	b0 93 68 12 	sts	0x1268, r27	; 0x801268 <current_position+0x7>
    planner_line_to_current_position_sync(feedRate_mm_s);
   2b6ac:	60 e0       	ldi	r22, 0x00	; 0
   2b6ae:	70 e0       	ldi	r23, 0x00	; 0
   2b6b0:	88 e4       	ldi	r24, 0x48	; 72
   2b6b2:	92 e4       	ldi	r25, 0x42	; 66
   2b6b4:	0f 94 f6 50 	call	0x2a1ec	; 0x2a1ec <go_to_current(float) [clone .lto_priv.377]>
}

void motion_do_blocking_move_to_z(float z, float feedRate_mm_s) {
    current_position[Z_AXIS] = z;
   2b6b8:	80 91 f2 12 	lds	r24, 0x12F2	; 0x8012f2 <MMU2::mmu2+0x60>
   2b6bc:	90 91 f3 12 	lds	r25, 0x12F3	; 0x8012f3 <MMU2::mmu2+0x61>
   2b6c0:	a0 91 f4 12 	lds	r26, 0x12F4	; 0x8012f4 <MMU2::mmu2+0x62>
   2b6c4:	b0 91 f5 12 	lds	r27, 0x12F5	; 0x8012f5 <MMU2::mmu2+0x63>
   2b6c8:	80 93 69 12 	sts	0x1269, r24	; 0x801269 <current_position+0x8>
   2b6cc:	90 93 6a 12 	sts	0x126A, r25	; 0x80126a <current_position+0x9>
   2b6d0:	a0 93 6b 12 	sts	0x126B, r26	; 0x80126b <current_position+0xa>
   2b6d4:	b0 93 6c 12 	sts	0x126C, r27	; 0x80126c <current_position+0xb>
    planner_line_to_current_position_sync(feedRate_mm_s);
   2b6d8:	60 e0       	ldi	r22, 0x00	; 0
   2b6da:	70 e0       	ldi	r23, 0x00	; 0
   2b6dc:	80 e7       	ldi	r24, 0x70	; 112
   2b6de:	91 e4       	ldi	r25, 0x41	; 65
   2b6e0:	0f 94 f6 50 	call	0x2a1ec	; 0x2a1ec <go_to_current(float) [clone .lto_priv.377]>
        // From this point forward, power panic should not use
        // the partial backup in RAM since the extruder is no
        // longer in parking position
        marlin_clear_print_state_in_ram();

        mmu_print_saved &= ~(SavedState::ParkExtruder);
   2b6e4:	80 91 02 13 	lds	r24, 0x1302	; 0x801302 <MMU2::mmu2+0x70>
   2b6e8:	8e 7f       	andi	r24, 0xFE	; 254
   2b6ea:	80 93 02 13 	sts	0x1302, r24	; 0x801302 <MMU2::mmu2+0x70>
    }
}
   2b6ee:	08 95       	ret

0002b6f0 <MMU2::MMU2::SaveAndPark(bool) [clone .constprop.114]>:
        mmu_print_saved |= SavedState::CooldownPending;
        LogEchoEvent_P(PSTR("Heater cooldown pending"));
    }
}

void MMU2::SaveAndPark(bool move_axes) {
   2b6f0:	0f 93       	push	r16
   2b6f2:	1f 93       	push	r17
   2b6f4:	cf 93       	push	r28
    if (mmu_print_saved == SavedState::None) { // First occurrence. Save current position, park print head, disable nozzle heater.
   2b6f6:	90 91 02 13 	lds	r25, 0x1302	; 0x801302 <MMU2::mmu2+0x70>
   2b6fa:	91 11       	cpse	r25, r1
   2b6fc:	72 c0       	rjmp	.+228    	; 0x2b7e2 <MMU2::MMU2::SaveAndPark(bool) [clone .constprop.114]+0xf2>
   2b6fe:	c8 2f       	mov	r28, r24
        LogEchoEvent_P(PSTR("Saving and parking"));
   2b700:	8a ee       	ldi	r24, 0xEA	; 234
   2b702:	9d e9       	ldi	r25, 0x9D	; 157
   2b704:	0f 94 fa 50 	call	0x2a1f4	; 0x2a1f4 <MMU2::LogEchoEvent_P(char const*)>
        Disable_E0();
   2b708:	0f 94 d4 50 	call	0x2a1a8	; 0x2a1a8 <MMU2::Disable_E0()>
bool planner_draining() {
    return planner_aborted;
}

void planner_synchronize() {
    st_synchronize();
   2b70c:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
/// e.g. feedrate, Z-axis position etc.
/// This function should backup variables which may be lost
/// For example a power panic in M600 or during MMU error
void refresh_print_state_in_ram()
{
    if (saved_printing) return;
   2b710:	80 91 73 12 	lds	r24, 0x1273	; 0x801273 <saved_printing>
   2b714:	81 11       	cpse	r24, r1
   2b716:	02 c0       	rjmp	.+4      	; 0x2b71c <MMU2::MMU2::SaveAndPark(bool) [clone .constprop.114]+0x2c>
   2b718:	0e 94 a6 63 	call	0xc74c	; 0xc74c <refresh_print_state_in_ram() [clone .part.39]>

        // In case a power panic happens while waiting for the user
        // take a partial back up of print state into RAM (current position, etc.)
        marlin_refresh_print_state_in_ram();

        if (move_axes) {
   2b71c:	cc 23       	and	r28, r28
   2b71e:	09 f4       	brne	.+2      	; 0x2b722 <MMU2::MMU2::SaveAndPark(bool) [clone .constprop.114]+0x32>
   2b720:	60 c0       	rjmp	.+192    	; 0x2b7e2 <MMU2::MMU2::SaveAndPark(bool) [clone .constprop.114]+0xf2>
            mmu_print_saved |= SavedState::ParkExtruder;
   2b722:	80 91 02 13 	lds	r24, 0x1302	; 0x801302 <MMU2::mmu2+0x70>
   2b726:	81 60       	ori	r24, 0x01	; 1
   2b728:	80 93 02 13 	sts	0x1302, r24	; 0x801302 <MMU2::mmu2+0x70>
void planner_set_current_position_E(float e) {
        current_position[E_AXIS] = e;
}

pos3d planner_current_position() {
    return pos3d(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS]);
   2b72c:	80 91 69 12 	lds	r24, 0x1269	; 0x801269 <current_position+0x8>
   2b730:	90 91 6a 12 	lds	r25, 0x126A	; 0x80126a <current_position+0x9>
   2b734:	a0 91 6b 12 	lds	r26, 0x126B	; 0x80126b <current_position+0xa>
   2b738:	b0 91 6c 12 	lds	r27, 0x126C	; 0x80126c <current_position+0xb>
   2b73c:	40 91 65 12 	lds	r20, 0x1265	; 0x801265 <current_position+0x4>
   2b740:	50 91 66 12 	lds	r21, 0x1266	; 0x801266 <current_position+0x5>
   2b744:	60 91 67 12 	lds	r22, 0x1267	; 0x801267 <current_position+0x6>
   2b748:	70 91 68 12 	lds	r23, 0x1268	; 0x801268 <current_position+0x7>
            resume_position = planner_current_position(); // save current pos
   2b74c:	00 91 61 12 	lds	r16, 0x1261	; 0x801261 <current_position>
   2b750:	10 91 62 12 	lds	r17, 0x1262	; 0x801262 <current_position+0x1>
   2b754:	20 91 63 12 	lds	r18, 0x1263	; 0x801263 <current_position+0x2>
   2b758:	30 91 64 12 	lds	r19, 0x1264	; 0x801264 <current_position+0x3>
   2b75c:	00 93 ea 12 	sts	0x12EA, r16	; 0x8012ea <MMU2::mmu2+0x58>
   2b760:	10 93 eb 12 	sts	0x12EB, r17	; 0x8012eb <MMU2::mmu2+0x59>
   2b764:	20 93 ec 12 	sts	0x12EC, r18	; 0x8012ec <MMU2::mmu2+0x5a>
   2b768:	30 93 ed 12 	sts	0x12ED, r19	; 0x8012ed <MMU2::mmu2+0x5b>
   2b76c:	40 93 ee 12 	sts	0x12EE, r20	; 0x8012ee <MMU2::mmu2+0x5c>
   2b770:	50 93 ef 12 	sts	0x12EF, r21	; 0x8012ef <MMU2::mmu2+0x5d>
   2b774:	60 93 f0 12 	sts	0x12F0, r22	; 0x8012f0 <MMU2::mmu2+0x5e>
   2b778:	70 93 f1 12 	sts	0x12F1, r23	; 0x8012f1 <MMU2::mmu2+0x5f>
   2b77c:	80 93 f2 12 	sts	0x12F2, r24	; 0x8012f2 <MMU2::mmu2+0x60>
   2b780:	90 93 f3 12 	sts	0x12F3, r25	; 0x8012f3 <MMU2::mmu2+0x61>
   2b784:	a0 93 f4 12 	sts	0x12F4, r26	; 0x8012f4 <MMU2::mmu2+0x62>
   2b788:	b0 93 f5 12 	sts	0x12F5, r27	; 0x8012f5 <MMU2::mmu2+0x63>
    current_position[E_AXIS] += delta;
    planner_line_to_current_position(feedRate);
}

float move_raise_z(float delta) {
    return raise_z(delta);
   2b78c:	60 e0       	ldi	r22, 0x00	; 0
   2b78e:	70 e0       	ldi	r23, 0x00	; 0
   2b790:	80 ea       	ldi	r24, 0xA0	; 160
   2b792:	91 e4       	ldi	r25, 0x41	; 65
   2b794:	0e 94 94 6c 	call	0xd928	; 0xd928 <raise_z(float)>
void Disable_E0() {
    disable_e0();
}

bool all_axes_homed() {
    return axis_known_position[X_AXIS] && axis_known_position[Y_AXIS];
   2b798:	80 91 39 06 	lds	r24, 0x0639	; 0x800639 <axis_known_position>
   2b79c:	88 23       	and	r24, r24
   2b79e:	09 f1       	breq	.+66     	; 0x2b7e2 <MMU2::MMU2::SaveAndPark(bool) [clone .constprop.114]+0xf2>
   2b7a0:	80 91 3a 06 	lds	r24, 0x063A	; 0x80063a <axis_known_position+0x1>
   2b7a4:	88 23       	and	r24, r24
   2b7a6:	e9 f0       	breq	.+58     	; 0x2b7e2 <MMU2::MMU2::SaveAndPark(bool) [clone .constprop.114]+0xf2>
    current_position[Z_AXIS] = z;
    planner_line_to_current_position_sync(feedRate_mm_s);
}

void nozzle_park() {
    current_position[X_AXIS] = MMU_ERR_X_PAUSE_POS;
   2b7a8:	80 e0       	ldi	r24, 0x00	; 0
   2b7aa:	90 e0       	ldi	r25, 0x00	; 0
   2b7ac:	aa ef       	ldi	r26, 0xFA	; 250
   2b7ae:	b2 e4       	ldi	r27, 0x42	; 66
   2b7b0:	80 93 61 12 	sts	0x1261, r24	; 0x801261 <current_position>
   2b7b4:	90 93 62 12 	sts	0x1262, r25	; 0x801262 <current_position+0x1>
   2b7b8:	a0 93 63 12 	sts	0x1263, r26	; 0x801263 <current_position+0x2>
   2b7bc:	b0 93 64 12 	sts	0x1264, r27	; 0x801264 <current_position+0x3>
    current_position[Y_AXIS] = MMU_ERR_Y_PAUSE_POS;
   2b7c0:	10 92 65 12 	sts	0x1265, r1	; 0x801265 <current_position+0x4>
   2b7c4:	10 92 66 12 	sts	0x1266, r1	; 0x801266 <current_position+0x5>
   2b7c8:	10 92 67 12 	sts	0x1267, r1	; 0x801267 <current_position+0x6>
   2b7cc:	10 92 68 12 	sts	0x1268, r1	; 0x801268 <current_position+0x7>
    planner_line_to_current_position_sync(NOZZLE_PARK_XY_FEEDRATE);
   2b7d0:	60 e0       	ldi	r22, 0x00	; 0
   2b7d2:	70 e0       	ldi	r23, 0x00	; 0
   2b7d4:	88 e4       	ldi	r24, 0x48	; 72
   2b7d6:	92 e4       	ldi	r25, 0x42	; 66
            if (all_axes_homed()) {
                nozzle_park();
            }
        }
    }
}
   2b7d8:	cf 91       	pop	r28
   2b7da:	1f 91       	pop	r17
   2b7dc:	0f 91       	pop	r16
   2b7de:	0d 94 f6 50 	jmp	0x2a1ec	; 0x2a1ec <go_to_current(float) [clone .lto_priv.377]>
   2b7e2:	cf 91       	pop	r28
   2b7e4:	1f 91       	pop	r17
   2b7e6:	0f 91       	pop	r16
   2b7e8:	08 95       	ret

0002b7ea <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char) [clone .constprop.79]>:

/// Searches for circle iteratively
/// Uses points on the perimeter. If point is high it pushes circle out of the center (shift or change of radius),
/// otherwise to the center.
/// Algorithm is stopped after fixed number of iterations. Move is limited to 0.5 px per iteration.
void dynamic_circle(uint8_t *matrix_32x32, float &x, float &y, float &r, uint8_t iterations){
   2b7ea:	2f 92       	push	r2
   2b7ec:	3f 92       	push	r3
   2b7ee:	4f 92       	push	r4
   2b7f0:	5f 92       	push	r5
   2b7f2:	6f 92       	push	r6
   2b7f4:	7f 92       	push	r7
   2b7f6:	8f 92       	push	r8
   2b7f8:	9f 92       	push	r9
   2b7fa:	af 92       	push	r10
   2b7fc:	bf 92       	push	r11
   2b7fe:	cf 92       	push	r12
   2b800:	df 92       	push	r13
   2b802:	ef 92       	push	r14
   2b804:	ff 92       	push	r15
   2b806:	0f 93       	push	r16
   2b808:	1f 93       	push	r17
   2b80a:	cf 93       	push	r28
   2b80c:	df 93       	push	r29
   2b80e:	cd b7       	in	r28, 0x3d	; 61
   2b810:	de b7       	in	r29, 0x3e	; 62
   2b812:	cd 5b       	subi	r28, 0xBD	; 189
   2b814:	d1 40       	sbci	r29, 0x01	; 1
   2b816:	0f b6       	in	r0, 0x3f	; 63
   2b818:	f8 94       	cli
   2b81a:	de bf       	out	0x3e, r29	; 62
   2b81c:	0f be       	out	0x3f, r0	; 63
   2b81e:	cd bf       	out	0x3d, r28	; 61
   2b820:	c3 57       	subi	r28, 0x73	; 115
   2b822:	de 4f       	sbci	r29, 0xFE	; 254
   2b824:	99 83       	std	Y+1, r25	; 0x01
   2b826:	88 83       	st	Y, r24
   2b828:	cd 58       	subi	r28, 0x8D	; 141
   2b82a:	d1 40       	sbci	r29, 0x01	; 1
   2b82c:	c1 57       	subi	r28, 0x71	; 113
   2b82e:	de 4f       	sbci	r29, 0xFE	; 254
   2b830:	79 83       	std	Y+1, r23	; 0x01
   2b832:	68 83       	st	Y, r22
   2b834:	cf 58       	subi	r28, 0x8F	; 143
   2b836:	d1 40       	sbci	r29, 0x01	; 1
   2b838:	ce 56       	subi	r28, 0x6E	; 110
   2b83a:	de 4f       	sbci	r29, 0xFE	; 254
   2b83c:	59 83       	std	Y+1, r21	; 0x01
   2b83e:	48 83       	st	Y, r20
   2b840:	c2 59       	subi	r28, 0x92	; 146
   2b842:	d1 40       	sbci	r29, 0x01	; 1
   2b844:	84 e1       	ldi	r24, 0x14	; 20
   2b846:	cf 56       	subi	r28, 0x6F	; 111
   2b848:	de 4f       	sbci	r29, 0xFE	; 254
   2b84a:	88 83       	st	Y, r24
   2b84c:	c1 59       	subi	r28, 0x91	; 145
   2b84e:	d1 40       	sbci	r29, 0x01	; 1
		// DBG(_n(" [%f, %f][%f] circle\n"), x, y, r);

		/// read points on the circle
		for (uint8_t p = 0; p < num_points; ++p){
			const float angle = p * pi_2_div_num_points;
			const float height = get_value(matrix_32x32, r * cos(angle) + x, r * sin(angle) + y) - target_z;
   2b850:	ce 56       	subi	r28, 0x6E	; 110
   2b852:	de 4f       	sbci	r29, 0xFE	; 254
   2b854:	a8 81       	ld	r26, Y
   2b856:	b9 81       	ldd	r27, Y+1	; 0x01
   2b858:	c2 59       	subi	r28, 0x92	; 146
   2b85a:	d1 40       	sbci	r29, 0x01	; 1
   2b85c:	8d 91       	ld	r24, X+
   2b85e:	9d 91       	ld	r25, X+
   2b860:	0d 90       	ld	r0, X+
   2b862:	bc 91       	ld	r27, X
   2b864:	a0 2d       	mov	r26, r0
   2b866:	c6 56       	subi	r28, 0x66	; 102
   2b868:	de 4f       	sbci	r29, 0xFE	; 254
   2b86a:	88 83       	st	Y, r24
   2b86c:	99 83       	std	Y+1, r25	; 0x01
   2b86e:	aa 83       	std	Y+2, r26	; 0x02
   2b870:	bb 83       	std	Y+3, r27	; 0x03
   2b872:	ca 59       	subi	r28, 0x9A	; 154
   2b874:	d1 40       	sbci	r29, 0x01	; 1
   2b876:	c1 57       	subi	r28, 0x71	; 113
   2b878:	de 4f       	sbci	r29, 0xFE	; 254
   2b87a:	a8 81       	ld	r26, Y
   2b87c:	b9 81       	ldd	r27, Y+1	; 0x01
   2b87e:	cf 58       	subi	r28, 0x8F	; 143
   2b880:	d1 40       	sbci	r29, 0x01	; 1
   2b882:	8d 91       	ld	r24, X+
   2b884:	9d 91       	ld	r25, X+
   2b886:	0d 90       	ld	r0, X+
   2b888:	bc 91       	ld	r27, X
   2b88a:	a0 2d       	mov	r26, r0
   2b88c:	ca 54       	subi	r28, 0x4A	; 74
   2b88e:	de 4f       	sbci	r29, 0xFE	; 254
   2b890:	88 83       	st	Y, r24
   2b892:	99 83       	std	Y+1, r25	; 0x01
   2b894:	aa 83       	std	Y+2, r26	; 0x02
   2b896:	bb 83       	std	Y+3, r27	; 0x03
   2b898:	c6 5b       	subi	r28, 0xB6	; 182
   2b89a:	d1 40       	sbci	r29, 0x01	; 1
   2b89c:	c3 57       	subi	r28, 0x73	; 115
   2b89e:	de 4f       	sbci	r29, 0xFE	; 254
   2b8a0:	a8 81       	ld	r26, Y
   2b8a2:	b9 81       	ldd	r27, Y+1	; 0x01
   2b8a4:	cd 58       	subi	r28, 0x8D	; 141
   2b8a6:	d1 40       	sbci	r29, 0x01	; 1
   2b8a8:	8d 91       	ld	r24, X+
   2b8aa:	9d 91       	ld	r25, X+
   2b8ac:	0d 90       	ld	r0, X+
   2b8ae:	bc 91       	ld	r27, X
   2b8b0:	a0 2d       	mov	r26, r0
   2b8b2:	c6 54       	subi	r28, 0x46	; 70
   2b8b4:	de 4f       	sbci	r29, 0xFE	; 254
   2b8b6:	88 83       	st	Y, r24
   2b8b8:	99 83       	std	Y+1, r25	; 0x01
   2b8ba:	aa 83       	std	Y+2, r26	; 0x02
   2b8bc:	bb 83       	std	Y+3, r27	; 0x03
   2b8be:	ca 5b       	subi	r28, 0xBA	; 186
   2b8c0:	d1 40       	sbci	r29, 0x01	; 1
   2b8c2:	fe 01       	movw	r30, r28
   2b8c4:	e7 5f       	subi	r30, 0xF7	; 247
   2b8c6:	fe 4f       	sbci	r31, 0xFE	; 254
   2b8c8:	c8 55       	subi	r28, 0x58	; 88
   2b8ca:	de 4f       	sbci	r29, 0xFE	; 254
   2b8cc:	f9 83       	std	Y+1, r31	; 0x01
   2b8ce:	e8 83       	st	Y, r30
   2b8d0:	c8 5a       	subi	r28, 0xA8	; 168
   2b8d2:	d1 40       	sbci	r29, 0x01	; 1
   2b8d4:	ce 01       	movw	r24, r28
   2b8d6:	8b 57       	subi	r24, 0x7B	; 123
   2b8d8:	9f 4f       	sbci	r25, 0xFF	; 255
   2b8da:	ca 55       	subi	r28, 0x5A	; 90
   2b8dc:	de 4f       	sbci	r29, 0xFE	; 254
   2b8de:	99 83       	std	Y+1, r25	; 0x01
   2b8e0:	88 83       	st	Y, r24
   2b8e2:	c6 5a       	subi	r28, 0xA6	; 166
   2b8e4:	d1 40       	sbci	r29, 0x01	; 1
   2b8e6:	de 01       	movw	r26, r28
   2b8e8:	11 96       	adiw	r26, 0x01	; 1
   2b8ea:	c8 56       	subi	r28, 0x68	; 104
   2b8ec:	de 4f       	sbci	r29, 0xFE	; 254
   2b8ee:	b9 83       	std	Y+1, r27	; 0x01
   2b8f0:	a8 83       	st	Y, r26
   2b8f2:	c8 59       	subi	r28, 0x98	; 152
   2b8f4:	d1 40       	sbci	r29, 0x01	; 1
   2b8f6:	31 2c       	mov	r3, r1
   2b8f8:	21 2c       	mov	r2, r1
        //@size=128B
		// DBG(_n(" [%f, %f][%f] circle\n"), x, y, r);

		/// read points on the circle
		for (uint8_t p = 0; p < num_points; ++p){
			const float angle = p * pi_2_div_num_points;
   2b8fa:	b1 01       	movw	r22, r2
   2b8fc:	03 2c       	mov	r0, r3
   2b8fe:	00 0c       	add	r0, r0
   2b900:	88 0b       	sbc	r24, r24
   2b902:	99 0b       	sbc	r25, r25
   2b904:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   2b908:	2a e1       	ldi	r18, 0x1A	; 26
   2b90a:	38 ef       	ldi	r19, 0xF8	; 248
   2b90c:	42 e4       	ldi	r20, 0x42	; 66
   2b90e:	5e e3       	ldi	r21, 0x3E	; 62
   2b910:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2b914:	6b 01       	movw	r12, r22
   2b916:	7c 01       	movw	r14, r24
			const float height = get_value(matrix_32x32, r * cos(angle) + x, r * sin(angle) + y) - target_z;
   2b918:	0f 94 c8 a8 	call	0x35190	; 0x35190 <sin>
   2b91c:	c2 56       	subi	r28, 0x62	; 98
   2b91e:	de 4f       	sbci	r29, 0xFE	; 254
   2b920:	68 83       	st	Y, r22
   2b922:	79 83       	std	Y+1, r23	; 0x01
   2b924:	8a 83       	std	Y+2, r24	; 0x02
   2b926:	9b 83       	std	Y+3, r25	; 0x03
   2b928:	ce 59       	subi	r28, 0x9E	; 158
   2b92a:	d1 40       	sbci	r29, 0x01	; 1
   2b92c:	c7 01       	movw	r24, r14
   2b92e:	b6 01       	movw	r22, r12
   2b930:	0f 94 02 a6 	call	0x34c04	; 0x34c04 <cos>
   2b934:	ce 55       	subi	r28, 0x5E	; 94
   2b936:	de 4f       	sbci	r29, 0xFE	; 254
   2b938:	68 83       	st	Y, r22
   2b93a:	79 83       	std	Y+1, r23	; 0x01
   2b93c:	8a 83       	std	Y+2, r24	; 0x02
   2b93e:	9b 83       	std	Y+3, r25	; 0x03
   2b940:	c2 5a       	subi	r28, 0xA2	; 162
   2b942:	d1 40       	sbci	r29, 0x01	; 1
   2b944:	9b 01       	movw	r18, r22
   2b946:	ac 01       	movw	r20, r24
   2b948:	c6 56       	subi	r28, 0x66	; 102
   2b94a:	de 4f       	sbci	r29, 0xFE	; 254
   2b94c:	68 81       	ld	r22, Y
   2b94e:	79 81       	ldd	r23, Y+1	; 0x01
   2b950:	8a 81       	ldd	r24, Y+2	; 0x02
   2b952:	9b 81       	ldd	r25, Y+3	; 0x03
   2b954:	ca 59       	subi	r28, 0x9A	; 154
   2b956:	d1 40       	sbci	r29, 0x01	; 1
   2b958:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2b95c:	c6 54       	subi	r28, 0x46	; 70
   2b95e:	de 4f       	sbci	r29, 0xFE	; 254
   2b960:	28 81       	ld	r18, Y
   2b962:	39 81       	ldd	r19, Y+1	; 0x01
   2b964:	4a 81       	ldd	r20, Y+2	; 0x02
   2b966:	5b 81       	ldd	r21, Y+3	; 0x03
   2b968:	ca 5b       	subi	r28, 0xBA	; 186
   2b96a:	d1 40       	sbci	r29, 0x01	; 1
   2b96c:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   2b970:	6b 01       	movw	r12, r22
   2b972:	7c 01       	movw	r14, r24
}

/// returns value of any location within data
/// uses bilinear interpolation
float get_value(uint8_t * matrix_32x32, float c, float r){
	if (c <= 0 || r <= 0 || c >= 31 || r >= 31)
   2b974:	20 e0       	ldi	r18, 0x00	; 0
   2b976:	30 e0       	ldi	r19, 0x00	; 0
   2b978:	a9 01       	movw	r20, r18
   2b97a:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   2b97e:	18 16       	cp	r1, r24
   2b980:	0c f0       	brlt	.+2      	; 0x2b984 <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char) [clone .constprop.79]+0x19a>
   2b982:	7a c2       	rjmp	.+1268   	; 0x2be78 <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char) [clone .constprop.79]+0x68e>
		// DBG(_n(" [%f, %f][%f] circle\n"), x, y, r);

		/// read points on the circle
		for (uint8_t p = 0; p < num_points; ++p){
			const float angle = p * pi_2_div_num_points;
			const float height = get_value(matrix_32x32, r * cos(angle) + x, r * sin(angle) + y) - target_z;
   2b984:	c2 56       	subi	r28, 0x62	; 98
   2b986:	de 4f       	sbci	r29, 0xFE	; 254
   2b988:	28 81       	ld	r18, Y
   2b98a:	39 81       	ldd	r19, Y+1	; 0x01
   2b98c:	4a 81       	ldd	r20, Y+2	; 0x02
   2b98e:	5b 81       	ldd	r21, Y+3	; 0x03
   2b990:	ce 59       	subi	r28, 0x9E	; 158
   2b992:	d1 40       	sbci	r29, 0x01	; 1
   2b994:	c6 56       	subi	r28, 0x66	; 102
   2b996:	de 4f       	sbci	r29, 0xFE	; 254
   2b998:	68 81       	ld	r22, Y
   2b99a:	79 81       	ldd	r23, Y+1	; 0x01
   2b99c:	8a 81       	ldd	r24, Y+2	; 0x02
   2b99e:	9b 81       	ldd	r25, Y+3	; 0x03
   2b9a0:	ca 59       	subi	r28, 0x9A	; 154
   2b9a2:	d1 40       	sbci	r29, 0x01	; 1
   2b9a4:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2b9a8:	ca 54       	subi	r28, 0x4A	; 74
   2b9aa:	de 4f       	sbci	r29, 0xFE	; 254
   2b9ac:	28 81       	ld	r18, Y
   2b9ae:	39 81       	ldd	r19, Y+1	; 0x01
   2b9b0:	4a 81       	ldd	r20, Y+2	; 0x02
   2b9b2:	5b 81       	ldd	r21, Y+3	; 0x03
   2b9b4:	c6 5b       	subi	r28, 0xB6	; 182
   2b9b6:	d1 40       	sbci	r29, 0x01	; 1
   2b9b8:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   2b9bc:	4b 01       	movw	r8, r22
   2b9be:	5c 01       	movw	r10, r24
}

/// returns value of any location within data
/// uses bilinear interpolation
float get_value(uint8_t * matrix_32x32, float c, float r){
	if (c <= 0 || r <= 0 || c >= 31 || r >= 31)
   2b9c0:	20 e0       	ldi	r18, 0x00	; 0
   2b9c2:	30 e0       	ldi	r19, 0x00	; 0
   2b9c4:	a9 01       	movw	r20, r18
   2b9c6:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   2b9ca:	18 16       	cp	r1, r24
   2b9cc:	0c f0       	brlt	.+2      	; 0x2b9d0 <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char) [clone .constprop.79]+0x1e6>
   2b9ce:	54 c2       	rjmp	.+1192   	; 0x2be78 <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char) [clone .constprop.79]+0x68e>
   2b9d0:	20 e0       	ldi	r18, 0x00	; 0
   2b9d2:	30 e0       	ldi	r19, 0x00	; 0
   2b9d4:	48 ef       	ldi	r20, 0xF8	; 248
   2b9d6:	51 e4       	ldi	r21, 0x41	; 65
   2b9d8:	c7 01       	movw	r24, r14
   2b9da:	b6 01       	movw	r22, r12
   2b9dc:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   2b9e0:	87 ff       	sbrs	r24, 7
   2b9e2:	4a c2       	rjmp	.+1172   	; 0x2be78 <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char) [clone .constprop.79]+0x68e>
   2b9e4:	20 e0       	ldi	r18, 0x00	; 0
   2b9e6:	30 e0       	ldi	r19, 0x00	; 0
   2b9e8:	48 ef       	ldi	r20, 0xF8	; 248
   2b9ea:	51 e4       	ldi	r21, 0x41	; 65
   2b9ec:	c5 01       	movw	r24, r10
   2b9ee:	b4 01       	movw	r22, r8
   2b9f0:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   2b9f4:	87 ff       	sbrs	r24, 7
   2b9f6:	40 c2       	rjmp	.+1152   	; 0x2be78 <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char) [clone .constprop.79]+0x68e>
		return 0;

	/// calculate weights of nearby points
	const float wc1 = c - floor(c);
   2b9f8:	c7 01       	movw	r24, r14
   2b9fa:	b6 01       	movw	r22, r12
   2b9fc:	0f 94 af a6 	call	0x34d5e	; 0x34d5e <floor>
   2ba00:	9b 01       	movw	r18, r22
   2ba02:	ac 01       	movw	r20, r24
   2ba04:	c7 01       	movw	r24, r14
   2ba06:	b6 01       	movw	r22, r12
   2ba08:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   2ba0c:	2b 01       	movw	r4, r22
   2ba0e:	3c 01       	movw	r6, r24
	const float wr1 = r - floor(r);
   2ba10:	c5 01       	movw	r24, r10
   2ba12:	b4 01       	movw	r22, r8
   2ba14:	0f 94 af a6 	call	0x34d5e	; 0x34d5e <floor>
   2ba18:	9b 01       	movw	r18, r22
   2ba1a:	ac 01       	movw	r20, r24
   2ba1c:	c5 01       	movw	r24, r10
   2ba1e:	b4 01       	movw	r22, r8
   2ba20:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   2ba24:	cc 56       	subi	r28, 0x6C	; 108
   2ba26:	de 4f       	sbci	r29, 0xFE	; 254
   2ba28:	68 83       	st	Y, r22
   2ba2a:	79 83       	std	Y+1, r23	; 0x01
   2ba2c:	8a 83       	std	Y+2, r24	; 0x02
   2ba2e:	9b 83       	std	Y+3, r25	; 0x03
   2ba30:	c4 59       	subi	r28, 0x94	; 148
   2ba32:	d1 40       	sbci	r29, 0x01	; 1
	const float wc0 = 1 - wc1;
   2ba34:	a3 01       	movw	r20, r6
   2ba36:	92 01       	movw	r18, r4
   2ba38:	60 e0       	ldi	r22, 0x00	; 0
   2ba3a:	70 e0       	ldi	r23, 0x00	; 0
   2ba3c:	80 e8       	ldi	r24, 0x80	; 128
   2ba3e:	9f e3       	ldi	r25, 0x3F	; 63
   2ba40:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   2ba44:	c2 55       	subi	r28, 0x52	; 82
   2ba46:	de 4f       	sbci	r29, 0xFE	; 254
   2ba48:	68 83       	st	Y, r22
   2ba4a:	79 83       	std	Y+1, r23	; 0x01
   2ba4c:	8a 83       	std	Y+2, r24	; 0x02
   2ba4e:	9b 83       	std	Y+3, r25	; 0x03
   2ba50:	ce 5a       	subi	r28, 0xAE	; 174
   2ba52:	d1 40       	sbci	r29, 0x01	; 1
	const float wr0 = 1 - wr1;
   2ba54:	cc 56       	subi	r28, 0x6C	; 108
   2ba56:	de 4f       	sbci	r29, 0xFE	; 254
   2ba58:	28 81       	ld	r18, Y
   2ba5a:	39 81       	ldd	r19, Y+1	; 0x01
   2ba5c:	4a 81       	ldd	r20, Y+2	; 0x02
   2ba5e:	5b 81       	ldd	r21, Y+3	; 0x03
   2ba60:	c4 59       	subi	r28, 0x94	; 148
   2ba62:	d1 40       	sbci	r29, 0x01	; 1
   2ba64:	60 e0       	ldi	r22, 0x00	; 0
   2ba66:	70 e0       	ldi	r23, 0x00	; 0
   2ba68:	80 e8       	ldi	r24, 0x80	; 128
   2ba6a:	9f e3       	ldi	r25, 0x3F	; 63
   2ba6c:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   2ba70:	ce 54       	subi	r28, 0x4E	; 78
   2ba72:	de 4f       	sbci	r29, 0xFE	; 254
   2ba74:	68 83       	st	Y, r22
   2ba76:	79 83       	std	Y+1, r23	; 0x01
   2ba78:	8a 83       	std	Y+2, r24	; 0x02
   2ba7a:	9b 83       	std	Y+3, r25	; 0x03
   2ba7c:	c2 5b       	subi	r28, 0xB2	; 178
   2ba7e:	d1 40       	sbci	r29, 0x01	; 1
	const float w00 = wc0 * wr0;
	const float w01 = wc0 * wr1;
	const float w10 = wc1 * wr0;
	const float w11 = wc1 * wr1;

	const uint16_t c0 = c;
   2ba80:	c7 01       	movw	r24, r14
   2ba82:	b6 01       	movw	r22, r12
   2ba84:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   2ba88:	6b 01       	movw	r12, r22
	const uint16_t c1 = c0 + 1;
   2ba8a:	fb 01       	movw	r30, r22
   2ba8c:	31 96       	adiw	r30, 0x01	; 1
   2ba8e:	c6 55       	subi	r28, 0x56	; 86
   2ba90:	de 4f       	sbci	r29, 0xFE	; 254
   2ba92:	f9 83       	std	Y+1, r31	; 0x01
   2ba94:	e8 83       	st	Y, r30
   2ba96:	ca 5a       	subi	r28, 0xAA	; 170
   2ba98:	d1 40       	sbci	r29, 0x01	; 1
	const uint16_t r0 = r;
   2ba9a:	c5 01       	movw	r24, r10
   2ba9c:	b4 01       	movw	r22, r8
   2ba9e:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
	const uint16_t r1 = r0 + 1;

	const uint16_t idx00 = c0 + 32 * r0;
   2baa2:	8b 01       	movw	r16, r22
   2baa4:	95 e0       	ldi	r25, 0x05	; 5
   2baa6:	00 0f       	add	r16, r16
   2baa8:	11 1f       	adc	r17, r17
   2baaa:	9a 95       	dec	r25
   2baac:	e1 f7       	brne	.-8      	; 0x2baa6 <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char) [clone .constprop.79]+0x2bc>
	const uint16_t idx01 = c0 + 32 * r1;
   2baae:	c8 01       	movw	r24, r16
   2bab0:	80 96       	adiw	r24, 0x20	; 32
   2bab2:	c4 55       	subi	r28, 0x54	; 84
   2bab4:	de 4f       	sbci	r29, 0xFE	; 254
   2bab6:	99 83       	std	Y+1, r25	; 0x01
   2bab8:	88 83       	st	Y, r24
   2baba:	cc 5a       	subi	r28, 0xAC	; 172
   2babc:	d1 40       	sbci	r29, 0x01	; 1
	const uint16_t idx10 = c1 + 32 * r0;
	const uint16_t idx11 = c1 + 32 * r1;

	/// bilinear resampling
	return w00 * matrix_32x32[idx00] + w01 * matrix_32x32[idx01] + w10 * matrix_32x32[idx10] + w11 * matrix_32x32[idx11];
   2babe:	f8 01       	movw	r30, r16
   2bac0:	ec 0d       	add	r30, r12
   2bac2:	fd 1d       	adc	r31, r13
   2bac4:	e2 5a       	subi	r30, 0xA2	; 162
   2bac6:	f9 4f       	sbci	r31, 0xF9	; 249
   2bac8:	60 81       	ld	r22, Z
   2baca:	70 e0       	ldi	r23, 0x00	; 0
   2bacc:	90 e0       	ldi	r25, 0x00	; 0
   2bace:	80 e0       	ldi	r24, 0x00	; 0
   2bad0:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   2bad4:	4b 01       	movw	r8, r22
   2bad6:	5c 01       	movw	r10, r24
	const float wc1 = c - floor(c);
	const float wr1 = r - floor(r);
	const float wc0 = 1 - wc1;
	const float wr0 = 1 - wr1;

	const float w00 = wc0 * wr0;
   2bad8:	ce 54       	subi	r28, 0x4E	; 78
   2bada:	de 4f       	sbci	r29, 0xFE	; 254
   2badc:	28 81       	ld	r18, Y
   2bade:	39 81       	ldd	r19, Y+1	; 0x01
   2bae0:	4a 81       	ldd	r20, Y+2	; 0x02
   2bae2:	5b 81       	ldd	r21, Y+3	; 0x03
   2bae4:	c2 5b       	subi	r28, 0xB2	; 178
   2bae6:	d1 40       	sbci	r29, 0x01	; 1
   2bae8:	c2 55       	subi	r28, 0x52	; 82
   2baea:	de 4f       	sbci	r29, 0xFE	; 254
   2baec:	68 81       	ld	r22, Y
   2baee:	79 81       	ldd	r23, Y+1	; 0x01
   2baf0:	8a 81       	ldd	r24, Y+2	; 0x02
   2baf2:	9b 81       	ldd	r25, Y+3	; 0x03
   2baf4:	ce 5a       	subi	r28, 0xAE	; 174
   2baf6:	d1 40       	sbci	r29, 0x01	; 1
   2baf8:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2bafc:	9b 01       	movw	r18, r22
   2bafe:	ac 01       	movw	r20, r24
	const uint16_t idx01 = c0 + 32 * r1;
	const uint16_t idx10 = c1 + 32 * r0;
	const uint16_t idx11 = c1 + 32 * r1;

	/// bilinear resampling
	return w00 * matrix_32x32[idx00] + w01 * matrix_32x32[idx01] + w10 * matrix_32x32[idx10] + w11 * matrix_32x32[idx11];
   2bb00:	c5 01       	movw	r24, r10
   2bb02:	b4 01       	movw	r22, r8
   2bb04:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2bb08:	4b 01       	movw	r8, r22
   2bb0a:	5c 01       	movw	r10, r24
   2bb0c:	c4 55       	subi	r28, 0x54	; 84
   2bb0e:	de 4f       	sbci	r29, 0xFE	; 254
   2bb10:	e8 81       	ld	r30, Y
   2bb12:	f9 81       	ldd	r31, Y+1	; 0x01
   2bb14:	cc 5a       	subi	r28, 0xAC	; 172
   2bb16:	d1 40       	sbci	r29, 0x01	; 1
   2bb18:	ec 0d       	add	r30, r12
   2bb1a:	fd 1d       	adc	r31, r13
   2bb1c:	e2 5a       	subi	r30, 0xA2	; 162
   2bb1e:	f9 4f       	sbci	r31, 0xF9	; 249
   2bb20:	60 81       	ld	r22, Z
   2bb22:	70 e0       	ldi	r23, 0x00	; 0
   2bb24:	90 e0       	ldi	r25, 0x00	; 0
   2bb26:	80 e0       	ldi	r24, 0x00	; 0
   2bb28:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   2bb2c:	6b 01       	movw	r12, r22
   2bb2e:	7c 01       	movw	r14, r24
	const float wr1 = r - floor(r);
	const float wc0 = 1 - wc1;
	const float wr0 = 1 - wr1;

	const float w00 = wc0 * wr0;
	const float w01 = wc0 * wr1;
   2bb30:	c2 55       	subi	r28, 0x52	; 82
   2bb32:	de 4f       	sbci	r29, 0xFE	; 254
   2bb34:	28 81       	ld	r18, Y
   2bb36:	39 81       	ldd	r19, Y+1	; 0x01
   2bb38:	4a 81       	ldd	r20, Y+2	; 0x02
   2bb3a:	5b 81       	ldd	r21, Y+3	; 0x03
   2bb3c:	ce 5a       	subi	r28, 0xAE	; 174
   2bb3e:	d1 40       	sbci	r29, 0x01	; 1
   2bb40:	cc 56       	subi	r28, 0x6C	; 108
   2bb42:	de 4f       	sbci	r29, 0xFE	; 254
   2bb44:	68 81       	ld	r22, Y
   2bb46:	79 81       	ldd	r23, Y+1	; 0x01
   2bb48:	8a 81       	ldd	r24, Y+2	; 0x02
   2bb4a:	9b 81       	ldd	r25, Y+3	; 0x03
   2bb4c:	c4 59       	subi	r28, 0x94	; 148
   2bb4e:	d1 40       	sbci	r29, 0x01	; 1
   2bb50:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2bb54:	9b 01       	movw	r18, r22
   2bb56:	ac 01       	movw	r20, r24
	const uint16_t idx01 = c0 + 32 * r1;
	const uint16_t idx10 = c1 + 32 * r0;
	const uint16_t idx11 = c1 + 32 * r1;

	/// bilinear resampling
	return w00 * matrix_32x32[idx00] + w01 * matrix_32x32[idx01] + w10 * matrix_32x32[idx10] + w11 * matrix_32x32[idx11];
   2bb58:	c7 01       	movw	r24, r14
   2bb5a:	b6 01       	movw	r22, r12
   2bb5c:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2bb60:	9b 01       	movw	r18, r22
   2bb62:	ac 01       	movw	r20, r24
   2bb64:	c5 01       	movw	r24, r10
   2bb66:	b4 01       	movw	r22, r8
   2bb68:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   2bb6c:	6b 01       	movw	r12, r22
   2bb6e:	7c 01       	movw	r14, r24
   2bb70:	c6 55       	subi	r28, 0x56	; 86
   2bb72:	de 4f       	sbci	r29, 0xFE	; 254
   2bb74:	a8 81       	ld	r26, Y
   2bb76:	b9 81       	ldd	r27, Y+1	; 0x01
   2bb78:	ca 5a       	subi	r28, 0xAA	; 170
   2bb7a:	d1 40       	sbci	r29, 0x01	; 1
   2bb7c:	0a 0f       	add	r16, r26
   2bb7e:	1b 1f       	adc	r17, r27
   2bb80:	f8 01       	movw	r30, r16
   2bb82:	e2 5a       	subi	r30, 0xA2	; 162
   2bb84:	f9 4f       	sbci	r31, 0xF9	; 249
   2bb86:	60 81       	ld	r22, Z
   2bb88:	70 e0       	ldi	r23, 0x00	; 0
   2bb8a:	90 e0       	ldi	r25, 0x00	; 0
   2bb8c:	80 e0       	ldi	r24, 0x00	; 0
   2bb8e:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   2bb92:	4b 01       	movw	r8, r22
   2bb94:	5c 01       	movw	r10, r24
	const float wc0 = 1 - wc1;
	const float wr0 = 1 - wr1;

	const float w00 = wc0 * wr0;
	const float w01 = wc0 * wr1;
	const float w10 = wc1 * wr0;
   2bb96:	ce 54       	subi	r28, 0x4E	; 78
   2bb98:	de 4f       	sbci	r29, 0xFE	; 254
   2bb9a:	28 81       	ld	r18, Y
   2bb9c:	39 81       	ldd	r19, Y+1	; 0x01
   2bb9e:	4a 81       	ldd	r20, Y+2	; 0x02
   2bba0:	5b 81       	ldd	r21, Y+3	; 0x03
   2bba2:	c2 5b       	subi	r28, 0xB2	; 178
   2bba4:	d1 40       	sbci	r29, 0x01	; 1
   2bba6:	c3 01       	movw	r24, r6
   2bba8:	b2 01       	movw	r22, r4
   2bbaa:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2bbae:	9b 01       	movw	r18, r22
   2bbb0:	ac 01       	movw	r20, r24
	const uint16_t idx01 = c0 + 32 * r1;
	const uint16_t idx10 = c1 + 32 * r0;
	const uint16_t idx11 = c1 + 32 * r1;

	/// bilinear resampling
	return w00 * matrix_32x32[idx00] + w01 * matrix_32x32[idx01] + w10 * matrix_32x32[idx10] + w11 * matrix_32x32[idx11];
   2bbb2:	c5 01       	movw	r24, r10
   2bbb4:	b4 01       	movw	r22, r8
   2bbb6:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2bbba:	9b 01       	movw	r18, r22
   2bbbc:	ac 01       	movw	r20, r24
   2bbbe:	c7 01       	movw	r24, r14
   2bbc0:	b6 01       	movw	r22, r12
   2bbc2:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   2bbc6:	6b 01       	movw	r12, r22
   2bbc8:	7c 01       	movw	r14, r24
   2bbca:	c6 55       	subi	r28, 0x56	; 86
   2bbcc:	de 4f       	sbci	r29, 0xFE	; 254
   2bbce:	e8 81       	ld	r30, Y
   2bbd0:	f9 81       	ldd	r31, Y+1	; 0x01
   2bbd2:	ca 5a       	subi	r28, 0xAA	; 170
   2bbd4:	d1 40       	sbci	r29, 0x01	; 1
   2bbd6:	c4 55       	subi	r28, 0x54	; 84
   2bbd8:	de 4f       	sbci	r29, 0xFE	; 254
   2bbda:	88 81       	ld	r24, Y
   2bbdc:	99 81       	ldd	r25, Y+1	; 0x01
   2bbde:	cc 5a       	subi	r28, 0xAC	; 172
   2bbe0:	d1 40       	sbci	r29, 0x01	; 1
   2bbe2:	e8 0f       	add	r30, r24
   2bbe4:	f9 1f       	adc	r31, r25
   2bbe6:	e2 5a       	subi	r30, 0xA2	; 162
   2bbe8:	f9 4f       	sbci	r31, 0xF9	; 249
   2bbea:	60 81       	ld	r22, Z
   2bbec:	70 e0       	ldi	r23, 0x00	; 0
   2bbee:	90 e0       	ldi	r25, 0x00	; 0
   2bbf0:	80 e0       	ldi	r24, 0x00	; 0
   2bbf2:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   2bbf6:	4b 01       	movw	r8, r22
   2bbf8:	5c 01       	movw	r10, r24
	const float wr0 = 1 - wr1;

	const float w00 = wc0 * wr0;
	const float w01 = wc0 * wr1;
	const float w10 = wc1 * wr0;
	const float w11 = wc1 * wr1;
   2bbfa:	cc 56       	subi	r28, 0x6C	; 108
   2bbfc:	de 4f       	sbci	r29, 0xFE	; 254
   2bbfe:	28 81       	ld	r18, Y
   2bc00:	39 81       	ldd	r19, Y+1	; 0x01
   2bc02:	4a 81       	ldd	r20, Y+2	; 0x02
   2bc04:	5b 81       	ldd	r21, Y+3	; 0x03
   2bc06:	c4 59       	subi	r28, 0x94	; 148
   2bc08:	d1 40       	sbci	r29, 0x01	; 1
   2bc0a:	c3 01       	movw	r24, r6
   2bc0c:	b2 01       	movw	r22, r4
   2bc0e:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2bc12:	9b 01       	movw	r18, r22
   2bc14:	ac 01       	movw	r20, r24
	const uint16_t idx01 = c0 + 32 * r1;
	const uint16_t idx10 = c1 + 32 * r0;
	const uint16_t idx11 = c1 + 32 * r1;

	/// bilinear resampling
	return w00 * matrix_32x32[idx00] + w01 * matrix_32x32[idx01] + w10 * matrix_32x32[idx10] + w11 * matrix_32x32[idx11];
   2bc16:	c5 01       	movw	r24, r10
   2bc18:	b4 01       	movw	r22, r8
   2bc1a:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2bc1e:	9b 01       	movw	r18, r22
   2bc20:	ac 01       	movw	r20, r24
   2bc22:	c7 01       	movw	r24, r14
   2bc24:	b6 01       	movw	r22, r12
   2bc26:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
		// DBG(_n(" [%f, %f][%f] circle\n"), x, y, r);

		/// read points on the circle
		for (uint8_t p = 0; p < num_points; ++p){
			const float angle = p * pi_2_div_num_points;
			const float height = get_value(matrix_32x32, r * cos(angle) + x, r * sin(angle) + y) - target_z;
   2bc2a:	20 e0       	ldi	r18, 0x00	; 0
   2bc2c:	30 e0       	ldi	r19, 0x00	; 0
   2bc2e:	40 e0       	ldi	r20, 0x00	; 0
   2bc30:	52 e4       	ldi	r21, 0x42	; 66
   2bc32:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   2bc36:	6b 01       	movw	r12, r22
   2bc38:	7c 01       	movw	r14, r24
			// DBG(_n("%f "), point);

			shifts_x[p] = cos(angle) * height;
   2bc3a:	ac 01       	movw	r20, r24
   2bc3c:	9b 01       	movw	r18, r22
   2bc3e:	ce 55       	subi	r28, 0x5E	; 94
   2bc40:	de 4f       	sbci	r29, 0xFE	; 254
   2bc42:	68 81       	ld	r22, Y
   2bc44:	79 81       	ldd	r23, Y+1	; 0x01
   2bc46:	8a 81       	ldd	r24, Y+2	; 0x02
   2bc48:	9b 81       	ldd	r25, Y+3	; 0x03
   2bc4a:	c2 5a       	subi	r28, 0xA2	; 162
   2bc4c:	d1 40       	sbci	r29, 0x01	; 1
   2bc4e:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2bc52:	c8 55       	subi	r28, 0x58	; 88
   2bc54:	de 4f       	sbci	r29, 0xFE	; 254
   2bc56:	a8 81       	ld	r26, Y
   2bc58:	b9 81       	ldd	r27, Y+1	; 0x01
   2bc5a:	c8 5a       	subi	r28, 0xA8	; 168
   2bc5c:	d1 40       	sbci	r29, 0x01	; 1
   2bc5e:	6d 93       	st	X+, r22
   2bc60:	7d 93       	st	X+, r23
   2bc62:	8d 93       	st	X+, r24
   2bc64:	9d 93       	st	X+, r25
   2bc66:	c8 55       	subi	r28, 0x58	; 88
   2bc68:	de 4f       	sbci	r29, 0xFE	; 254
   2bc6a:	b9 83       	std	Y+1, r27	; 0x01
   2bc6c:	a8 83       	st	Y, r26
   2bc6e:	c8 5a       	subi	r28, 0xA8	; 168
   2bc70:	d1 40       	sbci	r29, 0x01	; 1
			shifts_y[p] = sin(angle) * height;
   2bc72:	a7 01       	movw	r20, r14
   2bc74:	96 01       	movw	r18, r12
   2bc76:	c2 56       	subi	r28, 0x62	; 98
   2bc78:	de 4f       	sbci	r29, 0xFE	; 254
   2bc7a:	68 81       	ld	r22, Y
   2bc7c:	79 81       	ldd	r23, Y+1	; 0x01
   2bc7e:	8a 81       	ldd	r24, Y+2	; 0x02
   2bc80:	9b 81       	ldd	r25, Y+3	; 0x03
   2bc82:	ce 59       	subi	r28, 0x9E	; 158
   2bc84:	d1 40       	sbci	r29, 0x01	; 1
   2bc86:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2bc8a:	ca 55       	subi	r28, 0x5A	; 90
   2bc8c:	de 4f       	sbci	r29, 0xFE	; 254
   2bc8e:	e8 81       	ld	r30, Y
   2bc90:	f9 81       	ldd	r31, Y+1	; 0x01
   2bc92:	c6 5a       	subi	r28, 0xA6	; 166
   2bc94:	d1 40       	sbci	r29, 0x01	; 1
   2bc96:	61 93       	st	Z+, r22
   2bc98:	71 93       	st	Z+, r23
   2bc9a:	81 93       	st	Z+, r24
   2bc9c:	91 93       	st	Z+, r25
   2bc9e:	ca 55       	subi	r28, 0x5A	; 90
   2bca0:	de 4f       	sbci	r29, 0xFE	; 254
   2bca2:	f9 83       	std	Y+1, r31	; 0x01
   2bca4:	e8 83       	st	Y, r30
   2bca6:	c6 5a       	subi	r28, 0xA6	; 166
   2bca8:	d1 40       	sbci	r29, 0x01	; 1
			shifts_r[p] = height;
   2bcaa:	c8 56       	subi	r28, 0x68	; 104
   2bcac:	de 4f       	sbci	r29, 0xFE	; 254
   2bcae:	a8 81       	ld	r26, Y
   2bcb0:	b9 81       	ldd	r27, Y+1	; 0x01
   2bcb2:	c8 59       	subi	r28, 0x98	; 152
   2bcb4:	d1 40       	sbci	r29, 0x01	; 1
   2bcb6:	cd 92       	st	X+, r12
   2bcb8:	dd 92       	st	X+, r13
   2bcba:	ed 92       	st	X+, r14
   2bcbc:	fd 92       	st	X+, r15
   2bcbe:	c8 56       	subi	r28, 0x68	; 104
   2bcc0:	de 4f       	sbci	r29, 0xFE	; 254
   2bcc2:	b9 83       	std	Y+1, r27	; 0x01
   2bcc4:	a8 83       	st	Y, r26
   2bcc6:	c8 59       	subi	r28, 0x98	; 152
   2bcc8:	d1 40       	sbci	r29, 0x01	; 1
   2bcca:	bf ef       	ldi	r27, 0xFF	; 255
   2bccc:	2b 1a       	sub	r2, r27
   2bcce:	3b 0a       	sbc	r3, r27

        //@size=128B
		// DBG(_n(" [%f, %f][%f] circle\n"), x, y, r);

		/// read points on the circle
		for (uint8_t p = 0; p < num_points; ++p){
   2bcd0:	e1 e2       	ldi	r30, 0x21	; 33
   2bcd2:	2e 16       	cp	r2, r30
   2bcd4:	31 04       	cpc	r3, r1
   2bcd6:	09 f0       	breq	.+2      	; 0x2bcda <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char) [clone .constprop.79]+0x4f0>
   2bcd8:	10 ce       	rjmp	.-992    	; 0x2b8fa <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char) [clone .constprop.79]+0x110>
		const float norm = 1.f / reducer;
//		x += CLAMP(median(shifts_x, blocks) * norm, -max_change, max_change);
//		y += CLAMP(median(shifts_y, blocks) * norm, -max_change, max_change);
//		r += CLAMP(median(shifts_r, blocks) * norm * .5f, -max_change, max_change);
        //104B down
        x += CLAMP_median(shifts_x, blocks, norm);
   2bcda:	40 e0       	ldi	r20, 0x00	; 0
   2bcdc:	50 e0       	ldi	r21, 0x00	; 0
   2bcde:	60 e0       	ldi	r22, 0x00	; 0
   2bce0:	7d e3       	ldi	r23, 0x3D	; 61
   2bce2:	ce 01       	movw	r24, r28
   2bce4:	87 5f       	subi	r24, 0xF7	; 247
   2bce6:	9e 4f       	sbci	r25, 0xFE	; 254
   2bce8:	0f 94 b3 55 	call	0x2ab66	; 0x2ab66 <CLAMP_median(float*, unsigned char, float) [clone .constprop.82]>
   2bcec:	9b 01       	movw	r18, r22
   2bcee:	ac 01       	movw	r20, r24
   2bcf0:	c3 57       	subi	r28, 0x73	; 115
   2bcf2:	de 4f       	sbci	r29, 0xFE	; 254
   2bcf4:	a8 81       	ld	r26, Y
   2bcf6:	b9 81       	ldd	r27, Y+1	; 0x01
   2bcf8:	cd 58       	subi	r28, 0x8D	; 141
   2bcfa:	d1 40       	sbci	r29, 0x01	; 1
   2bcfc:	6d 91       	ld	r22, X+
   2bcfe:	7d 91       	ld	r23, X+
   2bd00:	8d 91       	ld	r24, X+
   2bd02:	9c 91       	ld	r25, X
   2bd04:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   2bd08:	c3 57       	subi	r28, 0x73	; 115
   2bd0a:	de 4f       	sbci	r29, 0xFE	; 254
   2bd0c:	e8 81       	ld	r30, Y
   2bd0e:	f9 81       	ldd	r31, Y+1	; 0x01
   2bd10:	cd 58       	subi	r28, 0x8D	; 141
   2bd12:	d1 40       	sbci	r29, 0x01	; 1
   2bd14:	60 83       	st	Z, r22
   2bd16:	71 83       	std	Z+1, r23	; 0x01
   2bd18:	82 83       	std	Z+2, r24	; 0x02
   2bd1a:	93 83       	std	Z+3, r25	; 0x03
        y += CLAMP_median(shifts_y, blocks, norm);
   2bd1c:	40 e0       	ldi	r20, 0x00	; 0
   2bd1e:	50 e0       	ldi	r21, 0x00	; 0
   2bd20:	60 e0       	ldi	r22, 0x00	; 0
   2bd22:	7d e3       	ldi	r23, 0x3D	; 61
   2bd24:	ce 01       	movw	r24, r28
   2bd26:	8b 57       	subi	r24, 0x7B	; 123
   2bd28:	9f 4f       	sbci	r25, 0xFF	; 255
   2bd2a:	0f 94 b3 55 	call	0x2ab66	; 0x2ab66 <CLAMP_median(float*, unsigned char, float) [clone .constprop.82]>
   2bd2e:	9b 01       	movw	r18, r22
   2bd30:	ac 01       	movw	r20, r24
   2bd32:	c1 57       	subi	r28, 0x71	; 113
   2bd34:	de 4f       	sbci	r29, 0xFE	; 254
   2bd36:	a8 81       	ld	r26, Y
   2bd38:	b9 81       	ldd	r27, Y+1	; 0x01
   2bd3a:	cf 58       	subi	r28, 0x8F	; 143
   2bd3c:	d1 40       	sbci	r29, 0x01	; 1
   2bd3e:	6d 91       	ld	r22, X+
   2bd40:	7d 91       	ld	r23, X+
   2bd42:	8d 91       	ld	r24, X+
   2bd44:	9c 91       	ld	r25, X
   2bd46:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   2bd4a:	c1 57       	subi	r28, 0x71	; 113
   2bd4c:	de 4f       	sbci	r29, 0xFE	; 254
   2bd4e:	e8 81       	ld	r30, Y
   2bd50:	f9 81       	ldd	r31, Y+1	; 0x01
   2bd52:	cf 58       	subi	r28, 0x8F	; 143
   2bd54:	d1 40       	sbci	r29, 0x01	; 1
   2bd56:	60 83       	st	Z, r22
   2bd58:	71 83       	std	Z+1, r23	; 0x01
   2bd5a:	82 83       	std	Z+2, r24	; 0x02
   2bd5c:	93 83       	std	Z+3, r25	; 0x03
        r += CLAMP_median(shifts_r, blocks, norm * .5f);
   2bd5e:	40 e0       	ldi	r20, 0x00	; 0
   2bd60:	50 e0       	ldi	r21, 0x00	; 0
   2bd62:	60 e8       	ldi	r22, 0x80	; 128
   2bd64:	7c e3       	ldi	r23, 0x3C	; 60
   2bd66:	ce 01       	movw	r24, r28
   2bd68:	01 96       	adiw	r24, 0x01	; 1
   2bd6a:	0f 94 b3 55 	call	0x2ab66	; 0x2ab66 <CLAMP_median(float*, unsigned char, float) [clone .constprop.82]>
   2bd6e:	ce 56       	subi	r28, 0x6E	; 110
   2bd70:	de 4f       	sbci	r29, 0xFE	; 254
   2bd72:	a8 81       	ld	r26, Y
   2bd74:	b9 81       	ldd	r27, Y+1	; 0x01
   2bd76:	c2 59       	subi	r28, 0x92	; 146
   2bd78:	d1 40       	sbci	r29, 0x01	; 1
   2bd7a:	2d 91       	ld	r18, X+
   2bd7c:	3d 91       	ld	r19, X+
   2bd7e:	4d 91       	ld	r20, X+
   2bd80:	5c 91       	ld	r21, X
   2bd82:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   2bd86:	16 2f       	mov	r17, r22
   2bd88:	07 2f       	mov	r16, r23
   2bd8a:	f8 2e       	mov	r15, r24
   2bd8c:	e9 2e       	mov	r14, r25

		r = MAX(2, r);
   2bd8e:	20 e0       	ldi	r18, 0x00	; 0
   2bd90:	30 e0       	ldi	r19, 0x00	; 0
   2bd92:	40 e0       	ldi	r20, 0x00	; 0
   2bd94:	50 e4       	ldi	r21, 0x40	; 64
   2bd96:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   2bd9a:	18 16       	cp	r1, r24
   2bd9c:	2c f0       	brlt	.+10     	; 0x2bda8 <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char) [clone .constprop.79]+0x5be>
   2bd9e:	10 e0       	ldi	r17, 0x00	; 0
   2bda0:	00 e0       	ldi	r16, 0x00	; 0
   2bda2:	f1 2c       	mov	r15, r1
   2bda4:	80 e4       	ldi	r24, 0x40	; 64
   2bda6:	e8 2e       	mov	r14, r24
   2bda8:	a8 01       	movw	r20, r16
   2bdaa:	97 01       	movw	r18, r14
   2bdac:	85 2f       	mov	r24, r21
   2bdae:	90 2f       	mov	r25, r16
   2bdb0:	a3 2f       	mov	r26, r19
   2bdb2:	be 2d       	mov	r27, r14
   2bdb4:	ce 56       	subi	r28, 0x6E	; 110
   2bdb6:	de 4f       	sbci	r29, 0xFE	; 254
   2bdb8:	e8 81       	ld	r30, Y
   2bdba:	f9 81       	ldd	r31, Y+1	; 0x01
   2bdbc:	c2 59       	subi	r28, 0x92	; 146
   2bdbe:	d1 40       	sbci	r29, 0x01	; 1
   2bdc0:	80 83       	st	Z, r24
   2bdc2:	91 83       	std	Z+1, r25	; 0x01
   2bdc4:	a2 83       	std	Z+2, r26	; 0x02
   2bdc6:	b3 83       	std	Z+3, r27	; 0x03
   2bdc8:	cf 56       	subi	r28, 0x6F	; 111
   2bdca:	de 4f       	sbci	r29, 0xFE	; 254
   2bdcc:	f8 81       	ld	r31, Y
   2bdce:	c1 59       	subi	r28, 0x91	; 145
   2bdd0:	d1 40       	sbci	r29, 0x01	; 1
   2bdd2:	f1 50       	subi	r31, 0x01	; 1
   2bdd4:	cf 56       	subi	r28, 0x6F	; 111
   2bdd6:	de 4f       	sbci	r29, 0xFE	; 254
   2bdd8:	f8 83       	st	Y, r31
   2bdda:	c1 59       	subi	r28, 0x91	; 145
   2bddc:	d1 40       	sbci	r29, 0x01	; 1
	float shifts_y[blocks];
	float shifts_r[blocks];

	// DBG(_n(" [%f, %f][%f] start circle\n"), x, y, r);

	for (int8_t i = iterations; i > 0; --i){
   2bdde:	f1 11       	cpse	r31, r1
   2bde0:	37 cd       	rjmp	.-1426   	; 0x2b850 <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char) [clone .constprop.79]+0x66>

		r = MAX(2, r);

	}
    //@size=118
	DBG(_n(" [%f, %f][%f] final circle\n"), x, y, r);
   2bde2:	ef 92       	push	r14
   2bde4:	ff 92       	push	r15
   2bde6:	0f 93       	push	r16
   2bde8:	1f 93       	push	r17
   2bdea:	c1 57       	subi	r28, 0x71	; 113
   2bdec:	de 4f       	sbci	r29, 0xFE	; 254
   2bdee:	a8 81       	ld	r26, Y
   2bdf0:	b9 81       	ldd	r27, Y+1	; 0x01
   2bdf2:	cf 58       	subi	r28, 0x8F	; 143
   2bdf4:	d1 40       	sbci	r29, 0x01	; 1
   2bdf6:	13 96       	adiw	r26, 0x03	; 3
   2bdf8:	8c 91       	ld	r24, X
   2bdfa:	13 97       	sbiw	r26, 0x03	; 3
   2bdfc:	8f 93       	push	r24
   2bdfe:	12 96       	adiw	r26, 0x02	; 2
   2be00:	8c 91       	ld	r24, X
   2be02:	12 97       	sbiw	r26, 0x02	; 2
   2be04:	8f 93       	push	r24
   2be06:	11 96       	adiw	r26, 0x01	; 1
   2be08:	8c 91       	ld	r24, X
   2be0a:	11 97       	sbiw	r26, 0x01	; 1
   2be0c:	8f 93       	push	r24
   2be0e:	8c 91       	ld	r24, X
   2be10:	8f 93       	push	r24
   2be12:	c3 57       	subi	r28, 0x73	; 115
   2be14:	de 4f       	sbci	r29, 0xFE	; 254
   2be16:	e8 81       	ld	r30, Y
   2be18:	f9 81       	ldd	r31, Y+1	; 0x01
   2be1a:	cd 58       	subi	r28, 0x8D	; 141
   2be1c:	d1 40       	sbci	r29, 0x01	; 1
   2be1e:	83 81       	ldd	r24, Z+3	; 0x03
   2be20:	8f 93       	push	r24
   2be22:	82 81       	ldd	r24, Z+2	; 0x02
   2be24:	8f 93       	push	r24
   2be26:	81 81       	ldd	r24, Z+1	; 0x01
   2be28:	8f 93       	push	r24
   2be2a:	80 81       	ld	r24, Z
   2be2c:	8f 93       	push	r24
   2be2e:	85 ee       	ldi	r24, 0xE5	; 229
   2be30:	9c e9       	ldi	r25, 0x9C	; 156
   2be32:	9f 93       	push	r25
   2be34:	8f 93       	push	r24
   2be36:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   2be3a:	0f b6       	in	r0, 0x3f	; 63
   2be3c:	f8 94       	cli
   2be3e:	de bf       	out	0x3e, r29	; 62
   2be40:	0f be       	out	0x3f, r0	; 63
   2be42:	cd bf       	out	0x3d, r28	; 61
}
   2be44:	c3 54       	subi	r28, 0x43	; 67
   2be46:	de 4f       	sbci	r29, 0xFE	; 254
   2be48:	0f b6       	in	r0, 0x3f	; 63
   2be4a:	f8 94       	cli
   2be4c:	de bf       	out	0x3e, r29	; 62
   2be4e:	0f be       	out	0x3f, r0	; 63
   2be50:	cd bf       	out	0x3d, r28	; 61
   2be52:	df 91       	pop	r29
   2be54:	cf 91       	pop	r28
   2be56:	1f 91       	pop	r17
   2be58:	0f 91       	pop	r16
   2be5a:	ff 90       	pop	r15
   2be5c:	ef 90       	pop	r14
   2be5e:	df 90       	pop	r13
   2be60:	cf 90       	pop	r12
   2be62:	bf 90       	pop	r11
   2be64:	af 90       	pop	r10
   2be66:	9f 90       	pop	r9
   2be68:	8f 90       	pop	r8
   2be6a:	7f 90       	pop	r7
   2be6c:	6f 90       	pop	r6
   2be6e:	5f 90       	pop	r5
   2be70:	4f 90       	pop	r4
   2be72:	3f 90       	pop	r3
   2be74:	2f 90       	pop	r2
   2be76:	08 95       	ret

/// returns value of any location within data
/// uses bilinear interpolation
float get_value(uint8_t * matrix_32x32, float c, float r){
	if (c <= 0 || r <= 0 || c >= 31 || r >= 31)
		return 0;
   2be78:	60 e0       	ldi	r22, 0x00	; 0
   2be7a:	70 e0       	ldi	r23, 0x00	; 0
   2be7c:	cb 01       	movw	r24, r22
   2be7e:	d5 ce       	rjmp	.-598    	; 0x2bc2a <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char) [clone .constprop.79]+0x440>

0002be80 <go_start_stop(unsigned char, unsigned char, int, unsigned int, unsigned int) [clone .part.2] [clone .constprop.70]>:
		accelerate_1_step(axes, -dec, delay_us, delay_us);
		update_position_1_step(axes, dir);
	}
}

void go_start_stop(uint8_t axes, uint8_t dir, int16_t acc, uint16_t min_delay_us, uint16_t steps){
   2be80:	ef 92       	push	r14
   2be82:	ff 92       	push	r15
   2be84:	0f 93       	push	r16
   2be86:	1f 93       	push	r17
   2be88:	cf 93       	push	r28
   2be8a:	df 93       	push	r29
   2be8c:	1f 92       	push	r1
   2be8e:	1f 92       	push	r1
   2be90:	cd b7       	in	r28, 0x3d	; 61
   2be92:	de b7       	in	r29, 0x3e	; 62
   2be94:	f8 2e       	mov	r15, r24
   2be96:	e6 2e       	mov	r14, r22
	if (steps == 0)
		return;
	uint16_t current_delay_us = MAX_DELAY;
   2be98:	80 e1       	ldi	r24, 0x10	; 16
   2be9a:	97 e2       	ldi	r25, 0x27	; 39
   2be9c:	9a 83       	std	Y+2, r25	; 0x02
   2be9e:	89 83       	std	Y+1, r24	; 0x01
	const uint16_t half = steps / 2;
   2bea0:	8a 01       	movw	r16, r20
   2bea2:	16 95       	lsr	r17
   2bea4:	07 95       	ror	r16
}

/// Goes defined number of steps while accelerating
/// updates global positions
void accelerate(uint8_t axes, uint8_t dir, int16_t acc, uint16_t &delay_us, uint16_t min_delay_us, uint16_t steps){
	set_axes_dir(axes, dir);
   2bea6:	8f 2d       	mov	r24, r15
   2bea8:	0e 94 76 d5 	call	0x1aaec	; 0x1aaec <set_axes_dir(unsigned char, unsigned char) [clone .lto_priv.380]>
	while (steps--){
   2beac:	01 50       	subi	r16, 0x01	; 1
   2beae:	11 09       	sbc	r17, r1
   2beb0:	78 f0       	brcs	.+30     	; 0x2bed0 <go_start_stop(unsigned char, unsigned char, int, unsigned int, unsigned int) [clone .part.2] [clone .constprop.70]+0x50>
		accelerate_1_step(axes, acc, delay_us, min_delay_us);
   2beb2:	28 ec       	ldi	r18, 0xC8	; 200
   2beb4:	30 e0       	ldi	r19, 0x00	; 0
   2beb6:	ae 01       	movw	r20, r28
   2beb8:	4f 5f       	subi	r20, 0xFF	; 255
   2beba:	5f 4f       	sbci	r21, 0xFF	; 255
   2bebc:	68 ee       	ldi	r22, 0xE8	; 232
   2bebe:	73 e0       	ldi	r23, 0x03	; 3
   2bec0:	8f 2d       	mov	r24, r15
   2bec2:	0e 94 45 d4 	call	0x1a88a	; 0x1a88a <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)>
		update_position_1_step(axes, dir);
   2bec6:	6e 2d       	mov	r22, r14
   2bec8:	8f 2d       	mov	r24, r15
   2beca:	0e 94 8f d5 	call	0x1ab1e	; 0x1ab1e <update_position_1_step(unsigned char, unsigned char) [clone .lto_priv.379]>
   2bece:	ee cf       	rjmp	.-36     	; 0x2beac <go_start_stop(unsigned char, unsigned char, int, unsigned int, unsigned int) [clone .part.2] [clone .constprop.70]+0x2c>
}

/// \param dir sets direction of movement
/// updates global positions
void go_and_stop(uint8_t axes, uint8_t dir, int16_t dec, uint16_t &delay_us, uint16_t steps){
	set_axes_dir(axes, dir);
   2bed0:	6e 2d       	mov	r22, r14
   2bed2:	8f 2d       	mov	r24, r15
   2bed4:	0e 94 76 d5 	call	0x1aaec	; 0x1aaec <set_axes_dir(unsigned char, unsigned char) [clone .lto_priv.380]>
		return;
	uint16_t current_delay_us = MAX_DELAY;
	const uint16_t half = steps / 2;
	accelerate(axes, dir, acc, current_delay_us, min_delay_us, half);
	go_and_stop(axes, dir, -acc, current_delay_us, steps - half);
}
   2bed8:	0f 90       	pop	r0
   2beda:	0f 90       	pop	r0
   2bedc:	df 91       	pop	r29
   2bede:	cf 91       	pop	r28
   2bee0:	1f 91       	pop	r17
   2bee2:	0f 91       	pop	r16
   2bee4:	ff 90       	pop	r15
   2bee6:	ef 90       	pop	r14
   2bee8:	08 95       	ret

0002beea <xyzcal_spiral2(int, int, int, int, int, int, unsigned int, signed char, unsigned int*) [clone .constprop.66]>:
/// Moves printer to absolute position [x,y,z] defined in millimeters
bool xyzcal_lineXYZ_to_float(pos_mm_t x, pos_mm_t y, pos_mm_t z, uint16_t delay_us, int8_t check_pinda){
	return xyzcal_lineXYZ_to(mm_2_pos(x), mm_2_pos(y), mm_2_pos(z), delay_us, check_pinda);
}

bool xyzcal_spiral2(int16_t cx, int16_t cy, int16_t z0, int16_t dz, int16_t radius, int16_t rotation, uint16_t delay_us, int8_t check_pinda, uint16_t* pad)
   2beea:	2f 92       	push	r2
   2beec:	3f 92       	push	r3
   2beee:	4f 92       	push	r4
   2bef0:	5f 92       	push	r5
   2bef2:	6f 92       	push	r6
   2bef4:	7f 92       	push	r7
   2bef6:	8f 92       	push	r8
   2bef8:	9f 92       	push	r9
   2befa:	af 92       	push	r10
   2befc:	bf 92       	push	r11
   2befe:	cf 92       	push	r12
   2bf00:	df 92       	push	r13
   2bf02:	ef 92       	push	r14
   2bf04:	ff 92       	push	r15
   2bf06:	0f 93       	push	r16
   2bf08:	1f 93       	push	r17
   2bf0a:	cf 93       	push	r28
   2bf0c:	df 93       	push	r29
   2bf0e:	cd b7       	in	r28, 0x3d	; 61
   2bf10:	de b7       	in	r29, 0x3e	; 62
   2bf12:	6c 97       	sbiw	r28, 0x1c	; 28
   2bf14:	0f b6       	in	r0, 0x3f	; 63
   2bf16:	f8 94       	cli
   2bf18:	de bf       	out	0x3e, r29	; 62
   2bf1a:	0f be       	out	0x3f, r0	; 63
   2bf1c:	cd bf       	out	0x3d, r28	; 61
   2bf1e:	6c 01       	movw	r12, r24
   2bf20:	5b 01       	movw	r10, r22
   2bf22:	4a 01       	movw	r8, r20
   2bf24:	19 01       	movw	r2, r18
   2bf26:	18 87       	std	Y+8, r17	; 0x08
   2bf28:	0f 83       	std	Y+7, r16	; 0x07
   2bf2a:	fa 82       	std	Y+2, r15	; 0x02
   2bf2c:	e9 82       	std	Y+1, r14	; 0x01
	uint8_t dad = 0; //delta angle [deg]
	uint8_t dad_min = 4; //delta angle min [deg]
	uint8_t dad_max = 16; //delta angle max [deg]
	uint8_t k = 720 / (dad_max - dad_min); //delta calculation constant
	ad = 0;
	if (pad) ad = *pad % 720;
   2bf2e:	d7 01       	movw	r26, r14
   2bf30:	8d 91       	ld	r24, X+
   2bf32:	9c 91       	ld	r25, X
   2bf34:	60 ed       	ldi	r22, 0xD0	; 208
   2bf36:	72 e0       	ldi	r23, 0x02	; 2
   2bf38:	0f 94 a9 a4 	call	0x34952	; 0x34952 <__udivmodhi4>
   2bf3c:	9c 8f       	std	Y+28, r25	; 0x1c
   2bf3e:	8b 8f       	std	Y+27, r24	; 0x1b

    //@size=214
	DBG(_n("xyzcal_spiral2 cx=%d cy=%d z0=%d dz=%d radius=%d ad=%d\n"), cx, cy, z0, dz, radius, ad);
   2bf40:	9f 93       	push	r25
   2bf42:	8f 93       	push	r24
   2bf44:	3f 92       	push	r3
   2bf46:	2f 93       	push	r18
   2bf48:	1f 92       	push	r1
   2bf4a:	84 e6       	ldi	r24, 0x64	; 100
   2bf4c:	8f 93       	push	r24
   2bf4e:	9f 92       	push	r9
   2bf50:	8f 92       	push	r8
   2bf52:	bf 92       	push	r11
   2bf54:	af 92       	push	r10
   2bf56:	df 92       	push	r13
   2bf58:	cf 92       	push	r12
   2bf5a:	83 e6       	ldi	r24, 0x63	; 99
   2bf5c:	9c e9       	ldi	r25, 0x9C	; 156
   2bf5e:	9f 93       	push	r25
   2bf60:	8f 93       	push	r24
   2bf62:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   2bf66:	0f b6       	in	r0, 0x3f	; 63
   2bf68:	f8 94       	cli
   2bf6a:	de bf       	out	0x3e, r29	; 62
   2bf6c:	0f be       	out	0x3f, r0	; 63
   2bf6e:	cd bf       	out	0x3d, r28	; 61
			r = (float)(((uint32_t)ad) * radius) / 720;
		}
		else
		{
			dad = dad_max - ((719 - ad) / k);
			r = (float)(((uint32_t)(719 - ad)) * (-radius)) / 720;
   2bf70:	22 27       	eor	r18, r18
   2bf72:	33 27       	eor	r19, r19
   2bf74:	22 19       	sub	r18, r2
   2bf76:	33 09       	sbc	r19, r3
   2bf78:	3a 8f       	std	Y+26, r19	; 0x1a
   2bf7a:	29 8f       	std	Y+25, r18	; 0x19
		}
		ar = radians(ad + rotation);
		int x = (int)(cx + (cos(ar) * r));
		int y = (int)(cy + (sin(ar) * r));
		int z = (int)(z0 - ((float)((int32_t)dz * ad) / 720));
   2bf7c:	c4 01       	movw	r24, r8
   2bf7e:	99 0c       	add	r9, r9
   2bf80:	aa 0b       	sbc	r26, r26
   2bf82:	bb 0b       	sbc	r27, r27
   2bf84:	89 87       	std	Y+9, r24	; 0x09
   2bf86:	9a 87       	std	Y+10, r25	; 0x0a
   2bf88:	ab 87       	std	Y+11, r26	; 0x0b
   2bf8a:	bc 87       	std	Y+12, r27	; 0x0c
			dad = dad_max - ((719 - ad) / k);
			r = (float)(((uint32_t)(719 - ad)) * (-radius)) / 720;
		}
		ar = radians(ad + rotation);
		int x = (int)(cx + (cos(ar) * r));
		int y = (int)(cy + (sin(ar) * r));
   2bf8c:	95 01       	movw	r18, r10
   2bf8e:	bb 0c       	add	r11, r11
   2bf90:	44 0b       	sbc	r20, r20
   2bf92:	55 0b       	sbc	r21, r21
   2bf94:	29 8b       	std	Y+17, r18	; 0x11
   2bf96:	3a 8b       	std	Y+18, r19	; 0x12
   2bf98:	4b 8b       	std	Y+19, r20	; 0x13
   2bf9a:	5c 8b       	std	Y+20, r21	; 0x14
		{
			dad = dad_max - ((719 - ad) / k);
			r = (float)(((uint32_t)(719 - ad)) * (-radius)) / 720;
		}
		ar = radians(ad + rotation);
		int x = (int)(cx + (cos(ar) * r));
   2bf9c:	c6 01       	movw	r24, r12
   2bf9e:	dd 0c       	add	r13, r13
   2bfa0:	aa 0b       	sbc	r26, r26
   2bfa2:	bb 0b       	sbc	r27, r27
   2bfa4:	8d 8b       	std	Y+21, r24	; 0x15
   2bfa6:	9e 8b       	std	Y+22, r25	; 0x16
   2bfa8:	af 8b       	std	Y+23, r26	; 0x17
   2bfaa:	b8 8f       	std	Y+24, r27	; 0x18
	// snprintf(text, 10, "%4d", z0);
	// lcd_print(text);

	for (; ad < 720; ad++)
	{
		if (radius > 0)
   2bfac:	12 14       	cp	r1, r2
   2bfae:	13 04       	cpc	r1, r3
   2bfb0:	0c f0       	brlt	.+2      	; 0x2bfb4 <xyzcal_spiral2(int, int, int, int, int, int, unsigned int, signed char, unsigned int*) [clone .constprop.66]+0xca>
   2bfb2:	ba c0       	rjmp	.+372    	; 0x2c128 <xyzcal_spiral2(int, int, int, int, int, int, unsigned int, signed char, unsigned int*) [clone .constprop.66]+0x23e>
		{
			dad = dad_max - (ad / k);
   2bfb4:	8b 8d       	ldd	r24, Y+27	; 0x1b
   2bfb6:	9c 8d       	ldd	r25, Y+28	; 0x1c
   2bfb8:	6c e3       	ldi	r22, 0x3C	; 60
   2bfba:	70 e0       	ldi	r23, 0x00	; 0
   2bfbc:	0f 94 a9 a4 	call	0x34952	; 0x34952 <__udivmodhi4>
   2bfc0:	10 e1       	ldi	r17, 0x10	; 16
   2bfc2:	16 1b       	sub	r17, r22
			r = (float)(((uint32_t)ad) * radius) / 720;
   2bfc4:	2b 8d       	ldd	r18, Y+27	; 0x1b
   2bfc6:	3c 8d       	ldd	r19, Y+28	; 0x1c
   2bfc8:	d1 01       	movw	r26, r2
		}
		else
		{
			dad = dad_max - ((719 - ad) / k);
			r = (float)(((uint32_t)(719 - ad)) * (-radius)) / 720;
   2bfca:	0f 94 00 a5 	call	0x34a00	; 0x34a00 <__usmulhisi3>
   2bfce:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   2bfd2:	20 e0       	ldi	r18, 0x00	; 0
   2bfd4:	30 e0       	ldi	r19, 0x00	; 0
   2bfd6:	44 e3       	ldi	r20, 0x34	; 52
   2bfd8:	54 e4       	ldi	r21, 0x44	; 68
   2bfda:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   2bfde:	6b 01       	movw	r12, r22
   2bfe0:	7c 01       	movw	r14, r24
		}
		ar = radians(ad + rotation);
   2bfe2:	6f 81       	ldd	r22, Y+7	; 0x07
   2bfe4:	78 85       	ldd	r23, Y+8	; 0x08
   2bfe6:	eb 8d       	ldd	r30, Y+27	; 0x1b
   2bfe8:	fc 8d       	ldd	r31, Y+28	; 0x1c
   2bfea:	6e 0f       	add	r22, r30
   2bfec:	7f 1f       	adc	r23, r31
   2bfee:	90 e0       	ldi	r25, 0x00	; 0
   2bff0:	80 e0       	ldi	r24, 0x00	; 0
   2bff2:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   2bff6:	25 e3       	ldi	r18, 0x35	; 53
   2bff8:	3a ef       	ldi	r19, 0xFA	; 250
   2bffa:	4e e8       	ldi	r20, 0x8E	; 142
   2bffc:	5c e3       	ldi	r21, 0x3C	; 60
   2bffe:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2c002:	4b 01       	movw	r8, r22
   2c004:	5c 01       	movw	r10, r24
		int x = (int)(cx + (cos(ar) * r));
   2c006:	0f 94 02 a6 	call	0x34c04	; 0x34c04 <cos>
   2c00a:	6b 83       	std	Y+3, r22	; 0x03
   2c00c:	7c 83       	std	Y+4, r23	; 0x04
   2c00e:	8d 83       	std	Y+5, r24	; 0x05
   2c010:	9e 83       	std	Y+6, r25	; 0x06
		int y = (int)(cy + (sin(ar) * r));
   2c012:	c5 01       	movw	r24, r10
   2c014:	b4 01       	movw	r22, r8
   2c016:	0f 94 c8 a8 	call	0x35190	; 0x35190 <sin>
   2c01a:	2b 01       	movw	r4, r22
   2c01c:	3c 01       	movw	r6, r24
		int z = (int)(z0 - ((float)((int32_t)dz * ad) / 720));
   2c01e:	69 85       	ldd	r22, Y+9	; 0x09
   2c020:	7a 85       	ldd	r23, Y+10	; 0x0a
   2c022:	8b 85       	ldd	r24, Y+11	; 0x0b
   2c024:	9c 85       	ldd	r25, Y+12	; 0x0c
   2c026:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   2c02a:	4b 01       	movw	r8, r22
   2c02c:	5c 01       	movw	r10, r24
   2c02e:	2b 8d       	ldd	r18, Y+27	; 0x1b
   2c030:	3c 8d       	ldd	r19, Y+28	; 0x1c
   2c032:	a4 e6       	ldi	r26, 0x64	; 100
   2c034:	b0 e0       	ldi	r27, 0x00	; 0
   2c036:	0f 94 80 a4 	call	0x34900	; 0x34900 <__umulhisi3>
   2c03a:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   2c03e:	20 e0       	ldi	r18, 0x00	; 0
   2c040:	30 e0       	ldi	r19, 0x00	; 0
   2c042:	44 e3       	ldi	r20, 0x34	; 52
   2c044:	54 e4       	ldi	r21, 0x44	; 68
   2c046:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   2c04a:	9b 01       	movw	r18, r22
   2c04c:	ac 01       	movw	r20, r24
   2c04e:	c5 01       	movw	r24, r10
   2c050:	b4 01       	movw	r22, r8
   2c052:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   2c056:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   2c05a:	6d 87       	std	Y+13, r22	; 0x0d
   2c05c:	7e 87       	std	Y+14, r23	; 0x0e
   2c05e:	8f 87       	std	Y+15, r24	; 0x0f
   2c060:	98 8b       	std	Y+16, r25	; 0x10
			dad = dad_max - ((719 - ad) / k);
			r = (float)(((uint32_t)(719 - ad)) * (-radius)) / 720;
		}
		ar = radians(ad + rotation);
		int x = (int)(cx + (cos(ar) * r));
		int y = (int)(cy + (sin(ar) * r));
   2c062:	69 89       	ldd	r22, Y+17	; 0x11
   2c064:	7a 89       	ldd	r23, Y+18	; 0x12
   2c066:	8b 89       	ldd	r24, Y+19	; 0x13
   2c068:	9c 89       	ldd	r25, Y+20	; 0x14
   2c06a:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   2c06e:	4b 01       	movw	r8, r22
   2c070:	5c 01       	movw	r10, r24
   2c072:	a3 01       	movw	r20, r6
   2c074:	92 01       	movw	r18, r4
   2c076:	c7 01       	movw	r24, r14
   2c078:	b6 01       	movw	r22, r12
   2c07a:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2c07e:	9b 01       	movw	r18, r22
   2c080:	ac 01       	movw	r20, r24
   2c082:	c5 01       	movw	r24, r10
   2c084:	b4 01       	movw	r22, r8
   2c086:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   2c08a:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   2c08e:	4b 01       	movw	r8, r22
		{
			dad = dad_max - ((719 - ad) / k);
			r = (float)(((uint32_t)(719 - ad)) * (-radius)) / 720;
		}
		ar = radians(ad + rotation);
		int x = (int)(cx + (cos(ar) * r));
   2c090:	6d 89       	ldd	r22, Y+21	; 0x15
   2c092:	7e 89       	ldd	r23, Y+22	; 0x16
   2c094:	8f 89       	ldd	r24, Y+23	; 0x17
   2c096:	98 8d       	ldd	r25, Y+24	; 0x18
   2c098:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   2c09c:	2b 01       	movw	r4, r22
   2c09e:	3c 01       	movw	r6, r24
   2c0a0:	a7 01       	movw	r20, r14
   2c0a2:	96 01       	movw	r18, r12
   2c0a4:	6b 81       	ldd	r22, Y+3	; 0x03
   2c0a6:	7c 81       	ldd	r23, Y+4	; 0x04
   2c0a8:	8d 81       	ldd	r24, Y+5	; 0x05
   2c0aa:	9e 81       	ldd	r25, Y+6	; 0x06
   2c0ac:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2c0b0:	9b 01       	movw	r18, r22
   2c0b2:	ac 01       	movw	r20, r24
   2c0b4:	c3 01       	movw	r24, r6
   2c0b6:	b2 01       	movw	r22, r4
   2c0b8:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   2c0bc:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   2c0c0:	cb 01       	movw	r24, r22
		int y = (int)(cy + (sin(ar) * r));
		int z = (int)(z0 - ((float)((int32_t)dz * ad) / 720));
		if (xyzcal_lineXYZ_to(x, y, z, delay_us, check_pinda))
   2c0c2:	01 e0       	ldi	r16, 0x01	; 1
   2c0c4:	20 e4       	ldi	r18, 0x40	; 64
   2c0c6:	31 e0       	ldi	r19, 0x01	; 1
   2c0c8:	4d 85       	ldd	r20, Y+13	; 0x0d
   2c0ca:	5e 85       	ldd	r21, Y+14	; 0x0e
   2c0cc:	b4 01       	movw	r22, r8
   2c0ce:	0e 94 cf d5 	call	0x1ab9e	; 0x1ab9e <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)>
   2c0d2:	21 2f       	mov	r18, r17
   2c0d4:	30 e0       	ldi	r19, 0x00	; 0
   2c0d6:	88 23       	and	r24, r24
   2c0d8:	b9 f1       	breq	.+110    	; 0x2c148 <xyzcal_spiral2(int, int, int, int, int, int, unsigned int, signed char, unsigned int*) [clone .constprop.66]+0x25e>
   2c0da:	4b 8d       	ldd	r20, Y+27	; 0x1b
   2c0dc:	5c 8d       	ldd	r21, Y+28	; 0x1c
   2c0de:	42 0f       	add	r20, r18
   2c0e0:	53 1f       	adc	r21, r19
		{
			ad += dad + 1;
   2c0e2:	4f 5f       	subi	r20, 0xFF	; 255
   2c0e4:	5f 4f       	sbci	r21, 0xFF	; 255
   2c0e6:	5c 8f       	std	Y+28, r21	; 0x1c
   2c0e8:	4b 8f       	std	Y+27, r20	; 0x1b
			ret = true;
			break;
		}
		ad += dad;
	}
	if (pad) *pad = ad;
   2c0ea:	eb 8d       	ldd	r30, Y+27	; 0x1b
   2c0ec:	fc 8d       	ldd	r31, Y+28	; 0x1c
   2c0ee:	a9 81       	ldd	r26, Y+1	; 0x01
   2c0f0:	ba 81       	ldd	r27, Y+2	; 0x02
   2c0f2:	ed 93       	st	X+, r30
   2c0f4:	fc 93       	st	X, r31
	// if(ret){
	// 	lcd_set_cursor(0, 4);
	// 	lcd_print("         ");
	// }
	return ret;
}
   2c0f6:	6c 96       	adiw	r28, 0x1c	; 28
   2c0f8:	0f b6       	in	r0, 0x3f	; 63
   2c0fa:	f8 94       	cli
   2c0fc:	de bf       	out	0x3e, r29	; 62
   2c0fe:	0f be       	out	0x3f, r0	; 63
   2c100:	cd bf       	out	0x3d, r28	; 61
   2c102:	df 91       	pop	r29
   2c104:	cf 91       	pop	r28
   2c106:	1f 91       	pop	r17
   2c108:	0f 91       	pop	r16
   2c10a:	ff 90       	pop	r15
   2c10c:	ef 90       	pop	r14
   2c10e:	df 90       	pop	r13
   2c110:	cf 90       	pop	r12
   2c112:	bf 90       	pop	r11
   2c114:	af 90       	pop	r10
   2c116:	9f 90       	pop	r9
   2c118:	8f 90       	pop	r8
   2c11a:	7f 90       	pop	r7
   2c11c:	6f 90       	pop	r6
   2c11e:	5f 90       	pop	r5
   2c120:	4f 90       	pop	r4
   2c122:	3f 90       	pop	r3
   2c124:	2f 90       	pop	r2
   2c126:	08 95       	ret
			dad = dad_max - (ad / k);
			r = (float)(((uint32_t)ad) * radius) / 720;
		}
		else
		{
			dad = dad_max - ((719 - ad) / k);
   2c128:	2f ec       	ldi	r18, 0xCF	; 207
   2c12a:	32 e0       	ldi	r19, 0x02	; 2
   2c12c:	ab 8d       	ldd	r26, Y+27	; 0x1b
   2c12e:	bc 8d       	ldd	r27, Y+28	; 0x1c
   2c130:	2a 1b       	sub	r18, r26
   2c132:	3b 0b       	sbc	r19, r27
   2c134:	c9 01       	movw	r24, r18
   2c136:	6c e3       	ldi	r22, 0x3C	; 60
   2c138:	70 e0       	ldi	r23, 0x00	; 0
   2c13a:	0f 94 a9 a4 	call	0x34952	; 0x34952 <__udivmodhi4>
   2c13e:	10 e1       	ldi	r17, 0x10	; 16
   2c140:	16 1b       	sub	r17, r22
			r = (float)(((uint32_t)(719 - ad)) * (-radius)) / 720;
   2c142:	a9 8d       	ldd	r26, Y+25	; 0x19
   2c144:	ba 8d       	ldd	r27, Y+26	; 0x1a
   2c146:	41 cf       	rjmp	.-382    	; 0x2bfca <xyzcal_spiral2(int, int, int, int, int, int, unsigned int, signed char, unsigned int*) [clone .constprop.66]+0xe0>
	// lcd_set_cursor(0, 4);
	// char text[10];
	// snprintf(text, 10, "%4d", z0);
	// lcd_print(text);

	for (; ad < 720; ad++)
   2c148:	2f 5f       	subi	r18, 0xFF	; 255
   2c14a:	3f 4f       	sbci	r19, 0xFF	; 255
   2c14c:	ab 8d       	ldd	r26, Y+27	; 0x1b
   2c14e:	bc 8d       	ldd	r27, Y+28	; 0x1c
   2c150:	a2 0f       	add	r26, r18
   2c152:	b3 1f       	adc	r27, r19
   2c154:	bc 8f       	std	Y+28, r27	; 0x1c
   2c156:	ab 8f       	std	Y+27, r26	; 0x1b
   2c158:	a0 3d       	cpi	r26, 0xD0	; 208
   2c15a:	b2 40       	sbci	r27, 0x02	; 2
   2c15c:	08 f4       	brcc	.+2      	; 0x2c160 <xyzcal_spiral2(int, int, int, int, int, int, unsigned int, signed char, unsigned int*) [clone .constprop.66]+0x276>
   2c15e:	26 cf       	rjmp	.-436    	; 0x2bfac <xyzcal_spiral2(int, int, int, int, int, int, unsigned int, signed char, unsigned int*) [clone .constprop.66]+0xc2>
   2c160:	c4 cf       	rjmp	.-120    	; 0x2c0ea <xyzcal_spiral2(int, int, int, int, int, int, unsigned int, signed char, unsigned int*) [clone .constprop.66]+0x200>

0002c162 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]>:
	length = z - _Z;
	go_start_stop(Z_AXIS_MASK, length < 0 ? Z_MINUS_MASK : Z_PLUS_MASK, acc, min_delay_us, ABS(length));
	// DBG(_n("\n"));
}

void __attribute__((noinline)) xyzcal_scan_pixels_32x32_Zhop(int16_t cx, int16_t cy, int16_t min_z, int16_t max_z, uint16_t delay_us, uint8_t *pixels){
   2c162:	2f 92       	push	r2
   2c164:	3f 92       	push	r3
   2c166:	4f 92       	push	r4
   2c168:	5f 92       	push	r5
   2c16a:	6f 92       	push	r6
   2c16c:	7f 92       	push	r7
   2c16e:	8f 92       	push	r8
   2c170:	9f 92       	push	r9
   2c172:	af 92       	push	r10
   2c174:	bf 92       	push	r11
   2c176:	cf 92       	push	r12
   2c178:	df 92       	push	r13
   2c17a:	ef 92       	push	r14
   2c17c:	ff 92       	push	r15
   2c17e:	0f 93       	push	r16
   2c180:	1f 93       	push	r17
   2c182:	cf 93       	push	r28
   2c184:	df 93       	push	r29
   2c186:	cd b7       	in	r28, 0x3d	; 61
   2c188:	de b7       	in	r29, 0x3e	; 62
   2c18a:	ca 55       	subi	r28, 0x5A	; 90
   2c18c:	d1 09       	sbc	r29, r1
   2c18e:	0f b6       	in	r0, 0x3f	; 63
   2c190:	f8 94       	cli
   2c192:	de bf       	out	0x3e, r29	; 62
   2c194:	0f be       	out	0x3f, r0	; 63
   2c196:	cd bf       	out	0x3d, r28	; 61
   2c198:	63 96       	adiw	r28, 0x13	; 19
   2c19a:	9f af       	std	Y+63, r25	; 0x3f
   2c19c:	8e af       	std	Y+62, r24	; 0x3e
   2c19e:	63 97       	sbiw	r28, 0x13	; 19
   2c1a0:	8b 01       	movw	r16, r22
   2c1a2:	6a 01       	movw	r12, r20
	if (!pixels)
		return;
	int16_t z_trig;
	uint16_t line_buffer[32];
	uint16_t current_delay_us = MAX_DELAY; ///< defines current speed
   2c1a4:	7e 01       	movw	r14, r28
   2c1a6:	25 e4       	ldi	r18, 0x45	; 69
   2c1a8:	e2 0e       	add	r14, r18
   2c1aa:	f1 1c       	adc	r15, r1
   2c1ac:	80 e1       	ldi	r24, 0x10	; 16
   2c1ae:	97 e2       	ldi	r25, 0x27	; 39
   2c1b0:	f7 01       	movw	r30, r14
   2c1b2:	91 83       	std	Z+1, r25	; 0x01
   2c1b4:	80 83       	st	Z, r24
	int16_t start_z;
	uint16_t steps_to_go;

	DBG(_n("Scan countdown: "));
   2c1b6:	80 eb       	ldi	r24, 0xB0	; 176
   2c1b8:	9c e9       	ldi	r25, 0x9C	; 156
   2c1ba:	9f 93       	push	r25
   2c1bc:	8f 93       	push	r24
   2c1be:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   2c1c2:	2e e5       	ldi	r18, 0x5E	; 94
   2c1c4:	36 e0       	ldi	r19, 0x06	; 6
   2c1c6:	61 96       	adiw	r28, 0x11	; 17
   2c1c8:	3f af       	std	Y+63, r19	; 0x3f
   2c1ca:	2e af       	std	Y+62, r18	; 0x3e
   2c1cc:	61 97       	sbiw	r28, 0x11	; 17
   2c1ce:	c8 01       	movw	r24, r16
   2c1d0:	80 5e       	subi	r24, 0xE0	; 224
   2c1d2:	93 40       	sbci	r25, 0x03	; 3
   2c1d4:	2b 96       	adiw	r28, 0x0b	; 11
   2c1d6:	9f af       	std	Y+63, r25	; 0x3f
   2c1d8:	8e af       	std	Y+62, r24	; 0x3e
   2c1da:	2b 97       	sbiw	r28, 0x0b	; 11
   2c1dc:	0f 90       	pop	r0
   2c1de:	0f 90       	pop	r0
   2c1e0:	e0 e4       	ldi	r30, 0x40	; 64
   2c1e2:	f0 e0       	ldi	r31, 0x00	; 0
   2c1e4:	29 96       	adiw	r28, 0x09	; 9
   2c1e6:	ff af       	std	Y+63, r31	; 0x3f
   2c1e8:	ee af       	std	Y+62, r30	; 0x3e
   2c1ea:	29 97       	sbiw	r28, 0x09	; 9

	for (uint8_t r = 0; r < 32; r++){ ///< Y axis
		for (uint8_t d = 0; d < 2; ++d){
			go_manhattan((d & 1) ? (cx + 992) : (cx - 992), cy - 992 + r * 64, _Z, Z_ACCEL, Z_MIN_DELAY);
   2c1ec:	63 96       	adiw	r28, 0x13	; 19
   2c1ee:	2e ad       	ldd	r18, Y+62	; 0x3e
   2c1f0:	3f ad       	ldd	r19, Y+63	; 0x3f
   2c1f2:	63 97       	sbiw	r28, 0x13	; 19
   2c1f4:	20 5e       	subi	r18, 0xE0	; 224
   2c1f6:	33 40       	sbci	r19, 0x03	; 3
   2c1f8:	69 96       	adiw	r28, 0x19	; 25
   2c1fa:	3f af       	std	Y+63, r19	; 0x3f
   2c1fc:	2e af       	std	Y+62, r18	; 0x3e
   2c1fe:	69 97       	sbiw	r28, 0x19	; 25
   2c200:	29 96       	adiw	r28, 0x09	; 9
   2c202:	4e ac       	ldd	r4, Y+62	; 0x3e
   2c204:	5f ac       	ldd	r5, Y+63	; 0x3f
   2c206:	29 97       	sbiw	r28, 0x09	; 9
	uint16_t steps_to_go;

	DBG(_n("Scan countdown: "));

	for (uint8_t r = 0; r < 32; r++){ ///< Y axis
		for (uint8_t d = 0; d < 2; ++d){
   2c208:	31 2c       	mov	r3, r1
			go_manhattan((d & 1) ? (cx + 992) : (cx - 992), cy - 992 + r * 64, _Z, Z_ACCEL, Z_MIN_DELAY);
   2c20a:	63 96       	adiw	r28, 0x13	; 19
   2c20c:	8e ad       	ldd	r24, Y+62	; 0x3e
   2c20e:	9f ad       	ldd	r25, Y+63	; 0x3f
   2c210:	63 97       	sbiw	r28, 0x13	; 19
   2c212:	80 52       	subi	r24, 0x20	; 32
   2c214:	9c 4f       	sbci	r25, 0xFC	; 252
   2c216:	6b 96       	adiw	r28, 0x1b	; 27
   2c218:	9f af       	std	Y+63, r25	; 0x3f
   2c21a:	8e af       	std	Y+62, r24	; 0x3e
   2c21c:	6b 97       	sbiw	r28, 0x1b	; 27
   2c21e:	60 90 54 06 	lds	r6, 0x0654	; 0x800654 <count_position+0x8>
   2c222:	70 90 55 06 	lds	r7, 0x0655	; 0x800655 <count_position+0x9>
   2c226:	80 90 56 06 	lds	r8, 0x0656	; 0x800656 <count_position+0xa>
   2c22a:	90 90 57 06 	lds	r9, 0x0657	; 0x800657 <count_position+0xb>
   2c22e:	6b 96       	adiw	r28, 0x1b	; 27
   2c230:	ae ac       	ldd	r10, Y+62	; 0x3e
   2c232:	bf ac       	ldd	r11, Y+63	; 0x3f
   2c234:	6b 97       	sbiw	r28, 0x1b	; 27
   2c236:	31 10       	cpse	r3, r1
   2c238:	04 c0       	rjmp	.+8      	; 0x2c242 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0xe0>
   2c23a:	69 96       	adiw	r28, 0x19	; 25
   2c23c:	ae ac       	ldd	r10, Y+62	; 0x3e
   2c23e:	bf ac       	ldd	r11, Y+63	; 0x3f
   2c240:	69 97       	sbiw	r28, 0x19	; 25
/// starts and ends at 0 speed
void go_manhattan(int16_t x, int16_t y, int16_t z, int16_t acc, uint16_t min_delay_us){
	int16_t length;

	// DBG(_n("x %d -> %d, "), x, _X);
	length = x - _X;
   2c242:	80 91 4c 06 	lds	r24, 0x064C	; 0x80064c <count_position>
   2c246:	90 91 4d 06 	lds	r25, 0x064D	; 0x80064d <count_position+0x1>
   2c24a:	a0 91 4e 06 	lds	r26, 0x064E	; 0x80064e <count_position+0x2>
   2c24e:	b0 91 4f 06 	lds	r27, 0x064F	; 0x80064f <count_position+0x3>
   2c252:	f5 01       	movw	r30, r10
   2c254:	e8 1b       	sub	r30, r24
   2c256:	f9 0b       	sbc	r31, r25
   2c258:	cf 01       	movw	r24, r30
		update_position_1_step(axes, dir);
	}
}

void go_start_stop(uint8_t axes, uint8_t dir, int16_t acc, uint16_t min_delay_us, uint16_t steps){
	if (steps == 0)
   2c25a:	71 f0       	breq	.+28     	; 0x2c278 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x116>
void go_manhattan(int16_t x, int16_t y, int16_t z, int16_t acc, uint16_t min_delay_us){
	int16_t length;

	// DBG(_n("x %d -> %d, "), x, _X);
	length = x - _X;
	go_start_stop(X_AXIS_MASK, length < 0 ? X_MINUS_MASK : X_PLUS_MASK, acc, min_delay_us, ABS(length));
   2c25c:	af 01       	movw	r20, r30
   2c25e:	f7 ff       	sbrs	r31, 7
   2c260:	04 c0       	rjmp	.+8      	; 0x2c26a <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x108>
   2c262:	44 27       	eor	r20, r20
   2c264:	55 27       	eor	r21, r21
   2c266:	4e 1b       	sub	r20, r30
   2c268:	5f 0b       	sbc	r21, r31
   2c26a:	69 2f       	mov	r22, r25
   2c26c:	66 1f       	adc	r22, r22
   2c26e:	66 27       	eor	r22, r22
   2c270:	66 1f       	adc	r22, r22
   2c272:	81 e0       	ldi	r24, 0x01	; 1
   2c274:	0f 94 40 5f 	call	0x2be80	; 0x2be80 <go_start_stop(unsigned char, unsigned char, int, unsigned int, unsigned int) [clone .part.2] [clone .constprop.70]>

	// DBG(_n("y %d -> %d, "), y, _Y);
	length = y - _Y;
   2c278:	80 91 50 06 	lds	r24, 0x0650	; 0x800650 <count_position+0x4>
   2c27c:	90 91 51 06 	lds	r25, 0x0651	; 0x800651 <count_position+0x5>
   2c280:	a0 91 52 06 	lds	r26, 0x0652	; 0x800652 <count_position+0x6>
   2c284:	b0 91 53 06 	lds	r27, 0x0653	; 0x800653 <count_position+0x7>
   2c288:	2b 96       	adiw	r28, 0x0b	; 11
   2c28a:	4e ad       	ldd	r20, Y+62	; 0x3e
   2c28c:	5f ad       	ldd	r21, Y+63	; 0x3f
   2c28e:	2b 97       	sbiw	r28, 0x0b	; 11
   2c290:	48 1b       	sub	r20, r24
   2c292:	59 0b       	sbc	r21, r25
	go_start_stop(Y_AXIS_MASK, length < 0 ? Y_MINUS_MASK : Y_PLUS_MASK, acc, min_delay_us, ABS(length));
   2c294:	57 fd       	sbrc	r21, 7
   2c296:	b2 c0       	rjmp	.+356    	; 0x2c3fc <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x29a>
   2c298:	60 e0       	ldi	r22, 0x00	; 0
		update_position_1_step(axes, dir);
	}
}

void go_start_stop(uint8_t axes, uint8_t dir, int16_t acc, uint16_t min_delay_us, uint16_t steps){
	if (steps == 0)
   2c29a:	41 15       	cp	r20, r1
   2c29c:	51 05       	cpc	r21, r1
   2c29e:	09 f0       	breq	.+2      	; 0x2c2a2 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x140>
   2c2a0:	ae c0       	rjmp	.+348    	; 0x2c3fe <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x29c>
	// DBG(_n("y %d -> %d, "), y, _Y);
	length = y - _Y;
	go_start_stop(Y_AXIS_MASK, length < 0 ? Y_MINUS_MASK : Y_PLUS_MASK, acc, min_delay_us, ABS(length));

	// DBG(_n("z %d -> %d\n"), z, _Z);
	length = z - _Z;
   2c2a2:	80 91 54 06 	lds	r24, 0x0654	; 0x800654 <count_position+0x8>
   2c2a6:	90 91 55 06 	lds	r25, 0x0655	; 0x800655 <count_position+0x9>
   2c2aa:	a0 91 56 06 	lds	r26, 0x0656	; 0x800656 <count_position+0xa>
   2c2ae:	b0 91 57 06 	lds	r27, 0x0657	; 0x800657 <count_position+0xb>
   2c2b2:	68 1a       	sub	r6, r24
   2c2b4:	79 0a       	sbc	r7, r25
	go_start_stop(Z_AXIS_MASK, length < 0 ? Z_MINUS_MASK : Z_PLUS_MASK, acc, min_delay_us, ABS(length));
   2c2b6:	77 fc       	sbrc	r7, 7
   2c2b8:	ab c0       	rjmp	.+342    	; 0x2c410 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x2ae>
   2c2ba:	60 e0       	ldi	r22, 0x00	; 0
		update_position_1_step(axes, dir);
	}
}

void go_start_stop(uint8_t axes, uint8_t dir, int16_t acc, uint16_t min_delay_us, uint16_t steps){
	if (steps == 0)
   2c2bc:	61 14       	cp	r6, r1
   2c2be:	71 04       	cpc	r7, r1
   2c2c0:	09 f0       	breq	.+2      	; 0x2c2c4 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x162>
   2c2c2:	a7 c0       	rjmp	.+334    	; 0x2c412 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x2b0>
	DBG(_n("Scan countdown: "));

	for (uint8_t r = 0; r < 32; r++){ ///< Y axis
		for (uint8_t d = 0; d < 2; ++d){
			go_manhattan((d & 1) ? (cx + 992) : (cx - 992), cy - 992 + r * 64, _Z, Z_ACCEL, Z_MIN_DELAY);
			xyzcal_lineXYZ_to((d & 1) ? (cx + 992) : (cx - 992), cy - 992 + r * 64, _Z, delay_us, 0);
   2c2c4:	40 91 54 06 	lds	r20, 0x0654	; 0x800654 <count_position+0x8>
   2c2c8:	50 91 55 06 	lds	r21, 0x0655	; 0x800655 <count_position+0x9>
   2c2cc:	60 91 56 06 	lds	r22, 0x0656	; 0x800656 <count_position+0xa>
   2c2d0:	70 91 57 06 	lds	r23, 0x0657	; 0x800657 <count_position+0xb>
   2c2d4:	00 e0       	ldi	r16, 0x00	; 0
   2c2d6:	28 ec       	ldi	r18, 0xC8	; 200
   2c2d8:	30 e0       	ldi	r19, 0x00	; 0
   2c2da:	2b 96       	adiw	r28, 0x0b	; 11
   2c2dc:	6e ad       	ldd	r22, Y+62	; 0x3e
   2c2de:	7f ad       	ldd	r23, Y+63	; 0x3f
   2c2e0:	2b 97       	sbiw	r28, 0x0b	; 11
   2c2e2:	c5 01       	movw	r24, r10
   2c2e4:	0e 94 cf d5 	call	0x1ab9e	; 0x1ab9e <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)>
			sm4_set_dir(X_AXIS, d);
   2c2e8:	63 2d       	mov	r22, r3
   2c2ea:	80 e0       	ldi	r24, 0x00	; 0
   2c2ec:	0f 94 9c 28 	call	0x25138	; 0x25138 <sm4_set_dir(unsigned char, unsigned char)>
            //@size=242
			DBG(_n("%d\n"), 64 - (r * 2 + d)); ///< to keep host connection alive
   2c2f0:	5f 92       	push	r5
   2c2f2:	4f 92       	push	r4
   2c2f4:	8c ea       	ldi	r24, 0xAC	; 172
   2c2f6:	9c e9       	ldi	r25, 0x9C	; 156
   2c2f8:	9f 93       	push	r25
   2c2fa:	8f 93       	push	r24
   2c2fc:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
			lcd_set_cursor(4,3);
   2c300:	63 e0       	ldi	r22, 0x03	; 3
   2c302:	84 e0       	ldi	r24, 0x04	; 4
   2c304:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
			lcd_printf_P(PSTR("Countdown: %d "),64 - (r * 2 + d)); ////MSG_COUNTDOWN c=12
   2c308:	5f 92       	push	r5
   2c30a:	4f 92       	push	r4
   2c30c:	8d e9       	ldi	r24, 0x9D	; 157
   2c30e:	9c e9       	ldi	r25, 0x9C	; 156
   2c310:	9f 93       	push	r25
   2c312:	8f 93       	push	r24
   2c314:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
   2c318:	0f b6       	in	r0, 0x3f	; 63
   2c31a:	f8 94       	cli
   2c31c:	de bf       	out	0x3e, r29	; 62
   2c31e:	0f be       	out	0x3f, r0	; 63
   2c320:	cd bf       	out	0x3d, r28	; 61
   2c322:	21 e0       	ldi	r18, 0x01	; 1
   2c324:	30 e0       	ldi	r19, 0x00	; 0
   2c326:	31 10       	cpse	r3, r1
   2c328:	02 c0       	rjmp	.+4      	; 0x2c32e <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x1cc>
   2c32a:	2f ef       	ldi	r18, 0xFF	; 255
   2c32c:	3f ef       	ldi	r19, 0xFF	; 255
   2c32e:	40 ec       	ldi	r20, 0xC0	; 192
   2c330:	42 03       	mulsu	r20, r18
   2c332:	c0 01       	movw	r24, r0
   2c334:	43 9f       	mul	r20, r19
   2c336:	90 0d       	add	r25, r0
   2c338:	11 24       	eor	r1, r1
   2c33a:	67 96       	adiw	r28, 0x17	; 23
   2c33c:	9f af       	std	Y+63, r25	; 0x3f
   2c33e:	8e af       	std	Y+62, r24	; 0x3e
   2c340:	67 97       	sbiw	r28, 0x17	; 23
   2c342:	40 ee       	ldi	r20, 0xE0	; 224
   2c344:	53 e0       	ldi	r21, 0x03	; 3
   2c346:	24 9f       	mul	r18, r20
   2c348:	40 01       	movw	r8, r0
   2c34a:	25 9f       	mul	r18, r21
   2c34c:	90 0c       	add	r9, r0
   2c34e:	34 9f       	mul	r19, r20
   2c350:	90 0c       	add	r9, r0
   2c352:	11 24       	eor	r1, r1
   2c354:	63 96       	adiw	r28, 0x13	; 19
   2c356:	ee ad       	ldd	r30, Y+62	; 0x3e
   2c358:	ff ad       	ldd	r31, Y+63	; 0x3f
   2c35a:	63 97       	sbiw	r28, 0x13	; 19
   2c35c:	8e 0e       	add	r8, r30
   2c35e:	9f 1e       	adc	r9, r31
   2c360:	9e 01       	movw	r18, r28
   2c362:	2f 5f       	subi	r18, 0xFF	; 255
   2c364:	3f 4f       	sbci	r19, 0xFF	; 255
   2c366:	2d 96       	adiw	r28, 0x0d	; 13
   2c368:	3f af       	std	Y+63, r19	; 0x3f
   2c36a:	2e af       	std	Y+62, r18	; 0x3e
   2c36c:	2d 97       	sbiw	r28, 0x0d	; 13
   2c36e:	61 96       	adiw	r28, 0x11	; 17
   2c370:	8e ad       	ldd	r24, Y+62	; 0x3e
   2c372:	9f ad       	ldd	r25, Y+63	; 0x3f
   2c374:	61 97       	sbiw	r28, 0x11	; 17
   2c376:	2f 96       	adiw	r28, 0x0f	; 15
   2c378:	9f af       	std	Y+63, r25	; 0x3f
   2c37a:	8e af       	std	Y+62, r24	; 0x3e
   2c37c:	2f 97       	sbiw	r28, 0x0f	; 15
   2c37e:	71 2c       	mov	r7, r1
   2c380:	61 2c       	mov	r6, r1

			for (uint8_t c = 0; c < 32; c++){ ///< X axis
				/// move to the next point and move Z up diagonally (if needed)
				current_delay_us = MAX_DELAY;
   2c382:	e0 e1       	ldi	r30, 0x10	; 16
   2c384:	f7 e2       	ldi	r31, 0x27	; 39
   2c386:	27 96       	adiw	r28, 0x07	; 7
   2c388:	ff af       	std	Y+63, r31	; 0x3f
   2c38a:	ee af       	std	Y+62, r30	; 0x3e
   2c38c:	27 97       	sbiw	r28, 0x07	; 7
				const int16_t end_x = ((d & 1) ? 1 : -1) * (64 * (16 - c) - 32) + cx;
				const int16_t length_x = ABS(end_x - _X);
   2c38e:	80 91 4c 06 	lds	r24, 0x064C	; 0x80064c <count_position>
   2c392:	90 91 4d 06 	lds	r25, 0x064D	; 0x80064d <count_position+0x1>
   2c396:	a0 91 4e 06 	lds	r26, 0x064E	; 0x80064e <count_position+0x2>
   2c39a:	b0 91 4f 06 	lds	r27, 0x064F	; 0x80064f <count_position+0x3>
   2c39e:	84 01       	movw	r16, r8
   2c3a0:	08 1b       	sub	r16, r24
   2c3a2:	19 0b       	sbc	r17, r25
   2c3a4:	17 ff       	sbrs	r17, 7
   2c3a6:	03 c0       	rjmp	.+6      	; 0x2c3ae <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x24c>
   2c3a8:	11 95       	neg	r17
   2c3aa:	01 95       	neg	r16
   2c3ac:	11 09       	sbc	r17, r1
				const int16_t half_x = length_x / 2;
   2c3ae:	98 01       	movw	r18, r16
   2c3b0:	35 95       	asr	r19
   2c3b2:	27 95       	ror	r18
   2c3b4:	65 96       	adiw	r28, 0x15	; 21
   2c3b6:	3f af       	std	Y+63, r19	; 0x3f
   2c3b8:	2e af       	std	Y+62, r18	; 0x3e
   2c3ba:	65 97       	sbiw	r28, 0x15	; 21
				/// don't go up if PINDA not triggered (optimization)
				const bool up = _PINDA;
				const uint8_t axes = up ? X_AXIS_MASK | Z_AXIS_MASK : X_AXIS_MASK;
   2c3bc:	1c 9b       	sbis	0x03, 4	; 3
   2c3be:	33 c0       	rjmp	.+102    	; 0x2c426 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x2c4>
   2c3c0:	45 e0       	ldi	r20, 0x05	; 5
   2c3c2:	24 2e       	mov	r2, r20
				const uint8_t dir = Z_PLUS_MASK | (d & 1 ? X_MINUS_MASK : X_PLUS_MASK);

				accelerate(axes, dir, Z_ACCEL, current_delay_us, Z_MIN_DELAY, half_x);
   2c3c4:	65 96       	adiw	r28, 0x15	; 21
   2c3c6:	ae ac       	ldd	r10, Y+62	; 0x3e
   2c3c8:	bf ac       	ldd	r11, Y+63	; 0x3f
   2c3ca:	65 97       	sbiw	r28, 0x15	; 21
}

/// Goes defined number of steps while accelerating
/// updates global positions
void accelerate(uint8_t axes, uint8_t dir, int16_t acc, uint16_t &delay_us, uint16_t min_delay_us, uint16_t steps){
	set_axes_dir(axes, dir);
   2c3cc:	63 2d       	mov	r22, r3
   2c3ce:	82 2d       	mov	r24, r2
   2c3d0:	0e 94 76 d5 	call	0x1aaec	; 0x1aaec <set_axes_dir(unsigned char, unsigned char) [clone .lto_priv.380]>
	while (steps--){
   2c3d4:	31 e0       	ldi	r19, 0x01	; 1
   2c3d6:	a3 1a       	sub	r10, r19
   2c3d8:	b1 08       	sbc	r11, r1
   2c3da:	40 f1       	brcs	.+80     	; 0x2c42c <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x2ca>
		accelerate_1_step(axes, acc, delay_us, min_delay_us);
   2c3dc:	28 ec       	ldi	r18, 0xC8	; 200
   2c3de:	30 e0       	ldi	r19, 0x00	; 0
   2c3e0:	a7 01       	movw	r20, r14
   2c3e2:	68 ee       	ldi	r22, 0xE8	; 232
   2c3e4:	73 e0       	ldi	r23, 0x03	; 3
   2c3e6:	82 2d       	mov	r24, r2
   2c3e8:	0e 94 45 d4 	call	0x1a88a	; 0x1a88a <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)>
		update_position_1_step(axes, dir);
   2c3ec:	63 2d       	mov	r22, r3
   2c3ee:	82 2d       	mov	r24, r2
   2c3f0:	0e 94 8f d5 	call	0x1ab1e	; 0x1ab1e <update_position_1_step(unsigned char, unsigned char) [clone .lto_priv.379]>
   2c3f4:	ef cf       	rjmp	.-34     	; 0x2c3d4 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x272>
	uint16_t steps_to_go;

	DBG(_n("Scan countdown: "));

	for (uint8_t r = 0; r < 32; r++){ ///< Y axis
		for (uint8_t d = 0; d < 2; ++d){
   2c3f6:	33 24       	eor	r3, r3
   2c3f8:	33 94       	inc	r3
   2c3fa:	11 cf       	rjmp	.-478    	; 0x2c21e <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0xbc>
	length = x - _X;
	go_start_stop(X_AXIS_MASK, length < 0 ? X_MINUS_MASK : X_PLUS_MASK, acc, min_delay_us, ABS(length));

	// DBG(_n("y %d -> %d, "), y, _Y);
	length = y - _Y;
	go_start_stop(Y_AXIS_MASK, length < 0 ? Y_MINUS_MASK : Y_PLUS_MASK, acc, min_delay_us, ABS(length));
   2c3fc:	62 e0       	ldi	r22, 0x02	; 2
   2c3fe:	57 ff       	sbrs	r21, 7
   2c400:	03 c0       	rjmp	.+6      	; 0x2c408 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x2a6>
   2c402:	51 95       	neg	r21
   2c404:	41 95       	neg	r20
   2c406:	51 09       	sbc	r21, r1
   2c408:	82 e0       	ldi	r24, 0x02	; 2
   2c40a:	0f 94 40 5f 	call	0x2be80	; 0x2be80 <go_start_stop(unsigned char, unsigned char, int, unsigned int, unsigned int) [clone .part.2] [clone .constprop.70]>
   2c40e:	49 cf       	rjmp	.-366    	; 0x2c2a2 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x140>

	// DBG(_n("z %d -> %d\n"), z, _Z);
	length = z - _Z;
	go_start_stop(Z_AXIS_MASK, length < 0 ? Z_MINUS_MASK : Z_PLUS_MASK, acc, min_delay_us, ABS(length));
   2c410:	64 e0       	ldi	r22, 0x04	; 4
   2c412:	a3 01       	movw	r20, r6
   2c414:	77 fe       	sbrs	r7, 7
   2c416:	03 c0       	rjmp	.+6      	; 0x2c41e <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x2bc>
   2c418:	51 95       	neg	r21
   2c41a:	41 95       	neg	r20
   2c41c:	51 09       	sbc	r21, r1
   2c41e:	84 e0       	ldi	r24, 0x04	; 4
   2c420:	0f 94 40 5f 	call	0x2be80	; 0x2be80 <go_start_stop(unsigned char, unsigned char, int, unsigned int, unsigned int) [clone .part.2] [clone .constprop.70]>
   2c424:	4f cf       	rjmp	.-354    	; 0x2c2c4 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x162>
				const int16_t end_x = ((d & 1) ? 1 : -1) * (64 * (16 - c) - 32) + cx;
				const int16_t length_x = ABS(end_x - _X);
				const int16_t half_x = length_x / 2;
				/// don't go up if PINDA not triggered (optimization)
				const bool up = _PINDA;
				const uint8_t axes = up ? X_AXIS_MASK | Z_AXIS_MASK : X_AXIS_MASK;
   2c426:	22 24       	eor	r2, r2
   2c428:	23 94       	inc	r2
   2c42a:	cc cf       	rjmp	.-104    	; 0x2c3c4 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x262>
				const uint8_t dir = Z_PLUS_MASK | (d & 1 ? X_MINUS_MASK : X_PLUS_MASK);

				accelerate(axes, dir, Z_ACCEL, current_delay_us, Z_MIN_DELAY, half_x);
				go_and_stop(axes, dir, Z_ACCEL, current_delay_us, length_x - half_x);
   2c42c:	65 96       	adiw	r28, 0x15	; 21
   2c42e:	ee ad       	ldd	r30, Y+62	; 0x3e
   2c430:	ff ad       	ldd	r31, Y+63	; 0x3f
   2c432:	65 97       	sbiw	r28, 0x15	; 21
   2c434:	0e 1b       	sub	r16, r30
   2c436:	1f 0b       	sbc	r17, r31
   2c438:	23 96       	adiw	r28, 0x03	; 3
   2c43a:	1f af       	std	Y+63, r17	; 0x3f
   2c43c:	0e af       	std	Y+62, r16	; 0x3e
   2c43e:	23 97       	sbiw	r28, 0x03	; 3
}

/// \param dir sets direction of movement
/// updates global positions
void go_and_stop(uint8_t axes, uint8_t dir, int16_t dec, uint16_t &delay_us, uint16_t steps){
	set_axes_dir(axes, dir);
   2c440:	63 2d       	mov	r22, r3
   2c442:	82 2d       	mov	r24, r2
   2c444:	0e 94 76 d5 	call	0x1aaec	; 0x1aaec <set_axes_dir(unsigned char, unsigned char) [clone .lto_priv.380]>
	while (go_and_stop_1_step(axes, dec, delay_us, steps)){
   2c448:	9e 01       	movw	r18, r28
   2c44a:	2f 5b       	subi	r18, 0xBF	; 191
   2c44c:	3f 4f       	sbci	r19, 0xFF	; 255
   2c44e:	a7 01       	movw	r20, r14
   2c450:	68 ee       	ldi	r22, 0xE8	; 232
   2c452:	73 e0       	ldi	r23, 0x03	; 3
   2c454:	82 2d       	mov	r24, r2
   2c456:	0e 94 ec d4 	call	0x1a9d8	; 0x1a9d8 <go_and_stop_1_step(unsigned char, int, unsigned int&, unsigned int&)>
   2c45a:	88 23       	and	r24, r24
   2c45c:	29 f0       	breq	.+10     	; 0x2c468 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x306>
		update_position_1_step(axes, dir);
   2c45e:	63 2d       	mov	r22, r3
   2c460:	82 2d       	mov	r24, r2
   2c462:	0e 94 8f d5 	call	0x1ab1e	; 0x1ab1e <update_position_1_step(unsigned char, unsigned char) [clone .lto_priv.379]>
   2c466:	f0 cf       	rjmp	.-32     	; 0x2c448 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x2e6>


				z_trig = min_z;

				/// move up to un-trigger (surpress hysteresis)
				sm4_set_dir(Z_AXIS, Z_PLUS);
   2c468:	60 e0       	ldi	r22, 0x00	; 0
   2c46a:	82 e0       	ldi	r24, 0x02	; 2
   2c46c:	0f 94 9c 28 	call	0x25138	; 0x25138 <sm4_set_dir(unsigned char, unsigned char)>
				/// speed up from stop, go half the way
				current_delay_us = MAX_DELAY;
   2c470:	20 e1       	ldi	r18, 0x10	; 16
   2c472:	37 e2       	ldi	r19, 0x27	; 39
   2c474:	27 96       	adiw	r28, 0x07	; 7
   2c476:	3f af       	std	Y+63, r19	; 0x3f
   2c478:	2e af       	std	Y+62, r18	; 0x3e
   2c47a:	27 97       	sbiw	r28, 0x07	; 7
				for (start_z = _Z; _Z < (max_z + start_z) / 2; ++_Z_){
   2c47c:	00 91 54 06 	lds	r16, 0x0654	; 0x800654 <count_position+0x8>
   2c480:	10 91 55 06 	lds	r17, 0x0655	; 0x800655 <count_position+0x9>
   2c484:	20 91 56 06 	lds	r18, 0x0656	; 0x800656 <count_position+0xa>
   2c488:	30 91 57 06 	lds	r19, 0x0657	; 0x800657 <count_position+0xb>
   2c48c:	00 5a       	subi	r16, 0xA0	; 160
   2c48e:	16 4f       	sbci	r17, 0xF6	; 246
   2c490:	17 ff       	sbrs	r17, 7
   2c492:	02 c0       	rjmp	.+4      	; 0x2c498 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x336>
   2c494:	0f 5f       	subi	r16, 0xFF	; 255
   2c496:	1f 4f       	sbci	r17, 0xFF	; 255
   2c498:	15 95       	asr	r17
   2c49a:	07 95       	ror	r16
   2c49c:	80 91 54 06 	lds	r24, 0x0654	; 0x800654 <count_position+0x8>
   2c4a0:	90 91 55 06 	lds	r25, 0x0655	; 0x800655 <count_position+0x9>
   2c4a4:	a0 91 56 06 	lds	r26, 0x0656	; 0x800656 <count_position+0xa>
   2c4a8:	b0 91 57 06 	lds	r27, 0x0657	; 0x800657 <count_position+0xb>
   2c4ac:	80 17       	cp	r24, r16
   2c4ae:	91 07       	cpc	r25, r17
   2c4b0:	f4 f4       	brge	.+60     	; 0x2c4ee <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x38c>
					if (!_PINDA){
   2c4b2:	1c 9b       	sbis	0x03, 4	; 3
   2c4b4:	1c c0       	rjmp	.+56     	; 0x2c4ee <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x38c>
						break;
					}
					accelerate_1_step(Z_AXIS_MASK, Z_ACCEL, current_delay_us, Z_MIN_DELAY);
   2c4b6:	28 ec       	ldi	r18, 0xC8	; 200
   2c4b8:	30 e0       	ldi	r19, 0x00	; 0
   2c4ba:	a7 01       	movw	r20, r14
   2c4bc:	68 ee       	ldi	r22, 0xE8	; 232
   2c4be:	73 e0       	ldi	r23, 0x03	; 3
   2c4c0:	84 e0       	ldi	r24, 0x04	; 4
   2c4c2:	0e 94 45 d4 	call	0x1a88a	; 0x1a88a <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)>

				/// move up to un-trigger (surpress hysteresis)
				sm4_set_dir(Z_AXIS, Z_PLUS);
				/// speed up from stop, go half the way
				current_delay_us = MAX_DELAY;
				for (start_z = _Z; _Z < (max_z + start_z) / 2; ++_Z_){
   2c4c6:	80 91 54 06 	lds	r24, 0x0654	; 0x800654 <count_position+0x8>
   2c4ca:	90 91 55 06 	lds	r25, 0x0655	; 0x800655 <count_position+0x9>
   2c4ce:	a0 91 56 06 	lds	r26, 0x0656	; 0x800656 <count_position+0xa>
   2c4d2:	b0 91 57 06 	lds	r27, 0x0657	; 0x800657 <count_position+0xb>
   2c4d6:	01 96       	adiw	r24, 0x01	; 1
   2c4d8:	a1 1d       	adc	r26, r1
   2c4da:	b1 1d       	adc	r27, r1
   2c4dc:	80 93 54 06 	sts	0x0654, r24	; 0x800654 <count_position+0x8>
   2c4e0:	90 93 55 06 	sts	0x0655, r25	; 0x800655 <count_position+0x9>
   2c4e4:	a0 93 56 06 	sts	0x0656, r26	; 0x800656 <count_position+0xa>
   2c4e8:	b0 93 57 06 	sts	0x0657, r27	; 0x800657 <count_position+0xb>
   2c4ec:	d7 cf       	rjmp	.-82     	; 0x2c49c <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x33a>
						break;
					}
					accelerate_1_step(Z_AXIS_MASK, Z_ACCEL, current_delay_us, Z_MIN_DELAY);
				}

				if (_PINDA){
   2c4ee:	1c 9b       	sbis	0x03, 4	; 3
   2c4f0:	3f c0       	rjmp	.+126    	; 0x2c570 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x40e>
					steps_to_go = MAX(0, max_z - _Z);
   2c4f2:	80 91 54 06 	lds	r24, 0x0654	; 0x800654 <count_position+0x8>
   2c4f6:	90 91 55 06 	lds	r25, 0x0655	; 0x800655 <count_position+0x9>
   2c4fa:	a0 91 56 06 	lds	r26, 0x0656	; 0x800656 <count_position+0xa>
   2c4fe:	b0 91 57 06 	lds	r27, 0x0657	; 0x800657 <count_position+0xb>
   2c502:	e0 e6       	ldi	r30, 0x60	; 96
   2c504:	f9 e0       	ldi	r31, 0x09	; 9
   2c506:	e8 1b       	sub	r30, r24
   2c508:	f9 0b       	sbc	r31, r25
   2c50a:	cf 01       	movw	r24, r30
   2c50c:	f7 ff       	sbrs	r31, 7
   2c50e:	02 c0       	rjmp	.+4      	; 0x2c514 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x3b2>
   2c510:	90 e0       	ldi	r25, 0x00	; 0
   2c512:	80 e0       	ldi	r24, 0x00	; 0
   2c514:	25 96       	adiw	r28, 0x05	; 5
   2c516:	9f af       	std	Y+63, r25	; 0x3f
   2c518:	8e af       	std	Y+62, r24	; 0x3e
   2c51a:	25 97       	sbiw	r28, 0x05	; 5
					while (_PINDA && _Z < max_z){
   2c51c:	1c 9b       	sbis	0x03, 4	; 3
   2c51e:	28 c0       	rjmp	.+80     	; 0x2c570 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x40e>
   2c520:	80 91 54 06 	lds	r24, 0x0654	; 0x800654 <count_position+0x8>
   2c524:	90 91 55 06 	lds	r25, 0x0655	; 0x800655 <count_position+0x9>
   2c528:	a0 91 56 06 	lds	r26, 0x0656	; 0x800656 <count_position+0xa>
   2c52c:	b0 91 57 06 	lds	r27, 0x0657	; 0x800657 <count_position+0xb>
   2c530:	80 36       	cpi	r24, 0x60	; 96
   2c532:	99 40       	sbci	r25, 0x09	; 9
   2c534:	ec f4       	brge	.+58     	; 0x2c570 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x40e>
						go_and_stop_1_step(Z_AXIS_MASK, Z_ACCEL, current_delay_us, steps_to_go);
   2c536:	9e 01       	movw	r18, r28
   2c538:	2d 5b       	subi	r18, 0xBD	; 189
   2c53a:	3f 4f       	sbci	r19, 0xFF	; 255
   2c53c:	a7 01       	movw	r20, r14
   2c53e:	68 ee       	ldi	r22, 0xE8	; 232
   2c540:	73 e0       	ldi	r23, 0x03	; 3
   2c542:	84 e0       	ldi	r24, 0x04	; 4
   2c544:	0e 94 ec d4 	call	0x1a9d8	; 0x1a9d8 <go_and_stop_1_step(unsigned char, int, unsigned int&, unsigned int&)>
						++_Z_;
   2c548:	80 91 54 06 	lds	r24, 0x0654	; 0x800654 <count_position+0x8>
   2c54c:	90 91 55 06 	lds	r25, 0x0655	; 0x800655 <count_position+0x9>
   2c550:	a0 91 56 06 	lds	r26, 0x0656	; 0x800656 <count_position+0xa>
   2c554:	b0 91 57 06 	lds	r27, 0x0657	; 0x800657 <count_position+0xb>
   2c558:	01 96       	adiw	r24, 0x01	; 1
   2c55a:	a1 1d       	adc	r26, r1
   2c55c:	b1 1d       	adc	r27, r1
   2c55e:	80 93 54 06 	sts	0x0654, r24	; 0x800654 <count_position+0x8>
   2c562:	90 93 55 06 	sts	0x0655, r25	; 0x800655 <count_position+0x9>
   2c566:	a0 93 56 06 	sts	0x0656, r26	; 0x800656 <count_position+0xa>
   2c56a:	b0 93 57 06 	sts	0x0657, r27	; 0x800657 <count_position+0xb>
   2c56e:	d6 cf       	rjmp	.-84     	; 0x2c51c <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x3ba>
/// \returns steps done
/// updates global positions
void stop_smoothly(uint8_t axes, uint8_t dir, int16_t dec, uint16_t &delay_us){
	if (dec <= 0)
		return;
	set_axes_dir(axes, dir);
   2c570:	60 e0       	ldi	r22, 0x00	; 0
   2c572:	84 e0       	ldi	r24, 0x04	; 4
   2c574:	0e 94 76 d5 	call	0x1aaec	; 0x1aaec <set_axes_dir(unsigned char, unsigned char) [clone .lto_priv.380]>
	while (delay_us < MAX_DELAY){
   2c578:	f7 01       	movw	r30, r14
   2c57a:	20 81       	ld	r18, Z
   2c57c:	31 81       	ldd	r19, Z+1	; 0x01
   2c57e:	20 31       	cpi	r18, 0x10	; 16
   2c580:	f7 e2       	ldi	r31, 0x27	; 39
   2c582:	3f 07       	cpc	r19, r31
   2c584:	58 f4       	brcc	.+22     	; 0x2c59c <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x43a>
		accelerate_1_step(axes, -dec, delay_us, delay_us);
   2c586:	a7 01       	movw	r20, r14
   2c588:	68 e1       	ldi	r22, 0x18	; 24
   2c58a:	7c ef       	ldi	r23, 0xFC	; 252
   2c58c:	84 e0       	ldi	r24, 0x04	; 4
   2c58e:	0e 94 45 d4 	call	0x1a88a	; 0x1a88a <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)>
		update_position_1_step(axes, dir);
   2c592:	60 e0       	ldi	r22, 0x00	; 0
   2c594:	84 e0       	ldi	r24, 0x04	; 4
   2c596:	0e 94 8f d5 	call	0x1ab1e	; 0x1ab1e <update_position_1_step(unsigned char, unsigned char) [clone .lto_priv.379]>
   2c59a:	ee cf       	rjmp	.-36     	; 0x2c578 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x416>
					}
				}
				stop_smoothly(Z_AXIS_MASK, Z_PLUS_MASK, Z_ACCEL, current_delay_us);

				/// move down to trigger
				sm4_set_dir(Z_AXIS, Z_MINUS);
   2c59c:	61 e0       	ldi	r22, 0x01	; 1
   2c59e:	82 e0       	ldi	r24, 0x02	; 2
   2c5a0:	0f 94 9c 28 	call	0x25138	; 0x25138 <sm4_set_dir(unsigned char, unsigned char)>
				/// speed up
				current_delay_us = MAX_DELAY;
   2c5a4:	20 e1       	ldi	r18, 0x10	; 16
   2c5a6:	37 e2       	ldi	r19, 0x27	; 39
   2c5a8:	f7 01       	movw	r30, r14
   2c5aa:	31 83       	std	Z+1, r19	; 0x01
   2c5ac:	20 83       	st	Z, r18
				for (start_z = _Z; _Z > (min_z + start_z) / 2; --_Z_){
   2c5ae:	00 91 54 06 	lds	r16, 0x0654	; 0x800654 <count_position+0x8>
   2c5b2:	10 91 55 06 	lds	r17, 0x0655	; 0x800655 <count_position+0x9>
   2c5b6:	20 91 56 06 	lds	r18, 0x0656	; 0x800656 <count_position+0xa>
   2c5ba:	30 91 57 06 	lds	r19, 0x0657	; 0x800657 <count_position+0xb>
   2c5be:	0c 0d       	add	r16, r12
   2c5c0:	1d 1d       	adc	r17, r13
   2c5c2:	17 ff       	sbrs	r17, 7
   2c5c4:	02 c0       	rjmp	.+4      	; 0x2c5ca <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x468>
   2c5c6:	0f 5f       	subi	r16, 0xFF	; 255
   2c5c8:	1f 4f       	sbci	r17, 0xFF	; 255
   2c5ca:	15 95       	asr	r17
   2c5cc:	07 95       	ror	r16
   2c5ce:	80 91 54 06 	lds	r24, 0x0654	; 0x800654 <count_position+0x8>
   2c5d2:	90 91 55 06 	lds	r25, 0x0655	; 0x800655 <count_position+0x9>
   2c5d6:	a0 91 56 06 	lds	r26, 0x0656	; 0x800656 <count_position+0xa>
   2c5da:	b0 91 57 06 	lds	r27, 0x0657	; 0x800657 <count_position+0xb>
   2c5de:	08 17       	cp	r16, r24
   2c5e0:	19 07       	cpc	r17, r25
   2c5e2:	0c f0       	brlt	.+2      	; 0x2c5e6 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x484>
   2c5e4:	d9 c0       	rjmp	.+434    	; 0x2c798 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x636>
					if (_PINDA){
   2c5e6:	1c 9b       	sbis	0x03, 4	; 3
   2c5e8:	bb c0       	rjmp	.+374    	; 0x2c760 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x5fe>
						z_trig = _Z;
   2c5ea:	00 91 54 06 	lds	r16, 0x0654	; 0x800654 <count_position+0x8>
   2c5ee:	10 91 55 06 	lds	r17, 0x0655	; 0x800655 <count_position+0x9>
   2c5f2:	20 91 56 06 	lds	r18, 0x0656	; 0x800656 <count_position+0xa>
   2c5f6:	30 91 57 06 	lds	r19, 0x0657	; 0x800657 <count_position+0xb>
						break;
					}
					accelerate_1_step(Z_AXIS_MASK, Z_ACCEL, current_delay_us, Z_MIN_DELAY);
				}
				/// slow down
				if (!_PINDA){
   2c5fa:	1c 99       	sbic	0x03, 4	; 3
   2c5fc:	28 c0       	rjmp	.+80     	; 0x2c64e <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x4ec>
					steps_to_go = MAX(0, _Z - min_z);
   2c5fe:	80 91 54 06 	lds	r24, 0x0654	; 0x800654 <count_position+0x8>
   2c602:	90 91 55 06 	lds	r25, 0x0655	; 0x800655 <count_position+0x9>
   2c606:	a0 91 56 06 	lds	r26, 0x0656	; 0x800656 <count_position+0xa>
   2c60a:	b0 91 57 06 	lds	r27, 0x0657	; 0x800657 <count_position+0xb>
   2c60e:	8c 19       	sub	r24, r12
   2c610:	9d 09       	sbc	r25, r13
   2c612:	97 ff       	sbrs	r25, 7
   2c614:	02 c0       	rjmp	.+4      	; 0x2c61a <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x4b8>
   2c616:	90 e0       	ldi	r25, 0x00	; 0
   2c618:	80 e0       	ldi	r24, 0x00	; 0
   2c61a:	25 96       	adiw	r28, 0x05	; 5
   2c61c:	9f af       	std	Y+63, r25	; 0x3f
   2c61e:	8e af       	std	Y+62, r24	; 0x3e
   2c620:	25 97       	sbiw	r28, 0x05	; 5
					while (!_PINDA && _Z > min_z){
   2c622:	1c 99       	sbic	0x03, 4	; 3
   2c624:	0c c0       	rjmp	.+24     	; 0x2c63e <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x4dc>
   2c626:	80 91 54 06 	lds	r24, 0x0654	; 0x800654 <count_position+0x8>
   2c62a:	90 91 55 06 	lds	r25, 0x0655	; 0x800655 <count_position+0x9>
   2c62e:	a0 91 56 06 	lds	r26, 0x0656	; 0x800656 <count_position+0xa>
   2c632:	b0 91 57 06 	lds	r27, 0x0657	; 0x800657 <count_position+0xb>
   2c636:	c8 16       	cp	r12, r24
   2c638:	d9 06       	cpc	r13, r25
   2c63a:	0c f4       	brge	.+2      	; 0x2c63e <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x4dc>
   2c63c:	af c0       	rjmp	.+350    	; 0x2c79c <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x63a>
						go_and_stop_1_step(Z_AXIS_MASK, Z_ACCEL, current_delay_us, steps_to_go);
						--_Z_;
					}
					z_trig = _Z;
   2c63e:	00 91 54 06 	lds	r16, 0x0654	; 0x800654 <count_position+0x8>
   2c642:	10 91 55 06 	lds	r17, 0x0655	; 0x800655 <count_position+0x9>
   2c646:	20 91 56 06 	lds	r18, 0x0656	; 0x800656 <count_position+0xa>
   2c64a:	30 91 57 06 	lds	r19, 0x0657	; 0x800657 <count_position+0xb>
				}
				/// slow down to stop but not lower than min_z
				while (_Z > min_z && current_delay_us < MAX_DELAY){
   2c64e:	80 91 54 06 	lds	r24, 0x0654	; 0x800654 <count_position+0x8>
   2c652:	90 91 55 06 	lds	r25, 0x0655	; 0x800655 <count_position+0x9>
   2c656:	a0 91 56 06 	lds	r26, 0x0656	; 0x800656 <count_position+0xa>
   2c65a:	b0 91 57 06 	lds	r27, 0x0657	; 0x800657 <count_position+0xb>
   2c65e:	c8 16       	cp	r12, r24
   2c660:	d9 06       	cpc	r13, r25
   2c662:	3c f4       	brge	.+14     	; 0x2c672 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x510>
   2c664:	f7 01       	movw	r30, r14
   2c666:	80 81       	ld	r24, Z
   2c668:	91 81       	ldd	r25, Z+1	; 0x01
   2c66a:	80 31       	cpi	r24, 0x10	; 16
   2c66c:	97 42       	sbci	r25, 0x27	; 39
   2c66e:	08 f4       	brcc	.+2      	; 0x2c672 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x510>
   2c670:	b2 c0       	rjmp	.+356    	; 0x2c7d6 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x674>
   2c672:	0c 19       	sub	r16, r12
   2c674:	1d 09       	sbc	r17, r13
					accelerate_1_step(Z_AXIS_MASK, -Z_ACCEL, current_delay_us, Z_MIN_DELAY);
					--_Z_;
				}

				if (d == 0){
   2c676:	31 10       	cpse	r3, r1
   2c678:	ca c0       	rjmp	.+404    	; 0x2c80e <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x6ac>
					line_buffer[c] = (uint16_t)(z_trig - min_z);
   2c67a:	f3 01       	movw	r30, r6
   2c67c:	ee 0f       	add	r30, r30
   2c67e:	ff 1f       	adc	r31, r31
   2c680:	21 e0       	ldi	r18, 0x01	; 1
   2c682:	30 e0       	ldi	r19, 0x00	; 0
   2c684:	2c 0f       	add	r18, r28
   2c686:	3d 1f       	adc	r19, r29
   2c688:	e2 0f       	add	r30, r18
   2c68a:	f3 1f       	adc	r31, r19
   2c68c:	11 83       	std	Z+1, r17	; 0x01
   2c68e:	00 83       	st	Z, r16
   2c690:	ff ef       	ldi	r31, 0xFF	; 255
   2c692:	6f 1a       	sub	r6, r31
   2c694:	7f 0a       	sbc	r7, r31
   2c696:	67 96       	adiw	r28, 0x17	; 23
   2c698:	2e ad       	ldd	r18, Y+62	; 0x3e
   2c69a:	3f ad       	ldd	r19, Y+63	; 0x3f
   2c69c:	67 97       	sbiw	r28, 0x17	; 23
   2c69e:	82 0e       	add	r8, r18
   2c6a0:	93 1e       	adc	r9, r19
   2c6a2:	2d 96       	adiw	r28, 0x0d	; 13
   2c6a4:	8e ad       	ldd	r24, Y+62	; 0x3e
   2c6a6:	9f ad       	ldd	r25, Y+63	; 0x3f
   2c6a8:	2d 97       	sbiw	r28, 0x0d	; 13
   2c6aa:	02 97       	sbiw	r24, 0x02	; 2
   2c6ac:	2d 96       	adiw	r28, 0x0d	; 13
   2c6ae:	9f af       	std	Y+63, r25	; 0x3f
   2c6b0:	8e af       	std	Y+62, r24	; 0x3e
   2c6b2:	2d 97       	sbiw	r28, 0x0d	; 13
   2c6b4:	2f 96       	adiw	r28, 0x0f	; 15
   2c6b6:	ee ad       	ldd	r30, Y+62	; 0x3e
   2c6b8:	ff ad       	ldd	r31, Y+63	; 0x3f
   2c6ba:	2f 97       	sbiw	r28, 0x0f	; 15
   2c6bc:	31 97       	sbiw	r30, 0x01	; 1
   2c6be:	2f 96       	adiw	r28, 0x0f	; 15
   2c6c0:	ff af       	std	Y+63, r31	; 0x3f
   2c6c2:	ee af       	std	Y+62, r30	; 0x3e
   2c6c4:	2f 97       	sbiw	r28, 0x0f	; 15
            //@size=242
			DBG(_n("%d\n"), 64 - (r * 2 + d)); ///< to keep host connection alive
			lcd_set_cursor(4,3);
			lcd_printf_P(PSTR("Countdown: %d "),64 - (r * 2 + d)); ////MSG_COUNTDOWN c=12

			for (uint8_t c = 0; c < 32; c++){ ///< X axis
   2c6c6:	f0 e2       	ldi	r31, 0x20	; 32
   2c6c8:	6f 16       	cp	r6, r31
   2c6ca:	71 04       	cpc	r7, r1
   2c6cc:	09 f0       	breq	.+2      	; 0x2c6d0 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x56e>
   2c6ce:	59 ce       	rjmp	.-846    	; 0x2c382 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x220>
   2c6d0:	21 e0       	ldi	r18, 0x01	; 1
   2c6d2:	42 1a       	sub	r4, r18
   2c6d4:	51 08       	sbc	r5, r1
	uint16_t steps_to_go;

	DBG(_n("Scan countdown: "));

	for (uint8_t r = 0; r < 32; r++){ ///< Y axis
		for (uint8_t d = 0; d < 2; ++d){
   2c6d6:	31 e0       	ldi	r19, 0x01	; 1
   2c6d8:	33 12       	cpse	r3, r19
   2c6da:	8d ce       	rjmp	.-742    	; 0x2c3f6 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x294>
   2c6dc:	61 96       	adiw	r28, 0x11	; 17
   2c6de:	8e ad       	ldd	r24, Y+62	; 0x3e
   2c6e0:	9f ad       	ldd	r25, Y+63	; 0x3f
   2c6e2:	61 97       	sbiw	r28, 0x11	; 17
   2c6e4:	80 96       	adiw	r24, 0x20	; 32
   2c6e6:	61 96       	adiw	r28, 0x11	; 17
   2c6e8:	9f af       	std	Y+63, r25	; 0x3f
   2c6ea:	8e af       	std	Y+62, r24	; 0x3e
   2c6ec:	61 97       	sbiw	r28, 0x11	; 17
   2c6ee:	2b 96       	adiw	r28, 0x0b	; 11
   2c6f0:	ee ad       	ldd	r30, Y+62	; 0x3e
   2c6f2:	ff ad       	ldd	r31, Y+63	; 0x3f
   2c6f4:	2b 97       	sbiw	r28, 0x0b	; 11
   2c6f6:	e0 5c       	subi	r30, 0xC0	; 192
   2c6f8:	ff 4f       	sbci	r31, 0xFF	; 255
   2c6fa:	2b 96       	adiw	r28, 0x0b	; 11
   2c6fc:	ff af       	std	Y+63, r31	; 0x3f
   2c6fe:	ee af       	std	Y+62, r30	; 0x3e
   2c700:	2b 97       	sbiw	r28, 0x0b	; 11
   2c702:	29 96       	adiw	r28, 0x09	; 9
   2c704:	2e ad       	ldd	r18, Y+62	; 0x3e
   2c706:	3f ad       	ldd	r19, Y+63	; 0x3f
   2c708:	29 97       	sbiw	r28, 0x09	; 9
   2c70a:	22 50       	subi	r18, 0x02	; 2
   2c70c:	31 09       	sbc	r19, r1
   2c70e:	29 96       	adiw	r28, 0x09	; 9
   2c710:	3f af       	std	Y+63, r19	; 0x3f
   2c712:	2e af       	std	Y+62, r18	; 0x3e
   2c714:	29 97       	sbiw	r28, 0x09	; 9
	int16_t start_z;
	uint16_t steps_to_go;

	DBG(_n("Scan countdown: "));

	for (uint8_t r = 0; r < 32; r++){ ///< Y axis
   2c716:	23 2b       	or	r18, r19
   2c718:	09 f0       	breq	.+2      	; 0x2c71c <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x5ba>
   2c71a:	72 cd       	rjmp	.-1308   	; 0x2c200 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x9e>
					pixels[(uint16_t)r * 32 + (31 - c)] = (uint8_t)MIN((uint32_t)255, ((uint32_t)line_buffer[31 - c] + (z_trig - min_z)) / 2);
				}
			}
		}
	}
	DBG(endl);
   2c71c:	8b e9       	ldi	r24, 0x9B	; 155
   2c71e:	9c e9       	ldi	r25, 0x9C	; 156
   2c720:	9f 93       	push	r25
   2c722:	8f 93       	push	r24
   2c724:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   2c728:	0f 90       	pop	r0
   2c72a:	0f 90       	pop	r0
}
   2c72c:	c6 5a       	subi	r28, 0xA6	; 166
   2c72e:	df 4f       	sbci	r29, 0xFF	; 255
   2c730:	0f b6       	in	r0, 0x3f	; 63
   2c732:	f8 94       	cli
   2c734:	de bf       	out	0x3e, r29	; 62
   2c736:	0f be       	out	0x3f, r0	; 63
   2c738:	cd bf       	out	0x3d, r28	; 61
   2c73a:	df 91       	pop	r29
   2c73c:	cf 91       	pop	r28
   2c73e:	1f 91       	pop	r17
   2c740:	0f 91       	pop	r16
   2c742:	ff 90       	pop	r15
   2c744:	ef 90       	pop	r14
   2c746:	df 90       	pop	r13
   2c748:	cf 90       	pop	r12
   2c74a:	bf 90       	pop	r11
   2c74c:	af 90       	pop	r10
   2c74e:	9f 90       	pop	r9
   2c750:	8f 90       	pop	r8
   2c752:	7f 90       	pop	r7
   2c754:	6f 90       	pop	r6
   2c756:	5f 90       	pop	r5
   2c758:	4f 90       	pop	r4
   2c75a:	3f 90       	pop	r3
   2c75c:	2f 90       	pop	r2
   2c75e:	08 95       	ret
				for (start_z = _Z; _Z > (min_z + start_z) / 2; --_Z_){
					if (_PINDA){
						z_trig = _Z;
						break;
					}
					accelerate_1_step(Z_AXIS_MASK, Z_ACCEL, current_delay_us, Z_MIN_DELAY);
   2c760:	28 ec       	ldi	r18, 0xC8	; 200
   2c762:	30 e0       	ldi	r19, 0x00	; 0
   2c764:	a7 01       	movw	r20, r14
   2c766:	68 ee       	ldi	r22, 0xE8	; 232
   2c768:	73 e0       	ldi	r23, 0x03	; 3
   2c76a:	84 e0       	ldi	r24, 0x04	; 4
   2c76c:	0e 94 45 d4 	call	0x1a88a	; 0x1a88a <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)>

				/// move down to trigger
				sm4_set_dir(Z_AXIS, Z_MINUS);
				/// speed up
				current_delay_us = MAX_DELAY;
				for (start_z = _Z; _Z > (min_z + start_z) / 2; --_Z_){
   2c770:	80 91 54 06 	lds	r24, 0x0654	; 0x800654 <count_position+0x8>
   2c774:	90 91 55 06 	lds	r25, 0x0655	; 0x800655 <count_position+0x9>
   2c778:	a0 91 56 06 	lds	r26, 0x0656	; 0x800656 <count_position+0xa>
   2c77c:	b0 91 57 06 	lds	r27, 0x0657	; 0x800657 <count_position+0xb>
   2c780:	01 97       	sbiw	r24, 0x01	; 1
   2c782:	a1 09       	sbc	r26, r1
   2c784:	b1 09       	sbc	r27, r1
   2c786:	80 93 54 06 	sts	0x0654, r24	; 0x800654 <count_position+0x8>
   2c78a:	90 93 55 06 	sts	0x0655, r25	; 0x800655 <count_position+0x9>
   2c78e:	a0 93 56 06 	sts	0x0656, r26	; 0x800656 <count_position+0xa>
   2c792:	b0 93 57 06 	sts	0x0657, r27	; 0x800657 <count_position+0xb>
   2c796:	1b cf       	rjmp	.-458    	; 0x2c5ce <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x46c>
   2c798:	86 01       	movw	r16, r12
   2c79a:	2f cf       	rjmp	.-418    	; 0x2c5fa <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x498>
				}
				/// slow down
				if (!_PINDA){
					steps_to_go = MAX(0, _Z - min_z);
					while (!_PINDA && _Z > min_z){
						go_and_stop_1_step(Z_AXIS_MASK, Z_ACCEL, current_delay_us, steps_to_go);
   2c79c:	9e 01       	movw	r18, r28
   2c79e:	2d 5b       	subi	r18, 0xBD	; 189
   2c7a0:	3f 4f       	sbci	r19, 0xFF	; 255
   2c7a2:	a7 01       	movw	r20, r14
   2c7a4:	68 ee       	ldi	r22, 0xE8	; 232
   2c7a6:	73 e0       	ldi	r23, 0x03	; 3
   2c7a8:	84 e0       	ldi	r24, 0x04	; 4
   2c7aa:	0e 94 ec d4 	call	0x1a9d8	; 0x1a9d8 <go_and_stop_1_step(unsigned char, int, unsigned int&, unsigned int&)>
						--_Z_;
   2c7ae:	80 91 54 06 	lds	r24, 0x0654	; 0x800654 <count_position+0x8>
   2c7b2:	90 91 55 06 	lds	r25, 0x0655	; 0x800655 <count_position+0x9>
   2c7b6:	a0 91 56 06 	lds	r26, 0x0656	; 0x800656 <count_position+0xa>
   2c7ba:	b0 91 57 06 	lds	r27, 0x0657	; 0x800657 <count_position+0xb>
   2c7be:	01 97       	sbiw	r24, 0x01	; 1
   2c7c0:	a1 09       	sbc	r26, r1
   2c7c2:	b1 09       	sbc	r27, r1
   2c7c4:	80 93 54 06 	sts	0x0654, r24	; 0x800654 <count_position+0x8>
   2c7c8:	90 93 55 06 	sts	0x0655, r25	; 0x800655 <count_position+0x9>
   2c7cc:	a0 93 56 06 	sts	0x0656, r26	; 0x800656 <count_position+0xa>
   2c7d0:	b0 93 57 06 	sts	0x0657, r27	; 0x800657 <count_position+0xb>
   2c7d4:	26 cf       	rjmp	.-436    	; 0x2c622 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x4c0>
					}
					z_trig = _Z;
				}
				/// slow down to stop but not lower than min_z
				while (_Z > min_z && current_delay_us < MAX_DELAY){
					accelerate_1_step(Z_AXIS_MASK, -Z_ACCEL, current_delay_us, Z_MIN_DELAY);
   2c7d6:	28 ec       	ldi	r18, 0xC8	; 200
   2c7d8:	30 e0       	ldi	r19, 0x00	; 0
   2c7da:	a7 01       	movw	r20, r14
   2c7dc:	68 e1       	ldi	r22, 0x18	; 24
   2c7de:	7c ef       	ldi	r23, 0xFC	; 252
   2c7e0:	84 e0       	ldi	r24, 0x04	; 4
   2c7e2:	0e 94 45 d4 	call	0x1a88a	; 0x1a88a <accelerate_1_step(unsigned char, int, unsigned int&, unsigned int)>
					--_Z_;
   2c7e6:	80 91 54 06 	lds	r24, 0x0654	; 0x800654 <count_position+0x8>
   2c7ea:	90 91 55 06 	lds	r25, 0x0655	; 0x800655 <count_position+0x9>
   2c7ee:	a0 91 56 06 	lds	r26, 0x0656	; 0x800656 <count_position+0xa>
   2c7f2:	b0 91 57 06 	lds	r27, 0x0657	; 0x800657 <count_position+0xb>
   2c7f6:	01 97       	sbiw	r24, 0x01	; 1
   2c7f8:	a1 09       	sbc	r26, r1
   2c7fa:	b1 09       	sbc	r27, r1
   2c7fc:	80 93 54 06 	sts	0x0654, r24	; 0x800654 <count_position+0x8>
   2c800:	90 93 55 06 	sts	0x0655, r25	; 0x800655 <count_position+0x9>
   2c804:	a0 93 56 06 	sts	0x0656, r26	; 0x800656 <count_position+0xa>
   2c808:	b0 93 57 06 	sts	0x0657, r27	; 0x800657 <count_position+0xb>
   2c80c:	20 cf       	rjmp	.-448    	; 0x2c64e <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x4ec>
					line_buffer[c] = (uint16_t)(z_trig - min_z);
				} else {
					/// !!! data reversed in X
					// DBG(_n("%04x"), ((uint32_t)line_buffer[31 - c] + (z_trig - min_z)) / 2);
					/// save average of both directions (filters effect of hysteresis)
					pixels[(uint16_t)r * 32 + (31 - c)] = (uint8_t)MIN((uint32_t)255, ((uint32_t)line_buffer[31 - c] + (z_trig - min_z)) / 2);
   2c80e:	2d 96       	adiw	r28, 0x0d	; 13
   2c810:	ee ad       	ldd	r30, Y+62	; 0x3e
   2c812:	ff ad       	ldd	r31, Y+63	; 0x3f
   2c814:	2d 97       	sbiw	r28, 0x0d	; 13
   2c816:	86 ad       	ldd	r24, Z+62	; 0x3e
   2c818:	97 ad       	ldd	r25, Z+63	; 0x3f
   2c81a:	01 2e       	mov	r0, r17
   2c81c:	00 0c       	add	r0, r0
   2c81e:	22 0b       	sbc	r18, r18
   2c820:	33 0b       	sbc	r19, r19
   2c822:	08 0f       	add	r16, r24
   2c824:	19 1f       	adc	r17, r25
   2c826:	21 1d       	adc	r18, r1
   2c828:	31 1d       	adc	r19, r1
   2c82a:	36 95       	lsr	r19
   2c82c:	27 95       	ror	r18
   2c82e:	17 95       	ror	r17
   2c830:	07 95       	ror	r16
   2c832:	0f 3f       	cpi	r16, 0xFF	; 255
   2c834:	11 05       	cpc	r17, r1
   2c836:	21 05       	cpc	r18, r1
   2c838:	31 05       	cpc	r19, r1
   2c83a:	29 f0       	breq	.+10     	; 0x2c846 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x6e4>
   2c83c:	20 f0       	brcs	.+8      	; 0x2c846 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x6e4>
   2c83e:	0f ef       	ldi	r16, 0xFF	; 255
   2c840:	10 e0       	ldi	r17, 0x00	; 0
   2c842:	20 e0       	ldi	r18, 0x00	; 0
   2c844:	30 e0       	ldi	r19, 0x00	; 0
   2c846:	2f 96       	adiw	r28, 0x0f	; 15
   2c848:	ee ad       	ldd	r30, Y+62	; 0x3e
   2c84a:	ff ad       	ldd	r31, Y+63	; 0x3f
   2c84c:	2f 97       	sbiw	r28, 0x0f	; 15
   2c84e:	07 8f       	std	Z+31, r16	; 0x1f
   2c850:	1f cf       	rjmp	.-450    	; 0x2c690 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]+0x52e>

0002c852 <global constructors keyed to 65535_0_adc.cpp.obj.13918>:
   2c852:	ef 92       	push	r14
   2c854:	ff 92       	push	r15
   2c856:	0f 93       	push	r16
   2c858:	1f 93       	push	r17
   2c85a:	cf 93       	push	r28
   2c85c:	df 93       	push	r29
   2c85e:	cd b7       	in	r28, 0x3d	; 61
   2c860:	de b7       	in	r29, 0x3e	; 62
   2c862:	2f 97       	sbiw	r28, 0x0f	; 15
   2c864:	0f b6       	in	r0, 0x3f	; 63
   2c866:	f8 94       	cli
   2c868:	de bf       	out	0x3e, r29	; 62
   2c86a:	0f be       	out	0x3f, r0	; 63
   2c86c:	cd bf       	out	0x3d, r28	; 61
   2c86e:	10 92 90 12 	sts	0x1290, r1	; 0x801290 <SpoolJoin::spooljoin>
   2c872:	02 e9       	ldi	r16, 0x92	; 146
   2c874:	12 e1       	ldi	r17, 0x12	; 18
   2c876:	ee 24       	eor	r14, r14
   2c878:	e3 94       	inc	r14
   2c87a:	f1 2c       	mov	r15, r1
   2c87c:	d8 01       	movw	r26, r16
   2c87e:	11 96       	adiw	r26, 0x01	; 1
   2c880:	fc 92       	st	X, r15
   2c882:	ee 92       	st	-X, r14
   2c884:	12 96       	adiw	r26, 0x02	; 2
   2c886:	1c 92       	st	X, r1
   2c888:	12 97       	sbiw	r26, 0x02	; 2
   2c88a:	82 e8       	ldi	r24, 0x82	; 130
   2c88c:	13 96       	adiw	r26, 0x03	; 3
   2c88e:	8c 93       	st	X, r24
   2c890:	40 e0       	ldi	r20, 0x00	; 0
   2c892:	60 e0       	ldi	r22, 0x00	; 0
   2c894:	87 e9       	ldi	r24, 0x97	; 151
   2c896:	92 e1       	ldi	r25, 0x12	; 18
   2c898:	0f 94 c7 50 	call	0x2a18e	; 0x2a18e <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   2c89c:	40 e0       	ldi	r20, 0x00	; 0
   2c89e:	60 e0       	ldi	r22, 0x00	; 0
   2c8a0:	8c e9       	ldi	r24, 0x9C	; 156
   2c8a2:	92 e1       	ldi	r25, 0x12	; 18
   2c8a4:	0f 94 c7 50 	call	0x2a18e	; 0x2a18e <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   2c8a8:	f8 01       	movw	r30, r16
   2c8aa:	17 86       	std	Z+15, r1	; 0x0f
   2c8ac:	10 8a       	std	Z+16, r1	; 0x10
   2c8ae:	11 8a       	std	Z+17, r1	; 0x11
   2c8b0:	12 8a       	std	Z+18, r1	; 0x12
   2c8b2:	13 8a       	std	Z+19, r1	; 0x13
   2c8b4:	8a e0       	ldi	r24, 0x0A	; 10
   2c8b6:	84 8b       	std	Z+20, r24	; 0x14
   2c8b8:	40 e0       	ldi	r20, 0x00	; 0
   2c8ba:	60 e0       	ldi	r22, 0x00	; 0
   2c8bc:	ce 01       	movw	r24, r28
   2c8be:	01 96       	adiw	r24, 0x01	; 1
   2c8c0:	0f 94 c7 50 	call	0x2a18e	; 0x2a18e <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   2c8c4:	85 e0       	ldi	r24, 0x05	; 5
   2c8c6:	fe 01       	movw	r30, r28
   2c8c8:	31 96       	adiw	r30, 0x01	; 1
   2c8ca:	de 01       	movw	r26, r28
   2c8cc:	16 96       	adiw	r26, 0x06	; 6
   2c8ce:	01 90       	ld	r0, Z+
   2c8d0:	0d 92       	st	X+, r0
   2c8d2:	8a 95       	dec	r24
   2c8d4:	e1 f7       	brne	.-8      	; 0x2c8ce <global constructors keyed to 65535_0_adc.cpp.obj.13918+0x7c>
   2c8d6:	85 e0       	ldi	r24, 0x05	; 5
   2c8d8:	fe 01       	movw	r30, r28
   2c8da:	36 96       	adiw	r30, 0x06	; 6
   2c8dc:	a7 ea       	ldi	r26, 0xA7	; 167
   2c8de:	b2 e1       	ldi	r27, 0x12	; 18
   2c8e0:	01 90       	ld	r0, Z+
   2c8e2:	0d 92       	st	X+, r0
   2c8e4:	8a 95       	dec	r24
   2c8e6:	e1 f7       	brne	.-8      	; 0x2c8e0 <global constructors keyed to 65535_0_adc.cpp.obj.13918+0x8e>
   2c8e8:	d8 01       	movw	r26, r16
   2c8ea:	5a 96       	adiw	r26, 0x1a	; 26
   2c8ec:	1c 92       	st	X, r1
   2c8ee:	5a 97       	sbiw	r26, 0x1a	; 26
   2c8f0:	5c 96       	adiw	r26, 0x1c	; 28
   2c8f2:	1c 92       	st	X, r1
   2c8f4:	1e 92       	st	-X, r1
   2c8f6:	5b 97       	sbiw	r26, 0x1b	; 27
   2c8f8:	87 ea       	ldi	r24, 0xA7	; 167
   2c8fa:	92 e1       	ldi	r25, 0x12	; 18
   2c8fc:	0f 94 b6 50 	call	0x2a16c	; 0x2a16c <modules::protocol::ResponseMsg::ComputeCRC8() const>
   2c900:	f8 01       	movw	r30, r16
   2c902:	81 8f       	std	Z+25, r24	; 0x19
   2c904:	15 8e       	std	Z+29, r1	; 0x1d
   2c906:	16 8e       	std	Z+30, r1	; 0x1e
   2c908:	40 e0       	ldi	r20, 0x00	; 0
   2c90a:	60 e0       	ldi	r22, 0x00	; 0
   2c90c:	81 eb       	ldi	r24, 0xB1	; 177
   2c90e:	92 e1       	ldi	r25, 0x12	; 18
   2c910:	0f 94 c7 50 	call	0x2a18e	; 0x2a18e <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   2c914:	d8 01       	movw	r26, r16
   2c916:	94 96       	adiw	r26, 0x24	; 36
   2c918:	1c 92       	st	X, r1
   2c91a:	40 e0       	ldi	r20, 0x00	; 0
   2c91c:	60 e0       	ldi	r22, 0x00	; 0
   2c91e:	ce 01       	movw	r24, r28
   2c920:	0b 96       	adiw	r24, 0x0b	; 11
   2c922:	0f 94 c7 50 	call	0x2a18e	; 0x2a18e <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   2c926:	85 e0       	ldi	r24, 0x05	; 5
   2c928:	fe 01       	movw	r30, r28
   2c92a:	3b 96       	adiw	r30, 0x0b	; 11
   2c92c:	de 01       	movw	r26, r28
   2c92e:	11 96       	adiw	r26, 0x01	; 1
   2c930:	01 90       	ld	r0, Z+
   2c932:	0d 92       	st	X+, r0
   2c934:	8a 95       	dec	r24
   2c936:	e1 f7       	brne	.-8      	; 0x2c930 <global constructors keyed to 65535_0_adc.cpp.obj.13918+0xde>
   2c938:	85 e0       	ldi	r24, 0x05	; 5
   2c93a:	fe 01       	movw	r30, r28
   2c93c:	31 96       	adiw	r30, 0x01	; 1
   2c93e:	a7 eb       	ldi	r26, 0xB7	; 183
   2c940:	b2 e1       	ldi	r27, 0x12	; 18
   2c942:	01 90       	ld	r0, Z+
   2c944:	0d 92       	st	X+, r0
   2c946:	8a 95       	dec	r24
   2c948:	e1 f7       	brne	.-8      	; 0x2c942 <global constructors keyed to 65535_0_adc.cpp.obj.13918+0xf0>
   2c94a:	f8 01       	movw	r30, r16
   2c94c:	12 a6       	std	Z+42, r1	; 0x2a
   2c94e:	14 a6       	std	Z+44, r1	; 0x2c
   2c950:	13 a6       	std	Z+43, r1	; 0x2b
   2c952:	87 eb       	ldi	r24, 0xB7	; 183
   2c954:	92 e1       	ldi	r25, 0x12	; 18
   2c956:	0f 94 b6 50 	call	0x2a16c	; 0x2a16c <modules::protocol::ResponseMsg::ComputeCRC8() const>
   2c95a:	d8 01       	movw	r26, r16
   2c95c:	99 96       	adiw	r26, 0x29	; 41
   2c95e:	8c 93       	st	X, r24
   2c960:	99 97       	sbiw	r26, 0x29	; 41
   2c962:	dd 96       	adiw	r26, 0x3d	; 61
   2c964:	1c 92       	st	X, r1
   2c966:	dd 97       	sbiw	r26, 0x3d	; 61
   2c968:	81 e9       	ldi	r24, 0x91	; 145
   2c96a:	92 e1       	ldi	r25, 0x12	; 18
   2c96c:	df 96       	adiw	r26, 0x3f	; 63
   2c96e:	9c 93       	st	X, r25
   2c970:	8e 93       	st	-X, r24
   2c972:	de 97       	sbiw	r26, 0x3e	; 62
   2c974:	f0 92 d3 12 	sts	0x12D3, r15	; 0x8012d3 <MMU2::mmu2+0x41>
   2c978:	e0 92 d2 12 	sts	0x12D2, r14	; 0x8012d2 <MMU2::mmu2+0x40>
   2c97c:	10 92 d4 12 	sts	0x12D4, r1	; 0x8012d4 <MMU2::mmu2+0x42>
   2c980:	1f ef       	ldi	r17, 0xFF	; 255
   2c982:	10 93 d5 12 	sts	0x12D5, r17	; 0x8012d5 <MMU2::mmu2+0x43>
   2c986:	0f 94 0a 51 	call	0x2a214	; 0x2a214 <MMU2::WhereIsFilament()>
   2c98a:	80 93 d6 12 	sts	0x12D6, r24	; 0x8012d6 <MMU2::mmu2+0x44>
   2c98e:	10 92 d7 12 	sts	0x12D7, r1	; 0x8012d7 <MMU2::mmu2+0x45>
   2c992:	10 92 d8 12 	sts	0x12D8, r1	; 0x8012d8 <MMU2::mmu2+0x46>
   2c996:	10 92 d9 12 	sts	0x12D9, r1	; 0x8012d9 <MMU2::mmu2+0x47>
   2c99a:	10 92 db 12 	sts	0x12DB, r1	; 0x8012db <MMU2::mmu2+0x49>
   2c99e:	10 92 da 12 	sts	0x12DA, r1	; 0x8012da <MMU2::mmu2+0x48>
   2c9a2:	10 92 dd 12 	sts	0x12DD, r1	; 0x8012dd <MMU2::mmu2+0x4b>
   2c9a6:	10 92 dc 12 	sts	0x12DC, r1	; 0x8012dc <MMU2::mmu2+0x4a>
   2c9aa:	10 92 e0 12 	sts	0x12E0, r1	; 0x8012e0 <MMU2::mmu2+0x4e>
   2c9ae:	10 92 e1 12 	sts	0x12E1, r1	; 0x8012e1 <MMU2::mmu2+0x4f>
   2c9b2:	10 92 e2 12 	sts	0x12E2, r1	; 0x8012e2 <MMU2::mmu2+0x50>
   2c9b6:	10 92 e3 12 	sts	0x12E3, r1	; 0x8012e3 <MMU2::mmu2+0x51>
   2c9ba:	83 e0       	ldi	r24, 0x03	; 3
   2c9bc:	80 93 e6 12 	sts	0x12E6, r24	; 0x8012e6 <MMU2::mmu2+0x54>
   2c9c0:	10 92 e7 12 	sts	0x12E7, r1	; 0x8012e7 <MMU2::mmu2+0x55>
   2c9c4:	85 e1       	ldi	r24, 0x15	; 21
   2c9c6:	80 93 de 12 	sts	0x12DE, r24	; 0x8012de <MMU2::mmu2+0x4c>
   2c9ca:	84 e1       	ldi	r24, 0x14	; 20
   2c9cc:	80 93 df 12 	sts	0x12DF, r24	; 0x8012df <MMU2::mmu2+0x4d>
   2c9d0:	83 e6       	ldi	r24, 0x63	; 99
   2c9d2:	80 93 e8 12 	sts	0x12E8, r24	; 0x8012e8 <MMU2::mmu2+0x56>
   2c9d6:	80 93 e9 12 	sts	0x12E9, r24	; 0x8012e9 <MMU2::mmu2+0x57>
   2c9da:	10 92 ea 12 	sts	0x12EA, r1	; 0x8012ea <MMU2::mmu2+0x58>
   2c9de:	10 92 eb 12 	sts	0x12EB, r1	; 0x8012eb <MMU2::mmu2+0x59>
   2c9e2:	10 92 ec 12 	sts	0x12EC, r1	; 0x8012ec <MMU2::mmu2+0x5a>
   2c9e6:	10 92 ed 12 	sts	0x12ED, r1	; 0x8012ed <MMU2::mmu2+0x5b>
   2c9ea:	10 92 ee 12 	sts	0x12EE, r1	; 0x8012ee <MMU2::mmu2+0x5c>
   2c9ee:	10 92 ef 12 	sts	0x12EF, r1	; 0x8012ef <MMU2::mmu2+0x5d>
   2c9f2:	10 92 f0 12 	sts	0x12F0, r1	; 0x8012f0 <MMU2::mmu2+0x5e>
   2c9f6:	10 92 f1 12 	sts	0x12F1, r1	; 0x8012f1 <MMU2::mmu2+0x5f>
   2c9fa:	10 92 f2 12 	sts	0x12F2, r1	; 0x8012f2 <MMU2::mmu2+0x60>
   2c9fe:	10 92 f3 12 	sts	0x12F3, r1	; 0x8012f3 <MMU2::mmu2+0x61>
   2ca02:	10 92 f4 12 	sts	0x12F4, r1	; 0x8012f4 <MMU2::mmu2+0x62>
   2ca06:	10 92 f5 12 	sts	0x12F5, r1	; 0x8012f5 <MMU2::mmu2+0x63>
   2ca0a:	10 92 f7 12 	sts	0x12F7, r1	; 0x8012f7 <MMU2::mmu2+0x65>
   2ca0e:	10 92 f6 12 	sts	0x12F6, r1	; 0x8012f6 <MMU2::mmu2+0x64>
   2ca12:	10 92 f8 12 	sts	0x12F8, r1	; 0x8012f8 <MMU2::mmu2+0x66>
   2ca16:	8e e2       	ldi	r24, 0x2E	; 46
   2ca18:	90 e8       	ldi	r25, 0x80	; 128
   2ca1a:	90 93 fa 12 	sts	0x12FA, r25	; 0x8012fa <MMU2::mmu2+0x68>
   2ca1e:	80 93 f9 12 	sts	0x12F9, r24	; 0x8012f9 <MMU2::mmu2+0x67>
   2ca22:	10 93 fb 12 	sts	0x12FB, r17	; 0x8012fb <MMU2::mmu2+0x69>
   2ca26:	10 93 fc 12 	sts	0x12FC, r17	; 0x8012fc <MMU2::mmu2+0x6a>
   2ca2a:	10 92 fe 12 	sts	0x12FE, r1	; 0x8012fe <MMU2::mmu2+0x6c>
   2ca2e:	10 92 fd 12 	sts	0x12FD, r1	; 0x8012fd <MMU2::mmu2+0x6b>
   2ca32:	10 93 ff 12 	sts	0x12FF, r17	; 0x8012ff <MMU2::mmu2+0x6d>
   2ca36:	82 e0       	ldi	r24, 0x02	; 2
   2ca38:	80 93 00 13 	sts	0x1300, r24	; 0x801300 <MMU2::mmu2+0x6e>
   2ca3c:	10 92 01 13 	sts	0x1301, r1	; 0x801301 <MMU2::mmu2+0x6f>
   2ca40:	10 92 02 13 	sts	0x1302, r1	; 0x801302 <MMU2::mmu2+0x70>
   2ca44:	10 92 03 13 	sts	0x1303, r1	; 0x801303 <MMU2::mmu2+0x71>
   2ca48:	10 92 04 13 	sts	0x1304, r1	; 0x801304 <MMU2::mmu2+0x72>
   2ca4c:	10 92 06 13 	sts	0x1306, r1	; 0x801306 <MMU2::mmu2+0x74>
   2ca50:	10 92 05 13 	sts	0x1305, r1	; 0x801305 <MMU2::mmu2+0x73>
   2ca54:	10 92 08 13 	sts	0x1308, r1	; 0x801308 <MMU2::mmu2+0x76>
   2ca58:	10 92 07 13 	sts	0x1307, r1	; 0x801307 <MMU2::mmu2+0x75>
   2ca5c:	0f 94 e3 7b 	call	0x2f7c6	; 0x2f7c6 <mesh_bed_leveling::reset() [clone .constprop.87]>
   2ca60:	e5 ed       	ldi	r30, 0xD5	; 213
   2ca62:	f3 e1       	ldi	r31, 0x13	; 19
   2ca64:	10 92 5d 14 	sts	0x145D, r1	; 0x80145d <card+0x88>
   2ca68:	10 92 60 14 	sts	0x1460, r1	; 0x801460 <card+0x8b>
   2ca6c:	10 92 82 14 	sts	0x1482, r1	; 0x801482 <card+0xad>
   2ca70:	10 92 85 14 	sts	0x1485, r1	; 0x801485 <card+0xb0>
   2ca74:	89 e1       	ldi	r24, 0x19	; 25
   2ca76:	80 93 44 16 	sts	0x1644, r24	; 0x801644 <card+0x26f>
   2ca7a:	10 92 47 16 	sts	0x1647, r1	; 0x801647 <card+0x272>
   2ca7e:	10 92 48 16 	sts	0x1648, r1	; 0x801648 <card+0x273>
   2ca82:	10 92 60 16 	sts	0x1660, r1	; 0x801660 <card+0x28b>
   2ca86:	10 92 67 16 	sts	0x1667, r1	; 0x801667 <card+0x292>
   2ca8a:	10 92 6a 16 	sts	0x166A, r1	; 0x80166a <card+0x295>
   2ca8e:	10 92 e8 16 	sts	0x16E8, r1	; 0x8016e8 <card+0x313>
   2ca92:	10 92 ea 16 	sts	0x16EA, r1	; 0x8016ea <card+0x315>
   2ca96:	10 92 e9 16 	sts	0x16E9, r1	; 0x8016e9 <card+0x314>
   2ca9a:	10 92 79 15 	sts	0x1579, r1	; 0x801579 <card+0x1a4>
   2ca9e:	10 92 78 15 	sts	0x1578, r1	; 0x801578 <card+0x1a3>
   2caa2:	10 92 e4 16 	sts	0x16E4, r1	; 0x8016e4 <card+0x30f>
   2caa6:	10 92 e5 16 	sts	0x16E5, r1	; 0x8016e5 <card+0x310>
   2caaa:	10 92 e6 16 	sts	0x16E6, r1	; 0x8016e6 <card+0x311>
   2caae:	10 92 e7 16 	sts	0x16E7, r1	; 0x8016e7 <card+0x312>
   2cab2:	10 92 eb 16 	sts	0x16EB, r1	; 0x8016eb <card+0x316>
   2cab6:	10 92 ec 16 	sts	0x16EC, r1	; 0x8016ec <card+0x317>
   2caba:	10 92 ed 16 	sts	0x16ED, r1	; 0x8016ed <card+0x318>
   2cabe:	10 92 ee 16 	sts	0x16EE, r1	; 0x8016ee <card+0x319>
   2cac2:	12 82       	std	Z+2, r1	; 0x02
   2cac4:	13 82       	std	Z+3, r1	; 0x03
   2cac6:	10 82       	st	Z, r1
   2cac8:	11 82       	std	Z+1, r1	; 0x01
   2caca:	10 92 77 15 	sts	0x1577, r1	; 0x801577 <card+0x1a2>
   2cace:	10 92 8a 16 	sts	0x168A, r1	; 0x80168a <card+0x2b5>
   2cad2:	e5 ea       	ldi	r30, 0xA5	; 165
   2cad4:	f4 e1       	ldi	r31, 0x14	; 20
   2cad6:	82 ed       	ldi	r24, 0xD2	; 210
   2cad8:	df 01       	movw	r26, r30
   2cada:	1d 92       	st	X+, r1
   2cadc:	8a 95       	dec	r24
   2cade:	e9 f7       	brne	.-6      	; 0x2cada <global constructors keyed to 65535_0_adc.cpp.obj.13918+0x288>
   2cae0:	10 92 26 14 	sts	0x1426, r1	; 0x801426 <card+0x51>
   2cae4:	10 92 25 14 	sts	0x1425, r1	; 0x801425 <card+0x50>
   2cae8:	10 92 24 14 	sts	0x1424, r1	; 0x801424 <card+0x4f>
   2caec:	88 ee       	ldi	r24, 0xE8	; 232
   2caee:	96 e1       	ldi	r25, 0x16	; 22
   2caf0:	0f 94 4e 0e 	call	0x21c9c	; 0x21c9c <Timer<unsigned short>::start()>
   2caf4:	ee ec       	ldi	r30, 0xCE	; 206
   2caf6:	f3 e1       	ldi	r31, 0x13	; 19
   2caf8:	11 82       	std	Z+1, r1	; 0x01
   2cafa:	12 82       	std	Z+2, r1	; 0x02
   2cafc:	13 82       	std	Z+3, r1	; 0x03
   2cafe:	14 82       	std	Z+4, r1	; 0x04
   2cb00:	15 82       	std	Z+5, r1	; 0x05
   2cb02:	16 82       	std	Z+6, r1	; 0x06
   2cb04:	10 83       	st	Z, r17
   2cb06:	e1 ef       	ldi	r30, 0xF1	; 241
   2cb08:	f6 e1       	ldi	r31, 0x16	; 22
   2cb0a:	15 82       	std	Z+5, r1	; 0x05
   2cb0c:	17 82       	std	Z+7, r1	; 0x07
   2cb0e:	16 82       	std	Z+6, r1	; 0x06
   2cb10:	11 86       	std	Z+9, r1	; 0x09
   2cb12:	13 86       	std	Z+11, r1	; 0x0b
   2cb14:	12 86       	std	Z+10, r1	; 0x0a
   2cb16:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   2cb1a:	60 93 07 17 	sts	0x1707, r22	; 0x801707 <extruder_autofan_last_check>
   2cb1e:	70 93 08 17 	sts	0x1708, r23	; 0x801708 <extruder_autofan_last_check+0x1>
   2cb22:	80 93 09 17 	sts	0x1709, r24	; 0x801709 <extruder_autofan_last_check+0x2>
   2cb26:	90 93 0a 17 	sts	0x170A, r25	; 0x80170a <extruder_autofan_last_check+0x3>
   2cb2a:	2f 96       	adiw	r28, 0x0f	; 15
   2cb2c:	0f b6       	in	r0, 0x3f	; 63
   2cb2e:	f8 94       	cli
   2cb30:	de bf       	out	0x3e, r29	; 62
   2cb32:	0f be       	out	0x3f, r0	; 63
   2cb34:	cd bf       	out	0x3d, r28	; 61
   2cb36:	df 91       	pop	r29
   2cb38:	cf 91       	pop	r28
   2cb3a:	1f 91       	pop	r17
   2cb3c:	0f 91       	pop	r16
   2cb3e:	ff 90       	pop	r15
   2cb40:	ef 90       	pop	r14
   2cb42:	08 95       	ret

0002cb44 <MarlinSerial::println(double, int) [clone .constprop.354]>:
   2cb44:	42 e0       	ldi	r20, 0x02	; 2
   2cb46:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
}

void MarlinSerial::println(double n, int digits)
{
  print(n, digits);
  println();
   2cb4a:	0c 94 bc 7a 	jmp	0xf578	; 0xf578 <MarlinSerial::println()>

0002cb4e <MMU2::MMU2::get_current_tool() const [clone .constprop.351]>:
void MMU2::get_statistics() {
    logic.Statistics();
}

uint8_t __attribute__((noinline)) MMU2::get_current_tool() const {
    return extruder == MMU2_NO_TOOL ? (uint8_t)FILAMENT_UNKNOWN : extruder;
   2cb4e:	80 91 e8 12 	lds	r24, 0x12E8	; 0x8012e8 <MMU2::mmu2+0x56>
   2cb52:	83 36       	cpi	r24, 0x63	; 99
   2cb54:	09 f4       	brne	.+2      	; 0x2cb58 <MMU2::MMU2::get_current_tool() const [clone .constprop.351]+0xa>
   2cb56:	8f ef       	ldi	r24, 0xFF	; 255
}
   2cb58:	08 95       	ret

0002cb5a <MMU2::MMU2::Status() [clone .constprop.340]>:
    , tmcFailures(0) {
}

void MMU2::Status() {
    // Useful information to see during bootup and change state
    SERIAL_ECHOPGM("MMU is ");
   2cb5a:	8c ed       	ldi	r24, 0xDC	; 220
   2cb5c:	91 ea       	ldi	r25, 0xA1	; 161
   2cb5e:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    uint8_t status = eeprom_init_default_byte((uint8_t*)EEPROM_MMU_ENABLED, 0);
   2cb62:	60 e0       	ldi	r22, 0x00	; 0
   2cb64:	8c ea       	ldi	r24, 0xAC	; 172
   2cb66:	9c e0       	ldi	r25, 0x0C	; 12
   2cb68:	0e 94 5d 78 	call	0xf0ba	; 0xf0ba <eeprom_init_default_byte(unsigned char*, unsigned char)>
    if (status == 1) {
   2cb6c:	81 30       	cpi	r24, 0x01	; 1
   2cb6e:	21 f4       	brne	.+8      	; 0x2cb78 <MMU2::MMU2::Status() [clone .constprop.340]+0x1e>
        SERIAL_ECHOLNRPGM(_O(MSG_ON));
   2cb70:	8c e9       	ldi	r24, 0x9C	; 156
   2cb72:	92 e6       	ldi	r25, 0x62	; 98
    } else {
        SERIAL_ECHOLNRPGM(_O(MSG_OFF));
   2cb74:	0c 94 bd 7c 	jmp	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
   2cb78:	86 e9       	ldi	r24, 0x96	; 150
   2cb7a:	92 e6       	ldi	r25, 0x62	; 98
   2cb7c:	fb cf       	rjmp	.-10     	; 0x2cb74 <MMU2::MMU2::Status() [clone .constprop.340]+0x1a>

0002cb7e <MarlinSerial::println(int, int) [clone .constprop.319]>:
  print((unsigned long) b, base);
}

void MarlinSerial::print(int n, int base)
{
  print((long) n, base);
   2cb7e:	bc 01       	movw	r22, r24
   2cb80:	99 0f       	add	r25, r25
   2cb82:	88 0b       	sbc	r24, r24
   2cb84:	99 0b       	sbc	r25, r25
   2cb86:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
}

void MarlinSerial::println(int n, int base)
{
  print(n, base);
  println();
   2cb8a:	0c 94 bc 7a 	jmp	0xf578	; 0xf578 <MarlinSerial::println()>

0002cb8e <MMU2::MMU2::SetCurrentTool(unsigned char) [clone .constprop.318]>:

uint8_t MMU2::get_tool_change_tool() const {
    return tool_change_extruder == MMU2_NO_TOOL ? (uint8_t)FILAMENT_UNKNOWN : tool_change_extruder;
}

void MMU2::SetCurrentTool(uint8_t ex){
   2cb8e:	cf 93       	push	r28
   2cb90:	c8 2f       	mov	r28, r24
    extruder = ex;
   2cb92:	80 93 e8 12 	sts	0x12E8, r24	; 0x8012e8 <MMU2::mmu2+0x56>
    MMU2_ECHO_MSGRPGM(PSTR("MMU2tool="));
   2cb96:	8e ec       	ldi	r24, 0xCE	; 206
   2cb98:	91 ea       	ldi	r25, 0xA1	; 161
   2cb9a:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   2cb9e:	82 ec       	ldi	r24, 0xC2	; 194
   2cba0:	91 ea       	ldi	r25, 0xA1	; 161
   2cba2:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   2cba6:	88 eb       	ldi	r24, 0xB8	; 184
   2cba8:	91 ea       	ldi	r25, 0xA1	; 161
   2cbaa:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    SERIAL_ECHOLN((int)ex);
   2cbae:	8c 2f       	mov	r24, r28
   2cbb0:	90 e0       	ldi	r25, 0x00	; 0
}
   2cbb2:	cf 91       	pop	r28
}

void MMU2::SetCurrentTool(uint8_t ex){
    extruder = ex;
    MMU2_ECHO_MSGRPGM(PSTR("MMU2tool="));
    SERIAL_ECHOLN((int)ex);
   2cbb4:	0d 94 bf 65 	jmp	0x2cb7e	; 0x2cb7e <MarlinSerial::println(int, int) [clone .constprop.319]>

0002cbb8 <Sd2Card::chipSelectHigh() [clone .constprop.312]>:
    return 0;
  }
}
//------------------------------------------------------------------------------
void Sd2Card::chipSelectHigh() {
  WRITE(SDSS, 1);
   2cbb8:	28 9a       	sbi	0x05, 0	; 5
}
   2cbba:	08 95       	ret

0002cbbc <Sd2Card::waitNotBusy(unsigned int) [clone .constprop.311]>:
  spiRate_ = sckRateID;
  return true;
}
//------------------------------------------------------------------------------
// wait for card to go not busy
bool Sd2Card::waitNotBusy(uint16_t timeoutMillis) {
   2cbbc:	0f 93       	push	r16
   2cbbe:	1f 93       	push	r17
   2cbc0:	cf 93       	push	r28
   2cbc2:	df 93       	push	r29
   2cbc4:	ec 01       	movw	r28, r24
  uint16_t t0 = _millis();
   2cbc6:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   2cbca:	8b 01       	movw	r16, r22
  while (spiRec() != 0XFF) {
   2cbcc:	0f 94 ca 28 	call	0x25194	; 0x25194 <spiRec() [clone .lto_priv.366]>
   2cbd0:	8f 3f       	cpi	r24, 0xFF	; 255
   2cbd2:	69 f0       	breq	.+26     	; 0x2cbee <Sd2Card::waitNotBusy(unsigned int) [clone .constprop.311]+0x32>
    if (((uint16_t)_millis() - t0) >= timeoutMillis) goto fail;
   2cbd4:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   2cbd8:	60 1b       	sub	r22, r16
   2cbda:	71 0b       	sbc	r23, r17
   2cbdc:	6c 17       	cp	r22, r28
   2cbde:	7d 07       	cpc	r23, r29
   2cbe0:	a8 f3       	brcs	.-22     	; 0x2cbcc <Sd2Card::waitNotBusy(unsigned int) [clone .constprop.311]+0x10>
  }
  return true;

 fail:
  return false;
   2cbe2:	80 e0       	ldi	r24, 0x00	; 0
}
   2cbe4:	df 91       	pop	r29
   2cbe6:	cf 91       	pop	r28
   2cbe8:	1f 91       	pop	r17
   2cbea:	0f 91       	pop	r16
   2cbec:	08 95       	ret
bool Sd2Card::waitNotBusy(uint16_t timeoutMillis) {
  uint16_t t0 = _millis();
  while (spiRec() != 0XFF) {
    if (((uint16_t)_millis() - t0) >= timeoutMillis) goto fail;
  }
  return true;
   2cbee:	81 e0       	ldi	r24, 0x01	; 1
   2cbf0:	f9 cf       	rjmp	.-14     	; 0x2cbe4 <Sd2Card::waitNotBusy(unsigned int) [clone .constprop.311]+0x28>

0002cbf2 <CardReader::closefile(bool) [clone .constprop.307]>:
    lastnr++;
}

void CardReader::closefile(bool store_location)
{
  file.sync();
   2cbf2:	87 e6       	ldi	r24, 0x67	; 103
   2cbf4:	96 e1       	ldi	r25, 0x16	; 22
   2cbf6:	0f 94 b4 2e 	call	0x25d68	; 0x25d68 <SdBaseFile::sync()>
  file.close();
   2cbfa:	87 e6       	ldi	r24, 0x67	; 103
   2cbfc:	96 e1       	ldi	r25, 0x16	; 22
   2cbfe:	0f 94 e9 2e 	call	0x25dd2	; 0x25dd2 <SdBaseFile::close()>
  saving = false;
   2cc02:	e5 ed       	ldi	r30, 0xD5	; 213
   2cc04:	f3 e1       	ldi	r31, 0x13	; 19
   2cc06:	10 82       	st	Z, r1
  logging = false;
   2cc08:	11 82       	std	Z+1, r1	; 0x01
    // so one can unplug the printer and continue printing the next day.

  }


}
   2cc0a:	08 95       	ret

0002cc0c <stop_and_save_print_to_ram(float, float) [clone .constprop.303]>:
//! If printing from sd card, position in file is saved.
//! If printing from USB, line number is saved.
//!
//! @param z_move
//! @param e_move
void stop_and_save_print_to_ram(float z_move, float e_move)
   2cc0c:	cf 92       	push	r12
   2cc0e:	df 92       	push	r13
   2cc10:	ef 92       	push	r14
   2cc12:	ff 92       	push	r15
   2cc14:	0f 93       	push	r16
   2cc16:	1f 93       	push	r17
   2cc18:	cf 93       	push	r28
   2cc1a:	df 93       	push	r29
{
	if (saved_printing) return;
   2cc1c:	20 91 73 12 	lds	r18, 0x1273	; 0x801273 <saved_printing>
   2cc20:	21 11       	cpse	r18, r1
   2cc22:	d9 c0       	rjmp	.+434    	; 0x2cdd6 <stop_and_save_print_to_ram(float, float) [clone .constprop.303]+0x1ca>
   2cc24:	09 2f       	mov	r16, r25
   2cc26:	18 2f       	mov	r17, r24
   2cc28:	eb 01       	movw	r28, r22

	cli();
   2cc2a:	f8 94       	cli
void save_print_file_state() {
    uint8_t nlines;
    uint16_t sdlen_cmdqueue;
    uint16_t sdlen_planner;

    if (card.sdprinting) {
   2cc2c:	80 91 d7 13 	lds	r24, 0x13D7	; 0x8013d7 <card+0x2>
   2cc30:	88 23       	and	r24, r24
   2cc32:	09 f4       	brne	.+2      	; 0x2cc36 <stop_and_save_print_to_ram(float, float) [clone .constprop.303]+0x2a>
   2cc34:	d9 c0       	rjmp	.+434    	; 0x2cde8 <stop_and_save_print_to_ram(float, float) [clone .constprop.303]+0x1dc>
        saved_sdpos = sdpos_atomic; //atomic sd position of last command added in queue
   2cc36:	80 91 49 12 	lds	r24, 0x1249	; 0x801249 <sdpos_atomic>
   2cc3a:	90 91 4a 12 	lds	r25, 0x124A	; 0x80124a <sdpos_atomic+0x1>
   2cc3e:	a0 91 4b 12 	lds	r26, 0x124B	; 0x80124b <sdpos_atomic+0x2>
   2cc42:	b0 91 4c 12 	lds	r27, 0x124C	; 0x80124c <sdpos_atomic+0x3>
   2cc46:	80 93 45 12 	sts	0x1245, r24	; 0x801245 <saved_sdpos>
   2cc4a:	90 93 46 12 	sts	0x1246, r25	; 0x801246 <saved_sdpos+0x1>
   2cc4e:	a0 93 47 12 	sts	0x1247, r26	; 0x801247 <saved_sdpos+0x2>
   2cc52:	b0 93 48 12 	sts	0x1248, r27	; 0x801248 <saved_sdpos+0x3>
        sdlen_planner = planner_calc_sd_length(); //length of sd commands in planner
   2cc56:	0f 94 76 3c 	call	0x278ec	; 0x278ec <planner_calc_sd_length()>
        saved_sdpos -= sdlen_planner;
   2cc5a:	c0 90 45 12 	lds	r12, 0x1245	; 0x801245 <saved_sdpos>
   2cc5e:	d0 90 46 12 	lds	r13, 0x1246	; 0x801246 <saved_sdpos+0x1>
   2cc62:	e0 90 47 12 	lds	r14, 0x1247	; 0x801247 <saved_sdpos+0x2>
   2cc66:	f0 90 48 12 	lds	r15, 0x1248	; 0x801248 <saved_sdpos+0x3>
   2cc6a:	c8 1a       	sub	r12, r24
   2cc6c:	d9 0a       	sbc	r13, r25
   2cc6e:	e1 08       	sbc	r14, r1
   2cc70:	f1 08       	sbc	r15, r1
   2cc72:	c0 92 45 12 	sts	0x1245, r12	; 0x801245 <saved_sdpos>
   2cc76:	d0 92 46 12 	sts	0x1246, r13	; 0x801246 <saved_sdpos+0x1>
   2cc7a:	e0 92 47 12 	sts	0x1247, r14	; 0x801247 <saved_sdpos+0x2>
   2cc7e:	f0 92 48 12 	sts	0x1248, r15	; 0x801248 <saved_sdpos+0x3>
        sdlen_cmdqueue = cmdqueue_calc_sd_length(); //length of sd commands in cmdqueue
   2cc82:	0e 94 03 79 	call	0xf206	; 0xf206 <cmdqueue_calc_sd_length()>
        saved_sdpos -= sdlen_cmdqueue;
   2cc86:	c8 1a       	sub	r12, r24
   2cc88:	d9 0a       	sbc	r13, r25
   2cc8a:	e1 08       	sbc	r14, r1
   2cc8c:	f1 08       	sbc	r15, r1
   2cc8e:	c0 92 45 12 	sts	0x1245, r12	; 0x801245 <saved_sdpos>
   2cc92:	d0 92 46 12 	sts	0x1246, r13	; 0x801246 <saved_sdpos+0x1>
   2cc96:	e0 92 47 12 	sts	0x1247, r14	; 0x801247 <saved_sdpos+0x2>
   2cc9a:	f0 92 48 12 	sts	0x1248, r15	; 0x801248 <saved_sdpos+0x3>
        saved_printing_type = PowerPanic::PRINT_TYPE_SD;
   2cc9e:	10 92 79 02 	sts	0x0279, r1	; 0x800279 <saved_printing_type>

	cli();
	save_print_file_state();

    // save the global state at planning time
    const bool pos_invalid = mesh_bed_leveling_flag || homing_flag;
   2cca2:	80 91 72 12 	lds	r24, 0x1272	; 0x801272 <mesh_bed_leveling_flag>
   2cca6:	f0 90 71 12 	lds	r15, 0x1271	; 0x801271 <homing_flag>
   2ccaa:	81 11       	cpse	r24, r1
   2ccac:	f8 2e       	mov	r15, r24
      //not sd printing nor usb printing
    }
}

void save_planner_global_state() {
    if (current_block && !(mesh_bed_leveling_flag || homing_flag))
   2ccae:	20 91 51 12 	lds	r18, 0x1251	; 0x801251 <current_block>
   2ccb2:	30 91 52 12 	lds	r19, 0x1252	; 0x801252 <current_block+0x1>
   2ccb6:	21 15       	cp	r18, r1
   2ccb8:	31 05       	cpc	r19, r1
   2ccba:	09 f4       	brne	.+2      	; 0x2ccbe <stop_and_save_print_to_ram(float, float) [clone .constprop.303]+0xb2>
   2ccbc:	d1 c0       	rjmp	.+418    	; 0x2ce60 <stop_and_save_print_to_ram(float, float) [clone .constprop.303]+0x254>
   2ccbe:	81 11       	cpse	r24, r1
   2ccc0:	cf c0       	rjmp	.+414    	; 0x2ce60 <stop_and_save_print_to_ram(float, float) [clone .constprop.303]+0x254>
   2ccc2:	80 91 71 12 	lds	r24, 0x1271	; 0x801271 <homing_flag>
   2ccc6:	81 11       	cpse	r24, r1
   2ccc8:	cb c0       	rjmp	.+406    	; 0x2ce60 <stop_and_save_print_to_ram(float, float) [clone .constprop.303]+0x254>
    {
        memcpy(saved_start_position, current_block->gcode_start_position, sizeof(saved_start_position));
   2ccca:	f9 01       	movw	r30, r18
   2cccc:	e8 5a       	subi	r30, 0xA8	; 168
   2ccce:	ff 4f       	sbci	r31, 0xFF	; 255
   2ccd0:	80 e1       	ldi	r24, 0x10	; 16
   2ccd2:	ae e7       	ldi	r26, 0x7E	; 126
   2ccd4:	b2 e0       	ldi	r27, 0x02	; 2
   2ccd6:	01 90       	ld	r0, Z+
   2ccd8:	0d 92       	st	X+, r0
   2ccda:	8a 95       	dec	r24
   2ccdc:	e1 f7       	brne	.-8      	; 0x2ccd6 <stop_and_save_print_to_ram(float, float) [clone .constprop.303]+0xca>
        saved_feedrate2 = current_block->gcode_feedrate;
   2ccde:	f9 01       	movw	r30, r18
   2cce0:	e6 59       	subi	r30, 0x96	; 150
   2cce2:	ff 4f       	sbci	r31, 0xFF	; 255
   2cce4:	80 81       	ld	r24, Z
   2cce6:	91 81       	ldd	r25, Z+1	; 0x01
   2cce8:	90 93 50 12 	sts	0x1250, r25	; 0x801250 <saved_feedrate2+0x1>
   2ccec:	80 93 4f 12 	sts	0x124F, r24	; 0x80124f <saved_feedrate2>
        saved_segment_idx = current_block->segment_idx;
   2ccf0:	28 59       	subi	r18, 0x98	; 152
   2ccf2:	3f 4f       	sbci	r19, 0xFF	; 255
   2ccf4:	f9 01       	movw	r30, r18
   2ccf6:	80 81       	ld	r24, Z
   2ccf8:	91 81       	ldd	r25, Z+1	; 0x01
   2ccfa:	90 93 4e 12 	sts	0x124E, r25	; 0x80124e <saved_segment_idx+0x1>
   2ccfe:	80 93 4d 12 	sts	0x124D, r24	; 0x80124d <saved_segment_idx>

    // save the global state at planning time
    const bool pos_invalid = mesh_bed_leveling_flag || homing_flag;
    save_planner_global_state();

	planner_abort_hard(); //abort printing
   2cd02:	0f 94 fb 4e 	call	0x29df6	; 0x29df6 <planner_abort_hard()>

	memcpy(saved_pos, current_position, sizeof(saved_pos));
   2cd06:	80 e1       	ldi	r24, 0x10	; 16
   2cd08:	e1 e6       	ldi	r30, 0x61	; 97
   2cd0a:	f2 e1       	ldi	r31, 0x12	; 18
   2cd0c:	a0 e9       	ldi	r26, 0x90	; 144
   2cd0e:	b2 e0       	ldi	r27, 0x02	; 2
   2cd10:	01 90       	ld	r0, Z+
   2cd12:	0d 92       	st	X+, r0
   2cd14:	8a 95       	dec	r24
   2cd16:	e1 f7       	brne	.-8      	; 0x2cd10 <stop_and_save_print_to_ram(float, float) [clone .constprop.303]+0x104>
    if (pos_invalid) saved_pos[X_AXIS] = X_COORD_INVALID;
   2cd18:	ff 20       	and	r15, r15
   2cd1a:	61 f0       	breq	.+24     	; 0x2cd34 <stop_and_save_print_to_ram(float, float) [clone .constprop.303]+0x128>
   2cd1c:	80 e0       	ldi	r24, 0x00	; 0
   2cd1e:	90 e0       	ldi	r25, 0x00	; 0
   2cd20:	a0 e8       	ldi	r26, 0x80	; 128
   2cd22:	bf eb       	ldi	r27, 0xBF	; 191
   2cd24:	80 93 90 02 	sts	0x0290, r24	; 0x800290 <saved_pos>
   2cd28:	90 93 91 02 	sts	0x0291, r25	; 0x800291 <saved_pos+0x1>
   2cd2c:	a0 93 92 02 	sts	0x0292, r26	; 0x800292 <saved_pos+0x2>
   2cd30:	b0 93 93 02 	sts	0x0293, r27	; 0x800293 <saved_pos+0x3>

    saved_feedmultiply2 = feedmultiply; //save feedmultiply
   2cd34:	80 91 8e 02 	lds	r24, 0x028E	; 0x80028e <feedmultiply>
   2cd38:	90 91 8f 02 	lds	r25, 0x028F	; 0x80028f <feedmultiply+0x1>
   2cd3c:	90 93 60 12 	sts	0x1260, r25	; 0x801260 <_ZL19saved_feedmultiply2.lto_priv.498+0x1>
   2cd40:	80 93 5f 12 	sts	0x125F, r24	; 0x80125f <_ZL19saved_feedmultiply2.lto_priv.498>
	saved_extruder_temperature = (uint16_t)degTargetHotend(active_extruder);
   2cd44:	80 91 5d 12 	lds	r24, 0x125D	; 0x80125d <target_temperature>
   2cd48:	90 91 5e 12 	lds	r25, 0x125E	; 0x80125e <target_temperature+0x1>
   2cd4c:	90 93 5c 12 	sts	0x125C, r25	; 0x80125c <saved_extruder_temperature+0x1>
   2cd50:	80 93 5b 12 	sts	0x125B, r24	; 0x80125b <saved_extruder_temperature>
	saved_bed_temperature = (uint8_t)degTargetBed();
   2cd54:	80 91 59 12 	lds	r24, 0x1259	; 0x801259 <target_temperature_bed>
   2cd58:	80 93 58 12 	sts	0x1258, r24	; 0x801258 <saved_bed_temperature>
	saved_extruder_relative_mode = axis_relative_modes & E_AXIS_MASK;
   2cd5c:	80 91 57 12 	lds	r24, 0x1257	; 0x801257 <axis_relative_modes>
   2cd60:	83 fb       	bst	r24, 3
   2cd62:	88 27       	eor	r24, r24
   2cd64:	80 f9       	bld	r24, 0
   2cd66:	80 93 56 12 	sts	0x1256, r24	; 0x801256 <saved_extruder_relative_mode>
	saved_fan_speed = fanSpeed;
   2cd6a:	80 91 55 12 	lds	r24, 0x1255	; 0x801255 <fanSpeed>
   2cd6e:	80 93 54 12 	sts	0x1254, r24	; 0x801254 <saved_fan_speed>
	cmdqueue_reset(); //empty cmdqueue
   2cd72:	0e 94 3c 85 	call	0x10a78	; 0x10a78 <cmdqueue_reset()>
	card.sdprinting = false;
   2cd76:	10 92 d7 13 	sts	0x13D7, r1	; 0x8013d7 <card+0x2>
//	card.closefile();
	saved_printing = true;
   2cd7a:	81 e0       	ldi	r24, 0x01	; 1
   2cd7c:	80 93 73 12 	sts	0x1273, r24	; 0x801273 <saved_printing>
  // We may have missed a stepper timer interrupt. Be safe than sorry, reset the stepper timer before re-enabling interrupts.
  st_reset_timer();
   2cd80:	0f 94 4c 1b 	call	0x23698	; 0x23698 <st_reset_timer()>
	sei();
   2cd84:	78 94       	sei
	if ((z_move != 0) || (e_move != 0)) { // extruder or z move
   2cd86:	20 e0       	ldi	r18, 0x00	; 0
   2cd88:	30 e0       	ldi	r19, 0x00	; 0
   2cd8a:	a9 01       	movw	r20, r18
   2cd8c:	f8 01       	movw	r30, r16
   2cd8e:	6c 2f       	mov	r22, r28
   2cd90:	7d 2f       	mov	r23, r29
   2cd92:	8f 2f       	mov	r24, r31
   2cd94:	90 2f       	mov	r25, r16
   2cd96:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   2cd9a:	88 23       	and	r24, r24
   2cd9c:	e1 f0       	breq	.+56     	; 0x2cdd6 <stop_and_save_print_to_ram(float, float) [clone .constprop.303]+0x1ca>
    // move away from the print.

    if(e_move)
    {
        // First unretract (relative extrusion)
        if(!saved_extruder_relative_mode){
   2cd9e:	80 91 56 12 	lds	r24, 0x1256	; 0x801256 <saved_extruder_relative_mode>
   2cda2:	81 11       	cpse	r24, r1
   2cda4:	05 c0       	rjmp	.+10     	; 0x2cdb0 <stop_and_save_print_to_ram(float, float) [clone .constprop.303]+0x1a4>
            enquecommand_P(MSG_M83);
   2cda6:	61 e0       	ldi	r22, 0x01	; 1
   2cda8:	83 eb       	ldi	r24, 0xB3	; 179
   2cdaa:	9c e6       	ldi	r25, 0x6C	; 108
   2cdac:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
        // A single sprintf may not be faster, but is definitely 20B shorter
        // than a sequence of commands building the string piece by piece
        // A snprintf would have been a safer call, but since it is not used
        // in the whole program, its implementation would bring more bytes to the total size
        // The behavior of dtostrf 8,3 should be roughly the same as %-0.3
        enquecommandf_P(G1_E_F2700, e_move);
   2cdb0:	0f 93       	push	r16
   2cdb2:	1f 93       	push	r17
   2cdb4:	df 93       	push	r29
   2cdb6:	cf 93       	push	r28
   2cdb8:	83 ea       	ldi	r24, 0xA3	; 163
   2cdba:	9c e6       	ldi	r25, 0x6C	; 108
   2cdbc:	9f 93       	push	r25
   2cdbe:	8f 93       	push	r24
   2cdc0:	0e 94 b7 8f 	call	0x11f6e	; 0x11f6e <enquecommandf_P(char const*, ...)>
   2cdc4:	81 e0       	ldi	r24, 0x01	; 1
   2cdc6:	80 93 53 12 	sts	0x1253, r24	; 0x801253 <cmdbuffer_front_already_processed>
   2cdca:	0f 90       	pop	r0
   2cdcc:	0f 90       	pop	r0
   2cdce:	0f 90       	pop	r0
   2cdd0:	0f 90       	pop	r0
   2cdd2:	0f 90       	pop	r0
   2cdd4:	0f 90       	pop	r0

    // If this call is invoked from the main Arduino loop() function, let the caller know that the command
    // in the command queue is not the original command, but a new one, so it should not be removed from the queue.
    repeatcommand_front();
  }
}
   2cdd6:	df 91       	pop	r29
   2cdd8:	cf 91       	pop	r28
   2cdda:	1f 91       	pop	r17
   2cddc:	0f 91       	pop	r16
   2cdde:	ff 90       	pop	r15
   2cde0:	ef 90       	pop	r14
   2cde2:	df 90       	pop	r13
   2cde4:	cf 90       	pop	r12
   2cde6:	08 95       	ret
        saved_sdpos -= sdlen_planner;
        sdlen_cmdqueue = cmdqueue_calc_sd_length(); //length of sd commands in cmdqueue
        saved_sdpos -= sdlen_cmdqueue;
        saved_printing_type = PowerPanic::PRINT_TYPE_SD;
    }
    else if (usb_timer.running()) { //reuse saved_sdpos for storing line number
   2cde8:	80 91 42 12 	lds	r24, 0x1242	; 0x801242 <usb_timer>
   2cdec:	88 23       	and	r24, r24
   2cdee:	b1 f1       	breq	.+108    	; 0x2ce5c <stop_and_save_print_to_ram(float, float) [clone .constprop.303]+0x250>
        saved_sdpos = gcode_LastN; //start with line number of command added recently to cmd queue
   2cdf0:	80 91 3e 12 	lds	r24, 0x123E	; 0x80123e <gcode_LastN>
   2cdf4:	90 91 3f 12 	lds	r25, 0x123F	; 0x80123f <gcode_LastN+0x1>
   2cdf8:	a0 91 40 12 	lds	r26, 0x1240	; 0x801240 <gcode_LastN+0x2>
   2cdfc:	b0 91 41 12 	lds	r27, 0x1241	; 0x801241 <gcode_LastN+0x3>
   2ce00:	80 93 45 12 	sts	0x1245, r24	; 0x801245 <saved_sdpos>
   2ce04:	90 93 46 12 	sts	0x1246, r25	; 0x801246 <saved_sdpos+0x1>
   2ce08:	a0 93 47 12 	sts	0x1247, r26	; 0x801247 <saved_sdpos+0x2>
   2ce0c:	b0 93 48 12 	sts	0x1248, r27	; 0x801248 <saved_sdpos+0x3>
        //reuse planner_calc_sd_length function for getting number of lines of commands in planner:
        nlines = planner_calc_sd_length(); //number of lines of commands in planner
   2ce10:	0f 94 76 3c 	call	0x278ec	; 0x278ec <planner_calc_sd_length()>
        saved_sdpos -= nlines;
   2ce14:	40 91 45 12 	lds	r20, 0x1245	; 0x801245 <saved_sdpos>
   2ce18:	50 91 46 12 	lds	r21, 0x1246	; 0x801246 <saved_sdpos+0x1>
   2ce1c:	60 91 47 12 	lds	r22, 0x1247	; 0x801247 <saved_sdpos+0x2>
   2ce20:	70 91 48 12 	lds	r23, 0x1248	; 0x801248 <saved_sdpos+0x3>
   2ce24:	48 1b       	sub	r20, r24
   2ce26:	51 09       	sbc	r21, r1
   2ce28:	61 09       	sbc	r22, r1
   2ce2a:	71 09       	sbc	r23, r1
        saved_sdpos -= buflen; //number of blocks in cmd buffer
   2ce2c:	80 91 3c 12 	lds	r24, 0x123C	; 0x80123c <buflen>
   2ce30:	90 91 3d 12 	lds	r25, 0x123D	; 0x80123d <buflen+0x1>
   2ce34:	09 2e       	mov	r0, r25
   2ce36:	00 0c       	add	r0, r0
   2ce38:	aa 0b       	sbc	r26, r26
   2ce3a:	bb 0b       	sbc	r27, r27
   2ce3c:	48 1b       	sub	r20, r24
   2ce3e:	59 0b       	sbc	r21, r25
   2ce40:	6a 0b       	sbc	r22, r26
   2ce42:	7b 0b       	sbc	r23, r27
   2ce44:	40 93 45 12 	sts	0x1245, r20	; 0x801245 <saved_sdpos>
   2ce48:	50 93 46 12 	sts	0x1246, r21	; 0x801246 <saved_sdpos+0x1>
   2ce4c:	60 93 47 12 	sts	0x1247, r22	; 0x801247 <saved_sdpos+0x2>
   2ce50:	70 93 48 12 	sts	0x1248, r23	; 0x801248 <saved_sdpos+0x3>
        saved_printing_type = PowerPanic::PRINT_TYPE_HOST;
   2ce54:	81 e0       	ldi	r24, 0x01	; 1
    }
    else {
        saved_printing_type = PowerPanic::PRINT_TYPE_NONE;
   2ce56:	80 93 79 02 	sts	0x0279, r24	; 0x800279 <saved_printing_type>
   2ce5a:	23 cf       	rjmp	.-442    	; 0x2cca2 <stop_and_save_print_to_ram(float, float) [clone .constprop.303]+0x96>
   2ce5c:	82 e0       	ldi	r24, 0x02	; 2
   2ce5e:	fb cf       	rjmp	.-10     	; 0x2ce56 <stop_and_save_print_to_ram(float, float) [clone .constprop.303]+0x24a>
        saved_feedrate2 = current_block->gcode_feedrate;
        saved_segment_idx = current_block->segment_idx;
    }
    else
    {
        saved_start_position[0] = SAVED_START_POSITION_UNSET;
   2ce60:	80 e0       	ldi	r24, 0x00	; 0
   2ce62:	90 e0       	ldi	r25, 0x00	; 0
   2ce64:	a0 e8       	ldi	r26, 0x80	; 128
   2ce66:	bf eb       	ldi	r27, 0xBF	; 191
   2ce68:	80 93 7e 02 	sts	0x027E, r24	; 0x80027e <saved_start_position>
   2ce6c:	90 93 7f 02 	sts	0x027F, r25	; 0x80027f <saved_start_position+0x1>
   2ce70:	a0 93 80 02 	sts	0x0280, r26	; 0x800280 <saved_start_position+0x2>
   2ce74:	b0 93 81 02 	sts	0x0281, r27	; 0x800281 <saved_start_position+0x3>
        saved_feedrate2 = feedrate;
   2ce78:	60 91 7a 02 	lds	r22, 0x027A	; 0x80027a <feedrate>
   2ce7c:	70 91 7b 02 	lds	r23, 0x027B	; 0x80027b <feedrate+0x1>
   2ce80:	80 91 7c 02 	lds	r24, 0x027C	; 0x80027c <feedrate+0x2>
   2ce84:	90 91 7d 02 	lds	r25, 0x027D	; 0x80027d <feedrate+0x3>
   2ce88:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   2ce8c:	70 93 50 12 	sts	0x1250, r23	; 0x801250 <saved_feedrate2+0x1>
   2ce90:	60 93 4f 12 	sts	0x124F, r22	; 0x80124f <saved_feedrate2>
        saved_segment_idx = 0;
   2ce94:	10 92 4e 12 	sts	0x124E, r1	; 0x80124e <saved_segment_idx+0x1>
   2ce98:	10 92 4d 12 	sts	0x124D, r1	; 0x80124d <saved_segment_idx>
   2ce9c:	32 cf       	rjmp	.-412    	; 0x2cd02 <stop_and_save_print_to_ram(float, float) [clone .constprop.303]+0xf6>

0002ce9e <ThermalStop(bool) [clone .constprop.301]>:
// "allow_recovery". If recovery is allowed, this forces a printer-initiated instantanenous pause
// (just like an LCD pause) that bypasses the host pausing functionality. In this state the printer
// is kept in busy state and *must* be recovered from the LCD.
void ThermalStop(bool allow_recovery)
{
    if(Stopped == false) {
   2ce9e:	80 91 3b 12 	lds	r24, 0x123B	; 0x80123b <Stopped>
   2cea2:	81 11       	cpse	r24, r1
   2cea4:	24 c0       	rjmp	.+72     	; 0x2ceee <ThermalStop(bool) [clone .constprop.301]+0x50>
        Stopped = true;
   2cea6:	81 e0       	ldi	r24, 0x01	; 1
   2cea8:	80 93 3b 12 	sts	0x123B, r24	; 0x80123b <Stopped>
                saved_extruder_temperature = ext_temp;
                saved_fan_speed = fan_speed;
            }
        } else {
            // We got a hard thermal error and/or there is no print going on. Just stop.
            print_stop(false, true);
   2ceac:	61 e0       	ldi	r22, 0x01	; 1
   2ceae:	80 e0       	ldi	r24, 0x00	; 0
   2ceb0:	0e 94 f9 de 	call	0x1bdf2	; 0x1bdf2 <print_stop(bool, bool)>
        }

        // Report the error on the serial
        serialprintPGM(allow_recovery ? echomagic : errormagic);
   2ceb4:	81 eb       	ldi	r24, 0xB1	; 177
   2ceb6:	91 ea       	ldi	r25, 0xA1	; 161
   2ceb8:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        SERIAL_ERRORLNRPGM(MSG_ERR_STOPPED);
   2cebc:	8e e6       	ldi	r24, 0x6E	; 110
   2cebe:	9c e6       	ldi	r25, 0x6C	; 108
   2cec0:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>

        // Eventually report the stopped status on the lcd (though this is usually overridden by a
        // higher-priority alert status message)
        LCD_MESSAGERPGM(_T(MSG_STOPPED));
   2cec4:	89 e8       	ldi	r24, 0x89	; 137
   2cec6:	92 e6       	ldi	r25, 0x62	; 98
   2cec8:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   2cecc:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>

        // Make a warning sound! We cannot use Sound_MakeCustom as this would stop further moves.
        // Turn on the speaker here (if not already), and turn it off when back in the main loop.
        WRITE(BEEPER, HIGH);
   2ced0:	9f b7       	in	r25, 0x3f	; 63
   2ced2:	f8 94       	cli
   2ced4:	80 91 02 01 	lds	r24, 0x0102	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   2ced8:	84 60       	ori	r24, 0x04	; 4
   2ceda:	80 93 02 01 	sts	0x0102, r24	; 0x800102 <__TEXT_REGION_LENGTH__+0x7c2102>
   2cede:	9f bf       	out	0x3f, r25	; 63

        // Always return to the status screen to ensure the NEW error is immediately shown.
        lcd_return_to_status();
   2cee0:	0f 94 d5 07 	call	0x20faa	; 0x20faa <lcd_return_to_status()>

        if(!allow_recovery) {
            // prevent menu access for all fatal errors
            menu_set_block(MENU_BLOCK_THERMAL_ERROR);
   2cee4:	80 91 3a 12 	lds	r24, 0x123A	; 0x80123a <menu_block_mask>
   2cee8:	81 60       	ori	r24, 0x01	; 1
   2ceea:	80 93 3a 12 	sts	0x123A, r24	; 0x80123a <menu_block_mask>
        }
    }
}
   2ceee:	08 95       	ret

0002cef0 <enquecommand_front(char const*, bool) [clone .constprop.294]>:
bool cmd_buffer_empty()
{
	return (buflen == 0);
}

void enquecommand_front(const char *cmd, bool from_progmem)
   2cef0:	0f 93       	push	r16
   2cef2:	1f 93       	push	r17
   2cef4:	cf 93       	push	r28
   2cef6:	df 93       	push	r29
   2cef8:	ec 01       	movw	r28, r24
   2cefa:	0f 94 9e a1 	call	0x3433c	; 0x3433c <__strlen_P>
   2cefe:	8c 01       	movw	r16, r24
// If yes, adjust bufindr to the new position, where the new command could be enqued.
// len_asked does not contain the zero terminator size.
static bool cmdqueue_could_enqueue_front(size_t len_asked)
{
    // MAX_CMD_SIZE has to accommodate the zero terminator.
    if (len_asked >= MAX_CMD_SIZE)
   2cf00:	80 36       	cpi	r24, 0x60	; 96
   2cf02:	91 05       	cpc	r25, r1
   2cf04:	08 f0       	brcs	.+2      	; 0x2cf08 <enquecommand_front(char const*, bool) [clone .constprop.294]+0x18>
   2cf06:	85 c0       	rjmp	.+266    	; 0x2d012 <enquecommand_front(char const*, bool) [clone .constprop.294]+0x122>
        return false;
    // Remove the currently processed command from the queue.
    if (! cmdbuffer_front_already_processed) {
   2cf08:	80 91 53 12 	lds	r24, 0x1253	; 0x801253 <cmdbuffer_front_already_processed>
   2cf0c:	81 11       	cpse	r24, r1
   2cf0e:	05 c0       	rjmp	.+10     	; 0x2cf1a <enquecommand_front(char const*, bool) [clone .constprop.294]+0x2a>
        cmdqueue_pop_front();
   2cf10:	0e 94 43 79 	call	0xf286	; 0xf286 <cmdqueue_pop_front()>
        cmdbuffer_front_already_processed = true;
   2cf14:	81 e0       	ldi	r24, 0x01	; 1
   2cf16:	80 93 53 12 	sts	0x1253, r24	; 0x801253 <cmdbuffer_front_already_processed>
    }
    if (bufindr == bufindw && buflen > 0)
   2cf1a:	40 91 38 12 	lds	r20, 0x1238	; 0x801238 <bufindr>
   2cf1e:	50 91 39 12 	lds	r21, 0x1239	; 0x801239 <bufindr+0x1>
   2cf22:	80 91 49 10 	lds	r24, 0x1049	; 0x801049 <_ZL7bufindw.lto_priv.514>
   2cf26:	90 91 4a 10 	lds	r25, 0x104A	; 0x80104a <_ZL7bufindw.lto_priv.514+0x1>
   2cf2a:	48 17       	cp	r20, r24
   2cf2c:	59 07       	cpc	r21, r25
   2cf2e:	41 f4       	brne	.+16     	; 0x2cf40 <enquecommand_front(char const*, bool) [clone .constprop.294]+0x50>
   2cf30:	20 91 3c 12 	lds	r18, 0x123C	; 0x80123c <buflen>
   2cf34:	30 91 3d 12 	lds	r19, 0x123D	; 0x80123d <buflen+0x1>
   2cf38:	12 16       	cp	r1, r18
   2cf3a:	13 06       	cpc	r1, r19
   2cf3c:	0c f4       	brge	.+2      	; 0x2cf40 <enquecommand_front(char const*, bool) [clone .constprop.294]+0x50>
   2cf3e:	69 c0       	rjmp	.+210    	; 0x2d012 <enquecommand_front(char const*, bool) [clone .constprop.294]+0x122>
        // Full buffer.
        return false;
    // Adjust the end of the write buffer based on whether a partial line is in the receive buffer.
    int endw = (serial_count > 0) ? (bufindw + MAX_CMD_SIZE + 1) : bufindw;
   2cf40:	20 91 47 10 	lds	r18, 0x1047	; 0x801047 <serial_count>
   2cf44:	30 91 48 10 	lds	r19, 0x1048	; 0x801048 <serial_count+0x1>
   2cf48:	12 16       	cp	r1, r18
   2cf4a:	13 06       	cpc	r1, r19
   2cf4c:	0c f0       	brlt	.+2      	; 0x2cf50 <enquecommand_front(char const*, bool) [clone .constprop.294]+0x60>
   2cf4e:	41 c0       	rjmp	.+130    	; 0x2cfd2 <enquecommand_front(char const*, bool) [clone .constprop.294]+0xe2>
   2cf50:	9c 01       	movw	r18, r24
   2cf52:	2f 59       	subi	r18, 0x9F	; 159
   2cf54:	3f 4f       	sbci	r19, 0xFF	; 255
    if (bufindw < bufindr) {
   2cf56:	84 17       	cp	r24, r20
   2cf58:	95 07       	cpc	r25, r21
   2cf5a:	e8 f5       	brcc	.+122    	; 0x2cfd6 <enquecommand_front(char const*, bool) [clone .constprop.294]+0xe6>
        int bufindr_new = bufindr - len_asked - (1 + CMDHDRSIZE);
   2cf5c:	44 50       	subi	r20, 0x04	; 4
   2cf5e:	51 09       	sbc	r21, r1
   2cf60:	40 1b       	sub	r20, r16
   2cf62:	51 0b       	sbc	r21, r17
        // Simple case. There is a contiguous space between the write buffer and the read buffer.
        if (endw <= bufindr_new) {
   2cf64:	42 17       	cp	r20, r18
   2cf66:	53 07       	cpc	r21, r19
   2cf68:	0c f4       	brge	.+2      	; 0x2cf6c <enquecommand_front(char const*, bool) [clone .constprop.294]+0x7c>
   2cf6a:	53 c0       	rjmp	.+166    	; 0x2d012 <enquecommand_front(char const*, bool) [clone .constprop.294]+0x122>
        }
    } else {
        // Otherwise the free space is split between the start and end.
        if (len_asked + (1 + CMDHDRSIZE) <= bufindr) {
            // Could fit at the start.
            bufindr -= len_asked + (1 + CMDHDRSIZE);
   2cf6c:	50 93 39 12 	sts	0x1239, r21	; 0x801239 <bufindr+0x1>
   2cf70:	40 93 38 12 	sts	0x1238, r20	; 0x801238 <bufindr>
void enquecommand_front(const char *cmd, bool from_progmem)
{
    size_t len = from_progmem ? strlen_P(cmd) : strlen(cmd);
    // Does cmd fit the queue? This call shall move bufindr, so the command may be copied.
    if (cmdqueue_could_enqueue_front(len)) {
        cmdbuffer[bufindr] = CMDBUFFER_CURRENT_TYPE_UI;
   2cf74:	80 91 38 12 	lds	r24, 0x1238	; 0x801238 <bufindr>
   2cf78:	90 91 39 12 	lds	r25, 0x1239	; 0x801239 <bufindr+0x1>
   2cf7c:	fc 01       	movw	r30, r24
   2cf7e:	e5 5b       	subi	r30, 0xB5	; 181
   2cf80:	ff 4e       	sbci	r31, 0xEF	; 239
   2cf82:	23 e0       	ldi	r18, 0x03	; 3
   2cf84:	20 83       	st	Z, r18
        if (from_progmem)
            strcpy_P(cmdbuffer + bufindr + CMDHDRSIZE, cmd);
   2cf86:	be 01       	movw	r22, r28
   2cf88:	82 5b       	subi	r24, 0xB2	; 178
   2cf8a:	9f 4e       	sbci	r25, 0xEF	; 239
   2cf8c:	0f 94 97 a1 	call	0x3432e	; 0x3432e <strcpy_P>
        else
            strcpy(cmdbuffer + bufindr + CMDHDRSIZE, cmd);
        ++ buflen;
   2cf90:	80 91 3c 12 	lds	r24, 0x123C	; 0x80123c <buflen>
   2cf94:	90 91 3d 12 	lds	r25, 0x123D	; 0x80123d <buflen+0x1>
   2cf98:	01 96       	adiw	r24, 0x01	; 1
   2cf9a:	90 93 3d 12 	sts	0x123D, r25	; 0x80123d <buflen+0x1>
   2cf9e:	80 93 3c 12 	sts	0x123C, r24	; 0x80123c <buflen>
        SERIAL_ECHO_START;
   2cfa2:	8e ec       	ldi	r24, 0xCE	; 206
   2cfa4:	91 ea       	ldi	r25, 0xA1	; 161
   2cfa6:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        SERIAL_ECHORPGM(enqueingFront);
   2cfaa:	88 e9       	ldi	r24, 0x98	; 152
   2cfac:	91 ea       	ldi	r25, 0xA1	; 161
   2cfae:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        SERIAL_ECHO(cmdbuffer + bufindr + CMDHDRSIZE);
   2cfb2:	80 91 38 12 	lds	r24, 0x1238	; 0x801238 <bufindr>
   2cfb6:	90 91 39 12 	lds	r25, 0x1239	; 0x801239 <bufindr+0x1>
   2cfba:	82 5b       	subi	r24, 0xB2	; 178
   2cfbc:	9f 4e       	sbci	r25, 0xEF	; 239
   2cfbe:	0e 94 95 87 	call	0x10f2a	; 0x10f2a <MarlinSerial::write(char const*)>
        SERIAL_ECHOLNPGM("\"");
   2cfc2:	86 e9       	ldi	r24, 0x96	; 150
   2cfc4:	91 ea       	ldi	r25, 0xA1	; 161
        SERIAL_ECHOLNRPGM(bufferFull);
#ifdef CMDBUFFER_DEBUG
        cmdqueue_dump_to_serial();
#endif /* CMDBUFFER_DEBUG */
    }
}
   2cfc6:	df 91       	pop	r29
   2cfc8:	cf 91       	pop	r28
   2cfca:	1f 91       	pop	r17
   2cfcc:	0f 91       	pop	r16
        SERIAL_ECHORPGM(enqueingFront);
        if (from_progmem)
            SERIAL_PROTOCOLRPGM(cmd);
        else
            SERIAL_ECHO(cmd);
        SERIAL_ECHOLNRPGM(bufferFull);
   2cfce:	0c 94 bd 7c 	jmp	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
    // Remove the currently processed command from the queue.
    if (! cmdbuffer_front_already_processed) {
        cmdqueue_pop_front();
        cmdbuffer_front_already_processed = true;
    }
    if (bufindr == bufindw && buflen > 0)
   2cfd2:	9c 01       	movw	r18, r24
   2cfd4:	c0 cf       	rjmp	.-128    	; 0x2cf56 <enquecommand_front(char const*, bool) [clone .constprop.294]+0x66>
            bufindr = bufindr_new;
            return true;
        }
    } else {
        // Otherwise the free space is split between the start and end.
        if (len_asked + (1 + CMDHDRSIZE) <= bufindr) {
   2cfd6:	c8 01       	movw	r24, r16
   2cfd8:	04 96       	adiw	r24, 0x04	; 4
   2cfda:	48 17       	cp	r20, r24
   2cfdc:	59 07       	cpc	r21, r25
   2cfde:	28 f0       	brcs	.+10     	; 0x2cfea <enquecommand_front(char const*, bool) [clone .constprop.294]+0xfa>
            // Could fit at the start.
            bufindr -= len_asked + (1 + CMDHDRSIZE);
   2cfe0:	44 50       	subi	r20, 0x04	; 4
   2cfe2:	51 09       	sbc	r21, r1
   2cfe4:	40 1b       	sub	r20, r16
   2cfe6:	51 0b       	sbc	r21, r17
   2cfe8:	c1 cf       	rjmp	.-126    	; 0x2cf6c <enquecommand_front(char const*, bool) [clone .constprop.294]+0x7c>
            return true;
        }
        int bufindr_new = sizeof(cmdbuffer) - len_asked - (1 + CMDHDRSIZE);
   2cfea:	89 ee       	ldi	r24, 0xE9	; 233
   2cfec:	91 e0       	ldi	r25, 0x01	; 1
   2cfee:	bc 01       	movw	r22, r24
   2cff0:	60 1b       	sub	r22, r16
   2cff2:	71 0b       	sbc	r23, r17
   2cff4:	8b 01       	movw	r16, r22
        if (endw <= bufindr_new) {
   2cff6:	62 17       	cp	r22, r18
   2cff8:	73 07       	cpc	r23, r19
   2cffa:	5c f0       	brlt	.+22     	; 0x2d012 <enquecommand_front(char const*, bool) [clone .constprop.294]+0x122>
            memset(cmdbuffer, 0, bufindr);
   2cffc:	70 e0       	ldi	r23, 0x00	; 0
   2cffe:	60 e0       	ldi	r22, 0x00	; 0
   2d000:	8b e4       	ldi	r24, 0x4B	; 75
   2d002:	90 e1       	ldi	r25, 0x10	; 16
   2d004:	0f 94 12 aa 	call	0x35424	; 0x35424 <memset>
            bufindr = bufindr_new;
   2d008:	10 93 39 12 	sts	0x1239, r17	; 0x801239 <bufindr+0x1>
   2d00c:	00 93 38 12 	sts	0x1238, r16	; 0x801238 <bufindr>
   2d010:	b1 cf       	rjmp	.-158    	; 0x2cf74 <enquecommand_front(char const*, bool) [clone .constprop.294]+0x84>
        SERIAL_ECHOLNPGM("\"");
#ifdef CMDBUFFER_DEBUG
        cmdqueue_dump_to_serial();
#endif /* CMDBUFFER_DEBUG */
    } else {
        SERIAL_ERROR_START;
   2d012:	81 eb       	ldi	r24, 0xB1	; 177
   2d014:	91 ea       	ldi	r25, 0xA1	; 161
   2d016:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        SERIAL_ECHORPGM(enqueingFront);
   2d01a:	88 e9       	ldi	r24, 0x98	; 152
   2d01c:	91 ea       	ldi	r25, 0xA1	; 161
   2d01e:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        if (from_progmem)
            SERIAL_PROTOCOLRPGM(cmd);
   2d022:	ce 01       	movw	r24, r28
   2d024:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        else
            SERIAL_ECHO(cmd);
        SERIAL_ECHOLNRPGM(bufferFull);
   2d028:	8f e7       	ldi	r24, 0x7F	; 127
   2d02a:	91 ea       	ldi	r25, 0xA1	; 161
   2d02c:	cc cf       	rjmp	.-104    	; 0x2cfc6 <enquecommand_front(char const*, bool) [clone .constprop.294]+0xd6>

0002d02e <SdFile::seekSetFilteredGcode(unsigned long) [clone .constprop.289]>:
    } else {
        return false;
    }
}

bool SdFile::seekSetFilteredGcode(uint32_t pos){
   2d02e:	ab 01       	movw	r20, r22
   2d030:	bc 01       	movw	r22, r24
    if(! seekSet(pos) )return false;
   2d032:	87 e6       	ldi	r24, 0x67	; 103
   2d034:	96 e1       	ldi	r25, 0x16	; 22
   2d036:	0f 94 0b 2d 	call	0x25a16	; 0x25a16 <SdBaseFile::seekSet(unsigned long)>
   2d03a:	81 11       	cpse	r24, r1
   2d03c:	02 c0       	rjmp	.+4      	; 0x2d042 <SdFile::seekSetFilteredGcode(unsigned long) [clone .constprop.289]+0x14>
   2d03e:	80 e0       	ldi	r24, 0x00	; 0
   2d040:	08 95       	ret
}

bool SdFile::openFilteredGcode(SdBaseFile* dirFile, const char* path){
    if( open(dirFile, path, O_READ) ){
        // compute the block to start with
        if( ! gfComputeNextFileBlock() )
   2d042:	87 e6       	ldi	r24, 0x67	; 103
   2d044:	96 e1       	ldi	r25, 0x16	; 22
   2d046:	0f 94 92 2c 	call	0x25924	; 0x25924 <SdFile::gfComputeNextFileBlock()>
   2d04a:	88 23       	and	r24, r24
   2d04c:	c1 f3       	breq	.-16     	; 0x2d03e <SdFile::seekSetFilteredGcode(unsigned long) [clone .constprop.289]+0x10>
    return vol_->cache()->data; // this is constant for the whole time, so it should be fast and sleek
}

void SdFile::gfReset(){
    // reset cache read ptr to its begin
    gfReadPtr = gfBlockBuffBegin() + gfOffset;
   2d04e:	20 91 88 16 	lds	r18, 0x1688	; 0x801688 <card+0x2b3>
   2d052:	30 91 89 16 	lds	r19, 0x1689	; 0x801689 <card+0x2b4>
   2d056:	2a 5b       	subi	r18, 0xBA	; 186
   2d058:	31 4f       	sbci	r19, 0xF1	; 241
   2d05a:	30 93 83 16 	sts	0x1683, r19	; 0x801683 <card+0x2ae>
   2d05e:	20 93 82 16 	sts	0x1682, r18	; 0x801682 <card+0x2ad>
bool SdFile::seekSetFilteredGcode(uint32_t pos){
    if(! seekSet(pos) )return false;
    if(! gfComputeNextFileBlock() )return false;
    gfReset();
    return true;
}
   2d062:	08 95       	ret

0002d064 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.242]>:
    SERIAL_PROTOCOLLNPGM("An error while writing to the SD Card.");
  }
}


void CardReader::checkautostart(bool force)
   2d064:	8f 92       	push	r8
   2d066:	9f 92       	push	r9
   2d068:	af 92       	push	r10
   2d06a:	bf 92       	push	r11
   2d06c:	cf 92       	push	r12
   2d06e:	df 92       	push	r13
   2d070:	ef 92       	push	r14
   2d072:	ff 92       	push	r15
   2d074:	0f 93       	push	r16
   2d076:	1f 93       	push	r17
   2d078:	cf 93       	push	r28
   2d07a:	df 93       	push	r29
   2d07c:	cd b7       	in	r28, 0x3d	; 61
   2d07e:	de b7       	in	r29, 0x3e	; 62
   2d080:	ee 97       	sbiw	r28, 0x3e	; 62
   2d082:	0f b6       	in	r0, 0x3f	; 63
   2d084:	f8 94       	cli
   2d086:	de bf       	out	0x3e, r29	; 62
   2d088:	0f be       	out	0x3f, r0	; 63
   2d08a:	cd bf       	out	0x3d, r28	; 61
    if(!mounted) //fail
      return;
  }

  char autoname[30];
  sprintf_P(autoname, PSTR("auto%i.g"), lastnr);
   2d08c:	80 91 25 14 	lds	r24, 0x1425	; 0x801425 <card+0x50>
   2d090:	8f 93       	push	r24
   2d092:	80 91 24 14 	lds	r24, 0x1424	; 0x801424 <card+0x4f>
   2d096:	8f 93       	push	r24
   2d098:	8a e3       	ldi	r24, 0x3A	; 58
   2d09a:	91 ea       	ldi	r25, 0xA1	; 161
   2d09c:	9f 93       	push	r25
   2d09e:	8f 93       	push	r24
   2d0a0:	8e 01       	movw	r16, r28
   2d0a2:	0f 5d       	subi	r16, 0xDF	; 223
   2d0a4:	1f 4f       	sbci	r17, 0xFF	; 255
   2d0a6:	1f 93       	push	r17
   2d0a8:	0f 93       	push	r16
   2d0aa:	0f 94 f7 a2 	call	0x345ee	; 0x345ee <sprintf_P>
   2d0ae:	0f 90       	pop	r0
   2d0b0:	0f 90       	pop	r0
   2d0b2:	0f 90       	pop	r0
   2d0b4:	0f 90       	pop	r0
   2d0b6:	0f 90       	pop	r0
   2d0b8:	0f 90       	pop	r0
  for(int8_t i=0;i<(int8_t)strlen(autoname);i++)
   2d0ba:	f1 2c       	mov	r15, r1
   2d0bc:	f8 01       	movw	r30, r16
   2d0be:	01 90       	ld	r0, Z+
   2d0c0:	00 20       	and	r0, r0
   2d0c2:	e9 f7       	brne	.-6      	; 0x2d0be <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.242]+0x5a>
   2d0c4:	31 97       	sbiw	r30, 0x01	; 1
   2d0c6:	e0 1b       	sub	r30, r16
   2d0c8:	f1 0b       	sbc	r31, r17
   2d0ca:	fe 16       	cp	r15, r30
   2d0cc:	84 f4       	brge	.+32     	; 0x2d0ee <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.242]+0x8a>
    autoname[i]=tolower(autoname[i]);
   2d0ce:	68 01       	movw	r12, r16
   2d0d0:	cf 0c       	add	r12, r15
   2d0d2:	d1 1c       	adc	r13, r1
   2d0d4:	f7 fc       	sbrc	r15, 7
   2d0d6:	da 94       	dec	r13
   2d0d8:	f6 01       	movw	r30, r12
   2d0da:	80 81       	ld	r24, Z
   2d0dc:	08 2e       	mov	r0, r24
   2d0de:	00 0c       	add	r0, r0
   2d0e0:	99 0b       	sbc	r25, r25
   2d0e2:	0f 94 f4 a9 	call	0x353e8	; 0x353e8 <tolower>
   2d0e6:	f6 01       	movw	r30, r12
   2d0e8:	80 83       	st	Z, r24
   2d0ea:	f3 94       	inc	r15
   2d0ec:	e7 cf       	rjmp	.-50     	; 0x2d0bc <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.242]+0x58>
  dir_t p;

  root.rewind();
   2d0ee:	8d e5       	ldi	r24, 0x5D	; 93
   2d0f0:	94 e1       	ldi	r25, 0x14	; 20
   2d0f2:	0e 94 a6 79 	call	0xf34c	; 0xf34c <SdBaseFile::rewind()>

  bool found=false;
   2d0f6:	a1 2c       	mov	r10, r1
   2d0f8:	ce 01       	movw	r24, r28
   2d0fa:	01 96       	adiw	r24, 0x01	; 1
   2d0fc:	7c 01       	movw	r14, r24
    //Serial.println(autoname);
    if(p.name[9]!='~') //skip safety copies
    if(strncmp((char*)p.name,autoname,5)==0)
    {
      // M23: Select SD file
      enquecommandf_P(MSG_M23, autoname);
   2d0fe:	87 e6       	ldi	r24, 0x67	; 103
   2d100:	c8 2e       	mov	r12, r24
   2d102:	8c e6       	ldi	r24, 0x6C	; 108
   2d104:	d8 2e       	mov	r13, r24
 * a directory file or an I/O error occurred.
 */
int8_t SdBaseFile::readDir(dir_t* dir, char* longFilename) {
  int16_t n;
  // if not a directory file or miss-positioned return an error
  if (!isDir() || (0X1F & curPosition_)) return -1;
   2d106:	80 91 60 14 	lds	r24, 0x1460	; 0x801460 <card+0x8b>
   2d10a:	82 30       	cpi	r24, 0x02	; 2
   2d10c:	08 f4       	brcc	.+2      	; 0x2d110 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.242]+0xac>
   2d10e:	50 c0       	rjmp	.+160    	; 0x2d1b0 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.242]+0x14c>
   2d110:	80 91 65 14 	lds	r24, 0x1465	; 0x801465 <card+0x90>
   2d114:	90 91 66 14 	lds	r25, 0x1466	; 0x801466 <card+0x91>
   2d118:	a0 91 67 14 	lds	r26, 0x1467	; 0x801467 <card+0x92>
   2d11c:	b0 91 68 14 	lds	r27, 0x1468	; 0x801468 <card+0x93>
   2d120:	8f 71       	andi	r24, 0x1F	; 31
   2d122:	99 27       	eor	r25, r25
   2d124:	aa 27       	eor	r26, r26
   2d126:	bb 27       	eor	r27, r27
   2d128:	89 2b       	or	r24, r25
   2d12a:	8a 2b       	or	r24, r26
   2d12c:	8b 2b       	or	r24, r27
   2d12e:	09 f0       	breq	.+2      	; 0x2d132 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.242]+0xce>
   2d130:	3f c0       	rjmp	.+126    	; 0x2d1b0 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.242]+0x14c>
   2d132:	50 e0       	ldi	r21, 0x00	; 0
   2d134:	40 e0       	ldi	r20, 0x00	; 0
   2d136:	b7 01       	movw	r22, r14
   2d138:	8d e5       	ldi	r24, 0x5D	; 93
   2d13a:	94 e1       	ldi	r25, 0x14	; 20
   2d13c:	0f 94 48 30 	call	0x26090	; 0x26090 <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]>
  dir_t p;

  root.rewind();

  bool found=false;
  while (root.readDir(p, NULL) > 0)
   2d140:	18 16       	cp	r1, r24
   2d142:	b4 f5       	brge	.+108    	; 0x2d1b0 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.242]+0x14c>
  {
    for(int8_t i=0;i<(int8_t)strlen((char*)p.name);i++)
   2d144:	b1 2c       	mov	r11, r1
   2d146:	f7 01       	movw	r30, r14
   2d148:	01 90       	ld	r0, Z+
   2d14a:	00 20       	and	r0, r0
   2d14c:	e9 f7       	brne	.-6      	; 0x2d148 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.242]+0xe4>
   2d14e:	31 97       	sbiw	r30, 0x01	; 1
   2d150:	ee 19       	sub	r30, r14
   2d152:	ff 09       	sbc	r31, r15
   2d154:	be 16       	cp	r11, r30
   2d156:	74 f4       	brge	.+28     	; 0x2d174 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.242]+0x110>
    p.name[i]=tolower(p.name[i]);
   2d158:	47 01       	movw	r8, r14
   2d15a:	8b 0c       	add	r8, r11
   2d15c:	91 1c       	adc	r9, r1
   2d15e:	b7 fc       	sbrc	r11, 7
   2d160:	9a 94       	dec	r9
   2d162:	f4 01       	movw	r30, r8
   2d164:	80 81       	ld	r24, Z
   2d166:	90 e0       	ldi	r25, 0x00	; 0
   2d168:	0f 94 f4 a9 	call	0x353e8	; 0x353e8 <tolower>
   2d16c:	f4 01       	movw	r30, r8
   2d16e:	80 83       	st	Z, r24
   2d170:	b3 94       	inc	r11
   2d172:	e9 cf       	rjmp	.-46     	; 0x2d146 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.242]+0xe2>
    //Serial.print((char*)p.name);
    //Serial.print(" ");
    //Serial.println(autoname);
    if(p.name[9]!='~') //skip safety copies
   2d174:	8a 85       	ldd	r24, Y+10	; 0x0a
   2d176:	8e 37       	cpi	r24, 0x7E	; 126
   2d178:	31 f2       	breq	.-116    	; 0x2d106 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.242]+0xa2>
    if(strncmp((char*)p.name,autoname,5)==0)
   2d17a:	45 e0       	ldi	r20, 0x05	; 5
   2d17c:	50 e0       	ldi	r21, 0x00	; 0
   2d17e:	b8 01       	movw	r22, r16
   2d180:	c7 01       	movw	r24, r14
   2d182:	0f 94 52 aa 	call	0x354a4	; 0x354a4 <strncmp>
   2d186:	89 2b       	or	r24, r25
   2d188:	09 f0       	breq	.+2      	; 0x2d18c <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.242]+0x128>
   2d18a:	bd cf       	rjmp	.-134    	; 0x2d106 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.242]+0xa2>
    {
      // M23: Select SD file
      enquecommandf_P(MSG_M23, autoname);
   2d18c:	1f 93       	push	r17
   2d18e:	0f 93       	push	r16
   2d190:	df 92       	push	r13
   2d192:	cf 92       	push	r12
   2d194:	0e 94 b7 8f 	call	0x11f6e	; 0x11f6e <enquecommandf_P(char const*, ...)>
      // M24: Start/resume SD print
      enquecommand_P(MSG_M24);
   2d198:	61 e0       	ldi	r22, 0x01	; 1
   2d19a:	83 e6       	ldi	r24, 0x63	; 99
   2d19c:	9c e6       	ldi	r25, 0x6C	; 108
   2d19e:	0e 94 e9 8e 	call	0x11dd2	; 0x11dd2 <enquecommand(char const*, bool)>
   2d1a2:	0f 90       	pop	r0
   2d1a4:	0f 90       	pop	r0
   2d1a6:	0f 90       	pop	r0
   2d1a8:	0f 90       	pop	r0
      found=true;
   2d1aa:	aa 24       	eor	r10, r10
   2d1ac:	a3 94       	inc	r10
   2d1ae:	ab cf       	rjmp	.-170    	; 0x2d106 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.242]+0xa2>
    }
  }
  if(!found)
    lastnr=-1;
   2d1b0:	8f ef       	ldi	r24, 0xFF	; 255
   2d1b2:	9f ef       	ldi	r25, 0xFF	; 255
      // M24: Start/resume SD print
      enquecommand_P(MSG_M24);
      found=true;
    }
  }
  if(!found)
   2d1b4:	aa 20       	and	r10, r10
   2d1b6:	29 f0       	breq	.+10     	; 0x2d1c2 <CardReader::checkautostart(bool) [clone .part.9] [clone .constprop.242]+0x15e>
    lastnr=-1;
  else
    lastnr++;
   2d1b8:	80 91 24 14 	lds	r24, 0x1424	; 0x801424 <card+0x4f>
   2d1bc:	90 91 25 14 	lds	r25, 0x1425	; 0x801425 <card+0x50>
   2d1c0:	01 96       	adiw	r24, 0x01	; 1
   2d1c2:	90 93 25 14 	sts	0x1425, r25	; 0x801425 <card+0x50>
   2d1c6:	80 93 24 14 	sts	0x1424, r24	; 0x801424 <card+0x4f>
}
   2d1ca:	ee 96       	adiw	r28, 0x3e	; 62
   2d1cc:	0f b6       	in	r0, 0x3f	; 63
   2d1ce:	f8 94       	cli
   2d1d0:	de bf       	out	0x3e, r29	; 62
   2d1d2:	0f be       	out	0x3f, r0	; 63
   2d1d4:	cd bf       	out	0x3d, r28	; 61
   2d1d6:	df 91       	pop	r29
   2d1d8:	cf 91       	pop	r28
   2d1da:	1f 91       	pop	r17
   2d1dc:	0f 91       	pop	r16
   2d1de:	ff 90       	pop	r15
   2d1e0:	ef 90       	pop	r14
   2d1e2:	df 90       	pop	r13
   2d1e4:	cf 90       	pop	r12
   2d1e6:	bf 90       	pop	r11
   2d1e8:	af 90       	pop	r10
   2d1ea:	9f 90       	pop	r9
   2d1ec:	8f 90       	pop	r8
   2d1ee:	08 95       	ret

0002d1f0 <SdBaseFile::truncate(unsigned long) [clone .constprop.239]>:
 * \return The value one, true, is returned for success and
 * the value zero, false, is returned for failure.
 * Reasons for failure include file is read only, file is a directory,
 * \a length is greater than the current file size or an I/O error occurs.
 */
bool SdBaseFile::truncate(uint32_t length) {
   2d1f0:	8f 92       	push	r8
   2d1f2:	9f 92       	push	r9
   2d1f4:	af 92       	push	r10
   2d1f6:	bf 92       	push	r11
   2d1f8:	cf 92       	push	r12
   2d1fa:	df 92       	push	r13
   2d1fc:	ef 92       	push	r14
   2d1fe:	ff 92       	push	r15
   2d200:	0f 93       	push	r16
   2d202:	1f 93       	push	r17
   2d204:	cf 93       	push	r28
   2d206:	df 93       	push	r29
   2d208:	00 d0       	rcall	.+0      	; 0x2d20a <SdBaseFile::truncate(unsigned long) [clone .constprop.239]+0x1a>
   2d20a:	1f 92       	push	r1
   2d20c:	cd b7       	in	r28, 0x3d	; 61
   2d20e:	de b7       	in	r29, 0x3e	; 62
   2d210:	fc 01       	movw	r30, r24
  uint32_t newPos;
  // error if not a normal file or read-only
  if (!isFile() || !(flags_ & O_WRITE)) goto fail;
   2d212:	83 81       	ldd	r24, Z+3	; 0x03
   2d214:	81 30       	cpi	r24, 0x01	; 1
   2d216:	11 f0       	breq	.+4      	; 0x2d21c <SdBaseFile::truncate(unsigned long) [clone .constprop.239]+0x2c>

  // set file to correct position
  return seekSet(newPos);

 fail:
  return false;
   2d218:	80 e0       	ldi	r24, 0x00	; 0
   2d21a:	60 c0       	rjmp	.+192    	; 0x2d2dc <SdBaseFile::truncate(unsigned long) [clone .constprop.239]+0xec>
 * \a length is greater than the current file size or an I/O error occurs.
 */
bool SdBaseFile::truncate(uint32_t length) {
  uint32_t newPos;
  // error if not a normal file or read-only
  if (!isFile() || !(flags_ & O_WRITE)) goto fail;
   2d21c:	81 81       	ldd	r24, Z+1	; 0x01
   2d21e:	81 ff       	sbrs	r24, 1
   2d220:	fb cf       	rjmp	.-10     	; 0x2d218 <SdBaseFile::truncate(unsigned long) [clone .constprop.239]+0x28>

  // error if length is greater than current size
  if (length > fileSize_) goto fail;

  // fileSize and length are zero - nothing to do
  if (fileSize_ == 0) return true;
   2d222:	81 89       	ldd	r24, Z+17	; 0x11
   2d224:	92 89       	ldd	r25, Z+18	; 0x12
   2d226:	a3 89       	ldd	r26, Z+19	; 0x13
   2d228:	b4 89       	ldd	r27, Z+20	; 0x14
   2d22a:	89 2b       	or	r24, r25
   2d22c:	8a 2b       	or	r24, r26
   2d22e:	8b 2b       	or	r24, r27
   2d230:	09 f4       	brne	.+2      	; 0x2d234 <SdBaseFile::truncate(unsigned long) [clone .constprop.239]+0x44>
   2d232:	6e c0       	rjmp	.+220    	; 0x2d310 <SdBaseFile::truncate(unsigned long) [clone .constprop.239]+0x120>
   2d234:	7f 01       	movw	r14, r30

  // remember position for seek after truncation
  newPos = curPosition_ > length ? length : curPosition_;

  // position to last cluster in truncated file
  if (!seekSet(length)) goto fail;
   2d236:	40 e0       	ldi	r20, 0x00	; 0
   2d238:	50 e0       	ldi	r21, 0x00	; 0
   2d23a:	ba 01       	movw	r22, r20
   2d23c:	cf 01       	movw	r24, r30
   2d23e:	0f 94 0b 2d 	call	0x25a16	; 0x25a16 <SdBaseFile::seekSet(unsigned long)>
   2d242:	88 23       	and	r24, r24
   2d244:	49 f3       	breq	.-46     	; 0x2d218 <SdBaseFile::truncate(unsigned long) [clone .constprop.239]+0x28>

  if (length == 0) {
    // free all clusters
    if (!vol_->freeChain(firstCluster_)) goto fail;
   2d246:	f7 01       	movw	r30, r14
   2d248:	c1 8c       	ldd	r12, Z+25	; 0x19
   2d24a:	d2 8c       	ldd	r13, Z+26	; 0x1a
   2d24c:	85 88       	ldd	r8, Z+21	; 0x15
   2d24e:	96 88       	ldd	r9, Z+22	; 0x16
   2d250:	a7 88       	ldd	r10, Z+23	; 0x17
   2d252:	b0 8c       	ldd	r11, Z+24	; 0x18
// free a cluster chain
bool SdVolume::freeChain(uint32_t cluster) {
  uint32_t next;

  // clear free cluster location
  allocSearchStart_ = 2;
   2d254:	82 e0       	ldi	r24, 0x02	; 2
   2d256:	90 e0       	ldi	r25, 0x00	; 0
   2d258:	a0 e0       	ldi	r26, 0x00	; 0
   2d25a:	b0 e0       	ldi	r27, 0x00	; 0
   2d25c:	f6 01       	movw	r30, r12
   2d25e:	80 83       	st	Z, r24
   2d260:	91 83       	std	Z+1, r25	; 0x01
   2d262:	a2 83       	std	Z+2, r26	; 0x02
   2d264:	b3 83       	std	Z+3, r27	; 0x03

  do {
    if (!fatGet(cluster, &next)) goto fail;
   2d266:	9e 01       	movw	r18, r28
   2d268:	2f 5f       	subi	r18, 0xFF	; 255
   2d26a:	3f 4f       	sbci	r19, 0xFF	; 255
   2d26c:	b5 01       	movw	r22, r10
   2d26e:	a4 01       	movw	r20, r8
   2d270:	c6 01       	movw	r24, r12
   2d272:	0f 94 55 2b 	call	0x256aa	; 0x256aa <SdVolume::fatGet(unsigned long, unsigned long*)>
   2d276:	88 23       	and	r24, r24
   2d278:	79 f2       	breq	.-98     	; 0x2d218 <SdBaseFile::truncate(unsigned long) [clone .constprop.239]+0x28>

    // free cluster
    if (!fatPut(cluster, 0)) goto fail;
   2d27a:	00 e0       	ldi	r16, 0x00	; 0
   2d27c:	10 e0       	ldi	r17, 0x00	; 0
   2d27e:	98 01       	movw	r18, r16
   2d280:	b5 01       	movw	r22, r10
   2d282:	a4 01       	movw	r20, r8
   2d284:	c6 01       	movw	r24, r12
   2d286:	0f 94 c3 2a 	call	0x25586	; 0x25586 <SdVolume::fatPut(unsigned long, unsigned long)>
   2d28a:	88 23       	and	r24, r24
   2d28c:	29 f2       	breq	.-118    	; 0x2d218 <SdBaseFile::truncate(unsigned long) [clone .constprop.239]+0x28>

    cluster = next;
   2d28e:	89 80       	ldd	r8, Y+1	; 0x01
   2d290:	9a 80       	ldd	r9, Y+2	; 0x02
   2d292:	ab 80       	ldd	r10, Y+3	; 0x03
   2d294:	bc 80       	ldd	r11, Y+4	; 0x04
    return fatPut(cluster, 0x0FFFFFFF);
  }
  bool freeChain(uint32_t cluster);
  bool isEOC(uint32_t cluster) const {
    if (FAT12_SUPPORT && fatType_ == 12) return  cluster >= FAT12EOC_MIN;
    if (fatType_ == 16) return cluster >= FAT16EOC_MIN;
   2d296:	f6 01       	movw	r30, r12
   2d298:	87 89       	ldd	r24, Z+23	; 0x17
   2d29a:	80 31       	cpi	r24, 0x10	; 16
   2d29c:	81 f5       	brne	.+96     	; 0x2d2fe <SdBaseFile::truncate(unsigned long) [clone .constprop.239]+0x10e>
   2d29e:	f8 ef       	ldi	r31, 0xF8	; 248
   2d2a0:	8f 16       	cp	r8, r31
   2d2a2:	ff ef       	ldi	r31, 0xFF	; 255
   2d2a4:	9f 06       	cpc	r9, r31
   2d2a6:	a1 04       	cpc	r10, r1
   2d2a8:	b1 04       	cpc	r11, r1
   2d2aa:	e8 f2       	brcs	.-70     	; 0x2d266 <SdBaseFile::truncate(unsigned long) [clone .constprop.239]+0x76>
    firstCluster_ = 0;
   2d2ac:	f7 01       	movw	r30, r14
   2d2ae:	15 8a       	std	Z+21, r1	; 0x15
   2d2b0:	16 8a       	std	Z+22, r1	; 0x16
   2d2b2:	17 8a       	std	Z+23, r1	; 0x17
   2d2b4:	10 8e       	std	Z+24, r1	; 0x18

      // current cluster is end of chain
      if (!vol_->fatPutEOC(curCluster_)) goto fail;
    }
  }
  fileSize_ = length;
   2d2b6:	11 8a       	std	Z+17, r1	; 0x11
   2d2b8:	12 8a       	std	Z+18, r1	; 0x12
   2d2ba:	13 8a       	std	Z+19, r1	; 0x13
   2d2bc:	14 8a       	std	Z+20, r1	; 0x14

  // need to update directory entry
  flags_ |= F_FILE_DIR_DIRTY;
   2d2be:	81 81       	ldd	r24, Z+1	; 0x01
   2d2c0:	80 68       	ori	r24, 0x80	; 128
   2d2c2:	81 83       	std	Z+1, r24	; 0x01

  if (!sync()) goto fail;
   2d2c4:	c7 01       	movw	r24, r14
   2d2c6:	0f 94 b4 2e 	call	0x25d68	; 0x25d68 <SdBaseFile::sync()>
   2d2ca:	88 23       	and	r24, r24
   2d2cc:	09 f4       	brne	.+2      	; 0x2d2d0 <SdBaseFile::truncate(unsigned long) [clone .constprop.239]+0xe0>
   2d2ce:	a4 cf       	rjmp	.-184    	; 0x2d218 <SdBaseFile::truncate(unsigned long) [clone .constprop.239]+0x28>

  // set file to correct position
  return seekSet(newPos);
   2d2d0:	40 e0       	ldi	r20, 0x00	; 0
   2d2d2:	50 e0       	ldi	r21, 0x00	; 0
   2d2d4:	ba 01       	movw	r22, r20
   2d2d6:	c7 01       	movw	r24, r14
   2d2d8:	0f 94 0b 2d 	call	0x25a16	; 0x25a16 <SdBaseFile::seekSet(unsigned long)>

 fail:
  return false;
}
   2d2dc:	0f 90       	pop	r0
   2d2de:	0f 90       	pop	r0
   2d2e0:	0f 90       	pop	r0
   2d2e2:	0f 90       	pop	r0
   2d2e4:	df 91       	pop	r29
   2d2e6:	cf 91       	pop	r28
   2d2e8:	1f 91       	pop	r17
   2d2ea:	0f 91       	pop	r16
   2d2ec:	ff 90       	pop	r15
   2d2ee:	ef 90       	pop	r14
   2d2f0:	df 90       	pop	r13
   2d2f2:	cf 90       	pop	r12
   2d2f4:	bf 90       	pop	r11
   2d2f6:	af 90       	pop	r10
   2d2f8:	9f 90       	pop	r9
   2d2fa:	8f 90       	pop	r8
   2d2fc:	08 95       	ret
    return  cluster >= FAT32EOC_MIN;
   2d2fe:	88 ef       	ldi	r24, 0xF8	; 248
   2d300:	88 16       	cp	r8, r24
   2d302:	8f ef       	ldi	r24, 0xFF	; 255
   2d304:	98 06       	cpc	r9, r24
   2d306:	a8 06       	cpc	r10, r24
   2d308:	8f e0       	ldi	r24, 0x0F	; 15
   2d30a:	b8 06       	cpc	r11, r24
   2d30c:	78 f6       	brcc	.-98     	; 0x2d2ac <SdBaseFile::truncate(unsigned long) [clone .constprop.239]+0xbc>
   2d30e:	ab cf       	rjmp	.-170    	; 0x2d266 <SdBaseFile::truncate(unsigned long) [clone .constprop.239]+0x76>

  // error if length is greater than current size
  if (length > fileSize_) goto fail;

  // fileSize and length are zero - nothing to do
  if (fileSize_ == 0) return true;
   2d310:	81 e0       	ldi	r24, 0x01	; 1
   2d312:	e4 cf       	rjmp	.-56     	; 0x2d2dc <SdBaseFile::truncate(unsigned long) [clone .constprop.239]+0xec>

0002d314 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]>:
+*   LS_Count           - Add +1 to nrFiles for every file within the parent
+*   LS_GetFilename     - Get the filename of the file indexed by nrFiles
+*   LS_SerialPrint     - Print the full path and size of each file to serial output
+*/

void CardReader::lsDive(const char *prepend, SdFile parent, const char * const match/*=NULL*/, LsAction lsAction, ls_param lsParams) {
   2d314:	2f 92       	push	r2
   2d316:	3f 92       	push	r3
   2d318:	4f 92       	push	r4
   2d31a:	5f 92       	push	r5
   2d31c:	6f 92       	push	r6
   2d31e:	7f 92       	push	r7
   2d320:	8f 92       	push	r8
   2d322:	9f 92       	push	r9
   2d324:	af 92       	push	r10
   2d326:	bf 92       	push	r11
   2d328:	cf 92       	push	r12
   2d32a:	df 92       	push	r13
   2d32c:	ef 92       	push	r14
   2d32e:	ff 92       	push	r15
   2d330:	0f 93       	push	r16
   2d332:	1f 93       	push	r17
   2d334:	cf 93       	push	r28
   2d336:	df 93       	push	r29
   2d338:	cd b7       	in	r28, 0x3d	; 61
   2d33a:	de b7       	in	r29, 0x3e	; 62
   2d33c:	c6 57       	subi	r28, 0x76	; 118
   2d33e:	d1 09       	sbc	r29, r1
   2d340:	0f b6       	in	r0, 0x3f	; 63
   2d342:	f8 94       	cli
   2d344:	de bf       	out	0x3e, r29	; 62
   2d346:	0f be       	out	0x3f, r0	; 63
   2d348:	cd bf       	out	0x3d, r28	; 61
   2d34a:	4c 01       	movw	r8, r24
   2d34c:	6b 01       	movw	r12, r22
   2d34e:	3a 01       	movw	r6, r20
   2d350:	e5 96       	adiw	r28, 0x35	; 53
   2d352:	2f af       	std	Y+63, r18	; 0x3f
   2d354:	e5 97       	sbiw	r28, 0x35	; 53
   2d356:	50 2e       	mov	r5, r16
						cnt++;
						break;
				}
			}
		} // while readDir
}
   2d358:	2d b6       	in	r2, 0x3d	; 61
   2d35a:	3e b6       	in	r3, 0x3e	; 62
   2d35c:	10 2f       	mov	r17, r16
   2d35e:	11 70       	andi	r17, 0x01	; 1
	static uint8_t recursionCnt = 0;
	// RAII incrementer for the recursionCnt
	class _incrementer
	{
		public:
		_incrementer() {recursionCnt++;}
   2d360:	80 91 45 0e 	lds	r24, 0x0E45	; 0x800e45 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param)::recursionCnt>
   2d364:	8f 5f       	subi	r24, 0xFF	; 255
   2d366:	80 93 45 0e 	sts	0x0E45, r24	; 0x800e45 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param)::recursionCnt>
	} recursionCntIncrementer;

	dir_t p;
	uint8_t cnt = 0;
		// Read the next entry from a directory
		for (position = parent.curPosition(); parent.readDir(p, longFilename) > 0; position = parent.curPosition()) {
   2d36a:	fb 01       	movw	r30, r22
   2d36c:	80 85       	ldd	r24, Z+8	; 0x08
   2d36e:	91 85       	ldd	r25, Z+9	; 0x09
   2d370:	a2 85       	ldd	r26, Z+10	; 0x0a
   2d372:	b3 85       	ldd	r27, Z+11	; 0x0b
   2d374:	80 93 ea 13 	sts	0x13EA, r24	; 0x8013ea <card+0x15>
   2d378:	90 93 eb 13 	sts	0x13EB, r25	; 0x8013eb <card+0x16>
   2d37c:	a0 93 ec 13 	sts	0x13EC, r26	; 0x8013ec <card+0x17>
   2d380:	b0 93 ed 13 	sts	0x13ED, r27	; 0x8013ed <card+0x18>
		_incrementer() {recursionCnt++;}
		~_incrementer() {recursionCnt--;}
	} recursionCntIncrementer;

	dir_t p;
	uint8_t cnt = 0;
   2d384:	41 2c       	mov	r4, r1
			if (longFilename[0] == '.') continue;
			if (!DIR_IS_FILE_OR_SUBDIR(&p) || (p.attributes & DIR_ATT_HIDDEN)) continue;
			if (DIR_IS_SUBDIR(&p) && lsAction == LS_SerialPrint) { // If the entry is a directory and the action is LS_SerialPrint
				// Get the short name for the item, which we know is a folder
				char lfilename[FILENAME_LENGTH];
				createFilename(lfilename, p);
   2d386:	5e 01       	movw	r10, r28
   2d388:	f7 e6       	ldi	r31, 0x67	; 103
   2d38a:	af 0e       	add	r10, r31
   2d38c:	b1 1c       	adc	r11, r1
 * a directory file or an I/O error occurred.
 */
int8_t SdBaseFile::readDir(dir_t* dir, char* longFilename) {
  int16_t n;
  // if not a directory file or miss-positioned return an error
  if (!isDir() || (0X1F & curPosition_)) return -1;
   2d38e:	f6 01       	movw	r30, r12
   2d390:	83 81       	ldd	r24, Z+3	; 0x03
   2d392:	82 30       	cpi	r24, 0x02	; 2
   2d394:	08 f4       	brcc	.+2      	; 0x2d398 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x84>
   2d396:	c0 c1       	rjmp	.+896    	; 0x2d718 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x404>
   2d398:	80 85       	ldd	r24, Z+8	; 0x08
   2d39a:	91 85       	ldd	r25, Z+9	; 0x09
   2d39c:	a2 85       	ldd	r26, Z+10	; 0x0a
   2d39e:	b3 85       	ldd	r27, Z+11	; 0x0b
   2d3a0:	8f 71       	andi	r24, 0x1F	; 31
   2d3a2:	99 27       	eor	r25, r25
   2d3a4:	aa 27       	eor	r26, r26
   2d3a6:	bb 27       	eor	r27, r27
   2d3a8:	89 2b       	or	r24, r25
   2d3aa:	8a 2b       	or	r24, r26
   2d3ac:	8b 2b       	or	r24, r27
   2d3ae:	09 f0       	breq	.+2      	; 0x2d3b2 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x9e>
   2d3b0:	b3 c1       	rjmp	.+870    	; 0x2d718 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x404>

  //If we have a longFilename buffer, mark it as invalid. If we find a long filename it will be filled automaticly.
  if (longFilename != NULL)
  {
  	longFilename[0] = '\0';
   2d3b2:	10 92 ee 13 	sts	0x13EE, r1	; 0x8013ee <card+0x19>
   2d3b6:	4e ee       	ldi	r20, 0xEE	; 238
   2d3b8:	53 e1       	ldi	r21, 0x13	; 19
   2d3ba:	be 01       	movw	r22, r28
   2d3bc:	69 5b       	subi	r22, 0xB9	; 185
   2d3be:	7f 4f       	sbci	r23, 0xFF	; 255
   2d3c0:	c6 01       	movw	r24, r12
   2d3c2:	0f 94 48 30 	call	0x26090	; 0x26090 <SdBaseFile::readDir(directoryEntry*, char*) [clone .part.23]>
	} recursionCntIncrementer;

	dir_t p;
	uint8_t cnt = 0;
		// Read the next entry from a directory
		for (position = parent.curPosition(); parent.readDir(p, longFilename) > 0; position = parent.curPosition()) {
   2d3c6:	18 16       	cp	r1, r24
   2d3c8:	0c f0       	brlt	.+2      	; 0x2d3cc <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0xb8>
   2d3ca:	a6 c1       	rjmp	.+844    	; 0x2d718 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x404>
			if (recursionCnt > MAX_DIR_DEPTH)
   2d3cc:	80 91 45 0e 	lds	r24, 0x0E45	; 0x800e45 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param)::recursionCnt>
   2d3d0:	87 30       	cpi	r24, 0x07	; 7
   2d3d2:	08 f0       	brcs	.+2      	; 0x2d3d6 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0xc2>
   2d3d4:	a1 c1       	rjmp	.+834    	; 0x2d718 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x404>
				return;
			uint8_t pn0 = p.name[0];
   2d3d6:	28 96       	adiw	r28, 0x08	; 8
   2d3d8:	8f ad       	ldd	r24, Y+63	; 0x3f
   2d3da:	28 97       	sbiw	r28, 0x08	; 8
			if (pn0 == DIR_NAME_FREE) break;
   2d3dc:	88 23       	and	r24, r24
   2d3de:	09 f4       	brne	.+2      	; 0x2d3e2 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0xce>
   2d3e0:	9b c1       	rjmp	.+822    	; 0x2d718 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x404>
			if (pn0 == DIR_NAME_DELETED || pn0 == '.') continue;
   2d3e2:	85 3e       	cpi	r24, 0xE5	; 229
   2d3e4:	09 f4       	brne	.+2      	; 0x2d3e8 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0xd4>
   2d3e6:	39 c1       	rjmp	.+626    	; 0x2d65a <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x346>
   2d3e8:	8e 32       	cpi	r24, 0x2E	; 46
   2d3ea:	09 f4       	brne	.+2      	; 0x2d3ee <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0xda>
   2d3ec:	36 c1       	rjmp	.+620    	; 0x2d65a <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x346>
			if (longFilename[0] == '.') continue;
   2d3ee:	80 91 ee 13 	lds	r24, 0x13EE	; 0x8013ee <card+0x19>
   2d3f2:	8e 32       	cpi	r24, 0x2E	; 46
   2d3f4:	09 f4       	brne	.+2      	; 0x2d3f8 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0xe4>
   2d3f6:	31 c1       	rjmp	.+610    	; 0x2d65a <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x346>
   2d3f8:	63 96       	adiw	r28, 0x13	; 19
   2d3fa:	8f ad       	ldd	r24, Y+63	; 0x3f
   2d3fc:	63 97       	sbiw	r28, 0x13	; 19
			if (!DIR_IS_FILE_OR_SUBDIR(&p) || (p.attributes & DIR_ATT_HIDDEN)) continue;
   2d3fe:	98 2f       	mov	r25, r24
   2d400:	9a 70       	andi	r25, 0x0A	; 10
   2d402:	09 f0       	breq	.+2      	; 0x2d406 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0xf2>
   2d404:	2a c1       	rjmp	.+596    	; 0x2d65a <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x346>
   2d406:	88 71       	andi	r24, 0x18	; 24
 * \param[in] dir Pointer to a directory entry.
 *
 * \return true if the entry is for a subdirectory else false.
 */
static inline uint8_t DIR_IS_SUBDIR(const dir_t* dir) {
  return (dir->attributes & DIR_ATT_FILE_TYPE_MASK) == DIR_ATT_DIRECTORY;
   2d408:	91 e0       	ldi	r25, 0x01	; 1
   2d40a:	80 31       	cpi	r24, 0x10	; 16
   2d40c:	19 f0       	breq	.+6      	; 0x2d414 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x100>
   2d40e:	90 e0       	ldi	r25, 0x00	; 0
			if (DIR_IS_SUBDIR(&p) && lsAction == LS_SerialPrint) { // If the entry is a directory and the action is LS_SerialPrint
   2d410:	80 31       	cpi	r24, 0x10	; 16
   2d412:	31 f4       	brne	.+12     	; 0x2d420 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x10c>
   2d414:	e5 96       	adiw	r28, 0x35	; 53
   2d416:	ff ad       	ldd	r31, Y+63	; 0x3f
   2d418:	e5 97       	sbiw	r28, 0x35	; 53
   2d41a:	ff 23       	and	r31, r31
   2d41c:	09 f4       	brne	.+2      	; 0x2d420 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x10c>
   2d41e:	94 c0       	rjmp	.+296    	; 0x2d548 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x234>

				if (lsParams.LFN)
					puts_P(PSTR("DIR_EXIT"));
			}
			else {
				filenameIsDir = DIR_IS_SUBDIR(&p);
   2d420:	90 93 23 14 	sts	0x1423, r25	; 0x801423 <card+0x4e>
				if (!filenameIsDir && (p.name[8] != 'G' || p.name[9] == '~')) continue;
   2d424:	80 31       	cpi	r24, 0x10	; 16
   2d426:	61 f0       	breq	.+24     	; 0x2d440 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x12c>
   2d428:	60 96       	adiw	r28, 0x10	; 16
   2d42a:	8f ad       	ldd	r24, Y+63	; 0x3f
   2d42c:	60 97       	sbiw	r28, 0x10	; 16
   2d42e:	87 34       	cpi	r24, 0x47	; 71
   2d430:	09 f0       	breq	.+2      	; 0x2d434 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x120>
   2d432:	13 c1       	rjmp	.+550    	; 0x2d65a <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x346>
   2d434:	61 96       	adiw	r28, 0x11	; 17
   2d436:	8f ad       	ldd	r24, Y+63	; 0x3f
   2d438:	61 97       	sbiw	r28, 0x11	; 17
   2d43a:	8e 37       	cpi	r24, 0x7E	; 126
   2d43c:	09 f4       	brne	.+2      	; 0x2d440 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x12c>
   2d43e:	0d c1       	rjmp	.+538    	; 0x2d65a <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x346>
				switch (lsAction) {
   2d440:	e5 96       	adiw	r28, 0x35	; 53
   2d442:	ff ad       	ldd	r31, Y+63	; 0x3f
   2d444:	e5 97       	sbiw	r28, 0x35	; 53
   2d446:	f1 30       	cpi	r31, 0x01	; 1
   2d448:	09 f4       	brne	.+2      	; 0x2d44c <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x138>
   2d44a:	1b c1       	rjmp	.+566    	; 0x2d682 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x36e>
   2d44c:	f2 30       	cpi	r31, 0x02	; 2
   2d44e:	09 f4       	brne	.+2      	; 0x2d452 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x13e>
   2d450:	25 c1       	rjmp	.+586    	; 0x2d69c <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x388>
					case LS_Count:
						nrFiles++;
						break;

					case LS_SerialPrint:
						createFilename(filename, p);
   2d452:	be 01       	movw	r22, r28
   2d454:	69 5b       	subi	r22, 0xB9	; 185
   2d456:	7f 4f       	sbci	r23, 0xFF	; 255
   2d458:	89 ed       	ldi	r24, 0xD9	; 217
   2d45a:	93 e1       	ldi	r25, 0x13	; 19
   2d45c:	0e 94 90 79 	call	0xf320	; 0xf320 <createFilename(char*, directoryEntry const&)>
   2d460:	c4 01       	movw	r24, r8
   2d462:	0e 94 95 87 	call	0x10f2a	; 0x10f2a <MarlinSerial::write(char const*)>
   2d466:	89 ed       	ldi	r24, 0xD9	; 217
   2d468:	93 e1       	ldi	r25, 0x13	; 19
   2d46a:	0e 94 95 87 	call	0x10f2a	; 0x10f2a <MarlinSerial::write(char const*)>
						SERIAL_PROTOCOL(prepend);
						SERIAL_PROTOCOL(filename);

						MYSERIAL.write(' ');
   2d46e:	80 e2       	ldi	r24, 0x20	; 32
   2d470:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
}

void MarlinSerial::print(unsigned long n, int base)
{
  if (base == 0) write(n);
  else printNumber(n, base);
   2d474:	a7 96       	adiw	r28, 0x27	; 39
   2d476:	6c ad       	ldd	r22, Y+60	; 0x3c
   2d478:	7d ad       	ldd	r23, Y+61	; 0x3d
   2d47a:	8e ad       	ldd	r24, Y+62	; 0x3e
   2d47c:	9f ad       	ldd	r25, Y+63	; 0x3f
   2d47e:	a7 97       	sbiw	r28, 0x27	; 39
   2d480:	4a e0       	ldi	r20, 0x0A	; 10
   2d482:	0e 94 c5 79 	call	0xf38a	; 0xf38a <MarlinSerial::printNumber(unsigned long, unsigned char)>
						SERIAL_PROTOCOL(p.fileSize);

						if (lsParams.timestamp)
   2d486:	51 fe       	sbrs	r5, 1
   2d488:	45 c0       	rjmp	.+138    	; 0x2d514 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x200>
						{
							crmodDate = p.lastWriteDate;
   2d48a:	a1 96       	adiw	r28, 0x21	; 33
   2d48c:	2e ad       	ldd	r18, Y+62	; 0x3e
   2d48e:	3f ad       	ldd	r19, Y+63	; 0x3f
   2d490:	a1 97       	sbiw	r28, 0x21	; 33
   2d492:	30 93 e9 13 	sts	0x13E9, r19	; 0x8013e9 <card+0x14>
   2d496:	20 93 e8 13 	sts	0x13E8, r18	; 0x8013e8 <card+0x13>
							crmodTime = p.lastWriteTime;
   2d49a:	6f 96       	adiw	r28, 0x1f	; 31
   2d49c:	4e ad       	ldd	r20, Y+62	; 0x3e
   2d49e:	5f ad       	ldd	r21, Y+63	; 0x3f
   2d4a0:	6f 97       	sbiw	r28, 0x1f	; 31
   2d4a2:	50 93 e7 13 	sts	0x13E7, r21	; 0x8013e7 <card+0x12>
   2d4a6:	40 93 e6 13 	sts	0x13E6, r20	; 0x8013e6 <card+0x11>
							if( crmodDate < p.creationDate || ( crmodDate == p.creationDate && crmodTime < p.creationTime ) ){
   2d4aa:	69 96       	adiw	r28, 0x19	; 25
   2d4ac:	8e ad       	ldd	r24, Y+62	; 0x3e
   2d4ae:	9f ad       	ldd	r25, Y+63	; 0x3f
   2d4b0:	69 97       	sbiw	r28, 0x19	; 25
   2d4b2:	28 17       	cp	r18, r24
   2d4b4:	39 07       	cpc	r19, r25
   2d4b6:	50 f0       	brcs	.+20     	; 0x2d4cc <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x1b8>
   2d4b8:	28 17       	cp	r18, r24
   2d4ba:	39 07       	cpc	r19, r25
   2d4bc:	99 f4       	brne	.+38     	; 0x2d4e4 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x1d0>
   2d4be:	67 96       	adiw	r28, 0x17	; 23
   2d4c0:	2e ad       	ldd	r18, Y+62	; 0x3e
   2d4c2:	3f ad       	ldd	r19, Y+63	; 0x3f
   2d4c4:	67 97       	sbiw	r28, 0x17	; 23
   2d4c6:	42 17       	cp	r20, r18
   2d4c8:	53 07       	cpc	r21, r19
   2d4ca:	60 f4       	brcc	.+24     	; 0x2d4e4 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x1d0>
								crmodDate = p.creationDate;
   2d4cc:	90 93 e9 13 	sts	0x13E9, r25	; 0x8013e9 <card+0x14>
   2d4d0:	80 93 e8 13 	sts	0x13E8, r24	; 0x8013e8 <card+0x13>
								crmodTime = p.creationTime;
   2d4d4:	67 96       	adiw	r28, 0x17	; 23
   2d4d6:	8e ad       	ldd	r24, Y+62	; 0x3e
   2d4d8:	9f ad       	ldd	r25, Y+63	; 0x3f
   2d4da:	67 97       	sbiw	r28, 0x17	; 23
   2d4dc:	90 93 e7 13 	sts	0x13E7, r25	; 0x8013e7 <card+0x12>
   2d4e0:	80 93 e6 13 	sts	0x13E6, r24	; 0x8013e6 <card+0x11>
							}
							printf_P(PSTR(" %#lx"), ((uint32_t)crmodDate << 16) | crmodTime);
   2d4e4:	80 91 e9 13 	lds	r24, 0x13E9	; 0x8013e9 <card+0x14>
   2d4e8:	8f 93       	push	r24
   2d4ea:	80 91 e8 13 	lds	r24, 0x13E8	; 0x8013e8 <card+0x13>
   2d4ee:	8f 93       	push	r24
   2d4f0:	80 91 e7 13 	lds	r24, 0x13E7	; 0x8013e7 <card+0x12>
   2d4f4:	8f 93       	push	r24
   2d4f6:	80 91 e6 13 	lds	r24, 0x13E6	; 0x8013e6 <card+0x11>
   2d4fa:	8f 93       	push	r24
   2d4fc:	27 e1       	ldi	r18, 0x17	; 23
   2d4fe:	31 ea       	ldi	r19, 0xA1	; 161
   2d500:	3f 93       	push	r19
   2d502:	2f 93       	push	r18
   2d504:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   2d508:	0f 90       	pop	r0
   2d50a:	0f 90       	pop	r0
   2d50c:	0f 90       	pop	r0
   2d50e:	0f 90       	pop	r0
   2d510:	0f 90       	pop	r0
   2d512:	0f 90       	pop	r0
						}

						if (lsParams.LFN)
   2d514:	11 23       	and	r17, r17
   2d516:	99 f0       	breq	.+38     	; 0x2d53e <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x22a>
							printf_P(PSTR(" \"%s\""), LONGEST_FILENAME);
   2d518:	80 91 ee 13 	lds	r24, 0x13EE	; 0x8013ee <card+0x19>
   2d51c:	88 23       	and	r24, r24
   2d51e:	09 f4       	brne	.+2      	; 0x2d522 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x20e>
   2d520:	ba c0       	rjmp	.+372    	; 0x2d696 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x382>
   2d522:	8e ee       	ldi	r24, 0xEE	; 238
   2d524:	93 e1       	ldi	r25, 0x13	; 19
   2d526:	9f 93       	push	r25
   2d528:	8f 93       	push	r24
   2d52a:	e1 e1       	ldi	r30, 0x11	; 17
   2d52c:	f1 ea       	ldi	r31, 0xA1	; 161
   2d52e:	ff 93       	push	r31
   2d530:	ef 93       	push	r30
   2d532:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   2d536:	0f 90       	pop	r0
   2d538:	0f 90       	pop	r0
   2d53a:	0f 90       	pop	r0
   2d53c:	0f 90       	pop	r0

						SERIAL_PROTOCOLLN();
   2d53e:	0e 94 bc 7a 	call	0xf578	; 0xf578 <MarlinSerial::println()>
						manage_heater();
   2d542:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
   2d546:	89 c0       	rjmp	.+274    	; 0x2d65a <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x346>
				}
				lsDive(path, dir, NULL, lsAction, lsParams);
				// close() is done automatically by destructor of SdFile

				if (lsParams.LFN)
					puts_P(PSTR("DIR_EXIT"));
   2d548:	2d b7       	in	r18, 0x3d	; 61
   2d54a:	3e b7       	in	r19, 0x3e	; 62
   2d54c:	e7 96       	adiw	r28, 0x37	; 55
   2d54e:	3f af       	std	Y+63, r19	; 0x3f
   2d550:	2e af       	std	Y+62, r18	; 0x3e
   2d552:	e7 97       	sbiw	r28, 0x37	; 55
			if (longFilename[0] == '.') continue;
			if (!DIR_IS_FILE_OR_SUBDIR(&p) || (p.attributes & DIR_ATT_HIDDEN)) continue;
			if (DIR_IS_SUBDIR(&p) && lsAction == LS_SerialPrint) { // If the entry is a directory and the action is LS_SerialPrint
				// Get the short name for the item, which we know is a folder
				char lfilename[FILENAME_LENGTH];
				createFilename(lfilename, p);
   2d554:	be 01       	movw	r22, r28
   2d556:	69 5b       	subi	r22, 0xB9	; 185
   2d558:	7f 4f       	sbci	r23, 0xFF	; 255
   2d55a:	c5 01       	movw	r24, r10
   2d55c:	0e 94 90 79 	call	0xf320	; 0xf320 <createFilename(char*, directoryEntry const&)>
				// Allocate enough stack space for the full path to a folder, trailing slash, and nul
				bool prepend_is_empty = (prepend[0] == '\0');
   2d560:	f4 01       	movw	r30, r8
   2d562:	80 81       	ld	r24, Z
				int len = (prepend_is_empty ? 1 : strlen(prepend)) + strlen(lfilename) + 1 + 1;
   2d564:	88 23       	and	r24, r24
   2d566:	09 f4       	brne	.+2      	; 0x2d56a <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x256>
   2d568:	86 c0       	rjmp	.+268    	; 0x2d676 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x362>
   2d56a:	01 90       	ld	r0, Z+
   2d56c:	00 20       	and	r0, r0
   2d56e:	e9 f7       	brne	.-6      	; 0x2d56a <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x256>
   2d570:	31 97       	sbiw	r30, 0x01	; 1
   2d572:	e8 19       	sub	r30, r8
   2d574:	f9 09       	sbc	r31, r9
   2d576:	d5 01       	movw	r26, r10
   2d578:	0d 90       	ld	r0, X+
   2d57a:	00 20       	and	r0, r0
   2d57c:	e9 f7       	brne	.-6      	; 0x2d578 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x264>
   2d57e:	ea 19       	sub	r30, r10
   2d580:	fb 09       	sbc	r31, r11
				char path[len];
   2d582:	ea 0f       	add	r30, r26
   2d584:	fb 1f       	adc	r31, r27
   2d586:	31 96       	adiw	r30, 0x01	; 1
   2d588:	2d b7       	in	r18, 0x3d	; 61
   2d58a:	3e b7       	in	r19, 0x3e	; 62
   2d58c:	2e 1b       	sub	r18, r30
   2d58e:	3f 0b       	sbc	r19, r31
   2d590:	0f b6       	in	r0, 0x3f	; 63
   2d592:	f8 94       	cli
   2d594:	3e bf       	out	0x3e, r19	; 62
   2d596:	0f be       	out	0x3f, r0	; 63
   2d598:	2d bf       	out	0x3d, r18	; 61
   2d59a:	ed b7       	in	r30, 0x3d	; 61
   2d59c:	fe b7       	in	r31, 0x3e	; 62
   2d59e:	31 96       	adiw	r30, 0x01	; 1
   2d5a0:	7f 01       	movw	r14, r30
				// Append the FOLDERNAME12/ to the passed string.
				// It contains the full path to the "parent" argument.
				// We now have the full path to the item in this folder.
				strcpy(path, prepend_is_empty ? "/" : prepend); // root slash if prepend is empty
   2d5a2:	60 ef       	ldi	r22, 0xF0	; 240
   2d5a4:	72 e0       	ldi	r23, 0x02	; 2
   2d5a6:	81 11       	cpse	r24, r1
   2d5a8:	b4 01       	movw	r22, r8
   2d5aa:	c7 01       	movw	r24, r14
   2d5ac:	0f 94 4b aa 	call	0x35496	; 0x35496 <strcpy>
				strcat(path, lfilename); // FILENAME_LENGTH-1 characters maximum
   2d5b0:	b5 01       	movw	r22, r10
   2d5b2:	c7 01       	movw	r24, r14
   2d5b4:	0f 94 2c aa 	call	0x35458	; 0x35458 <strcat>
				strcat(path, "/");       // 1 character
   2d5b8:	60 ef       	ldi	r22, 0xF0	; 240
   2d5ba:	72 e0       	ldi	r23, 0x02	; 2
   2d5bc:	c7 01       	movw	r24, r14
   2d5be:	0f 94 2c aa 	call	0x35458	; 0x35458 <strcat>
				// Serial.print(path);
				// Get a new directory object using the full path
				// and dive recursively into it.

				if (lsParams.LFN)
   2d5c2:	11 23       	and	r17, r17
   2d5c4:	a9 f0       	breq	.+42     	; 0x2d5f0 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x2dc>
					printf_P(PSTR("DIR_ENTER: %s \"%s\"\n"), path, longFilename[0] ? longFilename : lfilename);
   2d5c6:	80 91 ee 13 	lds	r24, 0x13EE	; 0x8013ee <card+0x19>
   2d5ca:	81 11       	cpse	r24, r1
   2d5cc:	57 c0       	rjmp	.+174    	; 0x2d67c <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x368>
   2d5ce:	c5 01       	movw	r24, r10
   2d5d0:	9f 93       	push	r25
   2d5d2:	8f 93       	push	r24
   2d5d4:	ff 92       	push	r15
   2d5d6:	ef 92       	push	r14
   2d5d8:	26 e2       	ldi	r18, 0x26	; 38
   2d5da:	31 ea       	ldi	r19, 0xA1	; 161
   2d5dc:	3f 93       	push	r19
   2d5de:	2f 93       	push	r18
   2d5e0:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   2d5e4:	0f 90       	pop	r0
   2d5e6:	0f 90       	pop	r0
   2d5e8:	0f 90       	pop	r0
   2d5ea:	0f 90       	pop	r0
   2d5ec:	0f 90       	pop	r0
   2d5ee:	0f 90       	pop	r0
 * \brief Base class for SdFile with Print and C++ streams.
 */
class SdBaseFile {
 public:
  /** Create an instance. */
  SdBaseFile() : writeError(false), type_(FAT_FILE_TYPE_CLOSED) {}
   2d5f0:	1c a2       	std	Y+36, r1	; 0x24
   2d5f2:	1f a2       	std	Y+39, r1	; 0x27
   * OR of flags O_READ, O_WRITE, O_TRUNC, and O_SYNC.
   * \return true for success or false for failure.
   */
  bool open(SdBaseFile& dirFile, // NOLINT
    const char* path, uint8_t oflag) {
    return open(&dirFile, path, oflag);
   2d5f4:	21 e0       	ldi	r18, 0x01	; 1
   2d5f6:	a5 01       	movw	r20, r10
   2d5f8:	b6 01       	movw	r22, r12
   2d5fa:	ce 01       	movw	r24, r28
   2d5fc:	84 96       	adiw	r24, 0x24	; 36
   2d5fe:	0f 94 c5 54 	call	0x2a98a	; 0x2a98a <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)>
				if (!dir.open(parent, lfilename, O_READ)) {
					//SERIAL_ECHO_START();
					//SERIAL_ECHOPGM(_i("Cannot open subdir"));////MSG_SD_CANT_OPEN_SUBDIR
					//SERIAL_ECHOLN(lfilename);
				}
				lsDive(path, dir, NULL, lsAction, lsParams);
   2d602:	83 e2       	ldi	r24, 0x23	; 35
   2d604:	fe 01       	movw	r30, r28
   2d606:	b4 96       	adiw	r30, 0x24	; 36
   2d608:	de 01       	movw	r26, r28
   2d60a:	11 96       	adiw	r26, 0x01	; 1
   2d60c:	01 90       	ld	r0, Z+
   2d60e:	0d 92       	st	X+, r0
   2d610:	8a 95       	dec	r24
   2d612:	e1 f7       	brne	.-8      	; 0x2d60c <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x2f8>
   2d614:	10 fb       	bst	r17, 0
   2d616:	50 f8       	bld	r5, 0
   2d618:	05 2d       	mov	r16, r5
   2d61a:	20 e0       	ldi	r18, 0x00	; 0
   2d61c:	50 e0       	ldi	r21, 0x00	; 0
   2d61e:	40 e0       	ldi	r20, 0x00	; 0
   2d620:	be 01       	movw	r22, r28
   2d622:	6f 5f       	subi	r22, 0xFF	; 255
   2d624:	7f 4f       	sbci	r23, 0xFF	; 255
   2d626:	c7 01       	movw	r24, r14
   2d628:	0f 94 8a 69 	call	0x2d314	; 0x2d314 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]>
   2d62c:	ce 01       	movw	r24, r28
   2d62e:	01 96       	adiw	r24, 0x01	; 1
   2d630:	0e 94 ab 79 	call	0xf356	; 0xf356 <SdBaseFile::~SdBaseFile()>
				// close() is done automatically by destructor of SdFile

				if (lsParams.LFN)
   2d634:	11 23       	and	r17, r17
   2d636:	21 f0       	breq	.+8      	; 0x2d640 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x32c>
					puts_P(PSTR("DIR_EXIT"));
   2d638:	8d e1       	ldi	r24, 0x1D	; 29
   2d63a:	91 ea       	ldi	r25, 0xA1	; 161
   2d63c:	0f 94 c9 a2 	call	0x34592	; 0x34592 <puts_P>
   2d640:	ce 01       	movw	r24, r28
   2d642:	84 96       	adiw	r24, 0x24	; 36
   2d644:	0e 94 ab 79 	call	0xf356	; 0xf356 <SdBaseFile::~SdBaseFile()>
   2d648:	e7 96       	adiw	r28, 0x37	; 55
   2d64a:	ee ad       	ldd	r30, Y+62	; 0x3e
   2d64c:	ff ad       	ldd	r31, Y+63	; 0x3f
   2d64e:	e7 97       	sbiw	r28, 0x37	; 55
   2d650:	0f b6       	in	r0, 0x3f	; 63
   2d652:	f8 94       	cli
   2d654:	fe bf       	out	0x3e, r31	; 62
   2d656:	0f be       	out	0x3f, r0	; 63
   2d658:	ed bf       	out	0x3d, r30	; 61
	} recursionCntIncrementer;

	dir_t p;
	uint8_t cnt = 0;
		// Read the next entry from a directory
		for (position = parent.curPosition(); parent.readDir(p, longFilename) > 0; position = parent.curPosition()) {
   2d65a:	f6 01       	movw	r30, r12
   2d65c:	80 85       	ldd	r24, Z+8	; 0x08
   2d65e:	91 85       	ldd	r25, Z+9	; 0x09
   2d660:	a2 85       	ldd	r26, Z+10	; 0x0a
   2d662:	b3 85       	ldd	r27, Z+11	; 0x0b
   2d664:	80 93 ea 13 	sts	0x13EA, r24	; 0x8013ea <card+0x15>
   2d668:	90 93 eb 13 	sts	0x13EB, r25	; 0x8013eb <card+0x16>
   2d66c:	a0 93 ec 13 	sts	0x13EC, r26	; 0x8013ec <card+0x17>
   2d670:	b0 93 ed 13 	sts	0x13ED, r27	; 0x8013ed <card+0x18>
   2d674:	8c ce       	rjmp	.-744    	; 0x2d38e <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x7a>
				// Get the short name for the item, which we know is a folder
				char lfilename[FILENAME_LENGTH];
				createFilename(lfilename, p);
				// Allocate enough stack space for the full path to a folder, trailing slash, and nul
				bool prepend_is_empty = (prepend[0] == '\0');
				int len = (prepend_is_empty ? 1 : strlen(prepend)) + strlen(lfilename) + 1 + 1;
   2d676:	e1 e0       	ldi	r30, 0x01	; 1
   2d678:	f0 e0       	ldi	r31, 0x00	; 0
   2d67a:	7d cf       	rjmp	.-262    	; 0x2d576 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x262>
				// Serial.print(path);
				// Get a new directory object using the full path
				// and dive recursively into it.

				if (lsParams.LFN)
					printf_P(PSTR("DIR_ENTER: %s \"%s\"\n"), path, longFilename[0] ? longFilename : lfilename);
   2d67c:	8e ee       	ldi	r24, 0xEE	; 238
   2d67e:	93 e1       	ldi	r25, 0x13	; 19
   2d680:	a7 cf       	rjmp	.-178    	; 0x2d5d0 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x2bc>
			else {
				filenameIsDir = DIR_IS_SUBDIR(&p);
				if (!filenameIsDir && (p.name[8] != 'G' || p.name[9] == '~')) continue;
				switch (lsAction) {
					case LS_Count:
						nrFiles++;
   2d682:	80 91 ef 16 	lds	r24, 0x16EF	; 0x8016ef <card+0x31a>
   2d686:	90 91 f0 16 	lds	r25, 0x16F0	; 0x8016f0 <card+0x31b>
   2d68a:	01 96       	adiw	r24, 0x01	; 1
   2d68c:	90 93 f0 16 	sts	0x16F0, r25	; 0x8016f0 <card+0x31b>
   2d690:	80 93 ef 16 	sts	0x16EF, r24	; 0x8016ef <card+0x31a>
   2d694:	e2 cf       	rjmp	.-60     	; 0x2d65a <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x346>
							}
							printf_P(PSTR(" %#lx"), ((uint32_t)crmodDate << 16) | crmodTime);
						}

						if (lsParams.LFN)
							printf_P(PSTR(" \"%s\""), LONGEST_FILENAME);
   2d696:	89 ed       	ldi	r24, 0xD9	; 217
   2d698:	93 e1       	ldi	r25, 0x13	; 19
   2d69a:	45 cf       	rjmp	.-374    	; 0x2d526 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x212>
						manage_heater();
						break;

					case LS_GetFilename:
						//SERIAL_ECHOPGM("File: ");
						createFilename(filename, p);
   2d69c:	be 01       	movw	r22, r28
   2d69e:	69 5b       	subi	r22, 0xB9	; 185
   2d6a0:	7f 4f       	sbci	r23, 0xFF	; 255
   2d6a2:	89 ed       	ldi	r24, 0xD9	; 217
   2d6a4:	93 e1       	ldi	r25, 0x13	; 19
   2d6a6:	0e 94 90 79 	call	0xf320	; 0xf320 <createFilename(char*, directoryEntry const&)>
						SERIAL_ECHOPGM("Creation date: ");
						MYSERIAL.println(p.creationDate);
						SERIAL_ECHOPGM("Access date: ");
						MYSERIAL.println(p.lastAccessDate);
						SERIAL_ECHOLNPGM("");*/
						crmodDate = p.lastWriteDate;
   2d6aa:	a1 96       	adiw	r28, 0x21	; 33
   2d6ac:	2e ad       	ldd	r18, Y+62	; 0x3e
   2d6ae:	3f ad       	ldd	r19, Y+63	; 0x3f
   2d6b0:	a1 97       	sbiw	r28, 0x21	; 33
   2d6b2:	30 93 e9 13 	sts	0x13E9, r19	; 0x8013e9 <card+0x14>
   2d6b6:	20 93 e8 13 	sts	0x13E8, r18	; 0x8013e8 <card+0x13>
						crmodTime = p.lastWriteTime;
   2d6ba:	6f 96       	adiw	r28, 0x1f	; 31
   2d6bc:	4e ad       	ldd	r20, Y+62	; 0x3e
   2d6be:	5f ad       	ldd	r21, Y+63	; 0x3f
   2d6c0:	6f 97       	sbiw	r28, 0x1f	; 31
   2d6c2:	50 93 e7 13 	sts	0x13E7, r21	; 0x8013e7 <card+0x12>
   2d6c6:	40 93 e6 13 	sts	0x13E6, r20	; 0x8013e6 <card+0x11>
						// There are scenarios when simple modification time is not enough (on MS Windows)
						// For example - extract an old g-code from an archive onto the SD card.
						// In such case the creation time is current time (which is correct), but the modification time
						// stays the same - i.e. old.
						// Therefore let's pick the most recent timestamp from both creation and modification timestamps
						if( crmodDate < p.creationDate || ( crmodDate == p.creationDate && crmodTime < p.creationTime ) ){
   2d6ca:	69 96       	adiw	r28, 0x19	; 25
   2d6cc:	8e ad       	ldd	r24, Y+62	; 0x3e
   2d6ce:	9f ad       	ldd	r25, Y+63	; 0x3f
   2d6d0:	69 97       	sbiw	r28, 0x19	; 25
   2d6d2:	28 17       	cp	r18, r24
   2d6d4:	39 07       	cpc	r19, r25
   2d6d6:	50 f0       	brcs	.+20     	; 0x2d6ec <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x3d8>
   2d6d8:	28 17       	cp	r18, r24
   2d6da:	39 07       	cpc	r19, r25
   2d6dc:	99 f4       	brne	.+38     	; 0x2d704 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x3f0>
   2d6de:	67 96       	adiw	r28, 0x17	; 23
   2d6e0:	2e ad       	ldd	r18, Y+62	; 0x3e
   2d6e2:	3f ad       	ldd	r19, Y+63	; 0x3f
   2d6e4:	67 97       	sbiw	r28, 0x17	; 23
   2d6e6:	42 17       	cp	r20, r18
   2d6e8:	53 07       	cpc	r21, r19
   2d6ea:	60 f4       	brcc	.+24     	; 0x2d704 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x3f0>
							crmodDate = p.creationDate;
   2d6ec:	90 93 e9 13 	sts	0x13E9, r25	; 0x8013e9 <card+0x14>
   2d6f0:	80 93 e8 13 	sts	0x13E8, r24	; 0x8013e8 <card+0x13>
							crmodTime = p.creationTime;
   2d6f4:	67 96       	adiw	r28, 0x17	; 23
   2d6f6:	8e ad       	ldd	r24, Y+62	; 0x3e
   2d6f8:	9f ad       	ldd	r25, Y+63	; 0x3f
   2d6fa:	67 97       	sbiw	r28, 0x17	; 23
   2d6fc:	90 93 e7 13 	sts	0x13E7, r25	; 0x8013e7 <card+0x12>
   2d700:	80 93 e6 13 	sts	0x13E6, r24	; 0x8013e6 <card+0x11>
						}
						//writeDate = p.lastAccessDate;
						if (match != NULL) {
   2d704:	61 14       	cp	r6, r1
   2d706:	71 04       	cpc	r7, r1
   2d708:	59 f1       	breq	.+86     	; 0x2d760 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x44c>
							if (strcasecmp(match, filename) == 0) return;
   2d70a:	69 ed       	ldi	r22, 0xD9	; 217
   2d70c:	73 e1       	ldi	r23, 0x13	; 19
   2d70e:	c3 01       	movw	r24, r6
   2d710:	0f 94 19 aa 	call	0x35432	; 0x35432 <strcasecmp>
   2d714:	89 2b       	or	r24, r25
   2d716:	59 f5       	brne	.+86     	; 0x2d76e <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x45a>
	// RAII incrementer for the recursionCnt
	class _incrementer
	{
		public:
		_incrementer() {recursionCnt++;}
		~_incrementer() {recursionCnt--;}
   2d718:	80 91 45 0e 	lds	r24, 0x0E45	; 0x800e45 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param)::recursionCnt>
   2d71c:	81 50       	subi	r24, 0x01	; 1
   2d71e:	80 93 45 0e 	sts	0x0E45, r24	; 0x800e45 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param)::recursionCnt>
						cnt++;
						break;
				}
			}
		} // while readDir
}
   2d722:	0f b6       	in	r0, 0x3f	; 63
   2d724:	f8 94       	cli
   2d726:	3e be       	out	0x3e, r3	; 62
   2d728:	0f be       	out	0x3f, r0	; 63
   2d72a:	2d be       	out	0x3d, r2	; 61
   2d72c:	ca 58       	subi	r28, 0x8A	; 138
   2d72e:	df 4f       	sbci	r29, 0xFF	; 255
   2d730:	0f b6       	in	r0, 0x3f	; 63
   2d732:	f8 94       	cli
   2d734:	de bf       	out	0x3e, r29	; 62
   2d736:	0f be       	out	0x3f, r0	; 63
   2d738:	cd bf       	out	0x3d, r28	; 61
   2d73a:	df 91       	pop	r29
   2d73c:	cf 91       	pop	r28
   2d73e:	1f 91       	pop	r17
   2d740:	0f 91       	pop	r16
   2d742:	ff 90       	pop	r15
   2d744:	ef 90       	pop	r14
   2d746:	df 90       	pop	r13
   2d748:	cf 90       	pop	r12
   2d74a:	bf 90       	pop	r11
   2d74c:	af 90       	pop	r10
   2d74e:	9f 90       	pop	r9
   2d750:	8f 90       	pop	r8
   2d752:	7f 90       	pop	r7
   2d754:	6f 90       	pop	r6
   2d756:	5f 90       	pop	r5
   2d758:	4f 90       	pop	r4
   2d75a:	3f 90       	pop	r3
   2d75c:	2f 90       	pop	r2
   2d75e:	08 95       	ret
						}
						//writeDate = p.lastAccessDate;
						if (match != NULL) {
							if (strcasecmp(match, filename) == 0) return;
						}
						else if (cnt == nrFiles) return;
   2d760:	80 91 ef 16 	lds	r24, 0x16EF	; 0x8016ef <card+0x31a>
   2d764:	90 91 f0 16 	lds	r25, 0x16F0	; 0x8016f0 <card+0x31b>
   2d768:	48 16       	cp	r4, r24
   2d76a:	19 06       	cpc	r1, r25
   2d76c:	a9 f2       	breq	.-86     	; 0x2d718 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x404>
						cnt++;
   2d76e:	43 94       	inc	r4
   2d770:	74 cf       	rjmp	.-280    	; 0x2d65a <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]+0x346>

0002d772 <CardReader::getfilename(unsigned int, char const*) [clone .constprop.235]>:
  }


}

void CardReader::getfilename(uint16_t nr, const char * const match/*=NULL*/)
   2d772:	cf 92       	push	r12
   2d774:	df 92       	push	r13
   2d776:	ef 92       	push	r14
   2d778:	ff 92       	push	r15
   2d77a:	0f 93       	push	r16
   2d77c:	cf 93       	push	r28
   2d77e:	df 93       	push	r29
   2d780:	cd b7       	in	r28, 0x3d	; 61
   2d782:	de b7       	in	r29, 0x3e	; 62
   2d784:	a3 97       	sbiw	r28, 0x23	; 35
   2d786:	0f b6       	in	r0, 0x3f	; 63
   2d788:	f8 94       	cli
   2d78a:	de bf       	out	0x3e, r29	; 62
   2d78c:	0f be       	out	0x3f, r0	; 63
   2d78e:	cd bf       	out	0x3d, r28	; 61
   2d790:	6c 01       	movw	r12, r24
{
  curDir=&workDir;
   2d792:	80 e8       	ldi	r24, 0x80	; 128
   2d794:	e8 2e       	mov	r14, r24
   2d796:	84 e1       	ldi	r24, 0x14	; 20
   2d798:	f8 2e       	mov	r15, r24
   2d79a:	82 e8       	ldi	r24, 0x82	; 130
   2d79c:	94 e1       	ldi	r25, 0x14	; 20
   2d79e:	d7 01       	movw	r26, r14
   2d7a0:	8d 93       	st	X+, r24
   2d7a2:	9c 93       	st	X, r25
  nrFiles=nr;
   2d7a4:	10 92 f0 16 	sts	0x16F0, r1	; 0x8016f0 <card+0x31b>
   2d7a8:	10 92 ef 16 	sts	0x16EF, r1	; 0x8016ef <card+0x31a>
  curDir->rewind();
   2d7ac:	0e 94 a6 79 	call	0xf34c	; 0xf34c <SdBaseFile::rewind()>
  };
  struct ls_param
  {
    bool LFN : 1;
    bool timestamp : 1;
    inline ls_param():LFN(0), timestamp(0) { }
   2d7b0:	00 e0       	ldi	r16, 0x00	; 0
   2d7b2:	0e 7f       	andi	r16, 0xFE	; 254
   2d7b4:	0d 7f       	andi	r16, 0xFD	; 253
  lsDive("",*curDir,match, LS_GetFilename);
   2d7b6:	d7 01       	movw	r26, r14
   2d7b8:	ed 91       	ld	r30, X+
   2d7ba:	fc 91       	ld	r31, X
   2d7bc:	83 e2       	ldi	r24, 0x23	; 35
   2d7be:	de 01       	movw	r26, r28
   2d7c0:	11 96       	adiw	r26, 0x01	; 1
   2d7c2:	01 90       	ld	r0, Z+
   2d7c4:	0d 92       	st	X+, r0
   2d7c6:	8a 95       	dec	r24
   2d7c8:	e1 f7       	brne	.-8      	; 0x2d7c2 <CardReader::getfilename(unsigned int, char const*) [clone .constprop.235]+0x50>
   2d7ca:	22 e0       	ldi	r18, 0x02	; 2
   2d7cc:	a6 01       	movw	r20, r12
   2d7ce:	be 01       	movw	r22, r28
   2d7d0:	6f 5f       	subi	r22, 0xFF	; 255
   2d7d2:	7f 4f       	sbci	r23, 0xFF	; 255
   2d7d4:	8f ed       	ldi	r24, 0xDF	; 223
   2d7d6:	92 e0       	ldi	r25, 0x02	; 2
   2d7d8:	0f 94 8a 69 	call	0x2d314	; 0x2d314 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]>
   2d7dc:	ce 01       	movw	r24, r28
   2d7de:	01 96       	adiw	r24, 0x01	; 1
   2d7e0:	0e 94 ab 79 	call	0xf356	; 0xf356 <SdBaseFile::~SdBaseFile()>

}
   2d7e4:	a3 96       	adiw	r28, 0x23	; 35
   2d7e6:	0f b6       	in	r0, 0x3f	; 63
   2d7e8:	f8 94       	cli
   2d7ea:	de bf       	out	0x3e, r29	; 62
   2d7ec:	0f be       	out	0x3f, r0	; 63
   2d7ee:	cd bf       	out	0x3d, r28	; 61
   2d7f0:	df 91       	pop	r29
   2d7f2:	cf 91       	pop	r28
   2d7f4:	0f 91       	pop	r16
   2d7f6:	ff 90       	pop	r15
   2d7f8:	ef 90       	pop	r14
   2d7fa:	df 90       	pop	r13
   2d7fc:	cf 90       	pop	r12
   2d7fe:	08 95       	ret

0002d800 <CardReader::getfilename_simple(unsigned int, char const*) [clone .constprop.233]>:

void CardReader::getfilename_simple(uint16_t entry, const char * const match/*=NULL*/)
   2d800:	ef 92       	push	r14
   2d802:	ff 92       	push	r15
   2d804:	0f 93       	push	r16
   2d806:	cf 93       	push	r28
   2d808:	df 93       	push	r29
   2d80a:	cd b7       	in	r28, 0x3d	; 61
   2d80c:	de b7       	in	r29, 0x3e	; 62
   2d80e:	a3 97       	sbiw	r28, 0x23	; 35
   2d810:	0f b6       	in	r0, 0x3f	; 63
   2d812:	f8 94       	cli
   2d814:	de bf       	out	0x3e, r29	; 62
   2d816:	0f be       	out	0x3f, r0	; 63
   2d818:	cd bf       	out	0x3d, r28	; 61
{
	curDir = &workDir;
   2d81a:	20 e8       	ldi	r18, 0x80	; 128
   2d81c:	e2 2e       	mov	r14, r18
   2d81e:	24 e1       	ldi	r18, 0x14	; 20
   2d820:	f2 2e       	mov	r15, r18
   2d822:	22 e8       	ldi	r18, 0x82	; 130
   2d824:	34 e1       	ldi	r19, 0x14	; 20
   2d826:	d7 01       	movw	r26, r14
   2d828:	2d 93       	st	X+, r18
   2d82a:	3c 93       	st	X, r19
	nrFiles = 0;
   2d82c:	10 92 f0 16 	sts	0x16F0, r1	; 0x8016f0 <card+0x31b>
   2d830:	10 92 ef 16 	sts	0x16EF, r1	; 0x8016ef <card+0x31a>
	curDir->seekSet((uint32_t)entry << 5);
   2d834:	b0 e0       	ldi	r27, 0x00	; 0
   2d836:	a0 e0       	ldi	r26, 0x00	; 0
   2d838:	ac 01       	movw	r20, r24
   2d83a:	bd 01       	movw	r22, r26
   2d83c:	e5 e0       	ldi	r30, 0x05	; 5
   2d83e:	44 0f       	add	r20, r20
   2d840:	55 1f       	adc	r21, r21
   2d842:	66 1f       	adc	r22, r22
   2d844:	77 1f       	adc	r23, r23
   2d846:	ea 95       	dec	r30
   2d848:	d1 f7       	brne	.-12     	; 0x2d83e <CardReader::getfilename_simple(unsigned int, char const*) [clone .constprop.233]+0x3e>
   2d84a:	c9 01       	movw	r24, r18
   2d84c:	0f 94 0b 2d 	call	0x25a16	; 0x25a16 <SdBaseFile::seekSet(unsigned long)>
   2d850:	00 e0       	ldi	r16, 0x00	; 0
   2d852:	0e 7f       	andi	r16, 0xFE	; 254
   2d854:	0d 7f       	andi	r16, 0xFD	; 253
	lsDive("", *curDir, match, LS_GetFilename);
   2d856:	d7 01       	movw	r26, r14
   2d858:	ed 91       	ld	r30, X+
   2d85a:	fc 91       	ld	r31, X
   2d85c:	83 e2       	ldi	r24, 0x23	; 35
   2d85e:	de 01       	movw	r26, r28
   2d860:	11 96       	adiw	r26, 0x01	; 1
   2d862:	01 90       	ld	r0, Z+
   2d864:	0d 92       	st	X+, r0
   2d866:	8a 95       	dec	r24
   2d868:	e1 f7       	brne	.-8      	; 0x2d862 <CardReader::getfilename_simple(unsigned int, char const*) [clone .constprop.233]+0x62>
   2d86a:	22 e0       	ldi	r18, 0x02	; 2
   2d86c:	50 e0       	ldi	r21, 0x00	; 0
   2d86e:	40 e0       	ldi	r20, 0x00	; 0
   2d870:	be 01       	movw	r22, r28
   2d872:	6f 5f       	subi	r22, 0xFF	; 255
   2d874:	7f 4f       	sbci	r23, 0xFF	; 255
   2d876:	8f ed       	ldi	r24, 0xDF	; 223
   2d878:	92 e0       	ldi	r25, 0x02	; 2
   2d87a:	0f 94 8a 69 	call	0x2d314	; 0x2d314 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]>
   2d87e:	ce 01       	movw	r24, r28
   2d880:	01 96       	adiw	r24, 0x01	; 1
   2d882:	0e 94 ab 79 	call	0xf356	; 0xf356 <SdBaseFile::~SdBaseFile()>
}
   2d886:	a3 96       	adiw	r28, 0x23	; 35
   2d888:	0f b6       	in	r0, 0x3f	; 63
   2d88a:	f8 94       	cli
   2d88c:	de bf       	out	0x3e, r29	; 62
   2d88e:	0f be       	out	0x3f, r0	; 63
   2d890:	cd bf       	out	0x3d, r28	; 61
   2d892:	df 91       	pop	r29
   2d894:	cf 91       	pop	r28
   2d896:	0f 91       	pop	r16
   2d898:	ff 90       	pop	r15
   2d89a:	ef 90       	pop	r14
   2d89c:	08 95       	ret

0002d89e <CardReader::getnrfilenames() [clone .constprop.236]>:
	nrFiles = 1;
	curDir->seekSet(position);
	lsDive("", *curDir, match, LS_GetFilename);
}

uint16_t CardReader::getnrfilenames()
   2d89e:	cf 92       	push	r12
   2d8a0:	df 92       	push	r13
   2d8a2:	ef 92       	push	r14
   2d8a4:	ff 92       	push	r15
   2d8a6:	0f 93       	push	r16
   2d8a8:	cf 93       	push	r28
   2d8aa:	df 93       	push	r29
   2d8ac:	cd b7       	in	r28, 0x3d	; 61
   2d8ae:	de b7       	in	r29, 0x3e	; 62
   2d8b0:	a3 97       	sbiw	r28, 0x23	; 35
   2d8b2:	0f b6       	in	r0, 0x3f	; 63
   2d8b4:	f8 94       	cli
   2d8b6:	de bf       	out	0x3e, r29	; 62
   2d8b8:	0f be       	out	0x3f, r0	; 63
   2d8ba:	cd bf       	out	0x3d, r28	; 61
{
  curDir=&workDir;
   2d8bc:	80 e8       	ldi	r24, 0x80	; 128
   2d8be:	c8 2e       	mov	r12, r24
   2d8c0:	84 e1       	ldi	r24, 0x14	; 20
   2d8c2:	d8 2e       	mov	r13, r24
   2d8c4:	82 e8       	ldi	r24, 0x82	; 130
   2d8c6:	94 e1       	ldi	r25, 0x14	; 20
   2d8c8:	d6 01       	movw	r26, r12
   2d8ca:	8d 93       	st	X+, r24
   2d8cc:	9c 93       	st	X, r25
  nrFiles=0;
   2d8ce:	2f ee       	ldi	r18, 0xEF	; 239
   2d8d0:	e2 2e       	mov	r14, r18
   2d8d2:	26 e1       	ldi	r18, 0x16	; 22
   2d8d4:	f2 2e       	mov	r15, r18
   2d8d6:	f7 01       	movw	r30, r14
   2d8d8:	11 82       	std	Z+1, r1	; 0x01
   2d8da:	10 82       	st	Z, r1
  curDir->rewind();
   2d8dc:	0e 94 a6 79 	call	0xf34c	; 0xf34c <SdBaseFile::rewind()>
   2d8e0:	00 e0       	ldi	r16, 0x00	; 0
   2d8e2:	0e 7f       	andi	r16, 0xFE	; 254
   2d8e4:	0d 7f       	andi	r16, 0xFD	; 253
  lsDive("",*curDir, NULL, LS_Count);
   2d8e6:	d6 01       	movw	r26, r12
   2d8e8:	ed 91       	ld	r30, X+
   2d8ea:	fc 91       	ld	r31, X
   2d8ec:	83 e2       	ldi	r24, 0x23	; 35
   2d8ee:	de 01       	movw	r26, r28
   2d8f0:	11 96       	adiw	r26, 0x01	; 1
   2d8f2:	01 90       	ld	r0, Z+
   2d8f4:	0d 92       	st	X+, r0
   2d8f6:	8a 95       	dec	r24
   2d8f8:	e1 f7       	brne	.-8      	; 0x2d8f2 <CardReader::getnrfilenames() [clone .constprop.236]+0x54>
   2d8fa:	21 e0       	ldi	r18, 0x01	; 1
   2d8fc:	50 e0       	ldi	r21, 0x00	; 0
   2d8fe:	40 e0       	ldi	r20, 0x00	; 0
   2d900:	be 01       	movw	r22, r28
   2d902:	6f 5f       	subi	r22, 0xFF	; 255
   2d904:	7f 4f       	sbci	r23, 0xFF	; 255
   2d906:	8f ed       	ldi	r24, 0xDF	; 223
   2d908:	92 e0       	ldi	r25, 0x02	; 2
   2d90a:	0f 94 8a 69 	call	0x2d314	; 0x2d314 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]>
   2d90e:	ce 01       	movw	r24, r28
   2d910:	01 96       	adiw	r24, 0x01	; 1
   2d912:	0e 94 ab 79 	call	0xf356	; 0xf356 <SdBaseFile::~SdBaseFile()>
  //SERIAL_ECHOLN(nrFiles);
  return nrFiles;
}
   2d916:	f7 01       	movw	r30, r14
   2d918:	80 81       	ld	r24, Z
   2d91a:	91 81       	ldd	r25, Z+1	; 0x01
   2d91c:	a3 96       	adiw	r28, 0x23	; 35
   2d91e:	0f b6       	in	r0, 0x3f	; 63
   2d920:	f8 94       	cli
   2d922:	de bf       	out	0x3e, r29	; 62
   2d924:	0f be       	out	0x3f, r0	; 63
   2d926:	cd bf       	out	0x3d, r28	; 61
   2d928:	df 91       	pop	r29
   2d92a:	cf 91       	pop	r28
   2d92c:	0f 91       	pop	r16
   2d92e:	ff 90       	pop	r15
   2d930:	ef 90       	pop	r14
   2d932:	df 90       	pop	r13
   2d934:	cf 90       	pop	r12
   2d936:	08 95       	ret

0002d938 <CardReader::printAbsFilenameFast() [clone .constprop.226]>:
    file.getFilename(t);
  else
    t[0]=0;
}

void CardReader::printAbsFilenameFast()
   2d938:	cf 93       	push	r28
   2d93a:	df 93       	push	r29
}

void MarlinSerial::print(long n, int base)
{
  if (base == 0) {
    write(n);
   2d93c:	8f e2       	ldi	r24, 0x2F	; 47
   2d93e:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
{
    SERIAL_PROTOCOL('/');
    for (uint8_t i = 0; i < getWorkDirDepth(); i++)
   2d942:	c0 e0       	ldi	r28, 0x00	; 0
    {
        SERIAL_PROTOCOL(dir_names[i]);
   2d944:	d9 e0       	ldi	r29, 0x09	; 9
}

void CardReader::printAbsFilenameFast()
{
    SERIAL_PROTOCOL('/');
    for (uint8_t i = 0; i < getWorkDirDepth(); i++)
   2d946:	80 91 77 15 	lds	r24, 0x1577	; 0x801577 <card+0x1a2>
   2d94a:	c8 17       	cp	r28, r24
   2d94c:	60 f4       	brcc	.+24     	; 0x2d966 <CardReader::printAbsFilenameFast() [clone .constprop.226]+0x2e>
    {
        SERIAL_PROTOCOL(dir_names[i]);
   2d94e:	cd 9f       	mul	r28, r29
   2d950:	c0 01       	movw	r24, r0
   2d952:	11 24       	eor	r1, r1
   2d954:	89 5d       	subi	r24, 0xD9	; 217
   2d956:	9b 4e       	sbci	r25, 0xEB	; 235
   2d958:	0e 94 95 87 	call	0x10f2a	; 0x10f2a <MarlinSerial::write(char const*)>
   2d95c:	8f e2       	ldi	r24, 0x2F	; 47
   2d95e:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
}

void CardReader::printAbsFilenameFast()
{
    SERIAL_PROTOCOL('/');
    for (uint8_t i = 0; i < getWorkDirDepth(); i++)
   2d962:	cf 5f       	subi	r28, 0xFF	; 255
   2d964:	f0 cf       	rjmp	.-32     	; 0x2d946 <CardReader::printAbsFilenameFast() [clone .constprop.226]+0xe>
    {
        SERIAL_PROTOCOL(dir_names[i]);
        SERIAL_PROTOCOL('/');
    }
    SERIAL_PROTOCOL(LONGEST_FILENAME);
   2d966:	80 91 ee 13 	lds	r24, 0x13EE	; 0x8013ee <card+0x19>
   2d96a:	81 11       	cpse	r24, r1
   2d96c:	06 c0       	rjmp	.+12     	; 0x2d97a <CardReader::printAbsFilenameFast() [clone .constprop.226]+0x42>
   2d96e:	89 ed       	ldi	r24, 0xD9	; 217
   2d970:	93 e1       	ldi	r25, 0x13	; 19
}
   2d972:	df 91       	pop	r29
   2d974:	cf 91       	pop	r28
   2d976:	0c 94 95 87 	jmp	0x10f2a	; 0x10f2a <MarlinSerial::write(char const*)>
    for (uint8_t i = 0; i < getWorkDirDepth(); i++)
    {
        SERIAL_PROTOCOL(dir_names[i]);
        SERIAL_PROTOCOL('/');
    }
    SERIAL_PROTOCOL(LONGEST_FILENAME);
   2d97a:	8e ee       	ldi	r24, 0xEE	; 238
   2d97c:	93 e1       	ldi	r25, 0x13	; 19
   2d97e:	f9 cf       	rjmp	.-14     	; 0x2d972 <CardReader::printAbsFilenameFast() [clone .constprop.226]+0x3a>

0002d980 <eeprom_add_dword(unsigned long*, unsigned long) [clone .constprop.223]>:

void __attribute__((noinline)) eeprom_add_word(uint16_t *__p, uint16_t add) {
    eeprom_write_word_notify(__p, eeprom_read_word(__p) + add);
}

void __attribute__((noinline)) eeprom_add_dword(uint32_t *__p, uint32_t add) {
   2d980:	cf 92       	push	r12
   2d982:	df 92       	push	r13
   2d984:	ef 92       	push	r14
   2d986:	ff 92       	push	r15
   2d988:	6b 01       	movw	r12, r22
   2d98a:	7c 01       	movw	r14, r24
    eeprom_write_dword_notify(__p, eeprom_read_dword(__p) + add);
   2d98c:	88 ea       	ldi	r24, 0xA8	; 168
   2d98e:	9c e0       	ldi	r25, 0x0C	; 12
   2d990:	0f 94 e8 a3 	call	0x347d0	; 0x347d0 <eeprom_read_dword>
   2d994:	ab 01       	movw	r20, r22
   2d996:	bc 01       	movw	r22, r24
   2d998:	4c 0d       	add	r20, r12
   2d99a:	5d 1d       	adc	r21, r13
   2d99c:	6e 1d       	adc	r22, r14
   2d99e:	7f 1d       	adc	r23, r15
    if (active) {
        uint32_t previous_value = eeprom_read_dword(dst);
        eeprom_dword_notify(dst, previous_value, value, true);
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_write_dword(dst, value);
   2d9a0:	88 ea       	ldi	r24, 0xA8	; 168
   2d9a2:	9c e0       	ldi	r25, 0x0C	; 12
    eeprom_write_word_notify(__p, eeprom_read_word(__p) + add);
}

void __attribute__((noinline)) eeprom_add_dword(uint32_t *__p, uint32_t add) {
    eeprom_write_dword_notify(__p, eeprom_read_dword(__p) + add);
}
   2d9a4:	ff 90       	pop	r15
   2d9a6:	ef 90       	pop	r14
   2d9a8:	df 90       	pop	r13
   2d9aa:	cf 90       	pop	r12
    if (active) {
        uint32_t previous_value = eeprom_read_dword(dst);
        eeprom_dword_notify(dst, previous_value, value, true);
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_write_dword(dst, value);
   2d9ac:	0d 94 36 a4 	jmp	0x3486c	; 0x3486c <eeprom_write_dword>

0002d9b0 <eeprom_init_default_dword(unsigned long*, unsigned long) [clone .constprop.222]>:
        return def;
    }
    return val;
}

uint32_t __attribute__((noinline)) eeprom_init_default_dword(uint32_t *__p, uint32_t def) {
   2d9b0:	cf 93       	push	r28
   2d9b2:	df 93       	push	r29
   2d9b4:	ec 01       	movw	r28, r24
    uint32_t val = eeprom_read_dword(__p);
   2d9b6:	0f 94 e8 a3 	call	0x347d0	; 0x347d0 <eeprom_read_dword>
    if (val == EEPROM_EMPTY_VALUE32) {
   2d9ba:	6f 3f       	cpi	r22, 0xFF	; 255
   2d9bc:	2f ef       	ldi	r18, 0xFF	; 255
   2d9be:	72 07       	cpc	r23, r18
   2d9c0:	82 07       	cpc	r24, r18
   2d9c2:	92 07       	cpc	r25, r18
   2d9c4:	49 f4       	brne	.+18     	; 0x2d9d8 <eeprom_init_default_dword(unsigned long*, unsigned long) [clone .constprop.222]+0x28>
    if (active) {
        uint32_t previous_value = eeprom_read_dword(dst);
        eeprom_dword_notify(dst, previous_value, value, true);
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_write_dword(dst, value);
   2d9c6:	40 e0       	ldi	r20, 0x00	; 0
   2d9c8:	50 e0       	ldi	r21, 0x00	; 0
   2d9ca:	ba 01       	movw	r22, r20
   2d9cc:	ce 01       	movw	r24, r28
   2d9ce:	0f 94 36 a4 	call	0x3486c	; 0x3486c <eeprom_write_dword>

uint32_t __attribute__((noinline)) eeprom_init_default_dword(uint32_t *__p, uint32_t def) {
    uint32_t val = eeprom_read_dword(__p);
    if (val == EEPROM_EMPTY_VALUE32) {
        eeprom_write_dword_notify(__p, def);
        return def;
   2d9d2:	60 e0       	ldi	r22, 0x00	; 0
   2d9d4:	70 e0       	ldi	r23, 0x00	; 0
   2d9d6:	cb 01       	movw	r24, r22
    }
    return val;
}
   2d9d8:	df 91       	pop	r29
   2d9da:	cf 91       	pop	r28
   2d9dc:	08 95       	ret

0002d9de <SdFile::readFilteredGcode() [clone .constprop.218]>:
: "z" (startP)   /* input of the ASM code - in our case the Z register as well (R30:R31) */ \
: "r22"          /* modifying register R22 - so that the compiler knows */ \
)

// avoid calling the default heavy-weight read() for just one byte
int16_t SdFile::readFilteredGcode(){
   2d9de:	0f 93       	push	r16
   2d9e0:	1f 93       	push	r17
   2d9e2:	cf 93       	push	r28
   2d9e4:	df 93       	push	r29
    if( ! gfEnsureBlock() ){
   2d9e6:	0f 94 c8 5a 	call	0x2b590	; 0x2b590 <SdFile::gfEnsureBlock() [clone .constprop.219]>
   2d9ea:	88 23       	and	r24, r24
   2d9ec:	39 f1       	breq	.+78     	; 0x2da3c <cycle+0x3a>
        goto eof_or_fail; // this is unfortunate :( ... other calls are using the cache and we can loose the data block of our gcode file
    }
    // assume, we have the 512B block cache filled and terminated with a '\n'
    {
    const uint8_t *start = gfReadPtr;
   2d9ee:	20 91 82 16 	lds	r18, 0x1682	; 0x801682 <card+0x2ad>
   2d9f2:	30 91 83 16 	lds	r19, 0x1683	; 0x801683 <card+0x2ae>
    // to gfReadPtr within this method, because it is a class member variable.
    // The compiler cannot see, if omitting read/write won't have any incorrect side-effects to the rest of the whole FW.
    // So this trick explicitly states, that rdPtr is a local variable limited to the scope of this method,
    // therefore the compiler can omit read/write to it (keep it in registers!) as it sees fit.
    // And it does! Codesize dropped by 68B!
    const uint8_t *rdPtr = gfReadPtr;
   2d9f6:	e9 01       	movw	r28, r18
    if( ! gfEnsureBlock() ){
        goto eof_or_fail; // this is unfortunate :( ... other calls are using the cache and we can loose the data block of our gcode file
    }
    // assume, we have the 512B block cache filled and terminated with a '\n'
    {
    const uint8_t *start = gfReadPtr;
   2d9f8:	1b ef       	ldi	r17, 0xFB	; 251

    // the same applies to gfXBegin, codesize dropped another 100B!
    const uint8_t *blockBuffBegin = gfBlockBuffBegin();

    uint8_t consecutiveCommentLines = 0;
    while( *rdPtr == ';' ){
   2d9fa:	88 81       	ld	r24, Y
   2d9fc:	8b 33       	cpi	r24, 0x3B	; 59
   2d9fe:	51 f5       	brne	.+84     	; 0x2da54 <cycle+0x52>
            //   11c68:	brne	.-12     	; 0x11c5e <get_command()+0x524>

            // Still, even that was suboptimal as the compiler seems not to understand the usage of ld r22, Z+ (the plus is important)
            // aka automatic increment of the Z register (R30:R31 pair)
            // There is no other way than pure ASM!
            find_endl(rdPtr, rdPtr);
   2da00:	fe 01       	movw	r30, r28

0002da02 <cycle>:
   2da02:	61 91       	ld	r22, Z+
   2da04:	6a 30       	cpi	r22, 0x0A	; 10
   2da06:	e9 f7       	brne	.-6      	; 0x2da02 <cycle>
   2da08:	ef 01       	movw	r28, r30

            // found a newline, prepare the next block if block cache end reached
            if( rdPtr - blockBuffBegin > 512 ){
   2da0a:	cf 01       	movw	r24, r30
   2da0c:	86 54       	subi	r24, 0x46	; 70
   2da0e:	9e 40       	sbci	r25, 0x0E	; 14
   2da10:	81 30       	cpi	r24, 0x01	; 1
   2da12:	92 40       	sbci	r25, 0x02	; 2
   2da14:	e4 f0       	brlt	.+56     	; 0x2da4e <cycle+0x4c>
                // at the end of block cache, fill new data in
                gfUpdateCurrentPosition( rdPtr - start - 1 );
   2da16:	ce 01       	movw	r24, r28
   2da18:	82 1b       	sub	r24, r18
   2da1a:	93 0b       	sbc	r25, r19
   2da1c:	01 97       	sbiw	r24, 0x01	; 1
   2da1e:	0f 94 a4 55 	call	0x2ab48	; 0x2ab48 <SdFile::gfUpdateCurrentPosition(unsigned int) [clone .constprop.221]>
                if( ! gfComputeNextFileBlock() )goto eof_or_fail;
   2da22:	87 e6       	ldi	r24, 0x67	; 103
   2da24:	96 e1       	ldi	r25, 0x16	; 22
   2da26:	0f 94 92 2c 	call	0x25924	; 0x25924 <SdFile::gfComputeNextFileBlock()>
   2da2a:	88 23       	and	r24, r24
   2da2c:	39 f0       	breq	.+14     	; 0x2da3c <cycle+0x3a>
                if( ! gfEnsureBlock() )goto eof_or_fail; // fetch it into RAM
   2da2e:	0f 94 c8 5a 	call	0x2b590	; 0x2b590 <SdFile::gfEnsureBlock() [clone .constprop.219]>
                rdPtr = start = blockBuffBegin;
   2da32:	26 e4       	ldi	r18, 0x46	; 70
   2da34:	3e e0       	ldi	r19, 0x0E	; 14
   2da36:	e9 01       	movw	r28, r18
            // found a newline, prepare the next block if block cache end reached
            if( rdPtr - blockBuffBegin > 512 ){
                // at the end of block cache, fill new data in
                gfUpdateCurrentPosition( rdPtr - start - 1 );
                if( ! gfComputeNextFileBlock() )goto eof_or_fail;
                if( ! gfEnsureBlock() )goto eof_or_fail; // fetch it into RAM
   2da38:	81 11       	cpse	r24, r1
   2da3a:	e2 cf       	rjmp	.-60     	; 0x2da00 <SdFile::readFilteredGcode() [clone .constprop.218]+0x22>

}

eof_or_fail:
    // make the rdptr point to a safe location - end of file
    gfReadPtr = gfBlockBuffBegin() + 512;
   2da3c:	86 e4       	ldi	r24, 0x46	; 70
   2da3e:	90 e1       	ldi	r25, 0x10	; 16
   2da40:	90 93 83 16 	sts	0x1683, r25	; 0x801683 <card+0x2ae>
   2da44:	80 93 82 16 	sts	0x1682, r24	; 0x801682 <card+0x2ad>
    return -1;
   2da48:	cf ef       	ldi	r28, 0xFF	; 255
   2da4a:	df ef       	ldi	r29, 0xFF	; 255
   2da4c:	34 c0       	rjmp	.+104    	; 0x2dab6 <cycle+0xb4>
   2da4e:	11 50       	subi	r17, 0x01	; 1
                gfUpdateCurrentPosition( rdPtr - start - 1 );
                if( ! gfComputeNextFileBlock() )goto eof_or_fail;
                if( ! gfEnsureBlock() )goto eof_or_fail; // fetch it into RAM
                rdPtr = start = blockBuffBegin;
            } else {
                if(consecutiveCommentLines >= 250){
   2da50:	c1 f5       	brne	.+112    	; 0x2dac2 <cycle+0xc0>
                // peek the next byte - we are inside the block at least at 511th index - still safe
                if( *rdPtr == ';' ){
                    // consecutive comment
                    ++consecutiveCommentLines;
                } else {
                    --rdPtr; // unget the already consumed newline
   2da52:	21 97       	sbiw	r28, 0x01	; 1
            }
        }
    }
emit_char:
    {
        gfUpdateCurrentPosition( rdPtr - start + 1 );
   2da54:	ce 01       	movw	r24, r28
   2da56:	82 1b       	sub	r24, r18
   2da58:	93 0b       	sbc	r25, r19
   2da5a:	01 96       	adiw	r24, 0x01	; 1
   2da5c:	0f 94 a4 55 	call	0x2ab48	; 0x2ab48 <SdFile::gfUpdateCurrentPosition(unsigned int) [clone .constprop.221]>
        int16_t rv = *rdPtr++;
   2da60:	ce 01       	movw	r24, r28
   2da62:	01 96       	adiw	r24, 0x01	; 1
   2da64:	c8 81       	ld	r28, Y
   2da66:	d0 e0       	ldi	r29, 0x00	; 0

        if( curPosition_ >= fileSize_ ){
   2da68:	00 91 6f 16 	lds	r16, 0x166F	; 0x80166f <card+0x29a>
   2da6c:	10 91 70 16 	lds	r17, 0x1670	; 0x801670 <card+0x29b>
   2da70:	20 91 71 16 	lds	r18, 0x1671	; 0x801671 <card+0x29c>
   2da74:	30 91 72 16 	lds	r19, 0x1672	; 0x801672 <card+0x29d>
   2da78:	40 91 78 16 	lds	r20, 0x1678	; 0x801678 <card+0x2a3>
   2da7c:	50 91 79 16 	lds	r21, 0x1679	; 0x801679 <card+0x2a4>
   2da80:	60 91 7a 16 	lds	r22, 0x167A	; 0x80167a <card+0x2a5>
   2da84:	70 91 7b 16 	lds	r23, 0x167B	; 0x80167b <card+0x2a6>
   2da88:	04 17       	cp	r16, r20
   2da8a:	15 07       	cpc	r17, r21
   2da8c:	26 07       	cpc	r18, r22
   2da8e:	37 07       	cpc	r19, r23
   2da90:	a8 f6       	brcc	.-86     	; 0x2da3c <cycle+0x3a>
            // past the end of file
            goto eof_or_fail;
        } else if( rdPtr - blockBuffBegin >= 512 ){
   2da92:	9c 01       	movw	r18, r24
   2da94:	26 54       	subi	r18, 0x46	; 70
   2da96:	3e 40       	sbci	r19, 0x0E	; 14
   2da98:	21 15       	cp	r18, r1
   2da9a:	32 40       	sbci	r19, 0x02	; 2
   2da9c:	44 f0       	brlt	.+16     	; 0x2daae <cycle+0xac>
            // past the end of current bufferred block - prepare the next one...
            if( ! gfComputeNextFileBlock() )goto eof_or_fail;
   2da9e:	87 e6       	ldi	r24, 0x67	; 103
   2daa0:	96 e1       	ldi	r25, 0x16	; 22
   2daa2:	0f 94 92 2c 	call	0x25924	; 0x25924 <SdFile::gfComputeNextFileBlock()>
   2daa6:	88 23       	and	r24, r24
   2daa8:	49 f2       	breq	.-110    	; 0x2da3c <cycle+0x3a>
            // don't need to force fetch the block here, it will get loaded on the next call
            rdPtr = blockBuffBegin;
   2daaa:	86 e4       	ldi	r24, 0x46	; 70
   2daac:	9e e0       	ldi	r25, 0x0E	; 14
        }

        // save the current read ptr for the next run
        gfReadPtr = rdPtr;
   2daae:	90 93 83 16 	sts	0x1683, r25	; 0x801683 <card+0x2ae>
   2dab2:	80 93 82 16 	sts	0x1682, r24	; 0x801682 <card+0x2ad>

eof_or_fail:
    // make the rdptr point to a safe location - end of file
    gfReadPtr = gfBlockBuffBegin() + 512;
    return -1;
}
   2dab6:	ce 01       	movw	r24, r28
   2dab8:	df 91       	pop	r29
   2daba:	cf 91       	pop	r28
   2dabc:	1f 91       	pop	r17
   2dabe:	0f 91       	pop	r16
   2dac0:	08 95       	ret
                if(consecutiveCommentLines >= 250){
                    --rdPtr; // unget the already consumed newline
                    goto emit_char;
                }
                // peek the next byte - we are inside the block at least at 511th index - still safe
                if( *rdPtr == ';' ){
   2dac2:	88 81       	ld	r24, Y
   2dac4:	8b 33       	cpi	r24, 0x3B	; 59
   2dac6:	09 f4       	brne	.+2      	; 0x2daca <cycle+0xc8>
   2dac8:	98 cf       	rjmp	.-208    	; 0x2d9fa <SdFile::readFilteredGcode() [clone .constprop.218]+0x1c>
   2daca:	c3 cf       	rjmp	.-122    	; 0x2da52 <cycle+0x50>

0002dacc <twi_start(unsigned char, unsigned char) [clone .constprop.215]>:
  }
  return 0;
}


static uint8_t twi_start(uint8_t address, uint8_t reg)
   2dacc:	cf 93       	push	r28
   2dace:	df 93       	push	r29
   2dad0:	d8 2f       	mov	r29, r24
{
  // send start condition
  TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTA);
   2dad2:	84 ea       	ldi	r24, 0xA4	; 164
   2dad4:	80 93 bc 00 	sts	0x00BC, r24	; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc>
  if(twi_wait(TW_START))
   2dad8:	88 e0       	ldi	r24, 0x08	; 8
   2dada:	0f 94 5a 0e 	call	0x21cb4	; 0x21cb4 <twi_wait(unsigned char) [clone .lto_priv.368]>
   2dade:	81 11       	cpse	r24, r1
   2dae0:	16 c0       	rjmp	.+44     	; 0x2db0e <twi_start(unsigned char, unsigned char) [clone .constprop.215]+0x42>
      return 1;

  // send address
  TWDR = TW_WRITE | (address << 1);
   2dae2:	8a ee       	ldi	r24, 0xEA	; 234
   2dae4:	80 93 bb 00 	sts	0x00BB, r24	; 0x8000bb <__TEXT_REGION_LENGTH__+0x7c20bb>
  TWCR = _BV(TWEN) | _BV(TWINT);
   2dae8:	c4 e8       	ldi	r28, 0x84	; 132
   2daea:	c0 93 bc 00 	sts	0x00BC, r28	; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc>
  if(twi_wait(TW_MT_SLA_ACK))
   2daee:	88 e1       	ldi	r24, 0x18	; 24
   2daf0:	0f 94 5a 0e 	call	0x21cb4	; 0x21cb4 <twi_wait(unsigned char) [clone .lto_priv.368]>
   2daf4:	81 11       	cpse	r24, r1
   2daf6:	0f c0       	rjmp	.+30     	; 0x2db16 <twi_start(unsigned char, unsigned char) [clone .constprop.215]+0x4a>
      return 2;

  // send register
  TWDR = reg;
   2daf8:	d0 93 bb 00 	sts	0x00BB, r29	; 0x8000bb <__TEXT_REGION_LENGTH__+0x7c20bb>
  TWCR = _BV(TWEN) | _BV(TWINT);
   2dafc:	c0 93 bc 00 	sts	0x00BC, r28	; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc>
  if(twi_wait(TW_MT_DATA_ACK))
   2db00:	88 e2       	ldi	r24, 0x28	; 40
   2db02:	0f 94 5a 0e 	call	0x21cb4	; 0x21cb4 <twi_wait(unsigned char) [clone .lto_priv.368]>
   2db06:	88 23       	and	r24, r24
   2db08:	19 f0       	breq	.+6      	; 0x2db10 <twi_start(unsigned char, unsigned char) [clone .constprop.215]+0x44>
      return 3;
   2db0a:	83 e0       	ldi	r24, 0x03	; 3
   2db0c:	01 c0       	rjmp	.+2      	; 0x2db10 <twi_start(unsigned char, unsigned char) [clone .constprop.215]+0x44>
static uint8_t twi_start(uint8_t address, uint8_t reg)
{
  // send start condition
  TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTA);
  if(twi_wait(TW_START))
      return 1;
   2db0e:	81 e0       	ldi	r24, 0x01	; 1
  TWCR = _BV(TWEN) | _BV(TWINT);
  if(twi_wait(TW_MT_DATA_ACK))
      return 3;

  return 0;
}
   2db10:	df 91       	pop	r29
   2db12:	cf 91       	pop	r28
   2db14:	08 95       	ret

  // send address
  TWDR = TW_WRITE | (address << 1);
  TWCR = _BV(TWEN) | _BV(TWINT);
  if(twi_wait(TW_MT_SLA_ACK))
      return 2;
   2db16:	82 e0       	ldi	r24, 0x02	; 2
   2db18:	fb cf       	rjmp	.-10     	; 0x2db10 <twi_start(unsigned char, unsigned char) [clone .constprop.215]+0x44>

0002db1a <PAT9125_sensor::resetStepCount() [clone .constprop.210]>:
    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { ret = stepCount; }
    return ret;
}

void PAT9125_sensor::resetStepCount() {
    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { stepCount = 0; }
   2db1a:	8f b7       	in	r24, 0x3f	; 63
    return 1;
}

static __inline__ uint8_t __iCliRetVal(void)
{
    cli();
   2db1c:	f8 94       	cli
   2db1e:	10 92 03 17 	sts	0x1703, r1	; 0x801703 <fsensor+0x12>
   2db22:	10 92 02 17 	sts	0x1702, r1	; 0x801702 <fsensor+0x11>
    (void)__s;
}

static __inline__ void __iRestore(const  uint8_t *__s)
{
    SREG = *__s;
   2db26:	8f bf       	out	0x3f, r24	; 63
}
   2db28:	08 95       	ret

0002db2a <PAT9125_sensor::settings_init() [clone .constprop.207]>:
        eeprom_update_byte_notify((uint8_t *)EEPROM_FSENSOR_ACTION_NA, (uint8_t)state);
    }
}

void Filament_sensor::settings_init_common() {
    bool enabled = eeprom_read_byte((uint8_t *)EEPROM_FSENSOR);
   2db2a:	87 e6       	ldi	r24, 0x67	; 103
   2db2c:	9f e0       	ldi	r25, 0x0F	; 15
   2db2e:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   2db32:	91 e0       	ldi	r25, 0x01	; 1
   2db34:	81 11       	cpse	r24, r1
   2db36:	01 c0       	rjmp	.+2      	; 0x2db3a <PAT9125_sensor::settings_init() [clone .constprop.207]+0x10>
   2db38:	90 e0       	ldi	r25, 0x00	; 0
    if ((state != State::disabled) != enabled) {
   2db3a:	81 e0       	ldi	r24, 0x01	; 1
   2db3c:	20 91 f1 16 	lds	r18, 0x16F1	; 0x8016f1 <fsensor>
   2db40:	21 11       	cpse	r18, r1
   2db42:	01 c0       	rjmp	.+2      	; 0x2db46 <PAT9125_sensor::settings_init() [clone .constprop.207]+0x1c>
   2db44:	80 e0       	ldi	r24, 0x00	; 0
   2db46:	98 13       	cpse	r25, r24
        state = enabled ? State::initializing : State::disabled;
   2db48:	90 93 f1 16 	sts	0x16F1, r25	; 0x8016f1 <fsensor>
    }

    autoLoadEnabled = eeprom_read_byte((uint8_t *)EEPROM_FSENS_AUTOLOAD_ENABLED);
   2db4c:	87 e0       	ldi	r24, 0x07	; 7
   2db4e:	9f e0       	ldi	r25, 0x0F	; 15
   2db50:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   2db54:	91 e0       	ldi	r25, 0x01	; 1
   2db56:	81 11       	cpse	r24, r1
   2db58:	01 c0       	rjmp	.+2      	; 0x2db5c <PAT9125_sensor::settings_init() [clone .constprop.207]+0x32>
   2db5a:	90 e0       	ldi	r25, 0x00	; 0
   2db5c:	90 93 f2 16 	sts	0x16F2, r25	; 0x8016f2 <fsensor+0x1>
    runoutEnabled = eeprom_read_byte((uint8_t *)EEPROM_FSENS_RUNOUT_ENABLED);
   2db60:	85 ed       	ldi	r24, 0xD5	; 213
   2db62:	9e e0       	ldi	r25, 0x0E	; 14
   2db64:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   2db68:	91 e0       	ldi	r25, 0x01	; 1
   2db6a:	81 11       	cpse	r24, r1
   2db6c:	01 c0       	rjmp	.+2      	; 0x2db70 <PAT9125_sensor::settings_init() [clone .constprop.207]+0x46>
   2db6e:	90 e0       	ldi	r25, 0x00	; 0
   2db70:	90 93 f3 16 	sts	0x16F3, r25	; 0x8016f3 <fsensor+0x2>
    sensorActionOnError = (SensorActionOnError)eeprom_read_byte((uint8_t *)EEPROM_FSENSOR_ACTION_NA);
   2db74:	87 e4       	ldi	r24, 0x47	; 71
   2db76:	9d e0       	ldi	r25, 0x0D	; 13
   2db78:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
    if (sensorActionOnError == SensorActionOnError::_Undef) {
   2db7c:	8f 3f       	cpi	r24, 0xFF	; 255
   2db7e:	c9 f0       	breq	.+50     	; 0x2dbb2 <PAT9125_sensor::settings_init() [clone .constprop.207]+0x88>
        state = enabled ? State::initializing : State::disabled;
    }

    autoLoadEnabled = eeprom_read_byte((uint8_t *)EEPROM_FSENS_AUTOLOAD_ENABLED);
    runoutEnabled = eeprom_read_byte((uint8_t *)EEPROM_FSENS_RUNOUT_ENABLED);
    sensorActionOnError = (SensorActionOnError)eeprom_read_byte((uint8_t *)EEPROM_FSENSOR_ACTION_NA);
   2db80:	80 93 f9 16 	sts	0x16F9, r24	; 0x8016f9 <fsensor+0x8>
}

void PAT9125_sensor::settings_init() {
//    puts_P(PSTR("settings_init"));
    Filament_sensor::settings_init_common();
    setJamDetectionEnabled(eeprom_read_byte((uint8_t *)EEPROM_FSENSOR_JAM_DETECTION));
   2db84:	8d ea       	ldi	r24, 0xAD	; 173
   2db86:	9c e0       	ldi	r25, 0x0C	; 12
   2db88:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   2db8c:	91 e0       	ldi	r25, 0x01	; 1
   2db8e:	81 11       	cpse	r24, r1
   2db90:	01 c0       	rjmp	.+2      	; 0x2db94 <PAT9125_sensor::settings_init() [clone .constprop.207]+0x6a>
   2db92:	90 e0       	ldi	r25, 0x00	; 0
    return fsensorDetected;
}
#endif

void PAT9125_sensor::setJamDetectionEnabled(bool state, bool updateEEPROM) {
    jamDetection = state;
   2db94:	90 93 ff 16 	sts	0x16FF, r25	; 0x8016ff <fsensor+0xe>
    oldPos = pat9125_y;
   2db98:	80 91 38 0e 	lds	r24, 0x0E38	; 0x800e38 <pat9125_y>
   2db9c:	90 91 39 0e 	lds	r25, 0x0E39	; 0x800e39 <pat9125_y+0x1>
   2dba0:	90 93 01 17 	sts	0x1701, r25	; 0x801701 <fsensor+0x10>
   2dba4:	80 93 00 17 	sts	0x1700, r24	; 0x801700 <fsensor+0xf>
    resetStepCount();
   2dba8:	0f 94 8d 6d 	call	0x2db1a	; 0x2db1a <PAT9125_sensor::resetStepCount() [clone .constprop.210]>
    jamErrCnt = 0;
   2dbac:	10 92 06 17 	sts	0x1706, r1	; 0x801706 <fsensor+0x15>

void PAT9125_sensor::settings_init() {
//    puts_P(PSTR("settings_init"));
    Filament_sensor::settings_init_common();
    setJamDetectionEnabled(eeprom_read_byte((uint8_t *)EEPROM_FSENSOR_JAM_DETECTION));
}
   2dbb0:	08 95       	ret

    autoLoadEnabled = eeprom_read_byte((uint8_t *)EEPROM_FSENS_AUTOLOAD_ENABLED);
    runoutEnabled = eeprom_read_byte((uint8_t *)EEPROM_FSENS_RUNOUT_ENABLED);
    sensorActionOnError = (SensorActionOnError)eeprom_read_byte((uint8_t *)EEPROM_FSENSOR_ACTION_NA);
    if (sensorActionOnError == SensorActionOnError::_Undef) {
        sensorActionOnError = SensorActionOnError::_Continue;
   2dbb2:	10 92 f9 16 	sts	0x16F9, r1	; 0x8016f9 <fsensor+0x8>
   2dbb6:	e6 cf       	rjmp	.-52     	; 0x2db84 <PAT9125_sensor::settings_init() [clone .constprop.207]+0x5a>

0002dbb8 <PAT9125_sensor::init() [clone .constprop.206]>:
#endif //(FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
#endif //(FILAMENT_SENSOR_TYPE == FSENSOR_IR) || (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)

#if (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
void PAT9125_sensor::init() {
    if (state == State::error) {
   2dbb8:	80 91 f1 16 	lds	r24, 0x16F1	; 0x8016f1 <fsensor>
   2dbbc:	83 30       	cpi	r24, 0x03	; 3
   2dbbe:	21 f4       	brne	.+8      	; 0x2dbc8 <PAT9125_sensor::init() [clone .constprop.206]+0x10>
}

void PAT9125_sensor::deinit() {
//    puts_P(PSTR("fsensor::deinit()"));
    ; //
    state = State::disabled;
   2dbc0:	10 92 f1 16 	sts	0x16F1, r1	; 0x8016f1 <fsensor>
    filter = 0;
   2dbc4:	10 92 fd 16 	sts	0x16FD, r1	; 0x8016fd <fsensor+0xc>
    if (state == State::error) {
        deinit(); // deinit first if there was an error.
    }
//    puts_P(PSTR("fsensor::init()"));

    settings_init(); // also sets the state to State::initializing
   2dbc8:	0f 94 95 6d 	call	0x2db2a	; 0x2db2a <PAT9125_sensor::settings_init() [clone .constprop.207]>
    int16_t stepCount;
    int16_t chunkSteps;
    uint8_t jamErrCnt;

    constexpr void calcChunkSteps(float u) {
        chunkSteps = (int16_t)(1.25 * u); //[mm]
   2dbcc:	20 e0       	ldi	r18, 0x00	; 0
   2dbce:	30 e0       	ldi	r19, 0x00	; 0
   2dbd0:	40 ea       	ldi	r20, 0xA0	; 160
   2dbd2:	5f e3       	ldi	r21, 0x3F	; 63
   2dbd4:	60 91 77 0d 	lds	r22, 0x0D77	; 0x800d77 <cs+0x10>
   2dbd8:	70 91 78 0d 	lds	r23, 0x0D78	; 0x800d78 <cs+0x11>
   2dbdc:	80 91 79 0d 	lds	r24, 0x0D79	; 0x800d79 <cs+0x12>
   2dbe0:	90 91 7a 0d 	lds	r25, 0x0D7A	; 0x800d7a <cs+0x13>
   2dbe4:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2dbe8:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   2dbec:	70 93 05 17 	sts	0x1705, r23	; 0x801705 <fsensor+0x14>
   2dbf0:	60 93 04 17 	sts	0x1704, r22	; 0x801704 <fsensor+0x13>


void twi_init(void)
{
  // activate internal pullups for SDA
  SET_INPUT(SDA_PIN);
   2dbf4:	51 98       	cbi	0x0a, 1	; 10
  WRITE(SDA_PIN, 1);
   2dbf6:	59 9a       	sbi	0x0b, 1	; 11

  // start with the SDA pulled low
  WRITE(SCL_PIN, 0);
   2dbf8:	58 98       	cbi	0x0b, 0	; 11
  SET_OUTPUT(SCL_PIN);
   2dbfa:	50 9a       	sbi	0x0a, 0	; 10
   2dbfc:	8a e0       	ldi	r24, 0x0A	; 10

  // clock 10 cycles to make sure that the sensor is not stuck in a register read.
  for (uint8_t i = 0; i < 10; i++) {
    WRITE(SCL_PIN, 1);
   2dbfe:	58 9a       	sbi	0x0b, 0	; 11
	#else
		//round up by default
		__ticks_dc = (uint32_t)(ceil(fabs(__tmp)));
	#endif

	__builtin_avr_delay_cycles(__ticks_dc);
   2dc00:	95 e0       	ldi	r25, 0x05	; 5
   2dc02:	9a 95       	dec	r25
   2dc04:	f1 f7       	brne	.-4      	; 0x2dc02 <PAT9125_sensor::init() [clone .constprop.206]+0x4a>
   2dc06:	00 00       	nop
    _delay_us((1000000 / TWI_FREQ) / 2);
    WRITE(SCL_PIN, 0);
   2dc08:	58 98       	cbi	0x0b, 0	; 11
   2dc0a:	95 e0       	ldi	r25, 0x05	; 5
   2dc0c:	9a 95       	dec	r25
   2dc0e:	f1 f7       	brne	.-4      	; 0x2dc0c <PAT9125_sensor::init() [clone .constprop.206]+0x54>
   2dc10:	00 00       	nop
   2dc12:	81 50       	subi	r24, 0x01	; 1
  // start with the SDA pulled low
  WRITE(SCL_PIN, 0);
  SET_OUTPUT(SCL_PIN);

  // clock 10 cycles to make sure that the sensor is not stuck in a register read.
  for (uint8_t i = 0; i < 10; i++) {
   2dc14:	a1 f7       	brne	.-24     	; 0x2dbfe <PAT9125_sensor::init() [clone .constprop.206]+0x46>
    WRITE(SCL_PIN, 0);
    _delay_us((1000000 / TWI_FREQ) / 2);
  }

  // activate internal pullups for SCL
  SET_INPUT(SCL_PIN);
   2dc16:	50 98       	cbi	0x0a, 0	; 10
  WRITE(SCL_PIN, 1);
   2dc18:	58 9a       	sbi	0x0b, 0	; 11

  // initialize twi prescaler and bit rate
  TWSR &= ~(_BV(TWPS0) | _BV(TWPS1));
   2dc1a:	80 91 b9 00 	lds	r24, 0x00B9	; 0x8000b9 <__TEXT_REGION_LENGTH__+0x7c20b9>
   2dc1e:	8c 7f       	andi	r24, 0xFC	; 252
   2dc20:	80 93 b9 00 	sts	0x00B9, r24	; 0x8000b9 <__TEXT_REGION_LENGTH__+0x7c20b9>
  TWBR = ((F_CPU / TWI_FREQ) - 16) / 2;
   2dc24:	8c e0       	ldi	r24, 0x0C	; 12
   2dc26:	80 93 b8 00 	sts	0x00B8, r24	; 0x8000b8 <__TEXT_REGION_LENGTH__+0x7c20b8>


uint8_t twi_check(uint8_t address)
{
    // send start condition
    TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTA);
   2dc2a:	84 ea       	ldi	r24, 0xA4	; 164
   2dc2c:	80 93 bc 00 	sts	0x00BC, r24	; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc>
    if(twi_wait(TW_START))
   2dc30:	88 e0       	ldi	r24, 0x08	; 8
   2dc32:	0f 94 5a 0e 	call	0x21cb4	; 0x21cb4 <twi_wait(unsigned char) [clone .lto_priv.368]>
   2dc36:	81 11       	cpse	r24, r1
   2dc38:	67 c0       	rjmp	.+206    	; 0x2dd08 <PAT9125_sensor::init() [clone .constprop.206]+0x150>
        return 1;

      // send address
    TWDR = TW_WRITE | (address << 1);
   2dc3a:	8a ee       	ldi	r24, 0xEA	; 234
   2dc3c:	80 93 bb 00 	sts	0x00BB, r24	; 0x8000bb <__TEXT_REGION_LENGTH__+0x7c20bb>
    TWCR = _BV(TWEN) | _BV(TWINT);
   2dc40:	84 e8       	ldi	r24, 0x84	; 132
   2dc42:	80 93 bc 00 	sts	0x00BC, r24	; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc>
    if(twi_wait(TW_MT_SLA_ACK))
   2dc46:	88 e1       	ldi	r24, 0x18	; 24
   2dc48:	0f 94 5a 0e 	call	0x21cb4	; 0x21cb4 <twi_wait(unsigned char) [clone .lto_priv.368]>
   2dc4c:	81 11       	cpse	r24, r1
   2dc4e:	5c c0       	rjmp	.+184    	; 0x2dd08 <PAT9125_sensor::init() [clone .constprop.206]+0x150>
}


static void twi_stop()
{
  TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTO);
   2dc50:	84 e9       	ldi	r24, 0x94	; 148
   2dc52:	80 93 bc 00 	sts	0x00BC, r24	; 0x8000bc <__TEXT_REGION_LENGTH__+0x7c20bc>
{
	if (!pat9125_probe())
		return 0;

// Switch to bank0, not allowed to perform pat9125_wr_reg_verify on this register.
	pat9125_wr_reg(PAT9125_BANK_SELECTION, 0);
   2dc56:	60 e0       	ldi	r22, 0x00	; 0
   2dc58:	8f e7       	ldi	r24, 0x7F	; 127
   2dc5a:	0f 94 46 4f 	call	0x29e8c	; 0x29e8c <pat9125_wr_reg(unsigned char, unsigned char) [clone .lto_priv.370]>

	// Verify that the sensor responds with its correct product ID.
	pat9125_PID1 = pat9125_rd_reg(PAT9125_PID1);
   2dc5e:	80 e0       	ldi	r24, 0x00	; 0
   2dc60:	0f 94 61 4f 	call	0x29ec2	; 0x29ec2 <pat9125_rd_reg(unsigned char) [clone .lto_priv.369]>
   2dc64:	80 93 66 0d 	sts	0x0D66, r24	; 0x800d66 <pat9125_PID1>
	pat9125_PID2 = pat9125_rd_reg(PAT9125_PID2);
   2dc68:	81 e0       	ldi	r24, 0x01	; 1
   2dc6a:	0f 94 61 4f 	call	0x29ec2	; 0x29ec2 <pat9125_rd_reg(unsigned char) [clone .lto_priv.369]>
   2dc6e:	80 93 65 0d 	sts	0x0D65, r24	; 0x800d65 <pat9125_PID2>
	if ((pat9125_PID1 != 0x31) || (pat9125_PID2 != 0x91))
   2dc72:	90 91 66 0d 	lds	r25, 0x0D66	; 0x800d66 <pat9125_PID1>
   2dc76:	91 33       	cpi	r25, 0x31	; 49
   2dc78:	b1 f5       	brne	.+108    	; 0x2dce6 <PAT9125_sensor::init() [clone .constprop.206]+0x12e>
   2dc7a:	81 39       	cpi	r24, 0x91	; 145
   2dc7c:	a1 f5       	brne	.+104    	; 0x2dce6 <PAT9125_sensor::init() [clone .constprop.206]+0x12e>
	}

#if PAT9125_NEW_INIT
	// Software reset (i.e. set bit7 to 1). It will reset to 0 automatically.
	// pat9125_wr_reg_verify is not allowed because the register contents will change as soon as they are written. No point in verifying those.
	pat9125_wr_reg(PAT9125_CONFIG, 0x97);
   2dc7e:	67 e9       	ldi	r22, 0x97	; 151
   2dc80:	86 e0       	ldi	r24, 0x06	; 6
   2dc82:	0f 94 46 4f 	call	0x29e8c	; 0x29e8c <pat9125_wr_reg(unsigned char, unsigned char) [clone .lto_priv.370]>
	#else
		//round up by default
		__ticks_dc = (uint32_t)(ceil(fabs(__tmp)));
	#endif

	__builtin_avr_delay_cycles(__ticks_dc);
   2dc86:	8f e9       	ldi	r24, 0x9F	; 159
   2dc88:	9f e0       	ldi	r25, 0x0F	; 15
   2dc8a:	01 97       	sbiw	r24, 0x01	; 1
   2dc8c:	f1 f7       	brne	.-4      	; 0x2dc8a <PAT9125_sensor::init() [clone .constprop.206]+0xd2>
   2dc8e:	00 c0       	rjmp	.+0      	; 0x2dc90 <PAT9125_sensor::init() [clone .constprop.206]+0xd8>
   2dc90:	00 00       	nop
	// Wait until the sensor reboots.
	_delay_ms(1);

	//Write init sequence in bank0. MUST ALREADY BE IN bank0.
	if (!pat9125_wr_seq(pat9125_init_bank0))
   2dc92:	80 e0       	ldi	r24, 0x00	; 0
   2dc94:	91 ea       	ldi	r25, 0xA1	; 161
   2dc96:	0f 94 8e 4f 	call	0x29f1c	; 0x29f1c <pat9125_wr_seq(unsigned char const*) [clone .lto_priv.371]>
   2dc9a:	88 23       	and	r24, r24
   2dc9c:	a9 f1       	breq	.+106    	; 0x2dd08 <PAT9125_sensor::init() [clone .constprop.206]+0x150>
   2dc9e:	8f e3       	ldi	r24, 0x3F	; 63
   2dca0:	9c e9       	ldi	r25, 0x9C	; 156
   2dca2:	01 97       	sbiw	r24, 0x01	; 1
   2dca4:	f1 f7       	brne	.-4      	; 0x2dca2 <PAT9125_sensor::init() [clone .constprop.206]+0xea>
   2dca6:	00 c0       	rjmp	.+0      	; 0x2dca8 <PAT9125_sensor::init() [clone .constprop.206]+0xf0>
   2dca8:	00 00       	nop
		return 0;

	_delay_ms(10); // not sure why this is here. But I'll allow it.

	// Switch to bank1, not allowed to perform pat9125_wr_reg_verify on this register.
	pat9125_wr_reg(PAT9125_BANK_SELECTION, 0x01);
   2dcaa:	61 e0       	ldi	r22, 0x01	; 1
   2dcac:	8f e7       	ldi	r24, 0x7F	; 127
   2dcae:	0f 94 46 4f 	call	0x29e8c	; 0x29e8c <pat9125_wr_reg(unsigned char, unsigned char) [clone .lto_priv.370]>
	//Write init sequence in bank1. MUST ALREADY BE IN bank1.
	if (!pat9125_wr_seq(pat9125_init_bank1))
   2dcb2:	8d ec       	ldi	r24, 0xCD	; 205
   2dcb4:	90 ea       	ldi	r25, 0xA0	; 160
   2dcb6:	0f 94 8e 4f 	call	0x29f1c	; 0x29f1c <pat9125_wr_seq(unsigned char const*) [clone .lto_priv.371]>
   2dcba:	88 23       	and	r24, r24
   2dcbc:	29 f1       	breq	.+74     	; 0x2dd08 <PAT9125_sensor::init() [clone .constprop.206]+0x150>
		return 0;

	// Switch to bank0, not allowed to perform pat9125_wr_reg_verify on this register.
	pat9125_wr_reg(PAT9125_BANK_SELECTION, 0x00);
   2dcbe:	60 e0       	ldi	r22, 0x00	; 0
   2dcc0:	8f e7       	ldi	r24, 0x7F	; 127
   2dcc2:	0f 94 46 4f 	call	0x29e8c	; 0x29e8c <pat9125_wr_reg(unsigned char, unsigned char) [clone .lto_priv.370]>

	// Enable write protect.
	pat9125_wr_reg(PAT9125_WP, 0x00); //prevents writing to registers over 0x09
   2dcc6:	60 e0       	ldi	r22, 0x00	; 0
   2dcc8:	89 e0       	ldi	r24, 0x09	; 9
   2dcca:	0f 94 46 4f 	call	0x29e8c	; 0x29e8c <pat9125_wr_reg(unsigned char, unsigned char) [clone .lto_priv.370]>

	pat9125_PID1 = pat9125_rd_reg(PAT9125_PID1);
   2dcce:	80 e0       	ldi	r24, 0x00	; 0
   2dcd0:	0f 94 61 4f 	call	0x29ec2	; 0x29ec2 <pat9125_rd_reg(unsigned char) [clone .lto_priv.369]>
   2dcd4:	80 93 66 0d 	sts	0x0D66, r24	; 0x800d66 <pat9125_PID1>
	pat9125_PID2 = pat9125_rd_reg(PAT9125_PID2);
   2dcd8:	81 e0       	ldi	r24, 0x01	; 1
   2dcda:	0f 94 61 4f 	call	0x29ec2	; 0x29ec2 <pat9125_rd_reg(unsigned char) [clone .lto_priv.369]>
   2dcde:	80 93 65 0d 	sts	0x0D65, r24	; 0x800d65 <pat9125_PID2>
        deinit();
        triggerError();
        ; //
    }
#ifdef IR_SENSOR_PIN
    else if (!READ(IR_SENSOR_PIN)) {
   2dce2:	89 b1       	in	r24, 0x09	; 9
   2dce4:	08 95       	ret
	// Verify that the sensor responds with its correct product ID.
	pat9125_PID1 = pat9125_rd_reg(PAT9125_PID1);
	pat9125_PID2 = pat9125_rd_reg(PAT9125_PID2);
	if ((pat9125_PID1 != 0x31) || (pat9125_PID2 != 0x91))
	{
		pat9125_PID1 = pat9125_rd_reg(PAT9125_PID1);
   2dce6:	80 e0       	ldi	r24, 0x00	; 0
   2dce8:	0f 94 61 4f 	call	0x29ec2	; 0x29ec2 <pat9125_rd_reg(unsigned char) [clone .lto_priv.369]>
   2dcec:	80 93 66 0d 	sts	0x0D66, r24	; 0x800d66 <pat9125_PID1>
		pat9125_PID2 = pat9125_rd_reg(PAT9125_PID2);
   2dcf0:	81 e0       	ldi	r24, 0x01	; 1
   2dcf2:	0f 94 61 4f 	call	0x29ec2	; 0x29ec2 <pat9125_rd_reg(unsigned char) [clone .lto_priv.369]>
   2dcf6:	80 93 65 0d 	sts	0x0D65, r24	; 0x800d65 <pat9125_PID2>
		if ((pat9125_PID1 != 0x31) || (pat9125_PID2 != 0x91))
   2dcfa:	90 91 66 0d 	lds	r25, 0x0D66	; 0x800d66 <pat9125_PID1>
   2dcfe:	91 33       	cpi	r25, 0x31	; 49
   2dd00:	19 f4       	brne	.+6      	; 0x2dd08 <PAT9125_sensor::init() [clone .constprop.206]+0x150>
   2dd02:	81 39       	cpi	r24, 0x91	; 145
   2dd04:	09 f4       	brne	.+2      	; 0x2dd08 <PAT9125_sensor::init() [clone .constprop.206]+0x150>
   2dd06:	bb cf       	rjmp	.-138    	; 0x2dc7e <PAT9125_sensor::init() [clone .constprop.206]+0xc6>

void PAT9125_sensor::deinit() {
//    puts_P(PSTR("fsensor::deinit()"));
    ; //
    state = State::disabled;
    filter = 0;
   2dd08:	10 92 fd 16 	sts	0x16FD, r1	; 0x8016fd <fsensor+0xc>
    eeprom_increment_word((uint16_t *)EEPROM_FERROR_COUNT_TOT);
    enquecommand_front_P(MSG_M600);
}

void Filament_sensor::triggerError() {
    state = State::error;
   2dd0c:	83 e0       	ldi	r24, 0x03	; 3
   2dd0e:	80 93 f1 16 	sts	0x16F1, r24	; 0x8016f1 <fsensor>
#ifdef IR_SENSOR_PIN
    else if (!READ(IR_SENSOR_PIN)) {
        ; // MK3 fw on MK3S printer
    }
#endif // IR_SENSOR_PIN
}
   2dd12:	08 95       	ret

0002dd14 <PAT9125_sensor::updatePAT9125() [clone .constprop.202]>:
    eeprom_increment_byte((uint8_t *)EEPROM_FERROR_COUNT);
    eeprom_increment_word((uint16_t *)EEPROM_FERROR_COUNT_TOT);
    enquecommand_front_P(MSG_M600);
}

bool PAT9125_sensor::updatePAT9125() {
   2dd14:	cf 93       	push	r28
   2dd16:	df 93       	push	r29
    if (jamDetection) {
   2dd18:	80 91 ff 16 	lds	r24, 0x16FF	; 0x8016ff <fsensor+0xe>
   2dd1c:	88 23       	and	r24, r24
   2dd1e:	09 f4       	brne	.+2      	; 0x2dd22 <PAT9125_sensor::updatePAT9125() [clone .constprop.202]+0xe>
   2dd20:	60 c0       	rjmp	.+192    	; 0x2dde2 <PAT9125_sensor::updatePAT9125() [clone .constprop.202]+0xce>
    setJamDetectionEnabled(eeprom_read_byte((uint8_t *)EEPROM_FSENSOR_JAM_DETECTION));
}

int16_t PAT9125_sensor::getStepCount() {
    int16_t ret;
    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { ret = stepCount; }
   2dd22:	8f b7       	in	r24, 0x3f	; 63
    return 1;
}

static __inline__ uint8_t __iCliRetVal(void)
{
    cli();
   2dd24:	f8 94       	cli
   2dd26:	c0 91 02 17 	lds	r28, 0x1702	; 0x801702 <fsensor+0x11>
   2dd2a:	d0 91 03 17 	lds	r29, 0x1703	; 0x801703 <fsensor+0x12>
    (void)__s;
}

static __inline__ void __iRestore(const  uint8_t *__s)
{
    SREG = *__s;
   2dd2e:	8f bf       	out	0x3f, r24	; 63
}

bool PAT9125_sensor::updatePAT9125() {
    if (jamDetection) {
        int16_t _stepCount = getStepCount();
        if (abs(_stepCount) >= chunkSteps) { // end of chunk. Check distance
   2dd30:	ce 01       	movw	r24, r28
   2dd32:	d7 ff       	sbrs	r29, 7
   2dd34:	04 c0       	rjmp	.+8      	; 0x2dd3e <PAT9125_sensor::updatePAT9125() [clone .constprop.202]+0x2a>
   2dd36:	88 27       	eor	r24, r24
   2dd38:	99 27       	eor	r25, r25
   2dd3a:	8c 1b       	sub	r24, r28
   2dd3c:	9d 0b       	sbc	r25, r29
   2dd3e:	20 91 04 17 	lds	r18, 0x1704	; 0x801704 <fsensor+0x13>
   2dd42:	30 91 05 17 	lds	r19, 0x1705	; 0x801705 <fsensor+0x14>
   2dd46:	82 17       	cp	r24, r18
   2dd48:	93 07       	cpc	r25, r19
   2dd4a:	4c f1       	brlt	.+82     	; 0x2dd9e <PAT9125_sensor::updatePAT9125() [clone .constprop.202]+0x8a>
            resetStepCount();
   2dd4c:	0f 94 8d 6d 	call	0x2db1a	; 0x2db1a <PAT9125_sensor::resetStepCount() [clone .constprop.210]>
            if (!pat9125_update()) { // get up to date data. reinit on error.
   2dd50:	0f 94 ac 4f 	call	0x29f58	; 0x29f58 <pat9125_update()>
   2dd54:	81 11       	cpse	r24, r1
   2dd56:	02 c0       	rjmp	.+4      	; 0x2dd5c <PAT9125_sensor::updatePAT9125() [clone .constprop.202]+0x48>
                init();              // try to reinit.
   2dd58:	0f 94 dc 6d 	call	0x2dbb8	; 0x2dbb8 <PAT9125_sensor::init() [clone .constprop.206]>
            }
            bool fsDir = (pat9125_y - oldPos) > 0;
   2dd5c:	20 91 38 0e 	lds	r18, 0x0E38	; 0x800e38 <pat9125_y>
   2dd60:	30 91 39 0e 	lds	r19, 0x0E39	; 0x800e39 <pat9125_y+0x1>
   2dd64:	80 91 06 17 	lds	r24, 0x1706	; 0x801706 <fsensor+0x15>
   2dd68:	40 91 00 17 	lds	r20, 0x1700	; 0x801700 <fsensor+0xf>
   2dd6c:	50 91 01 17 	lds	r21, 0x1701	; 0x801701 <fsensor+0x10>
   2dd70:	b9 01       	movw	r22, r18
   2dd72:	64 1b       	sub	r22, r20
   2dd74:	75 0b       	sbc	r23, r21
   2dd76:	41 e0       	ldi	r20, 0x01	; 1
   2dd78:	16 16       	cp	r1, r22
   2dd7a:	17 06       	cpc	r1, r23
   2dd7c:	0c f0       	brlt	.+2      	; 0x2dd80 <PAT9125_sensor::updatePAT9125() [clone .constprop.202]+0x6c>
   2dd7e:	40 e0       	ldi	r20, 0x00	; 0
            bool stDir = _stepCount > 0;
   2dd80:	91 e0       	ldi	r25, 0x01	; 1
   2dd82:	1c 16       	cp	r1, r28
   2dd84:	1d 06       	cpc	r1, r29
   2dd86:	0c f0       	brlt	.+2      	; 0x2dd8a <PAT9125_sensor::updatePAT9125() [clone .constprop.202]+0x76>
   2dd88:	90 e0       	ldi	r25, 0x00	; 0
            if (fsDir != stDir) {
   2dd8a:	49 17       	cp	r20, r25
   2dd8c:	09 f4       	brne	.+2      	; 0x2dd90 <PAT9125_sensor::updatePAT9125() [clone .constprop.202]+0x7c>
   2dd8e:	61 c0       	rjmp	.+194    	; 0x2de52 <PAT9125_sensor::updatePAT9125() [clone .constprop.202]+0x13e>
                jamErrCnt++;
   2dd90:	8f 5f       	subi	r24, 0xFF	; 255
            } else if (jamErrCnt) {
                jamErrCnt--;
   2dd92:	80 93 06 17 	sts	0x1706, r24	; 0x801706 <fsensor+0x15>
            }
            oldPos = pat9125_y;
   2dd96:	30 93 01 17 	sts	0x1701, r19	; 0x801701 <fsensor+0x10>
   2dd9a:	20 93 00 17 	sts	0x1700, r18	; 0x801700 <fsensor+0xf>
        }
        if (jamErrCnt > 10) {
   2dd9e:	80 91 06 17 	lds	r24, 0x1706	; 0x801706 <fsensor+0x15>
   2dda2:	8b 30       	cpi	r24, 0x0B	; 11
   2dda4:	f0 f0       	brcs	.+60     	; 0x2dde2 <PAT9125_sensor::updatePAT9125() [clone .constprop.202]+0xce>
            jamErrCnt = 0;
   2dda6:	10 92 06 17 	sts	0x1706, r1	; 0x801706 <fsensor+0x15>
void PAT9125_sensor::resetStepCount() {
    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { stepCount = 0; }
}

void PAT9125_sensor::filJam() {
    runoutEnabled = false;
   2ddaa:	10 92 f3 16 	sts	0x16F3, r1	; 0x8016f3 <fsensor+0x2>
    autoLoadEnabled = false;
   2ddae:	10 92 f2 16 	sts	0x16F2, r1	; 0x8016f2 <fsensor+0x1>
    jamDetection = false;
   2ddb2:	10 92 ff 16 	sts	0x16FF, r1	; 0x8016ff <fsensor+0xe>
    stop_and_save_print_to_ram(0, 0);
   2ddb6:	60 e0       	ldi	r22, 0x00	; 0
   2ddb8:	70 e0       	ldi	r23, 0x00	; 0
   2ddba:	cb 01       	movw	r24, r22
   2ddbc:	0f 94 06 66 	call	0x2cc0c	; 0x2cc0c <stop_and_save_print_to_ram(float, float) [clone .constprop.303]>
    restore_print_from_ram_and_continue(0);
   2ddc0:	60 e0       	ldi	r22, 0x00	; 0
   2ddc2:	70 e0       	ldi	r23, 0x00	; 0
   2ddc4:	cb 01       	movw	r24, r22
   2ddc6:	0e 94 b8 66 	call	0xcd70	; 0xcd70 <restore_print_from_ram_and_continue(float)>
    eeprom_increment_byte((uint8_t *)EEPROM_FERROR_COUNT);
   2ddca:	85 e6       	ldi	r24, 0x65	; 101
   2ddcc:	9f e0       	ldi	r25, 0x0F	; 15
   2ddce:	0e 94 7c 78 	call	0xf0f8	; 0xf0f8 <eeprom_increment_byte(unsigned char*)>
    eeprom_increment_word((uint16_t *)EEPROM_FERROR_COUNT_TOT);
   2ddd2:	81 e0       	ldi	r24, 0x01	; 1
   2ddd4:	9f e0       	ldi	r25, 0x0F	; 15
   2ddd6:	0e 94 6f 78 	call	0xf0de	; 0xf0de <eeprom_increment_word(unsigned int*)>
    enquecommand_front_P(MSG_M600);
   2ddda:	8e e5       	ldi	r24, 0x5E	; 94
   2dddc:	9c e6       	ldi	r25, 0x6C	; 108
   2ddde:	0f 94 78 67 	call	0x2cef0	; 0x2cef0 <enquecommand_front(char const*, bool) [clone .constprop.294]>
            jamErrCnt = 0;
            filJam();
        }
    }

    if (pollingTimer.expired_cont(pollingPeriod)) {
   2dde2:	6a e0       	ldi	r22, 0x0A	; 10
   2dde4:	70 e0       	ldi	r23, 0x00	; 0
   2dde6:	8a ef       	ldi	r24, 0xFA	; 250
   2dde8:	96 e1       	ldi	r25, 0x16	; 22
   2ddea:	0f 94 47 0e 	call	0x21c8e	; 0x21c8e <Timer<unsigned short>::expired_cont(unsigned short)>
   2ddee:	c8 2f       	mov	r28, r24
   2ddf0:	88 23       	and	r24, r24
   2ddf2:	39 f1       	breq	.+78     	; 0x2de42 <PAT9125_sensor::updatePAT9125() [clone .constprop.202]+0x12e>
        pollingTimer.start();
   2ddf4:	8a ef       	ldi	r24, 0xFA	; 250
   2ddf6:	96 e1       	ldi	r25, 0x16	; 22
   2ddf8:	0f 94 4e 0e 	call	0x21c9c	; 0x21c9c <Timer<unsigned short>::start()>
        if (!pat9125_update()) {
   2ddfc:	0f 94 ac 4f 	call	0x29f58	; 0x29f58 <pat9125_update()>
   2de00:	81 11       	cpse	r24, r1
   2de02:	02 c0       	rjmp	.+4      	; 0x2de08 <PAT9125_sensor::updatePAT9125() [clone .constprop.202]+0xf4>
            init(); // try to reinit.
   2de04:	0f 94 dc 6d 	call	0x2dbb8	; 0x2dbb8 <PAT9125_sensor::init() [clone .constprop.206]>
        }

        bool present = (pat9125_s < 17) || (pat9125_s >= 17 && pat9125_b >= 50);
   2de08:	80 91 64 0d 	lds	r24, 0x0D64	; 0x800d64 <pat9125_s>
   2de0c:	81 31       	cpi	r24, 0x11	; 17
   2de0e:	30 f0       	brcs	.+12     	; 0x2de1c <PAT9125_sensor::updatePAT9125() [clone .constprop.202]+0x108>
   2de10:	c1 e0       	ldi	r28, 0x01	; 1
   2de12:	80 91 63 0d 	lds	r24, 0x0D63	; 0x800d63 <pat9125_b>
   2de16:	82 33       	cpi	r24, 0x32	; 50
   2de18:	08 f4       	brcc	.+2      	; 0x2de1c <PAT9125_sensor::updatePAT9125() [clone .constprop.202]+0x108>
   2de1a:	c0 e0       	ldi	r28, 0x00	; 0
   2de1c:	80 91 fd 16 	lds	r24, 0x16FD	; 0x8016fd <fsensor+0xc>
        if (present != filterFilPresent) {
   2de20:	20 91 fe 16 	lds	r18, 0x16FE	; 0x8016fe <fsensor+0xd>
   2de24:	30 e0       	ldi	r19, 0x00	; 0
   2de26:	c2 17       	cp	r28, r18
   2de28:	13 06       	cpc	r1, r19
   2de2a:	c1 f0       	breq	.+48     	; 0x2de5c <PAT9125_sensor::updatePAT9125() [clone .constprop.202]+0x148>
            filter++;
   2de2c:	8f 5f       	subi	r24, 0xFF	; 255
        } else if (filter) {
            filter--;
   2de2e:	80 93 fd 16 	sts	0x16FD, r24	; 0x8016fd <fsensor+0xc>
        }
        if (filter >= filterCnt) {
   2de32:	80 91 fd 16 	lds	r24, 0x16FD	; 0x8016fd <fsensor+0xc>
   2de36:	85 30       	cpi	r24, 0x05	; 5
   2de38:	20 f0       	brcs	.+8      	; 0x2de42 <PAT9125_sensor::updatePAT9125() [clone .constprop.202]+0x12e>
            filter = 0;
   2de3a:	10 92 fd 16 	sts	0x16FD, r1	; 0x8016fd <fsensor+0xc>
            filterFilPresent = present;
   2de3e:	c0 93 fe 16 	sts	0x16FE, r28	; 0x8016fe <fsensor+0xd>
        }
    }
    return (filter == 0); // return stability
   2de42:	81 e0       	ldi	r24, 0x01	; 1
   2de44:	90 91 fd 16 	lds	r25, 0x16FD	; 0x8016fd <fsensor+0xc>
   2de48:	91 11       	cpse	r25, r1
   2de4a:	80 e0       	ldi	r24, 0x00	; 0
}
   2de4c:	df 91       	pop	r29
   2de4e:	cf 91       	pop	r28
   2de50:	08 95       	ret
            }
            bool fsDir = (pat9125_y - oldPos) > 0;
            bool stDir = _stepCount > 0;
            if (fsDir != stDir) {
                jamErrCnt++;
            } else if (jamErrCnt) {
   2de52:	88 23       	and	r24, r24
   2de54:	09 f4       	brne	.+2      	; 0x2de58 <PAT9125_sensor::updatePAT9125() [clone .constprop.202]+0x144>
   2de56:	9f cf       	rjmp	.-194    	; 0x2dd96 <PAT9125_sensor::updatePAT9125() [clone .constprop.202]+0x82>
                jamErrCnt--;
   2de58:	81 50       	subi	r24, 0x01	; 1
   2de5a:	9b cf       	rjmp	.-202    	; 0x2dd92 <PAT9125_sensor::updatePAT9125() [clone .constprop.202]+0x7e>
        }

        bool present = (pat9125_s < 17) || (pat9125_s >= 17 && pat9125_b >= 50);
        if (present != filterFilPresent) {
            filter++;
        } else if (filter) {
   2de5c:	88 23       	and	r24, r24
   2de5e:	49 f3       	breq	.-46     	; 0x2de32 <PAT9125_sensor::updatePAT9125() [clone .constprop.202]+0x11e>
            filter--;
   2de60:	81 50       	subi	r24, 0x01	; 1
   2de62:	e5 cf       	rjmp	.-54     	; 0x2de2e <PAT9125_sensor::updatePAT9125() [clone .constprop.202]+0x11a>

0002de64 <CardReader::presort() [clone .constprop.194]>:
* We can do this in 3 ways...
*  - Minimal RAM: Read two filenames at a time sorting along...
*  - Some RAM: Buffer the directory just for this sort
*  - Most RAM: Buffer the directory and return filenames from RAM
*/
void CardReader::presort() {
   2de64:	2f 92       	push	r2
   2de66:	3f 92       	push	r3
   2de68:	4f 92       	push	r4
   2de6a:	5f 92       	push	r5
   2de6c:	6f 92       	push	r6
   2de6e:	7f 92       	push	r7
   2de70:	8f 92       	push	r8
   2de72:	9f 92       	push	r9
   2de74:	af 92       	push	r10
   2de76:	bf 92       	push	r11
   2de78:	cf 92       	push	r12
   2de7a:	df 92       	push	r13
   2de7c:	ef 92       	push	r14
   2de7e:	ff 92       	push	r15
   2de80:	0f 93       	push	r16
   2de82:	1f 93       	push	r17
   2de84:	cf 93       	push	r28
   2de86:	df 93       	push	r29
   2de88:	cd b7       	in	r28, 0x3d	; 61
   2de8a:	de b7       	in	r29, 0x3e	; 62
   2de8c:	ed 97       	sbiw	r28, 0x3d	; 61
   2de8e:	0f b6       	in	r0, 0x3f	; 63
   2de90:	f8 94       	cli
   2de92:	de bf       	out	0x3e, r29	; 62
   2de94:	0f be       	out	0x3f, r0	; 63
   2de96:	cd bf       	out	0x3d, r28	; 61

	KEEPALIVE_STATE(NOT_BUSY);
}

void CardReader::flush_presort() {
	sort_count = 0;
   2de98:	10 92 79 15 	sts	0x1579, r1	; 0x801579 <card+0x1a4>
   2de9c:	10 92 78 15 	sts	0x1578, r1	; 0x801578 <card+0x1a3>
	lastSortedFilePosition = 0;
   2dea0:	10 92 43 16 	sts	0x1643, r1	; 0x801643 <card+0x26e>
   2dea4:	10 92 42 16 	sts	0x1642, r1	; 0x801642 <card+0x26d>
*/
void CardReader::presort() {
	// Throw away old sort index
	flush_presort();

	if (IS_SD_INSERTED == false) return; //sorting is not used in farm mode
   2dea8:	80 91 03 01 	lds	r24, 0x0103	; 0x800103 <__TEXT_REGION_LENGTH__+0x7c2103>
   2deac:	80 fd       	sbrc	r24, 0
   2deae:	f7 c0       	rjmp	.+494    	; 0x2e09e <CardReader::presort() [clone .constprop.194]+0x23a>
	uint8_t sdSort = eeprom_read_byte((uint8_t*)EEPROM_SD_SORT);
   2deb0:	89 e0       	ldi	r24, 0x09	; 9
   2deb2:	9f e0       	ldi	r25, 0x0F	; 15
   2deb4:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   2deb8:	38 2e       	mov	r3, r24

	KEEPALIVE_STATE(IN_HANDLER);
   2deba:	82 e0       	ldi	r24, 0x02	; 2
   2debc:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>

	// If there are files, sort up to the limit
	uint16_t fileCnt = getnrfilenames();
   2dec0:	0f 94 4f 6c 	call	0x2d89e	; 0x2d89e <CardReader::getnrfilenames() [clone .constprop.236]>
   2dec4:	6c 01       	movw	r12, r24
	if (fileCnt > 0) {
   2dec6:	00 97       	sbiw	r24, 0x00	; 0
   2dec8:	09 f4       	brne	.+2      	; 0x2decc <CardReader::presort() [clone .constprop.194]+0x68>
   2deca:	e6 c0       	rjmp	.+460    	; 0x2e098 <CardReader::presort() [clone .constprop.194]+0x234>
		// Never sort more than the max allowed
		// If you use folders to organize, 20 may be enough
		if (fileCnt > SDSORT_LIMIT) {
   2decc:	85 36       	cpi	r24, 0x65	; 101
   2dece:	91 05       	cpc	r25, r1
   2ded0:	80 f0       	brcs	.+32     	; 0x2def2 <CardReader::presort() [clone .constprop.194]+0x8e>
			if ((sdSort != SD_SORT_NONE) && !farm_mode) {
   2ded2:	32 e0       	ldi	r19, 0x02	; 2
   2ded4:	33 16       	cp	r3, r19
   2ded6:	51 f0       	breq	.+20     	; 0x2deec <CardReader::presort() [clone .constprop.194]+0x88>
   2ded8:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   2dedc:	81 11       	cpse	r24, r1
   2dede:	06 c0       	rjmp	.+12     	; 0x2deec <CardReader::presort() [clone .constprop.194]+0x88>
				lcd_show_fullscreen_message_and_wait_P(_T(MSG_FILE_CNT));
   2dee0:	86 e3       	ldi	r24, 0x36	; 54
   2dee2:	92 e6       	ldi	r25, 0x62	; 98
   2dee4:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   2dee8:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
			}
			fileCnt = SDSORT_LIMIT;
   2deec:	f4 e6       	ldi	r31, 0x64	; 100
   2deee:	cf 2e       	mov	r12, r31
   2def0:	d1 2c       	mov	r13, r1
		}

		sort_count = fileCnt;
   2def2:	d0 92 79 15 	sts	0x1579, r13	; 0x801579 <card+0x1a4>
   2def6:	c0 92 78 15 	sts	0x1578, r12	; 0x801578 <card+0x1a3>
   2defa:	6a e7       	ldi	r22, 0x7A	; 122
   2defc:	66 2e       	mov	r6, r22
   2defe:	65 e1       	ldi	r22, 0x15	; 21
   2df00:	76 2e       	mov	r7, r22

		// Init sort order.
		for (uint16_t i = 0; i < fileCnt; i++) {
   2df02:	f1 2c       	mov	r15, r1
   2df04:	e1 2c       	mov	r14, r1
	lsDive("", *curDir, match, LS_GetFilename);
}

void CardReader::getfilename_next(uint32_t position, const char * const match/*=NULL*/)
{
	curDir = &workDir;
   2df06:	72 e8       	ldi	r23, 0x82	; 130
   2df08:	a7 2e       	mov	r10, r23
   2df0a:	74 e1       	ldi	r23, 0x14	; 20
   2df0c:	b7 2e       	mov	r11, r23
	nrFiles = 1;
   2df0e:	88 24       	eor	r8, r8
   2df10:	83 94       	inc	r8
   2df12:	91 2c       	mov	r9, r1

		sort_count = fileCnt;

		// Init sort order.
		for (uint16_t i = 0; i < fileCnt; i++) {
			if (!IS_SD_INSERTED) return;
   2df14:	80 91 03 01 	lds	r24, 0x0103	; 0x800103 <__TEXT_REGION_LENGTH__+0x7c2103>
   2df18:	80 fd       	sbrc	r24, 0
   2df1a:	c1 c0       	rjmp	.+386    	; 0x2e09e <CardReader::presort() [clone .constprop.194]+0x23a>
			manage_heater();
   2df1c:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
			if (i == 0)
   2df20:	e1 14       	cp	r14, r1
   2df22:	f1 04       	cpc	r15, r1
   2df24:	09 f0       	breq	.+2      	; 0x2df28 <CardReader::presort() [clone .constprop.194]+0xc4>
   2df26:	d4 c0       	rjmp	.+424    	; 0x2e0d0 <CardReader::presort() [clone .constprop.194]+0x26c>
				getfilename(0);
   2df28:	90 e0       	ldi	r25, 0x00	; 0
   2df2a:	80 e0       	ldi	r24, 0x00	; 0
   2df2c:	0f 94 b9 6b 	call	0x2d772	; 0x2d772 <CardReader::getfilename(unsigned int, char const*) [clone .constprop.235]>
			else
				getfilename_next(position);
			sort_entries[i] = position >> 5;
   2df30:	80 91 ea 13 	lds	r24, 0x13EA	; 0x8013ea <card+0x15>
   2df34:	90 91 eb 13 	lds	r25, 0x13EB	; 0x8013eb <card+0x16>
   2df38:	a0 91 ec 13 	lds	r26, 0x13EC	; 0x8013ec <card+0x17>
   2df3c:	b0 91 ed 13 	lds	r27, 0x13ED	; 0x8013ed <card+0x18>
   2df40:	55 e0       	ldi	r21, 0x05	; 5
   2df42:	b6 95       	lsr	r27
   2df44:	a7 95       	ror	r26
   2df46:	97 95       	ror	r25
   2df48:	87 95       	ror	r24
   2df4a:	5a 95       	dec	r21
   2df4c:	d1 f7       	brne	.-12     	; 0x2df42 <CardReader::presort() [clone .constprop.194]+0xde>
   2df4e:	f3 01       	movw	r30, r6
   2df50:	81 93       	st	Z+, r24
   2df52:	91 93       	st	Z+, r25
   2df54:	3f 01       	movw	r6, r30
		}

		sort_count = fileCnt;

		// Init sort order.
		for (uint16_t i = 0; i < fileCnt; i++) {
   2df56:	ff ef       	ldi	r31, 0xFF	; 255
   2df58:	ef 1a       	sub	r14, r31
   2df5a:	ff 0a       	sbc	r15, r31
   2df5c:	ce 14       	cp	r12, r14
   2df5e:	df 04       	cpc	r13, r15
   2df60:	c9 f6       	brne	.-78     	; 0x2df14 <CardReader::presort() [clone .constprop.194]+0xb0>
			else
				getfilename_next(position);
			sort_entries[i] = position >> 5;
		}

		if ((fileCnt > 1) && (sdSort != SD_SORT_NONE) && !farm_mode) {
   2df62:	21 e0       	ldi	r18, 0x01	; 1
   2df64:	e2 16       	cp	r14, r18
   2df66:	f1 04       	cpc	r15, r1
   2df68:	09 f4       	brne	.+2      	; 0x2df6c <CardReader::presort() [clone .constprop.194]+0x108>
   2df6a:	96 c0       	rjmp	.+300    	; 0x2e098 <CardReader::presort() [clone .constprop.194]+0x234>
   2df6c:	32 e0       	ldi	r19, 0x02	; 2
   2df6e:	33 16       	cp	r3, r19
   2df70:	09 f4       	brne	.+2      	; 0x2df74 <CardReader::presort() [clone .constprop.194]+0x110>
   2df72:	92 c0       	rjmp	.+292    	; 0x2e098 <CardReader::presort() [clone .constprop.194]+0x234>
   2df74:	20 91 60 0d 	lds	r18, 0x0D60	; 0x800d60 <farm_mode>
   2df78:	21 11       	cpse	r18, r1
   2df7a:	8e c0       	rjmp	.+284    	; 0x2e098 <CardReader::presort() [clone .constprop.194]+0x234>

#ifdef SORTING_SPEEDTEST
			LongTimer sortingSpeedtestTimer;
			sortingSpeedtestTimer.start();
#endif //SORTING_SPEEDTEST
			lastSortedFilePosition = position >> 5;
   2df7c:	90 93 43 16 	sts	0x1643, r25	; 0x801643 <card+0x26e>
   2df80:	80 93 42 16 	sts	0x1642, r24	; 0x801642 <card+0x26d>
#define _SORT_CMP_DIR(fs) ((dir1 == filenameIsDir) ? _SORT_CMP_NODIR() : (fs < 0 ? dir1 : !dir1))
#define _SORT_CMP_TIME_DIR(fs) ((dir1 == filenameIsDir) ? _SORT_CMP_TIME_NODIR() : (fs < 0 ? dir1 : !dir1))
#endif

      uint16_t counter = 0;
      menu_progressbar_init(fileCnt * fileCnt / 2, _T(MSG_SORTING_FILES));
   2df84:	86 e2       	ldi	r24, 0x26	; 38
   2df86:	92 e6       	ldi	r25, 0x62	; 98
   2df88:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   2df8c:	ee 9c       	mul	r14, r14
   2df8e:	90 01       	movw	r18, r0
   2df90:	ef 9c       	mul	r14, r15
   2df92:	30 0d       	add	r19, r0
   2df94:	30 0d       	add	r19, r0
   2df96:	11 24       	eor	r1, r1
   2df98:	bc 01       	movw	r22, r24
   2df9a:	c9 01       	movw	r24, r18
   2df9c:	96 95       	lsr	r25
   2df9e:	87 95       	ror	r24
   2dfa0:	0e 94 11 72 	call	0xe422	; 0xe422 <menu_progressbar_init(unsigned int, char const*)>
   2dfa4:	3c e7       	ldi	r19, 0x7C	; 124
   2dfa6:	a3 2e       	mov	r10, r19
   2dfa8:	35 e1       	ldi	r19, 0x15	; 21
   2dfaa:	b3 2e       	mov	r11, r19
#if HAS_FOLDER_SORTING
#define _SORT_CMP_DIR(fs) ((dir1 == filenameIsDir) ? _SORT_CMP_NODIR() : (fs < 0 ? dir1 : !dir1))
#define _SORT_CMP_TIME_DIR(fs) ((dir1 == filenameIsDir) ? _SORT_CMP_TIME_NODIR() : (fs < 0 ? dir1 : !dir1))
#endif

      uint16_t counter = 0;
   2dfac:	91 2c       	mov	r9, r1
   2dfae:	81 2c       	mov	r8, r1
      menu_progressbar_init(fileCnt * fileCnt / 2, _T(MSG_SORTING_FILES));

      for (uint16_t i = 1; i < fileCnt; ++i){
   2dfb0:	cc 24       	eor	r12, r12
   2dfb2:	c3 94       	inc	r12
   2dfb4:	d1 2c       	mov	r13, r1
        // if (!IS_SD_INSERTED) return;
        menu_progressbar_update(counter);
   2dfb6:	c4 01       	movw	r24, r8
   2dfb8:	0e 94 47 71 	call	0xe28e	; 0xe28e <menu_progressbar_update(unsigned int)>
        counter += i;
   2dfbc:	8c 0c       	add	r8, r12
   2dfbe:	9d 1c       	adc	r9, r13

        /// pop the position
        const uint16_t o1 = sort_entries[i];
   2dfc0:	f5 01       	movw	r30, r10
   2dfc2:	01 90       	ld	r0, Z+
   2dfc4:	f0 81       	ld	r31, Z
   2dfc6:	e0 2d       	mov	r30, r0
   2dfc8:	f9 af       	std	Y+57, r31	; 0x39
   2dfca:	e8 af       	std	Y+56, r30	; 0x38
        getfilename_simple(o1);
   2dfcc:	cf 01       	movw	r24, r30
   2dfce:	0f 94 00 6c 	call	0x2d800	; 0x2d800 <CardReader::getfilename_simple(unsigned int, char const*) [clone .constprop.233]>
        strcpy(name1, LONGEST_FILENAME); // save (or getfilename below will trounce it)
   2dfd2:	80 91 ee 13 	lds	r24, 0x13EE	; 0x8013ee <card+0x19>
   2dfd6:	69 ed       	ldi	r22, 0xD9	; 217
   2dfd8:	73 e1       	ldi	r23, 0x13	; 19
   2dfda:	88 23       	and	r24, r24
   2dfdc:	11 f0       	breq	.+4      	; 0x2dfe2 <CardReader::presort() [clone .constprop.194]+0x17e>
   2dfde:	6e ee       	ldi	r22, 0xEE	; 238
   2dfe0:	73 e1       	ldi	r23, 0x13	; 19
   2dfe2:	ce 01       	movw	r24, r28
   2dfe4:	01 96       	adiw	r24, 0x01	; 1
   2dfe6:	0f 94 4b aa 	call	0x35496	; 0x35496 <strcpy>
        crmod_date_bckp = crmodDate;
   2dfea:	60 90 e8 13 	lds	r6, 0x13E8	; 0x8013e8 <card+0x13>
   2dfee:	70 90 e9 13 	lds	r7, 0x13E9	; 0x8013e9 <card+0x14>
        crmod_time_bckp = crmodTime;
   2dff2:	20 91 e6 13 	lds	r18, 0x13E6	; 0x8013e6 <card+0x11>
   2dff6:	30 91 e7 13 	lds	r19, 0x13E7	; 0x8013e7 <card+0x12>
   2dffa:	3b af       	std	Y+59, r19	; 0x3b
   2dffc:	2a af       	std	Y+58, r18	; 0x3a
        #if HAS_FOLDER_SORTING
        bool dir1 = filenameIsDir;
   2dffe:	20 90 23 14 	lds	r2, 0x1423	; 0x801423 <card+0x4e>
   2e002:	bf aa       	std	Y+55, r11	; 0x37
   2e004:	ae aa       	std	Y+54, r10	; 0x36
   2e006:	86 01       	movw	r16, r12
        #endif

        /// find proper place
        uint16_t j = i;
        for (; j > 0; --j){
          if (!IS_SD_INSERTED) return;
   2e008:	80 91 03 01 	lds	r24, 0x0103	; 0x800103 <__TEXT_REGION_LENGTH__+0x7c2103>
   2e00c:	80 fd       	sbrc	r24, 0
   2e00e:	47 c0       	rjmp	.+142    	; 0x2e09e <CardReader::presort() [clone .constprop.194]+0x23a>
            printf_P(PSTR("%2u "), sort_entries[z]);
          }
          MYSERIAL.println();
          #endif

          manage_heater();
   2e010:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
          const uint16_t o2 = sort_entries[j - 1];
   2e014:	c8 01       	movw	r24, r16
   2e016:	01 97       	sbiw	r24, 0x01	; 1
   2e018:	9d af       	std	Y+61, r25	; 0x3d
   2e01a:	8c af       	std	Y+60, r24	; 0x3c
   2e01c:	ee a9       	ldd	r30, Y+54	; 0x36
   2e01e:	ff a9       	ldd	r31, Y+55	; 0x37
   2e020:	52 90       	ld	r5, -Z
   2e022:	42 90       	ld	r4, -Z
   2e024:	ff ab       	std	Y+55, r31	; 0x37
   2e026:	ee ab       	std	Y+54, r30	; 0x36

          getfilename_simple(o2);
   2e028:	c2 01       	movw	r24, r4
   2e02a:	0f 94 00 6c 	call	0x2d800	; 0x2d800 <CardReader::getfilename_simple(unsigned int, char const*) [clone .constprop.233]>
          char *name2 = LONGEST_FILENAME; // use the string in-place
   2e02e:	80 91 ee 13 	lds	r24, 0x13EE	; 0x8013ee <card+0x19>
   2e032:	69 ed       	ldi	r22, 0xD9	; 217
   2e034:	73 e1       	ldi	r23, 0x13	; 19
   2e036:	88 23       	and	r24, r24
   2e038:	11 f0       	breq	.+4      	; 0x2e03e <CardReader::presort() [clone .constprop.194]+0x1da>
   2e03a:	6e ee       	ldi	r22, 0xEE	; 238
   2e03c:	73 e1       	ldi	r23, 0x13	; 19

          // Sort the current pair according to settings.
          if (
   2e03e:	31 10       	cpse	r3, r1
   2e040:	8a c0       	rjmp	.+276    	; 0x2e156 <CardReader::presort() [clone .constprop.194]+0x2f2>
   2e042:	80 91 23 14 	lds	r24, 0x1423	; 0x801423 <card+0x4e>
   2e046:	28 12       	cpse	r2, r24
   2e048:	83 c0       	rjmp	.+262    	; 0x2e150 <CardReader::presort() [clone .constprop.194]+0x2ec>
          #if HAS_FOLDER_SORTING
            (sdSort == SD_SORT_TIME && _SORT_CMP_TIME_DIR(FOLDER_SORTING)) || (sdSort == SD_SORT_ALPHA && !_SORT_CMP_DIR(FOLDER_SORTING))
   2e04a:	80 91 e8 13 	lds	r24, 0x13E8	; 0x8013e8 <card+0x13>
   2e04e:	90 91 e9 13 	lds	r25, 0x13E9	; 0x8013e9 <card+0x14>
   2e052:	68 16       	cp	r6, r24
   2e054:	79 06       	cpc	r7, r25
   2e056:	09 f0       	breq	.+2      	; 0x2e05a <CardReader::presort() [clone .constprop.194]+0x1f6>
   2e058:	6c c0       	rjmp	.+216    	; 0x2e132 <CardReader::presort() [clone .constprop.194]+0x2ce>
   2e05a:	80 91 e6 13 	lds	r24, 0x13E6	; 0x8013e6 <card+0x11>
   2e05e:	90 91 e7 13 	lds	r25, 0x13E7	; 0x8013e7 <card+0x12>
   2e062:	2a ad       	ldd	r18, Y+58	; 0x3a
   2e064:	3b ad       	ldd	r19, Y+59	; 0x3b
   2e066:	82 17       	cp	r24, r18
   2e068:	93 07       	cpc	r25, r19
   2e06a:	08 f0       	brcs	.+2      	; 0x2e06e <CardReader::presort() [clone .constprop.194]+0x20a>
   2e06c:	66 c0       	rjmp	.+204    	; 0x2e13a <CardReader::presort() [clone .constprop.194]+0x2d6>
            #endif
            sort_entries[j] = o2;
          }
        }
        /// place the position
        sort_entries[j] = o1;
   2e06e:	00 0f       	add	r16, r16
   2e070:	11 1f       	adc	r17, r17
   2e072:	f8 01       	movw	r30, r16
   2e074:	e6 58       	subi	r30, 0x86	; 134
   2e076:	fa 4e       	sbci	r31, 0xEA	; 234
   2e078:	28 ad       	ldd	r18, Y+56	; 0x38
   2e07a:	39 ad       	ldd	r19, Y+57	; 0x39
   2e07c:	31 83       	std	Z+1, r19	; 0x01
   2e07e:	20 83       	st	Z, r18
#endif

      uint16_t counter = 0;
      menu_progressbar_init(fileCnt * fileCnt / 2, _T(MSG_SORTING_FILES));

      for (uint16_t i = 1; i < fileCnt; ++i){
   2e080:	3f ef       	ldi	r19, 0xFF	; 255
   2e082:	c3 1a       	sub	r12, r19
   2e084:	d3 0a       	sbc	r13, r19
   2e086:	82 e0       	ldi	r24, 0x02	; 2
   2e088:	a8 0e       	add	r10, r24
   2e08a:	b1 1c       	adc	r11, r1
   2e08c:	ec 14       	cp	r14, r12
   2e08e:	fd 04       	cpc	r15, r13
   2e090:	09 f0       	breq	.+2      	; 0x2e094 <CardReader::presort() [clone .constprop.194]+0x230>
   2e092:	91 cf       	rjmp	.-222    	; 0x2dfb6 <CardReader::presort() [clone .constprop.194]+0x152>
			for (uint16_t z = 0; z < fileCnt; z++)
				printf_P(PSTR("%2u "), sort_entries[z]);
			SERIAL_PROTOCOLLN();
			#endif

			menu_progressbar_finish();
   2e094:	0e 94 68 71 	call	0xe2d0	; 0xe2d0 <menu_progressbar_finish()>
		}
	}

	KEEPALIVE_STATE(NOT_BUSY);
   2e098:	81 e0       	ldi	r24, 0x01	; 1
   2e09a:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
}
   2e09e:	ed 96       	adiw	r28, 0x3d	; 61
   2e0a0:	0f b6       	in	r0, 0x3f	; 63
   2e0a2:	f8 94       	cli
   2e0a4:	de bf       	out	0x3e, r29	; 62
   2e0a6:	0f be       	out	0x3f, r0	; 63
   2e0a8:	cd bf       	out	0x3d, r28	; 61
   2e0aa:	df 91       	pop	r29
   2e0ac:	cf 91       	pop	r28
   2e0ae:	1f 91       	pop	r17
   2e0b0:	0f 91       	pop	r16
   2e0b2:	ff 90       	pop	r15
   2e0b4:	ef 90       	pop	r14
   2e0b6:	df 90       	pop	r13
   2e0b8:	cf 90       	pop	r12
   2e0ba:	bf 90       	pop	r11
   2e0bc:	af 90       	pop	r10
   2e0be:	9f 90       	pop	r9
   2e0c0:	8f 90       	pop	r8
   2e0c2:	7f 90       	pop	r7
   2e0c4:	6f 90       	pop	r6
   2e0c6:	5f 90       	pop	r5
   2e0c8:	4f 90       	pop	r4
   2e0ca:	3f 90       	pop	r3
   2e0cc:	2f 90       	pop	r2
   2e0ce:	08 95       	ret
			if (!IS_SD_INSERTED) return;
			manage_heater();
			if (i == 0)
				getfilename(0);
			else
				getfilename_next(position);
   2e0d0:	40 91 ea 13 	lds	r20, 0x13EA	; 0x8013ea <card+0x15>
   2e0d4:	50 91 eb 13 	lds	r21, 0x13EB	; 0x8013eb <card+0x16>
   2e0d8:	60 91 ec 13 	lds	r22, 0x13EC	; 0x8013ec <card+0x17>
   2e0dc:	70 91 ed 13 	lds	r23, 0x13ED	; 0x8013ed <card+0x18>
	lsDive("", *curDir, match, LS_GetFilename);
}

void CardReader::getfilename_next(uint32_t position, const char * const match/*=NULL*/)
{
	curDir = &workDir;
   2e0e0:	b0 92 81 14 	sts	0x1481, r11	; 0x801481 <card+0xac>
   2e0e4:	a0 92 80 14 	sts	0x1480, r10	; 0x801480 <card+0xab>
	nrFiles = 1;
   2e0e8:	90 92 f0 16 	sts	0x16F0, r9	; 0x8016f0 <card+0x31b>
   2e0ec:	80 92 ef 16 	sts	0x16EF, r8	; 0x8016ef <card+0x31a>
	curDir->seekSet(position);
   2e0f0:	82 e8       	ldi	r24, 0x82	; 130
   2e0f2:	94 e1       	ldi	r25, 0x14	; 20
   2e0f4:	0f 94 0b 2d 	call	0x25a16	; 0x25a16 <SdBaseFile::seekSet(unsigned long)>
   2e0f8:	1e 7f       	andi	r17, 0xFE	; 254
   2e0fa:	1d 7f       	andi	r17, 0xFD	; 253
	lsDive("", *curDir, match, LS_GetFilename);
   2e0fc:	e0 91 80 14 	lds	r30, 0x1480	; 0x801480 <card+0xab>
   2e100:	f0 91 81 14 	lds	r31, 0x1481	; 0x801481 <card+0xac>
   2e104:	83 e2       	ldi	r24, 0x23	; 35
   2e106:	de 01       	movw	r26, r28
   2e108:	11 96       	adiw	r26, 0x01	; 1
   2e10a:	01 90       	ld	r0, Z+
   2e10c:	0d 92       	st	X+, r0
   2e10e:	8a 95       	dec	r24
   2e110:	e1 f7       	brne	.-8      	; 0x2e10a <CardReader::presort() [clone .constprop.194]+0x2a6>
   2e112:	01 2f       	mov	r16, r17
   2e114:	22 e0       	ldi	r18, 0x02	; 2
   2e116:	50 e0       	ldi	r21, 0x00	; 0
   2e118:	40 e0       	ldi	r20, 0x00	; 0
   2e11a:	be 01       	movw	r22, r28
   2e11c:	6f 5f       	subi	r22, 0xFF	; 255
   2e11e:	7f 4f       	sbci	r23, 0xFF	; 255
   2e120:	8f ed       	ldi	r24, 0xDF	; 223
   2e122:	92 e0       	ldi	r25, 0x02	; 2
   2e124:	0f 94 8a 69 	call	0x2d314	; 0x2d314 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]>
   2e128:	ce 01       	movw	r24, r28
   2e12a:	01 96       	adiw	r24, 0x01	; 1
   2e12c:	0e 94 ab 79 	call	0xf356	; 0xf356 <SdBaseFile::~SdBaseFile()>
   2e130:	ff ce       	rjmp	.-514    	; 0x2df30 <CardReader::presort() [clone .constprop.194]+0xcc>
          char *name2 = LONGEST_FILENAME; // use the string in-place

          // Sort the current pair according to settings.
          if (
          #if HAS_FOLDER_SORTING
            (sdSort == SD_SORT_TIME && _SORT_CMP_TIME_DIR(FOLDER_SORTING)) || (sdSort == SD_SORT_ALPHA && !_SORT_CMP_DIR(FOLDER_SORTING))
   2e132:	86 15       	cp	r24, r6
   2e134:	97 05       	cpc	r25, r7
   2e136:	08 f4       	brcc	.+2      	; 0x2e13a <CardReader::presort() [clone .constprop.194]+0x2d6>
   2e138:	9a cf       	rjmp	.-204    	; 0x2e06e <CardReader::presort() [clone .constprop.194]+0x20a>
            break;
          } else {
            #ifdef SORTING_DUMP
            puts_P(PSTR("shift"));
            #endif
            sort_entries[j] = o2;
   2e13a:	ee a9       	ldd	r30, Y+54	; 0x36
   2e13c:	ff a9       	ldd	r31, Y+55	; 0x37
   2e13e:	53 82       	std	Z+3, r5	; 0x03
   2e140:	42 82       	std	Z+2, r4	; 0x02
   2e142:	0c ad       	ldd	r16, Y+60	; 0x3c
   2e144:	1d ad       	ldd	r17, Y+61	; 0x3d
        bool dir1 = filenameIsDir;
        #endif

        /// find proper place
        uint16_t j = i;
        for (; j > 0; --j){
   2e146:	01 15       	cp	r16, r1
   2e148:	11 05       	cpc	r17, r1
   2e14a:	09 f0       	breq	.+2      	; 0x2e14e <CardReader::presort() [clone .constprop.194]+0x2ea>
   2e14c:	5d cf       	rjmp	.-326    	; 0x2e008 <CardReader::presort() [clone .constprop.194]+0x1a4>
   2e14e:	8f cf       	rjmp	.-226    	; 0x2e06e <CardReader::presort() [clone .constprop.194]+0x20a>
          char *name2 = LONGEST_FILENAME; // use the string in-place

          // Sort the current pair according to settings.
          if (
          #if HAS_FOLDER_SORTING
            (sdSort == SD_SORT_TIME && _SORT_CMP_TIME_DIR(FOLDER_SORTING)) || (sdSort == SD_SORT_ALPHA && !_SORT_CMP_DIR(FOLDER_SORTING))
   2e150:	22 20       	and	r2, r2
   2e152:	99 f3       	breq	.-26     	; 0x2e13a <CardReader::presort() [clone .constprop.194]+0x2d6>
   2e154:	8c cf       	rjmp	.-232    	; 0x2e06e <CardReader::presort() [clone .constprop.194]+0x20a>
   2e156:	31 e0       	ldi	r19, 0x01	; 1
   2e158:	33 12       	cpse	r3, r19
   2e15a:	ef cf       	rjmp	.-34     	; 0x2e13a <CardReader::presort() [clone .constprop.194]+0x2d6>

          getfilename_simple(o2);
          char *name2 = LONGEST_FILENAME; // use the string in-place

          // Sort the current pair according to settings.
          if (
   2e15c:	80 91 23 14 	lds	r24, 0x1423	; 0x801423 <card+0x4e>
   2e160:	28 12       	cpse	r2, r24
   2e162:	07 c0       	rjmp	.+14     	; 0x2e172 <CardReader::presort() [clone .constprop.194]+0x30e>
          #if HAS_FOLDER_SORTING
            (sdSort == SD_SORT_TIME && _SORT_CMP_TIME_DIR(FOLDER_SORTING)) || (sdSort == SD_SORT_ALPHA && !_SORT_CMP_DIR(FOLDER_SORTING))
   2e164:	ce 01       	movw	r24, r28
   2e166:	01 96       	adiw	r24, 0x01	; 1
   2e168:	0f 94 19 aa 	call	0x35432	; 0x35432 <strcasecmp>
   2e16c:	97 fd       	sbrc	r25, 7
   2e16e:	e5 cf       	rjmp	.-54     	; 0x2e13a <CardReader::presort() [clone .constprop.194]+0x2d6>
   2e170:	7e cf       	rjmp	.-260    	; 0x2e06e <CardReader::presort() [clone .constprop.194]+0x20a>
   2e172:	21 10       	cpse	r2, r1
   2e174:	e2 cf       	rjmp	.-60     	; 0x2e13a <CardReader::presort() [clone .constprop.194]+0x2d6>
   2e176:	7b cf       	rjmp	.-266    	; 0x2e06e <CardReader::presort() [clone .constprop.194]+0x20a>

0002e178 <CardReader::chdir(char const*, bool) [clone .constprop.200]>:
  lsDive("",*curDir, NULL, LS_Count);
  //SERIAL_ECHOLN(nrFiles);
  return nrFiles;
}

bool CardReader::chdir(const char * relpath, bool doPresort)
   2e178:	cf 92       	push	r12
   2e17a:	df 92       	push	r13
   2e17c:	ef 92       	push	r14
   2e17e:	ff 92       	push	r15
   2e180:	0f 93       	push	r16
   2e182:	1f 93       	push	r17
   2e184:	cf 93       	push	r28
   2e186:	df 93       	push	r29
   2e188:	cd b7       	in	r28, 0x3d	; 61
   2e18a:	de b7       	in	r29, 0x3e	; 62
   2e18c:	a3 97       	sbiw	r28, 0x23	; 35
   2e18e:	0f b6       	in	r0, 0x3f	; 63
   2e190:	f8 94       	cli
   2e192:	de bf       	out	0x3e, r29	; 62
   2e194:	0f be       	out	0x3f, r0	; 63
   2e196:	cd bf       	out	0x3d, r28	; 61
   2e198:	7c 01       	movw	r14, r24
   2e19a:	06 2f       	mov	r16, r22
 * \brief Base class for SdFile with Print and C++ streams.
 */
class SdBaseFile {
 public:
  /** Create an instance. */
  SdBaseFile() : writeError(false), type_(FAT_FILE_TYPE_CLOSED) {}
   2e19c:	19 82       	std	Y+1, r1	; 0x01
   2e19e:	1c 82       	std	Y+4, r1	; 0x04
{
  SdFile newfile;
  SdFile *parent=&root;

  if(workDir.isOpen())
   2e1a0:	80 91 85 14 	lds	r24, 0x1485	; 0x801485 <card+0xb0>
    parent=&workDir;
   2e1a4:	92 e8       	ldi	r25, 0x82	; 130
   2e1a6:	c9 2e       	mov	r12, r25
   2e1a8:	94 e1       	ldi	r25, 0x14	; 20
   2e1aa:	d9 2e       	mov	r13, r25
bool CardReader::chdir(const char * relpath, bool doPresort)
{
  SdFile newfile;
  SdFile *parent=&root;

  if(workDir.isOpen())
   2e1ac:	81 11       	cpse	r24, r1
   2e1ae:	04 c0       	rjmp	.+8      	; 0x2e1b8 <CardReader::chdir(char const*, bool) [clone .constprop.200]+0x40>
}

bool CardReader::chdir(const char * relpath, bool doPresort)
{
  SdFile newfile;
  SdFile *parent=&root;
   2e1b0:	8d e5       	ldi	r24, 0x5D	; 93
   2e1b2:	c8 2e       	mov	r12, r24
   2e1b4:	84 e1       	ldi	r24, 0x14	; 20
   2e1b6:	d8 2e       	mov	r13, r24
   * OR of flags O_READ, O_WRITE, O_TRUNC, and O_SYNC.
   * \return true for success or false for failure.
   */
  bool open(SdBaseFile& dirFile, // NOLINT
    const char* path, uint8_t oflag) {
    return open(&dirFile, path, oflag);
   2e1b8:	21 e0       	ldi	r18, 0x01	; 1
   2e1ba:	a7 01       	movw	r20, r14
   2e1bc:	b6 01       	movw	r22, r12
   2e1be:	ce 01       	movw	r24, r28
   2e1c0:	01 96       	adiw	r24, 0x01	; 1
   2e1c2:	0f 94 c5 54 	call	0x2a98a	; 0x2a98a <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)>
   2e1c6:	18 2f       	mov	r17, r24

  if(workDir.isOpen())
    parent=&workDir;

  if(!newfile.open(*parent,relpath, O_READ) || ((workDirDepth + 1) >= MAX_DIR_DEPTH))
   2e1c8:	88 23       	and	r24, r24
   2e1ca:	21 f1       	breq	.+72     	; 0x2e214 <CardReader::chdir(char const*, bool) [clone .constprop.200]+0x9c>
   2e1cc:	80 91 77 15 	lds	r24, 0x1577	; 0x801577 <card+0x1a2>
   2e1d0:	85 30       	cpi	r24, 0x05	; 5
   2e1d2:	00 f5       	brcc	.+64     	; 0x2e214 <CardReader::chdir(char const*, bool) [clone .constprop.200]+0x9c>
   SERIAL_ECHOLN(relpath);
   return 0;
  }
  else
  {
    strcpy(dir_names[workDirDepth], relpath);
   2e1d4:	29 e0       	ldi	r18, 0x09	; 9
   2e1d6:	82 9f       	mul	r24, r18
   2e1d8:	c0 01       	movw	r24, r0
   2e1da:	11 24       	eor	r1, r1
   2e1dc:	b7 01       	movw	r22, r14
   2e1de:	89 5d       	subi	r24, 0xD9	; 217
   2e1e0:	9b 4e       	sbci	r25, 0xEB	; 235
   2e1e2:	0f 94 4b aa 	call	0x35496	; 0x35496 <strcpy>
    puts(relpath);
   2e1e6:	c7 01       	movw	r24, r14
   2e1e8:	0f 94 6f aa 	call	0x354de	; 0x354de <puts>

    if (workDirDepth < MAX_DIR_DEPTH) {
   2e1ec:	80 91 77 15 	lds	r24, 0x1577	; 0x801577 <card+0x1a2>
   2e1f0:	86 30       	cpi	r24, 0x06	; 6
   2e1f2:	80 f1       	brcs	.+96     	; 0x2e254 <CardReader::chdir(char const*, bool) [clone .constprop.200]+0xdc>
      for (uint8_t d = ++workDirDepth; d--;)
        workDirParents[d+1] = workDirParents[d];
      workDirParents[0]=*parent;
    }
    workDir=newfile;
   2e1f4:	83 e2       	ldi	r24, 0x23	; 35
   2e1f6:	fe 01       	movw	r30, r28
   2e1f8:	31 96       	adiw	r30, 0x01	; 1
   2e1fa:	a2 e8       	ldi	r26, 0x82	; 130
   2e1fc:	b4 e1       	ldi	r27, 0x14	; 20
   2e1fe:	01 90       	ld	r0, Z+
   2e200:	0d 92       	st	X+, r0
   2e202:	8a 95       	dec	r24
   2e204:	e1 f7       	brne	.-8      	; 0x2e1fe <CardReader::chdir(char const*, bool) [clone .constprop.200]+0x86>

#ifdef SDCARD_SORT_ALPHA
	if (doPresort)
   2e206:	00 23       	and	r16, r16
   2e208:	09 f4       	brne	.+2      	; 0x2e20c <CardReader::chdir(char const*, bool) [clone .constprop.200]+0x94>
   2e20a:	4c c0       	rjmp	.+152    	; 0x2e2a4 <CardReader::chdir(char const*, bool) [clone .constprop.200]+0x12c>
		presort();
   2e20c:	0f 94 32 6f 	call	0x2de64	; 0x2de64 <CardReader::presort() [clone .constprop.194]>
	else
		presort_flag = true;
#endif
	return 1;
   2e210:	10 2f       	mov	r17, r16
   2e212:	0c c0       	rjmp	.+24     	; 0x2e22c <CardReader::chdir(char const*, bool) [clone .constprop.200]+0xb4>
  if(workDir.isOpen())
    parent=&workDir;

  if(!newfile.open(*parent,relpath, O_READ) || ((workDirDepth + 1) >= MAX_DIR_DEPTH))
  {
   SERIAL_ECHO_START;
   2e214:	8e ec       	ldi	r24, 0xCE	; 206
   2e216:	91 ea       	ldi	r25, 0xA1	; 161
   2e218:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   SERIAL_ECHORPGM(_n("Cannot enter subdir: "));////MSG_SD_CANT_ENTER_SUBDIR
   2e21c:	88 e4       	ldi	r24, 0x48	; 72
   2e21e:	9c e6       	ldi	r25, 0x6C	; 108
   2e220:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   SERIAL_ECHOLN(relpath);
   2e224:	c7 01       	movw	r24, r14
   2e226:	0e 94 a1 87 	call	0x10f42	; 0x10f42 <MarlinSerial::println(char const*)>
   return 0;
   2e22a:	10 e0       	ldi	r17, 0x00	; 0
   2e22c:	ce 01       	movw	r24, r28
   2e22e:	01 96       	adiw	r24, 0x01	; 1
   2e230:	0e 94 ab 79 	call	0xf356	; 0xf356 <SdBaseFile::~SdBaseFile()>
	else
		presort_flag = true;
#endif
	return 1;
  }
}
   2e234:	81 2f       	mov	r24, r17
   2e236:	a3 96       	adiw	r28, 0x23	; 35
   2e238:	0f b6       	in	r0, 0x3f	; 63
   2e23a:	f8 94       	cli
   2e23c:	de bf       	out	0x3e, r29	; 62
   2e23e:	0f be       	out	0x3f, r0	; 63
   2e240:	cd bf       	out	0x3d, r28	; 61
   2e242:	df 91       	pop	r29
   2e244:	cf 91       	pop	r28
   2e246:	1f 91       	pop	r17
   2e248:	0f 91       	pop	r16
   2e24a:	ff 90       	pop	r15
   2e24c:	ef 90       	pop	r14
   2e24e:	df 90       	pop	r13
   2e250:	cf 90       	pop	r12
   2e252:	08 95       	ret
  {
    strcpy(dir_names[workDirDepth], relpath);
    puts(relpath);

    if (workDirDepth < MAX_DIR_DEPTH) {
      for (uint8_t d = ++workDirDepth; d--;)
   2e254:	8f 5f       	subi	r24, 0xFF	; 255
   2e256:	80 93 77 15 	sts	0x1577, r24	; 0x801577 <card+0x1a2>
        workDirParents[d+1] = workDirParents[d];
   2e25a:	93 e2       	ldi	r25, 0x23	; 35
  {
    strcpy(dir_names[workDirDepth], relpath);
    puts(relpath);

    if (workDirDepth < MAX_DIR_DEPTH) {
      for (uint8_t d = ++workDirDepth; d--;)
   2e25c:	81 50       	subi	r24, 0x01	; 1
   2e25e:	c8 f0       	brcs	.+50     	; 0x2e292 <CardReader::chdir(char const*, bool) [clone .constprop.200]+0x11a>
        workDirParents[d+1] = workDirParents[d];
   2e260:	28 2f       	mov	r18, r24
   2e262:	30 e0       	ldi	r19, 0x00	; 0
   2e264:	a9 01       	movw	r20, r18
   2e266:	4f 5f       	subi	r20, 0xFF	; 255
   2e268:	5f 4f       	sbci	r21, 0xFF	; 255
   2e26a:	94 9f       	mul	r25, r20
   2e26c:	d0 01       	movw	r26, r0
   2e26e:	95 9f       	mul	r25, r21
   2e270:	b0 0d       	add	r27, r0
   2e272:	11 24       	eor	r1, r1
   2e274:	ab 55       	subi	r26, 0x5B	; 91
   2e276:	bb 4e       	sbci	r27, 0xEB	; 235
   2e278:	92 9f       	mul	r25, r18
   2e27a:	f0 01       	movw	r30, r0
   2e27c:	93 9f       	mul	r25, r19
   2e27e:	f0 0d       	add	r31, r0
   2e280:	11 24       	eor	r1, r1
   2e282:	eb 55       	subi	r30, 0x5B	; 91
   2e284:	fb 4e       	sbci	r31, 0xEB	; 235
   2e286:	29 2f       	mov	r18, r25
   2e288:	01 90       	ld	r0, Z+
   2e28a:	0d 92       	st	X+, r0
   2e28c:	2a 95       	dec	r18
   2e28e:	e1 f7       	brne	.-8      	; 0x2e288 <CardReader::chdir(char const*, bool) [clone .constprop.200]+0x110>
   2e290:	e5 cf       	rjmp	.-54     	; 0x2e25c <CardReader::chdir(char const*, bool) [clone .constprop.200]+0xe4>
      workDirParents[0]=*parent;
   2e292:	83 e2       	ldi	r24, 0x23	; 35
   2e294:	f6 01       	movw	r30, r12
   2e296:	a5 ea       	ldi	r26, 0xA5	; 165
   2e298:	b4 e1       	ldi	r27, 0x14	; 20
   2e29a:	01 90       	ld	r0, Z+
   2e29c:	0d 92       	st	X+, r0
   2e29e:	8a 95       	dec	r24
   2e2a0:	e1 f7       	brne	.-8      	; 0x2e29a <CardReader::chdir(char const*, bool) [clone .constprop.200]+0x122>
   2e2a2:	a8 cf       	rjmp	.-176    	; 0x2e1f4 <CardReader::chdir(char const*, bool) [clone .constprop.200]+0x7c>

#ifdef SDCARD_SORT_ALPHA
	if (doPresort)
		presort();
	else
		presort_flag = true;
   2e2a4:	81 e0       	ldi	r24, 0x01	; 1
   2e2a6:	80 93 26 14 	sts	0x1426, r24	; 0x801426 <card+0x51>
   2e2aa:	c0 cf       	rjmp	.-128    	; 0x2e22c <CardReader::chdir(char const*, bool) [clone .constprop.200]+0xb4>

0002e2ac <CardReader::cdroot(bool) [clone .constprop.193]>:
  }
}

void __attribute__((noinline)) CardReader::cdroot(bool doPresort)
{
  workDir=root;
   2e2ac:	93 e2       	ldi	r25, 0x23	; 35
   2e2ae:	ed e5       	ldi	r30, 0x5D	; 93
   2e2b0:	f4 e1       	ldi	r31, 0x14	; 20
   2e2b2:	a2 e8       	ldi	r26, 0x82	; 130
   2e2b4:	b4 e1       	ldi	r27, 0x14	; 20
   2e2b6:	01 90       	ld	r0, Z+
   2e2b8:	0d 92       	st	X+, r0
   2e2ba:	9a 95       	dec	r25
   2e2bc:	e1 f7       	brne	.-8      	; 0x2e2b6 <CardReader::cdroot(bool) [clone .constprop.193]+0xa>
  workDirDepth = 0;
   2e2be:	10 92 77 15 	sts	0x1577, r1	; 0x801577 <card+0x1a2>
  curDir=&workDir;
   2e2c2:	22 e8       	ldi	r18, 0x82	; 130
   2e2c4:	34 e1       	ldi	r19, 0x14	; 20
   2e2c6:	30 93 81 14 	sts	0x1481, r19	; 0x801481 <card+0xac>
   2e2ca:	20 93 80 14 	sts	0x1480, r18	; 0x801480 <card+0xab>
#ifdef SDCARD_SORT_ALPHA
	if (doPresort)
   2e2ce:	81 11       	cpse	r24, r1
		presort();
   2e2d0:	0d 94 32 6f 	jmp	0x2de64	; 0x2de64 <CardReader::presort() [clone .constprop.194]>
	else
		presort_flag = true;
   2e2d4:	81 e0       	ldi	r24, 0x01	; 1
   2e2d6:	80 93 26 14 	sts	0x1426, r24	; 0x801426 <card+0x51>
#endif
}
   2e2da:	08 95       	ret

0002e2dc <CardReader::diveSubfolder(char const*&) [clone .constprop.198]>:
 *
 * @param[in,out] fileName
 *  expects file name including path
 *  in case of absolute path, file name without path is returned
 */
bool CardReader::diveSubfolder (const char *&fileName)
   2e2dc:	8f 92       	push	r8
   2e2de:	9f 92       	push	r9
   2e2e0:	af 92       	push	r10
   2e2e2:	bf 92       	push	r11
   2e2e4:	cf 92       	push	r12
   2e2e6:	df 92       	push	r13
   2e2e8:	ef 92       	push	r14
   2e2ea:	ff 92       	push	r15
   2e2ec:	0f 93       	push	r16
   2e2ee:	1f 93       	push	r17
   2e2f0:	cf 93       	push	r28
   2e2f2:	df 93       	push	r29
   2e2f4:	cd b7       	in	r28, 0x3d	; 61
   2e2f6:	de b7       	in	r29, 0x3e	; 62
   2e2f8:	2d 97       	sbiw	r28, 0x0d	; 13
   2e2fa:	0f b6       	in	r0, 0x3f	; 63
   2e2fc:	f8 94       	cli
   2e2fe:	de bf       	out	0x3e, r29	; 62
   2e300:	0f be       	out	0x3f, r0	; 63
   2e302:	cd bf       	out	0x3d, r28	; 61
{
    curDir=&root;
   2e304:	2d e5       	ldi	r18, 0x5D	; 93
   2e306:	34 e1       	ldi	r19, 0x14	; 20
   2e308:	30 93 81 14 	sts	0x1481, r19	; 0x801481 <card+0xac>
   2e30c:	20 93 80 14 	sts	0x1480, r18	; 0x801480 <card+0xab>
    if (!fileName)
   2e310:	dc 01       	movw	r26, r24
   2e312:	ed 91       	ld	r30, X+
   2e314:	fc 91       	ld	r31, X
   2e316:	30 97       	sbiw	r30, 0x00	; 0
   2e318:	a1 f4       	brne	.+40     	; 0x2e342 <CardReader::diveSubfolder(char const*&) [clone .constprop.198]+0x66>
    }
    else //relative path
    {
        curDir = &workDir;
    }
    return 1;
   2e31a:	81 e0       	ldi	r24, 0x01	; 1
}
   2e31c:	2d 96       	adiw	r28, 0x0d	; 13
   2e31e:	0f b6       	in	r0, 0x3f	; 63
   2e320:	f8 94       	cli
   2e322:	de bf       	out	0x3e, r29	; 62
   2e324:	0f be       	out	0x3f, r0	; 63
   2e326:	cd bf       	out	0x3d, r28	; 61
   2e328:	df 91       	pop	r29
   2e32a:	cf 91       	pop	r28
   2e32c:	1f 91       	pop	r17
   2e32e:	0f 91       	pop	r16
   2e330:	ff 90       	pop	r15
   2e332:	ef 90       	pop	r14
   2e334:	df 90       	pop	r13
   2e336:	cf 90       	pop	r12
   2e338:	bf 90       	pop	r11
   2e33a:	af 90       	pop	r10
   2e33c:	9f 90       	pop	r9
   2e33e:	8f 90       	pop	r8
   2e340:	08 95       	ret
    curDir=&root;
    if (!fileName)
        return 1;

    const char *dirname_start, *dirname_end;
    if (fileName[0] == '/') // absolute path
   2e342:	20 81       	ld	r18, Z
   2e344:	2f 32       	cpi	r18, 0x2F	; 47
   2e346:	09 f0       	breq	.+2      	; 0x2e34a <CardReader::diveSubfolder(char const*&) [clone .constprop.198]+0x6e>
   2e348:	47 c0       	rjmp	.+142    	; 0x2e3d8 <CardReader::diveSubfolder(char const*&) [clone .constprop.198]+0xfc>
   2e34a:	6c 01       	movw	r12, r24
    {
        cdroot(false);
   2e34c:	80 e0       	ldi	r24, 0x00	; 0
   2e34e:	0f 94 56 71 	call	0x2e2ac	; 0x2e2ac <CardReader::cdroot(bool) [clone .constprop.193]>
        dirname_start = fileName + 1;
   2e352:	f6 01       	movw	r30, r12
   2e354:	00 81       	ld	r16, Z
   2e356:	11 81       	ldd	r17, Z+1	; 0x01
   2e358:	0f 5f       	subi	r16, 0xFF	; 255
   2e35a:	1f 4f       	sbci	r17, 0xFF	; 255
                strncpy(subdirname, dirname_start, len);
                subdirname[len] = 0;
                if (!chdir(subdirname, false))
                    return 0;

                curDir = &workDir;
   2e35c:	92 e8       	ldi	r25, 0x82	; 130
   2e35e:	89 2e       	mov	r8, r25
   2e360:	94 e1       	ldi	r25, 0x14	; 20
   2e362:	99 2e       	mov	r9, r25
    const char *dirname_start, *dirname_end;
    if (fileName[0] == '/') // absolute path
    {
        cdroot(false);
        dirname_start = fileName + 1;
        while (*dirname_start)
   2e364:	d8 01       	movw	r26, r16
   2e366:	8c 91       	ld	r24, X
   2e368:	88 23       	and	r24, r24
   2e36a:	b9 f2       	breq	.-82     	; 0x2e31a <CardReader::diveSubfolder(char const*&) [clone .constprop.198]+0x3e>
        {
            dirname_end = strchr(dirname_start, '/');
   2e36c:	6f e2       	ldi	r22, 0x2F	; 47
   2e36e:	70 e0       	ldi	r23, 0x00	; 0
   2e370:	c8 01       	movw	r24, r16
   2e372:	0f 94 37 aa 	call	0x3546e	; 0x3546e <strchr>
   2e376:	5c 01       	movw	r10, r24
            //SERIAL_ECHO("start:");SERIAL_ECHOLN((int)(dirname_start-name));
            //SERIAL_ECHO("end  :");SERIAL_ECHOLN((int)(dirname_end-name));
            if (dirname_end && dirname_end > dirname_start)
   2e378:	00 97       	sbiw	r24, 0x00	; 0
   2e37a:	51 f1       	breq	.+84     	; 0x2e3d0 <CardReader::diveSubfolder(char const*&) [clone .constprop.198]+0xf4>
   2e37c:	08 17       	cp	r16, r24
   2e37e:	19 07       	cpc	r17, r25
   2e380:	38 f5       	brcc	.+78     	; 0x2e3d0 <CardReader::diveSubfolder(char const*&) [clone .constprop.198]+0xf4>
            {
                const size_t maxLen = 12;
                char subdirname[maxLen+1];
                const size_t len = ((static_cast<size_t>(dirname_end-dirname_start))>maxLen) ? maxLen : (dirname_end-dirname_start);
   2e382:	7c 01       	movw	r14, r24
   2e384:	e0 1a       	sub	r14, r16
   2e386:	f1 0a       	sbc	r15, r17
   2e388:	bd e0       	ldi	r27, 0x0D	; 13
   2e38a:	eb 16       	cp	r14, r27
   2e38c:	f1 04       	cpc	r15, r1
   2e38e:	18 f0       	brcs	.+6      	; 0x2e396 <CardReader::diveSubfolder(char const*&) [clone .constprop.198]+0xba>
   2e390:	8c e0       	ldi	r24, 0x0C	; 12
   2e392:	e8 2e       	mov	r14, r24
   2e394:	f1 2c       	mov	r15, r1
                strncpy(subdirname, dirname_start, len);
   2e396:	a7 01       	movw	r20, r14
   2e398:	b8 01       	movw	r22, r16
   2e39a:	ce 01       	movw	r24, r28
   2e39c:	01 96       	adiw	r24, 0x01	; 1
   2e39e:	0f 94 60 aa 	call	0x354c0	; 0x354c0 <strncpy>
                subdirname[len] = 0;
   2e3a2:	e1 e0       	ldi	r30, 0x01	; 1
   2e3a4:	f0 e0       	ldi	r31, 0x00	; 0
   2e3a6:	ec 0f       	add	r30, r28
   2e3a8:	fd 1f       	adc	r31, r29
   2e3aa:	ee 0d       	add	r30, r14
   2e3ac:	ff 1d       	adc	r31, r15
   2e3ae:	10 82       	st	Z, r1
                if (!chdir(subdirname, false))
   2e3b0:	60 e0       	ldi	r22, 0x00	; 0
   2e3b2:	ce 01       	movw	r24, r28
   2e3b4:	01 96       	adiw	r24, 0x01	; 1
   2e3b6:	0f 94 bc 70 	call	0x2e178	; 0x2e178 <CardReader::chdir(char const*, bool) [clone .constprop.200]>
   2e3ba:	88 23       	and	r24, r24
   2e3bc:	09 f4       	brne	.+2      	; 0x2e3c0 <CardReader::diveSubfolder(char const*&) [clone .constprop.198]+0xe4>
   2e3be:	ae cf       	rjmp	.-164    	; 0x2e31c <CardReader::diveSubfolder(char const*&) [clone .constprop.198]+0x40>
                    return 0;

                curDir = &workDir;
   2e3c0:	90 92 81 14 	sts	0x1481, r9	; 0x801481 <card+0xac>
   2e3c4:	80 92 80 14 	sts	0x1480, r8	; 0x801480 <card+0xab>
                dirname_start = dirname_end + 1;
   2e3c8:	85 01       	movw	r16, r10
   2e3ca:	0f 5f       	subi	r16, 0xFF	; 255
   2e3cc:	1f 4f       	sbci	r17, 0xFF	; 255
   2e3ce:	ca cf       	rjmp	.-108    	; 0x2e364 <CardReader::diveSubfolder(char const*&) [clone .constprop.198]+0x88>
            }
            else // the reminder after all /fsa/fdsa/ is the filename
            {
                fileName = dirname_start;
   2e3d0:	f6 01       	movw	r30, r12
   2e3d2:	11 83       	std	Z+1, r17	; 0x01
   2e3d4:	00 83       	st	Z, r16
   2e3d6:	a1 cf       	rjmp	.-190    	; 0x2e31a <CardReader::diveSubfolder(char const*&) [clone .constprop.198]+0x3e>

        }
    }
    else //relative path
    {
        curDir = &workDir;
   2e3d8:	82 e8       	ldi	r24, 0x82	; 130
   2e3da:	94 e1       	ldi	r25, 0x14	; 20
   2e3dc:	90 93 81 14 	sts	0x1481, r25	; 0x801481 <card+0xac>
   2e3e0:	80 93 80 14 	sts	0x1480, r24	; 0x801480 <card+0xab>
   2e3e4:	9a cf       	rjmp	.-204    	; 0x2e31a <CardReader::diveSubfolder(char const*&) [clone .constprop.198]+0x3e>

0002e3e6 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]>:
static const char ofSize[] PROGMEM = " Size: ";
static const char ofFileSelected[] PROGMEM = "File selected";
static const char ofSDPrinting[] PROGMEM = "SD-PRINTING";
static const char ofWritingToFile[] PROGMEM = "Writing to file: ";

void CardReader::openFileReadFilteredGcode(const char* name, bool replace_current/* = false*/){
   2e3e6:	bf 92       	push	r11
   2e3e8:	cf 92       	push	r12
   2e3ea:	df 92       	push	r13
   2e3ec:	ef 92       	push	r14
   2e3ee:	ff 92       	push	r15
   2e3f0:	0f 93       	push	r16
   2e3f2:	1f 93       	push	r17
   2e3f4:	cf 93       	push	r28
   2e3f6:	df 93       	push	r29
   2e3f8:	1f 92       	push	r1
   2e3fa:	1f 92       	push	r1
   2e3fc:	cd b7       	in	r28, 0x3d	; 61
   2e3fe:	de b7       	in	r29, 0x3e	; 62
    if(!mounted)
   2e400:	20 91 d8 13 	lds	r18, 0x13D8	; 0x8013d8 <card+0x3>
   2e404:	22 23       	and	r18, r18
   2e406:	09 f4       	brne	.+2      	; 0x2e40a <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]+0x24>
   2e408:	ef c0       	rjmp	.+478    	; 0x2e5e8 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]+0x202>
   2e40a:	7c 01       	movw	r14, r24
        return;

    if(file.isOpen()){  //replacing current file by new file, or subfile call
   2e40c:	80 91 6a 16 	lds	r24, 0x166A	; 0x80166a <card+0x295>
   2e410:	88 23       	and	r24, r24
   2e412:	09 f4       	brne	.+2      	; 0x2e416 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]+0x30>
   2e414:	04 c1       	rjmp	.+520    	; 0x2e61e <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]+0x238>
        if(!replace_current){
   2e416:	61 11       	cpse	r22, r1
   2e418:	f6 c0       	rjmp	.+492    	; 0x2e606 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]+0x220>
            if((int)file_subcall_ctr>(int)SD_PROCEDURE_DEPTH-1){
   2e41a:	d0 90 8a 16 	lds	r13, 0x168A	; 0x80168a <card+0x2b5>
   2e41e:	dd 20       	and	r13, r13
   2e420:	21 f0       	breq	.+8      	; 0x2e42a <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]+0x44>
                // SERIAL_ERROR_START;
                // SERIAL_ERRORPGM("trying to call sub-gcode files with too many levels. MAX level is:");
                // SERIAL_ERRORLN(SD_PROCEDURE_DEPTH);
                kill(ofKill);
   2e422:	88 e9       	ldi	r24, 0x98	; 152
   2e424:	90 ea       	ldi	r25, 0xA0	; 160
   2e426:	0e 94 23 83 	call	0x10646	; 0x10646 <kill(char const*)>
                return;
            }

            SERIAL_ECHO_START;
   2e42a:	8e ec       	ldi	r24, 0xCE	; 206
   2e42c:	91 ea       	ldi	r25, 0xA1	; 161
   2e42e:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
            SERIAL_ECHORPGM(ofSubroutineCallTgt);
   2e432:	8f e7       	ldi	r24, 0x7F	; 127
   2e434:	90 ea       	ldi	r25, 0xA0	; 160
   2e436:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   2e43a:	c7 01       	movw	r24, r14
   2e43c:	0e 94 95 87 	call	0x10f2a	; 0x10f2a <MarlinSerial::write(char const*)>
            SERIAL_ECHO(name);
            SERIAL_ECHORPGM(ofParent);
   2e440:	84 e7       	ldi	r24, 0x74	; 116
   2e442:	90 ea       	ldi	r25, 0xA0	; 160
   2e444:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>

            //store current filename and position
            getAbsFilename(filenames[file_subcall_ctr]);
   2e448:	00 91 8a 16 	lds	r16, 0x168A	; 0x80168a <card+0x2b5>
   2e44c:	25 e5       	ldi	r18, 0x55	; 85
   2e44e:	02 9f       	mul	r16, r18
   2e450:	80 01       	movw	r16, r0
   2e452:	11 24       	eor	r1, r1
}

void CardReader::getAbsFilename(char *t)
{
  uint8_t cnt=0;
  *t='/';t++;cnt++;
   2e454:	01 57       	subi	r16, 0x71	; 113
   2e456:	19 4e       	sbci	r17, 0xE9	; 233
   2e458:	8f e2       	ldi	r24, 0x2F	; 47
   2e45a:	f8 01       	movw	r30, r16
   2e45c:	81 93       	st	Z+, r24
   2e45e:	8f 01       	movw	r16, r30
   2e460:	cc 24       	eor	r12, r12
   2e462:	c3 94       	inc	r12
  for(uint8_t i=0;i<workDirDepth;i++)
  {
    workDirParents[i].getFilename(t); //SDBaseFile.getfilename!
   2e464:	83 e2       	ldi	r24, 0x23	; 35
   2e466:	b8 2e       	mov	r11, r24

void CardReader::getAbsFilename(char *t)
{
  uint8_t cnt=0;
  *t='/';t++;cnt++;
  for(uint8_t i=0;i<workDirDepth;i++)
   2e468:	80 91 77 15 	lds	r24, 0x1577	; 0x801577 <card+0x1a2>
   2e46c:	d8 16       	cp	r13, r24
   2e46e:	b0 f4       	brcc	.+44     	; 0x2e49c <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]+0xb6>
  {
    workDirParents[i].getFilename(t); //SDBaseFile.getfilename!
   2e470:	db 9c       	mul	r13, r11
   2e472:	c0 01       	movw	r24, r0
   2e474:	11 24       	eor	r1, r1
   2e476:	b8 01       	movw	r22, r16
   2e478:	8b 55       	subi	r24, 0x5B	; 91
   2e47a:	9b 4e       	sbci	r25, 0xEB	; 235
   2e47c:	0f 94 f2 2e 	call	0x25de4	; 0x25de4 <SdBaseFile::getFilename(char*)>
   2e480:	c8 01       	movw	r24, r16
   2e482:	8c 01       	movw	r16, r24
   2e484:	01 96       	adiw	r24, 0x01	; 1
    while(*t!=0 && cnt< MAXPATHNAMELENGTH)
   2e486:	f8 01       	movw	r30, r16
   2e488:	20 81       	ld	r18, Z
   2e48a:	22 23       	and	r18, r18
   2e48c:	29 f0       	breq	.+10     	; 0x2e498 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]+0xb2>
   2e48e:	f4 e5       	ldi	r31, 0x54	; 84
   2e490:	fc 15       	cp	r31, r12
   2e492:	10 f0       	brcs	.+4      	; 0x2e498 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]+0xb2>
    {t++;cnt++;}  //crawl counter forward.
   2e494:	c3 94       	inc	r12
   2e496:	f5 cf       	rjmp	.-22     	; 0x2e482 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]+0x9c>

void CardReader::getAbsFilename(char *t)
{
  uint8_t cnt=0;
  *t='/';t++;cnt++;
  for(uint8_t i=0;i<workDirDepth;i++)
   2e498:	d3 94       	inc	r13
   2e49a:	e6 cf       	rjmp	.-52     	; 0x2e468 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]+0x82>
  {
    workDirParents[i].getFilename(t); //SDBaseFile.getfilename!
    while(*t!=0 && cnt< MAXPATHNAMELENGTH)
    {t++;cnt++;}  //crawl counter forward.
  }
  if(cnt < MAXPATHNAMELENGTH - FILENAME_LENGTH)
   2e49c:	27 e4       	ldi	r18, 0x47	; 71
   2e49e:	2c 15       	cp	r18, r12
   2e4a0:	08 f4       	brcc	.+2      	; 0x2e4a4 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]+0xbe>
   2e4a2:	ae c0       	rjmp	.+348    	; 0x2e600 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]+0x21a>
    file.getFilename(t);
   2e4a4:	b8 01       	movw	r22, r16
   2e4a6:	87 e6       	ldi	r24, 0x67	; 103
   2e4a8:	96 e1       	ldi	r25, 0x16	; 22
   2e4aa:	0f 94 f2 2e 	call	0x25de4	; 0x25de4 <SdBaseFile::getFilename(char*)>
            SERIAL_ECHORPGM(ofParent);

            //store current filename and position
            getAbsFilename(filenames[file_subcall_ctr]);

            SERIAL_ECHO(filenames[file_subcall_ctr]);
   2e4ae:	80 91 8a 16 	lds	r24, 0x168A	; 0x80168a <card+0x2b5>
   2e4b2:	f5 e5       	ldi	r31, 0x55	; 85
   2e4b4:	8f 9f       	mul	r24, r31
   2e4b6:	c0 01       	movw	r24, r0
   2e4b8:	11 24       	eor	r1, r1
   2e4ba:	81 57       	subi	r24, 0x71	; 113
   2e4bc:	99 4e       	sbci	r25, 0xE9	; 233
   2e4be:	0e 94 95 87 	call	0x10f2a	; 0x10f2a <MarlinSerial::write(char const*)>
            SERIAL_ECHORPGM(ofPos);
   2e4c2:	8e e6       	ldi	r24, 0x6E	; 110
   2e4c4:	90 ea       	ldi	r25, 0xA0	; 160
   2e4c6:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
}

void MarlinSerial::print(unsigned long n, int base)
{
  if (base == 0) write(n);
  else printNumber(n, base);
   2e4ca:	60 91 eb 16 	lds	r22, 0x16EB	; 0x8016eb <card+0x316>
   2e4ce:	70 91 ec 16 	lds	r23, 0x16EC	; 0x8016ec <card+0x317>
   2e4d2:	80 91 ed 16 	lds	r24, 0x16ED	; 0x8016ed <card+0x318>
   2e4d6:	90 91 ee 16 	lds	r25, 0x16EE	; 0x8016ee <card+0x319>
   2e4da:	4a e0       	ldi	r20, 0x0A	; 10
   2e4dc:	0e 94 c5 79 	call	0xf38a	; 0xf38a <MarlinSerial::printNumber(unsigned long, unsigned char)>
}

void MarlinSerial::println(unsigned long n, int base)
{
  print(n, base);
  println();
   2e4e0:	0e 94 bc 7a 	call	0xf578	; 0xf578 <MarlinSerial::println()>
            SERIAL_ECHOLN(sdpos);
            filespos[file_subcall_ctr]=sdpos;
   2e4e4:	80 91 8a 16 	lds	r24, 0x168A	; 0x80168a <card+0x2b5>
   2e4e8:	24 e0       	ldi	r18, 0x04	; 4
   2e4ea:	82 9f       	mul	r24, r18
   2e4ec:	f0 01       	movw	r30, r0
   2e4ee:	11 24       	eor	r1, r1
   2e4f0:	e5 57       	subi	r30, 0x75	; 117
   2e4f2:	f9 4e       	sbci	r31, 0xE9	; 233
   2e4f4:	40 91 eb 16 	lds	r20, 0x16EB	; 0x8016eb <card+0x316>
   2e4f8:	50 91 ec 16 	lds	r21, 0x16EC	; 0x8016ec <card+0x317>
   2e4fc:	60 91 ed 16 	lds	r22, 0x16ED	; 0x8016ed <card+0x318>
   2e500:	70 91 ee 16 	lds	r23, 0x16EE	; 0x8016ee <card+0x319>
   2e504:	40 83       	st	Z, r20
   2e506:	51 83       	std	Z+1, r21	; 0x01
   2e508:	62 83       	std	Z+2, r22	; 0x02
   2e50a:	73 83       	std	Z+3, r23	; 0x03
            file_subcall_ctr++;
   2e50c:	8f 5f       	subi	r24, 0xFF	; 255
   2e50e:	80 93 8a 16 	sts	0x168A, r24	; 0x80168a <card+0x2b5>
        } else {
            SERIAL_ECHO_START;
            SERIAL_ECHORPGM(ofNowDoingFile);
            SERIAL_ECHOLN(name);
        }
        file.close();
   2e512:	87 e6       	ldi	r24, 0x67	; 103
   2e514:	96 e1       	ldi	r25, 0x16	; 22
   2e516:	0f 94 e9 2e 	call	0x25dd2	; 0x25dd2 <SdBaseFile::close()>
        file_subcall_ctr=0; //resetting procedure depth in case user cancels print while in procedure
        SERIAL_ECHO_START;
        SERIAL_ECHORPGM(ofNowFreshFile);
        SERIAL_ECHOLN(name);
    }
    sdprinting = false;
   2e51a:	10 92 d7 13 	sts	0x13D7, r1	; 0x8013d7 <card+0x2>

    const char *fname=name;
   2e51e:	fa 82       	std	Y+2, r15	; 0x02
   2e520:	e9 82       	std	Y+1, r14	; 0x01
    if (!diveSubfolder(fname))
   2e522:	ce 01       	movw	r24, r28
   2e524:	01 96       	adiw	r24, 0x01	; 1
   2e526:	0f 94 6e 71 	call	0x2e2dc	; 0x2e2dc <CardReader::diveSubfolder(char const*&) [clone .constprop.198]>
   2e52a:	88 23       	and	r24, r24
   2e52c:	09 f4       	brne	.+2      	; 0x2e530 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]+0x14a>
   2e52e:	5c c0       	rjmp	.+184    	; 0x2e5e8 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]+0x202>
 */
SdFile::SdFile(const char* path, uint8_t oflag) : SdBaseFile(path, oflag) {
}

bool SdFile::openFilteredGcode(SdBaseFile* dirFile, const char* path){
    if( open(dirFile, path, O_READ) ){
   2e530:	49 81       	ldd	r20, Y+1	; 0x01
   2e532:	5a 81       	ldd	r21, Y+2	; 0x02
   2e534:	60 91 80 14 	lds	r22, 0x1480	; 0x801480 <card+0xab>
   2e538:	70 91 81 14 	lds	r23, 0x1481	; 0x801481 <card+0xac>
   2e53c:	21 e0       	ldi	r18, 0x01	; 1
   2e53e:	87 e6       	ldi	r24, 0x67	; 103
   2e540:	96 e1       	ldi	r25, 0x16	; 22
   2e542:	0f 94 c5 54 	call	0x2a98a	; 0x2a98a <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)>
   2e546:	88 23       	and	r24, r24
   2e548:	09 f4       	brne	.+2      	; 0x2e54c <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]+0x166>
   2e54a:	77 c0       	rjmp	.+238    	; 0x2e63a <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]+0x254>
        // compute the block to start with
        if( ! gfComputeNextFileBlock() )
   2e54c:	87 e6       	ldi	r24, 0x67	; 103
   2e54e:	96 e1       	ldi	r25, 0x16	; 22
   2e550:	0f 94 92 2c 	call	0x25924	; 0x25924 <SdFile::gfComputeNextFileBlock()>
   2e554:	88 23       	and	r24, r24
   2e556:	09 f4       	brne	.+2      	; 0x2e55a <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]+0x174>
   2e558:	70 c0       	rjmp	.+224    	; 0x2e63a <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]+0x254>
    return vol_->cache()->data; // this is constant for the whole time, so it should be fast and sleek
}

void SdFile::gfReset(){
    // reset cache read ptr to its begin
    gfReadPtr = gfBlockBuffBegin() + gfOffset;
   2e55a:	80 91 88 16 	lds	r24, 0x1688	; 0x801688 <card+0x2b3>
   2e55e:	90 91 89 16 	lds	r25, 0x1689	; 0x801689 <card+0x2b4>
   2e562:	8a 5b       	subi	r24, 0xBA	; 186
   2e564:	91 4f       	sbci	r25, 0xF1	; 241
   2e566:	90 93 83 16 	sts	0x1683, r25	; 0x801683 <card+0x2ae>
   2e56a:	80 93 82 16 	sts	0x1682, r24	; 0x801682 <card+0x2ad>
      return;

    if (file.openFilteredGcode(curDir, fname)) {
        getfilename(0, fname);
   2e56e:	89 81       	ldd	r24, Y+1	; 0x01
   2e570:	9a 81       	ldd	r25, Y+2	; 0x02
   2e572:	0f 94 b9 6b 	call	0x2d772	; 0x2d772 <CardReader::getfilename(unsigned int, char const*) [clone .constprop.235]>
        filesize = file.fileSize();
   2e576:	80 91 78 16 	lds	r24, 0x1678	; 0x801678 <card+0x2a3>
   2e57a:	90 91 79 16 	lds	r25, 0x1679	; 0x801679 <card+0x2a4>
   2e57e:	a0 91 7a 16 	lds	r26, 0x167A	; 0x80167a <card+0x2a5>
   2e582:	b0 91 7b 16 	lds	r27, 0x167B	; 0x80167b <card+0x2a6>
   2e586:	80 93 e4 16 	sts	0x16E4, r24	; 0x8016e4 <card+0x30f>
   2e58a:	90 93 e5 16 	sts	0x16E5, r25	; 0x8016e5 <card+0x310>
   2e58e:	a0 93 e6 16 	sts	0x16E6, r26	; 0x8016e6 <card+0x311>
   2e592:	b0 93 e7 16 	sts	0x16E7, r27	; 0x8016e7 <card+0x312>
        SERIAL_PROTOCOLRPGM(ofFileOpened);////MSG_SD_FILE_OPENED
   2e596:	8e e3       	ldi	r24, 0x3E	; 62
   2e598:	90 ea       	ldi	r25, 0xA0	; 160
   2e59a:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        printAbsFilenameFast();
   2e59e:	0f 94 9c 6c 	call	0x2d938	; 0x2d938 <CardReader::printAbsFilenameFast() [clone .constprop.226]>
        SERIAL_PROTOCOLRPGM(ofSize);////MSG_SD_SIZE
   2e5a2:	86 e3       	ldi	r24, 0x36	; 54
   2e5a4:	90 ea       	ldi	r25, 0xA0	; 160
   2e5a6:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
}

void MarlinSerial::print(unsigned long n, int base)
{
  if (base == 0) write(n);
  else printNumber(n, base);
   2e5aa:	60 91 e4 16 	lds	r22, 0x16E4	; 0x8016e4 <card+0x30f>
   2e5ae:	70 91 e5 16 	lds	r23, 0x16E5	; 0x8016e5 <card+0x310>
   2e5b2:	80 91 e6 16 	lds	r24, 0x16E6	; 0x8016e6 <card+0x311>
   2e5b6:	90 91 e7 16 	lds	r25, 0x16E7	; 0x8016e7 <card+0x312>
   2e5ba:	4a e0       	ldi	r20, 0x0A	; 10
   2e5bc:	0e 94 c5 79 	call	0xf38a	; 0xf38a <MarlinSerial::printNumber(unsigned long, unsigned char)>
}

void MarlinSerial::println(unsigned long n, int base)
{
  print(n, base);
  println();
   2e5c0:	0e 94 bc 7a 	call	0xf578	; 0xf578 <MarlinSerial::println()>
        SERIAL_PROTOCOLLN(filesize);
        sdpos = 0;
   2e5c4:	10 92 eb 16 	sts	0x16EB, r1	; 0x8016eb <card+0x316>
   2e5c8:	10 92 ec 16 	sts	0x16EC, r1	; 0x8016ec <card+0x317>
   2e5cc:	10 92 ed 16 	sts	0x16ED, r1	; 0x8016ed <card+0x318>
   2e5d0:	10 92 ee 16 	sts	0x16EE, r1	; 0x8016ee <card+0x319>

        SERIAL_PROTOCOLLNRPGM(ofFileSelected);////MSG_SD_FILE_SELECTED
   2e5d4:	88 e2       	ldi	r24, 0x28	; 40
   2e5d6:	90 ea       	ldi	r25, 0xA0	; 160
   2e5d8:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
        lcd_setstatuspgm(ofFileSelected);
   2e5dc:	88 e2       	ldi	r24, 0x28	; 40
   2e5de:	90 ea       	ldi	r25, 0xA0	; 160
   2e5e0:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
        scrollstuff = 0;
   2e5e4:	10 92 62 0d 	sts	0x0D62, r1	; 0x800d62 <scrollstuff>
      } else {
        SERIAL_PROTOCOLRPGM(MSG_SD_OPEN_FILE_FAIL);
        SERIAL_PROTOCOL(fname);
        SERIAL_PROTOCOLLN('.');
      }
}
   2e5e8:	0f 90       	pop	r0
   2e5ea:	0f 90       	pop	r0
   2e5ec:	df 91       	pop	r29
   2e5ee:	cf 91       	pop	r28
   2e5f0:	1f 91       	pop	r17
   2e5f2:	0f 91       	pop	r16
   2e5f4:	ff 90       	pop	r15
   2e5f6:	ef 90       	pop	r14
   2e5f8:	df 90       	pop	r13
   2e5fa:	cf 90       	pop	r12
   2e5fc:	bf 90       	pop	r11
   2e5fe:	08 95       	ret
    {t++;cnt++;}  //crawl counter forward.
  }
  if(cnt < MAXPATHNAMELENGTH - FILENAME_LENGTH)
    file.getFilename(t);
  else
    t[0]=0;
   2e600:	f8 01       	movw	r30, r16
   2e602:	10 82       	st	Z, r1
   2e604:	54 cf       	rjmp	.-344    	; 0x2e4ae <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]+0xc8>
            SERIAL_ECHORPGM(ofPos);
            SERIAL_ECHOLN(sdpos);
            filespos[file_subcall_ctr]=sdpos;
            file_subcall_ctr++;
        } else {
            SERIAL_ECHO_START;
   2e606:	8e ec       	ldi	r24, 0xCE	; 206
   2e608:	91 ea       	ldi	r25, 0xA1	; 161
   2e60a:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
            SERIAL_ECHORPGM(ofNowDoingFile);
   2e60e:	8d e5       	ldi	r24, 0x5D	; 93
   2e610:	90 ea       	ldi	r25, 0xA0	; 160
   2e612:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
            SERIAL_ECHOLN(name);
   2e616:	c7 01       	movw	r24, r14
   2e618:	0e 94 a1 87 	call	0x10f42	; 0x10f42 <MarlinSerial::println(char const*)>
   2e61c:	7a cf       	rjmp	.-268    	; 0x2e512 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]+0x12c>
        }
        file.close();
    } else { //opening fresh file
        file_subcall_ctr=0; //resetting procedure depth in case user cancels print while in procedure
   2e61e:	10 92 8a 16 	sts	0x168A, r1	; 0x80168a <card+0x2b5>
        SERIAL_ECHO_START;
   2e622:	8e ec       	ldi	r24, 0xCE	; 206
   2e624:	91 ea       	ldi	r25, 0xA1	; 161
   2e626:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        SERIAL_ECHORPGM(ofNowFreshFile);
   2e62a:	8c e4       	ldi	r24, 0x4C	; 76
   2e62c:	90 ea       	ldi	r25, 0xA0	; 160
   2e62e:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        SERIAL_ECHOLN(name);
   2e632:	c7 01       	movw	r24, r14
   2e634:	0e 94 a1 87 	call	0x10f42	; 0x10f42 <MarlinSerial::println(char const*)>
   2e638:	70 cf       	rjmp	.-288    	; 0x2e51a <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]+0x134>

        SERIAL_PROTOCOLLNRPGM(ofFileSelected);////MSG_SD_FILE_SELECTED
        lcd_setstatuspgm(ofFileSelected);
        scrollstuff = 0;
      } else {
        SERIAL_PROTOCOLRPGM(MSG_SD_OPEN_FILE_FAIL);
   2e63a:	84 e3       	ldi	r24, 0x34	; 52
   2e63c:	9c e6       	ldi	r25, 0x6C	; 108
   2e63e:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   2e642:	89 81       	ldd	r24, Y+1	; 0x01
   2e644:	9a 81       	ldd	r25, Y+2	; 0x02
   2e646:	0e 94 95 87 	call	0x10f2a	; 0x10f2a <MarlinSerial::write(char const*)>
}

void MarlinSerial::print(long n, int base)
{
  if (base == 0) {
    write(n);
   2e64a:	8e e2       	ldi	r24, 0x2E	; 46
   2e64c:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
}

void MarlinSerial::println(char c, int base)
{
  print(c, base);
  println();
   2e650:	0e 94 bc 7a 	call	0xf578	; 0xf578 <MarlinSerial::println()>
   2e654:	c9 cf       	rjmp	.-110    	; 0x2e5e8 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]+0x202>

0002e656 <CardReader::printingHasFinished() [clone .constprop.196]>:



void CardReader::printingHasFinished()
{
    st_synchronize();
   2e656:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
    file.close();
   2e65a:	87 e6       	ldi	r24, 0x67	; 103
   2e65c:	96 e1       	ldi	r25, 0x16	; 22
   2e65e:	0f 94 e9 2e 	call	0x25dd2	; 0x25dd2 <SdBaseFile::close()>

    if(file_subcall_ctr>0) //heading up to a parent file that called current as a procedure.
   2e662:	80 91 8a 16 	lds	r24, 0x168A	; 0x80168a <card+0x2b5>
   2e666:	88 23       	and	r24, r24
   2e668:	69 f1       	breq	.+90     	; 0x2e6c4 <CardReader::printingHasFinished() [clone .constprop.196]+0x6e>
    {
      file_subcall_ctr--;
   2e66a:	81 50       	subi	r24, 0x01	; 1
   2e66c:	80 93 8a 16 	sts	0x168A, r24	; 0x80168a <card+0x2b5>
      openFileReadFilteredGcode(filenames[file_subcall_ctr],true);
   2e670:	25 e5       	ldi	r18, 0x55	; 85
   2e672:	82 9f       	mul	r24, r18
   2e674:	c0 01       	movw	r24, r0
   2e676:	11 24       	eor	r1, r1
   2e678:	61 e0       	ldi	r22, 0x01	; 1
   2e67a:	81 57       	subi	r24, 0x71	; 113
   2e67c:	99 4e       	sbci	r25, 0xE9	; 233
   2e67e:	0f 94 f3 71 	call	0x2e3e6	; 0x2e3e6 <CardReader::openFileReadFilteredGcode(char const*, bool) [clone .constprop.197]>
      setIndex(filespos[file_subcall_ctr]);
   2e682:	e0 91 8a 16 	lds	r30, 0x168A	; 0x80168a <card+0x2b5>
   2e686:	84 e0       	ldi	r24, 0x04	; 4
   2e688:	e8 9f       	mul	r30, r24
   2e68a:	f0 01       	movw	r30, r0
   2e68c:	11 24       	eor	r1, r1
   2e68e:	e5 57       	subi	r30, 0x75	; 117
   2e690:	f9 4e       	sbci	r31, 0xE9	; 233
   2e692:	60 81       	ld	r22, Z
   2e694:	71 81       	ldd	r23, Z+1	; 0x01
   2e696:	82 81       	ldd	r24, Z+2	; 0x02
   2e698:	93 81       	ldd	r25, Z+3	; 0x03
  {
      int16_t c = (int16_t)file.readFilteredGcode();
      sdpos = file.curPosition();
      return c;
  };
  void setIndex(long index) {sdpos = index;file.seekSetFilteredGcode(index);};
   2e69a:	60 93 eb 16 	sts	0x16EB, r22	; 0x8016eb <card+0x316>
   2e69e:	70 93 ec 16 	sts	0x16EC, r23	; 0x8016ec <card+0x317>
   2e6a2:	80 93 ed 16 	sts	0x16ED, r24	; 0x8016ed <card+0x318>
   2e6a6:	90 93 ee 16 	sts	0x16EE, r25	; 0x8016ee <card+0x319>
   2e6aa:	0f 94 17 68 	call	0x2d02e	; 0x2d02e <SdFile::seekSetFilteredGcode(unsigned long) [clone .constprop.289]>
  SERIAL_ECHOLNRPGM(_n("SD card released"));////MSG_SD_CARD_RELEASED
}

void CardReader::startFileprint()
{
  if(mounted)
   2e6ae:	80 91 d8 13 	lds	r24, 0x13D8	; 0x8013d8 <card+0x3>
   2e6b2:	88 23       	and	r24, r24
   2e6b4:	71 f0       	breq	.+28     	; 0x2e6d2 <CardReader::printingHasFinished() [clone .constprop.196]+0x7c>
  {
    sdprinting = true;
   2e6b6:	81 e0       	ldi	r24, 0x01	; 1
   2e6b8:	80 93 d7 13 	sts	0x13D7, r24	; 0x8013d7 <card+0x2>
   2e6bc:	85 e0       	ldi	r24, 0x05	; 5
   2e6be:	80 93 61 0d 	sts	0x0D61, r24	; 0x800d61 <_ZL13printer_state.lto_priv.386>
   2e6c2:	08 95       	ret
      setIndex(filespos[file_subcall_ctr]);
      startFileprint();
    }
    else
    {
      sdprinting = false;
   2e6c4:	10 92 d7 13 	sts	0x13D7, r1	; 0x8013d7 <card+0x2>
   2e6c8:	83 e0       	ldi	r24, 0x03	; 3
   2e6ca:	80 93 61 0d 	sts	0x0D61, r24	; 0x800d61 <_ZL13printer_state.lto_priv.386>
      SetPrinterState(PrinterState::SDPrintingFinished); //set printer state to show LCD menu after finished SD print
      if(SD_FINISHED_STEPPERRELEASE)
      {
          finishAndDisableSteppers();
   2e6ce:	0c 94 55 86 	jmp	0x10caa	; 0x10caa <finishAndDisableSteppers()>
      autotempShutdown();
	  #ifdef SDCARD_SORT_ALPHA
		  //presort();
	  #endif
    }
}
   2e6d2:	08 95       	ret

0002e6d4 <CardReader::mount(bool) [clone .constprop.192]>:
  root.rewind();
  lsDive("",root, NULL, LS_SerialPrint, params);
}


void CardReader::mount(bool doPresort/* = true*/)
   2e6d4:	cf 92       	push	r12
   2e6d6:	df 92       	push	r13
   2e6d8:	ef 92       	push	r14
   2e6da:	ff 92       	push	r15
   2e6dc:	0f 93       	push	r16
   2e6de:	1f 93       	push	r17
   2e6e0:	cf 93       	push	r28
   2e6e2:	df 93       	push	r29
   2e6e4:	08 2f       	mov	r16, r24
{
  mounted = false;
   2e6e6:	10 92 d8 13 	sts	0x13D8, r1	; 0x8013d8 <card+0x3>
  if(root.isOpen())
   2e6ea:	80 91 60 14 	lds	r24, 0x1460	; 0x801460 <card+0x8b>
   2e6ee:	88 23       	and	r24, r24
   2e6f0:	21 f0       	breq	.+8      	; 0x2e6fa <CardReader::mount(bool) [clone .constprop.192]+0x26>
    root.close();
   2e6f2:	8d e5       	ldi	r24, 0x5D	; 93
   2e6f4:	94 e1       	ldi	r25, 0x14	; 20
   2e6f6:	0f 94 e9 2e 	call	0x25dd2	; 0x25dd2 <SdBaseFile::close()>
 * \return The value one, true, is returned for success and
 * the value zero, false, is returned for failure.  The reason for failure
 * can be determined by calling errorCode() and errorData().
 */
bool Sd2Card::init(uint8_t sckRateID) {
  errorCode_ = type_ = 0;
   2e6fa:	10 92 47 16 	sts	0x1647, r1	; 0x801647 <card+0x272>
   2e6fe:	10 92 44 16 	sts	0x1644, r1	; 0x801644 <card+0x26f>
  // 16-bit init start time allows over a minute
  uint16_t t0 = (uint16_t)_millis();
   2e702:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   2e706:	eb 01       	movw	r28, r22
  uint32_t arg;

  // set pin modes
  chipSelectHigh();
   2e708:	0f 94 dc 65 	call	0x2cbb8	; 0x2cbb8 <Sd2Card::chipSelectHigh() [clone .constprop.312]>
  SET_OUTPUT(SDSS);
   2e70c:	20 9a       	sbi	0x04, 0	; 4
  SET_INPUT(MISO);
   2e70e:	23 98       	cbi	0x04, 3	; 4
  SET_OUTPUT(MOSI);
   2e710:	22 9a       	sbi	0x04, 2	; 4
  SET_OUTPUT(SCK);
   2e712:	21 9a       	sbi	0x04, 1	; 4

#ifndef SOFTWARE_SPI
  // SS must be in output mode even it is not chip select
  SET_OUTPUT(SS);
   2e714:	20 9a       	sbi	0x04, 0	; 4
  // set SS high - may be chip select for another SPI device
#if SET_SPI_SS_HIGH
  WRITE(SS, 1);
   2e716:	28 9a       	sbi	0x05, 0	; 5
#endif  // SET_SPI_SS_HIGH
  // set SCK rate for initialization commands
  spiRate_ = SPI_SD_INIT_RATE;
   2e718:	85 e0       	ldi	r24, 0x05	; 5
   2e71a:	80 93 45 16 	sts	0x1645, r24	; 0x801645 <card+0x270>
 * Initialize hardware SPI
 * Set SCK rate to F_CPU/pow(2, 1 + spiRate) for spiRate [0,6]
 */
static void spiInit(uint8_t spiRate) {
  // See avr processor documentation
  SPCR = (1 << SPE) | (1 << MSTR) | (spiRate >> 1);
   2e71e:	82 e5       	ldi	r24, 0x52	; 82
   2e720:	8c bd       	out	0x2c, r24	; 44
  SPSR = spiRate & 1 || spiRate == 6 ? 0 : 1 << SPI2X;
   2e722:	1d bc       	out	0x2d, r1	; 45
   2e724:	1a e0       	ldi	r17, 0x0A	; 10
  spiRate_ = SPI_SD_INIT_RATE;
  spiInit(spiRate_);
#endif  // SOFTWARE_SPI

  // must supply min of 74 clock cycles with CS high.
  for (uint8_t i = 0; i < 10; i++) spiSend(0XFF);
   2e726:	8f ef       	ldi	r24, 0xFF	; 255
   2e728:	0f 94 c5 28 	call	0x2518a	; 0x2518a <spiSend(unsigned char) [clone .lto_priv.372]>
   2e72c:	11 50       	subi	r17, 0x01	; 1
   2e72e:	d9 f7       	brne	.-10     	; 0x2e726 <CardReader::mount(bool) [clone .constprop.192]+0x52>

  WRITE(MISO, 1); // temporarily enable the MISO line pullup
   2e730:	2b 9a       	sbi	0x05, 3	; 5
  // command to go idle in SPI mode
  while ((status_ = cardCommand(CMD0, 0)) != R1_IDLE_STATE) {
   2e732:	20 e0       	ldi	r18, 0x00	; 0
   2e734:	30 e0       	ldi	r19, 0x00	; 0
   2e736:	a9 01       	movw	r20, r18
   2e738:	60 e0       	ldi	r22, 0x00	; 0
   2e73a:	84 e4       	ldi	r24, 0x44	; 68
   2e73c:	96 e1       	ldi	r25, 0x16	; 22
   2e73e:	0f 94 d1 28 	call	0x251a2	; 0x251a2 <Sd2Card::cardCommand(unsigned char, unsigned long)>
   2e742:	80 93 46 16 	sts	0x1646, r24	; 0x801646 <card+0x271>
   2e746:	81 30       	cpi	r24, 0x01	; 1
   2e748:	61 f0       	breq	.+24     	; 0x2e762 <CardReader::mount(bool) [clone .constprop.192]+0x8e>
    if (((uint16_t)_millis() - t0) > SD_INIT_TIMEOUT) {
   2e74a:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   2e74e:	6c 1b       	sub	r22, r28
   2e750:	7d 0b       	sbc	r23, r29
   2e752:	61 3d       	cpi	r22, 0xD1	; 209
   2e754:	77 40       	sbci	r23, 0x07	; 7
   2e756:	68 f3       	brcs	.-38     	; 0x2e732 <CardReader::mount(bool) [clone .constprop.192]+0x5e>
      WRITE(MISO, 0); // disable the MISO line pullup
   2e758:	2b 98       	cbi	0x05, 3	; 5
   2e75a:	81 e0       	ldi	r24, 0x01	; 1
   2e75c:	80 93 44 16 	sts	0x1644, r24	; 0x801644 <card+0x26f>
   2e760:	22 c0       	rjmp	.+68     	; 0x2e7a6 <CardReader::mount(bool) [clone .constprop.192]+0xd2>
      error(SD_CARD_ERROR_CMD0);
      goto fail;
    }
  }
  WRITE(MISO, 0); // disable the MISO line pullup
   2e762:	2b 98       	cbi	0x05, 3	; 5

  // send 0xFF until 0xFF received to give card some clock cycles
  t0 = (uint16_t)_millis();
   2e764:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   2e768:	eb 01       	movw	r28, r22
  SERIAL_ECHOLNRPGM(PSTR("Sending 0xFF"));
   2e76a:	8b e1       	ldi	r24, 0x1B	; 27
   2e76c:	90 ea       	ldi	r25, 0xA0	; 160
   2e76e:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
  spiSend(0XFF);
   2e772:	8f ef       	ldi	r24, 0xFF	; 255
   2e774:	0f 94 c5 28 	call	0x2518a	; 0x2518a <spiSend(unsigned char) [clone .lto_priv.372]>
  while ((status_ = spiRec()) != 0xFF)
   2e778:	0f 94 ca 28 	call	0x25194	; 0x25194 <spiRec() [clone .lto_priv.366]>
   2e77c:	80 93 46 16 	sts	0x1646, r24	; 0x801646 <card+0x271>
   2e780:	8f 3f       	cpi	r24, 0xFF	; 255
   2e782:	59 f1       	breq	.+86     	; 0x2e7da <CardReader::mount(bool) [clone .constprop.192]+0x106>
  {
    spiSend(0XFF);
   2e784:	8f ef       	ldi	r24, 0xFF	; 255
   2e786:	0f 94 c5 28 	call	0x2518a	; 0x2518a <spiSend(unsigned char) [clone .lto_priv.372]>
    if (((uint16_t)_millis() - t0) > SD_CARD_ERROR_FF_TIMEOUT)
   2e78a:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   2e78e:	6c 1b       	sub	r22, r28
   2e790:	7d 0b       	sbc	r23, r29
   2e792:	62 32       	cpi	r22, 0x22	; 34
   2e794:	71 05       	cpc	r23, r1
   2e796:	80 f3       	brcs	.-32     	; 0x2e778 <CardReader::mount(bool) [clone .constprop.192]+0xa4>
   2e798:	82 e0       	ldi	r24, 0x02	; 2
   2e79a:	80 93 44 16 	sts	0x1644, r24	; 0x801644 <card+0x26f>
    {
      error(SD_CARD_ERROR_CMD8);
      SERIAL_ECHOLNRPGM(PSTR("No 0xFF received"));
   2e79e:	8a e0       	ldi	r24, 0x0A	; 10
   2e7a0:	90 ea       	ldi	r25, 0xA0	; 160
   2e7a2:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
#else  // SOFTWARE_SPI
  return true;
#endif  // SOFTWARE_SPI

 fail:
  chipSelectHigh();
   2e7a6:	0f 94 dc 65 	call	0x2cbb8	; 0x2cbb8 <Sd2Card::chipSelectHigh() [clone .constprop.312]>
#else
  if (!card.init(SPI_FULL_SPEED)
    )
#endif
  {
    SERIAL_ECHO_START;
   2e7aa:	8e ec       	ldi	r24, 0xCE	; 206
   2e7ac:	91 ea       	ldi	r25, 0xA1	; 161
   2e7ae:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    SERIAL_ECHOLNRPGM(_n("SD init fail"));////MSG_SD_INIT_FAIL
   2e7b2:	87 e2       	ldi	r24, 0x27	; 39
   2e7b4:	9c e6       	ldi	r25, 0x6C	; 108
  }
  else
  {
    mounted = true;
    SERIAL_ECHO_START;
    SERIAL_ECHOLNRPGM(_n("SD card ok"));////MSG_SD_CARD_OK
   2e7b6:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
  }

  if (mounted)
   2e7ba:	80 91 d8 13 	lds	r24, 0x13D8	; 0x8013d8 <card+0x3>
   2e7be:	88 23       	and	r24, r24
   2e7c0:	09 f4       	brne	.+2      	; 0x2e7c4 <CardReader::mount(bool) [clone .constprop.192]+0xf0>
   2e7c2:	9a c0       	rjmp	.+308    	; 0x2e8f8 <CardReader::mount(bool) [clone .constprop.192]+0x224>
  {
    cdroot(doPresort);
   2e7c4:	80 2f       	mov	r24, r16
  }
}
   2e7c6:	df 91       	pop	r29
   2e7c8:	cf 91       	pop	r28
   2e7ca:	1f 91       	pop	r17
   2e7cc:	0f 91       	pop	r16
   2e7ce:	ff 90       	pop	r15
   2e7d0:	ef 90       	pop	r14
   2e7d2:	df 90       	pop	r13
   2e7d4:	cf 90       	pop	r12
    SERIAL_ECHOLNRPGM(_n("SD card ok"));////MSG_SD_CARD_OK
  }

  if (mounted)
  {
    cdroot(doPresort);
   2e7d6:	0d 94 56 71 	jmp	0x2e2ac	; 0x2e2ac <CardReader::cdroot(bool) [clone .constprop.193]>
      goto fail;
    }
  }

  // check SD version
  if ((cardCommand(CMD8, 0x1AA) & R1_ILLEGAL_COMMAND)) {
   2e7da:	2a ea       	ldi	r18, 0xAA	; 170
   2e7dc:	31 e0       	ldi	r19, 0x01	; 1
   2e7de:	40 e0       	ldi	r20, 0x00	; 0
   2e7e0:	50 e0       	ldi	r21, 0x00	; 0
   2e7e2:	68 e0       	ldi	r22, 0x08	; 8
   2e7e4:	84 e4       	ldi	r24, 0x44	; 68
   2e7e6:	96 e1       	ldi	r25, 0x16	; 22
   2e7e8:	0f 94 d1 28 	call	0x251a2	; 0x251a2 <Sd2Card::cardCommand(unsigned char, unsigned long)>
   2e7ec:	82 ff       	sbrs	r24, 2
   2e7ee:	2b c0       	rjmp	.+86     	; 0x2e846 <CardReader::mount(bool) [clone .constprop.192]+0x172>

  bool readData(uint8_t* dst, uint16_t count);
  bool readRegister(uint8_t cmd, void* buf);
  void chipSelectHigh();
  void chipSelectLow();
  void type(uint8_t value) {type_ = value;}
   2e7f0:	81 e0       	ldi	r24, 0x01	; 1
   2e7f2:	80 93 47 16 	sts	0x1647, r24	; 0x801647 <card+0x272>
      goto fail;
    }
    type(SD_CARD_TYPE_SD2);
  }
  // initialize card and send host supports SDHC if SD2
  arg = type() == SD_CARD_TYPE_SD2 ? 0X40000000 : 0;
   2e7f6:	80 91 47 16 	lds	r24, 0x1647	; 0x801647 <card+0x272>
   2e7fa:	c1 2c       	mov	r12, r1
   2e7fc:	d1 2c       	mov	r13, r1
   2e7fe:	76 01       	movw	r14, r12
   2e800:	82 30       	cpi	r24, 0x02	; 2
   2e802:	29 f4       	brne	.+10     	; 0x2e80e <CardReader::mount(bool) [clone .constprop.192]+0x13a>
   2e804:	c1 2c       	mov	r12, r1
   2e806:	d1 2c       	mov	r13, r1
   2e808:	e1 2c       	mov	r14, r1
   2e80a:	80 e4       	ldi	r24, 0x40	; 64
   2e80c:	f8 2e       	mov	r15, r24
  uint8_t status_;
  uint8_t type_;
  bool    flash_air_compatible_;
  // private functions
  uint8_t cardAcmd(uint8_t cmd, uint32_t arg) {
    cardCommand(CMD55, 0);
   2e80e:	20 e0       	ldi	r18, 0x00	; 0
   2e810:	30 e0       	ldi	r19, 0x00	; 0
   2e812:	a9 01       	movw	r20, r18
   2e814:	67 e3       	ldi	r22, 0x37	; 55
   2e816:	84 e4       	ldi	r24, 0x44	; 68
   2e818:	96 e1       	ldi	r25, 0x16	; 22
   2e81a:	0f 94 d1 28 	call	0x251a2	; 0x251a2 <Sd2Card::cardCommand(unsigned char, unsigned long)>
    return cardCommand(cmd, arg);
   2e81e:	a7 01       	movw	r20, r14
   2e820:	96 01       	movw	r18, r12
   2e822:	69 e2       	ldi	r22, 0x29	; 41
   2e824:	84 e4       	ldi	r24, 0x44	; 68
   2e826:	96 e1       	ldi	r25, 0x16	; 22
   2e828:	0f 94 d1 28 	call	0x251a2	; 0x251a2 <Sd2Card::cardCommand(unsigned char, unsigned long)>

  while ((status_ = cardAcmd(ACMD41, arg)) != R1_READY_STATE) {
   2e82c:	80 93 46 16 	sts	0x1646, r24	; 0x801646 <card+0x271>
   2e830:	88 23       	and	r24, r24
   2e832:	b1 f0       	breq	.+44     	; 0x2e860 <CardReader::mount(bool) [clone .constprop.192]+0x18c>
    // check for timeout
    if (((uint16_t)_millis() - t0) > SD_INIT_TIMEOUT) {
   2e834:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   2e838:	6c 1b       	sub	r22, r28
   2e83a:	7d 0b       	sbc	r23, r29
   2e83c:	61 3d       	cpi	r22, 0xD1	; 209
   2e83e:	77 40       	sbci	r23, 0x07	; 7
   2e840:	30 f3       	brcs	.-52     	; 0x2e80e <CardReader::mount(bool) [clone .constprop.192]+0x13a>
  bool eraseSingleBlockEnable();
  /**
   *  Set SD error code.
   *  \param[in] code value for error code.
   */
  void error(uint8_t code) {errorCode_ = code;}
   2e842:	8a e0       	ldi	r24, 0x0A	; 10
   2e844:	8b cf       	rjmp	.-234    	; 0x2e75c <CardReader::mount(bool) [clone .constprop.192]+0x88>
      goto fail;
    }
  }

  // check SD version
  if ((cardCommand(CMD8, 0x1AA) & R1_ILLEGAL_COMMAND)) {
   2e846:	14 e0       	ldi	r17, 0x04	; 4
    type(SD_CARD_TYPE_SD1);
  } else {
    // only need last byte of r7 response
    for (uint8_t i = 0; i < 4; i++) status_ = spiRec();
   2e848:	0f 94 ca 28 	call	0x25194	; 0x25194 <spiRec() [clone .lto_priv.366]>
   2e84c:	80 93 46 16 	sts	0x1646, r24	; 0x801646 <card+0x271>
   2e850:	11 50       	subi	r17, 0x01	; 1
   2e852:	d1 f7       	brne	.-12     	; 0x2e848 <CardReader::mount(bool) [clone .constprop.192]+0x174>
    if (status_ != 0XAA) {
   2e854:	8a 3a       	cpi	r24, 0xAA	; 170
   2e856:	11 f0       	breq	.+4      	; 0x2e85c <CardReader::mount(bool) [clone .constprop.192]+0x188>
   2e858:	82 e0       	ldi	r24, 0x02	; 2
   2e85a:	80 cf       	rjmp	.-256    	; 0x2e75c <CardReader::mount(bool) [clone .constprop.192]+0x88>

  bool readData(uint8_t* dst, uint16_t count);
  bool readRegister(uint8_t cmd, void* buf);
  void chipSelectHigh();
  void chipSelectLow();
  void type(uint8_t value) {type_ = value;}
   2e85c:	82 e0       	ldi	r24, 0x02	; 2
   2e85e:	c9 cf       	rjmp	.-110    	; 0x2e7f2 <CardReader::mount(bool) [clone .constprop.192]+0x11e>
      error(SD_CARD_ERROR_ACMD41);
      goto fail;
    }
  }
  // if SD2 read OCR register to check for SDHC card
  if (type() == SD_CARD_TYPE_SD2) {
   2e860:	80 91 47 16 	lds	r24, 0x1647	; 0x801647 <card+0x272>
   2e864:	82 30       	cpi	r24, 0x02	; 2
   2e866:	d1 f4       	brne	.+52     	; 0x2e89c <CardReader::mount(bool) [clone .constprop.192]+0x1c8>
    if (cardCommand(CMD58, 0)) {
   2e868:	20 e0       	ldi	r18, 0x00	; 0
   2e86a:	30 e0       	ldi	r19, 0x00	; 0
   2e86c:	a9 01       	movw	r20, r18
   2e86e:	6a e3       	ldi	r22, 0x3A	; 58
   2e870:	84 e4       	ldi	r24, 0x44	; 68
   2e872:	96 e1       	ldi	r25, 0x16	; 22
   2e874:	0f 94 d1 28 	call	0x251a2	; 0x251a2 <Sd2Card::cardCommand(unsigned char, unsigned long)>
   2e878:	88 23       	and	r24, r24
   2e87a:	11 f0       	breq	.+4      	; 0x2e880 <CardReader::mount(bool) [clone .constprop.192]+0x1ac>
  bool eraseSingleBlockEnable();
  /**
   *  Set SD error code.
   *  \param[in] code value for error code.
   */
  void error(uint8_t code) {errorCode_ = code;}
   2e87c:	88 e0       	ldi	r24, 0x08	; 8
   2e87e:	6e cf       	rjmp	.-292    	; 0x2e75c <CardReader::mount(bool) [clone .constprop.192]+0x88>
      error(SD_CARD_ERROR_CMD58);
      goto fail;
    }
    if ((spiRec() & 0XC0) == 0XC0) type(SD_CARD_TYPE_SDHC);
   2e880:	0f 94 ca 28 	call	0x25194	; 0x25194 <spiRec() [clone .lto_priv.366]>
   2e884:	80 7c       	andi	r24, 0xC0	; 192
   2e886:	80 3c       	cpi	r24, 0xC0	; 192
   2e888:	19 f4       	brne	.+6      	; 0x2e890 <CardReader::mount(bool) [clone .constprop.192]+0x1bc>

  bool readData(uint8_t* dst, uint16_t count);
  bool readRegister(uint8_t cmd, void* buf);
  void chipSelectHigh();
  void chipSelectLow();
  void type(uint8_t value) {type_ = value;}
   2e88a:	83 e0       	ldi	r24, 0x03	; 3
   2e88c:	80 93 47 16 	sts	0x1647, r24	; 0x801647 <card+0x272>
    // discard rest of ocr - contains allowed voltage range
    for (uint8_t i = 0; i < 3; i++) spiRec();
   2e890:	0f 94 ca 28 	call	0x25194	; 0x25194 <spiRec() [clone .lto_priv.366]>
   2e894:	0f 94 ca 28 	call	0x25194	; 0x25194 <spiRec() [clone .lto_priv.366]>
   2e898:	0f 94 ca 28 	call	0x25194	; 0x25194 <spiRec() [clone .lto_priv.366]>
  }
  chipSelectHigh();
   2e89c:	0f 94 dc 65 	call	0x2cbb8	; 0x2cbb8 <Sd2Card::chipSelectHigh() [clone .constprop.312]>
bool Sd2Card::setSckRate(uint8_t sckRateID) {
  if (sckRateID > 6) {
    error(SD_CARD_ERROR_SCK_RATE);
    return false;
  }
  spiRate_ = sckRateID;
   2e8a0:	10 92 45 16 	sts	0x1645, r1	; 0x801645 <card+0x270>
   * \return The value one, true, is returned for success and
   * the value zero, false, is returned for failure.  Reasons for
   * failure include not finding a valid partition, not finding a valid
   * FAT file system or an I/O error.
   */
  bool init(Sd2Card* dev) { return init(dev, 1) ? true : init(dev, 0);}
   2e8a4:	81 e0       	ldi	r24, 0x01	; 1
   2e8a6:	0f 94 77 59 	call	0x2b2ee	; 0x2b2ee <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]>
   2e8aa:	81 11       	cpse	r24, r1
   2e8ac:	0c c0       	rjmp	.+24     	; 0x2e8c6 <CardReader::mount(bool) [clone .constprop.192]+0x1f2>
   2e8ae:	80 e0       	ldi	r24, 0x00	; 0
   2e8b0:	0f 94 77 59 	call	0x2b2ee	; 0x2b2ee <SdVolume::init(Sd2Card*, unsigned char) [clone .constprop.232]>
#endif
  {
    SERIAL_ECHO_START;
    SERIAL_ECHOLNRPGM(_n("SD init fail"));////MSG_SD_INIT_FAIL
  }
  else if (!volume.init(&card))
   2e8b4:	81 11       	cpse	r24, r1
   2e8b6:	07 c0       	rjmp	.+14     	; 0x2e8c6 <CardReader::mount(bool) [clone .constprop.192]+0x1f2>
  {
    SERIAL_ERROR_START;
   2e8b8:	81 eb       	ldi	r24, 0xB1	; 177
   2e8ba:	91 ea       	ldi	r25, 0xA1	; 161
   2e8bc:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    SERIAL_ERRORLNRPGM(_n("volume.init failed"));////MSG_SD_VOL_INIT_FAIL
   2e8c0:	84 e1       	ldi	r24, 0x14	; 20
   2e8c2:	9c e6       	ldi	r25, 0x6C	; 108
   2e8c4:	78 cf       	rjmp	.-272    	; 0x2e7b6 <CardReader::mount(bool) [clone .constprop.192]+0xe2>
  }
  else if (!root.openRoot(&volume))
   2e8c6:	69 e4       	ldi	r22, 0x49	; 73
   2e8c8:	76 e1       	ldi	r23, 0x16	; 22
   2e8ca:	8d e5       	ldi	r24, 0x5D	; 93
   2e8cc:	94 e1       	ldi	r25, 0x14	; 20
   2e8ce:	0f 94 42 2c 	call	0x25884	; 0x25884 <SdBaseFile::openRoot(SdVolume*)>
   2e8d2:	81 11       	cpse	r24, r1
   2e8d4:	07 c0       	rjmp	.+14     	; 0x2e8e4 <CardReader::mount(bool) [clone .constprop.192]+0x210>
  {
    SERIAL_ERROR_START;
   2e8d6:	81 eb       	ldi	r24, 0xB1	; 177
   2e8d8:	91 ea       	ldi	r25, 0xA1	; 161
   2e8da:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    SERIAL_ERRORLNRPGM(_n("openRoot failed"));////MSG_SD_OPENROOT_FAIL
   2e8de:	84 e0       	ldi	r24, 0x04	; 4
   2e8e0:	9c e6       	ldi	r25, 0x6C	; 108
   2e8e2:	69 cf       	rjmp	.-302    	; 0x2e7b6 <CardReader::mount(bool) [clone .constprop.192]+0xe2>
  }
  else
  {
    mounted = true;
   2e8e4:	81 e0       	ldi	r24, 0x01	; 1
   2e8e6:	80 93 d8 13 	sts	0x13D8, r24	; 0x8013d8 <card+0x3>
    SERIAL_ECHO_START;
   2e8ea:	8e ec       	ldi	r24, 0xCE	; 206
   2e8ec:	91 ea       	ldi	r25, 0xA1	; 161
   2e8ee:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
    SERIAL_ECHOLNRPGM(_n("SD card ok"));////MSG_SD_CARD_OK
   2e8f2:	89 ef       	ldi	r24, 0xF9	; 249
   2e8f4:	9b e6       	ldi	r25, 0x6B	; 107
   2e8f6:	5f cf       	rjmp	.-322    	; 0x2e7b6 <CardReader::mount(bool) [clone .constprop.192]+0xe2>

  if (mounted)
  {
    cdroot(doPresort);
  }
}
   2e8f8:	df 91       	pop	r29
   2e8fa:	cf 91       	pop	r28
   2e8fc:	1f 91       	pop	r17
   2e8fe:	0f 91       	pop	r16
   2e900:	ff 90       	pop	r15
   2e902:	ef 90       	pop	r14
   2e904:	df 90       	pop	r13
   2e906:	cf 90       	pop	r12
   2e908:	08 95       	ret

0002e90a <wait_for_heater(long, unsigned char) [clone .constprop.190]>:
            ms = 0;
        }
    }
}

static void wait_for_heater(long codenum, uint8_t extruder) {
   2e90a:	4f 92       	push	r4
   2e90c:	5f 92       	push	r5
   2e90e:	6f 92       	push	r6
   2e910:	7f 92       	push	r7
   2e912:	8f 92       	push	r8
   2e914:	9f 92       	push	r9
   2e916:	af 92       	push	r10
   2e918:	bf 92       	push	r11
   2e91a:	cf 92       	push	r12
   2e91c:	df 92       	push	r13
   2e91e:	ef 92       	push	r14
   2e920:	ff 92       	push	r15
   2e922:	4b 01       	movw	r8, r22
   2e924:	5c 01       	movw	r10, r24
  return current_temperature_bed;
};

// Doesn't save FLASH when FORCE_INLINE removed.
FORCE_INLINE float degTargetHotend(uint8_t extruder) {
  return target_temperature[extruder];
   2e926:	60 91 5d 12 	lds	r22, 0x125D	; 0x80125d <target_temperature>
   2e92a:	70 91 5e 12 	lds	r23, 0x125E	; 0x80125e <target_temperature+0x1>
   2e92e:	07 2e       	mov	r0, r23
   2e930:	00 0c       	add	r0, r0
   2e932:	88 0b       	sbc	r24, r24
   2e934:	99 0b       	sbc	r25, r25
   2e936:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
    if (!degTargetHotend(extruder))
   2e93a:	20 e0       	ldi	r18, 0x00	; 0
   2e93c:	30 e0       	ldi	r19, 0x00	; 0
   2e93e:	a9 01       	movw	r20, r18
   2e940:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   2e944:	88 23       	and	r24, r24
   2e946:	d1 f0       	breq	.+52     	; 0x2e97c <wait_for_heater(long, unsigned char) [clone .constprop.190]+0x72>
#ifdef TEMP_RESIDENCY_TIME
	long residencyStart;
	residencyStart = -1;
	/* continue to loop until we have reached the target temp
	_and_ until TEMP_RESIDENCY_TIME hasn't passed since we reached it */
    cancel_heatup = false;
   2e948:	10 92 5f 0d 	sts	0x0D5F, r1	; 0x800d5f <_ZL13cancel_heatup.lto_priv.391>
    if (!degTargetHotend(extruder))
        return;

#ifdef TEMP_RESIDENCY_TIME
	long residencyStart;
	residencyStart = -1;
   2e94c:	cc 24       	eor	r12, r12
   2e94e:	ca 94       	dec	r12
   2e950:	dc 2c       	mov	r13, r12
   2e952:	76 01       	movw	r14, r12

#ifdef TEMP_RESIDENCY_TIME
				SERIAL_PROTOCOLPGM(" W:");
				if (residencyStart > -1)
				{
					codenum = ((TEMP_RESIDENCY_TIME * 1000UL) - (_millis() - residencyStart)) / 1000UL;
   2e954:	98 ee       	ldi	r25, 0xE8	; 232
   2e956:	49 2e       	mov	r4, r25
   2e958:	93 e0       	ldi	r25, 0x03	; 3
   2e95a:	59 2e       	mov	r5, r25
   2e95c:	61 2c       	mov	r6, r1
   2e95e:	71 2c       	mov	r7, r1
	long residencyStart;
	residencyStart = -1;
	/* continue to loop until we have reached the target temp
	_and_ until TEMP_RESIDENCY_TIME hasn't passed since we reached it */
    cancel_heatup = false;
	while ((!cancel_heatup) && ((residencyStart == -1) ||
   2e960:	80 91 5f 0d 	lds	r24, 0x0D5F	; 0x800d5f <_ZL13cancel_heatup.lto_priv.391>
   2e964:	81 11       	cpse	r24, r1
   2e966:	0a c0       	rjmp	.+20     	; 0x2e97c <wait_for_heater(long, unsigned char) [clone .constprop.190]+0x72>
   2e968:	2f ef       	ldi	r18, 0xFF	; 255
   2e96a:	c2 16       	cp	r12, r18
   2e96c:	d2 06       	cpc	r13, r18
   2e96e:	e2 06       	cpc	r14, r18
   2e970:	f2 06       	cpc	r15, r18
   2e972:	89 f4       	brne	.+34     	; 0x2e996 <wait_for_heater(long, unsigned char) [clone .constprop.190]+0x8c>
		(residencyStart >= 0 && (((unsigned int)(_millis() - residencyStart)) < (TEMP_RESIDENCY_TIME * 1000UL))))) {
#else
	while (target_direction ? (isHeatingHotend(tmp_extruder)) : (isCoolingHotend(tmp_extruder) && (CooldownNoWait == false))) {
#endif //TEMP_RESIDENCY_TIME
        if (lcd_commands_type == LcdCommands::LongPause) {
   2e974:	80 91 5e 0d 	lds	r24, 0x0D5E	; 0x800d5e <lcd_commands_type>
   2e978:	82 30       	cpi	r24, 0x02	; 2
   2e97a:	b9 f4       	brne	.+46     	; 0x2e9aa <wait_for_heater(long, unsigned char) [clone .constprop.190]+0xa0>
			{
				residencyStart = _millis();
			}
#endif //TEMP_RESIDENCY_TIME
	}
}
   2e97c:	ff 90       	pop	r15
   2e97e:	ef 90       	pop	r14
   2e980:	df 90       	pop	r13
   2e982:	cf 90       	pop	r12
   2e984:	bf 90       	pop	r11
   2e986:	af 90       	pop	r10
   2e988:	9f 90       	pop	r9
   2e98a:	8f 90       	pop	r8
   2e98c:	7f 90       	pop	r7
   2e98e:	6f 90       	pop	r6
   2e990:	5f 90       	pop	r5
   2e992:	4f 90       	pop	r4
   2e994:	08 95       	ret
	long residencyStart;
	residencyStart = -1;
	/* continue to loop until we have reached the target temp
	_and_ until TEMP_RESIDENCY_TIME hasn't passed since we reached it */
    cancel_heatup = false;
	while ((!cancel_heatup) && ((residencyStart == -1) ||
   2e996:	f7 fc       	sbrc	r15, 7
   2e998:	f1 cf       	rjmp	.-30     	; 0x2e97c <wait_for_heater(long, unsigned char) [clone .constprop.190]+0x72>
		(residencyStart >= 0 && (((unsigned int)(_millis() - residencyStart)) < (TEMP_RESIDENCY_TIME * 1000UL))))) {
   2e99a:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   2e99e:	6c 19       	sub	r22, r12
   2e9a0:	7d 09       	sbc	r23, r13
   2e9a2:	68 3b       	cpi	r22, 0xB8	; 184
   2e9a4:	7b 40       	sbci	r23, 0x0B	; 11
   2e9a6:	30 f3       	brcs	.-52     	; 0x2e974 <wait_for_heater(long, unsigned char) [clone .constprop.190]+0x6a>
   2e9a8:	e9 cf       	rjmp	.-46     	; 0x2e97c <wait_for_heater(long, unsigned char) [clone .constprop.190]+0x72>
        if (lcd_commands_type == LcdCommands::LongPause) {
            // Print was suddenly paused, break out of the loop
            // This can happen when the firmware report a fan error
            break;
        }
		if ((_millis() - codenum) > 1000UL)
   2e9aa:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   2e9ae:	68 19       	sub	r22, r8
   2e9b0:	79 09       	sbc	r23, r9
   2e9b2:	8a 09       	sbc	r24, r10
   2e9b4:	9b 09       	sbc	r25, r11
   2e9b6:	69 3e       	cpi	r22, 0xE9	; 233
   2e9b8:	73 40       	sbci	r23, 0x03	; 3
   2e9ba:	81 05       	cpc	r24, r1
   2e9bc:	91 05       	cpc	r25, r1
   2e9be:	08 f4       	brcc	.+2      	; 0x2e9c2 <wait_for_heater(long, unsigned char) [clone .constprop.190]+0xb8>
   2e9c0:	42 c0       	rjmp	.+132    	; 0x2ea46 <wait_for_heater(long, unsigned char) [clone .constprop.190]+0x13c>
		{ //Print Temp Reading and remaining time every 1 second while heating up/cooling down
			if (!farm_mode) {
   2e9c2:	80 91 60 0d 	lds	r24, 0x0D60	; 0x800d60 <farm_mode>
   2e9c6:	81 11       	cpse	r24, r1
   2e9c8:	3a c0       	rjmp	.+116    	; 0x2ea3e <wait_for_heater(long, unsigned char) [clone .constprop.190]+0x134>
				SERIAL_PROTOCOLPGM("T:");
   2e9ca:	87 e0       	ldi	r24, 0x07	; 7
   2e9cc:	90 ea       	ldi	r25, 0xA0	; 160
   2e9ce:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
  else printNumber(n, base);
}

void MarlinSerial::print(double n, int digits)
{
  printFloat(n, digits);
   2e9d2:	60 91 5a 0d 	lds	r22, 0x0D5A	; 0x800d5a <current_temperature>
   2e9d6:	70 91 5b 0d 	lds	r23, 0x0D5B	; 0x800d5b <current_temperature+0x1>
   2e9da:	80 91 5c 0d 	lds	r24, 0x0D5C	; 0x800d5c <current_temperature+0x2>
   2e9de:	90 91 5d 0d 	lds	r25, 0x0D5D	; 0x800d5d <current_temperature+0x3>
   2e9e2:	41 e0       	ldi	r20, 0x01	; 1
   2e9e4:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
				SERIAL_PROTOCOL_F(degHotend(extruder), 1);
				SERIAL_PROTOCOLPGM(" E:");
   2e9e8:	83 e0       	ldi	r24, 0x03	; 3
   2e9ea:	90 ea       	ldi	r25, 0xA0	; 160
   2e9ec:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   2e9f0:	60 e0       	ldi	r22, 0x00	; 0
   2e9f2:	70 e0       	ldi	r23, 0x00	; 0
   2e9f4:	cb 01       	movw	r24, r22
   2e9f6:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
				SERIAL_PROTOCOL((int)extruder);

#ifdef TEMP_RESIDENCY_TIME
				SERIAL_PROTOCOLPGM(" W:");
   2e9fa:	8f ef       	ldi	r24, 0xFF	; 255
   2e9fc:	9f e9       	ldi	r25, 0x9F	; 159
   2e9fe:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
				if (residencyStart > -1)
   2ea02:	f7 fc       	sbrc	r15, 7
   2ea04:	52 c0       	rjmp	.+164    	; 0x2eaaa <wait_for_heater(long, unsigned char) [clone .constprop.190]+0x1a0>
				{
					codenum = ((TEMP_RESIDENCY_TIME * 1000UL) - (_millis() - residencyStart)) / 1000UL;
   2ea06:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   2ea0a:	46 01       	movw	r8, r12
   2ea0c:	57 01       	movw	r10, r14
   2ea0e:	58 eb       	ldi	r21, 0xB8	; 184
   2ea10:	85 0e       	add	r8, r21
   2ea12:	5b e0       	ldi	r21, 0x0B	; 11
   2ea14:	95 1e       	adc	r9, r21
   2ea16:	a1 1c       	adc	r10, r1
   2ea18:	b1 1c       	adc	r11, r1
   2ea1a:	a5 01       	movw	r20, r10
   2ea1c:	94 01       	movw	r18, r8
   2ea1e:	26 1b       	sub	r18, r22
   2ea20:	37 0b       	sbc	r19, r23
   2ea22:	48 0b       	sbc	r20, r24
   2ea24:	59 0b       	sbc	r21, r25
   2ea26:	ca 01       	movw	r24, r20
   2ea28:	b9 01       	movw	r22, r18
   2ea2a:	a3 01       	movw	r20, r6
   2ea2c:	92 01       	movw	r18, r4
   2ea2e:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
   2ea32:	ca 01       	movw	r24, r20
   2ea34:	b9 01       	movw	r22, r18
   2ea36:	0e 94 2a 7a 	call	0xf454	; 0xf454 <MarlinSerial::print(long, int) [clone .part.1]>
}

void MarlinSerial::println(char c, int base)
{
  print(c, base);
  println();
   2ea3a:	0e 94 bc 7a 	call	0xf578	; 0xf578 <MarlinSerial::println()>
				}
			}
#else
				SERIAL_PROTOCOLLN();
#endif
				codenum = _millis();
   2ea3e:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   2ea42:	4b 01       	movw	r8, r22
   2ea44:	5c 01       	movw	r10, r24
		}
		delay_keep_alive(0); //do not disable steppers
   2ea46:	90 e0       	ldi	r25, 0x00	; 0
   2ea48:	80 e0       	ldi	r24, 0x00	; 0
   2ea4a:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
#ifdef TEMP_RESIDENCY_TIME
			/* start/restart the TEMP_RESIDENCY_TIME timer whenever we reach target temp for the first time
			or when current temp falls outside the hysteresis after target temp was reached */
			if ((residencyStart == -1 && target_direction && (degHotend(extruder) >= (degTargetHotend(extruder) - TEMP_WINDOW))) ||
				(residencyStart == -1 && !target_direction && (degHotend(extruder) <= (degTargetHotend(extruder) + TEMP_WINDOW))) ||
   2ea4e:	3f ef       	ldi	r19, 0xFF	; 255
   2ea50:	c3 16       	cp	r12, r19
   2ea52:	d3 06       	cpc	r13, r19
   2ea54:	e3 06       	cpc	r14, r19
   2ea56:	f3 06       	cpc	r15, r19
   2ea58:	09 f0       	breq	.+2      	; 0x2ea5c <wait_for_heater(long, unsigned char) [clone .constprop.190]+0x152>
   2ea5a:	46 c0       	rjmp	.+140    	; 0x2eae8 <wait_for_heater(long, unsigned char) [clone .constprop.190]+0x1de>
		}
		delay_keep_alive(0); //do not disable steppers
#ifdef TEMP_RESIDENCY_TIME
			/* start/restart the TEMP_RESIDENCY_TIME timer whenever we reach target temp for the first time
			or when current temp falls outside the hysteresis after target temp was reached */
			if ((residencyStart == -1 && target_direction && (degHotend(extruder) >= (degTargetHotend(extruder) - TEMP_WINDOW))) ||
   2ea5c:	80 91 59 0d 	lds	r24, 0x0D59	; 0x800d59 <_ZL16target_direction.lto_priv.490>
   2ea60:	60 91 5d 12 	lds	r22, 0x125D	; 0x80125d <target_temperature>
   2ea64:	70 91 5e 12 	lds	r23, 0x125E	; 0x80125e <target_temperature+0x1>
   2ea68:	88 23       	and	r24, r24
   2ea6a:	19 f1       	breq	.+70     	; 0x2eab2 <wait_for_heater(long, unsigned char) [clone .constprop.190]+0x1a8>
   2ea6c:	07 2e       	mov	r0, r23
   2ea6e:	00 0c       	add	r0, r0
   2ea70:	88 0b       	sbc	r24, r24
   2ea72:	99 0b       	sbc	r25, r25
   2ea74:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   2ea78:	20 e0       	ldi	r18, 0x00	; 0
   2ea7a:	30 e0       	ldi	r19, 0x00	; 0
   2ea7c:	40 e8       	ldi	r20, 0x80	; 128
   2ea7e:	5f e3       	ldi	r21, 0x3F	; 63
   2ea80:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   2ea84:	9b 01       	movw	r18, r22
   2ea86:	ac 01       	movw	r20, r24
   2ea88:	60 91 5a 0d 	lds	r22, 0x0D5A	; 0x800d5a <current_temperature>
   2ea8c:	70 91 5b 0d 	lds	r23, 0x0D5B	; 0x800d5b <current_temperature+0x1>
   2ea90:	80 91 5c 0d 	lds	r24, 0x0D5C	; 0x800d5c <current_temperature+0x2>
   2ea94:	90 91 5d 0d 	lds	r25, 0x0D5D	; 0x800d5d <current_temperature+0x3>
   2ea98:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   2ea9c:	87 fd       	sbrc	r24, 7
   2ea9e:	60 cf       	rjmp	.-320    	; 0x2e960 <wait_for_heater(long, unsigned char) [clone .constprop.190]+0x56>
				(residencyStart == -1 && !target_direction && (degHotend(extruder) <= (degTargetHotend(extruder) + TEMP_WINDOW))) ||
				(residencyStart > -1 && fabs(degHotend(extruder) - degTargetHotend(extruder)) > TEMP_HYSTERESIS))
			{
				residencyStart = _millis();
   2eaa0:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   2eaa4:	6b 01       	movw	r12, r22
   2eaa6:	7c 01       	movw	r14, r24
   2eaa8:	5b cf       	rjmp	.-330    	; 0x2e960 <wait_for_heater(long, unsigned char) [clone .constprop.190]+0x56>
}

void MarlinSerial::print(long n, int base)
{
  if (base == 0) {
    write(n);
   2eaaa:	8f e3       	ldi	r24, 0x3F	; 63
   2eaac:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
   2eab0:	c4 cf       	rjmp	.-120    	; 0x2ea3a <wait_for_heater(long, unsigned char) [clone .constprop.190]+0x130>
   2eab2:	07 2e       	mov	r0, r23
   2eab4:	00 0c       	add	r0, r0
   2eab6:	88 0b       	sbc	r24, r24
   2eab8:	99 0b       	sbc	r25, r25
   2eaba:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
		delay_keep_alive(0); //do not disable steppers
#ifdef TEMP_RESIDENCY_TIME
			/* start/restart the TEMP_RESIDENCY_TIME timer whenever we reach target temp for the first time
			or when current temp falls outside the hysteresis after target temp was reached */
			if ((residencyStart == -1 && target_direction && (degHotend(extruder) >= (degTargetHotend(extruder) - TEMP_WINDOW))) ||
				(residencyStart == -1 && !target_direction && (degHotend(extruder) <= (degTargetHotend(extruder) + TEMP_WINDOW))) ||
   2eabe:	20 e0       	ldi	r18, 0x00	; 0
   2eac0:	30 e0       	ldi	r19, 0x00	; 0
   2eac2:	40 e8       	ldi	r20, 0x80	; 128
   2eac4:	5f e3       	ldi	r21, 0x3F	; 63
   2eac6:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   2eaca:	9b 01       	movw	r18, r22
   2eacc:	ac 01       	movw	r20, r24
   2eace:	60 91 5a 0d 	lds	r22, 0x0D5A	; 0x800d5a <current_temperature>
   2ead2:	70 91 5b 0d 	lds	r23, 0x0D5B	; 0x800d5b <current_temperature+0x1>
   2ead6:	80 91 5c 0d 	lds	r24, 0x0D5C	; 0x800d5c <current_temperature+0x2>
   2eada:	90 91 5d 0d 	lds	r25, 0x0D5D	; 0x800d5d <current_temperature+0x3>
   2eade:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   2eae2:	18 16       	cp	r1, r24
   2eae4:	ec f6       	brge	.-70     	; 0x2eaa0 <wait_for_heater(long, unsigned char) [clone .constprop.190]+0x196>
   2eae6:	3c cf       	rjmp	.-392    	; 0x2e960 <wait_for_heater(long, unsigned char) [clone .constprop.190]+0x56>
   2eae8:	f7 fc       	sbrc	r15, 7
   2eaea:	3a cf       	rjmp	.-396    	; 0x2e960 <wait_for_heater(long, unsigned char) [clone .constprop.190]+0x56>
   2eaec:	60 91 5d 12 	lds	r22, 0x125D	; 0x80125d <target_temperature>
   2eaf0:	70 91 5e 12 	lds	r23, 0x125E	; 0x80125e <target_temperature+0x1>
   2eaf4:	07 2e       	mov	r0, r23
   2eaf6:	00 0c       	add	r0, r0
   2eaf8:	88 0b       	sbc	r24, r24
   2eafa:	99 0b       	sbc	r25, r25
   2eafc:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   2eb00:	9b 01       	movw	r18, r22
   2eb02:	ac 01       	movw	r20, r24
				(residencyStart > -1 && fabs(degHotend(extruder) - degTargetHotend(extruder)) > TEMP_HYSTERESIS))
   2eb04:	60 91 5a 0d 	lds	r22, 0x0D5A	; 0x800d5a <current_temperature>
   2eb08:	70 91 5b 0d 	lds	r23, 0x0D5B	; 0x800d5b <current_temperature+0x1>
   2eb0c:	80 91 5c 0d 	lds	r24, 0x0D5C	; 0x800d5c <current_temperature+0x2>
   2eb10:	90 91 5d 0d 	lds	r25, 0x0D5D	; 0x800d5d <current_temperature+0x3>
   2eb14:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   2eb18:	9f 77       	andi	r25, 0x7F	; 127
   2eb1a:	20 e0       	ldi	r18, 0x00	; 0
   2eb1c:	30 e0       	ldi	r19, 0x00	; 0
   2eb1e:	40 ea       	ldi	r20, 0xA0	; 160
   2eb20:	50 e4       	ldi	r21, 0x40	; 64
   2eb22:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   2eb26:	18 16       	cp	r1, r24
   2eb28:	0c f0       	brlt	.+2      	; 0x2eb2c <wait_for_heater(long, unsigned char) [clone .constprop.190]+0x222>
   2eb2a:	1a cf       	rjmp	.-460    	; 0x2e960 <wait_for_heater(long, unsigned char) [clone .constprop.190]+0x56>
   2eb2c:	b9 cf       	rjmp	.-142    	; 0x2eaa0 <wait_for_heater(long, unsigned char) [clone .constprop.190]+0x196>

0002eb2e <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.174]>:
    // Compensate for configurable Extra Loading Distance
    planner_set_current_position_E(planner_get_current_position_E() - (logic.ExtraLoadDistance() - MMU2_FILAMENT_SENSOR_POSITION));
    execute_extruder_sequence(load_to_nozzle_sequence, sizeof(load_to_nozzle_sequence) / sizeof(load_to_nozzle_sequence[0]));
}

void MMU2::ReportError(ErrorCode ec, ErrorSource res) {
   2eb2e:	1f 93       	push	r17
   2eb30:	cf 93       	push	r28
   2eb32:	df 93       	push	r29
   2eb34:	ec 01       	movw	r28, r24
   2eb36:	16 2f       	mov	r17, r22
    // - report only changes of states (we can miss an error message)
    // - may be some combination of MMUAvailable + UseMMU flags and decide based on their state
    // Right now the filtering of MMU_NOT_RESPONDING is done in ReportErrorHook() as it is not a problem if mmu2.cpp

    // Depending on the Progress code, we may want to do some action when an error occurs
    switch (logic.Progress()) {
   2eb38:	80 91 d4 12 	lds	r24, 0x12D4	; 0x8012d4 <MMU2::mmu2+0x42>
   2eb3c:	83 30       	cpi	r24, 0x03	; 3
   2eb3e:	09 f4       	brne	.+2      	; 0x2eb42 <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.174]+0x14>
   2eb40:	4e c0       	rjmp	.+156    	; 0x2ebde <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.174]+0xb0>
   2eb42:	8c 31       	cpi	r24, 0x1C	; 28
   2eb44:	09 f4       	brne	.+2      	; 0x2eb48 <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.174]+0x1a>
   2eb46:	52 c0       	rjmp	.+164    	; 0x2ebec <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.174]+0xbe>
        break;
    default:
        break;
    }

    if (ec != lastErrorCode) { // deduplicate: only report changes in error codes into the log
   2eb48:	80 91 f9 12 	lds	r24, 0x12F9	; 0x8012f9 <MMU2::mmu2+0x67>
   2eb4c:	90 91 fa 12 	lds	r25, 0x12FA	; 0x8012fa <MMU2::mmu2+0x68>
   2eb50:	8c 17       	cp	r24, r28
   2eb52:	9d 07       	cpc	r25, r29
   2eb54:	79 f1       	breq	.+94     	; 0x2ebb4 <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.174]+0x86>
        lastErrorCode = ec;
   2eb56:	d0 93 fa 12 	sts	0x12FA, r29	; 0x8012fa <MMU2::mmu2+0x68>
   2eb5a:	c0 93 f9 12 	sts	0x12F9, r28	; 0x8012f9 <MMU2::mmu2+0x67>
        lastErrorSource = res;
   2eb5e:	10 93 fb 12 	sts	0x12FB, r17	; 0x8012fb <MMU2::mmu2+0x69>
        LogErrorEvent_P(_O(PrusaErrorTitle(PrusaErrorCodeIndex(ec))));
   2eb62:	ce 01       	movw	r24, r28
   2eb64:	0f 94 11 51 	call	0x2a222	; 0x2a222 <MMU2::PrusaErrorCodeIndex(ErrorCode)>
uint16_t PrusaErrorCode(uint8_t i) {
    return pgm_read_word(errorCodes + i);
}

const char *PrusaErrorTitle(uint8_t i) {
    return (const char *)pgm_read_ptr(errorTitles + i);
   2eb68:	e8 2f       	mov	r30, r24
   2eb6a:	f0 e0       	ldi	r31, 0x00	; 0
   2eb6c:	ee 0f       	add	r30, r30
   2eb6e:	ff 1f       	adc	r31, r31
   2eb70:	e0 5e       	subi	r30, 0xE0	; 224
   2eb72:	f0 46       	sbci	r31, 0x60	; 96
   2eb74:	85 91       	lpm	r24, Z+
   2eb76:	94 91       	lpm	r25, Z
   2eb78:	02 96       	adiw	r24, 0x02	; 2
   2eb7a:	0f 94 fa 50 	call	0x2a1f4	; 0x2a1f4 <MMU2::LogEchoEvent_P(char const*)>

        if (ec != ErrorCode::OK && ec != ErrorCode::FILAMENT_EJECTED && ec != ErrorCode::FILAMENT_CHANGE) {
   2eb7e:	c1 30       	cpi	r28, 0x01	; 1
   2eb80:	d1 05       	cpc	r29, r1
   2eb82:	c1 f0       	breq	.+48     	; 0x2ebb4 <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.174]+0x86>
   2eb84:	cc 30       	cpi	r28, 0x0C	; 12
   2eb86:	80 e8       	ldi	r24, 0x80	; 128
   2eb88:	d8 07       	cpc	r29, r24
   2eb8a:	a1 f0       	breq	.+40     	; 0x2ebb4 <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.174]+0x86>
   2eb8c:	c9 32       	cpi	r28, 0x29	; 41
   2eb8e:	80 e8       	ldi	r24, 0x80	; 128
   2eb90:	d8 07       	cpc	r29, r24
   2eb92:	81 f0       	breq	.+32     	; 0x2ebb4 <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.174]+0x86>
            IncrementMMUFails();
   2eb94:	0f 94 28 50 	call	0x2a050	; 0x2a050 <MMU2::IncrementMMUFails()>
                | (uint16_t)ErrorCode::TMC_OVER_TEMPERATURE_ERROR
                | (uint16_t)ErrorCode::MMU_SOLDERING_NEEDS_ATTENTION ) & 0x7fffU; // skip the top bit
            // clang-format on
            static_assert(tmcMask == 0x7e00); // just make sure we fail compilation if any of the TMC error codes change

            if ((uint16_t)ec & tmcMask) { // @@TODO can be optimized to uint8_t operation
   2eb98:	ce 01       	movw	r24, r28
   2eb9a:	88 27       	eor	r24, r24
   2eb9c:	9e 77       	andi	r25, 0x7E	; 126
   2eb9e:	89 2b       	or	r24, r25
   2eba0:	49 f0       	breq	.+18     	; 0x2ebb4 <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.174]+0x86>

    /// Set toolchange counter to zero
    inline void ClearToolChangeCounter() { toolchange_counter = 0; };

    inline uint16_t TMCFailures() const { return tmcFailures; }
    inline void IncrementTMCFailures() { ++tmcFailures; }
   2eba2:	80 91 07 13 	lds	r24, 0x1307	; 0x801307 <MMU2::mmu2+0x75>
   2eba6:	90 91 08 13 	lds	r25, 0x1308	; 0x801308 <MMU2::mmu2+0x76>
   2ebaa:	01 96       	adiw	r24, 0x01	; 1
   2ebac:	90 93 08 13 	sts	0x1308, r25	; 0x801308 <MMU2::mmu2+0x76>
   2ebb0:	80 93 07 13 	sts	0x1307, r24	; 0x801307 <MMU2::mmu2+0x75>
        return true;
    }
}

bool MMU2::RetryIfPossible(ErrorCode ec) {
    if (logic.RetryAttempts()) {
   2ebb4:	80 91 e6 12 	lds	r24, 0x12E6	; 0x8012e6 <MMU2::mmu2+0x54>
   2ebb8:	88 23       	and	r24, r24
   2ebba:	d9 f0       	breq	.+54     	; 0x2ebf2 <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.174]+0xc4>

    return Buttons::NoButton;
}

void SetButtonResponse(ButtonOperations rsp) {
    buttonSelectedOperation = rsp;
   2ebbc:	11 e0       	ldi	r17, 0x01	; 1
   2ebbe:	10 93 44 0d 	sts	0x0D44, r17	; 0x800d44 <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.450>
        SetButtonResponse(ButtonOperations::Retry);
        // check, that Retry is actually allowed on that operation
        if (ButtonAvailable(ec) != Buttons::NoButton) {
   2ebc2:	ce 01       	movw	r24, r28
   2ebc4:	0f 94 9c 53 	call	0x2a738	; 0x2a738 <MMU2::ButtonAvailable(ErrorCode)>
   2ebc8:	8f 3f       	cpi	r24, 0xFF	; 255
   2ebca:	99 f0       	breq	.+38     	; 0x2ebf2 <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.174]+0xc4>

    void ResetCommunicationTimeoutAttempts();

    constexpr bool InAutoRetry() const { return inAutoRetry; }
    void SetInAutoRetry(bool iar) {
        inAutoRetry = iar;
   2ebcc:	10 93 e7 12 	sts	0x12E7, r17	; 0x8012e7 <MMU2::mmu2+0x55>
            logic.SetInAutoRetry(true);
            SERIAL_ECHOLNPGM("RetryButtonPressed");
   2ebd0:	8d e0       	ldi	r24, 0x0D	; 13
   2ebd2:	9f e9       	ldi	r25, 0x9F	; 159
            && mmu2Magic[2] == 'U'
            && mmu2Magic[3] == '2'
            && mmu2Magic[4] == ':'
            && strlen_constexpr(mmu2Magic) == 5,
        "MMU2 logging prefix mismatch, must be updated at various spots");
}
   2ebd4:	df 91       	pop	r29
   2ebd6:	cf 91       	pop	r28
   2ebd8:	1f 91       	pop	r17
    if (logic.RetryAttempts()) {
        SetButtonResponse(ButtonOperations::Retry);
        // check, that Retry is actually allowed on that operation
        if (ButtonAvailable(ec) != Buttons::NoButton) {
            logic.SetInAutoRetry(true);
            SERIAL_ECHOLNPGM("RetryButtonPressed");
   2ebda:	0c 94 bd 7c 	jmp	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
    // Right now the filtering of MMU_NOT_RESPONDING is done in ReportErrorHook() as it is not a problem if mmu2.cpp

    // Depending on the Progress code, we may want to do some action when an error occurs
    switch (logic.Progress()) {
    case ProgressCode::UnloadingToFinda:
        unloadFilamentStarted = false;
   2ebde:	10 92 04 13 	sts	0x1304, r1	; 0x801304 <MMU2::mmu2+0x72>
float move_raise_z(float delta) {
    return raise_z(delta);
}

void planner_abort_queued_moves() {
    planner_abort_hard();
   2ebe2:	0f 94 fb 4e 	call	0x29df6	; 0x29df6 <planner_abort_hard()>
    // Unblock the planner. This should be safe in the
    // toolchange context. Currently we are mainly aborting
    // excess E-moves after detecting filament during toolchange.
    // If a MMU error is reported, the planner must be unblocked
    // as well so the extruder can be parked safely.
    planner_aborted = false;
   2ebe6:	10 92 42 0d 	sts	0x0D42, r1	; 0x800d42 <planner_aborted>
   2ebea:	ae cf       	rjmp	.-164    	; 0x2eb48 <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.174]+0x1a>
        planner_abort_queued_moves();  // Abort excess E-moves to be safe
        break;
    case ProgressCode::FeedingToFSensor:
        // FSENSOR error during load. Make sure E-motor stops moving.
        loadFilamentStarted = false;
   2ebec:	10 92 03 13 	sts	0x1303, r1	; 0x801303 <MMU2::mmu2+0x71>
   2ebf0:	f8 cf       	rjmp	.-16     	; 0x2ebe2 <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.174]+0xb4>
   2ebf2:	10 92 e7 12 	sts	0x12E7, r1	; 0x8012e7 <MMU2::mmu2+0x55>
bool TuneMenuEntered() {
    return putErrorScreenToSleep;
}

void ReportErrorHook(CommandInProgress /*cip*/, ErrorCode ec, uint8_t /*es*/) {
    if (putErrorScreenToSleep) return;
   2ebf6:	80 91 43 0d 	lds	r24, 0x0D43	; 0x800d43 <_ZN4MMU2L21putErrorScreenToSleepE.lto_priv.451>
   2ebfa:	81 11       	cpse	r24, r1
   2ebfc:	06 c0       	rjmp	.+12     	; 0x2ec0a <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.174]+0xdc>
   2ebfe:	ce 01       	movw	r24, r28
            && mmu2Magic[2] == 'U'
            && mmu2Magic[3] == '2'
            && mmu2Magic[4] == ':'
            && strlen_constexpr(mmu2Magic) == 5,
        "MMU2 logging prefix mismatch, must be updated at various spots");
}
   2ec00:	df 91       	pop	r29
   2ec02:	cf 91       	pop	r28
   2ec04:	1f 91       	pop	r17
   2ec06:	0d 94 62 52 	jmp	0x2a4c4	; 0x2a4c4 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]>
   2ec0a:	df 91       	pop	r29
   2ec0c:	cf 91       	pop	r28
   2ec0e:	1f 91       	pop	r17
   2ec10:	08 95       	ret

0002ec12 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]>:
 * \a nbyte.  If an error occurs, write() returns -1.  Possible errors
 * include write() is called before a file has been opened, write is called
 * for a read-only file, device is full, a corrupt file system or an I/O error.
 *
 */
int16_t SdBaseFile::write(const void* buf, uint16_t nbyte) {
   2ec12:	2f 92       	push	r2
   2ec14:	3f 92       	push	r3
   2ec16:	4f 92       	push	r4
   2ec18:	5f 92       	push	r5
   2ec1a:	6f 92       	push	r6
   2ec1c:	7f 92       	push	r7
   2ec1e:	8f 92       	push	r8
   2ec20:	9f 92       	push	r9
   2ec22:	af 92       	push	r10
   2ec24:	bf 92       	push	r11
   2ec26:	cf 92       	push	r12
   2ec28:	df 92       	push	r13
   2ec2a:	ef 92       	push	r14
   2ec2c:	ff 92       	push	r15
   2ec2e:	0f 93       	push	r16
   2ec30:	1f 93       	push	r17
   2ec32:	cf 93       	push	r28
   2ec34:	df 93       	push	r29
   2ec36:	00 d0       	rcall	.+0      	; 0x2ec38 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x26>
   2ec38:	1f 92       	push	r1
   2ec3a:	cd b7       	in	r28, 0x3d	; 61
   2ec3c:	de b7       	in	r29, 0x3e	; 62
   2ec3e:	5c 01       	movw	r10, r24
   2ec40:	4b 01       	movw	r8, r22

  // number of bytes left to write  -  must be before goto statements
  uint16_t nToWrite = nbyte;

  // error if not a normal file or is read-only
  if (!isFile() || !(flags_ & O_WRITE)) goto fail;
   2ec42:	80 91 6a 16 	lds	r24, 0x166A	; 0x80166a <card+0x295>
   2ec46:	81 30       	cpi	r24, 0x01	; 1
   2ec48:	09 f0       	breq	.+2      	; 0x2ec4c <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x3a>
   2ec4a:	de c0       	rjmp	.+444    	; 0x2ee08 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x1f6>
   2ec4c:	80 91 68 16 	lds	r24, 0x1668	; 0x801668 <card+0x293>
   2ec50:	81 ff       	sbrs	r24, 1
   2ec52:	da c0       	rjmp	.+436    	; 0x2ee08 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x1f6>

  // seek to end of file if append flag
  if ((flags_ & O_APPEND) && curPosition_ != fileSize_) {
   2ec54:	82 fd       	sbrc	r24, 2
   2ec56:	bc c0       	rjmp	.+376    	; 0x2edd0 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x1be>
 * \a nbyte.  If an error occurs, write() returns -1.  Possible errors
 * include write() is called before a file has been opened, write is called
 * for a read-only file, device is full, a corrupt file system or an I/O error.
 *
 */
int16_t SdBaseFile::write(const void* buf, uint16_t nbyte) {
   2ec58:	74 01       	movw	r14, r8
          curCluster_ = next;
        }
      }
    }
    // max space in block
    uint16_t n = 512 - blockOffset;
   2ec5a:	21 2c       	mov	r2, r1
   2ec5c:	32 e0       	ldi	r19, 0x02	; 2
   2ec5e:	33 2e       	mov	r3, r19
   2ec60:	00 91 6f 16 	lds	r16, 0x166F	; 0x80166f <card+0x29a>
   2ec64:	10 91 70 16 	lds	r17, 0x1670	; 0x801670 <card+0x29b>
   2ec68:	20 91 71 16 	lds	r18, 0x1671	; 0x801671 <card+0x29c>
   2ec6c:	30 91 72 16 	lds	r19, 0x1672	; 0x801672 <card+0x29d>
  // seek to end of file if append flag
  if ((flags_ & O_APPEND) && curPosition_ != fileSize_) {
    if (!seekEnd()) goto fail;
  }

  while (nToWrite > 0) {
   2ec70:	e1 14       	cp	r14, r1
   2ec72:	f1 04       	cpc	r15, r1
   2ec74:	09 f4       	brne	.+2      	; 0x2ec78 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x66>
   2ec76:	30 c1       	rjmp	.+608    	; 0x2eed8 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x2c6>
    uint8_t blockOfCluster = vol_->blockOfCluster(curPosition_);
   2ec78:	80 91 80 16 	lds	r24, 0x1680	; 0x801680 <card+0x2ab>
   2ec7c:	90 91 81 16 	lds	r25, 0x1681	; 0x801681 <card+0x2ac>
  uint16_t rootDirEntryCount_;  // number of entries in FAT16 root dir
  uint32_t rootDirStart_;       // root start block for FAT16, cluster for FAT32
  //----------------------------------------------------------------------------
  bool allocContiguous(uint32_t count, uint32_t* curCluster);
  uint8_t blockOfCluster(uint32_t position) const {
          return (position >> 9) & (blocksPerCluster_ - 1);}
   2ec80:	dc 01       	movw	r26, r24
   2ec82:	14 96       	adiw	r26, 0x04	; 4
   2ec84:	7c 90       	ld	r7, X
   2ec86:	7a 94       	dec	r7
   2ec88:	b9 01       	movw	r22, r18
   2ec8a:	a8 01       	movw	r20, r16
   2ec8c:	29 e0       	ldi	r18, 0x09	; 9
   2ec8e:	76 95       	lsr	r23
   2ec90:	67 95       	ror	r22
   2ec92:	57 95       	ror	r21
   2ec94:	47 95       	ror	r20
   2ec96:	2a 95       	dec	r18
   2ec98:	d1 f7       	brne	.-12     	; 0x2ec8e <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x7c>
   2ec9a:	74 22       	and	r7, r20
    uint16_t blockOffset = curPosition_ & 0X1FF;
   2ec9c:	11 70       	andi	r17, 0x01	; 1
    if (blockOfCluster == 0 && blockOffset == 0) {
   2ec9e:	71 10       	cpse	r7, r1
   2eca0:	25 c0       	rjmp	.+74     	; 0x2ecec <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0xda>
   2eca2:	01 15       	cp	r16, r1
   2eca4:	11 05       	cpc	r17, r1
   2eca6:	11 f5       	brne	.+68     	; 0x2ecec <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0xda>
   2eca8:	40 91 6b 16 	lds	r20, 0x166B	; 0x80166b <card+0x296>
   2ecac:	50 91 6c 16 	lds	r21, 0x166C	; 0x80166c <card+0x297>
   2ecb0:	60 91 6d 16 	lds	r22, 0x166D	; 0x80166d <card+0x298>
   2ecb4:	70 91 6e 16 	lds	r23, 0x166E	; 0x80166e <card+0x299>
      // start of new cluster
      if (curCluster_ == 0) {
   2ecb8:	41 15       	cp	r20, r1
   2ecba:	51 05       	cpc	r21, r1
   2ecbc:	61 05       	cpc	r22, r1
   2ecbe:	71 05       	cpc	r23, r1
   2ecc0:	09 f0       	breq	.+2      	; 0x2ecc4 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0xb2>
   2ecc2:	a8 c0       	rjmp	.+336    	; 0x2ee14 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x202>
        if (firstCluster_ == 0) {
   2ecc4:	80 91 7c 16 	lds	r24, 0x167C	; 0x80167c <card+0x2a7>
   2ecc8:	90 91 7d 16 	lds	r25, 0x167D	; 0x80167d <card+0x2a8>
   2eccc:	a0 91 7e 16 	lds	r26, 0x167E	; 0x80167e <card+0x2a9>
   2ecd0:	b0 91 7f 16 	lds	r27, 0x167F	; 0x80167f <card+0x2aa>
   2ecd4:	00 97       	sbiw	r24, 0x00	; 0
   2ecd6:	a1 05       	cpc	r26, r1
   2ecd8:	b1 05       	cpc	r27, r1
   2ecda:	09 f0       	breq	.+2      	; 0x2ecde <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0xcc>
   2ecdc:	b4 c0       	rjmp	.+360    	; 0x2ee46 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x234>
      } else {
        uint32_t next;
        if (!vol_->fatGet(curCluster_, &next)) goto fail;
        if (vol_->isEOC(next)) {
          // add cluster if at end of chain
          if (!addCluster()) goto fail;
   2ecde:	87 e6       	ldi	r24, 0x67	; 103
   2ece0:	96 e1       	ldi	r25, 0x16	; 22
   2ece2:	0f 94 9f 2d 	call	0x25b3e	; 0x25b3e <SdBaseFile::addCluster()>
   2ece6:	88 23       	and	r24, r24
   2ece8:	09 f4       	brne	.+2      	; 0x2ecec <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0xda>
   2ecea:	8e c0       	rjmp	.+284    	; 0x2ee08 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x1f6>
          curCluster_ = next;
        }
      }
    }
    // max space in block
    uint16_t n = 512 - blockOffset;
   2ecec:	c1 01       	movw	r24, r2
   2ecee:	80 1b       	sub	r24, r16
   2ecf0:	91 0b       	sbc	r25, r17
   2ecf2:	67 01       	movw	r12, r14
   2ecf4:	8e 15       	cp	r24, r14
   2ecf6:	9f 05       	cpc	r25, r15
   2ecf8:	08 f4       	brcc	.+2      	; 0x2ecfc <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0xea>
   2ecfa:	6c 01       	movw	r12, r24

    // lesser of space and amount to write
    if (n > nToWrite) n = nToWrite;

    // block for data write
    uint32_t block = vol_->clusterStartBlock(curCluster_) + blockOfCluster;
   2ecfc:	e0 91 80 16 	lds	r30, 0x1680	; 0x801680 <card+0x2ab>
   2ed00:	f0 91 81 16 	lds	r31, 0x1681	; 0x801681 <card+0x2ac>
  uint32_t clusterStartBlock(uint32_t cluster) const {
           return dataStartBlock_ + ((cluster - 2) << clusterSizeShift_);}
   2ed04:	80 91 6b 16 	lds	r24, 0x166B	; 0x80166b <card+0x296>
   2ed08:	90 91 6c 16 	lds	r25, 0x166C	; 0x80166c <card+0x297>
   2ed0c:	a0 91 6d 16 	lds	r26, 0x166D	; 0x80166d <card+0x298>
   2ed10:	b0 91 6e 16 	lds	r27, 0x166E	; 0x80166e <card+0x299>
   2ed14:	02 97       	sbiw	r24, 0x02	; 2
   2ed16:	a1 09       	sbc	r26, r1
   2ed18:	b1 09       	sbc	r27, r1
   2ed1a:	25 85       	ldd	r18, Z+13	; 0x0d
   2ed1c:	04 c0       	rjmp	.+8      	; 0x2ed26 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x114>
   2ed1e:	88 0f       	add	r24, r24
   2ed20:	99 1f       	adc	r25, r25
   2ed22:	aa 1f       	adc	r26, r26
   2ed24:	bb 1f       	adc	r27, r27
   2ed26:	2a 95       	dec	r18
   2ed28:	d2 f7       	brpl	.-12     	; 0x2ed1e <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x10c>
   2ed2a:	46 85       	ldd	r20, Z+14	; 0x0e
   2ed2c:	57 85       	ldd	r21, Z+15	; 0x0f
   2ed2e:	60 89       	ldd	r22, Z+16	; 0x10
   2ed30:	71 89       	ldd	r23, Z+17	; 0x11
   2ed32:	84 0f       	add	r24, r20
   2ed34:	95 1f       	adc	r25, r21
   2ed36:	a6 1f       	adc	r26, r22
   2ed38:	b7 1f       	adc	r27, r23
   2ed3a:	9c 01       	movw	r18, r24
   2ed3c:	ad 01       	movw	r20, r26
   2ed3e:	27 0d       	add	r18, r7
   2ed40:	31 1d       	adc	r19, r1
   2ed42:	41 1d       	adc	r20, r1
   2ed44:	51 1d       	adc	r21, r1
   2ed46:	29 01       	movw	r4, r18
   2ed48:	3a 01       	movw	r6, r20
    if (n == 512) {
   2ed4a:	c1 14       	cp	r12, r1
   2ed4c:	32 e0       	ldi	r19, 0x02	; 2
   2ed4e:	d3 06       	cpc	r13, r19
   2ed50:	09 f0       	breq	.+2      	; 0x2ed54 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x142>
   2ed52:	8a c0       	rjmp	.+276    	; 0x2ee68 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x256>
      // full block - don't need to use cache
      if (vol_->cacheBlockNumber() == block) {
   2ed54:	80 91 3a 0e 	lds	r24, 0x0E3A	; 0x800e3a <SdVolume::cacheBlockNumber_>
   2ed58:	90 91 3b 0e 	lds	r25, 0x0E3B	; 0x800e3b <SdVolume::cacheBlockNumber_+0x1>
   2ed5c:	a0 91 3c 0e 	lds	r26, 0x0E3C	; 0x800e3c <SdVolume::cacheBlockNumber_+0x2>
   2ed60:	b0 91 3d 0e 	lds	r27, 0x0E3D	; 0x800e3d <SdVolume::cacheBlockNumber_+0x3>
   2ed64:	48 16       	cp	r4, r24
   2ed66:	59 06       	cpc	r5, r25
   2ed68:	6a 06       	cpc	r6, r26
   2ed6a:	7b 06       	cpc	r7, r27
   2ed6c:	69 f4       	brne	.+26     	; 0x2ed88 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x176>
  static bool cacheFlush();
  static bool cacheRawBlock(uint32_t blockNumber, bool dirty);
#endif  // USE_MULTIPLE_CARDS
  // used by SdBaseFile write to assign cache to SD location
  void cacheSetBlockNumber(uint32_t blockNumber, bool dirty) {
    cacheDirty_ = dirty;
   2ed6e:	10 92 42 0e 	sts	0x0E42, r1	; 0x800e42 <SdVolume::cacheDirty_>
    cacheBlockNumber_  = blockNumber;
   2ed72:	8f ef       	ldi	r24, 0xFF	; 255
   2ed74:	9f ef       	ldi	r25, 0xFF	; 255
   2ed76:	dc 01       	movw	r26, r24
   2ed78:	80 93 3a 0e 	sts	0x0E3A, r24	; 0x800e3a <SdVolume::cacheBlockNumber_>
   2ed7c:	90 93 3b 0e 	sts	0x0E3B, r25	; 0x800e3b <SdVolume::cacheBlockNumber_+0x1>
   2ed80:	a0 93 3c 0e 	sts	0x0E3C, r26	; 0x800e3c <SdVolume::cacheBlockNumber_+0x2>
   2ed84:	b0 93 3d 0e 	sts	0x0E3D, r27	; 0x800e3d <SdVolume::cacheBlockNumber_+0x3>
    return  cluster >= FAT32EOC_MIN;
  }
  bool readBlock(uint32_t block, uint8_t* dst) {
    return sdCard_->readBlock(block, dst);}
  bool writeBlock(uint32_t block, const uint8_t* dst) {
    return sdCard_->writeBlock(block, dst);
   2ed88:	95 01       	movw	r18, r10
   2ed8a:	b3 01       	movw	r22, r6
   2ed8c:	a2 01       	movw	r20, r4
   2ed8e:	80 91 43 0e 	lds	r24, 0x0E43	; 0x800e43 <SdVolume::sdCard_>
   2ed92:	90 91 44 0e 	lds	r25, 0x0E44	; 0x800e44 <SdVolume::sdCard_+0x1>
   2ed96:	0f 94 2a 29 	call	0x25254	; 0x25254 <Sd2Card::writeBlock(unsigned long, unsigned char const*)>
        // invalidate cache if block is in cache
        vol_->cacheSetBlockNumber(0XFFFFFFFF, false);
      }
      if (!vol_->writeBlock(block, src)) goto fail;
   2ed9a:	88 23       	and	r24, r24
   2ed9c:	a9 f1       	breq	.+106    	; 0x2ee08 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x1f6>
        if (!vol_->cacheRawBlock(block, SdVolume::CACHE_FOR_WRITE)) goto fail;
      }
      uint8_t* dst = vol_->cache()->data + blockOffset;
      memcpy(dst, src, n);
    }
    curPosition_ += n;
   2ed9e:	80 91 6f 16 	lds	r24, 0x166F	; 0x80166f <card+0x29a>
   2eda2:	90 91 70 16 	lds	r25, 0x1670	; 0x801670 <card+0x29b>
   2eda6:	a0 91 71 16 	lds	r26, 0x1671	; 0x801671 <card+0x29c>
   2edaa:	b0 91 72 16 	lds	r27, 0x1672	; 0x801672 <card+0x29d>
   2edae:	8c 0d       	add	r24, r12
   2edb0:	9d 1d       	adc	r25, r13
   2edb2:	a1 1d       	adc	r26, r1
   2edb4:	b1 1d       	adc	r27, r1
   2edb6:	80 93 6f 16 	sts	0x166F, r24	; 0x80166f <card+0x29a>
   2edba:	90 93 70 16 	sts	0x1670, r25	; 0x801670 <card+0x29b>
   2edbe:	a0 93 71 16 	sts	0x1671, r26	; 0x801671 <card+0x29c>
   2edc2:	b0 93 72 16 	sts	0x1672, r27	; 0x801672 <card+0x29d>
    src += n;
   2edc6:	ac 0c       	add	r10, r12
   2edc8:	bd 1c       	adc	r11, r13
    nToWrite -= n;
   2edca:	ec 18       	sub	r14, r12
   2edcc:	fd 08       	sbc	r15, r13
   2edce:	48 cf       	rjmp	.-368    	; 0x2ec60 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x4e>

  // error if not a normal file or is read-only
  if (!isFile() || !(flags_ & O_WRITE)) goto fail;

  // seek to end of file if append flag
  if ((flags_ & O_APPEND) && curPosition_ != fileSize_) {
   2edd0:	40 91 78 16 	lds	r20, 0x1678	; 0x801678 <card+0x2a3>
   2edd4:	50 91 79 16 	lds	r21, 0x1679	; 0x801679 <card+0x2a4>
   2edd8:	60 91 7a 16 	lds	r22, 0x167A	; 0x80167a <card+0x2a5>
   2eddc:	70 91 7b 16 	lds	r23, 0x167B	; 0x80167b <card+0x2a6>
   2ede0:	80 91 6f 16 	lds	r24, 0x166F	; 0x80166f <card+0x29a>
   2ede4:	90 91 70 16 	lds	r25, 0x1670	; 0x801670 <card+0x29b>
   2ede8:	a0 91 71 16 	lds	r26, 0x1671	; 0x801671 <card+0x29c>
   2edec:	b0 91 72 16 	lds	r27, 0x1672	; 0x801672 <card+0x29d>
   2edf0:	48 17       	cp	r20, r24
   2edf2:	59 07       	cpc	r21, r25
   2edf4:	6a 07       	cpc	r22, r26
   2edf6:	7b 07       	cpc	r23, r27
   2edf8:	09 f4       	brne	.+2      	; 0x2edfc <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x1ea>
   2edfa:	2e cf       	rjmp	.-420    	; 0x2ec58 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x46>
  }
  /** Set the files position to end-of-file + \a offset. See seekSet().
   * \param[in] offset The new position in bytes from end-of-file.
   * \return true for success or false for failure.
   */
  bool seekEnd(int32_t offset = 0) {return seekSet(fileSize_ + offset);}
   2edfc:	87 e6       	ldi	r24, 0x67	; 103
   2edfe:	96 e1       	ldi	r25, 0x16	; 22
   2ee00:	0f 94 0b 2d 	call	0x25a16	; 0x25a16 <SdBaseFile::seekSet(unsigned long)>
    if (!seekEnd()) goto fail;
   2ee04:	81 11       	cpse	r24, r1
   2ee06:	28 cf       	rjmp	.-432    	; 0x2ec58 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x46>
  }
  return nbyte;

 fail:
  // return for write error
  writeError = true;
   2ee08:	81 e0       	ldi	r24, 0x01	; 1
   2ee0a:	80 93 67 16 	sts	0x1667, r24	; 0x801667 <card+0x292>
  return -1;
   2ee0e:	8f ef       	ldi	r24, 0xFF	; 255
   2ee10:	9f ef       	ldi	r25, 0xFF	; 255
   2ee12:	81 c0       	rjmp	.+258    	; 0x2ef16 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x304>
        } else {
          curCluster_ = firstCluster_;
        }
      } else {
        uint32_t next;
        if (!vol_->fatGet(curCluster_, &next)) goto fail;
   2ee14:	9e 01       	movw	r18, r28
   2ee16:	2f 5f       	subi	r18, 0xFF	; 255
   2ee18:	3f 4f       	sbci	r19, 0xFF	; 255
   2ee1a:	0f 94 55 2b 	call	0x256aa	; 0x256aa <SdVolume::fatGet(unsigned long, unsigned long*)>
   2ee1e:	88 23       	and	r24, r24
   2ee20:	99 f3       	breq	.-26     	; 0x2ee08 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x1f6>
        if (vol_->isEOC(next)) {
   2ee22:	89 81       	ldd	r24, Y+1	; 0x01
   2ee24:	9a 81       	ldd	r25, Y+2	; 0x02
   2ee26:	ab 81       	ldd	r26, Y+3	; 0x03
   2ee28:	bc 81       	ldd	r27, Y+4	; 0x04
    return fatPut(cluster, 0x0FFFFFFF);
  }
  bool freeChain(uint32_t cluster);
  bool isEOC(uint32_t cluster) const {
    if (FAT12_SUPPORT && fatType_ == 12) return  cluster >= FAT12EOC_MIN;
    if (fatType_ == 16) return cluster >= FAT16EOC_MIN;
   2ee2a:	e0 91 80 16 	lds	r30, 0x1680	; 0x801680 <card+0x2ab>
   2ee2e:	f0 91 81 16 	lds	r31, 0x1681	; 0x801681 <card+0x2ac>
   2ee32:	27 89       	ldd	r18, Z+23	; 0x17
   2ee34:	20 31       	cpi	r18, 0x10	; 16
   2ee36:	81 f4       	brne	.+32     	; 0x2ee58 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x246>
   2ee38:	88 3f       	cpi	r24, 0xF8	; 248
   2ee3a:	ef ef       	ldi	r30, 0xFF	; 255
   2ee3c:	9e 07       	cpc	r25, r30
   2ee3e:	a1 05       	cpc	r26, r1
   2ee40:	b1 05       	cpc	r27, r1
   2ee42:	08 f0       	brcs	.+2      	; 0x2ee46 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x234>
   2ee44:	4c cf       	rjmp	.-360    	; 0x2ecde <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0xcc>
          // add cluster if at end of chain
          if (!addCluster()) goto fail;
        } else {
          curCluster_ = next;
   2ee46:	80 93 6b 16 	sts	0x166B, r24	; 0x80166b <card+0x296>
   2ee4a:	90 93 6c 16 	sts	0x166C, r25	; 0x80166c <card+0x297>
   2ee4e:	a0 93 6d 16 	sts	0x166D, r26	; 0x80166d <card+0x298>
   2ee52:	b0 93 6e 16 	sts	0x166E, r27	; 0x80166e <card+0x299>
   2ee56:	4a cf       	rjmp	.-364    	; 0x2ecec <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0xda>
    return  cluster >= FAT32EOC_MIN;
   2ee58:	88 3f       	cpi	r24, 0xF8	; 248
   2ee5a:	ff ef       	ldi	r31, 0xFF	; 255
   2ee5c:	9f 07       	cpc	r25, r31
   2ee5e:	af 07       	cpc	r26, r31
   2ee60:	ff e0       	ldi	r31, 0x0F	; 15
   2ee62:	bf 07       	cpc	r27, r31
   2ee64:	80 f3       	brcs	.-32     	; 0x2ee46 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x234>
   2ee66:	3b cf       	rjmp	.-394    	; 0x2ecde <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0xcc>
        // invalidate cache if block is in cache
        vol_->cacheSetBlockNumber(0XFFFFFFFF, false);
      }
      if (!vol_->writeBlock(block, src)) goto fail;
    } else {
      if (blockOffset == 0 && curPosition_ >= fileSize_) {
   2ee68:	01 15       	cp	r16, r1
   2ee6a:	11 05       	cpc	r17, r1
   2ee6c:	69 f5       	brne	.+90     	; 0x2eec8 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x2b6>
   2ee6e:	40 91 6f 16 	lds	r20, 0x166F	; 0x80166f <card+0x29a>
   2ee72:	50 91 70 16 	lds	r21, 0x1670	; 0x801670 <card+0x29b>
   2ee76:	60 91 71 16 	lds	r22, 0x1671	; 0x801671 <card+0x29c>
   2ee7a:	70 91 72 16 	lds	r23, 0x1672	; 0x801672 <card+0x29d>
   2ee7e:	80 91 78 16 	lds	r24, 0x1678	; 0x801678 <card+0x2a3>
   2ee82:	90 91 79 16 	lds	r25, 0x1679	; 0x801679 <card+0x2a4>
   2ee86:	a0 91 7a 16 	lds	r26, 0x167A	; 0x80167a <card+0x2a5>
   2ee8a:	b0 91 7b 16 	lds	r27, 0x167B	; 0x80167b <card+0x2a6>
   2ee8e:	48 17       	cp	r20, r24
   2ee90:	59 07       	cpc	r21, r25
   2ee92:	6a 07       	cpc	r22, r26
   2ee94:	7b 07       	cpc	r23, r27
   2ee96:	c0 f0       	brcs	.+48     	; 0x2eec8 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x2b6>
        // start of new block don't need to read into cache
        if (!vol_->cacheFlush()) goto fail;
   2ee98:	0f 94 8e 29 	call	0x2531c	; 0x2531c <SdVolume::cacheFlush()>
   2ee9c:	88 23       	and	r24, r24
   2ee9e:	09 f4       	brne	.+2      	; 0x2eea2 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x290>
   2eea0:	b3 cf       	rjmp	.-154    	; 0x2ee08 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x1f6>
  static bool cacheFlush();
  static bool cacheRawBlock(uint32_t blockNumber, bool dirty);
#endif  // USE_MULTIPLE_CARDS
  // used by SdBaseFile write to assign cache to SD location
  void cacheSetBlockNumber(uint32_t blockNumber, bool dirty) {
    cacheDirty_ = dirty;
   2eea2:	81 e0       	ldi	r24, 0x01	; 1
   2eea4:	80 93 42 0e 	sts	0x0E42, r24	; 0x800e42 <SdVolume::cacheDirty_>
    cacheBlockNumber_  = blockNumber;
   2eea8:	40 92 3a 0e 	sts	0x0E3A, r4	; 0x800e3a <SdVolume::cacheBlockNumber_>
   2eeac:	50 92 3b 0e 	sts	0x0E3B, r5	; 0x800e3b <SdVolume::cacheBlockNumber_+0x1>
   2eeb0:	60 92 3c 0e 	sts	0x0E3C, r6	; 0x800e3c <SdVolume::cacheBlockNumber_+0x2>
   2eeb4:	70 92 3d 0e 	sts	0x0E3D, r7	; 0x800e3d <SdVolume::cacheBlockNumber_+0x3>
      } else {
        // rewrite part of block
        if (!vol_->cacheRawBlock(block, SdVolume::CACHE_FOR_WRITE)) goto fail;
      }
      uint8_t* dst = vol_->cache()->data + blockOffset;
      memcpy(dst, src, n);
   2eeb8:	a6 01       	movw	r20, r12
   2eeba:	b5 01       	movw	r22, r10
   2eebc:	c8 01       	movw	r24, r16
   2eebe:	8a 5b       	subi	r24, 0xBA	; 186
   2eec0:	91 4f       	sbci	r25, 0xF1	; 241
   2eec2:	0f 94 09 aa 	call	0x35412	; 0x35412 <memcpy>
   2eec6:	6b cf       	rjmp	.-298    	; 0x2ed9e <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x18c>
        if (!vol_->cacheFlush()) goto fail;
        // set cache dirty and SD address of block
        vol_->cacheSetBlockNumber(block, true);
      } else {
        // rewrite part of block
        if (!vol_->cacheRawBlock(block, SdVolume::CACHE_FOR_WRITE)) goto fail;
   2eec8:	41 e0       	ldi	r20, 0x01	; 1
   2eeca:	c3 01       	movw	r24, r6
   2eecc:	b2 01       	movw	r22, r4
   2eece:	0f 94 86 2a 	call	0x2550c	; 0x2550c <SdVolume::cacheRawBlock(unsigned long, bool)>
   2eed2:	81 11       	cpse	r24, r1
   2eed4:	f1 cf       	rjmp	.-30     	; 0x2eeb8 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x2a6>
   2eed6:	98 cf       	rjmp	.-208    	; 0x2ee08 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x1f6>
    }
    curPosition_ += n;
    src += n;
    nToWrite -= n;
  }
  if (curPosition_ > fileSize_) {
   2eed8:	80 91 78 16 	lds	r24, 0x1678	; 0x801678 <card+0x2a3>
   2eedc:	90 91 79 16 	lds	r25, 0x1679	; 0x801679 <card+0x2a4>
   2eee0:	a0 91 7a 16 	lds	r26, 0x167A	; 0x80167a <card+0x2a5>
   2eee4:	b0 91 7b 16 	lds	r27, 0x167B	; 0x80167b <card+0x2a6>
   2eee8:	80 17       	cp	r24, r16
   2eeea:	91 07       	cpc	r25, r17
   2eeec:	a2 07       	cpc	r26, r18
   2eeee:	b3 07       	cpc	r27, r19
   2eef0:	68 f4       	brcc	.+26     	; 0x2ef0c <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x2fa>
   2eef2:	80 91 68 16 	lds	r24, 0x1668	; 0x801668 <card+0x293>
    // update fileSize and insure sync will update dir entry
    fileSize_ = curPosition_;
   2eef6:	00 93 78 16 	sts	0x1678, r16	; 0x801678 <card+0x2a3>
   2eefa:	10 93 79 16 	sts	0x1679, r17	; 0x801679 <card+0x2a4>
   2eefe:	20 93 7a 16 	sts	0x167A, r18	; 0x80167a <card+0x2a5>
   2ef02:	30 93 7b 16 	sts	0x167B, r19	; 0x80167b <card+0x2a6>
    flags_ |= F_FILE_DIR_DIRTY;
   2ef06:	80 68       	ori	r24, 0x80	; 128
   2ef08:	80 93 68 16 	sts	0x1668, r24	; 0x801668 <card+0x293>
  } else if (dateTime_ && nbyte) {
    // insure sync will update modified date and time
    flags_ |= F_FILE_DIR_DIRTY;
  }

  if (flags_ & O_SYNC) {
   2ef0c:	80 91 68 16 	lds	r24, 0x1668	; 0x801668 <card+0x293>
   2ef10:	83 fd       	sbrc	r24, 3
   2ef12:	18 c0       	rjmp	.+48     	; 0x2ef44 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x332>
    if (!sync()) goto fail;
  }
  return nbyte;
   2ef14:	c4 01       	movw	r24, r8

 fail:
  // return for write error
  writeError = true;
  return -1;
}
   2ef16:	0f 90       	pop	r0
   2ef18:	0f 90       	pop	r0
   2ef1a:	0f 90       	pop	r0
   2ef1c:	0f 90       	pop	r0
   2ef1e:	df 91       	pop	r29
   2ef20:	cf 91       	pop	r28
   2ef22:	1f 91       	pop	r17
   2ef24:	0f 91       	pop	r16
   2ef26:	ff 90       	pop	r15
   2ef28:	ef 90       	pop	r14
   2ef2a:	df 90       	pop	r13
   2ef2c:	cf 90       	pop	r12
   2ef2e:	bf 90       	pop	r11
   2ef30:	af 90       	pop	r10
   2ef32:	9f 90       	pop	r9
   2ef34:	8f 90       	pop	r8
   2ef36:	7f 90       	pop	r7
   2ef38:	6f 90       	pop	r6
   2ef3a:	5f 90       	pop	r5
   2ef3c:	4f 90       	pop	r4
   2ef3e:	3f 90       	pop	r3
   2ef40:	2f 90       	pop	r2
   2ef42:	08 95       	ret
    // insure sync will update modified date and time
    flags_ |= F_FILE_DIR_DIRTY;
  }

  if (flags_ & O_SYNC) {
    if (!sync()) goto fail;
   2ef44:	87 e6       	ldi	r24, 0x67	; 103
   2ef46:	96 e1       	ldi	r25, 0x16	; 22
   2ef48:	0f 94 b4 2e 	call	0x25d68	; 0x25d68 <SdBaseFile::sync()>
   2ef4c:	81 11       	cpse	r24, r1
   2ef4e:	e2 cf       	rjmp	.-60     	; 0x2ef14 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x302>
   2ef50:	5b cf       	rjmp	.-330    	; 0x2ee08 <SdBaseFile::write(void const*, unsigned int) [clone .constprop.160]+0x1f6>

0002ef52 <CardReader::getfilename_sorted(unsigned int, unsigned char) [clone .constprop.156]>:
#ifdef SDCARD_SORT_ALPHA

/**
* Get the name of a file in the current directory by sort-index
*/
void CardReader::getfilename_sorted(const uint16_t nr, uint8_t sdSort) {
   2ef52:	0f 93       	push	r16
   2ef54:	cf 93       	push	r28
   2ef56:	df 93       	push	r29
   2ef58:	cd b7       	in	r28, 0x3d	; 61
   2ef5a:	de b7       	in	r29, 0x3e	; 62
   2ef5c:	a3 97       	sbiw	r28, 0x23	; 35
   2ef5e:	0f b6       	in	r0, 0x3f	; 63
   2ef60:	f8 94       	cli
   2ef62:	de bf       	out	0x3e, r29	; 62
   2ef64:	0f be       	out	0x3f, r0	; 63
   2ef66:	cd bf       	out	0x3d, r28	; 61
    if (nr < sort_count)
   2ef68:	20 91 78 15 	lds	r18, 0x1578	; 0x801578 <card+0x1a3>
   2ef6c:	30 91 79 15 	lds	r19, 0x1579	; 0x801579 <card+0x1a4>
   2ef70:	82 17       	cp	r24, r18
   2ef72:	93 07       	cpc	r25, r19
   2ef74:	d8 f4       	brcc	.+54     	; 0x2efac <CardReader::getfilename_sorted(unsigned int, unsigned char) [clone .constprop.156]+0x5a>
        getfilename_simple(sort_entries[(sdSort == SD_SORT_ALPHA) ? (sort_count - nr - 1) : nr]);
   2ef76:	61 30       	cpi	r22, 0x01	; 1
   2ef78:	31 f4       	brne	.+12     	; 0x2ef86 <CardReader::getfilename_sorted(unsigned int, unsigned char) [clone .constprop.156]+0x34>
   2ef7a:	21 50       	subi	r18, 0x01	; 1
   2ef7c:	31 09       	sbc	r19, r1
   2ef7e:	a9 01       	movw	r20, r18
   2ef80:	48 1b       	sub	r20, r24
   2ef82:	59 0b       	sbc	r21, r25
   2ef84:	ca 01       	movw	r24, r20
   2ef86:	88 0f       	add	r24, r24
   2ef88:	99 1f       	adc	r25, r25
   2ef8a:	fc 01       	movw	r30, r24
   2ef8c:	e6 58       	subi	r30, 0x86	; 134
   2ef8e:	fa 4e       	sbci	r31, 0xEA	; 234
   2ef90:	80 81       	ld	r24, Z
   2ef92:	91 81       	ldd	r25, Z+1	; 0x01
   2ef94:	0f 94 00 6c 	call	0x2d800	; 0x2d800 <CardReader::getfilename_simple(unsigned int, char const*) [clone .constprop.233]>
    else
        getfilename_afterMaxSorting(nr);
}
   2ef98:	a3 96       	adiw	r28, 0x23	; 35
   2ef9a:	0f b6       	in	r0, 0x3f	; 63
   2ef9c:	f8 94       	cli
   2ef9e:	de bf       	out	0x3e, r29	; 62
   2efa0:	0f be       	out	0x3f, r0	; 63
   2efa2:	cd bf       	out	0x3d, r28	; 61
   2efa4:	df 91       	pop	r29
   2efa6:	cf 91       	pop	r28
   2efa8:	0f 91       	pop	r16
   2efaa:	08 95       	ret

void CardReader::getfilename_afterMaxSorting(uint16_t entry, const char * const match/*=NULL*/)
{
	curDir = &workDir;
   2efac:	42 e8       	ldi	r20, 0x82	; 130
   2efae:	54 e1       	ldi	r21, 0x14	; 20
   2efb0:	50 93 81 14 	sts	0x1481, r21	; 0x801481 <card+0xac>
   2efb4:	40 93 80 14 	sts	0x1480, r20	; 0x801480 <card+0xab>
	nrFiles = entry - sort_count + 1;
   2efb8:	82 1b       	sub	r24, r18
   2efba:	93 0b       	sbc	r25, r19
   2efbc:	01 96       	adiw	r24, 0x01	; 1
   2efbe:	90 93 f0 16 	sts	0x16F0, r25	; 0x8016f0 <card+0x31b>
   2efc2:	80 93 ef 16 	sts	0x16EF, r24	; 0x8016ef <card+0x31a>
	curDir->seekSet(lastSortedFilePosition << 5);
   2efc6:	40 91 42 16 	lds	r20, 0x1642	; 0x801642 <card+0x26d>
   2efca:	50 91 43 16 	lds	r21, 0x1643	; 0x801643 <card+0x26e>
   2efce:	85 e0       	ldi	r24, 0x05	; 5
   2efd0:	44 0f       	add	r20, r20
   2efd2:	55 1f       	adc	r21, r21
   2efd4:	8a 95       	dec	r24
   2efd6:	e1 f7       	brne	.-8      	; 0x2efd0 <CardReader::getfilename_sorted(unsigned int, unsigned char) [clone .constprop.156]+0x7e>
   2efd8:	70 e0       	ldi	r23, 0x00	; 0
   2efda:	60 e0       	ldi	r22, 0x00	; 0
   2efdc:	82 e8       	ldi	r24, 0x82	; 130
   2efde:	94 e1       	ldi	r25, 0x14	; 20
   2efe0:	0f 94 0b 2d 	call	0x25a16	; 0x25a16 <SdBaseFile::seekSet(unsigned long)>
  };
  struct ls_param
  {
    bool LFN : 1;
    bool timestamp : 1;
    inline ls_param():LFN(0), timestamp(0) { }
   2efe4:	00 e0       	ldi	r16, 0x00	; 0
   2efe6:	0e 7f       	andi	r16, 0xFE	; 254
   2efe8:	0d 7f       	andi	r16, 0xFD	; 253
	lsDive("", *curDir, match, LS_GetFilename);
   2efea:	e0 91 80 14 	lds	r30, 0x1480	; 0x801480 <card+0xab>
   2efee:	f0 91 81 14 	lds	r31, 0x1481	; 0x801481 <card+0xac>
   2eff2:	83 e2       	ldi	r24, 0x23	; 35
   2eff4:	de 01       	movw	r26, r28
   2eff6:	11 96       	adiw	r26, 0x01	; 1
   2eff8:	01 90       	ld	r0, Z+
   2effa:	0d 92       	st	X+, r0
   2effc:	8a 95       	dec	r24
   2effe:	e1 f7       	brne	.-8      	; 0x2eff8 <CardReader::getfilename_sorted(unsigned int, unsigned char) [clone .constprop.156]+0xa6>
   2f000:	22 e0       	ldi	r18, 0x02	; 2
   2f002:	50 e0       	ldi	r21, 0x00	; 0
   2f004:	40 e0       	ldi	r20, 0x00	; 0
   2f006:	be 01       	movw	r22, r28
   2f008:	6f 5f       	subi	r22, 0xFF	; 255
   2f00a:	7f 4f       	sbci	r23, 0xFF	; 255
   2f00c:	8f ed       	ldi	r24, 0xDF	; 223
   2f00e:	92 e0       	ldi	r25, 0x02	; 2
   2f010:	0f 94 8a 69 	call	0x2d314	; 0x2d314 <CardReader::lsDive(char const*, SdFile, char const*, CardReader::LsAction, CardReader::ls_param) [clone .constprop.237]>
   2f014:	ce 01       	movw	r24, r28
   2f016:	01 96       	adiw	r24, 0x01	; 1
   2f018:	0e 94 ab 79 	call	0xf356	; 0xf356 <SdBaseFile::~SdBaseFile()>
   2f01c:	bd cf       	rjmp	.-134    	; 0x2ef98 <CardReader::getfilename_sorted(unsigned int, unsigned char) [clone .constprop.156]+0x46>

0002f01e <CardReader::openFileWrite(char const*) [clone .constprop.155]>:
        SERIAL_PROTOCOL(fname);
        SERIAL_PROTOCOLLN('.');
      }
}

void CardReader::openFileWrite(const char* name)
   2f01e:	0f 93       	push	r16
   2f020:	1f 93       	push	r17
   2f022:	cf 93       	push	r28
   2f024:	df 93       	push	r29
   2f026:	1f 92       	push	r1
   2f028:	1f 92       	push	r1
   2f02a:	cd b7       	in	r28, 0x3d	; 61
   2f02c:	de b7       	in	r29, 0x3e	; 62
{
    if(!mounted)
   2f02e:	20 91 d8 13 	lds	r18, 0x13D8	; 0x8013d8 <card+0x3>
   2f032:	22 23       	and	r18, r18
   2f034:	69 f1       	breq	.+90     	; 0x2f090 <CardReader::openFileWrite(char const*) [clone .constprop.155]+0x72>
   2f036:	8c 01       	movw	r16, r24
        return;
    if(file.isOpen()){  //replacing current file by new file, or subfile call
   2f038:	80 91 6a 16 	lds	r24, 0x166A	; 0x80166a <card+0x295>
   2f03c:	88 23       	and	r24, r24
   2f03e:	79 f1       	breq	.+94     	; 0x2f09e <CardReader::openFileWrite(char const*) [clone .constprop.155]+0x80>
        SERIAL_ECHOLN(sdpos);
        filespos[file_subcall_ctr]=sdpos;
        file_subcall_ctr++;
        file.close();
#else
        SERIAL_ECHOLNPGM("File already opened");
   2f040:	84 e3       	ldi	r24, 0x34	; 52
   2f042:	9e e9       	ldi	r25, 0x9E	; 158
   2f044:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
        file_subcall_ctr=0; //resetting procedure depth in case user cancels print while in procedure
        SERIAL_ECHO_START;
        SERIAL_ECHORPGM(ofNowFreshFile);
        SERIAL_ECHOLN(name);
    }
    sdprinting = false;
   2f048:	10 92 d7 13 	sts	0x13D7, r1	; 0x8013d7 <card+0x2>

    const char *fname=name;
   2f04c:	1a 83       	std	Y+2, r17	; 0x02
   2f04e:	09 83       	std	Y+1, r16	; 0x01
    if (!diveSubfolder(fname))
   2f050:	ce 01       	movw	r24, r28
   2f052:	01 96       	adiw	r24, 0x01	; 1
   2f054:	0f 94 6e 71 	call	0x2e2dc	; 0x2e2dc <CardReader::diveSubfolder(char const*&) [clone .constprop.198]>
   2f058:	88 23       	and	r24, r24
   2f05a:	d1 f0       	breq	.+52     	; 0x2f090 <CardReader::openFileWrite(char const*) [clone .constprop.155]+0x72>
      return;

    //write
    if (!file.open(curDir, fname, O_CREAT | O_APPEND | O_WRITE | O_TRUNC)){
   2f05c:	49 81       	ldd	r20, Y+1	; 0x01
   2f05e:	5a 81       	ldd	r21, Y+2	; 0x02
   2f060:	60 91 80 14 	lds	r22, 0x1480	; 0x801480 <card+0xab>
   2f064:	70 91 81 14 	lds	r23, 0x1481	; 0x801481 <card+0xac>
   2f068:	26 e5       	ldi	r18, 0x56	; 86
   2f06a:	87 e6       	ldi	r24, 0x67	; 103
   2f06c:	96 e1       	ldi	r25, 0x16	; 22
   2f06e:	0f 94 c5 54 	call	0x2a98a	; 0x2a98a <SdBaseFile::open(SdBaseFile*, char const*, unsigned char)>
   2f072:	81 11       	cpse	r24, r1
   2f074:	22 c0       	rjmp	.+68     	; 0x2f0ba <CardReader::openFileWrite(char const*) [clone .constprop.155]+0x9c>
        SERIAL_PROTOCOLRPGM(MSG_SD_OPEN_FILE_FAIL);
   2f076:	84 e3       	ldi	r24, 0x34	; 52
   2f078:	9c e6       	ldi	r25, 0x6C	; 108
   2f07a:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   2f07e:	89 81       	ldd	r24, Y+1	; 0x01
   2f080:	9a 81       	ldd	r25, Y+2	; 0x02
   2f082:	0e 94 95 87 	call	0x10f2a	; 0x10f2a <MarlinSerial::write(char const*)>
   2f086:	8e e2       	ldi	r24, 0x2E	; 46
   2f088:	0e 94 b1 79 	call	0xf362	; 0xf362 <MarlinSerial::write(unsigned char)>
}

void MarlinSerial::println(char c, int base)
{
  print(c, base);
  println();
   2f08c:	0e 94 bc 7a 	call	0xf578	; 0xf578 <MarlinSerial::println()>

        SERIAL_PROTOCOLLNRPGM(ofFileSelected);////MSG_SD_FILE_SELECTED
        lcd_setstatuspgm(ofFileSelected);
        scrollstuff = 0;
    }
}
   2f090:	0f 90       	pop	r0
   2f092:	0f 90       	pop	r0
   2f094:	df 91       	pop	r29
   2f096:	cf 91       	pop	r28
   2f098:	1f 91       	pop	r17
   2f09a:	0f 91       	pop	r16
   2f09c:	08 95       	ret
        file.close();
#else
        SERIAL_ECHOLNPGM("File already opened");
#endif
    } else { //opening fresh file
        file_subcall_ctr=0; //resetting procedure depth in case user cancels print while in procedure
   2f09e:	10 92 8a 16 	sts	0x168A, r1	; 0x80168a <card+0x2b5>
        SERIAL_ECHO_START;
   2f0a2:	8e ec       	ldi	r24, 0xCE	; 206
   2f0a4:	91 ea       	ldi	r25, 0xA1	; 161
   2f0a6:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        SERIAL_ECHORPGM(ofNowFreshFile);
   2f0aa:	8c e4       	ldi	r24, 0x4C	; 76
   2f0ac:	90 ea       	ldi	r25, 0xA0	; 160
   2f0ae:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        SERIAL_ECHOLN(name);
   2f0b2:	c8 01       	movw	r24, r16
   2f0b4:	0e 94 a1 87 	call	0x10f42	; 0x10f42 <MarlinSerial::println(char const*)>
   2f0b8:	c7 cf       	rjmp	.-114    	; 0x2f048 <CardReader::openFileWrite(char const*) [clone .constprop.155]+0x2a>
    if (!file.open(curDir, fname, O_CREAT | O_APPEND | O_WRITE | O_TRUNC)){
        SERIAL_PROTOCOLRPGM(MSG_SD_OPEN_FILE_FAIL);
        SERIAL_PROTOCOL(fname);
        SERIAL_PROTOCOLLN('.');
    } else {
        saving = true;
   2f0ba:	81 e0       	ldi	r24, 0x01	; 1
   2f0bc:	80 93 d5 13 	sts	0x13D5, r24	; 0x8013d5 <card>
        getfilename(0, fname);
   2f0c0:	89 81       	ldd	r24, Y+1	; 0x01
   2f0c2:	9a 81       	ldd	r25, Y+2	; 0x02
   2f0c4:	0f 94 b9 6b 	call	0x2d772	; 0x2d772 <CardReader::getfilename(unsigned int, char const*) [clone .constprop.235]>
        SERIAL_PROTOCOLRPGM(ofWritingToFile);////MSG_SD_WRITE_TO_FILE
   2f0c8:	82 e2       	ldi	r24, 0x22	; 34
   2f0ca:	9e e9       	ldi	r25, 0x9E	; 158
   2f0cc:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        printAbsFilenameFast();
   2f0d0:	0f 94 9c 6c 	call	0x2d938	; 0x2d938 <CardReader::printAbsFilenameFast() [clone .constprop.226]>
        SERIAL_PROTOCOLLN();
   2f0d4:	0e 94 bc 7a 	call	0xf578	; 0xf578 <MarlinSerial::println()>

        SERIAL_PROTOCOLLNRPGM(ofFileSelected);////MSG_SD_FILE_SELECTED
   2f0d8:	88 e2       	ldi	r24, 0x28	; 40
   2f0da:	90 ea       	ldi	r25, 0xA0	; 160
   2f0dc:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
        lcd_setstatuspgm(ofFileSelected);
   2f0e0:	88 e2       	ldi	r24, 0x28	; 40
   2f0e2:	90 ea       	ldi	r25, 0xA0	; 160
   2f0e4:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
        scrollstuff = 0;
   2f0e8:	10 92 62 0d 	sts	0x0D62, r1	; 0x800d62 <scrollstuff>
   2f0ec:	d1 cf       	rjmp	.-94     	; 0x2f090 <CardReader::openFileWrite(char const*) [clone .constprop.155]+0x72>

0002f0ee <CardReader::ToshibaFlashAir_GetIP(unsigned char*) [clone .constprop.147]>:
		  //presort();
	  #endif
    }
}

bool CardReader::ToshibaFlashAir_GetIP(uint8_t *ip)
   2f0ee:	0f 93       	push	r16
   2f0f0:	1f 93       	push	r17
   2f0f2:	cf 93       	push	r28
   2f0f4:	df 93       	push	r29
   2f0f6:	ec 01       	movw	r28, r24
{
    memset(ip, 0, 4);
   2f0f8:	84 e0       	ldi	r24, 0x04	; 4
   2f0fa:	fe 01       	movw	r30, r28
   2f0fc:	11 92       	st	Z+, r1
   2f0fe:	8a 95       	dec	r24
   2f100:	e9 f7       	brne	.-6      	; 0x2f0fc <CardReader::ToshibaFlashAir_GetIP(unsigned char*) [clone .constprop.147]+0xe>
/** Perform Extention Read. */
uint8_t Sd2Card::readExt(uint32_t arg, uint8_t* dst, uint16_t count) {
  uint16_t i;

  // send command and argument.
  if (cardCommand(CMD48, arg) && cardCommand(CMD17, arg)) { // CMD48 for W-03, CMD17 for W-04
   2f102:	23 e0       	ldi	r18, 0x03	; 3
   2f104:	30 ea       	ldi	r19, 0xA0	; 160
   2f106:	4a e0       	ldi	r20, 0x0A	; 10
   2f108:	50 e9       	ldi	r21, 0x90	; 144
   2f10a:	60 e3       	ldi	r22, 0x30	; 48
   2f10c:	84 e4       	ldi	r24, 0x44	; 68
   2f10e:	96 e1       	ldi	r25, 0x16	; 22
   2f110:	0f 94 d1 28 	call	0x251a2	; 0x251a2 <Sd2Card::cardCommand(unsigned char, unsigned long)>
   2f114:	88 23       	and	r24, r24
   2f116:	91 f0       	breq	.+36     	; 0x2f13c <CardReader::ToshibaFlashAir_GetIP(unsigned char*) [clone .constprop.147]+0x4e>
   2f118:	23 e0       	ldi	r18, 0x03	; 3
   2f11a:	30 ea       	ldi	r19, 0xA0	; 160
   2f11c:	4a e0       	ldi	r20, 0x0A	; 10
   2f11e:	50 e9       	ldi	r21, 0x90	; 144
   2f120:	61 e1       	ldi	r22, 0x11	; 17
   2f122:	84 e4       	ldi	r24, 0x44	; 68
   2f124:	96 e1       	ldi	r25, 0x16	; 22
   2f126:	0f 94 d1 28 	call	0x251a2	; 0x251a2 <Sd2Card::cardCommand(unsigned char, unsigned long)>
   2f12a:	88 23       	and	r24, r24
   2f12c:	39 f0       	breq	.+14     	; 0x2f13c <CardReader::ToshibaFlashAir_GetIP(unsigned char*) [clone .constprop.147]+0x4e>
  bool eraseSingleBlockEnable();
  /**
   *  Set SD error code.
   *  \param[in] code value for error code.
   */
  void error(uint8_t code) {errorCode_ = code;}
   2f12e:	80 e8       	ldi	r24, 0x80	; 128
   2f130:	80 93 44 16 	sts	0x1644, r24	; 0x801644 <card+0x26f>
  chipSelectHigh();
  spiSend(0xFF); // dummy clock to force FlashAir finish the command.
  return true;

 fail:
  chipSelectHigh();
   2f134:	0f 94 dc 65 	call	0x2cbb8	; 0x2cbb8 <Sd2Card::chipSelectHigh() [clone .constprop.312]>
  return false;
   2f138:	80 e0       	ldi	r24, 0x00	; 0
   2f13a:	2f c0       	rjmp	.+94     	; 0x2f19a <CardReader::ToshibaFlashAir_GetIP(unsigned char*) [clone .constprop.147]+0xac>
//------------------------------------------------------------------------------
/** Wait for start block token */
//FIXME Vojtech: Copied from a current version of Sd2Card Arduino code.
// We shall likely upgrade the rest of the Sd2Card.
uint8_t Sd2Card::waitStartBlock(void) {
  uint16_t t0 = _millis();
   2f13c:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   2f140:	8b 01       	movw	r16, r22
  while ((status_ = spiRec()) == 0XFF) {
   2f142:	0f 94 ca 28 	call	0x25194	; 0x25194 <spiRec() [clone .lto_priv.366]>
   2f146:	80 93 46 16 	sts	0x1646, r24	; 0x801646 <card+0x271>
   2f14a:	8f 3f       	cpi	r24, 0xFF	; 255
   2f14c:	69 f4       	brne	.+26     	; 0x2f168 <CardReader::ToshibaFlashAir_GetIP(unsigned char*) [clone .constprop.147]+0x7a>
    if (((uint16_t)_millis() - t0) > SD_READ_TIMEOUT) {
   2f14e:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   2f152:	60 1b       	sub	r22, r16
   2f154:	71 0b       	sbc	r23, r17
   2f156:	6d 32       	cpi	r22, 0x2D	; 45
   2f158:	71 40       	sbci	r23, 0x01	; 1
   2f15a:	98 f3       	brcs	.-26     	; 0x2f142 <CardReader::ToshibaFlashAir_GetIP(unsigned char*) [clone .constprop.147]+0x54>
   2f15c:	81 e1       	ldi	r24, 0x11	; 17
   2f15e:	80 93 44 16 	sts	0x1644, r24	; 0x801644 <card+0x26f>
    goto fail;
  }
  return true;

 fail:
  chipSelectHigh();
   2f162:	0f 94 dc 65 	call	0x2cbb8	; 0x2cbb8 <Sd2Card::chipSelectHigh() [clone .constprop.312]>
   2f166:	e6 cf       	rjmp	.-52     	; 0x2f134 <CardReader::ToshibaFlashAir_GetIP(unsigned char*) [clone .constprop.147]+0x46>
    if (((uint16_t)_millis() - t0) > SD_READ_TIMEOUT) {
      error(SD_CARD_ERROR_READ_TIMEOUT);
      goto fail;
    }
  }
  if (status_ != DATA_START_BLOCK) {
   2f168:	8e 3f       	cpi	r24, 0xFE	; 254
   2f16a:	11 f0       	breq	.+4      	; 0x2f170 <CardReader::ToshibaFlashAir_GetIP(unsigned char*) [clone .constprop.147]+0x82>
   2f16c:	8f e0       	ldi	r24, 0x0F	; 15
   2f16e:	f7 cf       	rjmp	.-18     	; 0x2f15e <CardReader::ToshibaFlashAir_GetIP(unsigned char*) [clone .constprop.147]+0x70>
   2f170:	8e 01       	movw	r16, r28
   2f172:	0c 5f       	subi	r16, 0xFC	; 252
   2f174:	1f 4f       	sbci	r17, 0xFF	; 255
    goto fail;
  }

  // receive data
  for (i = 0; i < count; ++i) {
    dst[i] = spiRec();
   2f176:	0f 94 ca 28 	call	0x25194	; 0x25194 <spiRec() [clone .lto_priv.366]>
   2f17a:	89 93       	st	Y+, r24
  if (!waitStartBlock()) {
    goto fail;
  }

  // receive data
  for (i = 0; i < count; ++i) {
   2f17c:	c0 17       	cp	r28, r16
   2f17e:	d1 07       	cpc	r29, r17
   2f180:	d1 f7       	brne	.-12     	; 0x2f176 <CardReader::ToshibaFlashAir_GetIP(unsigned char*) [clone .constprop.147]+0x88>
   2f182:	ce ef       	ldi	r28, 0xFE	; 254
   2f184:	d1 e0       	ldi	r29, 0x01	; 1
    dst[i] = spiRec();
  }

  // skip dummy bytes and 16-bit crc.
  for (; i < 514; ++i) {
    spiRec();
   2f186:	0f 94 ca 28 	call	0x25194	; 0x25194 <spiRec() [clone .lto_priv.366]>
   2f18a:	21 97       	sbiw	r28, 0x01	; 1
  for (i = 0; i < count; ++i) {
    dst[i] = spiRec();
  }

  // skip dummy bytes and 16-bit crc.
  for (; i < 514; ++i) {
   2f18c:	e1 f7       	brne	.-8      	; 0x2f186 <CardReader::ToshibaFlashAir_GetIP(unsigned char*) [clone .constprop.147]+0x98>
    spiRec();
  }

  chipSelectHigh();
   2f18e:	0f 94 dc 65 	call	0x2cbb8	; 0x2cbb8 <Sd2Card::chipSelectHigh() [clone .constprop.312]>
  spiSend(0xFF); // dummy clock to force FlashAir finish the command.
   2f192:	8f ef       	ldi	r24, 0xFF	; 255
   2f194:	0f 94 c5 28 	call	0x2518a	; 0x2518a <spiSend(unsigned char) [clone .lto_priv.372]>
   2f198:	81 e0       	ldi	r24, 0x01	; 1
    return card.readExtMemory(1, 1, 0x400+0x150, 4, ip);
}
   2f19a:	df 91       	pop	r29
   2f19c:	cf 91       	pop	r28
   2f19e:	1f 91       	pop	r17
   2f1a0:	0f 91       	pop	r16
   2f1a2:	08 95       	ret

0002f1a4 <print_mem(unsigned int, unsigned int, dcode_mem_t, unsigned char) [clone .constprop.143]>:
}


enum class dcode_mem_t:uint8_t { sram, eeprom, progmem, xflash };

void print_mem(daddr_t address, daddr_t count, dcode_mem_t type, uint8_t countperline = 16)
   2f1a4:	cf 92       	push	r12
   2f1a6:	df 92       	push	r13
   2f1a8:	ef 92       	push	r14
   2f1aa:	ff 92       	push	r15
   2f1ac:	0f 93       	push	r16
   2f1ae:	1f 93       	push	r17
   2f1b0:	cf 93       	push	r28
   2f1b2:	df 93       	push	r29
   2f1b4:	ec 01       	movw	r28, r24
   2f1b6:	8b 01       	movw	r16, r22
   2f1b8:	e4 2e       	mov	r14, r20
{
#if defined(DEBUG_DCODE6) || defined(DEBUG_DCODES) || defined(XFLASH_DUMP)
    if(type == dcode_mem_t::xflash)
        XFLASH_SPI_ENTER();
#endif
	while (count)
   2f1ba:	01 15       	cp	r16, r1
   2f1bc:	11 05       	cpc	r17, r1
   2f1be:	09 f4       	brne	.+2      	; 0x2f1c2 <print_mem(unsigned int, unsigned int, dcode_mem_t, unsigned char) [clone .constprop.143]+0x1e>
   2f1c0:	41 c0       	rjmp	.+130    	; 0x2f244 <print_mem(unsigned int, unsigned int, dcode_mem_t, unsigned char) [clone .constprop.143]+0xa0>
void print_hex_word(daddr_t val)
{
#if DADDR_SIZE > 16
    print_hex_byte((val >> 16) & 0xFF);
#endif
    print_hex_byte((val >> 8) & 0xFF);
   2f1c2:	8d 2f       	mov	r24, r29
   2f1c4:	0e 94 f8 78 	call	0xf1f0	; 0xf1f0 <print_hex_byte(unsigned char)>
    print_hex_byte(val & 0xFF);
   2f1c8:	8c 2f       	mov	r24, r28
   2f1ca:	0e 94 f8 78 	call	0xf1f0	; 0xf1f0 <print_hex_byte(unsigned char)>
        XFLASH_SPI_ENTER();
#endif
	while (count)
	{
		print_hex_word(address);
		putchar(' ');
   2f1ce:	60 91 13 17 	lds	r22, 0x1713	; 0x801713 <__iob+0x2>
   2f1d2:	70 91 14 17 	lds	r23, 0x1714	; 0x801714 <__iob+0x3>
   2f1d6:	80 e2       	ldi	r24, 0x20	; 32
   2f1d8:	90 e0       	ldi	r25, 0x00	; 0
   2f1da:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
   2f1de:	6e 01       	movw	r12, r28
   2f1e0:	80 e1       	ldi	r24, 0x10	; 16
   2f1e2:	c8 0e       	add	r12, r24
   2f1e4:	d1 1c       	adc	r13, r1
		uint8_t count_line = countperline;
		while (count && count_line)
		{
			uint8_t data = 0;
			switch (type)
   2f1e6:	81 e0       	ldi	r24, 0x01	; 1
   2f1e8:	e8 16       	cp	r14, r24
   2f1ea:	39 f1       	breq	.+78     	; 0x2f23a <print_mem(unsigned int, unsigned int, dcode_mem_t, unsigned char) [clone .constprop.143]+0x96>
			{
			case dcode_mem_t::sram: data = *((uint8_t*)address); break;
   2f1ec:	f8 80       	ld	r15, Y
            case dcode_mem_t::xflash: xflash_rd_data(address, &data, 1); break;
#else
            case dcode_mem_t::xflash: break;
#endif
			}
            ++address;
   2f1ee:	21 96       	adiw	r28, 0x01	; 1
			putchar(' ');
   2f1f0:	60 91 13 17 	lds	r22, 0x1713	; 0x801713 <__iob+0x2>
   2f1f4:	70 91 14 17 	lds	r23, 0x1714	; 0x801714 <__iob+0x3>
   2f1f8:	80 e2       	ldi	r24, 0x20	; 32
   2f1fa:	90 e0       	ldi	r25, 0x00	; 0
   2f1fc:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
			print_hex_byte(data);
   2f200:	8f 2d       	mov	r24, r15
   2f202:	0e 94 f8 78 	call	0xf1f0	; 0xf1f0 <print_hex_byte(unsigned char)>
			count_line--;
			count--;
   2f206:	01 50       	subi	r16, 0x01	; 1
   2f208:	11 09       	sbc	r17, r1

            // sporadically call manage_heater, but only when interrupts are enabled (meaning
            // print_mem is called by D2). Don't do anything otherwise: we are inside a crash
            // handler where memory & stack needs to be preserved!
            if((SREG & (1 << SREG_I)) && !((uint16_t)count % 8192))
   2f20a:	0f b6       	in	r0, 0x3f	; 63
   2f20c:	07 fe       	sbrs	r0, 7
   2f20e:	06 c0       	rjmp	.+12     	; 0x2f21c <print_mem(unsigned int, unsigned int, dcode_mem_t, unsigned char) [clone .constprop.143]+0x78>
   2f210:	c8 01       	movw	r24, r16
   2f212:	9f 71       	andi	r25, 0x1F	; 31
   2f214:	89 2b       	or	r24, r25
   2f216:	29 f4       	brne	.+10     	; 0x2f222 <print_mem(unsigned int, unsigned int, dcode_mem_t, unsigned char) [clone .constprop.143]+0x7e>
                manage_heater();
   2f218:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
	while (count)
	{
		print_hex_word(address);
		putchar(' ');
		uint8_t count_line = countperline;
		while (count && count_line)
   2f21c:	01 15       	cp	r16, r1
   2f21e:	11 05       	cpc	r17, r1
   2f220:	19 f0       	breq	.+6      	; 0x2f228 <print_mem(unsigned int, unsigned int, dcode_mem_t, unsigned char) [clone .constprop.143]+0x84>
   2f222:	cc 15       	cp	r28, r12
   2f224:	dd 05       	cpc	r29, r13
   2f226:	f9 f6       	brne	.-66     	; 0x2f1e6 <print_mem(unsigned int, unsigned int, dcode_mem_t, unsigned char) [clone .constprop.143]+0x42>
            // print_mem is called by D2). Don't do anything otherwise: we are inside a crash
            // handler where memory & stack needs to be preserved!
            if((SREG & (1 << SREG_I)) && !((uint16_t)count % 8192))
                manage_heater();
		}
		putchar('\n');
   2f228:	60 91 13 17 	lds	r22, 0x1713	; 0x801713 <__iob+0x2>
   2f22c:	70 91 14 17 	lds	r23, 0x1714	; 0x801714 <__iob+0x3>
   2f230:	8a e0       	ldi	r24, 0x0A	; 10
   2f232:	90 e0       	ldi	r25, 0x00	; 0
   2f234:	0f 94 48 a2 	call	0x34490	; 0x34490 <fputc>
   2f238:	c0 cf       	rjmp	.-128    	; 0x2f1ba <print_mem(unsigned int, unsigned int, dcode_mem_t, unsigned char) [clone .constprop.143]+0x16>
		{
			uint8_t data = 0;
			switch (type)
			{
			case dcode_mem_t::sram: data = *((uint8_t*)address); break;
			case dcode_mem_t::eeprom: data = eeprom_read_byte((uint8_t*)address); break;
   2f23a:	ce 01       	movw	r24, r28
   2f23c:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   2f240:	f8 2e       	mov	r15, r24
   2f242:	d5 cf       	rjmp	.-86     	; 0x2f1ee <print_mem(unsigned int, unsigned int, dcode_mem_t, unsigned char) [clone .constprop.143]+0x4a>
            if((SREG & (1 << SREG_I)) && !((uint16_t)count % 8192))
                manage_heater();
		}
		putchar('\n');
	}
}
   2f244:	df 91       	pop	r29
   2f246:	cf 91       	pop	r28
   2f248:	1f 91       	pop	r17
   2f24a:	0f 91       	pop	r16
   2f24c:	ff 90       	pop	r15
   2f24e:	ef 90       	pop	r14
   2f250:	df 90       	pop	r13
   2f252:	cf 90       	pop	r12
   2f254:	08 95       	ret

0002f256 <FSensorBlockRunout::FSensorBlockRunout() [clone .constprop.136]>:
#include "planner.h"
#include "temperature.h"
#include "ultralcd.h"

#ifdef FILAMENT_SENSOR
FSensorBlockRunout::FSensorBlockRunout() {
   2f256:	cf 93       	push	r28
   2f258:	df 93       	push	r29
        eeprom_update_byte_notify((uint8_t *)EEPROM_FSENS_AUTOLOAD_ENABLED, state);
    }
}

void Filament_sensor::setRunoutEnabled(bool state, bool updateEEPROM) {
    runoutEnabled = state;
   2f25a:	c1 ef       	ldi	r28, 0xF1	; 241
   2f25c:	d6 e1       	ldi	r29, 0x16	; 22
   2f25e:	1a 82       	std	Y+2, r1	; 0x02
        fsensor.deinit();
    }
}

void Filament_sensor::setAutoLoadEnabled(bool state, bool updateEEPROM) {
    autoLoadEnabled = state;
   2f260:	19 82       	std	Y+1, r1	; 0x01
    return fsensorDetected;
}
#endif

void PAT9125_sensor::setJamDetectionEnabled(bool state, bool updateEEPROM) {
    jamDetection = state;
   2f262:	1e 86       	std	Y+14, r1	; 0x0e
    oldPos = pat9125_y;
   2f264:	80 91 38 0e 	lds	r24, 0x0E38	; 0x800e38 <pat9125_y>
   2f268:	90 91 39 0e 	lds	r25, 0x0E39	; 0x800e39 <pat9125_y+0x1>
   2f26c:	98 8b       	std	Y+16, r25	; 0x10
   2f26e:	8f 87       	std	Y+15, r24	; 0x0f
    resetStepCount();
   2f270:	0f 94 8d 6d 	call	0x2db1a	; 0x2db1a <PAT9125_sensor::resetStepCount() [clone .constprop.210]>
    jamErrCnt = 0;
   2f274:	1d 8a       	std	Y+21, r1	; 0x15
    fsensor.setAutoLoadEnabled(false); //suppress filament autoloads while loading filament.
#if (FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
    fsensor.setJamDetectionEnabled(false); //suppress filament jam detection while loading filament.
#endif //(FILAMENT_SENSOR_TYPE == FSENSOR_PAT9125)
//    SERIAL_ECHOLNPGM("FSBlockRunout");
}
   2f276:	df 91       	pop	r29
   2f278:	cf 91       	pop	r28
   2f27a:	08 95       	ret

0002f27c <count_e(float, float, float, float) [clone .constprop.134]>:
//!
//! @param layer_height layer height in mm
//! @param extrusion_width extrusion width in mm
//! @param extrusion_length extrusion length in mm
//! @return filament length in mm which needs to be extruded to form line
static constexpr float __attribute__((noinline)) count_e(float layer_height, float extrusion_width, float extrusion_length, float filament_diameter=1.75f)
   2f27c:	cf 92       	push	r12
   2f27e:	df 92       	push	r13
   2f280:	ef 92       	push	r14
   2f282:	ff 92       	push	r15
   2f284:	69 01       	movw	r12, r18
   2f286:	7a 01       	movw	r14, r20
{
    return (extrusion_length * ((M_PI * pow(layer_height, 2)) / 4 + layer_height * (extrusion_width - layer_height))) / ((M_PI * pow(filament_diameter, 2)) / 4);
   2f288:	2d ec       	ldi	r18, 0xCD	; 205
   2f28a:	3c ec       	ldi	r19, 0xCC	; 204
   2f28c:	4c e4       	ldi	r20, 0x4C	; 76
   2f28e:	5e e3       	ldi	r21, 0x3E	; 62
   2f290:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   2f294:	2d ec       	ldi	r18, 0xCD	; 205
   2f296:	3c ec       	ldi	r19, 0xCC	; 204
   2f298:	4c e4       	ldi	r20, 0x4C	; 76
   2f29a:	5e e3       	ldi	r21, 0x3E	; 62
   2f29c:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2f2a0:	2d ef       	ldi	r18, 0xFD	; 253
   2f2a2:	3d ea       	ldi	r19, 0xAD	; 173
   2f2a4:	40 e0       	ldi	r20, 0x00	; 0
   2f2a6:	5d e3       	ldi	r21, 0x3D	; 61
   2f2a8:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   2f2ac:	a7 01       	movw	r20, r14
   2f2ae:	96 01       	movw	r18, r12
   2f2b0:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2f2b4:	24 e2       	ldi	r18, 0x24	; 36
   2f2b6:	30 ef       	ldi	r19, 0xF0	; 240
   2f2b8:	49 e1       	ldi	r20, 0x19	; 25
   2f2ba:	50 e4       	ldi	r21, 0x40	; 64
   2f2bc:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
}
   2f2c0:	ff 90       	pop	r15
   2f2c2:	ef 90       	pop	r14
   2f2c4:	df 90       	pop	r13
   2f2c6:	cf 90       	pop	r12
   2f2c8:	08 95       	ret

0002f2ca <st_set_position(long const*) [clone .constprop.125]>:
	}
}

void st_set_position(const long *pos)
{
  CRITICAL_SECTION_START;
   2f2ca:	9f b7       	in	r25, 0x3f	; 63
   2f2cc:	f8 94       	cli
  // Copy 4x4B.
  // This block locks the interrupts globally for 2.06 us,
  // which corresponds to a maximum repeat frequency of ~484kHz.
  // This blocking is safe in the context of a 10kHz stepper driver interrupt
  // or a 115200 Bd serial line receive interrupt, which will not trigger faster than 12kHz.
  memcpy((long *)count_position, pos, sizeof(count_position));
   2f2ce:	80 e1       	ldi	r24, 0x10	; 16
   2f2d0:	ec e3       	ldi	r30, 0x3C	; 60
   2f2d2:	f6 e0       	ldi	r31, 0x06	; 6
   2f2d4:	ac e4       	ldi	r26, 0x4C	; 76
   2f2d6:	b6 e0       	ldi	r27, 0x06	; 6
   2f2d8:	01 90       	ld	r0, Z+
   2f2da:	0d 92       	st	X+, r0
   2f2dc:	8a 95       	dec	r24
   2f2de:	e1 f7       	brne	.-8      	; 0x2f2d8 <st_set_position(long const*) [clone .constprop.125]+0xe>
  CRITICAL_SECTION_END;
   2f2e0:	9f bf       	out	0x3f, r25	; 63
}
   2f2e2:	08 95       	ret

0002f2e4 <MMU2::BeginReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.123]>:
#include "sound.h"

namespace MMU2 {

void BeginReport(CommandInProgress /*cip*/, ProgressCode ec) {
    custom_message_type = CustomMsg::MMUProgress;
   2f2e4:	89 e0       	ldi	r24, 0x09	; 9
   2f2e6:	80 93 5d 06 	sts	0x065D, r24	; 0x80065d <custom_message_type>
};

const char *ProgressCodeToText(ProgressCode pc) {
    // @@TODO ?? a better fallback option?
    return ((uint16_t)pc <= (sizeof(progressTexts) / sizeof(progressTexts[0])))
        ? static_cast<const char *>(pgm_read_ptr(&progressTexts[(uint16_t)pc]))
   2f2ea:	ea e4       	ldi	r30, 0x4A	; 74
   2f2ec:	fe e9       	ldi	r31, 0x9E	; 158
   2f2ee:	85 91       	lpm	r24, Z+
   2f2f0:	94 91       	lpm	r25, Z
    lcd_setstatuspgm( _T(ProgressCodeToText(ec)) );
   2f2f2:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   2f2f6:	0c 94 94 de 	jmp	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>

0002f2fa <MMU2::MMU2::execute_extruder_sequence(E_Step const*, unsigned char) [clone .constprop.111]>:

void MMU2::filament_ramming() {
    execute_extruder_sequence(ramming_sequence, sizeof(ramming_sequence) / sizeof(E_Step));
}

void MMU2::execute_extruder_sequence(const E_Step *sequence, uint8_t stepCount) {
   2f2fa:	1f 93       	push	r17
   2f2fc:	cf 93       	push	r28
   2f2fe:	df 93       	push	r29
   2f300:	ec 01       	movw	r28, r24
   2f302:	16 2f       	mov	r17, r22
bool planner_draining() {
    return planner_aborted;
}

void planner_synchronize() {
    st_synchronize();
   2f304:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
    planner_synchronize();

    // Plan the moves
    const E_Step *step = sequence;
    for (uint8_t i = stepCount; i > 0; --i) {
        extruder_move(pgm_read_float(&(step->extrude)), pgm_read_float(&(step->feedRate)));
   2f308:	fe 01       	movw	r30, r28
   2f30a:	34 96       	adiw	r30, 0x04	; 4
   2f30c:	25 91       	lpm	r18, Z+
   2f30e:	35 91       	lpm	r19, Z+
   2f310:	45 91       	lpm	r20, Z+
   2f312:	54 91       	lpm	r21, Z
   2f314:	fe 01       	movw	r30, r28
   2f316:	65 91       	lpm	r22, Z+
   2f318:	75 91       	lpm	r23, Z+
   2f31a:	85 91       	lpm	r24, Z+
   2f31c:	94 91       	lpm	r25, Z
   2f31e:	0f 94 d6 50 	call	0x2a1ac	; 0x2a1ac <MMU2::extruder_move(float, float)>
        step++;
   2f322:	28 96       	adiw	r28, 0x08	; 8
void MMU2::execute_extruder_sequence(const E_Step *sequence, uint8_t stepCount) {
    planner_synchronize();

    // Plan the moves
    const E_Step *step = sequence;
    for (uint8_t i = stepCount; i > 0; --i) {
   2f324:	11 50       	subi	r17, 0x01	; 1
   2f326:	81 f7       	brne	.-32     	; 0x2f308 <MMU2::MMU2::execute_extruder_sequence(E_Step const*, unsigned char) [clone .constprop.111]+0xe>
   2f328:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
    // Wait for the moves to finish
    // it looks like it's better to sync the moves at the end - smoother move (if the sequence is not too long).
    planner_synchronize();

    Disable_E0();
}
   2f32c:	df 91       	pop	r29
   2f32e:	cf 91       	pop	r28
   2f330:	1f 91       	pop	r17

    // Wait for the moves to finish
    // it looks like it's better to sync the moves at the end - smoother move (if the sequence is not too long).
    planner_synchronize();

    Disable_E0();
   2f332:	0d 94 d4 50 	jmp	0x2a1a8	; 0x2a1a8 <MMU2::Disable_E0()>

0002f336 <MMU2::EndReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.108]>:
}

void EndReport(CommandInProgress /*cip*/, ProgressCode /*ec*/) {
    // clear the status msg line - let the printed filename get visible again
    if (!printJobOngoing()) {
   2f336:	0e 94 40 66 	call	0xcc80	; 0xcc80 <printJobOngoing()>
   2f33a:	81 11       	cpse	r24, r1
   2f33c:	04 c0       	rjmp	.+8      	; 0x2f346 <MMU2::EndReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.108]+0x10>
        lcd_setstatuspgm(MSG_WELCOME);
   2f33e:	86 ee       	ldi	r24, 0xE6	; 230
   2f340:	9b e6       	ldi	r25, 0x6B	; 107
   2f342:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
    }
    custom_message_type = CustomMsg::Status;
   2f346:	10 92 5d 06 	sts	0x065D, r1	; 0x80065d <custom_message_type>
}
   2f34a:	08 95       	ret

0002f34c <MMU2::MMU2::WaitForMMUReady() [clone .constprop.106]>:
        EndReport(cip, ProgressCode::OK);
    }
};

bool MMU2::WaitForMMUReady() {
    switch (State()) {
   2f34c:	80 91 01 13 	lds	r24, 0x1301	; 0x801301 <MMU2::mmu2+0x6f>
   2f350:	88 23       	and	r24, r24
   2f352:	11 f0       	breq	.+4      	; 0x2f358 <MMU2::MMU2::WaitForMMUReady() [clone .constprop.106]+0xc>
        return false;
    case xState::Connecting:
        // shall we wait until the MMU reconnects?
        // fire-up a fsm_dlg and show "MMU not responding"?
    default:
        return true;
   2f354:	81 e0       	ldi	r24, 0x01	; 1
   2f356:	08 95       	ret
};

bool MMU2::WaitForMMUReady() {
    switch (State()) {
    case xState::Stopped:
        return false;
   2f358:	80 e0       	ldi	r24, 0x00	; 0
        // shall we wait until the MMU reconnects?
        // fire-up a fsm_dlg and show "MMU not responding"?
    default:
        return true;
    }
}
   2f35a:	08 95       	ret

0002f35c <homeaxis(unsigned char, unsigned char) [clone .constprop.88]>:
}

#ifdef TMC2130
void homeaxis(uint8_t axis, uint8_t cnt, uint8_t* pstep)
#else
void homeaxis(uint8_t axis, uint8_t cnt)
   2f35c:	2f 92       	push	r2
   2f35e:	3f 92       	push	r3
   2f360:	4f 92       	push	r4
   2f362:	5f 92       	push	r5
   2f364:	6f 92       	push	r6
   2f366:	7f 92       	push	r7
   2f368:	8f 92       	push	r8
   2f36a:	9f 92       	push	r9
   2f36c:	af 92       	push	r10
   2f36e:	bf 92       	push	r11
   2f370:	cf 92       	push	r12
   2f372:	df 92       	push	r13
   2f374:	ef 92       	push	r14
   2f376:	ff 92       	push	r15
   2f378:	0f 93       	push	r16
   2f37a:	1f 93       	push	r17
   2f37c:	cf 93       	push	r28
   2f37e:	df 93       	push	r29
   2f380:	00 d0       	rcall	.+0      	; 0x2f382 <homeaxis(unsigned char, unsigned char) [clone .constprop.88]+0x26>
   2f382:	00 d0       	rcall	.+0      	; 0x2f384 <homeaxis(unsigned char, unsigned char) [clone .constprop.88]+0x28>
   2f384:	00 d0       	rcall	.+0      	; 0x2f386 <homeaxis(unsigned char, unsigned char) [clone .constprop.88]+0x2a>
   2f386:	1f 92       	push	r1
   2f388:	1f 92       	push	r1
   2f38a:	cd b7       	in	r28, 0x3d	; 61
   2f38c:	de b7       	in	r29, 0x3e	; 62
   2f38e:	8b 83       	std	Y+3, r24	; 0x03
  return hit;
}

bool enable_endstops(bool check)
{
  bool old = check_endstops;
   2f390:	20 91 77 02 	lds	r18, 0x0277	; 0x800277 <_ZL14check_endstops.lto_priv.387>
   2f394:	2d 83       	std	Y+5, r18	; 0x05
  check_endstops = check;
   2f396:	81 e0       	ldi	r24, 0x01	; 1
   2f398:	80 93 77 02 	sts	0x0277, r24	; 0x800277 <_ZL14check_endstops.lto_priv.387>
#endif //TMC2130
{
	bool endstops_enabled  = enable_endstops(true); //RP: endstops should be allways enabled durring homing
#define HOMEAXIS_DO(LETTER) \
((LETTER##_MIN_PIN > -1 && LETTER##_HOME_DIR==-1) || (LETTER##_MAX_PIN > -1 && LETTER##_HOME_DIR==1))
    if ((axis==X_AXIS)?HOMEAXIS_DO(X):(axis==Y_AXIS)?HOMEAXIS_DO(Y):0)
   2f39c:	9b 81       	ldd	r25, Y+3	; 0x03
   2f39e:	92 30       	cpi	r25, 0x02	; 2
   2f3a0:	09 f4       	brne	.+2      	; 0x2f3a4 <homeaxis(unsigned char, unsigned char) [clone .constprop.88]+0x48>
   2f3a2:	5b c1       	rjmp	.+694    	; 0x2f65a <homeaxis(unsigned char, unsigned char) [clone .constprop.88]+0x2fe>
XYZ_CONSTS_FROM_CONFIG(float, base_min_pos,    MIN_POS);
XYZ_CONSTS_FROM_CONFIG(float, base_max_pos,    MAX_POS);
XYZ_CONSTS_FROM_CONFIG(float, base_home_pos,   HOME_POS);
XYZ_CONSTS_FROM_CONFIG(float, max_length,      MAX_LENGTH);
XYZ_CONSTS_FROM_CONFIG(float, home_retract_mm, HOME_RETRACT_MM);
XYZ_CONSTS_FROM_CONFIG(signed char, home_dir,  HOME_DIR);
   2f3a4:	a9 2f       	mov	r26, r25
   2f3a6:	b0 e0       	ldi	r27, 0x00	; 0
   2f3a8:	ba 83       	std	Y+2, r27	; 0x02
   2f3aa:	a9 83       	std	Y+1, r26	; 0x01
   2f3ac:	fd 01       	movw	r30, r26
   2f3ae:	e7 5e       	subi	r30, 0xE7	; 231
   2f3b0:	f2 46       	sbci	r31, 0x62	; 98
#define DEFINE_PGM_READ_ANY(type, reader)       \
    static inline type pgm_read_any(const type *p)  \
    { return pgm_read_##reader##_near(p); }

DEFINE_PGM_READ_ANY(float,       float);
DEFINE_PGM_READ_ANY(signed char, byte);
   2f3b2:	24 91       	lpm	r18, Z
   2f3b4:	2c 83       	std	Y+4, r18	; 0x04
#define HOMEAXIS_DO(LETTER) \
((LETTER##_MIN_PIN > -1 && LETTER##_HOME_DIR==-1) || (LETTER##_MAX_PIN > -1 && LETTER##_HOME_DIR==1))
    if ((axis==X_AXIS)?HOMEAXIS_DO(X):(axis==Y_AXIS)?HOMEAXIS_DO(Y):0)
	{
        int axis_home_dir = home_dir(axis);
        feedrate = homing_feedrate[axis];
   2f3b6:	8d 01       	movw	r16, r26
   2f3b8:	00 0f       	add	r16, r16
   2f3ba:	11 1f       	adc	r17, r17
   2f3bc:	00 0f       	add	r16, r16
   2f3be:	11 1f       	adc	r17, r17
   2f3c0:	f8 01       	movw	r30, r16
   2f3c2:	ee 50       	subi	r30, 0x0E	; 14
   2f3c4:	fd 4f       	sbci	r31, 0xFD	; 253
   2f3c6:	40 80       	ld	r4, Z
   2f3c8:	51 80       	ldd	r5, Z+1	; 0x01
   2f3ca:	62 80       	ldd	r6, Z+2	; 0x02
   2f3cc:	73 80       	ldd	r7, Z+3	; 0x03
   2f3ce:	40 92 7a 02 	sts	0x027A, r4	; 0x80027a <feedrate>
   2f3d2:	50 92 7b 02 	sts	0x027B, r5	; 0x80027b <feedrate+0x1>
   2f3d6:	60 92 7c 02 	sts	0x027C, r6	; 0x80027c <feedrate+0x2>
   2f3da:	70 92 7d 02 	sts	0x027D, r7	; 0x80027d <feedrate+0x3>
        float feedrate_mm_s = get_feedrate_mm_s(feedrate);
   2f3de:	c3 01       	movw	r24, r6
   2f3e0:	b2 01       	movw	r22, r4
   2f3e2:	0e 94 45 65 	call	0xca8a	; 0xca8a <get_feedrate_mm_s(float)>
   2f3e6:	4b 01       	movw	r8, r22
   2f3e8:	5c 01       	movw	r10, r24


        // Move away a bit, so that the print head does not touch the end position,
        // and the following movement to endstop has a chance to achieve the required velocity
        // for the stall guard to work.
        current_position[axis] = 0;
   2f3ea:	c8 01       	movw	r24, r16
   2f3ec:	8f 59       	subi	r24, 0x9F	; 159
   2f3ee:	9d 4e       	sbci	r25, 0xED	; 237
   2f3f0:	1c 01       	movw	r2, r24
   2f3f2:	dc 01       	movw	r26, r24
   2f3f4:	1d 92       	st	X+, r1
   2f3f6:	1d 92       	st	X+, r1
   2f3f8:	1d 92       	st	X+, r1
   2f3fa:	1c 92       	st	X, r1
   2f3fc:	13 97       	sbiw	r26, 0x03	; 3
        plan_set_position_curposXYZE();
   2f3fe:	0f 94 41 4b 	call	0x29682	; 0x29682 <plan_set_position_curposXYZE()>
		set_destination_to_current();
   2f402:	0e 94 ae 66 	call	0xcd5c	; 0xcd5c <set_destination_to_current()>
//        destination[axis] = 11.f;
        destination[axis] = -3.f * axis_home_dir;
   2f406:	bc 81       	ldd	r27, Y+4	; 0x04
   2f408:	6b 2f       	mov	r22, r27
   2f40a:	bb 0f       	add	r27, r27
   2f40c:	77 0b       	sbc	r23, r23
   2f40e:	88 0b       	sbc	r24, r24
   2f410:	99 0b       	sbc	r25, r25
   2f412:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   2f416:	6b 01       	movw	r12, r22
   2f418:	7c 01       	movw	r14, r24
   2f41a:	f8 01       	movw	r30, r16
   2f41c:	e7 5d       	subi	r30, 0xD7	; 215
   2f41e:	f9 4f       	sbci	r31, 0xF9	; 249
   2f420:	fb 87       	std	Y+11, r31	; 0x0b
   2f422:	ea 87       	std	Y+10, r30	; 0x0a
   2f424:	20 e0       	ldi	r18, 0x00	; 0
   2f426:	30 e0       	ldi	r19, 0x00	; 0
   2f428:	40 e4       	ldi	r20, 0x40	; 64
   2f42a:	50 ec       	ldi	r21, 0xC0	; 192
   2f42c:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2f430:	aa 85       	ldd	r26, Y+10	; 0x0a
   2f432:	bb 85       	ldd	r27, Y+11	; 0x0b
   2f434:	6d 93       	st	X+, r22
   2f436:	7d 93       	st	X+, r23
   2f438:	8d 93       	st	X+, r24
   2f43a:	9c 93       	st	X, r25
   2f43c:	13 97       	sbiw	r26, 0x03	; 3
        plan_buffer_line_destinationXYZE(feedrate_mm_s);
   2f43e:	c5 01       	movw	r24, r10
   2f440:	b4 01       	movw	r22, r8
   2f442:	0f 94 4e 4c 	call	0x2989c	; 0x2989c <plan_buffer_line_destinationXYZE(float)>
        st_synchronize();
   2f446:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
        // Move away from the possible collision with opposite endstop with the collision detection disabled.
        endstops_hit_on_purpose();
   2f44a:	0f 94 a4 25 	call	0x24b48	; 0x24b48 <endstops_hit_on_purpose()>
   2f44e:	10 92 77 02 	sts	0x0277, r1	; 0x800277 <_ZL14check_endstops.lto_priv.387>
        enable_endstops(false);
        current_position[axis] = 0;
   2f452:	f1 01       	movw	r30, r2
   2f454:	10 82       	st	Z, r1
   2f456:	11 82       	std	Z+1, r1	; 0x01
   2f458:	12 82       	std	Z+2, r1	; 0x02
   2f45a:	13 82       	std	Z+3, r1	; 0x03
        plan_set_position_curposXYZE();
   2f45c:	0f 94 41 4b 	call	0x29682	; 0x29682 <plan_set_position_curposXYZE()>
        destination[axis] = 1. * axis_home_dir;
   2f460:	aa 85       	ldd	r26, Y+10	; 0x0a
   2f462:	bb 85       	ldd	r27, Y+11	; 0x0b
   2f464:	cd 92       	st	X+, r12
   2f466:	dd 92       	st	X+, r13
   2f468:	ed 92       	st	X+, r14
   2f46a:	fc 92       	st	X, r15
   2f46c:	13 97       	sbiw	r26, 0x03	; 3
        plan_buffer_line_destinationXYZE(feedrate_mm_s);
   2f46e:	c5 01       	movw	r24, r10
   2f470:	b4 01       	movw	r22, r8
   2f472:	0f 94 4e 4c 	call	0x2989c	; 0x2989c <plan_buffer_line_destinationXYZE(float)>
        st_synchronize();
   2f476:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
   2f47a:	b1 e0       	ldi	r27, 0x01	; 1
   2f47c:	b0 93 77 02 	sts	0x0277, r27	; 0x800277 <_ZL14check_endstops.lto_priv.387>
    { return pgm_read_any(&array##_P[axis]); }

XYZ_CONSTS_FROM_CONFIG(float, base_min_pos,    MIN_POS);
XYZ_CONSTS_FROM_CONFIG(float, base_max_pos,    MAX_POS);
XYZ_CONSTS_FROM_CONFIG(float, base_home_pos,   HOME_POS);
XYZ_CONSTS_FROM_CONFIG(float, max_length,      MAX_LENGTH);
   2f480:	f8 01       	movw	r30, r16
   2f482:	e3 5f       	subi	r30, 0xF3	; 243
   2f484:	f2 46       	sbci	r31, 0x62	; 98

#define DEFINE_PGM_READ_ANY(type, reader)       \
    static inline type pgm_read_any(const type *p)  \
    { return pgm_read_##reader##_near(p); }

DEFINE_PGM_READ_ANY(float,       float);
   2f486:	85 91       	lpm	r24, Z+
   2f488:	95 91       	lpm	r25, Z+
   2f48a:	a5 91       	lpm	r26, Z+
   2f48c:	b4 91       	lpm	r27, Z
   2f48e:	8e 83       	std	Y+6, r24	; 0x06
   2f490:	9f 83       	std	Y+7, r25	; 0x07
   2f492:	a8 87       	std	Y+8, r26	; 0x08
   2f494:	b9 87       	std	Y+9, r27	; 0x09
        destination[axis] = 1. * axis_home_dir;
        plan_buffer_line_destinationXYZE(feedrate_mm_s);
        st_synchronize();
        // Now continue to move up to the left end stop with the collision detection enabled.
        enable_endstops(true);
        destination[axis] = 1.1 * axis_home_dir * max_length(axis);
   2f496:	2d ec       	ldi	r18, 0xCD	; 205
   2f498:	3c ec       	ldi	r19, 0xCC	; 204
   2f49a:	4c e8       	ldi	r20, 0x8C	; 140
   2f49c:	5f e3       	ldi	r21, 0x3F	; 63
   2f49e:	c7 01       	movw	r24, r14
   2f4a0:	b6 01       	movw	r22, r12
   2f4a2:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2f4a6:	2e 81       	ldd	r18, Y+6	; 0x06
   2f4a8:	3f 81       	ldd	r19, Y+7	; 0x07
   2f4aa:	48 85       	ldd	r20, Y+8	; 0x08
   2f4ac:	59 85       	ldd	r21, Y+9	; 0x09
   2f4ae:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2f4b2:	aa 85       	ldd	r26, Y+10	; 0x0a
   2f4b4:	bb 85       	ldd	r27, Y+11	; 0x0b
   2f4b6:	6d 93       	st	X+, r22
   2f4b8:	7d 93       	st	X+, r23
   2f4ba:	8d 93       	st	X+, r24
   2f4bc:	9c 93       	st	X, r25
   2f4be:	13 97       	sbiw	r26, 0x03	; 3
        plan_buffer_line_destinationXYZE(feedrate_mm_s);
   2f4c0:	c5 01       	movw	r24, r10
   2f4c2:	b4 01       	movw	r22, r8
   2f4c4:	0f 94 4e 4c 	call	0x2989c	; 0x2989c <plan_buffer_line_destinationXYZE(float)>
        st_synchronize();
   2f4c8:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
		for (uint8_t i = 0; i < cnt; i++)
		{
			// Move away from the collision to a known distance from the left end stop with the collision detection disabled.
			endstops_hit_on_purpose();
   2f4cc:	0f 94 a4 25 	call	0x24b48	; 0x24b48 <endstops_hit_on_purpose()>
   2f4d0:	10 92 77 02 	sts	0x0277, r1	; 0x800277 <_ZL14check_endstops.lto_priv.387>
			enable_endstops(false);
			current_position[axis] = 0;
   2f4d4:	f1 01       	movw	r30, r2
   2f4d6:	10 82       	st	Z, r1
   2f4d8:	11 82       	std	Z+1, r1	; 0x01
   2f4da:	12 82       	std	Z+2, r1	; 0x02
   2f4dc:	13 82       	std	Z+3, r1	; 0x03
			plan_set_position_curposXYZE();
   2f4de:	0f 94 41 4b 	call	0x29682	; 0x29682 <plan_set_position_curposXYZE()>
			destination[axis] = -10.f * axis_home_dir;
   2f4e2:	20 e0       	ldi	r18, 0x00	; 0
   2f4e4:	30 e0       	ldi	r19, 0x00	; 0
   2f4e6:	40 e2       	ldi	r20, 0x20	; 32
   2f4e8:	51 ec       	ldi	r21, 0xC1	; 193
   2f4ea:	c7 01       	movw	r24, r14
   2f4ec:	b6 01       	movw	r22, r12
   2f4ee:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2f4f2:	aa 85       	ldd	r26, Y+10	; 0x0a
   2f4f4:	bb 85       	ldd	r27, Y+11	; 0x0b
   2f4f6:	6d 93       	st	X+, r22
   2f4f8:	7d 93       	st	X+, r23
   2f4fa:	8d 93       	st	X+, r24
   2f4fc:	9c 93       	st	X, r25
   2f4fe:	13 97       	sbiw	r26, 0x03	; 3
			plan_buffer_line_destinationXYZE(feedrate_mm_s);
   2f500:	c5 01       	movw	r24, r10
   2f502:	b4 01       	movw	r22, r8
   2f504:	0f 94 4e 4c 	call	0x2989c	; 0x2989c <plan_buffer_line_destinationXYZE(float)>
			st_synchronize();
   2f508:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
			endstops_hit_on_purpose();
   2f50c:	0f 94 a4 25 	call	0x24b48	; 0x24b48 <endstops_hit_on_purpose()>
   2f510:	b1 e0       	ldi	r27, 0x01	; 1
   2f512:	b0 93 77 02 	sts	0x0277, r27	; 0x800277 <_ZL14check_endstops.lto_priv.387>
			// Now move left up to the collision, this time with a repeatable velocity.
			enable_endstops(true);
			destination[axis] = 11.f * axis_home_dir;
   2f516:	20 e0       	ldi	r18, 0x00	; 0
   2f518:	30 e0       	ldi	r19, 0x00	; 0
   2f51a:	40 e3       	ldi	r20, 0x30	; 48
   2f51c:	51 e4       	ldi	r21, 0x41	; 65
   2f51e:	c7 01       	movw	r24, r14
   2f520:	b6 01       	movw	r22, r12
   2f522:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2f526:	ea 85       	ldd	r30, Y+10	; 0x0a
   2f528:	fb 85       	ldd	r31, Y+11	; 0x0b
   2f52a:	60 83       	st	Z, r22
   2f52c:	71 83       	std	Z+1, r23	; 0x01
   2f52e:	82 83       	std	Z+2, r24	; 0x02
   2f530:	93 83       	std	Z+3, r25	; 0x03
#ifdef TMC2130
			feedrate = homing_feedrate[axis];
#else //TMC2130
			feedrate = homing_feedrate[axis] / 2;
   2f532:	20 e0       	ldi	r18, 0x00	; 0
   2f534:	30 e0       	ldi	r19, 0x00	; 0
   2f536:	40 e0       	ldi	r20, 0x00	; 0
   2f538:	5f e3       	ldi	r21, 0x3F	; 63
   2f53a:	c3 01       	movw	r24, r6
   2f53c:	b2 01       	movw	r22, r4
   2f53e:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2f542:	60 93 7a 02 	sts	0x027A, r22	; 0x80027a <feedrate>
   2f546:	70 93 7b 02 	sts	0x027B, r23	; 0x80027b <feedrate+0x1>
   2f54a:	80 93 7c 02 	sts	0x027C, r24	; 0x80027c <feedrate+0x2>
   2f54e:	90 93 7d 02 	sts	0x027D, r25	; 0x80027d <feedrate+0x3>
      feedrate_mm_s = get_feedrate_mm_s(feedrate);
   2f552:	0e 94 45 65 	call	0xca8a	; 0xca8a <get_feedrate_mm_s(float)>
   2f556:	6b 01       	movw	r12, r22
   2f558:	7c 01       	movw	r14, r24
#endif //TMC2130
			plan_buffer_line_destinationXYZE(feedrate_mm_s);
   2f55a:	0f 94 4e 4c 	call	0x2989c	; 0x2989c <plan_buffer_line_destinationXYZE(float)>
			st_synchronize();
   2f55e:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
			uint16_t mscnt = tmc2130_rd_MSCNT(axis);
			if (pstep) pstep[i] = mscnt >> 4;
			printf_P(PSTR("%3d step=%2d mscnt=%4d\n"), i, mscnt >> 4, mscnt);
#endif //TMC2130
		}
		endstops_hit_on_purpose();
   2f562:	0f 94 a4 25 	call	0x24b48	; 0x24b48 <endstops_hit_on_purpose()>
   2f566:	10 92 77 02 	sts	0x0277, r1	; 0x800277 <_ZL14check_endstops.lto_priv.387>
		else
			tmc2130_do_steps(axis, 8, -axis_home_dir, 1000);
		tmc2130_home_exit();
#endif //TMC2130

        axis_is_at_home(axis);
   2f56a:	8b 81       	ldd	r24, Y+3	; 0x03
   2f56c:	0e 94 8f 65 	call	0xcb1e	; 0xcb1e <axis_is_at_home(unsigned char) [clone .lto_priv.376]>
        axis_known_position[axis] = true;
   2f570:	e9 81       	ldd	r30, Y+1	; 0x01
   2f572:	fa 81       	ldd	r31, Y+2	; 0x02
   2f574:	e7 5c       	subi	r30, 0xC7	; 199
   2f576:	f9 4f       	sbci	r31, 0xF9	; 249
   2f578:	21 e0       	ldi	r18, 0x01	; 1
   2f57a:	20 83       	st	Z, r18
        // Move from minimum
#ifdef TMC2130
        float dist = - axis_home_dir * 0.01f * tmc2130_home_fsteps[axis];
#else //TMC2130
        float dist = - axis_home_dir * 0.01f * 64;
   2f57c:	8c 81       	ldd	r24, Y+4	; 0x04
   2f57e:	99 27       	eor	r25, r25
   2f580:	81 95       	neg	r24
   2f582:	0c f4       	brge	.+2      	; 0x2f586 <homeaxis(unsigned char, unsigned char) [clone .constprop.88]+0x22a>
   2f584:	90 95       	com	r25
   2f586:	bc 01       	movw	r22, r24
   2f588:	07 2e       	mov	r0, r23
   2f58a:	00 0c       	add	r0, r0
   2f58c:	88 0b       	sbc	r24, r24
   2f58e:	99 0b       	sbc	r25, r25
   2f590:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   2f594:	2a e0       	ldi	r18, 0x0A	; 10
   2f596:	37 ed       	ldi	r19, 0xD7	; 215
   2f598:	43 e2       	ldi	r20, 0x23	; 35
   2f59a:	5c e3       	ldi	r21, 0x3C	; 60
   2f59c:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2f5a0:	20 e0       	ldi	r18, 0x00	; 0
   2f5a2:	30 e0       	ldi	r19, 0x00	; 0
   2f5a4:	40 e8       	ldi	r20, 0x80	; 128
   2f5a6:	52 e4       	ldi	r21, 0x42	; 66
   2f5a8:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2f5ac:	4b 01       	movw	r8, r22
   2f5ae:	5c 01       	movw	r10, r24
#endif //TMC2130
        current_position[axis] -= dist;
   2f5b0:	ac 01       	movw	r20, r24
   2f5b2:	9b 01       	movw	r18, r22
   2f5b4:	d1 01       	movw	r26, r2
   2f5b6:	6d 91       	ld	r22, X+
   2f5b8:	7d 91       	ld	r23, X+
   2f5ba:	8d 91       	ld	r24, X+
   2f5bc:	9c 91       	ld	r25, X
   2f5be:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   2f5c2:	f1 01       	movw	r30, r2
   2f5c4:	60 83       	st	Z, r22
   2f5c6:	71 83       	std	Z+1, r23	; 0x01
   2f5c8:	82 83       	std	Z+2, r24	; 0x02
   2f5ca:	93 83       	std	Z+3, r25	; 0x03
        plan_set_position_curposXYZE();
   2f5cc:	0f 94 41 4b 	call	0x29682	; 0x29682 <plan_set_position_curposXYZE()>
        current_position[axis] += dist;
   2f5d0:	d1 01       	movw	r26, r2
   2f5d2:	2d 91       	ld	r18, X+
   2f5d4:	3d 91       	ld	r19, X+
   2f5d6:	4d 91       	ld	r20, X+
   2f5d8:	5c 91       	ld	r21, X
   2f5da:	c5 01       	movw	r24, r10
   2f5dc:	b4 01       	movw	r22, r8
   2f5de:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   2f5e2:	f1 01       	movw	r30, r2
   2f5e4:	60 83       	st	Z, r22
   2f5e6:	71 83       	std	Z+1, r23	; 0x01
   2f5e8:	82 83       	std	Z+2, r24	; 0x02
   2f5ea:	93 83       	std	Z+3, r25	; 0x03
        destination[axis] = current_position[axis];
   2f5ec:	aa 85       	ldd	r26, Y+10	; 0x0a
   2f5ee:	bb 85       	ldd	r27, Y+11	; 0x0b
   2f5f0:	6d 93       	st	X+, r22
   2f5f2:	7d 93       	st	X+, r23
   2f5f4:	8d 93       	st	X+, r24
   2f5f6:	9c 93       	st	X, r25
   2f5f8:	13 97       	sbiw	r26, 0x03	; 3
        plan_buffer_line_destinationXYZE(0.5f*feedrate_mm_s);
   2f5fa:	20 e0       	ldi	r18, 0x00	; 0
   2f5fc:	30 e0       	ldi	r19, 0x00	; 0
   2f5fe:	40 e0       	ldi	r20, 0x00	; 0
   2f600:	5f e3       	ldi	r21, 0x3F	; 63
   2f602:	c7 01       	movw	r24, r14
   2f604:	b6 01       	movw	r22, r12
   2f606:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2f60a:	0f 94 4e 4c 	call	0x2989c	; 0x2989c <plan_buffer_line_destinationXYZE(float)>
        st_synchronize();
   2f60e:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>

   		feedrate = 0.0;
   2f612:	10 92 7a 02 	sts	0x027A, r1	; 0x80027a <feedrate>
   2f616:	10 92 7b 02 	sts	0x027B, r1	; 0x80027b <feedrate+0x1>
   2f61a:	10 92 7c 02 	sts	0x027C, r1	; 0x80027c <feedrate+0x2>
   2f61e:	10 92 7d 02 	sts	0x027D, r1	; 0x80027d <feedrate+0x3>
   2f622:	2d 81       	ldd	r18, Y+5	; 0x05
   2f624:	20 93 77 02 	sts	0x0277, r18	; 0x800277 <_ZL14check_endstops.lto_priv.387>
#ifdef TMC2130
		FORCE_HIGH_POWER_END;
#endif
    }
    enable_endstops(endstops_enabled);
}
   2f628:	2b 96       	adiw	r28, 0x0b	; 11
   2f62a:	0f b6       	in	r0, 0x3f	; 63
   2f62c:	f8 94       	cli
   2f62e:	de bf       	out	0x3e, r29	; 62
   2f630:	0f be       	out	0x3f, r0	; 63
   2f632:	cd bf       	out	0x3d, r28	; 61
   2f634:	df 91       	pop	r29
   2f636:	cf 91       	pop	r28
   2f638:	1f 91       	pop	r17
   2f63a:	0f 91       	pop	r16
   2f63c:	ff 90       	pop	r15
   2f63e:	ef 90       	pop	r14
   2f640:	df 90       	pop	r13
   2f642:	cf 90       	pop	r12
   2f644:	bf 90       	pop	r11
   2f646:	af 90       	pop	r10
   2f648:	9f 90       	pop	r9
   2f64a:	8f 90       	pop	r8
   2f64c:	7f 90       	pop	r7
   2f64e:	6f 90       	pop	r6
   2f650:	5f 90       	pop	r5
   2f652:	4f 90       	pop	r4
   2f654:	3f 90       	pop	r3
   2f656:	2f 90       	pop	r2
   2f658:	08 95       	ret
#define DEFINE_PGM_READ_ANY(type, reader)       \
    static inline type pgm_read_any(const type *p)  \
    { return pgm_read_##reader##_near(p); }

DEFINE_PGM_READ_ANY(float,       float);
DEFINE_PGM_READ_ANY(signed char, byte);
   2f65a:	eb e1       	ldi	r30, 0x1B	; 27
   2f65c:	fd e9       	ldi	r31, 0x9D	; 157
   2f65e:	b4 91       	lpm	r27, Z
   2f660:	b9 83       	std	Y+1, r27	; 0x01
	{
#ifdef TMC2130
		FORCE_HIGH_POWER_START;
#endif
        int axis_home_dir = home_dir(axis);
        current_position[axis] = 0;
   2f662:	10 92 69 12 	sts	0x1269, r1	; 0x801269 <current_position+0x8>
   2f666:	10 92 6a 12 	sts	0x126A, r1	; 0x80126a <current_position+0x9>
   2f66a:	10 92 6b 12 	sts	0x126B, r1	; 0x80126b <current_position+0xa>
   2f66e:	10 92 6c 12 	sts	0x126C, r1	; 0x80126c <current_position+0xb>
        plan_set_position_curposXYZE();
   2f672:	0f 94 41 4b 	call	0x29682	; 0x29682 <plan_set_position_curposXYZE()>

#define DEFINE_PGM_READ_ANY(type, reader)       \
    static inline type pgm_read_any(const type *p)  \
    { return pgm_read_##reader##_near(p); }

DEFINE_PGM_READ_ANY(float,       float);
   2f676:	e5 e1       	ldi	r30, 0x15	; 21
   2f678:	fd e9       	ldi	r31, 0x9D	; 157
   2f67a:	85 90       	lpm	r8, Z+
   2f67c:	95 90       	lpm	r9, Z+
   2f67e:	a5 90       	lpm	r10, Z+
   2f680:	b4 90       	lpm	r11, Z
		FORCE_HIGH_POWER_START;
#endif
        int axis_home_dir = home_dir(axis);
        current_position[axis] = 0;
        plan_set_position_curposXYZE();
        destination[axis] = 1.5 * max_length(axis) * axis_home_dir;
   2f682:	e9 81       	ldd	r30, Y+1	; 0x01
   2f684:	6e 2f       	mov	r22, r30
   2f686:	ee 0f       	add	r30, r30
   2f688:	77 0b       	sbc	r23, r23
   2f68a:	88 0b       	sbc	r24, r24
   2f68c:	99 0b       	sbc	r25, r25
   2f68e:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   2f692:	6b 01       	movw	r12, r22
   2f694:	7c 01       	movw	r14, r24
   2f696:	20 e0       	ldi	r18, 0x00	; 0
   2f698:	30 e0       	ldi	r19, 0x00	; 0
   2f69a:	40 ec       	ldi	r20, 0xC0	; 192
   2f69c:	5f e3       	ldi	r21, 0x3F	; 63
   2f69e:	c5 01       	movw	r24, r10
   2f6a0:	b4 01       	movw	r22, r8
   2f6a2:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2f6a6:	a7 01       	movw	r20, r14
   2f6a8:	96 01       	movw	r18, r12
   2f6aa:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2f6ae:	60 93 31 06 	sts	0x0631, r22	; 0x800631 <destination+0x8>
   2f6b2:	70 93 32 06 	sts	0x0632, r23	; 0x800632 <destination+0x9>
   2f6b6:	80 93 33 06 	sts	0x0633, r24	; 0x800633 <destination+0xa>
   2f6ba:	90 93 34 06 	sts	0x0634, r25	; 0x800634 <destination+0xb>
        feedrate = homing_feedrate[axis];
   2f6be:	80 e0       	ldi	r24, 0x00	; 0
   2f6c0:	90 e0       	ldi	r25, 0x00	; 0
   2f6c2:	a8 e4       	ldi	r26, 0x48	; 72
   2f6c4:	b4 e4       	ldi	r27, 0x44	; 68
   2f6c6:	80 93 7a 02 	sts	0x027A, r24	; 0x80027a <feedrate>
   2f6ca:	90 93 7b 02 	sts	0x027B, r25	; 0x80027b <feedrate+0x1>
   2f6ce:	a0 93 7c 02 	sts	0x027C, r26	; 0x80027c <feedrate+0x2>
   2f6d2:	b0 93 7d 02 	sts	0x027D, r27	; 0x80027d <feedrate+0x3>
        float feedrate_mm_s = get_feedrate_mm_s(feedrate);
   2f6d6:	bc 01       	movw	r22, r24
   2f6d8:	cd 01       	movw	r24, r26
   2f6da:	0e 94 45 65 	call	0xca8a	; 0xca8a <get_feedrate_mm_s(float)>
   2f6de:	4b 01       	movw	r8, r22
   2f6e0:	5c 01       	movw	r10, r24
        plan_buffer_line_destinationXYZE(feedrate_mm_s);
   2f6e2:	0f 94 4e 4c 	call	0x2989c	; 0x2989c <plan_buffer_line_destinationXYZE(float)>
        st_synchronize();
   2f6e6:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
#ifdef TMC2130
        check_Z_crash();
#endif //TMC2130
        current_position[axis] = 0;
   2f6ea:	10 92 69 12 	sts	0x1269, r1	; 0x801269 <current_position+0x8>
   2f6ee:	10 92 6a 12 	sts	0x126A, r1	; 0x80126a <current_position+0x9>
   2f6f2:	10 92 6b 12 	sts	0x126B, r1	; 0x80126b <current_position+0xa>
   2f6f6:	10 92 6c 12 	sts	0x126C, r1	; 0x80126c <current_position+0xb>
        plan_set_position_curposXYZE();
   2f6fa:	0f 94 41 4b 	call	0x29682	; 0x29682 <plan_set_position_curposXYZE()>

#define DEFINE_PGM_READ_ANY(type, reader)       \
    static inline type pgm_read_any(const type *p)  \
    { return pgm_read_##reader##_near(p); }

DEFINE_PGM_READ_ANY(float,       float);
   2f6fe:	09 e0       	ldi	r16, 0x09	; 9
   2f700:	1d e9       	ldi	r17, 0x9D	; 157
   2f702:	f8 01       	movw	r30, r16
   2f704:	65 91       	lpm	r22, Z+
   2f706:	75 91       	lpm	r23, Z+
   2f708:	85 91       	lpm	r24, Z+
   2f70a:	94 91       	lpm	r25, Z
#ifdef TMC2130
        check_Z_crash();
#endif //TMC2130
        current_position[axis] = 0;
        plan_set_position_curposXYZE();
        destination[axis] = -home_retract_mm(axis) * axis_home_dir;
   2f70c:	90 58       	subi	r25, 0x80	; 128
   2f70e:	a7 01       	movw	r20, r14
   2f710:	96 01       	movw	r18, r12
   2f712:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2f716:	60 93 31 06 	sts	0x0631, r22	; 0x800631 <destination+0x8>
   2f71a:	70 93 32 06 	sts	0x0632, r23	; 0x800632 <destination+0x9>
   2f71e:	80 93 33 06 	sts	0x0633, r24	; 0x800633 <destination+0xa>
   2f722:	90 93 34 06 	sts	0x0634, r25	; 0x800634 <destination+0xb>
        plan_buffer_line_destinationXYZE(feedrate_mm_s);
   2f726:	c5 01       	movw	r24, r10
   2f728:	b4 01       	movw	r22, r8
   2f72a:	0f 94 4e 4c 	call	0x2989c	; 0x2989c <plan_buffer_line_destinationXYZE(float)>
        st_synchronize();
   2f72e:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>

#define DEFINE_PGM_READ_ANY(type, reader)       \
    static inline type pgm_read_any(const type *p)  \
    { return pgm_read_##reader##_near(p); }

DEFINE_PGM_READ_ANY(float,       float);
   2f732:	f8 01       	movw	r30, r16
   2f734:	65 91       	lpm	r22, Z+
   2f736:	75 91       	lpm	r23, Z+
   2f738:	85 91       	lpm	r24, Z+
   2f73a:	94 91       	lpm	r25, Z
        current_position[axis] = 0;
        plan_set_position_curposXYZE();
        destination[axis] = -home_retract_mm(axis) * axis_home_dir;
        plan_buffer_line_destinationXYZE(feedrate_mm_s);
        st_synchronize();
        destination[axis] = 2*home_retract_mm(axis) * axis_home_dir;
   2f73c:	9b 01       	movw	r18, r22
   2f73e:	ac 01       	movw	r20, r24
   2f740:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   2f744:	a7 01       	movw	r20, r14
   2f746:	96 01       	movw	r18, r12
   2f748:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   2f74c:	60 93 31 06 	sts	0x0631, r22	; 0x800631 <destination+0x8>
   2f750:	70 93 32 06 	sts	0x0632, r23	; 0x800632 <destination+0x9>
   2f754:	80 93 33 06 	sts	0x0633, r24	; 0x800633 <destination+0xa>
   2f758:	90 93 34 06 	sts	0x0634, r25	; 0x800634 <destination+0xb>
        feedrate = homing_feedrate[axis] / 2;
   2f75c:	80 e0       	ldi	r24, 0x00	; 0
   2f75e:	90 e0       	ldi	r25, 0x00	; 0
   2f760:	a8 ec       	ldi	r26, 0xC8	; 200
   2f762:	b3 e4       	ldi	r27, 0x43	; 67
   2f764:	80 93 7a 02 	sts	0x027A, r24	; 0x80027a <feedrate>
   2f768:	90 93 7b 02 	sts	0x027B, r25	; 0x80027b <feedrate+0x1>
   2f76c:	a0 93 7c 02 	sts	0x027C, r26	; 0x80027c <feedrate+0x2>
   2f770:	b0 93 7d 02 	sts	0x027D, r27	; 0x80027d <feedrate+0x3>
        feedrate_mm_s = get_feedrate_mm_s(feedrate);
   2f774:	bc 01       	movw	r22, r24
   2f776:	cd 01       	movw	r24, r26
   2f778:	0e 94 45 65 	call	0xca8a	; 0xca8a <get_feedrate_mm_s(float)>
        plan_buffer_line_destinationXYZE(feedrate_mm_s);
   2f77c:	0f 94 4e 4c 	call	0x2989c	; 0x2989c <plan_buffer_line_destinationXYZE(float)>
        st_synchronize();
   2f780:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
#ifdef TMC2130
        check_Z_crash();
#endif //TMC2130
        axis_is_at_home(axis);
   2f784:	82 e0       	ldi	r24, 0x02	; 2
   2f786:	0e 94 8f 65 	call	0xcb1e	; 0xcb1e <axis_is_at_home(unsigned char) [clone .lto_priv.376]>
        destination[axis] = current_position[axis];
   2f78a:	80 91 69 12 	lds	r24, 0x1269	; 0x801269 <current_position+0x8>
   2f78e:	90 91 6a 12 	lds	r25, 0x126A	; 0x80126a <current_position+0x9>
   2f792:	a0 91 6b 12 	lds	r26, 0x126B	; 0x80126b <current_position+0xa>
   2f796:	b0 91 6c 12 	lds	r27, 0x126C	; 0x80126c <current_position+0xb>
   2f79a:	80 93 31 06 	sts	0x0631, r24	; 0x800631 <destination+0x8>
   2f79e:	90 93 32 06 	sts	0x0632, r25	; 0x800632 <destination+0x9>
   2f7a2:	a0 93 33 06 	sts	0x0633, r26	; 0x800633 <destination+0xa>
   2f7a6:	b0 93 34 06 	sts	0x0634, r27	; 0x800634 <destination+0xb>
        feedrate = 0.0;
   2f7aa:	10 92 7a 02 	sts	0x027A, r1	; 0x80027a <feedrate>
   2f7ae:	10 92 7b 02 	sts	0x027B, r1	; 0x80027b <feedrate+0x1>
   2f7b2:	10 92 7c 02 	sts	0x027C, r1	; 0x80027c <feedrate+0x2>
   2f7b6:	10 92 7d 02 	sts	0x027D, r1	; 0x80027d <feedrate+0x3>
        endstops_hit_on_purpose();
   2f7ba:	0f 94 a4 25 	call	0x24b48	; 0x24b48 <endstops_hit_on_purpose()>
        axis_known_position[axis] = true;
   2f7be:	f1 e0       	ldi	r31, 0x01	; 1
   2f7c0:	f0 93 3b 06 	sts	0x063B, r31	; 0x80063b <axis_known_position+0x2>
   2f7c4:	2e cf       	rjmp	.-420    	; 0x2f622 <homeaxis(unsigned char, unsigned char) [clone .constprop.88]+0x2c6>

0002f7c6 <mesh_bed_leveling::reset() [clone .constprop.87]>:
#ifdef MESH_BED_LEVELING

mesh_bed_leveling mbl;

void mesh_bed_leveling::reset() {
    active = 0;
   2f7c6:	10 92 09 13 	sts	0x1309, r1	; 0x801309 <mbl>
    memset(z_values, 0, sizeof(z_values));
   2f7ca:	ea e0       	ldi	r30, 0x0A	; 10
   2f7cc:	f3 e1       	ldi	r31, 0x13	; 19
   2f7ce:	84 ec       	ldi	r24, 0xC4	; 196
   2f7d0:	df 01       	movw	r26, r30
   2f7d2:	1d 92       	st	X+, r1
   2f7d4:	8a 95       	dec	r24
   2f7d6:	e9 f7       	brne	.-6      	; 0x2f7d2 <mesh_bed_leveling::reset() [clone .constprop.87]+0xc>
}
   2f7d8:	08 95       	ret

0002f7da <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.86]>:
      plan_set_z_position(current_position[Z_AXIS]);
}

// At the current position, find the Z stop.

bool find_bed_induction_sensor_point_z(float minimum_z, uint8_t n_iter, int
   2f7da:	2f 92       	push	r2
   2f7dc:	3f 92       	push	r3
   2f7de:	4f 92       	push	r4
   2f7e0:	5f 92       	push	r5
   2f7e2:	6f 92       	push	r6
   2f7e4:	7f 92       	push	r7
   2f7e6:	8f 92       	push	r8
   2f7e8:	9f 92       	push	r9
   2f7ea:	af 92       	push	r10
   2f7ec:	bf 92       	push	r11
   2f7ee:	cf 92       	push	r12
   2f7f0:	df 92       	push	r13
   2f7f2:	ef 92       	push	r14
   2f7f4:	ff 92       	push	r15
   2f7f6:	0f 93       	push	r16
   2f7f8:	1f 93       	push	r17
   2f7fa:	cf 93       	push	r28
   2f7fc:	df 93       	push	r29
   2f7fe:	00 d0       	rcall	.+0      	; 0x2f800 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.86]+0x26>
   2f800:	cd b7       	in	r28, 0x3d	; 61
   2f802:	de b7       	in	r29, 0x3e	; 62
   2f804:	4b 01       	movw	r8, r22
   2f806:	5c 01       	movw	r10, r24
   2f808:	04 2f       	mov	r16, r20
    verbosity_level
#endif //SUPPORT_VERBOSITY
        )
{
	bool high_deviation_occured = false;
    bedPWMDisabled = 1;
   2f80a:	81 e0       	ldi	r24, 0x01	; 1
   2f80c:	80 93 28 06 	sts	0x0628, r24	; 0x800628 <bedPWMDisabled>
  return hit;
}

bool enable_endstops(bool check)
{
  bool old = check_endstops;
   2f810:	20 91 77 02 	lds	r18, 0x0277	; 0x800277 <_ZL14check_endstops.lto_priv.387>
   2f814:	29 83       	std	Y+1, r18	; 0x01
  check_endstops = check;
   2f816:	80 93 77 02 	sts	0x0277, r24	; 0x800277 <_ZL14check_endstops.lto_priv.387>
	//printf_P(PSTR("Min. Z: %f\n"), minimum_z);
	#ifdef SUPPORT_VERBOSITY
    if(verbosity_level >= 10) SERIAL_ECHOLNPGM("find bed induction sensor point z");
	#endif // SUPPORT_VERBOSITY
	bool endstops_enabled  = enable_endstops(true);
    bool endstop_z_enabled = enable_z_endstop(false);
   2f81a:	80 e0       	ldi	r24, 0x00	; 0
   2f81c:	0f 94 88 25 	call	0x24b10	; 0x24b10 <enable_z_endstop(bool)>
   2f820:	18 2f       	mov	r17, r24
    float z = 0.f;
    endstop_z_hit_on_purpose();
   2f822:	0f 94 96 25 	call	0x24b2c	; 0x24b2c <endstop_z_hit_on_purpose()>

    // move down until you find the bed
    current_position[Z_AXIS] = minimum_z;
   2f826:	80 92 69 12 	sts	0x1269, r8	; 0x801269 <current_position+0x8>
   2f82a:	90 92 6a 12 	sts	0x126A, r9	; 0x80126a <current_position+0x9>
   2f82e:	a0 92 6b 12 	sts	0x126B, r10	; 0x80126b <current_position+0xa>
   2f832:	b0 92 6c 12 	sts	0x126C, r11	; 0x80126c <current_position+0xb>
    go_to_current(homing_feedrate[Z_AXIS]/60);
   2f836:	65 e5       	ldi	r22, 0x55	; 85
   2f838:	75 e5       	ldi	r23, 0x55	; 85
   2f83a:	85 e5       	ldi	r24, 0x55	; 85
   2f83c:	91 e4       	ldi	r25, 0x41	; 65
   2f83e:	0f 94 f6 50 	call	0x2a1ec	; 0x2a1ec <go_to_current(float) [clone .lto_priv.377]>
    // we have to let the planner know where we are right now as it is not where we said to go.
    update_current_position_z();
   2f842:	0e 94 f3 5e 	call	0xbde6	; 0xbde6 <update_current_position_z() [clone .lto_priv.378]>
    if (! endstop_z_hit_on_purpose())
   2f846:	0f 94 96 25 	call	0x24b2c	; 0x24b2c <endstop_z_hit_on_purpose()>
   2f84a:	8b 83       	std	Y+3, r24	; 0x03
   2f84c:	88 23       	and	r24, r24
   2f84e:	09 f4       	brne	.+2      	; 0x2f852 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.86]+0x78>
   2f850:	eb c0       	rjmp	.+470    	; 0x2fa28 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.86]+0x24e>
	{
		//printf_P(PSTR("crash detected 1, current_pos[Z]: %f \n"), current_position[Z_AXIS]);
		goto error; //crash Z detected
	}
#endif //TMC2130
    for (uint8_t i = 0; i < n_iter; ++ i)
   2f852:	1a 82       	std	Y+2, r1	; 0x02
	#ifdef SUPPORT_VERBOSITY
    if(verbosity_level >= 10) SERIAL_ECHOLNPGM("find bed induction sensor point z");
	#endif // SUPPORT_VERBOSITY
	bool endstops_enabled  = enable_endstops(true);
    bool endstop_z_enabled = enable_z_endstop(false);
    float z = 0.f;
   2f854:	c1 2c       	mov	r12, r1
   2f856:	d1 2c       	mov	r13, r1
   2f858:	76 01       	movw	r14, r12
#ifdef SUPPORT_VERBOSITY
    verbosity_level
#endif //SUPPORT_VERBOSITY
        )
{
	bool high_deviation_occured = false;
   2f85a:	31 2c       	mov	r3, r1
	{
		//printf_P(PSTR("crash detected 1, current_pos[Z]: %f \n"), current_position[Z_AXIS]);
		goto error; //crash Z detected
	}
#endif //TMC2130
    for (uint8_t i = 0; i < n_iter; ++ i)
   2f85c:	8a 81       	ldd	r24, Y+2	; 0x02
   2f85e:	80 17       	cp	r24, r16
   2f860:	08 f0       	brcs	.+2      	; 0x2f864 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.86]+0x8a>
   2f862:	a4 c0       	rjmp	.+328    	; 0x2f9ac <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.86]+0x1d2>
	{

		current_position[Z_AXIS] += high_deviation_occured ? 0.5 : 0.2;
   2f864:	60 91 69 12 	lds	r22, 0x1269	; 0x801269 <current_position+0x8>
   2f868:	70 91 6a 12 	lds	r23, 0x126A	; 0x80126a <current_position+0x9>
   2f86c:	80 91 6b 12 	lds	r24, 0x126B	; 0x80126b <current_position+0xa>
   2f870:	90 91 6c 12 	lds	r25, 0x126C	; 0x80126c <current_position+0xb>
   2f874:	20 e0       	ldi	r18, 0x00	; 0
   2f876:	30 e0       	ldi	r19, 0x00	; 0
   2f878:	40 e0       	ldi	r20, 0x00	; 0
   2f87a:	5f e3       	ldi	r21, 0x3F	; 63
   2f87c:	31 10       	cpse	r3, r1
   2f87e:	04 c0       	rjmp	.+8      	; 0x2f888 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.86]+0xae>
   2f880:	2d ec       	ldi	r18, 0xCD	; 205
   2f882:	3c ec       	ldi	r19, 0xCC	; 204
   2f884:	4c e4       	ldi	r20, 0x4C	; 76
   2f886:	5e e3       	ldi	r21, 0x3E	; 62
   2f888:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   2f88c:	2b 01       	movw	r4, r22
   2f88e:	3c 01       	movw	r6, r24
   2f890:	40 92 69 12 	sts	0x1269, r4	; 0x801269 <current_position+0x8>
   2f894:	50 92 6a 12 	sts	0x126A, r5	; 0x80126a <current_position+0x9>
   2f898:	60 92 6b 12 	sts	0x126B, r6	; 0x80126b <current_position+0xa>
   2f89c:	70 92 6c 12 	sts	0x126C, r7	; 0x80126c <current_position+0xb>
		float z_bckp = current_position[Z_AXIS];
		go_to_current(homing_feedrate[Z_AXIS]/60);
   2f8a0:	65 e5       	ldi	r22, 0x55	; 85
   2f8a2:	75 e5       	ldi	r23, 0x55	; 85
   2f8a4:	85 e5       	ldi	r24, 0x55	; 85
   2f8a6:	91 e4       	ldi	r25, 0x41	; 65
   2f8a8:	0f 94 f6 50 	call	0x2a1ec	; 0x2a1ec <go_to_current(float) [clone .lto_priv.377]>
		// Move back down slowly to find bed.
        current_position[Z_AXIS] = minimum_z;
   2f8ac:	80 92 69 12 	sts	0x1269, r8	; 0x801269 <current_position+0x8>
   2f8b0:	90 92 6a 12 	sts	0x126A, r9	; 0x80126a <current_position+0x9>
   2f8b4:	a0 92 6b 12 	sts	0x126B, r10	; 0x80126b <current_position+0xa>
   2f8b8:	b0 92 6c 12 	sts	0x126C, r11	; 0x80126c <current_position+0xb>
		//printf_P(PSTR("init Z = %f, min_z = %f, i = %d\n"), z_bckp, minimum_z, i);
        go_to_current(homing_feedrate[Z_AXIS]/(4*60));
   2f8bc:	65 e5       	ldi	r22, 0x55	; 85
   2f8be:	75 e5       	ldi	r23, 0x55	; 85
   2f8c0:	85 e5       	ldi	r24, 0x55	; 85
   2f8c2:	90 e4       	ldi	r25, 0x40	; 64
   2f8c4:	0f 94 f6 50 	call	0x2a1ec	; 0x2a1ec <go_to_current(float) [clone .lto_priv.377]>
        // we have to let the planner know where we are right now as it is not where we said to go.
        update_current_position_z();
   2f8c8:	0e 94 f3 5e 	call	0xbde6	; 0xbde6 <update_current_position_z() [clone .lto_priv.378]>
		//printf_P(PSTR("Zs: %f, Z: %f, delta Z: %f"), z_bckp, current_position[Z_AXIS], (z_bckp - current_position[Z_AXIS]));
		if (fabs(current_position[Z_AXIS] - z_bckp) < 0.025) {
   2f8cc:	a3 01       	movw	r20, r6
   2f8ce:	92 01       	movw	r18, r4
   2f8d0:	60 91 69 12 	lds	r22, 0x1269	; 0x801269 <current_position+0x8>
   2f8d4:	70 91 6a 12 	lds	r23, 0x126A	; 0x80126a <current_position+0x9>
   2f8d8:	80 91 6b 12 	lds	r24, 0x126B	; 0x80126b <current_position+0xa>
   2f8dc:	90 91 6c 12 	lds	r25, 0x126C	; 0x80126c <current_position+0xb>
   2f8e0:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   2f8e4:	9f 77       	andi	r25, 0x7F	; 127
   2f8e6:	2d ec       	ldi	r18, 0xCD	; 205
   2f8e8:	3c ec       	ldi	r19, 0xCC	; 204
   2f8ea:	4c ec       	ldi	r20, 0xCC	; 204
   2f8ec:	5c e3       	ldi	r21, 0x3C	; 60
   2f8ee:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   2f8f2:	87 ff       	sbrs	r24, 7
   2f8f4:	16 c0       	rjmp	.+44     	; 0x2f922 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.86]+0x148>
			//printf_P(PSTR("PINDA triggered immediately, move Z higher and repeat measurement\n"));
			raise_z(0.5);
   2f8f6:	60 e0       	ldi	r22, 0x00	; 0
   2f8f8:	70 e0       	ldi	r23, 0x00	; 0
   2f8fa:	80 e0       	ldi	r24, 0x00	; 0
   2f8fc:	9f e3       	ldi	r25, 0x3F	; 63
   2f8fe:	0e 94 94 6c 	call	0xd928	; 0xd928 <raise_z(float)>
			current_position[Z_AXIS] = minimum_z;
   2f902:	80 92 69 12 	sts	0x1269, r8	; 0x801269 <current_position+0x8>
   2f906:	90 92 6a 12 	sts	0x126A, r9	; 0x80126a <current_position+0x9>
   2f90a:	a0 92 6b 12 	sts	0x126B, r10	; 0x80126b <current_position+0xa>
   2f90e:	b0 92 6c 12 	sts	0x126C, r11	; 0x80126c <current_position+0xb>
            go_to_current(homing_feedrate[Z_AXIS]/(4*60));
   2f912:	65 e5       	ldi	r22, 0x55	; 85
   2f914:	75 e5       	ldi	r23, 0x55	; 85
   2f916:	85 e5       	ldi	r24, 0x55	; 85
   2f918:	90 e4       	ldi	r25, 0x40	; 64
   2f91a:	0f 94 f6 50 	call	0x2a1ec	; 0x2a1ec <go_to_current(float) [clone .lto_priv.377]>
            // we have to let the planner know where we are right now as it is not where we said to go.
			update_current_position_z();
   2f91e:	0e 94 f3 5e 	call	0xbde6	; 0xbde6 <update_current_position_z() [clone .lto_priv.378]>
		}



		if (!endstop_z_hit_on_purpose())
   2f922:	0f 94 96 25 	call	0x24b2c	; 0x24b2c <endstop_z_hit_on_purpose()>
   2f926:	28 2e       	mov	r2, r24
   2f928:	88 23       	and	r24, r24
   2f92a:	09 f4       	brne	.+2      	; 0x2f92e <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.86]+0x154>
   2f92c:	7d c0       	rjmp	.+250    	; 0x2fa28 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.86]+0x24e>
   2f92e:	40 90 69 12 	lds	r4, 0x1269	; 0x801269 <current_position+0x8>
   2f932:	50 90 6a 12 	lds	r5, 0x126A	; 0x80126a <current_position+0x9>
   2f936:	60 90 6b 12 	lds	r6, 0x126B	; 0x80126b <current_position+0xa>
   2f93a:	70 90 6c 12 	lds	r7, 0x126C	; 0x80126c <current_position+0xb>
		}
#endif //TMC2130
//        SERIAL_ECHOPGM("Bed find_bed_induction_sensor_point_z low, height: ");
//        MYSERIAL.print(current_position[Z_AXIS], 5);
//        SERIAL_ECHOLNPGM("");
		float dz = i?fabs(current_position[Z_AXIS] - (z / i)):0;
   2f93e:	9a 81       	ldd	r25, Y+2	; 0x02
   2f940:	99 23       	and	r25, r25
   2f942:	d9 f0       	breq	.+54     	; 0x2f97a <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.86]+0x1a0>
   2f944:	69 2f       	mov	r22, r25
   2f946:	70 e0       	ldi	r23, 0x00	; 0
   2f948:	90 e0       	ldi	r25, 0x00	; 0
   2f94a:	80 e0       	ldi	r24, 0x00	; 0
   2f94c:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   2f950:	9b 01       	movw	r18, r22
   2f952:	ac 01       	movw	r20, r24
   2f954:	c7 01       	movw	r24, r14
   2f956:	b6 01       	movw	r22, r12
   2f958:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   2f95c:	9b 01       	movw	r18, r22
   2f95e:	ac 01       	movw	r20, r24
   2f960:	c3 01       	movw	r24, r6
   2f962:	b2 01       	movw	r22, r4
   2f964:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   2f968:	9f 77       	andi	r25, 0x7F	; 127
        z += current_position[Z_AXIS];
		//printf_P(PSTR("Z[%d] = %d, dz=%d\n"), i, (int)(current_position[Z_AXIS] * 1000), (int)(dz * 1000));
		//printf_P(PSTR("Z- measurement deviation from avg value %f um\n"), dz);
		if (dz > 0.05) { //deviation > 50um
   2f96a:	2d ec       	ldi	r18, 0xCD	; 205
   2f96c:	3c ec       	ldi	r19, 0xCC	; 204
   2f96e:	4c e4       	ldi	r20, 0x4C	; 76
   2f970:	5d e3       	ldi	r21, 0x3D	; 61
   2f972:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   2f976:	18 16       	cp	r1, r24
   2f978:	64 f0       	brlt	.+24     	; 0x2f992 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.86]+0x1b8>
#endif //TMC2130
//        SERIAL_ECHOPGM("Bed find_bed_induction_sensor_point_z low, height: ");
//        MYSERIAL.print(current_position[Z_AXIS], 5);
//        SERIAL_ECHOLNPGM("");
		float dz = i?fabs(current_position[Z_AXIS] - (z / i)):0;
        z += current_position[Z_AXIS];
   2f97a:	a3 01       	movw	r20, r6
   2f97c:	92 01       	movw	r18, r4
   2f97e:	c7 01       	movw	r24, r14
   2f980:	b6 01       	movw	r22, r12
   2f982:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   2f986:	6b 01       	movw	r12, r22
   2f988:	7c 01       	movw	r14, r24
	{
		//printf_P(PSTR("crash detected 1, current_pos[Z]: %f \n"), current_position[Z_AXIS]);
		goto error; //crash Z detected
	}
#endif //TMC2130
    for (uint8_t i = 0; i < n_iter; ++ i)
   2f98a:	8a 81       	ldd	r24, Y+2	; 0x02
   2f98c:	8f 5f       	subi	r24, 0xFF	; 255
   2f98e:	8a 83       	std	Y+2, r24	; 0x02
   2f990:	65 cf       	rjmp	.-310    	; 0x2f85c <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.86]+0x82>
		float dz = i?fabs(current_position[Z_AXIS] - (z / i)):0;
        z += current_position[Z_AXIS];
		//printf_P(PSTR("Z[%d] = %d, dz=%d\n"), i, (int)(current_position[Z_AXIS] * 1000), (int)(dz * 1000));
		//printf_P(PSTR("Z- measurement deviation from avg value %f um\n"), dz);
		if (dz > 0.05) { //deviation > 50um
			if (high_deviation_occured == false) { //first occurence may be caused in some cases by mechanic resonance probably especially if printer is placed on unstable surface
   2f992:	31 10       	cpse	r3, r1
   2f994:	49 c0       	rjmp	.+146    	; 0x2fa28 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.86]+0x24e>
				//printf_P(PSTR("high dev. first occurence\n"));
				delay_keep_alive(500); //damping
   2f996:	84 ef       	ldi	r24, 0xF4	; 244
   2f998:	91 e0       	ldi	r25, 0x01	; 1
   2f99a:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
				//start measurement from the begining, but this time with higher movements in Z axis which should help to reduce mechanical resonance
				high_deviation_occured = true;
   2f99e:	32 2c       	mov	r3, r2
				i = -1;
   2f9a0:	2f ef       	ldi	r18, 0xFF	; 255
   2f9a2:	2a 83       	std	Y+2, r18	; 0x02
				z = 0;
   2f9a4:	c1 2c       	mov	r12, r1
   2f9a6:	d1 2c       	mov	r13, r1
   2f9a8:	76 01       	movw	r14, r12
   2f9aa:	ef cf       	rjmp	.-34     	; 0x2f98a <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.86]+0x1b0>
			}
		}
		//printf_P(PSTR("PINDA triggered at %f\n"), current_position[Z_AXIS]);
    }
    current_position[Z_AXIS] = z;
    if (n_iter > 1)
   2f9ac:	02 30       	cpi	r16, 0x02	; 2
   2f9ae:	38 f5       	brcc	.+78     	; 0x2f9fe <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.86]+0x224>
				goto error;
			}
		}
		//printf_P(PSTR("PINDA triggered at %f\n"), current_position[Z_AXIS]);
    }
    current_position[Z_AXIS] = z;
   2f9b0:	c0 92 69 12 	sts	0x1269, r12	; 0x801269 <current_position+0x8>
   2f9b4:	d0 92 6a 12 	sts	0x126A, r13	; 0x80126a <current_position+0x9>
   2f9b8:	e0 92 6b 12 	sts	0x126B, r14	; 0x80126b <current_position+0xa>
   2f9bc:	f0 92 6c 12 	sts	0x126C, r15	; 0x80126c <current_position+0xb>
   2f9c0:	99 81       	ldd	r25, Y+1	; 0x01
   2f9c2:	90 93 77 02 	sts	0x0277, r25	; 0x800277 <_ZL14check_endstops.lto_priv.387>
    if (n_iter > 1)
        current_position[Z_AXIS] /= float(n_iter);


    enable_endstops(endstops_enabled);
    enable_z_endstop(endstop_z_enabled);
   2f9c6:	81 2f       	mov	r24, r17
   2f9c8:	0f 94 88 25 	call	0x24b10	; 0x24b10 <enable_z_endstop(bool)>
//    SERIAL_ECHOLNPGM("find_bed_induction_sensor_point_z 3");
#ifdef TMC2130
    if (bHighPowerForced) FORCE_HIGH_POWER_END;
#endif
    bedPWMDisabled = 0;
   2f9cc:	10 92 28 06 	sts	0x0628, r1	; 0x800628 <bedPWMDisabled>
#ifdef TMC2130
	if (bHighPowerForced) FORCE_HIGH_POWER_END;
#endif
    bedPWMDisabled = 0;
	return false;
}
   2f9d0:	8b 81       	ldd	r24, Y+3	; 0x03
   2f9d2:	0f 90       	pop	r0
   2f9d4:	0f 90       	pop	r0
   2f9d6:	0f 90       	pop	r0
   2f9d8:	df 91       	pop	r29
   2f9da:	cf 91       	pop	r28
   2f9dc:	1f 91       	pop	r17
   2f9de:	0f 91       	pop	r16
   2f9e0:	ff 90       	pop	r15
   2f9e2:	ef 90       	pop	r14
   2f9e4:	df 90       	pop	r13
   2f9e6:	cf 90       	pop	r12
   2f9e8:	bf 90       	pop	r11
   2f9ea:	af 90       	pop	r10
   2f9ec:	9f 90       	pop	r9
   2f9ee:	8f 90       	pop	r8
   2f9f0:	7f 90       	pop	r7
   2f9f2:	6f 90       	pop	r6
   2f9f4:	5f 90       	pop	r5
   2f9f6:	4f 90       	pop	r4
   2f9f8:	3f 90       	pop	r3
   2f9fa:	2f 90       	pop	r2
   2f9fc:	08 95       	ret
		}
		//printf_P(PSTR("PINDA triggered at %f\n"), current_position[Z_AXIS]);
    }
    current_position[Z_AXIS] = z;
    if (n_iter > 1)
        current_position[Z_AXIS] /= float(n_iter);
   2f9fe:	60 2f       	mov	r22, r16
   2fa00:	70 e0       	ldi	r23, 0x00	; 0
   2fa02:	90 e0       	ldi	r25, 0x00	; 0
   2fa04:	80 e0       	ldi	r24, 0x00	; 0
   2fa06:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   2fa0a:	9b 01       	movw	r18, r22
   2fa0c:	ac 01       	movw	r20, r24
   2fa0e:	c7 01       	movw	r24, r14
   2fa10:	b6 01       	movw	r22, r12
   2fa12:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   2fa16:	60 93 69 12 	sts	0x1269, r22	; 0x801269 <current_position+0x8>
   2fa1a:	70 93 6a 12 	sts	0x126A, r23	; 0x80126a <current_position+0x9>
   2fa1e:	80 93 6b 12 	sts	0x126B, r24	; 0x80126b <current_position+0xa>
   2fa22:	90 93 6c 12 	sts	0x126C, r25	; 0x80126c <current_position+0xb>
   2fa26:	cc cf       	rjmp	.-104    	; 0x2f9c0 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.86]+0x1e6>
   2fa28:	29 81       	ldd	r18, Y+1	; 0x01
   2fa2a:	20 93 77 02 	sts	0x0277, r18	; 0x800277 <_ZL14check_endstops.lto_priv.387>
	return true;

error:
//    SERIAL_ECHOLNPGM("find_bed_induction_sensor_point_z 4");
    enable_endstops(endstops_enabled);
    enable_z_endstop(endstop_z_enabled);
   2fa2e:	81 2f       	mov	r24, r17
   2fa30:	0f 94 88 25 	call	0x24b10	; 0x24b10 <enable_z_endstop(bool)>
#ifdef TMC2130
	if (bHighPowerForced) FORCE_HIGH_POWER_END;
#endif
    bedPWMDisabled = 0;
   2fa34:	10 92 28 06 	sts	0x0628, r1	; 0x800628 <bedPWMDisabled>
	return false;
   2fa38:	1b 82       	std	Y+3, r1	; 0x03
   2fa3a:	ca cf       	rjmp	.-108    	; 0x2f9d0 <find_bed_induction_sensor_point_z(float, unsigned char, int) [clone .constprop.86]+0x1f6>

0002fa3c <gcode_M45(bool, signed char) [clone .constprop.63]>:
//! @brief Calibrate XYZ
//! @param onlyZ if true, calibrate only Z axis
//! @param verbosity_level
//! @retval true Succeeded
//! @retval false Failed
bool gcode_M45(bool onlyZ, int8_t verbosity_level)
   2fa3c:	2f 92       	push	r2
   2fa3e:	3f 92       	push	r3
   2fa40:	4f 92       	push	r4
   2fa42:	5f 92       	push	r5
   2fa44:	6f 92       	push	r6
   2fa46:	7f 92       	push	r7
   2fa48:	8f 92       	push	r8
   2fa4a:	9f 92       	push	r9
   2fa4c:	af 92       	push	r10
   2fa4e:	bf 92       	push	r11
   2fa50:	cf 92       	push	r12
   2fa52:	df 92       	push	r13
   2fa54:	ef 92       	push	r14
   2fa56:	ff 92       	push	r15
   2fa58:	0f 93       	push	r16
   2fa5a:	1f 93       	push	r17
   2fa5c:	cf 93       	push	r28
   2fa5e:	df 93       	push	r29
   2fa60:	cd b7       	in	r28, 0x3d	; 61
   2fa62:	de b7       	in	r29, 0x3e	; 62
   2fa64:	ce 5c       	subi	r28, 0xCE	; 206
   2fa66:	d1 09       	sbc	r29, r1
   2fa68:	0f b6       	in	r0, 0x3f	; 63
   2fa6a:	f8 94       	cli
   2fa6c:	de bf       	out	0x3e, r29	; 62
   2fa6e:	0f be       	out	0x3f, r0	; 63
   2fa70:	cd bf       	out	0x3d, r28	; 61
   2fa72:	18 2f       	mov	r17, r24
	#endif // TMC2130

    FORCE_BL_ON_START;

    // Only Z calibration?
	if (!onlyZ)
   2fa74:	81 11       	cpse	r24, r1
   2fa76:	04 c0       	rjmp	.+8      	; 0x2fa80 <gcode_M45(bool, signed char) [clone .constprop.63]+0x44>
	{
		disable_heater();
   2fa78:	0f 94 05 11 	call	0x2220a	; 0x2220a <disable_heater()>
		eeprom_adjust_bed_reset(); //reset bed level correction
   2fa7c:	0e 94 df 78 	call	0xf1be	; 0xf1be <eeprom_adjust_bed_reset()>
	}

	// Disable the default update procedure of the display. We will do a modal dialog.
	lcd_update_enable(false);
   2fa80:	80 e0       	ldi	r24, 0x00	; 0
   2fa82:	0e 94 38 70 	call	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>
	// Let the planner use the uncorrected coordinates.
	mbl.reset();
   2fa86:	0f 94 e3 7b 	call	0x2f7c6	; 0x2f7c6 <mesh_bed_leveling::reset() [clone .constprop.87]>
	// Reset world2machine_rotation_and_skew and world2machine_shift, therefore
	// the planner will not perform any adjustments in the XY plane.
	// Wait for the motors to stop and update the current position with the absolute values.
	world2machine_revert_to_uncorrected();
   2fa8a:	0e 94 2d 62 	call	0xc45a	; 0xc45a <world2machine_revert_to_uncorrected()>
      babystepLoadZ = 0;
}

void babystep_reset()
{
	babystepLoadZ = 0;
   2fa8e:	10 92 27 06 	sts	0x0627, r1	; 0x800627 <_ZL13babystepLoadZ.lto_priv.452+0x1>
   2fa92:	10 92 26 06 	sts	0x0626, r1	; 0x800626 <_ZL13babystepLoadZ.lto_priv.452>
	// Reset the baby step value applied without moving the axes.
	babystep_reset();
	// Mark all axes as in a need for homing.
	memset(axis_known_position, 0, sizeof(axis_known_position));
   2fa96:	e9 e3       	ldi	r30, 0x39	; 57
   2fa98:	f6 e0       	ldi	r31, 0x06	; 6
   2fa9a:	83 e0       	ldi	r24, 0x03	; 3
   2fa9c:	df 01       	movw	r26, r30
   2fa9e:	1d 92       	st	X+, r1
   2faa0:	8a 95       	dec	r24
   2faa2:	e9 f7       	brne	.-6      	; 0x2fa9e <gcode_M45(bool, signed char) [clone .constprop.63]+0x62>

	// Home in the XY plane.
	//set_destination_to_current();
	int l_feedmultiply = setup_for_endstop_move();
   2faa4:	81 e0       	ldi	r24, 0x01	; 1
   2faa6:	0e 94 66 65 	call	0xcacc	; 0xcacc <setup_for_endstop_move(bool) [clone .lto_priv.381]>
   2faaa:	c7 55       	subi	r28, 0x57	; 87
   2faac:	df 4f       	sbci	r29, 0xFF	; 255
   2faae:	99 83       	std	Y+1, r25	; 0x01
   2fab0:	88 83       	st	Y, r24
   2fab2:	c9 5a       	subi	r28, 0xA9	; 169
   2fab4:	d0 40       	sbci	r29, 0x00	; 0
	lcd_display_message_fullscreen_P(_T(MSG_AUTO_HOME));
   2fab6:	81 ec       	ldi	r24, 0xC1	; 193
   2fab8:	91 e6       	ldi	r25, 0x61	; 97
   2faba:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   2fabe:	0e 94 a9 e0 	call	0x1c152	; 0x1c152 <lcd_display_message_fullscreen_P(char const*)>
  raise_z_above(MESH_HOME_Z_SEARCH);
   2fac2:	60 e0       	ldi	r22, 0x00	; 0
   2fac4:	70 e0       	ldi	r23, 0x00	; 0
   2fac6:	80 ea       	ldi	r24, 0xA0	; 160
   2fac8:	90 e4       	ldi	r25, 0x40	; 64
   2faca:	0e 94 f6 6c 	call	0xd9ec	; 0xd9ec <raise_z_above(float)>
}

/**/
void home_xy()
{
    set_destination_to_current();
   2face:	0e 94 ae 66 	call	0xcd5c	; 0xcd5c <set_destination_to_current()>
    homeaxis(X_AXIS);
   2fad2:	80 e0       	ldi	r24, 0x00	; 0
   2fad4:	0f 94 ae 79 	call	0x2f35c	; 0x2f35c <homeaxis(unsigned char, unsigned char) [clone .constprop.88]>
    homeaxis(Y_AXIS);
   2fad8:	81 e0       	ldi	r24, 0x01	; 1
   2fada:	0f 94 ae 79 	call	0x2f35c	; 0x2f35c <homeaxis(unsigned char, unsigned char) [clone .constprop.88]>
    plan_set_position_curposXYZE();
   2fade:	0f 94 41 4b 	call	0x29682	; 0x29682 <plan_set_position_curposXYZE()>
    endstops_hit_on_purpose();
   2fae2:	0f 94 a4 25 	call	0x24b48	; 0x24b48 <endstops_hit_on_purpose()>
   2fae6:	10 92 77 02 	sts	0x0277, r1	; 0x800277 <_ZL14check_endstops.lto_priv.387>
	lcd_display_message_fullscreen_P(_T(MSG_AUTO_HOME));
  raise_z_above(MESH_HOME_Z_SEARCH);
	home_xy();

	enable_endstops(false);
	current_position[X_AXIS] += 5;
   2faea:	20 e0       	ldi	r18, 0x00	; 0
   2faec:	30 e0       	ldi	r19, 0x00	; 0
   2faee:	40 ea       	ldi	r20, 0xA0	; 160
   2faf0:	50 e4       	ldi	r21, 0x40	; 64
   2faf2:	60 91 61 12 	lds	r22, 0x1261	; 0x801261 <current_position>
   2faf6:	70 91 62 12 	lds	r23, 0x1262	; 0x801262 <current_position+0x1>
   2fafa:	80 91 63 12 	lds	r24, 0x1263	; 0x801263 <current_position+0x2>
   2fafe:	90 91 64 12 	lds	r25, 0x1264	; 0x801264 <current_position+0x3>
   2fb02:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   2fb06:	60 93 61 12 	sts	0x1261, r22	; 0x801261 <current_position>
   2fb0a:	70 93 62 12 	sts	0x1262, r23	; 0x801262 <current_position+0x1>
   2fb0e:	80 93 63 12 	sts	0x1263, r24	; 0x801263 <current_position+0x2>
   2fb12:	90 93 64 12 	sts	0x1264, r25	; 0x801264 <current_position+0x3>
	current_position[Y_AXIS] += 5;
   2fb16:	20 e0       	ldi	r18, 0x00	; 0
   2fb18:	30 e0       	ldi	r19, 0x00	; 0
   2fb1a:	40 ea       	ldi	r20, 0xA0	; 160
   2fb1c:	50 e4       	ldi	r21, 0x40	; 64
   2fb1e:	60 91 65 12 	lds	r22, 0x1265	; 0x801265 <current_position+0x4>
   2fb22:	70 91 66 12 	lds	r23, 0x1266	; 0x801266 <current_position+0x5>
   2fb26:	80 91 67 12 	lds	r24, 0x1267	; 0x801267 <current_position+0x6>
   2fb2a:	90 91 68 12 	lds	r25, 0x1268	; 0x801268 <current_position+0x7>
   2fb2e:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   2fb32:	60 93 65 12 	sts	0x1265, r22	; 0x801265 <current_position+0x4>
   2fb36:	70 93 66 12 	sts	0x1266, r23	; 0x801266 <current_position+0x5>
   2fb3a:	80 93 67 12 	sts	0x1267, r24	; 0x801267 <current_position+0x6>
   2fb3e:	90 93 68 12 	sts	0x1268, r25	; 0x801268 <current_position+0x7>
	plan_buffer_line_curposXYZE(homing_feedrate[Z_AXIS] / 40);
   2fb42:	60 e0       	ldi	r22, 0x00	; 0
   2fb44:	70 e0       	ldi	r23, 0x00	; 0
   2fb46:	80 ea       	ldi	r24, 0xA0	; 160
   2fb48:	91 e4       	ldi	r25, 0x41	; 65
   2fb4a:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
	st_synchronize();
   2fb4e:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
	// Let the user move the Z axes up to the end stoppers.
#ifdef TMC2130
	if (calibrate_z_auto())
	{
#else //TMC2130
	if (lcd_calibrate_z_end_stop_manual(onlyZ))
   2fb52:	81 2f       	mov	r24, r17
   2fb54:	0e 94 11 fc 	call	0x1f822	; 0x1f822 <lcd_calibrate_z_end_stop_manual(bool)>
   2fb58:	e5 96       	adiw	r28, 0x35	; 53
   2fb5a:	8f af       	std	Y+63, r24	; 0x3f
   2fb5c:	e5 97       	sbiw	r28, 0x35	; 53
   2fb5e:	81 11       	cpse	r24, r1
   2fb60:	04 c0       	rjmp	.+8      	; 0x2fb6a <gcode_M45(bool, signed char) [clone .constprop.63]+0x12e>
//! @param verbosity_level
//! @retval true Succeeded
//! @retval false Failed
bool gcode_M45(bool onlyZ, int8_t verbosity_level)
{
	bool final_result = false;
   2fb62:	e5 96       	adiw	r28, 0x35	; 53
   2fb64:	1f ae       	std	Y+63, r1	; 0x3f
   2fb66:	e5 97       	sbiw	r28, 0x35	; 53
   2fb68:	6f c4       	rjmp	.+2270   	; 0x30448 <gcode_M45(bool, signed char) [clone .constprop.63]+0xa0c>
	{
#else //TMC2130
	if (lcd_calibrate_z_end_stop_manual(onlyZ))
	{
#endif //TMC2130
		lcd_show_fullscreen_message_and_wait_P(_T(MSG_CONFIRM_NOZZLE_CLEAN));
   2fb6a:	85 e8       	ldi	r24, 0x85	; 133
   2fb6c:	91 e6       	ldi	r25, 0x61	; 97
   2fb6e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   2fb72:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
		if(onlyZ){
   2fb76:	11 23       	and	r17, r17
   2fb78:	09 f4       	brne	.+2      	; 0x2fb7c <gcode_M45(bool, signed char) [clone .constprop.63]+0x140>
   2fb7a:	41 c4       	rjmp	.+2178   	; 0x303fe <gcode_M45(bool, signed char) [clone .constprop.63]+0x9c2>
			prompt_steel_sheet_on_bed(true);
   2fb7c:	81 e0       	ldi	r24, 0x01	; 1
   2fb7e:	0e 94 60 eb 	call	0x1d6c0	; 0x1d6c0 <prompt_steel_sheet_on_bed(bool)>
			lcd_display_message_fullscreen_P(_T(MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1));
   2fb82:	83 e5       	ldi	r24, 0x53	; 83
   2fb84:	91 e6       	ldi	r25, 0x61	; 97
   2fb86:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   2fb8a:	0e 94 a9 e0 	call	0x1c152	; 0x1c152 <lcd_display_message_fullscreen_P(char const*)>
			lcd_puts_at_P(0,3,_n("1/9"));
   2fb8e:	42 ee       	ldi	r20, 0xE2	; 226
   2fb90:	5b e6       	ldi	r21, 0x6B	; 107
		}else{
			//lcd_show_fullscreen_message_and_wait_P(_T(MSG_PAPER));
			lcd_display_message_fullscreen_P(_T(MSG_FIND_BED_OFFSET_AND_SKEW_LINE1));
			lcd_puts_at_P(0,3,_n("1/4"));
   2fb92:	63 e0       	ldi	r22, 0x03	; 3
   2fb94:	80 e0       	ldi	r24, 0x00	; 0
   2fb96:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
		}

		refresh_cmd_timeout();
   2fb9a:	0e 94 41 65 	call	0xca82	; 0xca82 <refresh_cmd_timeout()>
		if (((degHotend(0) > MAX_HOTEND_TEMP_CALIBRATION) || (degBed() > MAX_BED_TEMP_CALIBRATION)) && (!onlyZ))
		{
			lcd_wait_for_cool_down();
		}
		#endif //STEEL_SHEET
		if(!onlyZ)
   2fb9e:	11 11       	cpse	r17, r1
   2fba0:	1b c0       	rjmp	.+54     	; 0x2fbd8 <gcode_M45(bool, signed char) [clone .constprop.63]+0x19c>
		{
			KEEPALIVE_STATE(PAUSED_FOR_USER);
   2fba2:	84 e0       	ldi	r24, 0x04	; 4
   2fba4:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
			prompt_steel_sheet_on_bed(false);
   2fba8:	80 e0       	ldi	r24, 0x00	; 0
   2fbaa:	0e 94 60 eb 	call	0x1d6c0	; 0x1d6c0 <prompt_steel_sheet_on_bed(bool)>
			lcd_show_fullscreen_message_and_wait_P(_T(MSG_PAPER));
   2fbae:	89 e9       	ldi	r24, 0x99	; 153
   2fbb0:	90 e6       	ldi	r25, 0x60	; 96
   2fbb2:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   2fbb6:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
			KEEPALIVE_STATE(IN_HANDLER);
   2fbba:	82 e0       	ldi	r24, 0x02	; 2
   2fbbc:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
			lcd_display_message_fullscreen_P(_T(MSG_FIND_BED_OFFSET_AND_SKEW_LINE1));
   2fbc0:	81 e3       	ldi	r24, 0x31	; 49
   2fbc2:	91 e6       	ldi	r25, 0x61	; 97
   2fbc4:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   2fbc8:	0e 94 a9 e0 	call	0x1c152	; 0x1c152 <lcd_display_message_fullscreen_P(char const*)>
			lcd_puts_at_P(0,3,_n("1/4"));
   2fbcc:	4a ed       	ldi	r20, 0xDA	; 218
   2fbce:	5b e6       	ldi	r21, 0x6B	; 107
   2fbd0:	63 e0       	ldi	r22, 0x03	; 3
   2fbd2:	80 e0       	ldi	r24, 0x00	; 0
   2fbd4:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
  return hit;
}

bool enable_endstops(bool check)
{
  bool old = check_endstops;
   2fbd8:	00 91 77 02 	lds	r16, 0x0277	; 0x800277 <_ZL14check_endstops.lto_priv.387>
  check_endstops = check;
   2fbdc:	10 92 77 02 	sts	0x0277, r1	; 0x800277 <_ZL14check_endstops.lto_priv.387>
		}

		bool endstops_enabled  = enable_endstops(false);
    raise_z(-1);
   2fbe0:	60 e0       	ldi	r22, 0x00	; 0
   2fbe2:	70 e0       	ldi	r23, 0x00	; 0
   2fbe4:	80 e8       	ldi	r24, 0x80	; 128
   2fbe6:	9f eb       	ldi	r25, 0xBF	; 191
   2fbe8:	0e 94 94 6c 	call	0xd928	; 0xd928 <raise_z(float)>

		// Move the print head close to the bed.
		current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
   2fbec:	c1 2c       	mov	r12, r1
   2fbee:	d1 2c       	mov	r13, r1
   2fbf0:	b0 ea       	ldi	r27, 0xA0	; 160
   2fbf2:	eb 2e       	mov	r14, r27
   2fbf4:	b0 e4       	ldi	r27, 0x40	; 64
   2fbf6:	fb 2e       	mov	r15, r27
   2fbf8:	c0 92 69 12 	sts	0x1269, r12	; 0x801269 <current_position+0x8>
   2fbfc:	d0 92 6a 12 	sts	0x126A, r13	; 0x80126a <current_position+0x9>
   2fc00:	e0 92 6b 12 	sts	0x126B, r14	; 0x80126b <current_position+0xa>
   2fc04:	f0 92 6c 12 	sts	0x126C, r15	; 0x80126c <current_position+0xb>
   2fc08:	81 e0       	ldi	r24, 0x01	; 1
   2fc0a:	80 93 77 02 	sts	0x0277, r24	; 0x800277 <_ZL14check_endstops.lto_priv.387>
		enable_endstops(true);
#ifdef TMC2130
		tmc2130_home_enter(Z_AXIS_MASK);
#endif //TMC2130

		plan_buffer_line_curposXYZE(homing_feedrate[Z_AXIS] / 40);
   2fc0e:	60 e0       	ldi	r22, 0x00	; 0
   2fc10:	70 e0       	ldi	r23, 0x00	; 0
   2fc12:	80 ea       	ldi	r24, 0xA0	; 160
   2fc14:	91 e4       	ldi	r25, 0x41	; 65
   2fc16:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>

		st_synchronize();
   2fc1a:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
   2fc1e:	00 93 77 02 	sts	0x0277, r16	; 0x800277 <_ZL14check_endstops.lto_priv.387>
#ifdef TMC2130
		tmc2130_home_exit();
#endif //TMC2130
		enable_endstops(endstops_enabled);

		if ((st_get_position_mm(Z_AXIS) <= (MESH_HOME_Z_SEARCH + HOME_Z_SEARCH_THRESHOLD)) &&
   2fc22:	82 e0       	ldi	r24, 0x02	; 2
   2fc24:	0f 94 e7 1a 	call	0x235ce	; 0x235ce <st_get_position_mm(unsigned char)>
   2fc28:	2d ec       	ldi	r18, 0xCD	; 205
   2fc2a:	3c ec       	ldi	r19, 0xCC	; 204
   2fc2c:	44 ea       	ldi	r20, 0xA4	; 164
   2fc2e:	50 e4       	ldi	r21, 0x40	; 64
   2fc30:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   2fc34:	18 16       	cp	r1, r24
   2fc36:	0c f4       	brge	.+2      	; 0x2fc3a <gcode_M45(bool, signed char) [clone .constprop.63]+0x1fe>
   2fc38:	eb c3       	rjmp	.+2006   	; 0x30410 <gcode_M45(bool, signed char) [clone .constprop.63]+0x9d4>
		    (st_get_position_mm(Z_AXIS) >= (MESH_HOME_Z_SEARCH - HOME_Z_SEARCH_THRESHOLD)))
   2fc3a:	82 e0       	ldi	r24, 0x02	; 2
   2fc3c:	0f 94 e7 1a 	call	0x235ce	; 0x235ce <st_get_position_mm(unsigned char)>
#ifdef TMC2130
		tmc2130_home_exit();
#endif //TMC2130
		enable_endstops(endstops_enabled);

		if ((st_get_position_mm(Z_AXIS) <= (MESH_HOME_Z_SEARCH + HOME_Z_SEARCH_THRESHOLD)) &&
   2fc40:	23 e3       	ldi	r18, 0x33	; 51
   2fc42:	33 e3       	ldi	r19, 0x33	; 51
   2fc44:	4b e9       	ldi	r20, 0x9B	; 155
   2fc46:	50 e4       	ldi	r21, 0x40	; 64
   2fc48:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   2fc4c:	87 fd       	sbrc	r24, 7
   2fc4e:	e0 c3       	rjmp	.+1984   	; 0x30410 <gcode_M45(bool, signed char) [clone .constprop.63]+0x9d4>
		    (st_get_position_mm(Z_AXIS) >= (MESH_HOME_Z_SEARCH - HOME_Z_SEARCH_THRESHOLD)))
		{
			if (onlyZ)
   2fc50:	11 11       	cpse	r17, r1
   2fc52:	e3 c3       	rjmp	.+1990   	; 0x3041a <gcode_M45(bool, signed char) [clone .constprop.63]+0x9de>
				}
			}
			else
			{
				// Reset the baby step value and the baby step applied flag.
				calibration_status_clear(CALIBRATION_STATUS_LIVE_ADJUST);
   2fc54:	80 e1       	ldi	r24, 0x10	; 16
   2fc56:	0e 94 f9 d6 	call	0x1adf2	; 0x1adf2 <calibration_status_clear(unsigned char)>
				eeprom_update_word_notify(reinterpret_cast<uint16_t *>(&(EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)),0);
   2fc5a:	81 ea       	ldi	r24, 0xA1	; 161
   2fc5c:	9d e0       	ldi	r25, 0x0D	; 13
   2fc5e:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   2fc62:	bb e0       	ldi	r27, 0x0B	; 11
   2fc64:	8b 9f       	mul	r24, r27
   2fc66:	c0 01       	movw	r24, r0
   2fc68:	11 24       	eor	r1, r1
        if (previous_value != value) {
            eeprom_word_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_word(dst, value);
   2fc6a:	70 e0       	ldi	r23, 0x00	; 0
   2fc6c:	60 e0       	ldi	r22, 0x00	; 0
   2fc6e:	80 5b       	subi	r24, 0xB0	; 176
   2fc70:	92 4f       	sbci	r25, 0xF2	; 242
   2fc72:	0f 94 22 a4 	call	0x34844	; 0x34844 <eeprom_update_word>
}

BedSkewOffsetDetectionResultType find_bed_offset_and_skew(int8_t verbosity_level, uint8_t &too_far_mask)
{
    // Don't let the manage_inactivity() function remove power from the motors.
    refresh_cmd_timeout();
   2fc76:	0e 94 41 65 	call	0xca82	; 0xca82 <refresh_cmd_timeout()>
    // 7x7=49 floats, good for 16 (x,y,z) vectors.
    float *pts = &mbl.z_values[0][0];
    float *vec_x = pts + 2 * 4;
    float *vec_y = vec_x + 2;
    float *cntr  = vec_y + 2;
    memset(pts, 0, sizeof(float) * 7 * 7);
   2fc7a:	ea e0       	ldi	r30, 0x0A	; 10
   2fc7c:	f3 e1       	ldi	r31, 0x13	; 19
   2fc7e:	84 ec       	ldi	r24, 0xC4	; 196
   2fc80:	df 01       	movw	r26, r30
   2fc82:	1d 92       	st	X+, r1
   2fc84:	8a 95       	dec	r24
   2fc86:	e9 f7       	brne	.-6      	; 0x2fc82 <gcode_M45(bool, signed char) [clone .constprop.63]+0x246>
	{
#else //NEW_XYZCAL
	while (iteration < 3) {
#endif //NEW_XYZCAL

		SERIAL_ECHOPGM("Iteration: ");
   2fc88:	85 e2       	ldi	r24, 0x25	; 37
   2fc8a:	9c e9       	ldi	r25, 0x9C	; 156
   2fc8c:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
		MYSERIAL.println(int(iteration + 1));
   2fc90:	81 e0       	ldi	r24, 0x01	; 1
   2fc92:	90 e0       	ldi	r25, 0x00	; 0
   2fc94:	0f 94 bf 65 	call	0x2cb7e	; 0x2cb7e <MarlinSerial::println(int, int) [clone .constprop.319]>
			MYSERIAL.print(cntr[1], 5);
			SERIAL_ECHOLNPGM("");
		}
		#endif // SUPPORT_VERBOSITY
#ifdef MESH_BED_CALIBRATION_SHOW_LCD
    lcd_display_message_fullscreen_P(_T(MSG_FIND_BED_OFFSET_AND_SKEW_LINE1));
   2fc98:	81 e3       	ldi	r24, 0x31	; 49
   2fc9a:	91 e6       	ldi	r25, 0x61	; 97
   2fc9c:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   2fca0:	0e 94 a9 e0 	call	0x1c152	; 0x1c152 <lcd_display_message_fullscreen_P(char const*)>
#endif /* MESH_BED_CALIBRATION_SHOW_LCD */

    // Collect the rear 2x3 points.
	current_position[Z_AXIS] = MESH_HOME_Z_SEARCH + FIND_BED_INDUCTION_SENSOR_POINT_Z_STEP * iteration * 0.3;
   2fca4:	c0 92 69 12 	sts	0x1269, r12	; 0x801269 <current_position+0x8>
   2fca8:	d0 92 6a 12 	sts	0x126A, r13	; 0x80126a <current_position+0x9>
   2fcac:	e0 92 6b 12 	sts	0x126B, r14	; 0x80126b <current_position+0xa>
   2fcb0:	f0 92 6c 12 	sts	0x126C, r15	; 0x80126c <current_position+0xb>
   2fcb4:	b2 e0       	ldi	r27, 0x02	; 2
   2fcb6:	e1 96       	adiw	r28, 0x31	; 49
   2fcb8:	bf af       	std	Y+63, r27	; 0x3f
   2fcba:	e1 97       	sbiw	r28, 0x31	; 49
   2fcbc:	20 e0       	ldi	r18, 0x00	; 0
   2fcbe:	3c e9       	ldi	r19, 0x9C	; 156
   2fcc0:	cd 56       	subi	r28, 0x6D	; 109
   2fcc2:	df 4f       	sbci	r29, 0xFF	; 255
   2fcc4:	39 83       	std	Y+1, r19	; 0x01
   2fcc6:	28 83       	st	Y, r18
   2fcc8:	c3 59       	subi	r28, 0x93	; 147
   2fcca:	d0 40       	sbci	r29, 0x00	; 0
   2fccc:	49 e0       	ldi	r20, 0x09	; 9
   2fcce:	53 e1       	ldi	r21, 0x13	; 19
   2fcd0:	cf 56       	subi	r28, 0x6F	; 111
   2fcd2:	df 4f       	sbci	r29, 0xFF	; 255
   2fcd4:	59 83       	std	Y+1, r21	; 0x01
   2fcd6:	48 83       	st	Y, r20
   2fcd8:	c1 59       	subi	r28, 0x91	; 145
   2fcda:	d0 40       	sbci	r29, 0x00	; 0
   2fcdc:	a0 96       	adiw	r28, 0x20	; 32
   2fcde:	5f af       	std	Y+63, r21	; 0x3f
   2fce0:	4e af       	std	Y+62, r20	; 0x3e
   2fce2:	a0 97       	sbiw	r28, 0x20	; 32
   2fce4:	e0 96       	adiw	r28, 0x30	; 48
   2fce6:	3f af       	std	Y+63, r19	; 0x3f
   2fce8:	2e af       	std	Y+62, r18	; 0x3e
   2fcea:	e0 97       	sbiw	r28, 0x30	; 48

    /// Retry point scanning if a point with bad data appears.
    /// Bad data could be cause by "cold" sensor.
    /// This behavior vanishes after few point scans so retry will help.
    for (uint8_t retries = 0; retries <= 1; ++retries) {
        bool retry = false;
   2fcec:	a7 96       	adiw	r28, 0x27	; 39
   2fcee:	1f ae       	std	Y+63, r1	; 0x3f
   2fcf0:	a7 97       	sbiw	r28, 0x27	; 39
        for (int k = 0; k < 4; ++k) {
   2fcf2:	31 2c       	mov	r3, r1
   2fcf4:	21 2c       	mov	r2, r1
            // Don't let the manage_inactivity() function remove power from the motors.
            refresh_cmd_timeout();
   2fcf6:	0e 94 41 65 	call	0xca82	; 0xca82 <refresh_cmd_timeout()>
#ifdef MESH_BED_CALIBRATION_SHOW_LCD
		lcd_set_cursor(0, 3);
   2fcfa:	63 e0       	ldi	r22, 0x03	; 3
   2fcfc:	80 e0       	ldi	r24, 0x00	; 0
   2fcfe:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
		lcd_printf_P(PSTR("%d/4"),(k+1));
   2fd02:	bf ef       	ldi	r27, 0xFF	; 255
   2fd04:	2b 1a       	sub	r2, r27
   2fd06:	3b 0a       	sbc	r3, r27
   2fd08:	3f 92       	push	r3
   2fd0a:	2f 92       	push	r2
   2fd0c:	e0 e2       	ldi	r30, 0x20	; 32
   2fd0e:	fc e9       	ldi	r31, 0x9C	; 156
   2fd10:	ff 93       	push	r31
   2fd12:	ef 93       	push	r30
   2fd14:	0e 94 0b 6f 	call	0xde16	; 0xde16 <lcd_printf_P(char const*, ...)>
		}
#endif /* MESH_BED_CALIBRATION_SHOW_LCD */
		float *pt = pts + k * 2;
		// Go up to z_initial.

		go_to_current(homing_feedrate[Z_AXIS] / 60.f);
   2fd18:	65 e5       	ldi	r22, 0x55	; 85
   2fd1a:	75 e5       	ldi	r23, 0x55	; 85
   2fd1c:	85 e5       	ldi	r24, 0x55	; 85
   2fd1e:	91 e4       	ldi	r25, 0x41	; 65
   2fd20:	0f 94 f6 50 	call	0x2a1ec	; 0x2a1ec <go_to_current(float) [clone .lto_priv.377]>
			delay_keep_alive(5000);
		}
		#endif // SUPPORT_VERBOSITY
		// Go to the measurement point position.
		//if (iteration == 0) {
			current_position[X_AXIS] = pgm_read_float(bed_ref_points_4 + k * 2);
   2fd24:	e0 96       	adiw	r28, 0x30	; 48
   2fd26:	ee ad       	ldd	r30, Y+62	; 0x3e
   2fd28:	ff ad       	ldd	r31, Y+63	; 0x3f
   2fd2a:	e0 97       	sbiw	r28, 0x30	; 48
   2fd2c:	85 91       	lpm	r24, Z+
   2fd2e:	95 91       	lpm	r25, Z+
   2fd30:	a5 91       	lpm	r26, Z+
   2fd32:	b4 91       	lpm	r27, Z
   2fd34:	80 93 61 12 	sts	0x1261, r24	; 0x801261 <current_position>
   2fd38:	90 93 62 12 	sts	0x1262, r25	; 0x801262 <current_position+0x1>
   2fd3c:	a0 93 63 12 	sts	0x1263, r26	; 0x801263 <current_position+0x2>
   2fd40:	b0 93 64 12 	sts	0x1264, r27	; 0x801264 <current_position+0x3>
			current_position[Y_AXIS] = pgm_read_float(bed_ref_points_4 + k * 2 + 1);
   2fd44:	e0 96       	adiw	r28, 0x30	; 48
   2fd46:	ee ad       	ldd	r30, Y+62	; 0x3e
   2fd48:	ff ad       	ldd	r31, Y+63	; 0x3f
   2fd4a:	e0 97       	sbiw	r28, 0x30	; 48
   2fd4c:	34 96       	adiw	r30, 0x04	; 4
   2fd4e:	85 91       	lpm	r24, Z+
   2fd50:	95 91       	lpm	r25, Z+
   2fd52:	a5 91       	lpm	r26, Z+
   2fd54:	b4 91       	lpm	r27, Z
   2fd56:	80 93 65 12 	sts	0x1265, r24	; 0x801265 <current_position+0x4>
   2fd5a:	90 93 66 12 	sts	0x1266, r25	; 0x801266 <current_position+0x5>
   2fd5e:	a0 93 67 12 	sts	0x1267, r26	; 0x801267 <current_position+0x6>
   2fd62:	b0 93 68 12 	sts	0x1268, r27	; 0x801268 <current_position+0x7>
			MYSERIAL.print(current_position[Z_AXIS], 5);
			SERIAL_ECHOLNPGM("");
		}
		#endif // SUPPORT_VERBOSITY

		go_to_current(homing_feedrate[X_AXIS] / 60.f);
   2fd66:	60 e0       	ldi	r22, 0x00	; 0
   2fd68:	70 e0       	ldi	r23, 0x00	; 0
   2fd6a:	88 e4       	ldi	r24, 0x48	; 72
   2fd6c:	92 e4       	ldi	r25, 0x42	; 66
   2fd6e:	0f 94 f6 50 	call	0x2a1ec	; 0x2a1ec <go_to_current(float) [clone .lto_priv.377]>
	return pos * 0.01f;
}

void xyzcal_measure_enter(void)
{
	DBG(_n("xyzcal_measure_enter\n"));
   2fd72:	45 e8       	ldi	r20, 0x85	; 133
   2fd74:	5a e9       	ldi	r21, 0x9A	; 154
   2fd76:	5f 93       	push	r21
   2fd78:	4f 93       	push	r20
   2fd7a:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
	lcd_puts_at_P(4,3,PSTR("Measure center  ")); ////MSG_MEASURE_CENTER c=16
   2fd7e:	44 e7       	ldi	r20, 0x74	; 116
   2fd80:	5a e9       	ldi	r21, 0x9A	; 154
   2fd82:	63 e0       	ldi	r22, 0x03	; 3
   2fd84:	84 e0       	ldi	r24, 0x04	; 4
   2fd86:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
	// disable heaters and stop motion before we initialize sm4
	disable_heater();
   2fd8a:	0f 94 05 11 	call	0x2220a	; 0x2220a <disable_heater()>
	st_synchronize();
   2fd8e:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>

	// disable incompatible interrupts
	DISABLE_STEPPER_DRIVER_INTERRUPT();
   2fd92:	80 91 6f 00 	lds	r24, 0x006F	; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f>
   2fd96:	8d 7f       	andi	r24, 0xFD	; 253
   2fd98:	80 93 6f 00 	sts	0x006F, r24	; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f>
				"out __SREG__,__tmp_reg__"   "\n\t"
				: [TEMPREG] "=d" (temp_reg)
				: [WDTREG]  "n"  (_SFR_MEM_ADDR(_WD_CONTROL_REG)),
				[WDCE_WDE]  "n"  ((uint8_t)(_BV(_WD_CHANGE_BIT) | _BV(WDE)))
				: "r0"
		);
   2fd9c:	0f b6       	in	r0, 0x3f	; 63
   2fd9e:	f8 94       	cli
   2fda0:	a8 95       	wdr
   2fda2:	80 91 60 00 	lds	r24, 0x0060	; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060>
   2fda6:	88 61       	ori	r24, 0x18	; 24
   2fda8:	80 93 60 00 	sts	0x0060, r24	; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060>
   2fdac:	10 92 60 00 	sts	0x0060, r1	; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060>
   2fdb0:	0f be       	out	0x3f, r0	; 63
#ifdef WATCHDOG
	wdt_disable();
#endif //WATCHDOG

	// setup internal callbacks
	sm4_stop_cb = 0;
   2fdb2:	10 92 25 06 	sts	0x0625, r1	; 0x800625 <sm4_stop_cb+0x1>
   2fdb6:	10 92 24 06 	sts	0x0624, r1	; 0x800624 <sm4_stop_cb>
	sm4_update_pos_cb = xyzcal_update_pos;
   2fdba:	8c e5       	ldi	r24, 0x5C	; 92
   2fdbc:	9d eb       	ldi	r25, 0xBD	; 189
   2fdbe:	90 93 23 06 	sts	0x0623, r25	; 0x800623 <sm4_update_pos_cb+0x1>
   2fdc2:	80 93 22 06 	sts	0x0622, r24	; 0x800622 <sm4_update_pos_cb>
	sm4_calc_delay_cb = xyzcal_calc_delay;
   2fdc6:	a7 e5       	ldi	r26, 0x57	; 87
   2fdc8:	bd eb       	ldi	r27, 0xBD	; 189
   2fdca:	b0 93 21 06 	sts	0x0621, r27	; 0x800621 <sm4_calc_delay_cb+0x1>
   2fdce:	a0 93 20 06 	sts	0x0620, r26	; 0x800620 <sm4_calc_delay_cb>
const uint16_t xyzcal_point_pattern_10[12] PROGMEM = {0x000, 0x0f0, 0x1f8, 0x3fc, 0x7fe, 0x7fe, 0x7fe, 0x7fe, 0x3fc, 0x1f8, 0x0f0, 0x000};
const uint16_t xyzcal_point_pattern_08[12] PROGMEM = {0x000, 0x000, 0x0f0, 0x1f8, 0x3fc, 0x3fc, 0x3fc, 0x3fc, 0x1f8, 0x0f0, 0x000, 0x000};

bool xyzcal_searchZ(void) {
	//@size=118
	DBG(_n("xyzcal_searchZ x=%ld y=%ld z=%ld\n"), count_position[X_AXIS], count_position[Y_AXIS], count_position[Z_AXIS]);
   2fdd2:	00 91 54 06 	lds	r16, 0x0654	; 0x800654 <count_position+0x8>
   2fdd6:	10 91 55 06 	lds	r17, 0x0655	; 0x800655 <count_position+0x9>
   2fdda:	20 91 56 06 	lds	r18, 0x0656	; 0x800656 <count_position+0xa>
   2fdde:	30 91 57 06 	lds	r19, 0x0657	; 0x800657 <count_position+0xb>
   2fde2:	40 91 50 06 	lds	r20, 0x0650	; 0x800650 <count_position+0x4>
   2fde6:	50 91 51 06 	lds	r21, 0x0651	; 0x800651 <count_position+0x5>
   2fdea:	60 91 52 06 	lds	r22, 0x0652	; 0x800652 <count_position+0x6>
   2fdee:	70 91 53 06 	lds	r23, 0x0653	; 0x800653 <count_position+0x7>
   2fdf2:	80 91 4c 06 	lds	r24, 0x064C	; 0x80064c <count_position>
   2fdf6:	90 91 4d 06 	lds	r25, 0x064D	; 0x80064d <count_position+0x1>
   2fdfa:	a0 91 4e 06 	lds	r26, 0x064E	; 0x80064e <count_position+0x2>
   2fdfe:	b0 91 4f 06 	lds	r27, 0x064F	; 0x80064f <count_position+0x3>
   2fe02:	3f 93       	push	r19
   2fe04:	2f 93       	push	r18
   2fe06:	1f 93       	push	r17
   2fe08:	0f 93       	push	r16
   2fe0a:	7f 93       	push	r23
   2fe0c:	6f 93       	push	r22
   2fe0e:	5f 93       	push	r21
   2fe10:	4f 93       	push	r20
   2fe12:	bf 93       	push	r27
   2fe14:	af 93       	push	r26
   2fe16:	9f 93       	push	r25
   2fe18:	8f 93       	push	r24
   2fe1a:	e4 e2       	ldi	r30, 0x24	; 36
   2fe1c:	fb e9       	ldi	r31, 0x9B	; 155
   2fe1e:	ff 93       	push	r31
   2fe20:	ef 93       	push	r30
   2fe22:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
	int16_t x0 = _X;
   2fe26:	40 90 4c 06 	lds	r4, 0x064C	; 0x80064c <count_position>
   2fe2a:	50 90 4d 06 	lds	r5, 0x064D	; 0x80064d <count_position+0x1>
   2fe2e:	60 90 4e 06 	lds	r6, 0x064E	; 0x80064e <count_position+0x2>
   2fe32:	70 90 4f 06 	lds	r7, 0x064F	; 0x80064f <count_position+0x3>
   2fe36:	b4 2c       	mov	r11, r4
   2fe38:	a5 2c       	mov	r10, r5
	int16_t y0 = _Y;
   2fe3a:	80 91 50 06 	lds	r24, 0x0650	; 0x800650 <count_position+0x4>
   2fe3e:	90 91 51 06 	lds	r25, 0x0651	; 0x800651 <count_position+0x5>
   2fe42:	a0 91 52 06 	lds	r26, 0x0652	; 0x800652 <count_position+0x6>
   2fe46:	b0 91 53 06 	lds	r27, 0x0653	; 0x800653 <count_position+0x7>
   2fe4a:	a6 96       	adiw	r28, 0x26	; 38
   2fe4c:	8c af       	std	Y+60, r24	; 0x3c
   2fe4e:	9d af       	std	Y+61, r25	; 0x3d
   2fe50:	ae af       	std	Y+62, r26	; 0x3e
   2fe52:	bf af       	std	Y+63, r27	; 0x3f
   2fe54:	a6 97       	sbiw	r28, 0x26	; 38
   2fe56:	a3 96       	adiw	r28, 0x23	; 35
   2fe58:	9f ac       	ldd	r9, Y+63	; 0x3f
   2fe5a:	a3 97       	sbiw	r28, 0x23	; 35
   2fe5c:	a4 96       	adiw	r28, 0x24	; 36
   2fe5e:	8f ac       	ldd	r8, Y+63	; 0x3f
   2fe60:	a4 97       	sbiw	r28, 0x24	; 36
	int16_t z = _Z;
   2fe62:	c0 90 54 06 	lds	r12, 0x0654	; 0x800654 <count_position+0x8>
   2fe66:	d0 90 55 06 	lds	r13, 0x0655	; 0x800655 <count_position+0x9>
   2fe6a:	e0 90 56 06 	lds	r14, 0x0656	; 0x800656 <count_position+0xa>
   2fe6e:	f0 90 57 06 	lds	r15, 0x0657	; 0x800657 <count_position+0xb>
   2fe72:	0f b6       	in	r0, 0x3f	; 63
   2fe74:	f8 94       	cli
   2fe76:	de bf       	out	0x3e, r29	; 62
   2fe78:	0f be       	out	0x3f, r0	; 63
   2fe7a:	cd bf       	out	0x3d, r28	; 61
//	int16_t min_z = -6000;
//	int16_t dz = 100;
	while (z > -2300) { //-6mm + 0.25mm
   2fe7c:	b5 e0       	ldi	r27, 0x05	; 5
   2fe7e:	cb 16       	cp	r12, r27
   2fe80:	b7 ef       	ldi	r27, 0xF7	; 247
   2fe82:	db 06       	cpc	r13, r27
   2fe84:	0c f4       	brge	.+2      	; 0x2fe88 <gcode_M45(bool, signed char) [clone .constprop.63]+0x44c>
   2fe86:	3a c3       	rjmp	.+1652   	; 0x304fc <gcode_M45(bool, signed char) [clone .constprop.63]+0xac0>
}

bool xyzcal_spiral8(int16_t cx, int16_t cy, int16_t z0, int16_t dz, int16_t radius, uint16_t delay_us, int8_t check_pinda, uint16_t* pad)
{
	bool ret = false;
	uint16_t ad = 0;
   2fe88:	1a 82       	std	Y+2, r1	; 0x02
   2fe8a:	19 82       	std	Y+1, r1	; 0x01
	if (pad) ad = *pad;
    //@size=274
	DBG(_n("xyzcal_spiral8 cx=%d cy=%d z0=%d dz=%d radius=%d ad=%d\n"), cx, cy, z0, dz, radius, ad);
   2fe8c:	1f 92       	push	r1
   2fe8e:	1f 92       	push	r1
   2fe90:	e3 e0       	ldi	r30, 0x03	; 3
   2fe92:	ef 93       	push	r30
   2fe94:	f4 e8       	ldi	r31, 0x84	; 132
   2fe96:	ff 93       	push	r31
   2fe98:	1f 92       	push	r1
   2fe9a:	24 e6       	ldi	r18, 0x64	; 100
   2fe9c:	2f 93       	push	r18
   2fe9e:	df 92       	push	r13
   2fea0:	cf 92       	push	r12
   2fea2:	8f 92       	push	r8
   2fea4:	9f 92       	push	r9
   2fea6:	af 92       	push	r10
   2fea8:	bf 92       	push	r11
   2feaa:	4b e9       	ldi	r20, 0x9B	; 155
   2feac:	5a e9       	ldi	r21, 0x9A	; 154
   2feae:	5f 93       	push	r21
   2feb0:	4f 93       	push	r20
   2feb2:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
	if (!ret && (ad < 720))
   2feb6:	0f b6       	in	r0, 0x3f	; 63
   2feb8:	f8 94       	cli
   2feba:	de bf       	out	0x3e, r29	; 62
   2febc:	0f be       	out	0x3f, r0	; 63
   2febe:	cd bf       	out	0x3d, r28	; 61
   2fec0:	89 81       	ldd	r24, Y+1	; 0x01
   2fec2:	9a 81       	ldd	r25, Y+2	; 0x02
   2fec4:	80 3d       	cpi	r24, 0xD0	; 208
   2fec6:	92 40       	sbci	r25, 0x02	; 2
   2fec8:	08 f4       	brcc	.+2      	; 0x2fecc <gcode_M45(bool, signed char) [clone .constprop.63]+0x490>
   2feca:	e3 c2       	rjmp	.+1478   	; 0x30492 <gcode_M45(bool, signed char) [clone .constprop.63]+0xa56>
		if ((ret = xyzcal_spiral2(cx, cy, z0 - 0*dz, dz, radius, 0, delay_us, check_pinda, &ad)) != 0)
			ad += 0;
	if (!ret && (ad < 1440))
   2fecc:	89 81       	ldd	r24, Y+1	; 0x01
   2fece:	9a 81       	ldd	r25, Y+2	; 0x02
   2fed0:	80 3a       	cpi	r24, 0xA0	; 160
   2fed2:	95 40       	sbci	r25, 0x05	; 5
   2fed4:	10 f0       	brcs	.+4      	; 0x2feda <gcode_M45(bool, signed char) [clone .constprop.63]+0x49e>
   2fed6:	0d 94 53 8e 	jmp	0x31ca6	; 0x31ca6 <gcode_M45(bool, signed char) [clone .constprop.63]+0x226a>
		if ((ret = xyzcal_spiral2(cx, cy, z0 - 1*dz, dz, -radius, 0, delay_us, check_pinda, &ad)) != 0)
   2feda:	9e 01       	movw	r18, r28
   2fedc:	2f 5f       	subi	r18, 0xFF	; 255
   2fede:	3f 4f       	sbci	r19, 0xFF	; 255
   2fee0:	79 01       	movw	r14, r18
   2fee2:	10 e0       	ldi	r17, 0x00	; 0
   2fee4:	00 e0       	ldi	r16, 0x00	; 0
   2fee6:	2c e7       	ldi	r18, 0x7C	; 124
   2fee8:	3c ef       	ldi	r19, 0xFC	; 252
   2feea:	a6 01       	movw	r20, r12
   2feec:	44 56       	subi	r20, 0x64	; 100
   2feee:	51 09       	sbc	r21, r1
   2fef0:	69 2d       	mov	r22, r9
   2fef2:	78 2d       	mov	r23, r8
   2fef4:	8b 2d       	mov	r24, r11
   2fef6:	9a 2d       	mov	r25, r10
   2fef8:	0f 94 75 5f 	call	0x2beea	; 0x2beea <xyzcal_spiral2(int, int, int, int, int, int, unsigned int, signed char, unsigned int*) [clone .constprop.66]>
   2fefc:	88 23       	and	r24, r24
   2fefe:	11 f4       	brne	.+4      	; 0x2ff04 <gcode_M45(bool, signed char) [clone .constprop.63]+0x4c8>
   2ff00:	0d 94 53 8e 	jmp	0x31ca6	; 0x31ca6 <gcode_M45(bool, signed char) [clone .constprop.63]+0x226a>
			ad += 720;
   2ff04:	89 81       	ldd	r24, Y+1	; 0x01
   2ff06:	9a 81       	ldd	r25, Y+2	; 0x02
   2ff08:	80 53       	subi	r24, 0x30	; 48
   2ff0a:	9d 4f       	sbci	r25, 0xFD	; 253
//	int16_t dz = 100;
	while (z > -2300) { //-6mm + 0.25mm
		uint16_t ad = 0;
		if (xyzcal_spiral8(x0, y0, z, 100, 900, 320, 1, &ad)) { //dz=100 radius=900 delay=400
			//@size=82
			DBG(_n(" ON-SIGNAL at x=%d y=%d z=%d ad=%d\n"), _X, _Y, _Z, ad);
   2ff0c:	c0 90 54 06 	lds	r12, 0x0654	; 0x800654 <count_position+0x8>
   2ff10:	d0 90 55 06 	lds	r13, 0x0655	; 0x800655 <count_position+0x9>
   2ff14:	e0 90 56 06 	lds	r14, 0x0656	; 0x800656 <count_position+0xa>
   2ff18:	f0 90 57 06 	lds	r15, 0x0657	; 0x800657 <count_position+0xb>
   2ff1c:	00 91 50 06 	lds	r16, 0x0650	; 0x800650 <count_position+0x4>
   2ff20:	10 91 51 06 	lds	r17, 0x0651	; 0x800651 <count_position+0x5>
   2ff24:	20 91 52 06 	lds	r18, 0x0652	; 0x800652 <count_position+0x6>
   2ff28:	30 91 53 06 	lds	r19, 0x0653	; 0x800653 <count_position+0x7>
   2ff2c:	40 91 4c 06 	lds	r20, 0x064C	; 0x80064c <count_position>
   2ff30:	50 91 4d 06 	lds	r21, 0x064D	; 0x80064d <count_position+0x1>
   2ff34:	60 91 4e 06 	lds	r22, 0x064E	; 0x80064e <count_position+0x2>
   2ff38:	70 91 4f 06 	lds	r23, 0x064F	; 0x80064f <count_position+0x3>
   2ff3c:	9f 93       	push	r25
   2ff3e:	8f 93       	push	r24
   2ff40:	df 92       	push	r13
   2ff42:	cf 92       	push	r12
   2ff44:	1f 93       	push	r17
   2ff46:	0f 93       	push	r16
   2ff48:	5f 93       	push	r21
   2ff4a:	4f 93       	push	r20
   2ff4c:	80 e0       	ldi	r24, 0x00	; 0
   2ff4e:	9b e9       	ldi	r25, 0x9B	; 155
   2ff50:	9f 93       	push	r25
   2ff52:	8f 93       	push	r24
   2ff54:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>

			/// return to starting XY position
			/// magic constant, lowers min_z after searchZ to obtain more dense data in scan
			const pos_i16_t lower_z = 72;
			xyzcal_lineXYZ_to(x0, y0, _Z - lower_z, 200, 0);
   2ff58:	40 91 54 06 	lds	r20, 0x0654	; 0x800654 <count_position+0x8>
   2ff5c:	50 91 55 06 	lds	r21, 0x0655	; 0x800655 <count_position+0x9>
   2ff60:	60 91 56 06 	lds	r22, 0x0656	; 0x800656 <count_position+0xa>
   2ff64:	70 91 57 06 	lds	r23, 0x0657	; 0x800657 <count_position+0xb>
   2ff68:	48 54       	subi	r20, 0x48	; 72
   2ff6a:	51 09       	sbc	r21, r1
   2ff6c:	00 e0       	ldi	r16, 0x00	; 0
   2ff6e:	28 ec       	ldi	r18, 0xC8	; 200
   2ff70:	30 e0       	ldi	r19, 0x00	; 0
   2ff72:	a3 96       	adiw	r28, 0x23	; 35
   2ff74:	6f ad       	ldd	r22, Y+63	; 0x3f
   2ff76:	a3 97       	sbiw	r28, 0x23	; 35
   2ff78:	a4 96       	adiw	r28, 0x24	; 36
   2ff7a:	7f ad       	ldd	r23, Y+63	; 0x3f
   2ff7c:	a4 97       	sbiw	r28, 0x24	; 36
   2ff7e:	c2 01       	movw	r24, r4
   2ff80:	0e 94 cf d5 	call	0x1ab9e	; 0x1ab9e <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)>
/// searches for the center of the calibration pin
BedSkewOffsetDetectionResultType xyzcal_scan_and_process(){
    //@size=44
	// DBG(_n("sizeof(block_buffer)=%d\n"), sizeof(block_t)*BLOCK_BUFFER_SIZE);
	BedSkewOffsetDetectionResultType ret = BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND;
	int16_t x = _X;
   2ff84:	20 91 4c 06 	lds	r18, 0x064C	; 0x80064c <count_position>
   2ff88:	30 91 4d 06 	lds	r19, 0x064D	; 0x80064d <count_position+0x1>
   2ff8c:	40 91 4e 06 	lds	r20, 0x064E	; 0x80064e <count_position+0x2>
   2ff90:	50 91 4f 06 	lds	r21, 0x064F	; 0x80064f <count_position+0x3>
   2ff94:	6e 96       	adiw	r28, 0x1e	; 30
   2ff96:	2c af       	std	Y+60, r18	; 0x3c
   2ff98:	3d af       	std	Y+61, r19	; 0x3d
   2ff9a:	4e af       	std	Y+62, r20	; 0x3e
   2ff9c:	5f af       	std	Y+63, r21	; 0x3f
   2ff9e:	6e 97       	sbiw	r28, 0x1e	; 30
	int16_t y = _Y;
   2ffa0:	80 91 50 06 	lds	r24, 0x0650	; 0x800650 <count_position+0x4>
   2ffa4:	90 91 51 06 	lds	r25, 0x0651	; 0x800651 <count_position+0x5>
   2ffa8:	a0 91 52 06 	lds	r26, 0x0652	; 0x800652 <count_position+0x6>
   2ffac:	b0 91 53 06 	lds	r27, 0x0653	; 0x800653 <count_position+0x7>
   2ffb0:	ae 96       	adiw	r28, 0x2e	; 46
   2ffb2:	8c af       	std	Y+60, r24	; 0x3c
   2ffb4:	9d af       	std	Y+61, r25	; 0x3d
   2ffb6:	ae af       	std	Y+62, r26	; 0x3e
   2ffb8:	bf af       	std	Y+63, r27	; 0x3f
   2ffba:	ae 97       	sbiw	r28, 0x2e	; 46
	const int16_t z = _Z;
   2ffbc:	20 91 54 06 	lds	r18, 0x0654	; 0x800654 <count_position+0x8>
   2ffc0:	30 91 55 06 	lds	r19, 0x0655	; 0x800655 <count_position+0x9>
   2ffc4:	40 91 56 06 	lds	r20, 0x0656	; 0x800656 <count_position+0xa>
   2ffc8:	50 91 57 06 	lds	r21, 0x0657	; 0x800657 <count_position+0xb>
   2ffcc:	e9 96       	adiw	r28, 0x39	; 57
   2ffce:	2c af       	std	Y+60, r18	; 0x3c
   2ffd0:	3d af       	std	Y+61, r19	; 0x3d
   2ffd2:	4e af       	std	Y+62, r20	; 0x3e
   2ffd4:	5f af       	std	Y+63, r21	; 0x3f
   2ffd6:	e9 97       	sbiw	r28, 0x39	; 57
   2ffd8:	ae e5       	ldi	r26, 0x5E	; 94
   2ffda:	ba e0       	ldi	r27, 0x0A	; 10
   2ffdc:	0f b6       	in	r0, 0x3f	; 63
   2ffde:	f8 94       	cli
   2ffe0:	de bf       	out	0x3e, r29	; 62
   2ffe2:	0f be       	out	0x3f, r0	; 63
   2ffe4:	cd bf       	out	0x3d, r28	; 61
   2ffe6:	90 e0       	ldi	r25, 0x00	; 0
   2ffe8:	80 e0       	ldi	r24, 0x00	; 0
	uint8_t *matrix32 = (uint8_t *)block_buffer;
	uint16_t *pattern08 = (uint16_t *)(matrix32 + 32 * 32);
	uint16_t *pattern10 = (uint16_t *)(pattern08 + 12);

	for (uint8_t i = 0; i < 12; i++){
		pattern08[i] = pgm_read_word((uint16_t*)(xyzcal_point_pattern_08 + i));
   2ffea:	fc 01       	movw	r30, r24
   2ffec:	e5 56       	subi	r30, 0x65	; 101
   2ffee:	f4 46       	sbci	r31, 0x64	; 100
   2fff0:	25 91       	lpm	r18, Z+
   2fff2:	34 91       	lpm	r19, Z
   2fff4:	2d 93       	st	X+, r18
   2fff6:	3d 93       	st	X+, r19
		pattern10[i] = pgm_read_word((uint16_t*)(xyzcal_point_pattern_10 + i));
   2fff8:	fc 01       	movw	r30, r24
   2fffa:	ed 57       	subi	r30, 0x7D	; 125
   2fffc:	f4 46       	sbci	r31, 0x64	; 100
   2fffe:	25 91       	lpm	r18, Z+
   30000:	34 91       	lpm	r19, Z
   30002:	57 96       	adiw	r26, 0x17	; 23
   30004:	3c 93       	st	X, r19
   30006:	2e 93       	st	-X, r18
   30008:	56 97       	sbiw	r26, 0x16	; 22
   3000a:	02 96       	adiw	r24, 0x02	; 2

	uint8_t *matrix32 = (uint8_t *)block_buffer;
	uint16_t *pattern08 = (uint16_t *)(matrix32 + 32 * 32);
	uint16_t *pattern10 = (uint16_t *)(pattern08 + 12);

	for (uint8_t i = 0; i < 12; i++){
   3000c:	88 31       	cpi	r24, 0x18	; 24
   3000e:	91 05       	cpc	r25, r1
   30010:	61 f7       	brne	.-40     	; 0x2ffea <gcode_M45(bool, signed char) [clone .constprop.63]+0x5ae>
		pattern08[i] = pgm_read_word((uint16_t*)(xyzcal_point_pattern_08 + i));
		pattern10[i] = pgm_read_word((uint16_t*)(xyzcal_point_pattern_10 + i));
	}

	xyzcal_scan_pixels_32x32_Zhop(x, y, z, 2400, 200, matrix32);
   30012:	e7 96       	adiw	r28, 0x37	; 55
   30014:	4e ad       	ldd	r20, Y+62	; 0x3e
   30016:	5f ad       	ldd	r21, Y+63	; 0x3f
   30018:	e7 97       	sbiw	r28, 0x37	; 55
   3001a:	ac 96       	adiw	r28, 0x2c	; 44
   3001c:	6e ad       	ldd	r22, Y+62	; 0x3e
   3001e:	7f ad       	ldd	r23, Y+63	; 0x3f
   30020:	ac 97       	sbiw	r28, 0x2c	; 44
   30022:	6c 96       	adiw	r28, 0x1c	; 28
   30024:	8e ad       	ldd	r24, Y+62	; 0x3e
   30026:	9f ad       	ldd	r25, Y+63	; 0x3f
   30028:	6c 97       	sbiw	r28, 0x1c	; 28
   3002a:	0f 94 b1 60 	call	0x2c162	; 0x2c162 <xyzcal_scan_pixels_32x32_Zhop(int, int, int, int, unsigned int, unsigned char*) [clone .constprop.67]>
   3002e:	2e e5       	ldi	r18, 0x5E	; 94
   30030:	36 e0       	ldi	r19, 0x06	; 6
   30032:	a4 96       	adiw	r28, 0x24	; 36
   30034:	3f af       	std	Y+63, r19	; 0x3f
   30036:	2e af       	std	Y+62, r18	; 0x3e
   30038:	a4 97       	sbiw	r28, 0x24	; 36
   3003a:	79 01       	movw	r14, r18
   3003c:	f0 e2       	ldi	r31, 0x20	; 32
   3003e:	9f 2e       	mov	r9, r31
/// Prints matrix in hex to debug output (serial line)
void print_image(const uint8_t *matrix_32x32){
	for (uint8_t y = 0; y < 32; ++y){
		const uint16_t idx_y = y * 32;
		for (uint8_t x = 0; x < 32; ++x){
			DBG(_n("%02x"), matrix_32x32[idx_y + x]);
   30040:	a6 e4       	ldi	r26, 0x46	; 70
   30042:	ca 2e       	mov	r12, r26
   30044:	ab e9       	ldi	r26, 0x9B	; 155
   30046:	da 2e       	mov	r13, r26
		}
		DBG(endl);
   30048:	0b e9       	ldi	r16, 0x9B	; 155
   3004a:	1c e9       	ldi	r17, 0x9C	; 156
	for (uint8_t i = 0; i < 12; i++){
		pattern08[i] = pgm_read_word((uint16_t*)(xyzcal_point_pattern_08 + i));
		pattern10[i] = pgm_read_word((uint16_t*)(xyzcal_point_pattern_10 + i));
	}

	xyzcal_scan_pixels_32x32_Zhop(x, y, z, 2400, 200, matrix32);
   3004c:	57 01       	movw	r10, r14
   3004e:	e0 e2       	ldi	r30, 0x20	; 32
   30050:	8e 2e       	mov	r8, r30
/// Prints matrix in hex to debug output (serial line)
void print_image(const uint8_t *matrix_32x32){
	for (uint8_t y = 0; y < 32; ++y){
		const uint16_t idx_y = y * 32;
		for (uint8_t x = 0; x < 32; ++x){
			DBG(_n("%02x"), matrix_32x32[idx_y + x]);
   30052:	d5 01       	movw	r26, r10
   30054:	8d 91       	ld	r24, X+
   30056:	5d 01       	movw	r10, r26
   30058:	1f 92       	push	r1
   3005a:	8f 93       	push	r24
   3005c:	df 92       	push	r13
   3005e:	cf 92       	push	r12
   30060:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   30064:	8a 94       	dec	r8

/// Prints matrix in hex to debug output (serial line)
void print_image(const uint8_t *matrix_32x32){
	for (uint8_t y = 0; y < 32; ++y){
		const uint16_t idx_y = y * 32;
		for (uint8_t x = 0; x < 32; ++x){
   30066:	0f 90       	pop	r0
   30068:	0f 90       	pop	r0
   3006a:	0f 90       	pop	r0
   3006c:	0f 90       	pop	r0
   3006e:	81 10       	cpse	r8, r1
   30070:	f0 cf       	rjmp	.-32     	; 0x30052 <gcode_M45(bool, signed char) [clone .constprop.63]+0x616>
			DBG(_n("%02x"), matrix_32x32[idx_y + x]);
		}
		DBG(endl);
   30072:	1f 93       	push	r17
   30074:	0f 93       	push	r16
   30076:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   3007a:	9a 94       	dec	r9
   3007c:	b0 e2       	ldi	r27, 0x20	; 32
   3007e:	eb 0e       	add	r14, r27
   30080:	f1 1c       	adc	r15, r1
	DBG(_n(" [%f, %f][%f] final circle\n"), x, y, r);
}

/// Prints matrix in hex to debug output (serial line)
void print_image(const uint8_t *matrix_32x32){
	for (uint8_t y = 0; y < 32; ++y){
   30082:	0f 90       	pop	r0
   30084:	0f 90       	pop	r0
   30086:	91 10       	cpse	r9, r1
   30088:	e1 cf       	rjmp	.-62     	; 0x3004c <gcode_M45(bool, signed char) [clone .constprop.63]+0x610>
		for (uint8_t x = 0; x < 32; ++x){
			DBG(_n("%02x"), matrix_32x32[idx_y + x]);
		}
		DBG(endl);
	}
	DBG(endl);
   3008a:	1f 93       	push	r17
   3008c:	0f 93       	push	r16
   3008e:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   30092:	6e e5       	ldi	r22, 0x5E	; 94
   30094:	7a e0       	ldi	r23, 0x0A	; 10
   30096:	0f 90       	pop	r0
   30098:	0f 90       	pop	r0
   3009a:	ee e5       	ldi	r30, 0x5E	; 94
   3009c:	f6 e0       	ldi	r31, 0x06	; 6
	/// magic constants that define normality
	const int16_t threshold_total = 900;
	const int threshold_extreme = 50;

	int16_t mins = 0;
	int16_t maxs = 0;
   3009e:	90 e0       	ldi	r25, 0x00	; 0
   300a0:	80 e0       	ldi	r24, 0x00	; 0
bool check_scan(uint8_t *matrix32){
	/// magic constants that define normality
	const int16_t threshold_total = 900;
	const int threshold_extreme = 50;

	int16_t mins = 0;
   300a2:	50 e0       	ldi	r21, 0x00	; 0
   300a4:	40 e0       	ldi	r20, 0x00	; 0
	int16_t maxs = 0;

	for (int16_t i = 0; i < 32*32;++i){
		if (matrix32[i] == 0) {
   300a6:	21 91       	ld	r18, Z+
   300a8:	21 11       	cpse	r18, r1
   300aa:	67 c4       	rjmp	.+2254   	; 0x3097a <gcode_M45(bool, signed char) [clone .constprop.63]+0xf3e>
			++mins;
   300ac:	4f 5f       	subi	r20, 0xFF	; 255
   300ae:	5f 4f       	sbci	r21, 0xFF	; 255
	const int threshold_extreme = 50;

	int16_t mins = 0;
	int16_t maxs = 0;

	for (int16_t i = 0; i < 32*32;++i){
   300b0:	6e 17       	cp	r22, r30
   300b2:	7f 07       	cpc	r23, r31
   300b4:	c1 f7       	brne	.-16     	; 0x300a6 <gcode_M45(bool, signed char) [clone .constprop.63]+0x66a>
			++maxs;
		}
	}
	const int16_t rest = 1024 - mins - maxs;

	if (mins + maxs > threshold_total
   300b6:	9a 01       	movw	r18, r20
   300b8:	28 0f       	add	r18, r24
   300ba:	39 1f       	adc	r19, r25
   300bc:	25 38       	cpi	r18, 0x85	; 133
   300be:	33 40       	sbci	r19, 0x03	; 3
   300c0:	a4 f0       	brlt	.+40     	; 0x300ea <gcode_M45(bool, signed char) [clone .constprop.63]+0x6ae>
		&& mins > threshold_extreme
   300c2:	43 33       	cpi	r20, 0x33	; 51
   300c4:	51 05       	cpc	r21, r1
   300c6:	8c f0       	brlt	.+34     	; 0x300ea <gcode_M45(bool, signed char) [clone .constprop.63]+0x6ae>
		&& maxs > threshold_extreme
   300c8:	83 33       	cpi	r24, 0x33	; 51
   300ca:	91 05       	cpc	r25, r1
   300cc:	74 f0       	brlt	.+28     	; 0x300ea <gcode_M45(bool, signed char) [clone .constprop.63]+0x6ae>
			++mins;
		} else if (matrix32[i] == 0xFF){
			++maxs;
		}
	}
	const int16_t rest = 1024 - mins - maxs;
   300ce:	20 e0       	ldi	r18, 0x00	; 0
   300d0:	34 e0       	ldi	r19, 0x04	; 4
   300d2:	24 1b       	sub	r18, r20
   300d4:	35 0b       	sbc	r19, r21
   300d6:	28 1b       	sub	r18, r24
   300d8:	39 0b       	sbc	r19, r25

	if (mins + maxs > threshold_total
		&& mins > threshold_extreme
		&& maxs > threshold_extreme
		&& mins > rest
   300da:	24 17       	cp	r18, r20
   300dc:	35 07       	cpc	r19, r21
   300de:	2c f4       	brge	.+10     	; 0x300ea <gcode_M45(bool, signed char) [clone .constprop.63]+0x6ae>
	}

	xyzcal_scan_pixels_32x32_Zhop(x, y, z, 2400, 200, matrix32);
	print_image(matrix32);
	if (!check_scan(matrix32))
		return BED_SKEW_OFFSET_DETECTION_POINT_SCAN_FAILED;
   300e0:	1d ef       	ldi	r17, 0xFD	; 253

	if (mins + maxs > threshold_total
		&& mins > threshold_extreme
		&& maxs > threshold_extreme
		&& mins > rest
		&& maxs > rest)
   300e2:	28 17       	cp	r18, r24
   300e4:	39 07       	cpc	r19, r25
   300e6:	0c f4       	brge	.+2      	; 0x300ea <gcode_M45(bool, signed char) [clone .constprop.63]+0x6ae>
   300e8:	39 c2       	rjmp	.+1138   	; 0x3055c <gcode_M45(bool, signed char) [clone .constprop.63]+0xb20>
}

/// Takes two patterns and searches them in matrix32
/// \returns best match
uint8_t find_patterns(uint8_t *matrix32, uint16_t *pattern08, uint16_t *pattern10, uint8_t &col, uint8_t &row){
	uint8_t c08 = 0;
   300ea:	66 96       	adiw	r28, 0x16	; 22
   300ec:	1f ae       	std	Y+63, r1	; 0x3f
   300ee:	66 97       	sbiw	r28, 0x16	; 22
	uint8_t r08 = 0;
   300f0:	62 96       	adiw	r28, 0x12	; 18
   300f2:	1f ae       	std	Y+63, r1	; 0x3f
   300f4:	62 97       	sbiw	r28, 0x12	; 18
	uint8_t match08 = 0;
	uint8_t c10 = 0;
   300f6:	22 96       	adiw	r28, 0x02	; 2
   300f8:	1f ae       	std	Y+63, r1	; 0x3f
   300fa:	22 97       	sbiw	r28, 0x02	; 2
	uint8_t r10 = 0;
   300fc:	19 82       	std	Y+1, r1	; 0x01
   300fe:	ae 01       	movw	r20, r28
   30100:	4f 5a       	subi	r20, 0xAF	; 175
   30102:	5f 4f       	sbci	r21, 0xFF	; 255
   30104:	be 01       	movw	r22, r28
   30106:	6b 5a       	subi	r22, 0xAB	; 171
   30108:	7f 4f       	sbci	r23, 0xFF	; 255
   3010a:	8e e5       	ldi	r24, 0x5E	; 94
   3010c:	9a e0       	ldi	r25, 0x0A	; 10
   3010e:	0f 94 9a 58 	call	0x2b134	; 0x2b134 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.77]>
   30112:	08 2f       	mov	r16, r24
   30114:	ae 01       	movw	r20, r28
   30116:	4f 5f       	subi	r20, 0xFF	; 255
   30118:	5f 4f       	sbci	r21, 0xFF	; 255
   3011a:	be 01       	movw	r22, r28
   3011c:	6f 5b       	subi	r22, 0xBF	; 191
   3011e:	7f 4f       	sbci	r23, 0xFF	; 255
   30120:	86 e7       	ldi	r24, 0x76	; 118
   30122:	9a e0       	ldi	r25, 0x0A	; 10
   30124:	0f 94 9a 58 	call	0x2b134	; 0x2b134 <xyzcal_find_pattern_12x12_in_32x32(unsigned char*, unsigned int*, unsigned char*, unsigned char*) [clone .part.3] [clone .constprop.77]>

	match08 = xyzcal_find_pattern_12x12_in_32x32(matrix32, pattern08, &c08, &r08);
	match10 = xyzcal_find_pattern_12x12_in_32x32(matrix32, pattern10, &c10, &r10);

	if (match08 > match10){
		col = c08;
   30128:	66 96       	adiw	r28, 0x16	; 22
   3012a:	6f ad       	ldd	r22, Y+63	; 0x3f
   3012c:	66 97       	sbiw	r28, 0x16	; 22
		row = r08;
   3012e:	62 96       	adiw	r28, 0x12	; 18
   30130:	1f ad       	ldd	r17, Y+63	; 0x3f
   30132:	62 97       	sbiw	r28, 0x12	; 18
	uint8_t match10 = 0;

	match08 = xyzcal_find_pattern_12x12_in_32x32(matrix32, pattern08, &c08, &r08);
	match10 = xyzcal_find_pattern_12x12_in_32x32(matrix32, pattern10, &c10, &r10);

	if (match08 > match10){
   30134:	80 17       	cp	r24, r16
   30136:	28 f0       	brcs	.+10     	; 0x30142 <gcode_M45(bool, signed char) [clone .constprop.63]+0x706>
		col = c08;
		row = r08;
		return match08;
	}

	col = c10;
   30138:	22 96       	adiw	r28, 0x02	; 2
   3013a:	6f ad       	ldd	r22, Y+63	; 0x3f
   3013c:	22 97       	sbiw	r28, 0x02	; 2
	row = r10;
   3013e:	19 81       	ldd	r17, Y+1	; 0x01
   30140:	08 2f       	mov	r16, r24
	/// SEARCH FOR BINARY CIRCLE
	uint8_t uc = 0;
	uint8_t ur = 0;

	/// max match = 132, 1/2 good = 66, 2/3 good = 88
	if (find_patterns(matrix32, pattern08, pattern10, uc, ur) >= 88){
   30142:	08 35       	cpi	r16, 0x58	; 88
   30144:	08 f4       	brcc	.+2      	; 0x30148 <gcode_M45(bool, signed char) [clone .constprop.63]+0x70c>
   30146:	1e c4       	rjmp	.+2108   	; 0x30984 <gcode_M45(bool, signed char) [clone .constprop.63]+0xf48>
		/// find precise circle
		/// move to the center of the pattern (+5.5)
		float xf = uc + 5.5f;
   30148:	70 e0       	ldi	r23, 0x00	; 0
   3014a:	90 e0       	ldi	r25, 0x00	; 0
   3014c:	80 e0       	ldi	r24, 0x00	; 0
   3014e:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   30152:	20 e0       	ldi	r18, 0x00	; 0
   30154:	30 e0       	ldi	r19, 0x00	; 0
   30156:	40 eb       	ldi	r20, 0xB0	; 176
   30158:	50 e4       	ldi	r21, 0x40	; 64
   3015a:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   3015e:	2b 01       	movw	r4, r22
   30160:	3c 01       	movw	r6, r24
   30162:	65 96       	adiw	r28, 0x15	; 21
   30164:	4c ae       	std	Y+60, r4	; 0x3c
   30166:	5d ae       	std	Y+61, r5	; 0x3d
   30168:	6e ae       	std	Y+62, r6	; 0x3e
   3016a:	7f ae       	std	Y+63, r7	; 0x3f
   3016c:	65 97       	sbiw	r28, 0x15	; 21
		float yf = ur + 5.5f;
   3016e:	61 2f       	mov	r22, r17
   30170:	70 e0       	ldi	r23, 0x00	; 0
   30172:	90 e0       	ldi	r25, 0x00	; 0
   30174:	80 e0       	ldi	r24, 0x00	; 0
   30176:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   3017a:	20 e0       	ldi	r18, 0x00	; 0
   3017c:	30 e0       	ldi	r19, 0x00	; 0
   3017e:	40 eb       	ldi	r20, 0xB0	; 176
   30180:	50 e4       	ldi	r21, 0x40	; 64
   30182:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   30186:	4b 01       	movw	r8, r22
   30188:	5c 01       	movw	r10, r24
   3018a:	25 96       	adiw	r28, 0x05	; 5
   3018c:	8c ae       	std	Y+60, r8	; 0x3c
   3018e:	9d ae       	std	Y+61, r9	; 0x3d
   30190:	ae ae       	std	Y+62, r10	; 0x3e
   30192:	bf ae       	std	Y+63, r11	; 0x3f
   30194:	25 97       	sbiw	r28, 0x05	; 5
		float radius = 4.5f; ///< default radius
   30196:	20 e0       	ldi	r18, 0x00	; 0
   30198:	30 e0       	ldi	r19, 0x00	; 0
   3019a:	40 e9       	ldi	r20, 0x90	; 144
   3019c:	50 e4       	ldi	r21, 0x40	; 64
   3019e:	29 83       	std	Y+1, r18	; 0x01
   301a0:	3a 83       	std	Y+2, r19	; 0x02
   301a2:	4b 83       	std	Y+3, r20	; 0x03
   301a4:	5c 83       	std	Y+4, r21	; 0x04
		constexpr const uint8_t iterations = 20;
		dynamic_circle(matrix32, xf, yf, radius, iterations);
   301a6:	ae 01       	movw	r20, r28
   301a8:	4f 5f       	subi	r20, 0xFF	; 255
   301aa:	5f 4f       	sbci	r21, 0xFF	; 255
   301ac:	be 01       	movw	r22, r28
   301ae:	6f 5b       	subi	r22, 0xBF	; 191
   301b0:	7f 4f       	sbci	r23, 0xFF	; 255
   301b2:	ce 01       	movw	r24, r28
   301b4:	8f 5a       	subi	r24, 0xAF	; 175
   301b6:	9f 4f       	sbci	r25, 0xFF	; 255
   301b8:	0f 94 f5 5b 	call	0x2b7ea	; 0x2b7ea <dynamic_circle(unsigned char*, float&, float&, float&, unsigned char) [clone .constprop.79]>
		if (fabs(xf - (uc + 5.5f)) > 3 || fabs(yf - (ur + 5.5f)) > 3 || fabs(radius - 5) > 3){
   301bc:	a3 01       	movw	r20, r6
   301be:	92 01       	movw	r18, r4
   301c0:	65 96       	adiw	r28, 0x15	; 21
   301c2:	6c ad       	ldd	r22, Y+60	; 0x3c
   301c4:	7d ad       	ldd	r23, Y+61	; 0x3d
   301c6:	8e ad       	ldd	r24, Y+62	; 0x3e
   301c8:	9f ad       	ldd	r25, Y+63	; 0x3f
   301ca:	65 97       	sbiw	r28, 0x15	; 21
   301cc:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   301d0:	6b 01       	movw	r12, r22
   301d2:	7c 01       	movw	r14, r24
   301d4:	9f 77       	andi	r25, 0x7F	; 127
   301d6:	20 e0       	ldi	r18, 0x00	; 0
   301d8:	30 e0       	ldi	r19, 0x00	; 0
   301da:	40 e4       	ldi	r20, 0x40	; 64
   301dc:	50 e4       	ldi	r21, 0x40	; 64
   301de:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   301e2:	18 16       	cp	r1, r24
   301e4:	34 f1       	brlt	.+76     	; 0x30232 <gcode_M45(bool, signed char) [clone .constprop.63]+0x7f6>
   301e6:	a5 01       	movw	r20, r10
   301e8:	94 01       	movw	r18, r8
   301ea:	25 96       	adiw	r28, 0x05	; 5
   301ec:	6c ad       	ldd	r22, Y+60	; 0x3c
   301ee:	7d ad       	ldd	r23, Y+61	; 0x3d
   301f0:	8e ad       	ldd	r24, Y+62	; 0x3e
   301f2:	9f ad       	ldd	r25, Y+63	; 0x3f
   301f4:	25 97       	sbiw	r28, 0x05	; 5
   301f6:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   301fa:	9f 77       	andi	r25, 0x7F	; 127
   301fc:	20 e0       	ldi	r18, 0x00	; 0
   301fe:	30 e0       	ldi	r19, 0x00	; 0
   30200:	40 e4       	ldi	r20, 0x40	; 64
   30202:	50 e4       	ldi	r21, 0x40	; 64
   30204:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   30208:	18 16       	cp	r1, r24
   3020a:	9c f0       	brlt	.+38     	; 0x30232 <gcode_M45(bool, signed char) [clone .constprop.63]+0x7f6>
   3020c:	20 e0       	ldi	r18, 0x00	; 0
   3020e:	30 e0       	ldi	r19, 0x00	; 0
   30210:	40 ea       	ldi	r20, 0xA0	; 160
   30212:	50 e4       	ldi	r21, 0x40	; 64
   30214:	69 81       	ldd	r22, Y+1	; 0x01
   30216:	7a 81       	ldd	r23, Y+2	; 0x02
   30218:	8b 81       	ldd	r24, Y+3	; 0x03
   3021a:	9c 81       	ldd	r25, Y+4	; 0x04
   3021c:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   30220:	9f 77       	andi	r25, 0x7F	; 127
   30222:	20 e0       	ldi	r18, 0x00	; 0
   30224:	30 e0       	ldi	r19, 0x00	; 0
   30226:	40 e4       	ldi	r20, 0x40	; 64
   30228:	50 e4       	ldi	r21, 0x40	; 64
   3022a:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   3022e:	18 16       	cp	r1, r24
   30230:	bc f5       	brge	.+110    	; 0x302a0 <gcode_M45(bool, signed char) [clone .constprop.63]+0x864>
			//@size=88
            DBG(_n(" [%f %f][%f] mm divergence\n"), xf - (uc + 5.5f), yf - (ur + 5.5f), radius - 5);
   30232:	20 e0       	ldi	r18, 0x00	; 0
   30234:	30 e0       	ldi	r19, 0x00	; 0
   30236:	40 ea       	ldi	r20, 0xA0	; 160
   30238:	50 e4       	ldi	r21, 0x40	; 64
   3023a:	69 81       	ldd	r22, Y+1	; 0x01
   3023c:	7a 81       	ldd	r23, Y+2	; 0x02
   3023e:	8b 81       	ldd	r24, Y+3	; 0x03
   30240:	9c 81       	ldd	r25, Y+4	; 0x04
   30242:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   30246:	9f 93       	push	r25
   30248:	8f 93       	push	r24
   3024a:	7f 93       	push	r23
   3024c:	6f 93       	push	r22
   3024e:	a5 01       	movw	r20, r10
   30250:	94 01       	movw	r18, r8
   30252:	25 96       	adiw	r28, 0x05	; 5
   30254:	6c ad       	ldd	r22, Y+60	; 0x3c
   30256:	7d ad       	ldd	r23, Y+61	; 0x3d
   30258:	8e ad       	ldd	r24, Y+62	; 0x3e
   3025a:	9f ad       	ldd	r25, Y+63	; 0x3f
   3025c:	25 97       	sbiw	r28, 0x05	; 5
   3025e:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   30262:	9f 93       	push	r25
   30264:	8f 93       	push	r24
   30266:	7f 93       	push	r23
   30268:	6f 93       	push	r22
   3026a:	ff 92       	push	r15
   3026c:	ef 92       	push	r14
   3026e:	df 92       	push	r13
   30270:	cf 92       	push	r12
   30272:	87 e6       	ldi	r24, 0x67	; 103
   30274:	9b e9       	ldi	r25, 0x9B	; 155
   30276:	9f 93       	push	r25
   30278:	8f 93       	push	r24
   3027a:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
			/// dynamic algorithm diverged, use original position instead
			xf = uc + 5.5f;
   3027e:	65 96       	adiw	r28, 0x15	; 21
   30280:	4c ae       	std	Y+60, r4	; 0x3c
   30282:	5d ae       	std	Y+61, r5	; 0x3d
   30284:	6e ae       	std	Y+62, r6	; 0x3e
   30286:	7f ae       	std	Y+63, r7	; 0x3f
   30288:	65 97       	sbiw	r28, 0x15	; 21
			yf = ur + 5.5f;
   3028a:	25 96       	adiw	r28, 0x05	; 5
   3028c:	8c ae       	std	Y+60, r8	; 0x3c
   3028e:	9d ae       	std	Y+61, r9	; 0x3d
   30290:	ae ae       	std	Y+62, r10	; 0x3e
   30292:	bf ae       	std	Y+63, r11	; 0x3f
   30294:	25 97       	sbiw	r28, 0x05	; 5
   30296:	0f b6       	in	r0, 0x3f	; 63
   30298:	f8 94       	cli
   3029a:	de bf       	out	0x3e, r29	; 62
   3029c:	0f be       	out	0x3f, r0	; 63
   3029e:	cd bf       	out	0x3d, r28	; 61
		}

		/// move to the center of area and convert to position
		xf = (float)x + (xf - 15.5f) * 64;
   302a0:	20 e0       	ldi	r18, 0x00	; 0
   302a2:	30 e0       	ldi	r19, 0x00	; 0
   302a4:	48 e7       	ldi	r20, 0x78	; 120
   302a6:	51 e4       	ldi	r21, 0x41	; 65
   302a8:	65 96       	adiw	r28, 0x15	; 21
   302aa:	6c ad       	ldd	r22, Y+60	; 0x3c
   302ac:	7d ad       	ldd	r23, Y+61	; 0x3d
   302ae:	8e ad       	ldd	r24, Y+62	; 0x3e
   302b0:	9f ad       	ldd	r25, Y+63	; 0x3f
   302b2:	65 97       	sbiw	r28, 0x15	; 21
   302b4:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   302b8:	20 e0       	ldi	r18, 0x00	; 0
   302ba:	30 e0       	ldi	r19, 0x00	; 0
   302bc:	40 e8       	ldi	r20, 0x80	; 128
   302be:	52 e4       	ldi	r21, 0x42	; 66
   302c0:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   302c4:	6b 01       	movw	r12, r22
   302c6:	7c 01       	movw	r14, r24
   302c8:	6c 96       	adiw	r28, 0x1c	; 28
   302ca:	ae ad       	ldd	r26, Y+62	; 0x3e
   302cc:	bf ad       	ldd	r27, Y+63	; 0x3f
   302ce:	6c 97       	sbiw	r28, 0x1c	; 28
   302d0:	bd 01       	movw	r22, r26
   302d2:	bb 0f       	add	r27, r27
   302d4:	88 0b       	sbc	r24, r24
   302d6:	99 0b       	sbc	r25, r25
   302d8:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   302dc:	9b 01       	movw	r18, r22
   302de:	ac 01       	movw	r20, r24
   302e0:	c7 01       	movw	r24, r14
   302e2:	b6 01       	movw	r22, r12
   302e4:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   302e8:	6b 01       	movw	r12, r22
   302ea:	7c 01       	movw	r14, r24
   302ec:	65 96       	adiw	r28, 0x15	; 21
   302ee:	cc ae       	std	Y+60, r12	; 0x3c
   302f0:	dd ae       	std	Y+61, r13	; 0x3d
   302f2:	ee ae       	std	Y+62, r14	; 0x3e
   302f4:	ff ae       	std	Y+63, r15	; 0x3f
   302f6:	65 97       	sbiw	r28, 0x15	; 21
		yf = (float)y + (yf - 15.5f) * 64;
   302f8:	20 e0       	ldi	r18, 0x00	; 0
   302fa:	30 e0       	ldi	r19, 0x00	; 0
   302fc:	48 e7       	ldi	r20, 0x78	; 120
   302fe:	51 e4       	ldi	r21, 0x41	; 65
   30300:	25 96       	adiw	r28, 0x05	; 5
   30302:	6c ad       	ldd	r22, Y+60	; 0x3c
   30304:	7d ad       	ldd	r23, Y+61	; 0x3d
   30306:	8e ad       	ldd	r24, Y+62	; 0x3e
   30308:	9f ad       	ldd	r25, Y+63	; 0x3f
   3030a:	25 97       	sbiw	r28, 0x05	; 5
   3030c:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   30310:	20 e0       	ldi	r18, 0x00	; 0
   30312:	30 e0       	ldi	r19, 0x00	; 0
   30314:	40 e8       	ldi	r20, 0x80	; 128
   30316:	52 e4       	ldi	r21, 0x42	; 66
   30318:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   3031c:	4b 01       	movw	r8, r22
   3031e:	5c 01       	movw	r10, r24
   30320:	ac 96       	adiw	r28, 0x2c	; 44
   30322:	ee ad       	ldd	r30, Y+62	; 0x3e
   30324:	ff ad       	ldd	r31, Y+63	; 0x3f
   30326:	ac 97       	sbiw	r28, 0x2c	; 44
   30328:	bf 01       	movw	r22, r30
   3032a:	ff 0f       	add	r31, r31
   3032c:	88 0b       	sbc	r24, r24
   3032e:	99 0b       	sbc	r25, r25
   30330:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   30334:	9b 01       	movw	r18, r22
   30336:	ac 01       	movw	r20, r24
   30338:	c5 01       	movw	r24, r10
   3033a:	b4 01       	movw	r22, r8
   3033c:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   30340:	25 96       	adiw	r28, 0x05	; 5
   30342:	6c af       	std	Y+60, r22	; 0x3c
   30344:	7d af       	std	Y+61, r23	; 0x3d
   30346:	8e af       	std	Y+62, r24	; 0x3e
   30348:	9f af       	std	Y+63, r25	; 0x3f
   3034a:	25 97       	sbiw	r28, 0x05	; 5
/// converts integer position to millimeters
pos_mm_t pos_2_mm(pos_i16_t pos){
	return pos * 0.01f;
}
pos_mm_t pos_2_mm(float pos){
	return pos * 0.01f;
   3034c:	2a e0       	ldi	r18, 0x0A	; 10
   3034e:	37 ed       	ldi	r19, 0xD7	; 215
   30350:	43 e2       	ldi	r20, 0x23	; 35
   30352:	5c e3       	ldi	r21, 0x3C	; 60
   30354:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>

		/// move to the center of area and convert to position
		xf = (float)x + (xf - 15.5f) * 64;
		yf = (float)y + (yf - 15.5f) * 64;
		//@size=114
        DBG(_n(" [%f %f] mm pattern center\n"), pos_2_mm(xf), pos_2_mm(yf));
   30358:	9f 93       	push	r25
   3035a:	8f 93       	push	r24
   3035c:	7f 93       	push	r23
   3035e:	6f 93       	push	r22
/// converts integer position to millimeters
pos_mm_t pos_2_mm(pos_i16_t pos){
	return pos * 0.01f;
}
pos_mm_t pos_2_mm(float pos){
	return pos * 0.01f;
   30360:	2a e0       	ldi	r18, 0x0A	; 10
   30362:	37 ed       	ldi	r19, 0xD7	; 215
   30364:	43 e2       	ldi	r20, 0x23	; 35
   30366:	5c e3       	ldi	r21, 0x3C	; 60
   30368:	c7 01       	movw	r24, r14
   3036a:	b6 01       	movw	r22, r12
   3036c:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>

		/// move to the center of area and convert to position
		xf = (float)x + (xf - 15.5f) * 64;
		yf = (float)y + (yf - 15.5f) * 64;
		//@size=114
        DBG(_n(" [%f %f] mm pattern center\n"), pos_2_mm(xf), pos_2_mm(yf));
   30370:	9f 93       	push	r25
   30372:	8f 93       	push	r24
   30374:	7f 93       	push	r23
   30376:	6f 93       	push	r22
   30378:	8b e4       	ldi	r24, 0x4B	; 75
   3037a:	9b e9       	ldi	r25, 0x9B	; 155
   3037c:	9f 93       	push	r25
   3037e:	8f 93       	push	r24
   30380:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
uint16_t round_to_u16(float f){
	return (uint16_t)(f + .5f);
}

int16_t round_to_i16(float f){
	return (int16_t)(f + .5f);
   30384:	20 e0       	ldi	r18, 0x00	; 0
   30386:	30 e0       	ldi	r19, 0x00	; 0
   30388:	40 e0       	ldi	r20, 0x00	; 0
   3038a:	5f e3       	ldi	r21, 0x3F	; 63
   3038c:	25 96       	adiw	r28, 0x05	; 5
   3038e:	6c ad       	ldd	r22, Y+60	; 0x3c
   30390:	7d ad       	ldd	r23, Y+61	; 0x3d
   30392:	8e ad       	ldd	r24, Y+62	; 0x3e
   30394:	9f ad       	ldd	r25, Y+63	; 0x3f
   30396:	25 97       	sbiw	r28, 0x05	; 5
   30398:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   3039c:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   303a0:	6b 01       	movw	r12, r22
   303a2:	20 e0       	ldi	r18, 0x00	; 0
   303a4:	30 e0       	ldi	r19, 0x00	; 0
   303a6:	40 e0       	ldi	r20, 0x00	; 0
   303a8:	5f e3       	ldi	r21, 0x3F	; 63
   303aa:	65 96       	adiw	r28, 0x15	; 21
   303ac:	6c ad       	ldd	r22, Y+60	; 0x3c
   303ae:	7d ad       	ldd	r23, Y+61	; 0x3d
   303b0:	8e ad       	ldd	r24, Y+62	; 0x3e
   303b2:	9f ad       	ldd	r25, Y+63	; 0x3f
   303b4:	65 97       	sbiw	r28, 0x15	; 21
   303b6:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   303ba:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
   303be:	cb 01       	movw	r24, r22
		yf = (float)y + (yf - 15.5f) * 64;
		//@size=114
        DBG(_n(" [%f %f] mm pattern center\n"), pos_2_mm(xf), pos_2_mm(yf));
		x = round_to_i16(xf);
		y = round_to_i16(yf);
		xyzcal_lineXYZ_to(x, y, z, 200, 0);
   303c0:	00 e0       	ldi	r16, 0x00	; 0
   303c2:	28 ec       	ldi	r18, 0xC8	; 200
   303c4:	30 e0       	ldi	r19, 0x00	; 0
   303c6:	e7 96       	adiw	r28, 0x37	; 55
   303c8:	4e ad       	ldd	r20, Y+62	; 0x3e
   303ca:	5f ad       	ldd	r21, Y+63	; 0x3f
   303cc:	e7 97       	sbiw	r28, 0x37	; 55
   303ce:	b6 01       	movw	r22, r12
   303d0:	0e 94 cf d5 	call	0x1ab9e	; 0x1ab9e <xyzcal_lineXYZ_to(int, int, int, unsigned int, signed char)>
   303d4:	0f b6       	in	r0, 0x3f	; 63
   303d6:	f8 94       	cli
   303d8:	de bf       	out	0x3e, r29	; 62
   303da:	0f be       	out	0x3f, r0	; 63
   303dc:	cd bf       	out	0x3d, r28	; 61
		ret = BED_SKEW_OFFSET_DETECTION_POINT_FOUND;
   303de:	10 e0       	ldi	r17, 0x00	; 0
   303e0:	8e e3       	ldi	r24, 0x3E	; 62
   303e2:	9d e0       	ldi	r25, 0x0D	; 13
	}

	/// wipe buffer
	for (uint16_t i = 0; i < sizeof(block_t)*BLOCK_BUFFER_SIZE; i++)
		matrix32[i] = 0;
   303e4:	a4 96       	adiw	r28, 0x24	; 36
   303e6:	ae ad       	ldd	r26, Y+62	; 0x3e
   303e8:	bf ad       	ldd	r27, Y+63	; 0x3f
   303ea:	a4 97       	sbiw	r28, 0x24	; 36
   303ec:	1d 92       	st	X+, r1
   303ee:	a4 96       	adiw	r28, 0x24	; 36
   303f0:	bf af       	std	Y+63, r27	; 0x3f
   303f2:	ae af       	std	Y+62, r26	; 0x3e
   303f4:	a4 97       	sbiw	r28, 0x24	; 36
		xyzcal_lineXYZ_to(x, y, z, 200, 0);
		ret = BED_SKEW_OFFSET_DETECTION_POINT_FOUND;
	}

	/// wipe buffer
	for (uint16_t i = 0; i < sizeof(block_t)*BLOCK_BUFFER_SIZE; i++)
   303f6:	8a 17       	cp	r24, r26
   303f8:	9b 07       	cpc	r25, r27
   303fa:	a1 f7       	brne	.-24     	; 0x303e4 <gcode_M45(bool, signed char) [clone .constprop.63]+0x9a8>
   303fc:	af c0       	rjmp	.+350    	; 0x3055c <gcode_M45(bool, signed char) [clone .constprop.63]+0xb20>
			prompt_steel_sheet_on_bed(true);
			lcd_display_message_fullscreen_P(_T(MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1));
			lcd_puts_at_P(0,3,_n("1/9"));
		}else{
			//lcd_show_fullscreen_message_and_wait_P(_T(MSG_PAPER));
			lcd_display_message_fullscreen_P(_T(MSG_FIND_BED_OFFSET_AND_SKEW_LINE1));
   303fe:	81 e3       	ldi	r24, 0x31	; 49
   30400:	91 e6       	ldi	r25, 0x61	; 97
   30402:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   30406:	0e 94 a9 e0 	call	0x1c152	; 0x1c152 <lcd_display_message_fullscreen_P(char const*)>
			lcd_puts_at_P(0,3,_n("1/4"));
   3040a:	4e ed       	ldi	r20, 0xDE	; 222
   3040c:	5b e6       	ldi	r21, 0x6B	; 107
   3040e:	c1 cb       	rjmp	.-2174   	; 0x2fb92 <gcode_M45(bool, signed char) [clone .constprop.63]+0x156>
				}
			}
		}
		else
		{
			lcd_show_fullscreen_message_and_wait_P(PSTR("Calibration failed! Check the axes and run again."));
   30410:	81 e3       	ldi	r24, 0x31	; 49
   30412:	9c e9       	ldi	r25, 0x9C	; 156
            // The right and maybe the center point out of reach.
            msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR);
        else
            // The left and maybe the center point out of reach. //@todo Why isn't it found in the firmware.map
            msg = _n("XYZ calibration failed. Left front calibration point not reachable.");////MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
        lcd_show_fullscreen_message_and_wait_P(msg);
   30414:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
   30418:	a4 cb       	rjmp	.-2232   	; 0x2fb62 <gcode_M45(bool, signed char) [clone .constprop.63]+0x126>
		if ((st_get_position_mm(Z_AXIS) <= (MESH_HOME_Z_SEARCH + HOME_Z_SEARCH_THRESHOLD)) &&
		    (st_get_position_mm(Z_AXIS) >= (MESH_HOME_Z_SEARCH - HOME_Z_SEARCH_THRESHOLD)))
		{
			if (onlyZ)
			{
				clean_up_after_endstop_move(l_feedmultiply);
   3041a:	c7 55       	subi	r28, 0x57	; 87
   3041c:	df 4f       	sbci	r29, 0xFF	; 255
   3041e:	88 81       	ld	r24, Y
   30420:	99 81       	ldd	r25, Y+1	; 0x01
   30422:	c9 5a       	subi	r28, 0xA9	; 169
   30424:	d0 40       	sbci	r29, 0x00	; 0
   30426:	0e 94 4c 65 	call	0xca98	; 0xca98 <clean_up_after_endstop_move(int) [clone .lto_priv.382]>
				// Z only calibration.
				// Load the machine correction matrix
				world2machine_initialize();
   3042a:	0e 94 c6 60 	call	0xc18c	; 0xc18c <world2machine_initialize()>
				// and correct the current_position to match the transformed coordinate system.
				world2machine_update_current();
   3042e:	0e 94 02 5f 	call	0xbe04	; 0xbe04 <world2machine_update_current()>
				//FIXME
				bool result = sample_mesh_and_store_reference();
   30432:	0e 94 4a 83 	call	0x10694	; 0x10694 <sample_mesh_and_store_reference()>
   30436:	e5 96       	adiw	r28, 0x35	; 53
   30438:	8f af       	std	Y+63, r24	; 0x3f
   3043a:	e5 97       	sbiw	r28, 0x35	; 53
				if (result)
   3043c:	88 23       	and	r24, r24
   3043e:	09 f4       	brne	.+2      	; 0x30442 <gcode_M45(bool, signed char) [clone .constprop.63]+0xa06>
   30440:	90 cb       	rjmp	.-2272   	; 0x2fb62 <gcode_M45(bool, signed char) [clone .constprop.63]+0x126>
				{
					calibration_status_set(CALIBRATION_STATUS_Z);
   30442:	84 e0       	ldi	r24, 0x04	; 4
   30444:	0e 94 4e d7 	call	0x1ae9c	; 0x1ae9c <calibration_status_set(unsigned char)>
	}
	else
	{
		// Timeouted.
	}
	lcd_update_enable(true);
   30448:	81 e0       	ldi	r24, 0x01	; 1
   3044a:	0e 94 38 70 	call	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>
#endif // TMC2130

    FORCE_BL_ON_END;

	return final_result;
}
   3044e:	e5 96       	adiw	r28, 0x35	; 53
   30450:	8f ad       	ldd	r24, Y+63	; 0x3f
   30452:	e5 97       	sbiw	r28, 0x35	; 53
   30454:	c2 53       	subi	r28, 0x32	; 50
   30456:	df 4f       	sbci	r29, 0xFF	; 255
   30458:	0f b6       	in	r0, 0x3f	; 63
   3045a:	f8 94       	cli
   3045c:	de bf       	out	0x3e, r29	; 62
   3045e:	0f be       	out	0x3f, r0	; 63
   30460:	cd bf       	out	0x3d, r28	; 61
   30462:	df 91       	pop	r29
   30464:	cf 91       	pop	r28
   30466:	1f 91       	pop	r17
   30468:	0f 91       	pop	r16
   3046a:	ff 90       	pop	r15
   3046c:	ef 90       	pop	r14
   3046e:	df 90       	pop	r13
   30470:	cf 90       	pop	r12
   30472:	bf 90       	pop	r11
   30474:	af 90       	pop	r10
   30476:	9f 90       	pop	r9
   30478:	8f 90       	pop	r8
   3047a:	7f 90       	pop	r7
   3047c:	6f 90       	pop	r6
   3047e:	5f 90       	pop	r5
   30480:	4f 90       	pop	r4
   30482:	3f 90       	pop	r3
   30484:	2f 90       	pop	r2
   30486:	08 95       	ret
	current_position[Z_AXIS] = MESH_HOME_Z_SEARCH + FIND_BED_INDUCTION_SENSOR_POINT_Z_STEP * iteration * 0.3;

    /// Retry point scanning if a point with bad data appears.
    /// Bad data could be cause by "cold" sensor.
    /// This behavior vanishes after few point scans so retry will help.
    for (uint8_t retries = 0; retries <= 1; ++retries) {
   30488:	e1 e0       	ldi	r30, 0x01	; 1
   3048a:	e1 96       	adiw	r28, 0x31	; 49
   3048c:	ef af       	std	Y+63, r30	; 0x3f
   3048e:	e1 97       	sbiw	r28, 0x31	; 49
   30490:	15 cc       	rjmp	.-2006   	; 0x2fcbc <gcode_M45(bool, signed char) [clone .constprop.63]+0x280>
	uint16_t ad = 0;
	if (pad) ad = *pad;
    //@size=274
	DBG(_n("xyzcal_spiral8 cx=%d cy=%d z0=%d dz=%d radius=%d ad=%d\n"), cx, cy, z0, dz, radius, ad);
	if (!ret && (ad < 720))
		if ((ret = xyzcal_spiral2(cx, cy, z0 - 0*dz, dz, radius, 0, delay_us, check_pinda, &ad)) != 0)
   30492:	fe 01       	movw	r30, r28
   30494:	31 96       	adiw	r30, 0x01	; 1
   30496:	7f 01       	movw	r14, r30
   30498:	10 e0       	ldi	r17, 0x00	; 0
   3049a:	00 e0       	ldi	r16, 0x00	; 0
   3049c:	24 e8       	ldi	r18, 0x84	; 132
   3049e:	33 e0       	ldi	r19, 0x03	; 3
   304a0:	a6 01       	movw	r20, r12
   304a2:	69 2d       	mov	r22, r9
   304a4:	78 2d       	mov	r23, r8
   304a6:	8b 2d       	mov	r24, r11
   304a8:	9a 2d       	mov	r25, r10
   304aa:	0f 94 75 5f 	call	0x2beea	; 0x2beea <xyzcal_spiral2(int, int, int, int, int, int, unsigned int, signed char, unsigned int*) [clone .constprop.66]>
			ad += 0;
	if (!ret && (ad < 1440))
   304ae:	88 23       	and	r24, r24
   304b0:	09 f4       	brne	.+2      	; 0x304b4 <gcode_M45(bool, signed char) [clone .constprop.63]+0xa78>
   304b2:	0c cd       	rjmp	.-1512   	; 0x2fecc <gcode_M45(bool, signed char) [clone .constprop.63]+0x490>
		if ((ret = xyzcal_spiral2(cx, cy, z0 - 2*dz, dz, radius, 180, delay_us, check_pinda, &ad)) != 0)
			ad += 1440;
	if (!ret && (ad < 2880))
		if ((ret = xyzcal_spiral2(cx, cy, z0 - 3*dz, dz, -radius, 180, delay_us, check_pinda, &ad)) != 0)
			ad += 2160;
	if (pad) *pad = ad;
   304b4:	89 81       	ldd	r24, Y+1	; 0x01
   304b6:	9a 81       	ldd	r25, Y+2	; 0x02
   304b8:	29 cd       	rjmp	.-1454   	; 0x2ff0c <gcode_M45(bool, signed char) [clone .constprop.63]+0x4d0>
		if ((ret = xyzcal_spiral2(cx, cy, z0 - 1*dz, dz, -radius, 0, delay_us, check_pinda, &ad)) != 0)
			ad += 720;
	if (!ret && (ad < 2160))
		if ((ret = xyzcal_spiral2(cx, cy, z0 - 2*dz, dz, radius, 180, delay_us, check_pinda, &ad)) != 0)
			ad += 1440;
	if (!ret && (ad < 2880))
   304ba:	89 81       	ldd	r24, Y+1	; 0x01
   304bc:	9a 81       	ldd	r25, Y+2	; 0x02
   304be:	80 34       	cpi	r24, 0x40	; 64
   304c0:	9b 40       	sbci	r25, 0x0B	; 11
   304c2:	b8 f4       	brcc	.+46     	; 0x304f2 <gcode_M45(bool, signed char) [clone .constprop.63]+0xab6>
		if ((ret = xyzcal_spiral2(cx, cy, z0 - 3*dz, dz, -radius, 180, delay_us, check_pinda, &ad)) != 0)
   304c4:	ce 01       	movw	r24, r28
   304c6:	01 96       	adiw	r24, 0x01	; 1
   304c8:	7c 01       	movw	r14, r24
   304ca:	04 eb       	ldi	r16, 0xB4	; 180
   304cc:	10 e0       	ldi	r17, 0x00	; 0
   304ce:	2c e7       	ldi	r18, 0x7C	; 124
   304d0:	3c ef       	ldi	r19, 0xFC	; 252
   304d2:	a6 01       	movw	r20, r12
   304d4:	4c 52       	subi	r20, 0x2C	; 44
   304d6:	51 40       	sbci	r21, 0x01	; 1
   304d8:	69 2d       	mov	r22, r9
   304da:	78 2d       	mov	r23, r8
   304dc:	8b 2d       	mov	r24, r11
   304de:	9a 2d       	mov	r25, r10
   304e0:	0f 94 75 5f 	call	0x2beea	; 0x2beea <xyzcal_spiral2(int, int, int, int, int, int, unsigned int, signed char, unsigned int*) [clone .constprop.66]>
   304e4:	88 23       	and	r24, r24
   304e6:	29 f0       	breq	.+10     	; 0x304f2 <gcode_M45(bool, signed char) [clone .constprop.63]+0xab6>
			ad += 2160;
   304e8:	89 81       	ldd	r24, Y+1	; 0x01
   304ea:	9a 81       	ldd	r25, Y+2	; 0x02
   304ec:	80 59       	subi	r24, 0x90	; 144
   304ee:	97 4f       	sbci	r25, 0xF7	; 247
   304f0:	0d cd       	rjmp	.-1510   	; 0x2ff0c <gcode_M45(bool, signed char) [clone .constprop.63]+0x4d0>
			/// magic constant, lowers min_z after searchZ to obtain more dense data in scan
			const pos_i16_t lower_z = 72;
			xyzcal_lineXYZ_to(x0, y0, _Z - lower_z, 200, 0);
			return true;
		}
		z -= 400;
   304f2:	90 e9       	ldi	r25, 0x90	; 144
   304f4:	c9 1a       	sub	r12, r25
   304f6:	91 e0       	ldi	r25, 0x01	; 1
   304f8:	d9 0a       	sbc	r13, r25
   304fa:	c0 cc       	rjmp	.-1664   	; 0x2fe7c <gcode_M45(bool, signed char) [clone .constprop.63]+0x440>
	}
	//@size=138
	DBG(_n("xyzcal_searchZ no signal\n x=%ld y=%ld z=%ld\n"), count_position[X_AXIS], count_position[Y_AXIS], count_position[Z_AXIS]);
   304fc:	00 91 54 06 	lds	r16, 0x0654	; 0x800654 <count_position+0x8>
   30500:	10 91 55 06 	lds	r17, 0x0655	; 0x800655 <count_position+0x9>
   30504:	20 91 56 06 	lds	r18, 0x0656	; 0x800656 <count_position+0xa>
   30508:	30 91 57 06 	lds	r19, 0x0657	; 0x800657 <count_position+0xb>
   3050c:	40 91 50 06 	lds	r20, 0x0650	; 0x800650 <count_position+0x4>
   30510:	50 91 51 06 	lds	r21, 0x0651	; 0x800651 <count_position+0x5>
   30514:	60 91 52 06 	lds	r22, 0x0652	; 0x800652 <count_position+0x6>
   30518:	70 91 53 06 	lds	r23, 0x0653	; 0x800653 <count_position+0x7>
   3051c:	80 91 4c 06 	lds	r24, 0x064C	; 0x80064c <count_position>
   30520:	90 91 4d 06 	lds	r25, 0x064D	; 0x80064d <count_position+0x1>
   30524:	a0 91 4e 06 	lds	r26, 0x064E	; 0x80064e <count_position+0x2>
   30528:	b0 91 4f 06 	lds	r27, 0x064F	; 0x80064f <count_position+0x3>
   3052c:	3f 93       	push	r19
   3052e:	2f 93       	push	r18
   30530:	1f 93       	push	r17
   30532:	0f 93       	push	r16
   30534:	7f 93       	push	r23
   30536:	6f 93       	push	r22
   30538:	5f 93       	push	r21
   3053a:	4f 93       	push	r20
   3053c:	bf 93       	push	r27
   3053e:	af 93       	push	r26
   30540:	9f 93       	push	r25
   30542:	8f 93       	push	r24
   30544:	83 ed       	ldi	r24, 0xD3	; 211
   30546:	9a e9       	ldi	r25, 0x9A	; 154
   30548:	9f 93       	push	r25
   3054a:	8f 93       	push	r24
   3054c:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   30550:	0f b6       	in	r0, 0x3f	; 63
   30552:	f8 94       	cli
   30554:	de bf       	out	0x3e, r29	; 62
   30556:	0f be       	out	0x3f, r0	; 63
   30558:	cd bf       	out	0x3d, r28	; 61
	return ret;
}

BedSkewOffsetDetectionResultType xyzcal_find_bed_induction_sensor_point_xy(void) {
    // DBG(_n("xyzcal_find_bed_induction_sensor_point_xy x=%ld y=%ld z=%ld\n"), count_position[X_AXIS], count_position[Y_AXIS], count_position[Z_AXIS]);
	BedSkewOffsetDetectionResultType ret = BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND;
   3055a:	1f ef       	ldi	r17, 0xFF	; 255
	sm4_calc_delay_cb = xyzcal_calc_delay;
}

void xyzcal_measure_leave(void)
{
	DBG(_n("xyzcal_measure_leave\n"));
   3055c:	83 eb       	ldi	r24, 0xB3	; 179
   3055e:	9b e9       	ldi	r25, 0x9B	; 155
   30560:	9f 93       	push	r25
   30562:	8f 93       	push	r24
   30564:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
	lcd_set_cursor(4,3);
   30568:	63 e0       	ldi	r22, 0x03	; 3
   3056a:	84 e0       	ldi	r24, 0x04	; 4
   3056c:	0e 94 5a 6f 	call	0xdeb4	; 0xdeb4 <lcd_set_cursor(unsigned char, unsigned char)>
	lcd_space(16);
   30570:	80 e1       	ldi	r24, 0x10	; 16
   30572:	0e 94 28 6f 	call	0xde50	; 0xde50 <lcd_space(unsigned char)>

	// resync planner position from counters (changed by xyzcal_update_pos)
	planner_reset_position();
   30576:	0f 94 b4 4d 	call	0x29b68	; 0x29b68 <planner_reset_position()>
				: "n" (_SFR_MEM_ADDR(_WD_CONTROL_REG)),
				"r" ((uint8_t)(_BV(_WD_CHANGE_BIT) | _BV(WDE))),
				"r" ((uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00) |
						_BV(WDE) | (value & 0x07)) )
				: "r0"
		);
   3057a:	88 e1       	ldi	r24, 0x18	; 24
   3057c:	98 e2       	ldi	r25, 0x28	; 40
   3057e:	0f b6       	in	r0, 0x3f	; 63
   30580:	f8 94       	cli
   30582:	a8 95       	wdr
   30584:	80 93 60 00 	sts	0x0060, r24	; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060>
   30588:	0f be       	out	0x3f, r0	; 63
   3058a:	90 93 60 00 	sts	0x0060, r25	; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060>

	// re-enable interrupts
#ifdef WATCHDOG
	wdt_enable(WDTO_4S);
#ifdef EMERGENCY_HANDLERS
	WDTCSR |= (1 << WDIE);
   3058e:	80 91 60 00 	lds	r24, 0x0060	; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060>
   30592:	80 64       	ori	r24, 0x40	; 64
   30594:	80 93 60 00 	sts	0x0060, r24	; 0x800060 <__TEXT_REGION_LENGTH__+0x7c2060>
#endif //EMERGENCY_HANDLERS
#endif //WATCHDOG
	ENABLE_STEPPER_DRIVER_INTERRUPT();
   30598:	80 91 6f 00 	lds	r24, 0x006F	; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f>
   3059c:	82 60       	ori	r24, 0x02	; 2
   3059e:	80 93 6f 00 	sts	0x006F, r24	; 0x80006f <__TEXT_REGION_LENGTH__+0x7c206f>
			delay_keep_alive(3000);
		#endif // SUPPORT_VERBOSITY

        BedSkewOffsetDetectionResultType result;
        result = find_bed_induction_sensor_point_xy(verbosity_level);
        switch(result){
   305a2:	0f 90       	pop	r0
   305a4:	0f 90       	pop	r0
   305a6:	1d 3f       	cpi	r17, 0xFD	; 253
   305a8:	09 f4       	brne	.+2      	; 0x305ac <gcode_M45(bool, signed char) [clone .constprop.63]+0xb70>
   305aa:	ee c1       	rjmp	.+988    	; 0x30988 <gcode_M45(bool, signed char) [clone .constprop.63]+0xf4c>
   305ac:	1f 3f       	cpi	r17, 0xFF	; 255
   305ae:	11 f4       	brne	.+4      	; 0x305b4 <gcode_M45(bool, signed char) [clone .constprop.63]+0xb78>
   305b0:	0d 94 0f 8e 	jmp	0x31c1e	; 0x31c1e <gcode_M45(bool, signed char) [clone .constprop.63]+0x21e2>
				SERIAL_ECHOLNPGM("Measured:");
				MYSERIAL.println(current_position[X_AXIS]);
				MYSERIAL.println(current_position[Y_AXIS]);
			}
			#endif // SUPPORT_VERBOSITY
			pt[0] = (pt[0] * iteration) / (iteration + 1);
   305b4:	20 e0       	ldi	r18, 0x00	; 0
   305b6:	30 e0       	ldi	r19, 0x00	; 0
   305b8:	a9 01       	movw	r20, r18
   305ba:	a0 96       	adiw	r28, 0x20	; 32
   305bc:	ee ad       	ldd	r30, Y+62	; 0x3e
   305be:	ff ad       	ldd	r31, Y+63	; 0x3f
   305c0:	a0 97       	sbiw	r28, 0x20	; 32
   305c2:	61 81       	ldd	r22, Z+1	; 0x01
   305c4:	72 81       	ldd	r23, Z+2	; 0x02
   305c6:	83 81       	ldd	r24, Z+3	; 0x03
   305c8:	94 81       	ldd	r25, Z+4	; 0x04
   305ca:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
			pt[0] += (current_position[X_AXIS]/(iteration + 1)); //count average
   305ce:	20 91 61 12 	lds	r18, 0x1261	; 0x801261 <current_position>
   305d2:	30 91 62 12 	lds	r19, 0x1262	; 0x801262 <current_position+0x1>
   305d6:	40 91 63 12 	lds	r20, 0x1263	; 0x801263 <current_position+0x2>
   305da:	50 91 64 12 	lds	r21, 0x1264	; 0x801264 <current_position+0x3>
   305de:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   305e2:	a0 96       	adiw	r28, 0x20	; 32
   305e4:	ae ad       	ldd	r26, Y+62	; 0x3e
   305e6:	bf ad       	ldd	r27, Y+63	; 0x3f
   305e8:	a0 97       	sbiw	r28, 0x20	; 32
   305ea:	11 96       	adiw	r26, 0x01	; 1
   305ec:	6d 93       	st	X+, r22
   305ee:	7d 93       	st	X+, r23
   305f0:	8d 93       	st	X+, r24
   305f2:	9c 93       	st	X, r25
   305f4:	14 97       	sbiw	r26, 0x04	; 4
			pt[1] = (pt[1] * iteration) / (iteration + 1);
			pt[1] += (current_position[Y_AXIS] / (iteration + 1));
   305f6:	c0 90 65 12 	lds	r12, 0x1265	; 0x801265 <current_position+0x4>
   305fa:	d0 90 66 12 	lds	r13, 0x1266	; 0x801266 <current_position+0x5>
   305fe:	e0 90 67 12 	lds	r14, 0x1267	; 0x801267 <current_position+0x6>
   30602:	f0 90 68 12 	lds	r15, 0x1268	; 0x801268 <current_position+0x7>
				MYSERIAL.println(current_position[Y_AXIS]);
			}
			#endif // SUPPORT_VERBOSITY
			pt[0] = (pt[0] * iteration) / (iteration + 1);
			pt[0] += (current_position[X_AXIS]/(iteration + 1)); //count average
			pt[1] = (pt[1] * iteration) / (iteration + 1);
   30606:	20 e0       	ldi	r18, 0x00	; 0
   30608:	30 e0       	ldi	r19, 0x00	; 0
   3060a:	a9 01       	movw	r20, r18
   3060c:	15 96       	adiw	r26, 0x05	; 5
   3060e:	6d 91       	ld	r22, X+
   30610:	7d 91       	ld	r23, X+
   30612:	8d 91       	ld	r24, X+
   30614:	9c 91       	ld	r25, X
   30616:	18 97       	sbiw	r26, 0x08	; 8
   30618:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
			pt[1] += (current_position[Y_AXIS] / (iteration + 1));
   3061c:	a7 01       	movw	r20, r14
   3061e:	96 01       	movw	r18, r12
   30620:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   30624:	a0 96       	adiw	r28, 0x20	; 32
   30626:	ee ad       	ldd	r30, Y+62	; 0x3e
   30628:	ff ad       	ldd	r31, Y+63	; 0x3f
   3062a:	a0 97       	sbiw	r28, 0x20	; 32
   3062c:	65 83       	std	Z+5, r22	; 0x05
   3062e:	76 83       	std	Z+6, r23	; 0x06
   30630:	87 83       	std	Z+7, r24	; 0x07
   30632:	90 87       	std	Z+8, r25	; 0x08
				SERIAL_ECHOPGM("pt[1]:");
				MYSERIAL.println(pt[1]);
			}
			#endif // SUPPORT_VERBOSITY

			if (current_position[Y_AXIS] < Y_MIN_POS)
   30634:	20 e0       	ldi	r18, 0x00	; 0
   30636:	30 e0       	ldi	r19, 0x00	; 0
   30638:	40 e8       	ldi	r20, 0x80	; 128
   3063a:	50 ec       	ldi	r21, 0xC0	; 192
   3063c:	c7 01       	movw	r24, r14
   3063e:	b6 01       	movw	r22, r12
   30640:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   30644:	87 ff       	sbrs	r24, 7
   30646:	0c c0       	rjmp	.+24     	; 0x30660 <gcode_M45(bool, signed char) [clone .constprop.63]+0xc24>
				current_position[Y_AXIS] = Y_MIN_POS;
   30648:	80 e0       	ldi	r24, 0x00	; 0
   3064a:	90 e0       	ldi	r25, 0x00	; 0
   3064c:	a0 e8       	ldi	r26, 0x80	; 128
   3064e:	b0 ec       	ldi	r27, 0xC0	; 192
   30650:	80 93 65 12 	sts	0x1265, r24	; 0x801265 <current_position+0x4>
   30654:	90 93 66 12 	sts	0x1266, r25	; 0x801266 <current_position+0x5>
   30658:	a0 93 67 12 	sts	0x1267, r26	; 0x801267 <current_position+0x6>
   3065c:	b0 93 68 12 	sts	0x1268, r27	; 0x801268 <current_position+0x7>
			// Start searching for the other points at 3mm above the last point.
			current_position[Z_AXIS] += 3.f + FIND_BED_INDUCTION_SENSOR_POINT_Z_STEP * iteration * 0.3;
   30660:	20 e0       	ldi	r18, 0x00	; 0
   30662:	30 e0       	ldi	r19, 0x00	; 0
   30664:	40 e4       	ldi	r20, 0x40	; 64
   30666:	50 e4       	ldi	r21, 0x40	; 64
   30668:	60 91 69 12 	lds	r22, 0x1269	; 0x801269 <current_position+0x8>
   3066c:	70 91 6a 12 	lds	r23, 0x126A	; 0x80126a <current_position+0x9>
   30670:	80 91 6b 12 	lds	r24, 0x126B	; 0x80126b <current_position+0xa>
   30674:	90 91 6c 12 	lds	r25, 0x126C	; 0x80126c <current_position+0xb>
   30678:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   3067c:	60 93 69 12 	sts	0x1269, r22	; 0x801269 <current_position+0x8>
   30680:	70 93 6a 12 	sts	0x126A, r23	; 0x80126a <current_position+0x9>
   30684:	80 93 6b 12 	sts	0x126B, r24	; 0x80126b <current_position+0xa>
   30688:	90 93 6c 12 	sts	0x126C, r25	; 0x80126c <current_position+0xb>
   3068c:	e0 96       	adiw	r28, 0x30	; 48
   3068e:	2e ad       	ldd	r18, Y+62	; 0x3e
   30690:	3f ad       	ldd	r19, Y+63	; 0x3f
   30692:	e0 97       	sbiw	r28, 0x30	; 48
   30694:	28 5f       	subi	r18, 0xF8	; 248
   30696:	3f 4f       	sbci	r19, 0xFF	; 255
   30698:	e0 96       	adiw	r28, 0x30	; 48
   3069a:	3f af       	std	Y+63, r19	; 0x3f
   3069c:	2e af       	std	Y+62, r18	; 0x3e
   3069e:	e0 97       	sbiw	r28, 0x30	; 48
   306a0:	a0 96       	adiw	r28, 0x20	; 32
   306a2:	4e ad       	ldd	r20, Y+62	; 0x3e
   306a4:	5f ad       	ldd	r21, Y+63	; 0x3f
   306a6:	a0 97       	sbiw	r28, 0x20	; 32
   306a8:	48 5f       	subi	r20, 0xF8	; 248
   306aa:	5f 4f       	sbci	r21, 0xFF	; 255
   306ac:	a0 96       	adiw	r28, 0x20	; 32
   306ae:	5f af       	std	Y+63, r21	; 0x3f
   306b0:	4e af       	std	Y+62, r20	; 0x3e
   306b2:	a0 97       	sbiw	r28, 0x20	; 32
    /// Retry point scanning if a point with bad data appears.
    /// Bad data could be cause by "cold" sensor.
    /// This behavior vanishes after few point scans so retry will help.
    for (uint8_t retries = 0; retries <= 1; ++retries) {
        bool retry = false;
        for (int k = 0; k < 4; ++k) {
   306b4:	54 e0       	ldi	r21, 0x04	; 4
   306b6:	25 16       	cp	r2, r21
   306b8:	31 04       	cpc	r3, r1
   306ba:	09 f0       	breq	.+2      	; 0x306be <gcode_M45(bool, signed char) [clone .constprop.63]+0xc82>
   306bc:	1c cb       	rjmp	.-2504   	; 0x2fcf6 <gcode_M45(bool, signed char) [clone .constprop.63]+0x2ba>
				go_to_current(homing_feedrate[X_AXIS] / 60.f);
				delay_keep_alive(3000);
			}
			#endif // SUPPORT_VERBOSITY
        }
        if (!retry)
   306be:	a7 96       	adiw	r28, 0x27	; 39
   306c0:	6f ad       	ldd	r22, Y+63	; 0x3f
   306c2:	a7 97       	sbiw	r28, 0x27	; 39
   306c4:	66 23       	and	r22, r22
   306c6:	31 f0       	breq	.+12     	; 0x306d4 <gcode_M45(bool, signed char) [clone .constprop.63]+0xc98>
	current_position[Z_AXIS] = MESH_HOME_Z_SEARCH + FIND_BED_INDUCTION_SENSOR_POINT_Z_STEP * iteration * 0.3;

    /// Retry point scanning if a point with bad data appears.
    /// Bad data could be cause by "cold" sensor.
    /// This behavior vanishes after few point scans so retry will help.
    for (uint8_t retries = 0; retries <= 1; ++retries) {
   306c8:	e1 96       	adiw	r28, 0x31	; 49
   306ca:	8f ad       	ldd	r24, Y+63	; 0x3f
   306cc:	e1 97       	sbiw	r28, 0x31	; 49
   306ce:	81 30       	cpi	r24, 0x01	; 1
   306d0:	09 f0       	breq	.+2      	; 0x306d4 <gcode_M45(bool, signed char) [clone .constprop.63]+0xc98>
   306d2:	da ce       	rjmp	.-588    	; 0x30488 <gcode_M45(bool, signed char) [clone .constprop.63]+0xa4c>
			#endif // SUPPORT_VERBOSITY
        }
        if (!retry)
            break;
    }
        DBG(_n("All 4 calibration points found.\n"));
   306d4:	89 eb       	ldi	r24, 0xB9	; 185
   306d6:	9b e6       	ldi	r25, 0x6B	; 107
   306d8:	9f 93       	push	r25
   306da:	8f 93       	push	r24
   306dc:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
        delay_keep_alive(0); //manage_heater, reset watchdog, manage inactivity
   306e0:	90 e0       	ldi	r25, 0x00	; 0
   306e2:	80 e0       	ldi	r24, 0x00	; 0
   306e4:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
				go_to_current(homing_feedrate[X_AXIS] / 60);
				delay_keep_alive(3000);
			}
		}
		#endif // SUPPORT_VERBOSITY
		if (pts[1] < Y_MIN_POS_CALIBRATION_POINT_OUT_OF_REACH) {
   306e8:	0f 90       	pop	r0
   306ea:	0f 90       	pop	r0
   306ec:	20 e0       	ldi	r18, 0x00	; 0
   306ee:	30 e0       	ldi	r19, 0x00	; 0
   306f0:	40 e9       	ldi	r20, 0x90	; 144
   306f2:	50 ec       	ldi	r21, 0xC0	; 192
   306f4:	60 91 0e 13 	lds	r22, 0x130E	; 0x80130e <mbl+0x5>
   306f8:	70 91 0f 13 	lds	r23, 0x130F	; 0x80130f <mbl+0x6>
   306fc:	80 91 10 13 	lds	r24, 0x1310	; 0x801310 <mbl+0x7>
   30700:	90 91 11 13 	lds	r25, 0x1311	; 0x801311 <mbl+0x8>
   30704:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   30708:	87 ff       	sbrs	r24, 7
   3070a:	45 c1       	rjmp	.+650    	; 0x30996 <gcode_M45(bool, signed char) [clone .constprop.63]+0xf5a>
			too_far_mask |= 1 << 1; //front center point is out of reach
				SERIAL_ECHOLNPGM("");
   3070c:	8f ef       	ldi	r24, 0xFF	; 255
   3070e:	9b e9       	ldi	r25, 0x9B	; 155
   30710:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
				SERIAL_ECHOPGM("WARNING: Front point not reachable. Y coordinate:");
   30714:	8d ec       	ldi	r24, 0xCD	; 205
   30716:	9b e9       	ldi	r25, 0x9B	; 155
   30718:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
  else printNumber(n, base);
}

void MarlinSerial::print(double n, int digits)
{
  printFloat(n, digits);
   3071c:	60 91 0e 13 	lds	r22, 0x130E	; 0x80130e <mbl+0x5>
   30720:	70 91 0f 13 	lds	r23, 0x130F	; 0x80130f <mbl+0x6>
   30724:	80 91 10 13 	lds	r24, 0x1310	; 0x801310 <mbl+0x7>
   30728:	90 91 11 13 	lds	r25, 0x1311	; 0x801311 <mbl+0x8>
   3072c:	42 e0       	ldi	r20, 0x02	; 2
   3072e:	0e 94 46 7a 	call	0xf48c	; 0xf48c <MarlinSerial::printFloat(double, unsigned char)>
				MYSERIAL.print(pts[1]);
				SERIAL_ECHOPGM(" < ");
   30732:	89 ec       	ldi	r24, 0xC9	; 201
   30734:	9b e9       	ldi	r25, 0x9B	; 155
   30736:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
				MYSERIAL.println(Y_MIN_POS_CALIBRATION_POINT_OUT_OF_REACH);
   3073a:	60 e0       	ldi	r22, 0x00	; 0
   3073c:	70 e0       	ldi	r23, 0x00	; 0
   3073e:	80 e9       	ldi	r24, 0x90	; 144
   30740:	90 ec       	ldi	r25, 0xC0	; 192
   30742:	0f 94 a2 65 	call	0x2cb44	; 0x2cb44 <MarlinSerial::println(double, int) [clone .constprop.354]>
				delay_keep_alive(3000);
			}
		}
		#endif // SUPPORT_VERBOSITY
		if (pts[1] < Y_MIN_POS_CALIBRATION_POINT_OUT_OF_REACH) {
			too_far_mask |= 1 << 1; //front center point is out of reach
   30746:	92 e0       	ldi	r25, 0x02	; 2
   30748:	af 96       	adiw	r28, 0x2f	; 47
   3074a:	9f af       	std	Y+63, r25	; 0x3f
   3074c:	af 97       	sbiw	r28, 0x2f	; 47
	#endif // SUPPORT_VERBOSITY

    // Run some iterations of the Gauss-Newton method of non-linear least squares.
    // Initial set of parameters:
    // X,Y offset
    cntr[0] = 0.f;
   3074e:	10 92 3a 13 	sts	0x133A, r1	; 0x80133a <mbl+0x31>
   30752:	10 92 3b 13 	sts	0x133B, r1	; 0x80133b <mbl+0x32>
   30756:	10 92 3c 13 	sts	0x133C, r1	; 0x80133c <mbl+0x33>
   3075a:	10 92 3d 13 	sts	0x133D, r1	; 0x80133d <mbl+0x34>
    cntr[1] = 0.f;
   3075e:	10 92 3e 13 	sts	0x133E, r1	; 0x80133e <mbl+0x35>
   30762:	10 92 3f 13 	sts	0x133F, r1	; 0x80133f <mbl+0x36>
   30766:	10 92 40 13 	sts	0x1340, r1	; 0x801340 <mbl+0x37>
   3076a:	10 92 41 13 	sts	0x1341, r1	; 0x801341 <mbl+0x38>
   3076e:	a4 e6       	ldi	r26, 0x64	; 100
   30770:	e6 96       	adiw	r28, 0x36	; 54
   30772:	af af       	std	Y+63, r26	; 0x3f
   30774:	e6 97       	sbiw	r28, 0x36	; 54
    // Rotation of the machine X axis from the bed X axis.
    float a1 = 0;
    // Rotation of the machine Y axis from the bed Y axis.
    float a2 = 0;
   30776:	a2 96       	adiw	r28, 0x22	; 34
   30778:	1c ae       	std	Y+60, r1	; 0x3c
   3077a:	1d ae       	std	Y+61, r1	; 0x3d
   3077c:	1e ae       	std	Y+62, r1	; 0x3e
   3077e:	1f ae       	std	Y+63, r1	; 0x3f
   30780:	a2 97       	sbiw	r28, 0x22	; 34
    // Initial set of parameters:
    // X,Y offset
    cntr[0] = 0.f;
    cntr[1] = 0.f;
    // Rotation of the machine X axis from the bed X axis.
    float a1 = 0;
   30782:	a6 96       	adiw	r28, 0x26	; 38
   30784:	1c ae       	std	Y+60, r1	; 0x3c
   30786:	1d ae       	std	Y+61, r1	; 0x3d
   30788:	1e ae       	std	Y+62, r1	; 0x3e
   3078a:	1f ae       	std	Y+63, r1	; 0x3f
   3078c:	a6 97       	sbiw	r28, 0x26	; 38
        float c1 = cos(a1) * MACHINE_AXIS_SCALE_X;
        float s1 = sin(a1) * MACHINE_AXIS_SCALE_X;
        float c2 = cos(a2) * MACHINE_AXIS_SCALE_Y;
        float s2 = sin(a2) * MACHINE_AXIS_SCALE_Y;
        // Prepare the Normal equation for the Gauss-Newton method.
        float A[4][4] = { 0.f };
   3078e:	fe 01       	movw	r30, r28
   30790:	31 96       	adiw	r30, 0x01	; 1
   30792:	68 96       	adiw	r28, 0x18	; 24
   30794:	ff af       	std	Y+63, r31	; 0x3f
   30796:	ee af       	std	Y+62, r30	; 0x3e
   30798:	68 97       	sbiw	r28, 0x18	; 24
        float b[4] = { 0.f };
   3079a:	9e 01       	movw	r18, r28
   3079c:	2f 5b       	subi	r18, 0xBF	; 191
   3079e:	3f 4f       	sbci	r19, 0xFF	; 255
   307a0:	6a 96       	adiw	r28, 0x1a	; 26
   307a2:	3f af       	std	Y+63, r19	; 0x3f
   307a4:	2e af       	std	Y+62, r18	; 0x3e
   307a6:	6a 97       	sbiw	r28, 0x1a	; 26
    // Rotation of the machine X axis from the bed X axis.
    float a1 = 0;
    // Rotation of the machine Y axis from the bed Y axis.
    float a2 = 0;
    for (int8_t iter = 0; iter < 100; ++iter) {
        float c1 = cos(a1) * MACHINE_AXIS_SCALE_X;
   307a8:	a6 96       	adiw	r28, 0x26	; 38
   307aa:	6c ad       	ldd	r22, Y+60	; 0x3c
   307ac:	7d ad       	ldd	r23, Y+61	; 0x3d
   307ae:	8e ad       	ldd	r24, Y+62	; 0x3e
   307b0:	9f ad       	ldd	r25, Y+63	; 0x3f
   307b2:	a6 97       	sbiw	r28, 0x26	; 38
   307b4:	0f 94 02 a6 	call	0x34c04	; 0x34c04 <cos>
   307b8:	6e 96       	adiw	r28, 0x1e	; 30
   307ba:	6c af       	std	Y+60, r22	; 0x3c
   307bc:	7d af       	std	Y+61, r23	; 0x3d
   307be:	8e af       	std	Y+62, r24	; 0x3e
   307c0:	9f af       	std	Y+63, r25	; 0x3f
   307c2:	6e 97       	sbiw	r28, 0x1e	; 30
        float s1 = sin(a1) * MACHINE_AXIS_SCALE_X;
   307c4:	a6 96       	adiw	r28, 0x26	; 38
   307c6:	6c ad       	ldd	r22, Y+60	; 0x3c
   307c8:	7d ad       	ldd	r23, Y+61	; 0x3d
   307ca:	8e ad       	ldd	r24, Y+62	; 0x3e
   307cc:	9f ad       	ldd	r25, Y+63	; 0x3f
   307ce:	a6 97       	sbiw	r28, 0x26	; 38
   307d0:	0f 94 c8 a8 	call	0x35190	; 0x35190 <sin>
   307d4:	cb 57       	subi	r28, 0x7B	; 123
   307d6:	df 4f       	sbci	r29, 0xFF	; 255
   307d8:	68 83       	st	Y, r22
   307da:	79 83       	std	Y+1, r23	; 0x01
   307dc:	8a 83       	std	Y+2, r24	; 0x02
   307de:	9b 83       	std	Y+3, r25	; 0x03
   307e0:	c5 58       	subi	r28, 0x85	; 133
   307e2:	d0 40       	sbci	r29, 0x00	; 0
        float c2 = cos(a2) * MACHINE_AXIS_SCALE_Y;
   307e4:	a2 96       	adiw	r28, 0x22	; 34
   307e6:	6c ad       	ldd	r22, Y+60	; 0x3c
   307e8:	7d ad       	ldd	r23, Y+61	; 0x3d
   307ea:	8e ad       	ldd	r24, Y+62	; 0x3e
   307ec:	9f ad       	ldd	r25, Y+63	; 0x3f
   307ee:	a2 97       	sbiw	r28, 0x22	; 34
   307f0:	0f 94 02 a6 	call	0x34c04	; 0x34c04 <cos>
   307f4:	c7 57       	subi	r28, 0x77	; 119
   307f6:	df 4f       	sbci	r29, 0xFF	; 255
   307f8:	68 83       	st	Y, r22
   307fa:	79 83       	std	Y+1, r23	; 0x01
   307fc:	8a 83       	std	Y+2, r24	; 0x02
   307fe:	9b 83       	std	Y+3, r25	; 0x03
   30800:	c9 58       	subi	r28, 0x89	; 137
   30802:	d0 40       	sbci	r29, 0x00	; 0
        float s2 = sin(a2) * MACHINE_AXIS_SCALE_Y;
   30804:	a2 96       	adiw	r28, 0x22	; 34
   30806:	6c ad       	ldd	r22, Y+60	; 0x3c
   30808:	7d ad       	ldd	r23, Y+61	; 0x3d
   3080a:	8e ad       	ldd	r24, Y+62	; 0x3e
   3080c:	9f ad       	ldd	r25, Y+63	; 0x3f
   3080e:	a2 97       	sbiw	r28, 0x22	; 34
   30810:	0f 94 c8 a8 	call	0x35190	; 0x35190 <sin>
   30814:	cb 56       	subi	r28, 0x6B	; 107
   30816:	df 4f       	sbci	r29, 0xFF	; 255
   30818:	68 83       	st	Y, r22
   3081a:	79 83       	std	Y+1, r23	; 0x01
   3081c:	8a 83       	std	Y+2, r24	; 0x02
   3081e:	9b 83       	std	Y+3, r25	; 0x03
   30820:	c5 59       	subi	r28, 0x95	; 149
   30822:	d0 40       	sbci	r29, 0x00	; 0
        // Prepare the Normal equation for the Gauss-Newton method.
        float A[4][4] = { 0.f };
   30824:	68 96       	adiw	r28, 0x18	; 24
   30826:	ae ad       	ldd	r26, Y+62	; 0x3e
   30828:	bf ad       	ldd	r27, Y+63	; 0x3f
   3082a:	68 97       	sbiw	r28, 0x18	; 24
   3082c:	e0 e4       	ldi	r30, 0x40	; 64
   3082e:	1d 92       	st	X+, r1
   30830:	ea 95       	dec	r30
   30832:	e9 f7       	brne	.-6      	; 0x3082e <gcode_M45(bool, signed char) [clone .constprop.63]+0xdf2>
        float b[4] = { 0.f };
   30834:	80 e1       	ldi	r24, 0x10	; 16
   30836:	6a 96       	adiw	r28, 0x1a	; 26
   30838:	ae ad       	ldd	r26, Y+62	; 0x3e
   3083a:	bf ad       	ldd	r27, Y+63	; 0x3f
   3083c:	6a 97       	sbiw	r28, 0x1a	; 26
   3083e:	1d 92       	st	X+, r1
   30840:	8a 95       	dec	r24
   30842:	e9 f7       	brne	.-6      	; 0x3083e <gcode_M45(bool, signed char) [clone .constprop.63]+0xe02>
        float acc;
		delay_keep_alive(0); //manage heater, reset watchdog, manage inactivity
   30844:	90 e0       	ldi	r25, 0x00	; 0
   30846:	80 e0       	ldi	r24, 0x00	; 0
   30848:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
                    float j =
                         (r == 0) ? 1.f :
                        ((r == 1) ? 0.f :
                        ((r == 2) ? (-s1 * measured_pts[2 * i]) :
                                    (-c2 * measured_pts[2 * i + 1])));
                    float fx = c1 * measured_pts[2 * i] - s2 * measured_pts[2 * i + 1] + cntr[0] - pgm_read_float(true_pts + i * 2);
   3084c:	20 91 3a 13 	lds	r18, 0x133A	; 0x80133a <mbl+0x31>
   30850:	30 91 3b 13 	lds	r19, 0x133B	; 0x80133b <mbl+0x32>
   30854:	40 91 3c 13 	lds	r20, 0x133C	; 0x80133c <mbl+0x33>
   30858:	50 91 3d 13 	lds	r21, 0x133D	; 0x80133d <mbl+0x34>
   3085c:	c5 55       	subi	r28, 0x55	; 85
   3085e:	df 4f       	sbci	r29, 0xFF	; 255
   30860:	28 83       	st	Y, r18
   30862:	39 83       	std	Y+1, r19	; 0x01
   30864:	4a 83       	std	Y+2, r20	; 0x02
   30866:	5b 83       	std	Y+3, r21	; 0x03
   30868:	cb 5a       	subi	r28, 0xAB	; 171
   3086a:	d0 40       	sbci	r29, 0x00	; 0
                    float j =
                         (r == 0) ? 0.f :
                        ((r == 1) ? 1.f :
                        ((r == 2) ? ( c1 * measured_pts[2 * i]) :
                                    (-s2 * measured_pts[2 * i + 1])));
                    float fy = s1 * measured_pts[2 * i] + c2 * measured_pts[2 * i + 1] + cntr[1] - pgm_read_float(true_pts + i * 2 + 1);
   3086c:	80 91 3e 13 	lds	r24, 0x133E	; 0x80133e <mbl+0x35>
   30870:	90 91 3f 13 	lds	r25, 0x133F	; 0x80133f <mbl+0x36>
   30874:	a0 91 40 13 	lds	r26, 0x1340	; 0x801340 <mbl+0x37>
   30878:	b0 91 41 13 	lds	r27, 0x1341	; 0x801341 <mbl+0x38>
   3087c:	c1 55       	subi	r28, 0x51	; 81
   3087e:	df 4f       	sbci	r29, 0xFF	; 255
   30880:	88 83       	st	Y, r24
   30882:	99 83       	std	Y+1, r25	; 0x01
   30884:	aa 83       	std	Y+2, r26	; 0x02
   30886:	bb 83       	std	Y+3, r27	; 0x03
   30888:	cf 5a       	subi	r28, 0xAF	; 175
   3088a:	d0 40       	sbci	r29, 0x00	; 0
   3088c:	de 01       	movw	r26, r28
   3088e:	af 5b       	subi	r26, 0xBF	; 191
   30890:	bf 4f       	sbci	r27, 0xFF	; 255
   30892:	c7 56       	subi	r28, 0x67	; 103
   30894:	df 4f       	sbci	r29, 0xFF	; 255
   30896:	b9 83       	std	Y+1, r27	; 0x01
   30898:	a8 83       	st	Y, r26
   3089a:	c9 59       	subi	r28, 0x99	; 153
   3089c:	d0 40       	sbci	r29, 0x00	; 0
   3089e:	fe 01       	movw	r30, r28
   308a0:	31 96       	adiw	r30, 0x01	; 1
   308a2:	ac 96       	adiw	r28, 0x2c	; 44
   308a4:	ff af       	std	Y+63, r31	; 0x3f
   308a6:	ee af       	std	Y+62, r30	; 0x3e
   308a8:	ac 97       	sbiw	r28, 0x2c	; 44
        // Prepare the Normal equation for the Gauss-Newton method.
        float A[4][4] = { 0.f };
        float b[4] = { 0.f };
        float acc;
		delay_keep_alive(0); //manage heater, reset watchdog, manage inactivity
        for (uint8_t r = 0; r < 4; ++r) {
   308aa:	00 e0       	ldi	r16, 0x00	; 0
                            ((r == 2) ? ( c1 * measured_pts[2 * i]) :
                                        (-s2 * measured_pts[2 * i + 1]));
                        float b =
                             (c == 1) ? 1.f :
                            ((c == 2) ? ( c1 * measured_pts[2 * i]) :
                                        (-s2 * measured_pts[2 * i + 1]));
   308ac:	cb 56       	subi	r28, 0x6B	; 107
   308ae:	df 4f       	sbci	r29, 0xFF	; 255
   308b0:	28 81       	ld	r18, Y
   308b2:	39 81       	ldd	r19, Y+1	; 0x01
   308b4:	4a 81       	ldd	r20, Y+2	; 0x02
   308b6:	5b 81       	ldd	r21, Y+3	; 0x03
   308b8:	c5 59       	subi	r28, 0x95	; 149
   308ba:	d0 40       	sbci	r29, 0x00	; 0
   308bc:	50 58       	subi	r21, 0x80	; 128
   308be:	ed 96       	adiw	r28, 0x3d	; 61
   308c0:	2c af       	std	Y+60, r18	; 0x3c
   308c2:	3d af       	std	Y+61, r19	; 0x3d
   308c4:	4e af       	std	Y+62, r20	; 0x3e
   308c6:	5f af       	std	Y+63, r21	; 0x3f
   308c8:	ed 97       	sbiw	r28, 0x3d	; 61
                            ((r == 2) ? (-s1 * measured_pts[2 * i]) :
                                        (-c2 * measured_pts[2 * i + 1]));
                        float b =
                             (c == 0) ? 1.f :
                            ((c == 2) ? (-s1 * measured_pts[2 * i]) :
                                        (-c2 * measured_pts[2 * i + 1]));
   308ca:	c7 57       	subi	r28, 0x77	; 119
   308cc:	df 4f       	sbci	r29, 0xFF	; 255
   308ce:	88 81       	ld	r24, Y
   308d0:	99 81       	ldd	r25, Y+1	; 0x01
   308d2:	aa 81       	ldd	r26, Y+2	; 0x02
   308d4:	bb 81       	ldd	r27, Y+3	; 0x03
   308d6:	c9 58       	subi	r28, 0x89	; 137
   308d8:	d0 40       	sbci	r29, 0x00	; 0
   308da:	b0 58       	subi	r27, 0x80	; 128
   308dc:	c3 58       	subi	r28, 0x83	; 131
   308de:	df 4f       	sbci	r29, 0xFF	; 255
   308e0:	88 83       	st	Y, r24
   308e2:	99 83       	std	Y+1, r25	; 0x01
   308e4:	aa 83       	std	Y+2, r26	; 0x02
   308e6:	bb 83       	std	Y+3, r27	; 0x03
   308e8:	cd 57       	subi	r28, 0x7D	; 125
   308ea:	d0 40       	sbci	r29, 0x00	; 0
                             (r == 0) ? 1.f :
                            ((r == 2) ? (-s1 * measured_pts[2 * i]) :
                                        (-c2 * measured_pts[2 * i + 1]));
                        float b =
                             (c == 0) ? 1.f :
                            ((c == 2) ? (-s1 * measured_pts[2 * i]) :
   308ec:	cb 57       	subi	r28, 0x7B	; 123
   308ee:	df 4f       	sbci	r29, 0xFF	; 255
   308f0:	28 81       	ld	r18, Y
   308f2:	39 81       	ldd	r19, Y+1	; 0x01
   308f4:	4a 81       	ldd	r20, Y+2	; 0x02
   308f6:	5b 81       	ldd	r21, Y+3	; 0x03
   308f8:	c5 58       	subi	r28, 0x85	; 133
   308fa:	d0 40       	sbci	r29, 0x00	; 0
   308fc:	50 58       	subi	r21, 0x80	; 128
   308fe:	cf 57       	subi	r28, 0x7F	; 127
   30900:	df 4f       	sbci	r29, 0xFF	; 255
   30902:	28 83       	st	Y, r18
   30904:	39 83       	std	Y+1, r19	; 0x01
   30906:	4a 83       	std	Y+2, r20	; 0x02
   30908:	5b 83       	std	Y+3, r21	; 0x03
   3090a:	c1 58       	subi	r28, 0x81	; 129
   3090c:	d0 40       	sbci	r29, 0x00	; 0
        // Prepare the Normal equation for the Gauss-Newton method.
        float A[4][4] = { 0.f };
        float b[4] = { 0.f };
        float acc;
		delay_keep_alive(0); //manage heater, reset watchdog, manage inactivity
        for (uint8_t r = 0; r < 4; ++r) {
   3090e:	ac 96       	adiw	r28, 0x2c	; 44
   30910:	2e ac       	ldd	r2, Y+62	; 0x3e
   30912:	3f ac       	ldd	r3, Y+63	; 0x3f
   30914:	ac 97       	sbiw	r28, 0x2c	; 44
            for (uint8_t c = 0; c < 4; ++c) {
   30916:	10 e0       	ldi	r17, 0x00	; 0
   30918:	69 e0       	ldi	r22, 0x09	; 9
   3091a:	46 2e       	mov	r4, r22
   3091c:	63 e1       	ldi	r22, 0x13	; 19
   3091e:	56 2e       	mov	r5, r22
   30920:	74 e0       	ldi	r23, 0x04	; 4
   30922:	77 2e       	mov	r7, r23
                acc = 0;
   30924:	c1 2c       	mov	r12, r1
   30926:	d1 2c       	mov	r13, r1
   30928:	76 01       	movw	r14, r12
                // J^T times J
                for (uint8_t i = 0; i < npts; ++i) {
                    // First for the residuum in the x axis:
                    if (r != 1 && c != 1) {
   3092a:	01 30       	cpi	r16, 0x01	; 1
   3092c:	11 f4       	brne	.+4      	; 0x30932 <gcode_M45(bool, signed char) [clone .constprop.63]+0xef6>
   3092e:	0d 94 c3 8e 	jmp	0x31d86	; 0x31d86 <gcode_M45(bool, signed char) [clone .constprop.63]+0x234a>
   30932:	11 30       	cpi	r17, 0x01	; 1
   30934:	11 f4       	brne	.+4      	; 0x3093a <gcode_M45(bool, signed char) [clone .constprop.63]+0xefe>
   30936:	0d 94 75 8e 	jmp	0x31cea	; 0x31cea <gcode_M45(bool, signed char) [clone .constprop.63]+0x22ae>
                        float a =
                             (r == 0) ? 1.f :
   3093a:	00 23       	and	r16, r16
   3093c:	11 f4       	brne	.+4      	; 0x30942 <gcode_M45(bool, signed char) [clone .constprop.63]+0xf06>
   3093e:	0d 94 b5 8e 	jmp	0x31d6a	; 0x31d6a <gcode_M45(bool, signed char) [clone .constprop.63]+0x232e>
                            ((r == 2) ? (-s1 * measured_pts[2 * i]) :
   30942:	02 30       	cpi	r16, 0x02	; 2
   30944:	61 f5       	brne	.+88     	; 0x3099e <gcode_M45(bool, signed char) [clone .constprop.63]+0xf62>
   30946:	d2 01       	movw	r26, r4
   30948:	11 96       	adiw	r26, 0x01	; 1
   3094a:	2d 91       	ld	r18, X+
   3094c:	3d 91       	ld	r19, X+
   3094e:	4d 91       	ld	r20, X+
   30950:	5c 91       	ld	r21, X
   30952:	14 97       	sbiw	r26, 0x04	; 4
   30954:	cf 57       	subi	r28, 0x7F	; 127
   30956:	df 4f       	sbci	r29, 0xFF	; 255
   30958:	68 81       	ld	r22, Y
   3095a:	79 81       	ldd	r23, Y+1	; 0x01
   3095c:	8a 81       	ldd	r24, Y+2	; 0x02
   3095e:	9b 81       	ldd	r25, Y+3	; 0x03
   30960:	c1 58       	subi	r28, 0x81	; 129
   30962:	d0 40       	sbci	r29, 0x00	; 0
   30964:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   30968:	4b 01       	movw	r8, r22
   3096a:	5c 01       	movw	r10, r24
                                        (-c2 * measured_pts[2 * i + 1]));
                        float b =
                             (c == 0) ? 1.f :
   3096c:	11 11       	cpse	r17, r1
   3096e:	25 c0       	rjmp	.+74     	; 0x309ba <gcode_M45(bool, signed char) [clone .constprop.63]+0xf7e>
   30970:	60 e0       	ldi	r22, 0x00	; 0
   30972:	70 e0       	ldi	r23, 0x00	; 0
   30974:	80 e8       	ldi	r24, 0x80	; 128
   30976:	9f e3       	ldi	r25, 0x3F	; 63
   30978:	35 c0       	rjmp	.+106    	; 0x309e4 <gcode_M45(bool, signed char) [clone .constprop.63]+0xfa8>
	int16_t maxs = 0;

	for (int16_t i = 0; i < 32*32;++i){
		if (matrix32[i] == 0) {
			++mins;
		} else if (matrix32[i] == 0xFF){
   3097a:	2f 3f       	cpi	r18, 0xFF	; 255
   3097c:	09 f0       	breq	.+2      	; 0x30980 <gcode_M45(bool, signed char) [clone .constprop.63]+0xf44>
   3097e:	98 cb       	rjmp	.-2256   	; 0x300b0 <gcode_M45(bool, signed char) [clone .constprop.63]+0x674>
			++maxs;
   30980:	01 96       	adiw	r24, 0x01	; 1
   30982:	96 cb       	rjmp	.-2260   	; 0x300b0 <gcode_M45(bool, signed char) [clone .constprop.63]+0x674>
/// scans area around the current head location and
/// searches for the center of the calibration pin
BedSkewOffsetDetectionResultType xyzcal_scan_and_process(){
    //@size=44
	// DBG(_n("sizeof(block_buffer)=%d\n"), sizeof(block_t)*BLOCK_BUFFER_SIZE);
	BedSkewOffsetDetectionResultType ret = BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND;
   30984:	1f ef       	ldi	r17, 0xFF	; 255
   30986:	2c cd       	rjmp	.-1448   	; 0x303e0 <gcode_M45(bool, signed char) [clone .constprop.63]+0x9a4>
        result = find_bed_induction_sensor_point_xy(verbosity_level);
        switch(result){
            case BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND:
                return BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND;
            case BED_SKEW_OFFSET_DETECTION_POINT_SCAN_FAILED:
                retry = true;
   30988:	e5 96       	adiw	r28, 0x35	; 53
   3098a:	bf ad       	ldd	r27, Y+63	; 0x3f
   3098c:	e5 97       	sbiw	r28, 0x35	; 53
   3098e:	a7 96       	adiw	r28, 0x27	; 39
   30990:	bf af       	std	Y+63, r27	; 0x3f
   30992:	a7 97       	sbiw	r28, 0x27	; 39
   30994:	0f ce       	rjmp	.-994    	; 0x305b4 <gcode_M45(bool, signed char) [clone .constprop.63]+0xb78>
				// Reset the baby step value and the baby step applied flag.
				calibration_status_clear(CALIBRATION_STATUS_LIVE_ADJUST);
				eeprom_update_word_notify(reinterpret_cast<uint16_t *>(&(EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)),0);

				// Complete XYZ calibration.
				uint8_t point_too_far_mask = 0;
   30996:	af 96       	adiw	r28, 0x2f	; 47
   30998:	1f ae       	std	Y+63, r1	; 0x3f
   3099a:	af 97       	sbiw	r28, 0x2f	; 47
   3099c:	d8 ce       	rjmp	.-592    	; 0x3074e <gcode_M45(bool, signed char) [clone .constprop.63]+0xd12>
                for (uint8_t i = 0; i < npts; ++i) {
                    // First for the residuum in the x axis:
                    if (r != 1 && c != 1) {
                        float a =
                             (r == 0) ? 1.f :
                            ((r == 2) ? (-s1 * measured_pts[2 * i]) :
   3099e:	f2 01       	movw	r30, r4
   309a0:	25 81       	ldd	r18, Z+5	; 0x05
   309a2:	36 81       	ldd	r19, Z+6	; 0x06
   309a4:	47 81       	ldd	r20, Z+7	; 0x07
   309a6:	50 85       	ldd	r21, Z+8	; 0x08
   309a8:	c3 58       	subi	r28, 0x83	; 131
   309aa:	df 4f       	sbci	r29, 0xFF	; 255
   309ac:	68 81       	ld	r22, Y
   309ae:	79 81       	ldd	r23, Y+1	; 0x01
   309b0:	8a 81       	ldd	r24, Y+2	; 0x02
   309b2:	9b 81       	ldd	r25, Y+3	; 0x03
   309b4:	cd 57       	subi	r28, 0x7D	; 125
   309b6:	d0 40       	sbci	r29, 0x00	; 0
   309b8:	d5 cf       	rjmp	.-86     	; 0x30964 <gcode_M45(bool, signed char) [clone .constprop.63]+0xf28>
                                        (-c2 * measured_pts[2 * i + 1]));
                        float b =
                             (c == 0) ? 1.f :
                            ((c == 2) ? (-s1 * measured_pts[2 * i]) :
   309ba:	12 30       	cpi	r17, 0x02	; 2
   309bc:	11 f0       	breq	.+4      	; 0x309c2 <gcode_M45(bool, signed char) [clone .constprop.63]+0xf86>
   309be:	0d 94 b6 8d 	jmp	0x31b6c	; 0x31b6c <gcode_M45(bool, signed char) [clone .constprop.63]+0x2130>
   309c2:	d2 01       	movw	r26, r4
   309c4:	11 96       	adiw	r26, 0x01	; 1
   309c6:	2d 91       	ld	r18, X+
   309c8:	3d 91       	ld	r19, X+
   309ca:	4d 91       	ld	r20, X+
   309cc:	5c 91       	ld	r21, X
   309ce:	14 97       	sbiw	r26, 0x04	; 4
   309d0:	cf 57       	subi	r28, 0x7F	; 127
   309d2:	df 4f       	sbci	r29, 0xFF	; 255
   309d4:	68 81       	ld	r22, Y
   309d6:	79 81       	ldd	r23, Y+1	; 0x01
   309d8:	8a 81       	ldd	r24, Y+2	; 0x02
   309da:	9b 81       	ldd	r25, Y+3	; 0x03
   309dc:	c1 58       	subi	r28, 0x81	; 129
   309de:	d0 40       	sbci	r29, 0x00	; 0
   309e0:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
                                        (-c2 * measured_pts[2 * i + 1]));
                        float w = point_weight_x(i, measured_pts[2 * i + 1]);
                        acc += a * b * w;
   309e4:	9b 01       	movw	r18, r22
   309e6:	ac 01       	movw	r20, r24
   309e8:	c5 01       	movw	r24, r10
   309ea:	b4 01       	movw	r22, r8
   309ec:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   309f0:	9b 01       	movw	r18, r22
   309f2:	ac 01       	movw	r20, r24
   309f4:	c7 01       	movw	r24, r14
   309f6:	b6 01       	movw	r22, r12
   309f8:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   309fc:	6b 01       	movw	r12, r22
   309fe:	7c 01       	movw	r14, r24
                    }
                    // Second for the residuum in the y axis.
                    // The first row of the points have a low weight, because their position may not be known
                    // with a sufficient accuracy.
                    if (r != 0 && c != 0) {
   30a00:	01 11       	cpse	r16, r1
   30a02:	0d 94 cd 8e 	jmp	0x31d9a	; 0x31d9a <gcode_M45(bool, signed char) [clone .constprop.63]+0x235e>
   30a06:	7a 94       	dec	r7
   30a08:	f8 e0       	ldi	r31, 0x08	; 8
   30a0a:	4f 0e       	add	r4, r31
   30a0c:	51 1c       	adc	r5, r1
		delay_keep_alive(0); //manage heater, reset watchdog, manage inactivity
        for (uint8_t r = 0; r < 4; ++r) {
            for (uint8_t c = 0; c < 4; ++c) {
                acc = 0;
                // J^T times J
                for (uint8_t i = 0; i < npts; ++i) {
   30a0e:	71 10       	cpse	r7, r1
   30a10:	8c cf       	rjmp	.-232    	; 0x3092a <gcode_M45(bool, signed char) [clone .constprop.63]+0xeee>
                                        (-s2 * measured_pts[2 * i + 1]));
                        float w = point_weight_y(i, measured_pts[2 * i + 1]);
                        acc += a * b * w;
                    }
                }
                A[r][c] = acc;
   30a12:	d1 01       	movw	r26, r2
   30a14:	cd 92       	st	X+, r12
   30a16:	dd 92       	st	X+, r13
   30a18:	ed 92       	st	X+, r14
   30a1a:	fd 92       	st	X+, r15
   30a1c:	1d 01       	movw	r2, r26
        float A[4][4] = { 0.f };
        float b[4] = { 0.f };
        float acc;
		delay_keep_alive(0); //manage heater, reset watchdog, manage inactivity
        for (uint8_t r = 0; r < 4; ++r) {
            for (uint8_t c = 0; c < 4; ++c) {
   30a1e:	1f 5f       	subi	r17, 0xFF	; 255
   30a20:	14 30       	cpi	r17, 0x04	; 4
   30a22:	09 f0       	breq	.+2      	; 0x30a26 <gcode_M45(bool, signed char) [clone .constprop.63]+0xfea>
   30a24:	79 cf       	rjmp	.-270    	; 0x30918 <gcode_M45(bool, signed char) [clone .constprop.63]+0xedc>
   30a26:	30 e0       	ldi	r19, 0x00	; 0
   30a28:	23 2e       	mov	r2, r19
   30a2a:	3c e9       	ldi	r19, 0x9C	; 156
   30a2c:	33 2e       	mov	r3, r19
   30a2e:	e9 e0       	ldi	r30, 0x09	; 9
   30a30:	f3 e1       	ldi	r31, 0x13	; 19
   30a32:	a8 96       	adiw	r28, 0x28	; 40
   30a34:	ff af       	std	Y+63, r31	; 0x3f
   30a36:	ee af       	std	Y+62, r30	; 0x3e
   30a38:	a8 97       	sbiw	r28, 0x28	; 40
                    }
                }
                A[r][c] = acc;
            }
            // J^T times f(x)
            acc = 0.f;
   30a3a:	c3 57       	subi	r28, 0x73	; 115
   30a3c:	df 4f       	sbci	r29, 0xFF	; 255
   30a3e:	18 82       	st	Y, r1
   30a40:	cd 58       	subi	r28, 0x8D	; 141
   30a42:	d0 40       	sbci	r29, 0x00	; 0
   30a44:	c3 56       	subi	r28, 0x63	; 99
   30a46:	df 4f       	sbci	r29, 0xFF	; 255
   30a48:	18 82       	st	Y, r1
   30a4a:	cd 59       	subi	r28, 0x9D	; 157
   30a4c:	d0 40       	sbci	r29, 0x00	; 0
   30a4e:	cf 55       	subi	r28, 0x5F	; 95
   30a50:	df 4f       	sbci	r29, 0xFF	; 255
   30a52:	18 82       	st	Y, r1
   30a54:	c1 5a       	subi	r28, 0xA1	; 161
   30a56:	d0 40       	sbci	r29, 0x00	; 0
   30a58:	10 e0       	ldi	r17, 0x00	; 0
   30a5a:	a8 96       	adiw	r28, 0x28	; 40
   30a5c:	ae ad       	ldd	r26, Y+62	; 0x3e
   30a5e:	bf ad       	ldd	r27, Y+63	; 0x3f
   30a60:	a8 97       	sbiw	r28, 0x28	; 40
   30a62:	11 96       	adiw	r26, 0x01	; 1
   30a64:	2d 91       	ld	r18, X+
   30a66:	3d 91       	ld	r19, X+
   30a68:	4d 91       	ld	r20, X+
   30a6a:	5c 91       	ld	r21, X
   30a6c:	14 97       	sbiw	r26, 0x04	; 4
   30a6e:	e4 96       	adiw	r28, 0x34	; 52
   30a70:	2c af       	std	Y+60, r18	; 0x3c
   30a72:	3d af       	std	Y+61, r19	; 0x3d
   30a74:	4e af       	std	Y+62, r20	; 0x3e
   30a76:	5f af       	std	Y+63, r21	; 0x3f
   30a78:	e4 97       	sbiw	r28, 0x34	; 52
   30a7a:	15 96       	adiw	r26, 0x05	; 5
   30a7c:	4d 90       	ld	r4, X+
   30a7e:	5d 90       	ld	r5, X+
   30a80:	6d 90       	ld	r6, X+
   30a82:	7c 90       	ld	r7, X
   30a84:	18 97       	sbiw	r26, 0x08	; 8
            for (uint8_t i = 0; i < npts; ++i) {
                {
                    float j =
                         (r == 0) ? 1.f :
   30a86:	00 23       	and	r16, r16
   30a88:	11 f4       	brne	.+4      	; 0x30a8e <gcode_M45(bool, signed char) [clone .constprop.63]+0x1052>
   30a8a:	0d 94 e9 8d 	jmp	0x31bd2	; 0x31bd2 <gcode_M45(bool, signed char) [clone .constprop.63]+0x2196>
                        ((r == 1) ? 0.f :
   30a8e:	81 2c       	mov	r8, r1
   30a90:	91 2c       	mov	r9, r1
   30a92:	54 01       	movw	r10, r8
   30a94:	01 30       	cpi	r16, 0x01	; 1
   30a96:	81 f0       	breq	.+32     	; 0x30ab8 <gcode_M45(bool, signed char) [clone .constprop.63]+0x107c>
                        ((r == 2) ? (-s1 * measured_pts[2 * i]) :
   30a98:	02 30       	cpi	r16, 0x02	; 2
   30a9a:	11 f0       	breq	.+4      	; 0x30aa0 <gcode_M45(bool, signed char) [clone .constprop.63]+0x1064>
   30a9c:	0d 94 dd 8d 	jmp	0x31bba	; 0x31bba <gcode_M45(bool, signed char) [clone .constprop.63]+0x217e>
   30aa0:	cf 57       	subi	r28, 0x7F	; 127
   30aa2:	df 4f       	sbci	r29, 0xFF	; 255
   30aa4:	68 81       	ld	r22, Y
   30aa6:	79 81       	ldd	r23, Y+1	; 0x01
   30aa8:	8a 81       	ldd	r24, Y+2	; 0x02
   30aaa:	9b 81       	ldd	r25, Y+3	; 0x03
   30aac:	c1 58       	subi	r28, 0x81	; 129
   30aae:	d0 40       	sbci	r29, 0x00	; 0
   30ab0:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   30ab4:	4b 01       	movw	r8, r22
   30ab6:	5c 01       	movw	r10, r24
                                    (-c2 * measured_pts[2 * i + 1])));
                    float fx = c1 * measured_pts[2 * i] - s2 * measured_pts[2 * i + 1] + cntr[0] - pgm_read_float(true_pts + i * 2);
   30ab8:	e4 96       	adiw	r28, 0x34	; 52
   30aba:	2c ad       	ldd	r18, Y+60	; 0x3c
   30abc:	3d ad       	ldd	r19, Y+61	; 0x3d
   30abe:	4e ad       	ldd	r20, Y+62	; 0x3e
   30ac0:	5f ad       	ldd	r21, Y+63	; 0x3f
   30ac2:	e4 97       	sbiw	r28, 0x34	; 52
   30ac4:	6e 96       	adiw	r28, 0x1e	; 30
   30ac6:	6c ad       	ldd	r22, Y+60	; 0x3c
   30ac8:	7d ad       	ldd	r23, Y+61	; 0x3d
   30aca:	8e ad       	ldd	r24, Y+62	; 0x3e
   30acc:	9f ad       	ldd	r25, Y+63	; 0x3f
   30ace:	6e 97       	sbiw	r28, 0x1e	; 30
   30ad0:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   30ad4:	6b 01       	movw	r12, r22
   30ad6:	7c 01       	movw	r14, r24
   30ad8:	f1 01       	movw	r30, r2
   30ada:	25 91       	lpm	r18, Z+
   30adc:	35 91       	lpm	r19, Z+
   30ade:	45 91       	lpm	r20, Z+
   30ae0:	54 91       	lpm	r21, Z
   30ae2:	cb 55       	subi	r28, 0x5B	; 91
   30ae4:	df 4f       	sbci	r29, 0xFF	; 255
   30ae6:	28 83       	st	Y, r18
   30ae8:	39 83       	std	Y+1, r19	; 0x01
   30aea:	4a 83       	std	Y+2, r20	; 0x02
   30aec:	5b 83       	std	Y+3, r21	; 0x03
   30aee:	c5 5a       	subi	r28, 0xA5	; 165
   30af0:	d0 40       	sbci	r29, 0x00	; 0
   30af2:	a3 01       	movw	r20, r6
   30af4:	92 01       	movw	r18, r4
   30af6:	cb 56       	subi	r28, 0x6B	; 107
   30af8:	df 4f       	sbci	r29, 0xFF	; 255
   30afa:	68 81       	ld	r22, Y
   30afc:	79 81       	ldd	r23, Y+1	; 0x01
   30afe:	8a 81       	ldd	r24, Y+2	; 0x02
   30b00:	9b 81       	ldd	r25, Y+3	; 0x03
   30b02:	c5 59       	subi	r28, 0x95	; 149
   30b04:	d0 40       	sbci	r29, 0x00	; 0
   30b06:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   30b0a:	9b 01       	movw	r18, r22
   30b0c:	ac 01       	movw	r20, r24
   30b0e:	c7 01       	movw	r24, r14
   30b10:	b6 01       	movw	r22, r12
   30b12:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   30b16:	c5 55       	subi	r28, 0x55	; 85
   30b18:	df 4f       	sbci	r29, 0xFF	; 255
   30b1a:	28 81       	ld	r18, Y
   30b1c:	39 81       	ldd	r19, Y+1	; 0x01
   30b1e:	4a 81       	ldd	r20, Y+2	; 0x02
   30b20:	5b 81       	ldd	r21, Y+3	; 0x03
   30b22:	cb 5a       	subi	r28, 0xAB	; 171
   30b24:	d0 40       	sbci	r29, 0x00	; 0
   30b26:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   30b2a:	cb 55       	subi	r28, 0x5B	; 91
   30b2c:	df 4f       	sbci	r29, 0xFF	; 255
   30b2e:	28 81       	ld	r18, Y
   30b30:	39 81       	ldd	r19, Y+1	; 0x01
   30b32:	4a 81       	ldd	r20, Y+2	; 0x02
   30b34:	5b 81       	ldd	r21, Y+3	; 0x03
   30b36:	c5 5a       	subi	r28, 0xA5	; 165
   30b38:	d0 40       	sbci	r29, 0x00	; 0
   30b3a:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
                    float w = point_weight_x(i, measured_pts[2 * i + 1]);
                    acc += j * fx * w;
   30b3e:	a5 01       	movw	r20, r10
   30b40:	94 01       	movw	r18, r8
   30b42:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   30b46:	c3 57       	subi	r28, 0x73	; 115
   30b48:	df 4f       	sbci	r29, 0xFF	; 255
   30b4a:	28 81       	ld	r18, Y
   30b4c:	cd 58       	subi	r28, 0x8D	; 141
   30b4e:	d0 40       	sbci	r29, 0x00	; 0
   30b50:	c3 56       	subi	r28, 0x63	; 99
   30b52:	df 4f       	sbci	r29, 0xFF	; 255
   30b54:	38 81       	ld	r19, Y
   30b56:	cd 59       	subi	r28, 0x9D	; 157
   30b58:	d0 40       	sbci	r29, 0x00	; 0
   30b5a:	cf 55       	subi	r28, 0x5F	; 95
   30b5c:	df 4f       	sbci	r29, 0xFF	; 255
   30b5e:	48 81       	ld	r20, Y
   30b60:	c1 5a       	subi	r28, 0xA1	; 161
   30b62:	d0 40       	sbci	r29, 0x00	; 0
   30b64:	51 2f       	mov	r21, r17
   30b66:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   30b6a:	c3 57       	subi	r28, 0x73	; 115
   30b6c:	df 4f       	sbci	r29, 0xFF	; 255
   30b6e:	68 83       	st	Y, r22
   30b70:	79 83       	std	Y+1, r23	; 0x01
   30b72:	8a 83       	std	Y+2, r24	; 0x02
   30b74:	9b 83       	std	Y+3, r25	; 0x03
   30b76:	cd 58       	subi	r28, 0x8D	; 141
   30b78:	d0 40       	sbci	r29, 0x00	; 0
                }
                {
                    float j =
                         (r == 0) ? 0.f :
   30b7a:	00 23       	and	r16, r16
   30b7c:	11 f4       	brne	.+4      	; 0x30b82 <gcode_M45(bool, signed char) [clone .constprop.63]+0x1146>
   30b7e:	0d 94 f1 8d 	jmp	0x31be2	; 0x31be2 <gcode_M45(bool, signed char) [clone .constprop.63]+0x21a6>
                        ((r == 1) ? 1.f :
   30b82:	01 30       	cpi	r16, 0x01	; 1
   30b84:	11 f4       	brne	.+4      	; 0x30b8a <gcode_M45(bool, signed char) [clone .constprop.63]+0x114e>
   30b86:	0d 94 f6 8d 	jmp	0x31bec	; 0x31bec <gcode_M45(bool, signed char) [clone .constprop.63]+0x21b0>
                        ((r == 2) ? ( c1 * measured_pts[2 * i]) :
   30b8a:	02 30       	cpi	r16, 0x02	; 2
   30b8c:	61 f0       	breq	.+24     	; 0x30ba6 <gcode_M45(bool, signed char) [clone .constprop.63]+0x116a>
   30b8e:	a3 01       	movw	r20, r6
   30b90:	92 01       	movw	r18, r4
   30b92:	ed 96       	adiw	r28, 0x3d	; 61
   30b94:	6c ad       	ldd	r22, Y+60	; 0x3c
   30b96:	7d ad       	ldd	r23, Y+61	; 0x3d
   30b98:	8e ad       	ldd	r24, Y+62	; 0x3e
   30b9a:	9f ad       	ldd	r25, Y+63	; 0x3f
   30b9c:	ed 97       	sbiw	r28, 0x3d	; 61
   30b9e:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   30ba2:	6b 01       	movw	r12, r22
   30ba4:	7c 01       	movw	r14, r24
                                    (-s2 * measured_pts[2 * i + 1])));
                    float fy = s1 * measured_pts[2 * i] + c2 * measured_pts[2 * i + 1] + cntr[1] - pgm_read_float(true_pts + i * 2 + 1);
   30ba6:	f1 01       	movw	r30, r2
   30ba8:	34 96       	adiw	r30, 0x04	; 4
   30baa:	85 90       	lpm	r8, Z+
   30bac:	95 90       	lpm	r9, Z+
   30bae:	a5 90       	lpm	r10, Z+
   30bb0:	b4 90       	lpm	r11, Z
   30bb2:	e4 96       	adiw	r28, 0x34	; 52
   30bb4:	2c ad       	ldd	r18, Y+60	; 0x3c
   30bb6:	3d ad       	ldd	r19, Y+61	; 0x3d
   30bb8:	4e ad       	ldd	r20, Y+62	; 0x3e
   30bba:	5f ad       	ldd	r21, Y+63	; 0x3f
   30bbc:	e4 97       	sbiw	r28, 0x34	; 52
   30bbe:	cb 57       	subi	r28, 0x7B	; 123
   30bc0:	df 4f       	sbci	r29, 0xFF	; 255
   30bc2:	68 81       	ld	r22, Y
   30bc4:	79 81       	ldd	r23, Y+1	; 0x01
   30bc6:	8a 81       	ldd	r24, Y+2	; 0x02
   30bc8:	9b 81       	ldd	r25, Y+3	; 0x03
   30bca:	c5 58       	subi	r28, 0x85	; 133
   30bcc:	d0 40       	sbci	r29, 0x00	; 0
   30bce:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   30bd2:	e4 96       	adiw	r28, 0x34	; 52
   30bd4:	6c af       	std	Y+60, r22	; 0x3c
   30bd6:	7d af       	std	Y+61, r23	; 0x3d
   30bd8:	8e af       	std	Y+62, r24	; 0x3e
   30bda:	9f af       	std	Y+63, r25	; 0x3f
   30bdc:	e4 97       	sbiw	r28, 0x34	; 52
   30bde:	a3 01       	movw	r20, r6
   30be0:	92 01       	movw	r18, r4
   30be2:	c7 57       	subi	r28, 0x77	; 119
   30be4:	df 4f       	sbci	r29, 0xFF	; 255
   30be6:	68 81       	ld	r22, Y
   30be8:	79 81       	ldd	r23, Y+1	; 0x01
   30bea:	8a 81       	ldd	r24, Y+2	; 0x02
   30bec:	9b 81       	ldd	r25, Y+3	; 0x03
   30bee:	c9 58       	subi	r28, 0x89	; 137
   30bf0:	d0 40       	sbci	r29, 0x00	; 0
   30bf2:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   30bf6:	9b 01       	movw	r18, r22
   30bf8:	ac 01       	movw	r20, r24
   30bfa:	e4 96       	adiw	r28, 0x34	; 52
   30bfc:	6c ad       	ldd	r22, Y+60	; 0x3c
   30bfe:	7d ad       	ldd	r23, Y+61	; 0x3d
   30c00:	8e ad       	ldd	r24, Y+62	; 0x3e
   30c02:	9f ad       	ldd	r25, Y+63	; 0x3f
   30c04:	e4 97       	sbiw	r28, 0x34	; 52
   30c06:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   30c0a:	c1 55       	subi	r28, 0x51	; 81
   30c0c:	df 4f       	sbci	r29, 0xFF	; 255
   30c0e:	28 81       	ld	r18, Y
   30c10:	39 81       	ldd	r19, Y+1	; 0x01
   30c12:	4a 81       	ldd	r20, Y+2	; 0x02
   30c14:	5b 81       	ldd	r21, Y+3	; 0x03
   30c16:	cf 5a       	subi	r28, 0xAF	; 175
   30c18:	d0 40       	sbci	r29, 0x00	; 0
   30c1a:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   30c1e:	a5 01       	movw	r20, r10
   30c20:	94 01       	movw	r18, r8
   30c22:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
                    float w = point_weight_y(i, measured_pts[2 * i + 1]);
                    acc += j * fy * w;
   30c26:	a7 01       	movw	r20, r14
   30c28:	96 01       	movw	r18, r12
   30c2a:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   30c2e:	c3 57       	subi	r28, 0x73	; 115
   30c30:	df 4f       	sbci	r29, 0xFF	; 255
   30c32:	28 81       	ld	r18, Y
   30c34:	39 81       	ldd	r19, Y+1	; 0x01
   30c36:	4a 81       	ldd	r20, Y+2	; 0x02
   30c38:	5b 81       	ldd	r21, Y+3	; 0x03
   30c3a:	cd 58       	subi	r28, 0x8D	; 141
   30c3c:	d0 40       	sbci	r29, 0x00	; 0
   30c3e:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   30c42:	c3 57       	subi	r28, 0x73	; 115
   30c44:	df 4f       	sbci	r29, 0xFF	; 255
   30c46:	68 83       	st	Y, r22
   30c48:	cd 58       	subi	r28, 0x8D	; 141
   30c4a:	d0 40       	sbci	r29, 0x00	; 0
   30c4c:	c3 56       	subi	r28, 0x63	; 99
   30c4e:	df 4f       	sbci	r29, 0xFF	; 255
   30c50:	78 83       	st	Y, r23
   30c52:	cd 59       	subi	r28, 0x9D	; 157
   30c54:	d0 40       	sbci	r29, 0x00	; 0
   30c56:	cf 55       	subi	r28, 0x5F	; 95
   30c58:	df 4f       	sbci	r29, 0xFF	; 255
   30c5a:	88 83       	st	Y, r24
   30c5c:	c1 5a       	subi	r28, 0xA1	; 161
   30c5e:	d0 40       	sbci	r29, 0x00	; 0
   30c60:	19 2f       	mov	r17, r25
   30c62:	a8 96       	adiw	r28, 0x28	; 40
   30c64:	4e ad       	ldd	r20, Y+62	; 0x3e
   30c66:	5f ad       	ldd	r21, Y+63	; 0x3f
   30c68:	a8 97       	sbiw	r28, 0x28	; 40
   30c6a:	48 5f       	subi	r20, 0xF8	; 248
   30c6c:	5f 4f       	sbci	r21, 0xFF	; 255
   30c6e:	a8 96       	adiw	r28, 0x28	; 40
   30c70:	5f af       	std	Y+63, r21	; 0x3f
   30c72:	4e af       	std	Y+62, r20	; 0x3e
   30c74:	a8 97       	sbiw	r28, 0x28	; 40
   30c76:	58 e0       	ldi	r21, 0x08	; 8
   30c78:	25 0e       	add	r2, r21
   30c7a:	31 1c       	adc	r3, r1
                }
                A[r][c] = acc;
            }
            // J^T times f(x)
            acc = 0.f;
            for (uint8_t i = 0; i < npts; ++i) {
   30c7c:	a9 e2       	ldi	r26, 0x29	; 41
   30c7e:	b3 e1       	ldi	r27, 0x13	; 19
   30c80:	a8 96       	adiw	r28, 0x28	; 40
   30c82:	ee ad       	ldd	r30, Y+62	; 0x3e
   30c84:	ff ad       	ldd	r31, Y+63	; 0x3f
   30c86:	a8 97       	sbiw	r28, 0x28	; 40
   30c88:	ae 17       	cp	r26, r30
   30c8a:	bf 07       	cpc	r27, r31
   30c8c:	09 f0       	breq	.+2      	; 0x30c90 <gcode_M45(bool, signed char) [clone .constprop.63]+0x1254>
   30c8e:	e5 ce       	rjmp	.-566    	; 0x30a5a <gcode_M45(bool, signed char) [clone .constprop.63]+0x101e>
                    float fy = s1 * measured_pts[2 * i] + c2 * measured_pts[2 * i + 1] + cntr[1] - pgm_read_float(true_pts + i * 2 + 1);
                    float w = point_weight_y(i, measured_pts[2 * i + 1]);
                    acc += j * fy * w;
                }
            }
            b[r] = -acc;
   30c90:	90 58       	subi	r25, 0x80	; 128
   30c92:	c7 56       	subi	r28, 0x67	; 103
   30c94:	df 4f       	sbci	r29, 0xFF	; 255
   30c96:	a8 81       	ld	r26, Y
   30c98:	b9 81       	ldd	r27, Y+1	; 0x01
   30c9a:	c9 59       	subi	r28, 0x99	; 153
   30c9c:	d0 40       	sbci	r29, 0x00	; 0
   30c9e:	6d 93       	st	X+, r22
   30ca0:	7d 93       	st	X+, r23
   30ca2:	8d 93       	st	X+, r24
   30ca4:	9d 93       	st	X+, r25
   30ca6:	c7 56       	subi	r28, 0x67	; 103
   30ca8:	df 4f       	sbci	r29, 0xFF	; 255
   30caa:	b9 83       	std	Y+1, r27	; 0x01
   30cac:	a8 83       	st	Y, r26
   30cae:	c9 59       	subi	r28, 0x99	; 153
   30cb0:	d0 40       	sbci	r29, 0x00	; 0
        // Prepare the Normal equation for the Gauss-Newton method.
        float A[4][4] = { 0.f };
        float b[4] = { 0.f };
        float acc;
		delay_keep_alive(0); //manage heater, reset watchdog, manage inactivity
        for (uint8_t r = 0; r < 4; ++r) {
   30cb2:	0f 5f       	subi	r16, 0xFF	; 255
   30cb4:	ac 96       	adiw	r28, 0x2c	; 44
   30cb6:	ee ad       	ldd	r30, Y+62	; 0x3e
   30cb8:	ff ad       	ldd	r31, Y+63	; 0x3f
   30cba:	ac 97       	sbiw	r28, 0x2c	; 44
   30cbc:	70 96       	adiw	r30, 0x10	; 16
   30cbe:	ac 96       	adiw	r28, 0x2c	; 44
   30cc0:	ff af       	std	Y+63, r31	; 0x3f
   30cc2:	ee af       	std	Y+62, r30	; 0x3e
   30cc4:	ac 97       	sbiw	r28, 0x2c	; 44
   30cc6:	04 30       	cpi	r16, 0x04	; 4
   30cc8:	09 f0       	breq	.+2      	; 0x30ccc <gcode_M45(bool, signed char) [clone .constprop.63]+0x1290>
   30cca:	21 ce       	rjmp	.-958    	; 0x3090e <gcode_M45(bool, signed char) [clone .constprop.63]+0xed2>
        }

        // Solve for h by a Gauss iteration method.
        float h[4] = { 0.f };
        for (uint8_t gauss_iter = 0; gauss_iter < 100; ++gauss_iter) {
            h[0] = (b[0] - A[0][1] * h[1] - A[0][2] * h[2] - A[0][3] * h[3]) / A[0][0];
   30ccc:	25 96       	adiw	r28, 0x05	; 5
   30cce:	2c ad       	ldd	r18, Y+60	; 0x3c
   30cd0:	3d ad       	ldd	r19, Y+61	; 0x3d
   30cd2:	4e ad       	ldd	r20, Y+62	; 0x3e
   30cd4:	5f ad       	ldd	r21, Y+63	; 0x3f
   30cd6:	25 97       	sbiw	r28, 0x05	; 5
   30cd8:	ae 96       	adiw	r28, 0x2e	; 46
   30cda:	2c af       	std	Y+60, r18	; 0x3c
   30cdc:	3d af       	std	Y+61, r19	; 0x3d
   30cde:	4e af       	std	Y+62, r20	; 0x3e
   30ce0:	5f af       	std	Y+63, r21	; 0x3f
   30ce2:	ae 97       	sbiw	r28, 0x2e	; 46
   30ce4:	8d 81       	ldd	r24, Y+5	; 0x05
   30ce6:	9e 81       	ldd	r25, Y+6	; 0x06
   30ce8:	af 81       	ldd	r26, Y+7	; 0x07
   30cea:	b8 85       	ldd	r27, Y+8	; 0x08
   30cec:	e4 96       	adiw	r28, 0x34	; 52
   30cee:	8c af       	std	Y+60, r24	; 0x3c
   30cf0:	9d af       	std	Y+61, r25	; 0x3d
   30cf2:	ae af       	std	Y+62, r26	; 0x3e
   30cf4:	bf af       	std	Y+63, r27	; 0x3f
   30cf6:	e4 97       	sbiw	r28, 0x34	; 52
   30cf8:	29 85       	ldd	r18, Y+9	; 0x09
   30cfa:	3a 85       	ldd	r19, Y+10	; 0x0a
   30cfc:	4b 85       	ldd	r20, Y+11	; 0x0b
   30cfe:	5c 85       	ldd	r21, Y+12	; 0x0c
   30d00:	ed 96       	adiw	r28, 0x3d	; 61
   30d02:	2c af       	std	Y+60, r18	; 0x3c
   30d04:	3d af       	std	Y+61, r19	; 0x3d
   30d06:	4e af       	std	Y+62, r20	; 0x3e
   30d08:	5f af       	std	Y+63, r21	; 0x3f
   30d0a:	ed 97       	sbiw	r28, 0x3d	; 61
   30d0c:	8d 85       	ldd	r24, Y+13	; 0x0d
   30d0e:	9e 85       	ldd	r25, Y+14	; 0x0e
   30d10:	af 85       	ldd	r26, Y+15	; 0x0f
   30d12:	b8 89       	ldd	r27, Y+16	; 0x10
   30d14:	c3 58       	subi	r28, 0x83	; 131
   30d16:	df 4f       	sbci	r29, 0xFF	; 255
   30d18:	88 83       	st	Y, r24
   30d1a:	99 83       	std	Y+1, r25	; 0x01
   30d1c:	aa 83       	std	Y+2, r26	; 0x02
   30d1e:	bb 83       	std	Y+3, r27	; 0x03
   30d20:	cd 57       	subi	r28, 0x7D	; 125
   30d22:	d0 40       	sbci	r29, 0x00	; 0
   30d24:	29 81       	ldd	r18, Y+1	; 0x01
   30d26:	3a 81       	ldd	r19, Y+2	; 0x02
   30d28:	4b 81       	ldd	r20, Y+3	; 0x03
   30d2a:	5c 81       	ldd	r21, Y+4	; 0x04
   30d2c:	cf 57       	subi	r28, 0x7F	; 127
   30d2e:	df 4f       	sbci	r29, 0xFF	; 255
   30d30:	28 83       	st	Y, r18
   30d32:	39 83       	std	Y+1, r19	; 0x01
   30d34:	4a 83       	std	Y+2, r20	; 0x02
   30d36:	5b 83       	std	Y+3, r21	; 0x03
   30d38:	c1 58       	subi	r28, 0x81	; 129
   30d3a:	d0 40       	sbci	r29, 0x00	; 0
            h[1] = (b[1] - A[1][0] * h[0] - A[1][2] * h[2] - A[1][3] * h[3]) / A[1][1];
   30d3c:	29 96       	adiw	r28, 0x09	; 9
   30d3e:	8c ad       	ldd	r24, Y+60	; 0x3c
   30d40:	9d ad       	ldd	r25, Y+61	; 0x3d
   30d42:	ae ad       	ldd	r26, Y+62	; 0x3e
   30d44:	bf ad       	ldd	r27, Y+63	; 0x3f
   30d46:	29 97       	sbiw	r28, 0x09	; 9
   30d48:	cb 57       	subi	r28, 0x7B	; 123
   30d4a:	df 4f       	sbci	r29, 0xFF	; 255
   30d4c:	88 83       	st	Y, r24
   30d4e:	99 83       	std	Y+1, r25	; 0x01
   30d50:	aa 83       	std	Y+2, r26	; 0x02
   30d52:	bb 83       	std	Y+3, r27	; 0x03
   30d54:	c5 58       	subi	r28, 0x85	; 133
   30d56:	d0 40       	sbci	r29, 0x00	; 0
   30d58:	29 89       	ldd	r18, Y+17	; 0x11
   30d5a:	3a 89       	ldd	r19, Y+18	; 0x12
   30d5c:	4b 89       	ldd	r20, Y+19	; 0x13
   30d5e:	5c 89       	ldd	r21, Y+20	; 0x14
   30d60:	c7 57       	subi	r28, 0x77	; 119
   30d62:	df 4f       	sbci	r29, 0xFF	; 255
   30d64:	28 83       	st	Y, r18
   30d66:	39 83       	std	Y+1, r19	; 0x01
   30d68:	4a 83       	std	Y+2, r20	; 0x02
   30d6a:	5b 83       	std	Y+3, r21	; 0x03
   30d6c:	c9 58       	subi	r28, 0x89	; 137
   30d6e:	d0 40       	sbci	r29, 0x00	; 0
   30d70:	89 8d       	ldd	r24, Y+25	; 0x19
   30d72:	9a 8d       	ldd	r25, Y+26	; 0x1a
   30d74:	ab 8d       	ldd	r26, Y+27	; 0x1b
   30d76:	bc 8d       	ldd	r27, Y+28	; 0x1c
   30d78:	cb 56       	subi	r28, 0x6B	; 107
   30d7a:	df 4f       	sbci	r29, 0xFF	; 255
   30d7c:	88 83       	st	Y, r24
   30d7e:	99 83       	std	Y+1, r25	; 0x01
   30d80:	aa 83       	std	Y+2, r26	; 0x02
   30d82:	bb 83       	std	Y+3, r27	; 0x03
   30d84:	c5 59       	subi	r28, 0x95	; 149
   30d86:	d0 40       	sbci	r29, 0x00	; 0
   30d88:	2d 8d       	ldd	r18, Y+29	; 0x1d
   30d8a:	3e 8d       	ldd	r19, Y+30	; 0x1e
   30d8c:	4f 8d       	ldd	r20, Y+31	; 0x1f
   30d8e:	58 a1       	ldd	r21, Y+32	; 0x20
   30d90:	c7 56       	subi	r28, 0x67	; 103
   30d92:	df 4f       	sbci	r29, 0xFF	; 255
   30d94:	28 83       	st	Y, r18
   30d96:	39 83       	std	Y+1, r19	; 0x01
   30d98:	4a 83       	std	Y+2, r20	; 0x02
   30d9a:	5b 83       	std	Y+3, r21	; 0x03
   30d9c:	c9 59       	subi	r28, 0x99	; 153
   30d9e:	d0 40       	sbci	r29, 0x00	; 0
   30da0:	8d 89       	ldd	r24, Y+21	; 0x15
   30da2:	9e 89       	ldd	r25, Y+22	; 0x16
   30da4:	af 89       	ldd	r26, Y+23	; 0x17
   30da6:	b8 8d       	ldd	r27, Y+24	; 0x18
   30da8:	c3 57       	subi	r28, 0x73	; 115
   30daa:	df 4f       	sbci	r29, 0xFF	; 255
   30dac:	88 83       	st	Y, r24
   30dae:	99 83       	std	Y+1, r25	; 0x01
   30db0:	aa 83       	std	Y+2, r26	; 0x02
   30db2:	bb 83       	std	Y+3, r27	; 0x03
   30db4:	cd 58       	subi	r28, 0x8D	; 141
   30db6:	d0 40       	sbci	r29, 0x00	; 0
            h[2] = (b[2] - A[2][0] * h[0] - A[2][1] * h[1] - A[2][3] * h[3]) / A[2][2];
   30db8:	2d 96       	adiw	r28, 0x0d	; 13
   30dba:	2c ad       	ldd	r18, Y+60	; 0x3c
   30dbc:	3d ad       	ldd	r19, Y+61	; 0x3d
   30dbe:	4e ad       	ldd	r20, Y+62	; 0x3e
   30dc0:	5f ad       	ldd	r21, Y+63	; 0x3f
   30dc2:	2d 97       	sbiw	r28, 0x0d	; 13
   30dc4:	c3 56       	subi	r28, 0x63	; 99
   30dc6:	df 4f       	sbci	r29, 0xFF	; 255
   30dc8:	28 83       	st	Y, r18
   30dca:	39 83       	std	Y+1, r19	; 0x01
   30dcc:	4a 83       	std	Y+2, r20	; 0x02
   30dce:	5b 83       	std	Y+3, r21	; 0x03
   30dd0:	cd 59       	subi	r28, 0x9D	; 157
   30dd2:	d0 40       	sbci	r29, 0x00	; 0
   30dd4:	89 a1       	ldd	r24, Y+33	; 0x21
   30dd6:	9a a1       	ldd	r25, Y+34	; 0x22
   30dd8:	ab a1       	ldd	r26, Y+35	; 0x23
   30dda:	bc a1       	ldd	r27, Y+36	; 0x24
   30ddc:	cf 55       	subi	r28, 0x5F	; 95
   30dde:	df 4f       	sbci	r29, 0xFF	; 255
   30de0:	88 83       	st	Y, r24
   30de2:	99 83       	std	Y+1, r25	; 0x01
   30de4:	aa 83       	std	Y+2, r26	; 0x02
   30de6:	bb 83       	std	Y+3, r27	; 0x03
   30de8:	c1 5a       	subi	r28, 0xA1	; 161
   30dea:	d0 40       	sbci	r29, 0x00	; 0
   30dec:	2d a1       	ldd	r18, Y+37	; 0x25
   30dee:	3e a1       	ldd	r19, Y+38	; 0x26
   30df0:	4f a1       	ldd	r20, Y+39	; 0x27
   30df2:	58 a5       	ldd	r21, Y+40	; 0x28
   30df4:	cb 55       	subi	r28, 0x5B	; 91
   30df6:	df 4f       	sbci	r29, 0xFF	; 255
   30df8:	28 83       	st	Y, r18
   30dfa:	39 83       	std	Y+1, r19	; 0x01
   30dfc:	4a 83       	std	Y+2, r20	; 0x02
   30dfe:	5b 83       	std	Y+3, r21	; 0x03
   30e00:	c5 5a       	subi	r28, 0xA5	; 165
   30e02:	d0 40       	sbci	r29, 0x00	; 0
   30e04:	8d a5       	ldd	r24, Y+45	; 0x2d
   30e06:	9e a5       	ldd	r25, Y+46	; 0x2e
   30e08:	af a5       	ldd	r26, Y+47	; 0x2f
   30e0a:	b8 a9       	ldd	r27, Y+48	; 0x30
   30e0c:	cd 54       	subi	r28, 0x4D	; 77
   30e0e:	df 4f       	sbci	r29, 0xFF	; 255
   30e10:	88 83       	st	Y, r24
   30e12:	99 83       	std	Y+1, r25	; 0x01
   30e14:	aa 83       	std	Y+2, r26	; 0x02
   30e16:	bb 83       	std	Y+3, r27	; 0x03
   30e18:	c3 5b       	subi	r28, 0xB3	; 179
   30e1a:	d0 40       	sbci	r29, 0x00	; 0
   30e1c:	29 a5       	ldd	r18, Y+41	; 0x29
   30e1e:	3a a5       	ldd	r19, Y+42	; 0x2a
   30e20:	4b a5       	ldd	r20, Y+43	; 0x2b
   30e22:	5c a5       	ldd	r21, Y+44	; 0x2c
   30e24:	c9 54       	subi	r28, 0x49	; 73
   30e26:	df 4f       	sbci	r29, 0xFF	; 255
   30e28:	28 83       	st	Y, r18
   30e2a:	39 83       	std	Y+1, r19	; 0x01
   30e2c:	4a 83       	std	Y+2, r20	; 0x02
   30e2e:	5b 83       	std	Y+3, r21	; 0x03
   30e30:	c7 5b       	subi	r28, 0xB7	; 183
   30e32:	d0 40       	sbci	r29, 0x00	; 0
            h[3] = (b[3] - A[3][0] * h[0] - A[3][1] * h[1] - A[3][2] * h[2]) / A[3][3];
   30e34:	61 96       	adiw	r28, 0x11	; 17
   30e36:	8c ad       	ldd	r24, Y+60	; 0x3c
   30e38:	9d ad       	ldd	r25, Y+61	; 0x3d
   30e3a:	ae ad       	ldd	r26, Y+62	; 0x3e
   30e3c:	bf ad       	ldd	r27, Y+63	; 0x3f
   30e3e:	61 97       	sbiw	r28, 0x11	; 17
   30e40:	c5 54       	subi	r28, 0x45	; 69
   30e42:	df 4f       	sbci	r29, 0xFF	; 255
   30e44:	88 83       	st	Y, r24
   30e46:	99 83       	std	Y+1, r25	; 0x01
   30e48:	aa 83       	std	Y+2, r26	; 0x02
   30e4a:	bb 83       	std	Y+3, r27	; 0x03
   30e4c:	cb 5b       	subi	r28, 0xBB	; 187
   30e4e:	d0 40       	sbci	r29, 0x00	; 0
   30e50:	29 a9       	ldd	r18, Y+49	; 0x31
   30e52:	3a a9       	ldd	r19, Y+50	; 0x32
   30e54:	4b a9       	ldd	r20, Y+51	; 0x33
   30e56:	5c a9       	ldd	r21, Y+52	; 0x34
   30e58:	c1 54       	subi	r28, 0x41	; 65
   30e5a:	df 4f       	sbci	r29, 0xFF	; 255
   30e5c:	28 83       	st	Y, r18
   30e5e:	39 83       	std	Y+1, r19	; 0x01
   30e60:	4a 83       	std	Y+2, r20	; 0x02
   30e62:	5b 83       	std	Y+3, r21	; 0x03
   30e64:	cf 5b       	subi	r28, 0xBF	; 191
   30e66:	d0 40       	sbci	r29, 0x00	; 0
   30e68:	8d a9       	ldd	r24, Y+53	; 0x35
   30e6a:	9e a9       	ldd	r25, Y+54	; 0x36
   30e6c:	af a9       	ldd	r26, Y+55	; 0x37
   30e6e:	b8 ad       	ldd	r27, Y+56	; 0x38
   30e70:	cd 53       	subi	r28, 0x3D	; 61
   30e72:	df 4f       	sbci	r29, 0xFF	; 255
   30e74:	88 83       	st	Y, r24
   30e76:	99 83       	std	Y+1, r25	; 0x01
   30e78:	aa 83       	std	Y+2, r26	; 0x02
   30e7a:	bb 83       	std	Y+3, r27	; 0x03
   30e7c:	c3 5c       	subi	r28, 0xC3	; 195
   30e7e:	d0 40       	sbci	r29, 0x00	; 0
   30e80:	29 ad       	ldd	r18, Y+57	; 0x39
   30e82:	3a ad       	ldd	r19, Y+58	; 0x3a
   30e84:	4b ad       	ldd	r20, Y+59	; 0x3b
   30e86:	5c ad       	ldd	r21, Y+60	; 0x3c
   30e88:	c9 53       	subi	r28, 0x39	; 57
   30e8a:	df 4f       	sbci	r29, 0xFF	; 255
   30e8c:	28 83       	st	Y, r18
   30e8e:	39 83       	std	Y+1, r19	; 0x01
   30e90:	4a 83       	std	Y+2, r20	; 0x02
   30e92:	5b 83       	std	Y+3, r21	; 0x03
   30e94:	c7 5c       	subi	r28, 0xC7	; 199
   30e96:	d0 40       	sbci	r29, 0x00	; 0
   30e98:	21 96       	adiw	r28, 0x01	; 1
   30e9a:	8c ad       	ldd	r24, Y+60	; 0x3c
   30e9c:	9d ad       	ldd	r25, Y+61	; 0x3d
   30e9e:	ae ad       	ldd	r26, Y+62	; 0x3e
   30ea0:	bf ad       	ldd	r27, Y+63	; 0x3f
   30ea2:	21 97       	sbiw	r28, 0x01	; 1
   30ea4:	c5 53       	subi	r28, 0x35	; 53
   30ea6:	df 4f       	sbci	r29, 0xFF	; 255
   30ea8:	88 83       	st	Y, r24
   30eaa:	99 83       	std	Y+1, r25	; 0x01
   30eac:	aa 83       	std	Y+2, r26	; 0x02
   30eae:	bb 83       	std	Y+3, r27	; 0x03
   30eb0:	cb 5c       	subi	r28, 0xCB	; 203
   30eb2:	d0 40       	sbci	r29, 0x00	; 0
   30eb4:	14 e6       	ldi	r17, 0x64	; 100
            }
            b[r] = -acc;
        }

        // Solve for h by a Gauss iteration method.
        float h[4] = { 0.f };
   30eb6:	c1 2c       	mov	r12, r1
   30eb8:	d1 2c       	mov	r13, r1
   30eba:	76 01       	movw	r14, r12
   30ebc:	46 01       	movw	r8, r12
   30ebe:	57 01       	movw	r10, r14
   30ec0:	26 01       	movw	r4, r12
   30ec2:	37 01       	movw	r6, r14
        for (uint8_t gauss_iter = 0; gauss_iter < 100; ++gauss_iter) {
            h[0] = (b[0] - A[0][1] * h[1] - A[0][2] * h[2] - A[0][3] * h[3]) / A[0][0];
   30ec4:	a3 01       	movw	r20, r6
   30ec6:	92 01       	movw	r18, r4
   30ec8:	e4 96       	adiw	r28, 0x34	; 52
   30eca:	6c ad       	ldd	r22, Y+60	; 0x3c
   30ecc:	7d ad       	ldd	r23, Y+61	; 0x3d
   30ece:	8e ad       	ldd	r24, Y+62	; 0x3e
   30ed0:	9f ad       	ldd	r25, Y+63	; 0x3f
   30ed2:	e4 97       	sbiw	r28, 0x34	; 52
   30ed4:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   30ed8:	9b 01       	movw	r18, r22
   30eda:	ac 01       	movw	r20, r24
   30edc:	ae 96       	adiw	r28, 0x2e	; 46
   30ede:	6c ad       	ldd	r22, Y+60	; 0x3c
   30ee0:	7d ad       	ldd	r23, Y+61	; 0x3d
   30ee2:	8e ad       	ldd	r24, Y+62	; 0x3e
   30ee4:	9f ad       	ldd	r25, Y+63	; 0x3f
   30ee6:	ae 97       	sbiw	r28, 0x2e	; 46
   30ee8:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   30eec:	2b 01       	movw	r4, r22
   30eee:	3c 01       	movw	r6, r24
   30ef0:	a5 01       	movw	r20, r10
   30ef2:	94 01       	movw	r18, r8
   30ef4:	ed 96       	adiw	r28, 0x3d	; 61
   30ef6:	6c ad       	ldd	r22, Y+60	; 0x3c
   30ef8:	7d ad       	ldd	r23, Y+61	; 0x3d
   30efa:	8e ad       	ldd	r24, Y+62	; 0x3e
   30efc:	9f ad       	ldd	r25, Y+63	; 0x3f
   30efe:	ed 97       	sbiw	r28, 0x3d	; 61
   30f00:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   30f04:	9b 01       	movw	r18, r22
   30f06:	ac 01       	movw	r20, r24
   30f08:	c3 01       	movw	r24, r6
   30f0a:	b2 01       	movw	r22, r4
   30f0c:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   30f10:	2b 01       	movw	r4, r22
   30f12:	3c 01       	movw	r6, r24
   30f14:	a7 01       	movw	r20, r14
   30f16:	96 01       	movw	r18, r12
   30f18:	c3 58       	subi	r28, 0x83	; 131
   30f1a:	df 4f       	sbci	r29, 0xFF	; 255
   30f1c:	68 81       	ld	r22, Y
   30f1e:	79 81       	ldd	r23, Y+1	; 0x01
   30f20:	8a 81       	ldd	r24, Y+2	; 0x02
   30f22:	9b 81       	ldd	r25, Y+3	; 0x03
   30f24:	cd 57       	subi	r28, 0x7D	; 125
   30f26:	d0 40       	sbci	r29, 0x00	; 0
   30f28:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   30f2c:	9b 01       	movw	r18, r22
   30f2e:	ac 01       	movw	r20, r24
   30f30:	c3 01       	movw	r24, r6
   30f32:	b2 01       	movw	r22, r4
   30f34:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   30f38:	cf 57       	subi	r28, 0x7F	; 127
   30f3a:	df 4f       	sbci	r29, 0xFF	; 255
   30f3c:	28 81       	ld	r18, Y
   30f3e:	39 81       	ldd	r19, Y+1	; 0x01
   30f40:	4a 81       	ldd	r20, Y+2	; 0x02
   30f42:	5b 81       	ldd	r21, Y+3	; 0x03
   30f44:	c1 58       	subi	r28, 0x81	; 129
   30f46:	d0 40       	sbci	r29, 0x00	; 0
   30f48:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   30f4c:	6e 96       	adiw	r28, 0x1e	; 30
   30f4e:	6c af       	std	Y+60, r22	; 0x3c
   30f50:	7d af       	std	Y+61, r23	; 0x3d
   30f52:	8e af       	std	Y+62, r24	; 0x3e
   30f54:	9f af       	std	Y+63, r25	; 0x3f
   30f56:	6e 97       	sbiw	r28, 0x1e	; 30
            h[1] = (b[1] - A[1][0] * h[0] - A[1][2] * h[2] - A[1][3] * h[3]) / A[1][1];
   30f58:	c7 57       	subi	r28, 0x77	; 119
   30f5a:	df 4f       	sbci	r29, 0xFF	; 255
   30f5c:	28 81       	ld	r18, Y
   30f5e:	39 81       	ldd	r19, Y+1	; 0x01
   30f60:	4a 81       	ldd	r20, Y+2	; 0x02
   30f62:	5b 81       	ldd	r21, Y+3	; 0x03
   30f64:	c9 58       	subi	r28, 0x89	; 137
   30f66:	d0 40       	sbci	r29, 0x00	; 0
   30f68:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   30f6c:	9b 01       	movw	r18, r22
   30f6e:	ac 01       	movw	r20, r24
   30f70:	cb 57       	subi	r28, 0x7B	; 123
   30f72:	df 4f       	sbci	r29, 0xFF	; 255
   30f74:	68 81       	ld	r22, Y
   30f76:	79 81       	ldd	r23, Y+1	; 0x01
   30f78:	8a 81       	ldd	r24, Y+2	; 0x02
   30f7a:	9b 81       	ldd	r25, Y+3	; 0x03
   30f7c:	c5 58       	subi	r28, 0x85	; 133
   30f7e:	d0 40       	sbci	r29, 0x00	; 0
   30f80:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   30f84:	2b 01       	movw	r4, r22
   30f86:	3c 01       	movw	r6, r24
   30f88:	a5 01       	movw	r20, r10
   30f8a:	94 01       	movw	r18, r8
   30f8c:	cb 56       	subi	r28, 0x6B	; 107
   30f8e:	df 4f       	sbci	r29, 0xFF	; 255
   30f90:	68 81       	ld	r22, Y
   30f92:	79 81       	ldd	r23, Y+1	; 0x01
   30f94:	8a 81       	ldd	r24, Y+2	; 0x02
   30f96:	9b 81       	ldd	r25, Y+3	; 0x03
   30f98:	c5 59       	subi	r28, 0x95	; 149
   30f9a:	d0 40       	sbci	r29, 0x00	; 0
   30f9c:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   30fa0:	9b 01       	movw	r18, r22
   30fa2:	ac 01       	movw	r20, r24
   30fa4:	c3 01       	movw	r24, r6
   30fa6:	b2 01       	movw	r22, r4
   30fa8:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   30fac:	4b 01       	movw	r8, r22
   30fae:	5c 01       	movw	r10, r24
   30fb0:	a7 01       	movw	r20, r14
   30fb2:	96 01       	movw	r18, r12
   30fb4:	c7 56       	subi	r28, 0x67	; 103
   30fb6:	df 4f       	sbci	r29, 0xFF	; 255
   30fb8:	68 81       	ld	r22, Y
   30fba:	79 81       	ldd	r23, Y+1	; 0x01
   30fbc:	8a 81       	ldd	r24, Y+2	; 0x02
   30fbe:	9b 81       	ldd	r25, Y+3	; 0x03
   30fc0:	c9 59       	subi	r28, 0x99	; 153
   30fc2:	d0 40       	sbci	r29, 0x00	; 0
   30fc4:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   30fc8:	9b 01       	movw	r18, r22
   30fca:	ac 01       	movw	r20, r24
   30fcc:	c5 01       	movw	r24, r10
   30fce:	b4 01       	movw	r22, r8
   30fd0:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   30fd4:	c3 57       	subi	r28, 0x73	; 115
   30fd6:	df 4f       	sbci	r29, 0xFF	; 255
   30fd8:	28 81       	ld	r18, Y
   30fda:	39 81       	ldd	r19, Y+1	; 0x01
   30fdc:	4a 81       	ldd	r20, Y+2	; 0x02
   30fde:	5b 81       	ldd	r21, Y+3	; 0x03
   30fe0:	cd 58       	subi	r28, 0x8D	; 141
   30fe2:	d0 40       	sbci	r29, 0x00	; 0
   30fe4:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   30fe8:	2b 01       	movw	r4, r22
   30fea:	3c 01       	movw	r6, r24
            h[2] = (b[2] - A[2][0] * h[0] - A[2][1] * h[1] - A[2][3] * h[3]) / A[2][2];
   30fec:	cf 55       	subi	r28, 0x5F	; 95
   30fee:	df 4f       	sbci	r29, 0xFF	; 255
   30ff0:	28 81       	ld	r18, Y
   30ff2:	39 81       	ldd	r19, Y+1	; 0x01
   30ff4:	4a 81       	ldd	r20, Y+2	; 0x02
   30ff6:	5b 81       	ldd	r21, Y+3	; 0x03
   30ff8:	c1 5a       	subi	r28, 0xA1	; 161
   30ffa:	d0 40       	sbci	r29, 0x00	; 0
   30ffc:	6e 96       	adiw	r28, 0x1e	; 30
   30ffe:	6c ad       	ldd	r22, Y+60	; 0x3c
   31000:	7d ad       	ldd	r23, Y+61	; 0x3d
   31002:	8e ad       	ldd	r24, Y+62	; 0x3e
   31004:	9f ad       	ldd	r25, Y+63	; 0x3f
   31006:	6e 97       	sbiw	r28, 0x1e	; 30
   31008:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   3100c:	9b 01       	movw	r18, r22
   3100e:	ac 01       	movw	r20, r24
   31010:	c3 56       	subi	r28, 0x63	; 99
   31012:	df 4f       	sbci	r29, 0xFF	; 255
   31014:	68 81       	ld	r22, Y
   31016:	79 81       	ldd	r23, Y+1	; 0x01
   31018:	8a 81       	ldd	r24, Y+2	; 0x02
   3101a:	9b 81       	ldd	r25, Y+3	; 0x03
   3101c:	cd 59       	subi	r28, 0x9D	; 157
   3101e:	d0 40       	sbci	r29, 0x00	; 0
   31020:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   31024:	4b 01       	movw	r8, r22
   31026:	5c 01       	movw	r10, r24
   31028:	cb 55       	subi	r28, 0x5B	; 91
   3102a:	df 4f       	sbci	r29, 0xFF	; 255
   3102c:	28 81       	ld	r18, Y
   3102e:	39 81       	ldd	r19, Y+1	; 0x01
   31030:	4a 81       	ldd	r20, Y+2	; 0x02
   31032:	5b 81       	ldd	r21, Y+3	; 0x03
   31034:	c5 5a       	subi	r28, 0xA5	; 165
   31036:	d0 40       	sbci	r29, 0x00	; 0
   31038:	c3 01       	movw	r24, r6
   3103a:	b2 01       	movw	r22, r4
   3103c:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   31040:	9b 01       	movw	r18, r22
   31042:	ac 01       	movw	r20, r24
   31044:	c5 01       	movw	r24, r10
   31046:	b4 01       	movw	r22, r8
   31048:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   3104c:	4b 01       	movw	r8, r22
   3104e:	5c 01       	movw	r10, r24
   31050:	a7 01       	movw	r20, r14
   31052:	96 01       	movw	r18, r12
   31054:	cd 54       	subi	r28, 0x4D	; 77
   31056:	df 4f       	sbci	r29, 0xFF	; 255
   31058:	68 81       	ld	r22, Y
   3105a:	79 81       	ldd	r23, Y+1	; 0x01
   3105c:	8a 81       	ldd	r24, Y+2	; 0x02
   3105e:	9b 81       	ldd	r25, Y+3	; 0x03
   31060:	c3 5b       	subi	r28, 0xB3	; 179
   31062:	d0 40       	sbci	r29, 0x00	; 0
   31064:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   31068:	9b 01       	movw	r18, r22
   3106a:	ac 01       	movw	r20, r24
   3106c:	c5 01       	movw	r24, r10
   3106e:	b4 01       	movw	r22, r8
   31070:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   31074:	c9 54       	subi	r28, 0x49	; 73
   31076:	df 4f       	sbci	r29, 0xFF	; 255
   31078:	28 81       	ld	r18, Y
   3107a:	39 81       	ldd	r19, Y+1	; 0x01
   3107c:	4a 81       	ldd	r20, Y+2	; 0x02
   3107e:	5b 81       	ldd	r21, Y+3	; 0x03
   31080:	c7 5b       	subi	r28, 0xB7	; 183
   31082:	d0 40       	sbci	r29, 0x00	; 0
   31084:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   31088:	4b 01       	movw	r8, r22
   3108a:	5c 01       	movw	r10, r24
            h[3] = (b[3] - A[3][0] * h[0] - A[3][1] * h[1] - A[3][2] * h[2]) / A[3][3];
   3108c:	c1 54       	subi	r28, 0x41	; 65
   3108e:	df 4f       	sbci	r29, 0xFF	; 255
   31090:	28 81       	ld	r18, Y
   31092:	39 81       	ldd	r19, Y+1	; 0x01
   31094:	4a 81       	ldd	r20, Y+2	; 0x02
   31096:	5b 81       	ldd	r21, Y+3	; 0x03
   31098:	cf 5b       	subi	r28, 0xBF	; 191
   3109a:	d0 40       	sbci	r29, 0x00	; 0
   3109c:	6e 96       	adiw	r28, 0x1e	; 30
   3109e:	6c ad       	ldd	r22, Y+60	; 0x3c
   310a0:	7d ad       	ldd	r23, Y+61	; 0x3d
   310a2:	8e ad       	ldd	r24, Y+62	; 0x3e
   310a4:	9f ad       	ldd	r25, Y+63	; 0x3f
   310a6:	6e 97       	sbiw	r28, 0x1e	; 30
   310a8:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   310ac:	9b 01       	movw	r18, r22
   310ae:	ac 01       	movw	r20, r24
   310b0:	c5 54       	subi	r28, 0x45	; 69
   310b2:	df 4f       	sbci	r29, 0xFF	; 255
   310b4:	68 81       	ld	r22, Y
   310b6:	79 81       	ldd	r23, Y+1	; 0x01
   310b8:	8a 81       	ldd	r24, Y+2	; 0x02
   310ba:	9b 81       	ldd	r25, Y+3	; 0x03
   310bc:	cb 5b       	subi	r28, 0xBB	; 187
   310be:	d0 40       	sbci	r29, 0x00	; 0
   310c0:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   310c4:	6b 01       	movw	r12, r22
   310c6:	7c 01       	movw	r14, r24
   310c8:	cd 53       	subi	r28, 0x3D	; 61
   310ca:	df 4f       	sbci	r29, 0xFF	; 255
   310cc:	28 81       	ld	r18, Y
   310ce:	39 81       	ldd	r19, Y+1	; 0x01
   310d0:	4a 81       	ldd	r20, Y+2	; 0x02
   310d2:	5b 81       	ldd	r21, Y+3	; 0x03
   310d4:	c3 5c       	subi	r28, 0xC3	; 195
   310d6:	d0 40       	sbci	r29, 0x00	; 0
   310d8:	c3 01       	movw	r24, r6
   310da:	b2 01       	movw	r22, r4
   310dc:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   310e0:	9b 01       	movw	r18, r22
   310e2:	ac 01       	movw	r20, r24
   310e4:	c7 01       	movw	r24, r14
   310e6:	b6 01       	movw	r22, r12
   310e8:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   310ec:	6b 01       	movw	r12, r22
   310ee:	7c 01       	movw	r14, r24
   310f0:	c9 53       	subi	r28, 0x39	; 57
   310f2:	df 4f       	sbci	r29, 0xFF	; 255
   310f4:	28 81       	ld	r18, Y
   310f6:	39 81       	ldd	r19, Y+1	; 0x01
   310f8:	4a 81       	ldd	r20, Y+2	; 0x02
   310fa:	5b 81       	ldd	r21, Y+3	; 0x03
   310fc:	c7 5c       	subi	r28, 0xC7	; 199
   310fe:	d0 40       	sbci	r29, 0x00	; 0
   31100:	c5 01       	movw	r24, r10
   31102:	b4 01       	movw	r22, r8
   31104:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   31108:	9b 01       	movw	r18, r22
   3110a:	ac 01       	movw	r20, r24
   3110c:	c7 01       	movw	r24, r14
   3110e:	b6 01       	movw	r22, r12
   31110:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   31114:	c5 53       	subi	r28, 0x35	; 53
   31116:	df 4f       	sbci	r29, 0xFF	; 255
   31118:	28 81       	ld	r18, Y
   3111a:	39 81       	ldd	r19, Y+1	; 0x01
   3111c:	4a 81       	ldd	r20, Y+2	; 0x02
   3111e:	5b 81       	ldd	r21, Y+3	; 0x03
   31120:	cb 5c       	subi	r28, 0xCB	; 203
   31122:	d0 40       	sbci	r29, 0x00	; 0
   31124:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   31128:	6b 01       	movw	r12, r22
   3112a:	7c 01       	movw	r14, r24
   3112c:	11 50       	subi	r17, 0x01	; 1
            b[r] = -acc;
        }

        // Solve for h by a Gauss iteration method.
        float h[4] = { 0.f };
        for (uint8_t gauss_iter = 0; gauss_iter < 100; ++gauss_iter) {
   3112e:	09 f0       	breq	.+2      	; 0x31132 <gcode_M45(bool, signed char) [clone .constprop.63]+0x16f6>
   31130:	c9 ce       	rjmp	.-622    	; 0x30ec4 <gcode_M45(bool, signed char) [clone .constprop.63]+0x1488>

        // and update the current position with h.
        // It may be better to use the Levenberg-Marquart method here,
        // but because we are very close to the solution alread,
        // the simple Gauss-Newton non-linear Least Squares method works well enough.
        cntr[0] += h[0];
   31132:	6e 96       	adiw	r28, 0x1e	; 30
   31134:	2c ad       	ldd	r18, Y+60	; 0x3c
   31136:	3d ad       	ldd	r19, Y+61	; 0x3d
   31138:	4e ad       	ldd	r20, Y+62	; 0x3e
   3113a:	5f ad       	ldd	r21, Y+63	; 0x3f
   3113c:	6e 97       	sbiw	r28, 0x1e	; 30
   3113e:	c5 55       	subi	r28, 0x55	; 85
   31140:	df 4f       	sbci	r29, 0xFF	; 255
   31142:	68 81       	ld	r22, Y
   31144:	79 81       	ldd	r23, Y+1	; 0x01
   31146:	8a 81       	ldd	r24, Y+2	; 0x02
   31148:	9b 81       	ldd	r25, Y+3	; 0x03
   3114a:	cb 5a       	subi	r28, 0xAB	; 171
   3114c:	d0 40       	sbci	r29, 0x00	; 0
   3114e:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   31152:	60 93 3a 13 	sts	0x133A, r22	; 0x80133a <mbl+0x31>
   31156:	70 93 3b 13 	sts	0x133B, r23	; 0x80133b <mbl+0x32>
   3115a:	80 93 3c 13 	sts	0x133C, r24	; 0x80133c <mbl+0x33>
   3115e:	90 93 3d 13 	sts	0x133D, r25	; 0x80133d <mbl+0x34>
        cntr[1] += h[1];
   31162:	a3 01       	movw	r20, r6
   31164:	92 01       	movw	r18, r4
   31166:	c1 55       	subi	r28, 0x51	; 81
   31168:	df 4f       	sbci	r29, 0xFF	; 255
   3116a:	68 81       	ld	r22, Y
   3116c:	79 81       	ldd	r23, Y+1	; 0x01
   3116e:	8a 81       	ldd	r24, Y+2	; 0x02
   31170:	9b 81       	ldd	r25, Y+3	; 0x03
   31172:	cf 5a       	subi	r28, 0xAF	; 175
   31174:	d0 40       	sbci	r29, 0x00	; 0
   31176:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   3117a:	60 93 3e 13 	sts	0x133E, r22	; 0x80133e <mbl+0x35>
   3117e:	70 93 3f 13 	sts	0x133F, r23	; 0x80133f <mbl+0x36>
   31182:	80 93 40 13 	sts	0x1340, r24	; 0x801340 <mbl+0x37>
   31186:	90 93 41 13 	sts	0x1341, r25	; 0x801341 <mbl+0x38>
        a1 += h[2];
   3118a:	a5 01       	movw	r20, r10
   3118c:	94 01       	movw	r18, r8
   3118e:	a6 96       	adiw	r28, 0x26	; 38
   31190:	6c ad       	ldd	r22, Y+60	; 0x3c
   31192:	7d ad       	ldd	r23, Y+61	; 0x3d
   31194:	8e ad       	ldd	r24, Y+62	; 0x3e
   31196:	9f ad       	ldd	r25, Y+63	; 0x3f
   31198:	a6 97       	sbiw	r28, 0x26	; 38
   3119a:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   3119e:	a6 96       	adiw	r28, 0x26	; 38
   311a0:	6c af       	std	Y+60, r22	; 0x3c
   311a2:	7d af       	std	Y+61, r23	; 0x3d
   311a4:	8e af       	std	Y+62, r24	; 0x3e
   311a6:	9f af       	std	Y+63, r25	; 0x3f
   311a8:	a6 97       	sbiw	r28, 0x26	; 38
        a2 += h[3];
   311aa:	a7 01       	movw	r20, r14
   311ac:	96 01       	movw	r18, r12
   311ae:	a2 96       	adiw	r28, 0x22	; 34
   311b0:	6c ad       	ldd	r22, Y+60	; 0x3c
   311b2:	7d ad       	ldd	r23, Y+61	; 0x3d
   311b4:	8e ad       	ldd	r24, Y+62	; 0x3e
   311b6:	9f ad       	ldd	r25, Y+63	; 0x3f
   311b8:	a2 97       	sbiw	r28, 0x22	; 34
   311ba:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   311be:	a2 96       	adiw	r28, 0x22	; 34
   311c0:	6c af       	std	Y+60, r22	; 0x3c
   311c2:	7d af       	std	Y+61, r23	; 0x3d
   311c4:	8e af       	std	Y+62, r24	; 0x3e
   311c6:	9f af       	std	Y+63, r25	; 0x3f
   311c8:	a2 97       	sbiw	r28, 0x22	; 34
   311ca:	e6 96       	adiw	r28, 0x36	; 54
   311cc:	9f ad       	ldd	r25, Y+63	; 0x3f
   311ce:	e6 97       	sbiw	r28, 0x36	; 54
   311d0:	91 50       	subi	r25, 0x01	; 1
   311d2:	e6 96       	adiw	r28, 0x36	; 54
   311d4:	9f af       	std	Y+63, r25	; 0x3f
   311d6:	e6 97       	sbiw	r28, 0x36	; 54
    cntr[1] = 0.f;
    // Rotation of the machine X axis from the bed X axis.
    float a1 = 0;
    // Rotation of the machine Y axis from the bed Y axis.
    float a2 = 0;
    for (int8_t iter = 0; iter < 100; ++iter) {
   311d8:	91 11       	cpse	r25, r1
   311da:	e6 ca       	rjmp	.-2612   	; 0x307a8 <gcode_M45(bool, signed char) [clone .constprop.63]+0xd6c>
            SERIAL_ECHOLNPGM("");
        }
		#endif // SUPPORT_VERBOSITY
    }

    vec_x[0] =  cos(a1) * MACHINE_AXIS_SCALE_X;
   311dc:	a6 96       	adiw	r28, 0x26	; 38
   311de:	6c ad       	ldd	r22, Y+60	; 0x3c
   311e0:	7d ad       	ldd	r23, Y+61	; 0x3d
   311e2:	8e ad       	ldd	r24, Y+62	; 0x3e
   311e4:	9f ad       	ldd	r25, Y+63	; 0x3f
   311e6:	a6 97       	sbiw	r28, 0x26	; 38
   311e8:	0f 94 02 a6 	call	0x34c04	; 0x34c04 <cos>
   311ec:	60 93 2a 13 	sts	0x132A, r22	; 0x80132a <mbl+0x21>
   311f0:	70 93 2b 13 	sts	0x132B, r23	; 0x80132b <mbl+0x22>
   311f4:	80 93 2c 13 	sts	0x132C, r24	; 0x80132c <mbl+0x23>
   311f8:	90 93 2d 13 	sts	0x132D, r25	; 0x80132d <mbl+0x24>
    vec_x[1] =  sin(a1) * MACHINE_AXIS_SCALE_X;
   311fc:	a6 96       	adiw	r28, 0x26	; 38
   311fe:	6c ad       	ldd	r22, Y+60	; 0x3c
   31200:	7d ad       	ldd	r23, Y+61	; 0x3d
   31202:	8e ad       	ldd	r24, Y+62	; 0x3e
   31204:	9f ad       	ldd	r25, Y+63	; 0x3f
   31206:	a6 97       	sbiw	r28, 0x26	; 38
   31208:	0f 94 c8 a8 	call	0x35190	; 0x35190 <sin>
   3120c:	60 93 2e 13 	sts	0x132E, r22	; 0x80132e <mbl+0x25>
   31210:	70 93 2f 13 	sts	0x132F, r23	; 0x80132f <mbl+0x26>
   31214:	80 93 30 13 	sts	0x1330, r24	; 0x801330 <mbl+0x27>
   31218:	90 93 31 13 	sts	0x1331, r25	; 0x801331 <mbl+0x28>
    vec_y[0] = -sin(a2) * MACHINE_AXIS_SCALE_Y;
   3121c:	a2 96       	adiw	r28, 0x22	; 34
   3121e:	6c ad       	ldd	r22, Y+60	; 0x3c
   31220:	7d ad       	ldd	r23, Y+61	; 0x3d
   31222:	8e ad       	ldd	r24, Y+62	; 0x3e
   31224:	9f ad       	ldd	r25, Y+63	; 0x3f
   31226:	a2 97       	sbiw	r28, 0x22	; 34
   31228:	0f 94 c8 a8 	call	0x35190	; 0x35190 <sin>
   3122c:	90 58       	subi	r25, 0x80	; 128
   3122e:	60 93 32 13 	sts	0x1332, r22	; 0x801332 <mbl+0x29>
   31232:	70 93 33 13 	sts	0x1333, r23	; 0x801333 <mbl+0x2a>
   31236:	80 93 34 13 	sts	0x1334, r24	; 0x801334 <mbl+0x2b>
   3123a:	90 93 35 13 	sts	0x1335, r25	; 0x801335 <mbl+0x2c>
    vec_y[1] =  cos(a2) * MACHINE_AXIS_SCALE_Y;
   3123e:	a2 96       	adiw	r28, 0x22	; 34
   31240:	6c ad       	ldd	r22, Y+60	; 0x3c
   31242:	7d ad       	ldd	r23, Y+61	; 0x3d
   31244:	8e ad       	ldd	r24, Y+62	; 0x3e
   31246:	9f ad       	ldd	r25, Y+63	; 0x3f
   31248:	a2 97       	sbiw	r28, 0x22	; 34
   3124a:	0f 94 02 a6 	call	0x34c04	; 0x34c04 <cos>
   3124e:	60 93 36 13 	sts	0x1336, r22	; 0x801336 <mbl+0x2d>
   31252:	70 93 37 13 	sts	0x1337, r23	; 0x801337 <mbl+0x2e>
   31256:	80 93 38 13 	sts	0x1338, r24	; 0x801338 <mbl+0x2f>
   3125a:	90 93 39 13 	sts	0x1339, r25	; 0x801339 <mbl+0x30>

    BedSkewOffsetDetectionResultType result = BED_SKEW_OFFSET_DETECTION_PERFECT;
    {
        angleDiff = fabs(a2 - a1);
   3125e:	a6 96       	adiw	r28, 0x26	; 38
   31260:	2c ad       	ldd	r18, Y+60	; 0x3c
   31262:	3d ad       	ldd	r19, Y+61	; 0x3d
   31264:	4e ad       	ldd	r20, Y+62	; 0x3e
   31266:	5f ad       	ldd	r21, Y+63	; 0x3f
   31268:	a6 97       	sbiw	r28, 0x26	; 38
   3126a:	a2 96       	adiw	r28, 0x22	; 34
   3126c:	6c ad       	ldd	r22, Y+60	; 0x3c
   3126e:	7d ad       	ldd	r23, Y+61	; 0x3d
   31270:	8e ad       	ldd	r24, Y+62	; 0x3e
   31272:	9f ad       	ldd	r25, Y+63	; 0x3f
   31274:	a2 97       	sbiw	r28, 0x22	; 34
   31276:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   3127a:	4b 01       	movw	r8, r22
   3127c:	5c 01       	movw	r10, r24
   3127e:	7c 01       	movw	r14, r24
   31280:	6b 01       	movw	r12, r22
   31282:	e8 94       	clt
   31284:	f7 f8       	bld	r15, 7
        /// XY skew and Y-bed skew
        DBG(_n("Measured skews: %f %f\n"), degrees(a2 - a1), degrees(a2));
   31286:	21 ee       	ldi	r18, 0xE1	; 225
   31288:	3e e2       	ldi	r19, 0x2E	; 46
   3128a:	45 e6       	ldi	r20, 0x65	; 101
   3128c:	52 e4       	ldi	r21, 0x42	; 66
   3128e:	a2 96       	adiw	r28, 0x22	; 34
   31290:	6c ad       	ldd	r22, Y+60	; 0x3c
   31292:	7d ad       	ldd	r23, Y+61	; 0x3d
   31294:	8e ad       	ldd	r24, Y+62	; 0x3e
   31296:	9f ad       	ldd	r25, Y+63	; 0x3f
   31298:	a2 97       	sbiw	r28, 0x22	; 34
   3129a:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   3129e:	9f 93       	push	r25
   312a0:	8f 93       	push	r24
   312a2:	7f 93       	push	r23
   312a4:	6f 93       	push	r22
   312a6:	21 ee       	ldi	r18, 0xE1	; 225
   312a8:	3e e2       	ldi	r19, 0x2E	; 46
   312aa:	45 e6       	ldi	r20, 0x65	; 101
   312ac:	52 e4       	ldi	r21, 0x42	; 66
   312ae:	c5 01       	movw	r24, r10
   312b0:	b4 01       	movw	r22, r8
   312b2:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   312b6:	9f 93       	push	r25
   312b8:	8f 93       	push	r24
   312ba:	7f 93       	push	r23
   312bc:	6f 93       	push	r22
   312be:	85 e6       	ldi	r24, 0x65	; 101
   312c0:	9b e6       	ldi	r25, 0x6B	; 107
   312c2:	9f 93       	push	r25
   312c4:	8f 93       	push	r24
   312c6:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
        if (previous_value != value) {
            eeprom_float_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_float(dst, value);
   312ca:	b7 01       	movw	r22, r14
   312cc:	a6 01       	movw	r20, r12
   312ce:	80 e6       	ldi	r24, 0x60	; 96
   312d0:	9f e0       	ldi	r25, 0x0F	; 15
   312d2:	0f 94 16 a4 	call	0x3482c	; 0x3482c <eeprom_update_dword>
        eeprom_update_float_notify((float *)(EEPROM_XYZ_CAL_SKEW), angleDiff); //storing xyz cal. skew to be able to show in support menu later
        if (angleDiff > bed_skew_angle_mild)
   312d6:	0f b6       	in	r0, 0x3f	; 63
   312d8:	f8 94       	cli
   312da:	de bf       	out	0x3e, r29	; 62
   312dc:	0f be       	out	0x3f, r0	; 63
   312de:	cd bf       	out	0x3d, r28	; 61
   312e0:	2f e1       	ldi	r18, 0x1F	; 31
   312e2:	32 e4       	ldi	r19, 0x42	; 66
   312e4:	49 e0       	ldi	r20, 0x09	; 9
   312e6:	5b e3       	ldi	r21, 0x3B	; 59
   312e8:	c7 01       	movw	r24, r14
   312ea:	b6 01       	movw	r22, r12
   312ec:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
    vec_x[0] =  cos(a1) * MACHINE_AXIS_SCALE_X;
    vec_x[1] =  sin(a1) * MACHINE_AXIS_SCALE_X;
    vec_y[0] = -sin(a2) * MACHINE_AXIS_SCALE_Y;
    vec_y[1] =  cos(a2) * MACHINE_AXIS_SCALE_Y;

    BedSkewOffsetDetectionResultType result = BED_SKEW_OFFSET_DETECTION_PERFECT;
   312f0:	10 e0       	ldi	r17, 0x00	; 0
    {
        angleDiff = fabs(a2 - a1);
        /// XY skew and Y-bed skew
        DBG(_n("Measured skews: %f %f\n"), degrees(a2 - a1), degrees(a2));
        eeprom_update_float_notify((float *)(EEPROM_XYZ_CAL_SKEW), angleDiff); //storing xyz cal. skew to be able to show in support menu later
        if (angleDiff > bed_skew_angle_mild)
   312f2:	18 16       	cp	r1, r24
   312f4:	64 f4       	brge	.+24     	; 0x3130e <gcode_M45(bool, signed char) [clone .constprop.63]+0x18d2>
            result = (angleDiff > bed_skew_angle_extreme) ?
   312f6:	25 e3       	ldi	r18, 0x35	; 53
   312f8:	3a ef       	ldi	r19, 0xFA	; 250
   312fa:	4e e8       	ldi	r20, 0x8E	; 142
   312fc:	5b e3       	ldi	r21, 0x3B	; 59
   312fe:	c7 01       	movw	r24, r14
   31300:	b6 01       	movw	r22, r12
   31302:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   31306:	12 e0       	ldi	r17, 0x02	; 2
   31308:	18 16       	cp	r1, r24
   3130a:	0c f0       	brlt	.+2      	; 0x3130e <gcode_M45(bool, signed char) [clone .constprop.63]+0x18d2>
   3130c:	11 e0       	ldi	r17, 0x01	; 1
                BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME :
                BED_SKEW_OFFSET_DETECTION_SKEW_MILD;
        if (fabs(a1) > bed_skew_angle_extreme ||
   3130e:	25 e3       	ldi	r18, 0x35	; 53
   31310:	3a ef       	ldi	r19, 0xFA	; 250
   31312:	4e e8       	ldi	r20, 0x8E	; 142
   31314:	5b e3       	ldi	r21, 0x3B	; 59
   31316:	a6 96       	adiw	r28, 0x26	; 38
   31318:	6c ad       	ldd	r22, Y+60	; 0x3c
   3131a:	7d ad       	ldd	r23, Y+61	; 0x3d
   3131c:	8e ad       	ldd	r24, Y+62	; 0x3e
   3131e:	9f ad       	ldd	r25, Y+63	; 0x3f
   31320:	a6 97       	sbiw	r28, 0x26	; 38
   31322:	9f 77       	andi	r25, 0x7F	; 127
   31324:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   31328:	18 16       	cp	r1, r24
   3132a:	0c f4       	brge	.+2      	; 0x3132e <gcode_M45(bool, signed char) [clone .constprop.63]+0x18f2>
   3132c:	67 c4       	rjmp	.+2254   	; 0x31bfc <gcode_M45(bool, signed char) [clone .constprop.63]+0x21c0>
   3132e:	25 e3       	ldi	r18, 0x35	; 53
   31330:	3a ef       	ldi	r19, 0xFA	; 250
   31332:	4e e8       	ldi	r20, 0x8E	; 142
   31334:	5b e3       	ldi	r21, 0x3B	; 59
   31336:	a2 96       	adiw	r28, 0x22	; 34
   31338:	6c ad       	ldd	r22, Y+60	; 0x3c
   3133a:	7d ad       	ldd	r23, Y+61	; 0x3d
   3133c:	8e ad       	ldd	r24, Y+62	; 0x3e
   3133e:	9f ad       	ldd	r25, Y+63	; 0x3f
   31340:	a2 97       	sbiw	r28, 0x22	; 34
   31342:	9f 77       	andi	r25, 0x7F	; 127
   31344:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   31348:	18 16       	cp	r1, r24
   3134a:	0c f4       	brge	.+2      	; 0x3134e <gcode_M45(bool, signed char) [clone .constprop.63]+0x1912>
   3134c:	57 c4       	rjmp	.+2222   	; 0x31bfc <gcode_M45(bool, signed char) [clone .constprop.63]+0x21c0>
        SERIAL_ECHOLNPGM("Error after correction: ");
    }
	#endif // SUPPORT_VERBOSITY
    // Measure the error after correction.
    for (uint8_t i = 0; i < npts; ++i) {
        float x = vec_x[0] * measured_pts[i * 2] + vec_y[0] * measured_pts[i * 2 + 1] + cntr[0];
   3134e:	20 91 2a 13 	lds	r18, 0x132A	; 0x80132a <mbl+0x21>
   31352:	30 91 2b 13 	lds	r19, 0x132B	; 0x80132b <mbl+0x22>
   31356:	40 91 2c 13 	lds	r20, 0x132C	; 0x80132c <mbl+0x23>
   3135a:	50 91 2d 13 	lds	r21, 0x132D	; 0x80132d <mbl+0x24>
   3135e:	ae 96       	adiw	r28, 0x2e	; 46
   31360:	2c af       	std	Y+60, r18	; 0x3c
   31362:	3d af       	std	Y+61, r19	; 0x3d
   31364:	4e af       	std	Y+62, r20	; 0x3e
   31366:	5f af       	std	Y+63, r21	; 0x3f
   31368:	ae 97       	sbiw	r28, 0x2e	; 46
   3136a:	80 91 32 13 	lds	r24, 0x1332	; 0x801332 <mbl+0x29>
   3136e:	90 91 33 13 	lds	r25, 0x1333	; 0x801333 <mbl+0x2a>
   31372:	a0 91 34 13 	lds	r26, 0x1334	; 0x801334 <mbl+0x2b>
   31376:	b0 91 35 13 	lds	r27, 0x1335	; 0x801335 <mbl+0x2c>
   3137a:	e9 96       	adiw	r28, 0x39	; 57
   3137c:	8c af       	std	Y+60, r24	; 0x3c
   3137e:	9d af       	std	Y+61, r25	; 0x3d
   31380:	ae af       	std	Y+62, r26	; 0x3e
   31382:	bf af       	std	Y+63, r27	; 0x3f
   31384:	e9 97       	sbiw	r28, 0x39	; 57
   31386:	20 91 3a 13 	lds	r18, 0x133A	; 0x80133a <mbl+0x31>
   3138a:	30 91 3b 13 	lds	r19, 0x133B	; 0x80133b <mbl+0x32>
   3138e:	40 91 3c 13 	lds	r20, 0x133C	; 0x80133c <mbl+0x33>
   31392:	50 91 3d 13 	lds	r21, 0x133D	; 0x80133d <mbl+0x34>
   31396:	e4 96       	adiw	r28, 0x34	; 52
   31398:	2c af       	std	Y+60, r18	; 0x3c
   3139a:	3d af       	std	Y+61, r19	; 0x3d
   3139c:	4e af       	std	Y+62, r20	; 0x3e
   3139e:	5f af       	std	Y+63, r21	; 0x3f
   313a0:	e4 97       	sbiw	r28, 0x34	; 52
        float y = vec_x[1] * measured_pts[i * 2] + vec_y[1] * measured_pts[i * 2 + 1] + cntr[1];
   313a2:	80 91 2e 13 	lds	r24, 0x132E	; 0x80132e <mbl+0x25>
   313a6:	90 91 2f 13 	lds	r25, 0x132F	; 0x80132f <mbl+0x26>
   313aa:	a0 91 30 13 	lds	r26, 0x1330	; 0x801330 <mbl+0x27>
   313ae:	b0 91 31 13 	lds	r27, 0x1331	; 0x801331 <mbl+0x28>
   313b2:	ed 96       	adiw	r28, 0x3d	; 61
   313b4:	8c af       	std	Y+60, r24	; 0x3c
   313b6:	9d af       	std	Y+61, r25	; 0x3d
   313b8:	ae af       	std	Y+62, r26	; 0x3e
   313ba:	bf af       	std	Y+63, r27	; 0x3f
   313bc:	ed 97       	sbiw	r28, 0x3d	; 61
   313be:	20 91 36 13 	lds	r18, 0x1336	; 0x801336 <mbl+0x2d>
   313c2:	30 91 37 13 	lds	r19, 0x1337	; 0x801337 <mbl+0x2e>
   313c6:	40 91 38 13 	lds	r20, 0x1338	; 0x801338 <mbl+0x2f>
   313ca:	50 91 39 13 	lds	r21, 0x1339	; 0x801339 <mbl+0x30>
   313ce:	c3 58       	subi	r28, 0x83	; 131
   313d0:	df 4f       	sbci	r29, 0xFF	; 255
   313d2:	28 83       	st	Y, r18
   313d4:	39 83       	std	Y+1, r19	; 0x01
   313d6:	4a 83       	std	Y+2, r20	; 0x02
   313d8:	5b 83       	std	Y+3, r21	; 0x03
   313da:	cd 57       	subi	r28, 0x7D	; 125
   313dc:	d0 40       	sbci	r29, 0x00	; 0
   313de:	80 91 3e 13 	lds	r24, 0x133E	; 0x80133e <mbl+0x35>
   313e2:	90 91 3f 13 	lds	r25, 0x133F	; 0x80133f <mbl+0x36>
   313e6:	a0 91 40 13 	lds	r26, 0x1340	; 0x801340 <mbl+0x37>
   313ea:	b0 91 41 13 	lds	r27, 0x1341	; 0x801341 <mbl+0x38>
   313ee:	cf 57       	subi	r28, 0x7F	; 127
   313f0:	df 4f       	sbci	r29, 0xFF	; 255
   313f2:	88 83       	st	Y, r24
   313f4:	99 83       	std	Y+1, r25	; 0x01
   313f6:	aa 83       	std	Y+2, r26	; 0x02
   313f8:	bb 83       	std	Y+3, r27	; 0x03
   313fa:	c1 58       	subi	r28, 0x81	; 129
   313fc:	d0 40       	sbci	r29, 0x00	; 0
   313fe:	a0 e0       	ldi	r26, 0x00	; 0
   31400:	bc e9       	ldi	r27, 0x9C	; 156
   31402:	6c 96       	adiw	r28, 0x1c	; 28
   31404:	bf af       	std	Y+63, r27	; 0x3f
   31406:	ae af       	std	Y+62, r26	; 0x3e
   31408:	6c 97       	sbiw	r28, 0x1c	; 28
   3140a:	89 e0       	ldi	r24, 0x09	; 9
   3140c:	28 2e       	mov	r2, r24
   3140e:	83 e1       	ldi	r24, 0x13	; 19
   31410:	38 2e       	mov	r3, r24
        SERIAL_ECHOLNPGM("Error after correction: ");
    }
	#endif // SUPPORT_VERBOSITY
    // Measure the error after correction.
    for (uint8_t i = 0; i < npts; ++i) {
        float x = vec_x[0] * measured_pts[i * 2] + vec_y[0] * measured_pts[i * 2 + 1] + cntr[0];
   31412:	f1 01       	movw	r30, r2
   31414:	c1 80       	ldd	r12, Z+1	; 0x01
   31416:	d2 80       	ldd	r13, Z+2	; 0x02
   31418:	e3 80       	ldd	r14, Z+3	; 0x03
   3141a:	f4 80       	ldd	r15, Z+4	; 0x04
   3141c:	45 80       	ldd	r4, Z+5	; 0x05
   3141e:	56 80       	ldd	r5, Z+6	; 0x06
   31420:	67 80       	ldd	r6, Z+7	; 0x07
   31422:	70 84       	ldd	r7, Z+8	; 0x08
        float y = vec_x[1] * measured_pts[i * 2] + vec_y[1] * measured_pts[i * 2 + 1] + cntr[1];
        float errX = pgm_read_float(true_pts + i * 2) - x;
   31424:	6c 96       	adiw	r28, 0x1c	; 28
   31426:	ee ad       	ldd	r30, Y+62	; 0x3e
   31428:	ff ad       	ldd	r31, Y+63	; 0x3f
   3142a:	6c 97       	sbiw	r28, 0x1c	; 28
   3142c:	25 91       	lpm	r18, Z+
   3142e:	35 91       	lpm	r19, Z+
   31430:	45 91       	lpm	r20, Z+
   31432:	54 91       	lpm	r21, Z
   31434:	cb 57       	subi	r28, 0x7B	; 123
   31436:	df 4f       	sbci	r29, 0xFF	; 255
   31438:	28 83       	st	Y, r18
   3143a:	39 83       	std	Y+1, r19	; 0x01
   3143c:	4a 83       	std	Y+2, r20	; 0x02
   3143e:	5b 83       	std	Y+3, r21	; 0x03
   31440:	c5 58       	subi	r28, 0x85	; 133
   31442:	d0 40       	sbci	r29, 0x00	; 0
        float errY = pgm_read_float(true_pts + i * 2 + 1) - y;
   31444:	6c 96       	adiw	r28, 0x1c	; 28
   31446:	ee ad       	ldd	r30, Y+62	; 0x3e
   31448:	ff ad       	ldd	r31, Y+63	; 0x3f
   3144a:	6c 97       	sbiw	r28, 0x1c	; 28
   3144c:	34 96       	adiw	r30, 0x04	; 4
   3144e:	85 90       	lpm	r8, Z+
   31450:	95 90       	lpm	r9, Z+
   31452:	a5 90       	lpm	r10, Z+
   31454:	b4 90       	lpm	r11, Z
    }
	#endif // SUPPORT_VERBOSITY
    // Measure the error after correction.
    for (uint8_t i = 0; i < npts; ++i) {
        float x = vec_x[0] * measured_pts[i * 2] + vec_y[0] * measured_pts[i * 2 + 1] + cntr[0];
        float y = vec_x[1] * measured_pts[i * 2] + vec_y[1] * measured_pts[i * 2 + 1] + cntr[1];
   31456:	ed 96       	adiw	r28, 0x3d	; 61
   31458:	2c ad       	ldd	r18, Y+60	; 0x3c
   3145a:	3d ad       	ldd	r19, Y+61	; 0x3d
   3145c:	4e ad       	ldd	r20, Y+62	; 0x3e
   3145e:	5f ad       	ldd	r21, Y+63	; 0x3f
   31460:	ed 97       	sbiw	r28, 0x3d	; 61
   31462:	c7 01       	movw	r24, r14
   31464:	b6 01       	movw	r22, r12
   31466:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   3146a:	c7 57       	subi	r28, 0x77	; 119
   3146c:	df 4f       	sbci	r29, 0xFF	; 255
   3146e:	68 83       	st	Y, r22
   31470:	79 83       	std	Y+1, r23	; 0x01
   31472:	8a 83       	std	Y+2, r24	; 0x02
   31474:	9b 83       	std	Y+3, r25	; 0x03
   31476:	c9 58       	subi	r28, 0x89	; 137
   31478:	d0 40       	sbci	r29, 0x00	; 0
   3147a:	c3 58       	subi	r28, 0x83	; 131
   3147c:	df 4f       	sbci	r29, 0xFF	; 255
   3147e:	28 81       	ld	r18, Y
   31480:	39 81       	ldd	r19, Y+1	; 0x01
   31482:	4a 81       	ldd	r20, Y+2	; 0x02
   31484:	5b 81       	ldd	r21, Y+3	; 0x03
   31486:	cd 57       	subi	r28, 0x7D	; 125
   31488:	d0 40       	sbci	r29, 0x00	; 0
   3148a:	c3 01       	movw	r24, r6
   3148c:	b2 01       	movw	r22, r4
   3148e:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   31492:	9b 01       	movw	r18, r22
   31494:	ac 01       	movw	r20, r24
   31496:	c7 57       	subi	r28, 0x77	; 119
   31498:	df 4f       	sbci	r29, 0xFF	; 255
   3149a:	68 81       	ld	r22, Y
   3149c:	79 81       	ldd	r23, Y+1	; 0x01
   3149e:	8a 81       	ldd	r24, Y+2	; 0x02
   314a0:	9b 81       	ldd	r25, Y+3	; 0x03
   314a2:	c9 58       	subi	r28, 0x89	; 137
   314a4:	d0 40       	sbci	r29, 0x00	; 0
   314a6:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   314aa:	cf 57       	subi	r28, 0x7F	; 127
   314ac:	df 4f       	sbci	r29, 0xFF	; 255
   314ae:	28 81       	ld	r18, Y
   314b0:	39 81       	ldd	r19, Y+1	; 0x01
   314b2:	4a 81       	ldd	r20, Y+2	; 0x02
   314b4:	5b 81       	ldd	r21, Y+3	; 0x03
   314b6:	c1 58       	subi	r28, 0x81	; 129
   314b8:	d0 40       	sbci	r29, 0x00	; 0
   314ba:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   314be:	9b 01       	movw	r18, r22
   314c0:	ac 01       	movw	r20, r24
        float errX = pgm_read_float(true_pts + i * 2) - x;
        float errY = pgm_read_float(true_pts + i * 2 + 1) - y;
   314c2:	c5 01       	movw	r24, r10
   314c4:	b4 01       	movw	r22, r8
   314c6:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   314ca:	4b 01       	movw	r8, r22
   314cc:	5c 01       	movw	r10, r24
        SERIAL_ECHOLNPGM("Error after correction: ");
    }
	#endif // SUPPORT_VERBOSITY
    // Measure the error after correction.
    for (uint8_t i = 0; i < npts; ++i) {
        float x = vec_x[0] * measured_pts[i * 2] + vec_y[0] * measured_pts[i * 2 + 1] + cntr[0];
   314ce:	a7 01       	movw	r20, r14
   314d0:	96 01       	movw	r18, r12
   314d2:	ae 96       	adiw	r28, 0x2e	; 46
   314d4:	6c ad       	ldd	r22, Y+60	; 0x3c
   314d6:	7d ad       	ldd	r23, Y+61	; 0x3d
   314d8:	8e ad       	ldd	r24, Y+62	; 0x3e
   314da:	9f ad       	ldd	r25, Y+63	; 0x3f
   314dc:	ae 97       	sbiw	r28, 0x2e	; 46
   314de:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   314e2:	6b 01       	movw	r12, r22
   314e4:	7c 01       	movw	r14, r24
   314e6:	a3 01       	movw	r20, r6
   314e8:	92 01       	movw	r18, r4
   314ea:	e9 96       	adiw	r28, 0x39	; 57
   314ec:	6c ad       	ldd	r22, Y+60	; 0x3c
   314ee:	7d ad       	ldd	r23, Y+61	; 0x3d
   314f0:	8e ad       	ldd	r24, Y+62	; 0x3e
   314f2:	9f ad       	ldd	r25, Y+63	; 0x3f
   314f4:	e9 97       	sbiw	r28, 0x39	; 57
   314f6:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   314fa:	9b 01       	movw	r18, r22
   314fc:	ac 01       	movw	r20, r24
   314fe:	c7 01       	movw	r24, r14
   31500:	b6 01       	movw	r22, r12
   31502:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   31506:	e4 96       	adiw	r28, 0x34	; 52
   31508:	2c ad       	ldd	r18, Y+60	; 0x3c
   3150a:	3d ad       	ldd	r19, Y+61	; 0x3d
   3150c:	4e ad       	ldd	r20, Y+62	; 0x3e
   3150e:	5f ad       	ldd	r21, Y+63	; 0x3f
   31510:	e4 97       	sbiw	r28, 0x34	; 52
   31512:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   31516:	9b 01       	movw	r18, r22
   31518:	ac 01       	movw	r20, r24
        float y = vec_x[1] * measured_pts[i * 2] + vec_y[1] * measured_pts[i * 2 + 1] + cntr[1];
        float errX = pgm_read_float(true_pts + i * 2) - x;
   3151a:	cb 57       	subi	r28, 0x7B	; 123
   3151c:	df 4f       	sbci	r29, 0xFF	; 255
   3151e:	68 81       	ld	r22, Y
   31520:	79 81       	ldd	r23, Y+1	; 0x01
   31522:	8a 81       	ldd	r24, Y+2	; 0x02
   31524:	9b 81       	ldd	r25, Y+3	; 0x03
   31526:	c5 58       	subi	r28, 0x85	; 133
   31528:	d0 40       	sbci	r29, 0x00	; 0
   3152a:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
        float errY = pgm_read_float(true_pts + i * 2 + 1) - y;
        float err = hypot(errX, errY);
   3152e:	a5 01       	movw	r20, r10
   31530:	94 01       	movw	r18, r8
   31532:	0f 94 a4 a7 	call	0x34f48	; 0x34f48 <hypot>
		}
		else {
			#ifdef SUPPORT_VERBOSITY
			if(verbosity_level >=20 ) SERIAL_ECHOPGM("Point not on first row");
			#endif // SUPPORT_VERBOSITY
			if (err > BED_CALIBRATION_POINT_OFFSET_MAX_EUCLIDIAN) {
   31536:	2d ec       	ldi	r18, 0xCD	; 205
   31538:	3c ec       	ldi	r19, 0xCC	; 204
   3153a:	4c e4       	ldi	r20, 0x4C	; 76
   3153c:	5f e3       	ldi	r21, 0x3F	; 63
   3153e:	0f 94 91 a7 	call	0x34f22	; 0x34f22 <__gesf2>
   31542:	18 16       	cp	r1, r24
   31544:	0c f4       	brge	.+2      	; 0x31548 <gcode_M45(bool, signed char) [clone .constprop.63]+0x1b0c>
				result = BED_SKEW_OFFSET_DETECTION_FITTING_FAILED;
   31546:	1e ef       	ldi	r17, 0xFE	; 254
   31548:	38 e0       	ldi	r19, 0x08	; 8
   3154a:	23 0e       	add	r2, r19
   3154c:	31 1c       	adc	r3, r1
   3154e:	6c 96       	adiw	r28, 0x1c	; 28
   31550:	4e ad       	ldd	r20, Y+62	; 0x3e
   31552:	5f ad       	ldd	r21, Y+63	; 0x3f
   31554:	6c 97       	sbiw	r28, 0x1c	; 28
   31556:	48 5f       	subi	r20, 0xF8	; 248
   31558:	5f 4f       	sbci	r21, 0xFF	; 255
   3155a:	6c 96       	adiw	r28, 0x1c	; 28
   3155c:	5f af       	std	Y+63, r21	; 0x3f
   3155e:	4e af       	std	Y+62, r20	; 0x3e
   31560:	6c 97       	sbiw	r28, 0x1c	; 28

        SERIAL_ECHOLNPGM("Error after correction: ");
    }
	#endif // SUPPORT_VERBOSITY
    // Measure the error after correction.
    for (uint8_t i = 0; i < npts; ++i) {
   31562:	a8 96       	adiw	r28, 0x28	; 40
   31564:	8e ad       	ldd	r24, Y+62	; 0x3e
   31566:	9f ad       	ldd	r25, Y+63	; 0x3f
   31568:	a8 97       	sbiw	r28, 0x28	; 40
   3156a:	82 15       	cp	r24, r2
   3156c:	93 05       	cpc	r25, r3
   3156e:	09 f0       	breq	.+2      	; 0x31572 <gcode_M45(bool, signed char) [clone .constprop.63]+0x1b36>
   31570:	50 cf       	rjmp	.-352    	; 0x31412 <gcode_M45(bool, signed char) [clone .constprop.63]+0x19d6>
		MYSERIAL.println(BED_CALIBRATION_POINT_OFFSET_MAX_EUCLIDIAN);
		SERIAL_ECHOLNPGM("");
	}
	#endif // SUPPORT_VERBOSITY

    if (result == BED_SKEW_OFFSET_DETECTION_PERFECT) {
   31572:	11 11       	cpse	r17, r1
   31574:	62 c1       	rjmp	.+708    	; 0x3183a <gcode_M45(bool, signed char) [clone .constprop.63]+0x1dfe>
		#ifdef SUPPORT_VERBOSITY
		if (verbosity_level > 0)
            SERIAL_ECHOLNPGM("Very little skew detected. Orthogonalizing the axes.");
		#endif // SUPPORT_VERBOSITY
		// Orthogonalize the axes.
        a1 = 0.5f * (a1 + a2);
   31576:	a2 96       	adiw	r28, 0x22	; 34
   31578:	2c ad       	ldd	r18, Y+60	; 0x3c
   3157a:	3d ad       	ldd	r19, Y+61	; 0x3d
   3157c:	4e ad       	ldd	r20, Y+62	; 0x3e
   3157e:	5f ad       	ldd	r21, Y+63	; 0x3f
   31580:	a2 97       	sbiw	r28, 0x22	; 34
   31582:	a6 96       	adiw	r28, 0x26	; 38
   31584:	6c ad       	ldd	r22, Y+60	; 0x3c
   31586:	7d ad       	ldd	r23, Y+61	; 0x3d
   31588:	8e ad       	ldd	r24, Y+62	; 0x3e
   3158a:	9f ad       	ldd	r25, Y+63	; 0x3f
   3158c:	a6 97       	sbiw	r28, 0x26	; 38
   3158e:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   31592:	20 e0       	ldi	r18, 0x00	; 0
   31594:	30 e0       	ldi	r19, 0x00	; 0
   31596:	40 e0       	ldi	r20, 0x00	; 0
   31598:	5f e3       	ldi	r21, 0x3F	; 63
   3159a:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   3159e:	6b 01       	movw	r12, r22
   315a0:	7c 01       	movw	r14, r24
        vec_x[0] =  cos(a1) * MACHINE_AXIS_SCALE_X;
   315a2:	0f 94 02 a6 	call	0x34c04	; 0x34c04 <cos>
   315a6:	a2 96       	adiw	r28, 0x22	; 34
   315a8:	6c af       	std	Y+60, r22	; 0x3c
   315aa:	7d af       	std	Y+61, r23	; 0x3d
   315ac:	8e af       	std	Y+62, r24	; 0x3e
   315ae:	9f af       	std	Y+63, r25	; 0x3f
   315b0:	a2 97       	sbiw	r28, 0x22	; 34
   315b2:	60 93 2a 13 	sts	0x132A, r22	; 0x80132a <mbl+0x21>
   315b6:	70 93 2b 13 	sts	0x132B, r23	; 0x80132b <mbl+0x22>
   315ba:	80 93 2c 13 	sts	0x132C, r24	; 0x80132c <mbl+0x23>
   315be:	90 93 2d 13 	sts	0x132D, r25	; 0x80132d <mbl+0x24>
        vec_x[1] =  sin(a1) * MACHINE_AXIS_SCALE_X;
   315c2:	c7 01       	movw	r24, r14
   315c4:	b6 01       	movw	r22, r12
   315c6:	0f 94 c8 a8 	call	0x35190	; 0x35190 <sin>
   315ca:	a6 96       	adiw	r28, 0x26	; 38
   315cc:	6c af       	std	Y+60, r22	; 0x3c
   315ce:	7d af       	std	Y+61, r23	; 0x3d
   315d0:	8e af       	std	Y+62, r24	; 0x3e
   315d2:	9f af       	std	Y+63, r25	; 0x3f
   315d4:	a6 97       	sbiw	r28, 0x26	; 38
   315d6:	60 93 2e 13 	sts	0x132E, r22	; 0x80132e <mbl+0x25>
   315da:	70 93 2f 13 	sts	0x132F, r23	; 0x80132f <mbl+0x26>
   315de:	80 93 30 13 	sts	0x1330, r24	; 0x801330 <mbl+0x27>
   315e2:	90 93 31 13 	sts	0x1331, r25	; 0x801331 <mbl+0x28>
        vec_y[0] = -sin(a1) * MACHINE_AXIS_SCALE_Y;
   315e6:	9b 01       	movw	r18, r22
   315e8:	ac 01       	movw	r20, r24
   315ea:	50 58       	subi	r21, 0x80	; 128
   315ec:	aa 96       	adiw	r28, 0x2a	; 42
   315ee:	2c af       	std	Y+60, r18	; 0x3c
   315f0:	3d af       	std	Y+61, r19	; 0x3d
   315f2:	4e af       	std	Y+62, r20	; 0x3e
   315f4:	5f af       	std	Y+63, r21	; 0x3f
   315f6:	aa 97       	sbiw	r28, 0x2a	; 42
   315f8:	20 93 32 13 	sts	0x1332, r18	; 0x801332 <mbl+0x29>
   315fc:	30 93 33 13 	sts	0x1333, r19	; 0x801333 <mbl+0x2a>
   31600:	40 93 34 13 	sts	0x1334, r20	; 0x801334 <mbl+0x2b>
   31604:	50 93 35 13 	sts	0x1335, r21	; 0x801335 <mbl+0x2c>
        vec_y[1] =  cos(a1) * MACHINE_AXIS_SCALE_Y;
   31608:	a2 96       	adiw	r28, 0x22	; 34
   3160a:	8c ad       	ldd	r24, Y+60	; 0x3c
   3160c:	9d ad       	ldd	r25, Y+61	; 0x3d
   3160e:	ae ad       	ldd	r26, Y+62	; 0x3e
   31610:	bf ad       	ldd	r27, Y+63	; 0x3f
   31612:	a2 97       	sbiw	r28, 0x22	; 34
   31614:	80 93 36 13 	sts	0x1336, r24	; 0x801336 <mbl+0x2d>
   31618:	90 93 37 13 	sts	0x1337, r25	; 0x801337 <mbl+0x2e>
   3161c:	a0 93 38 13 	sts	0x1338, r26	; 0x801338 <mbl+0x2f>
   31620:	b0 93 39 13 	sts	0x1339, r27	; 0x801339 <mbl+0x30>
        // Refresh the offset.
        cntr[0] = 0.f;
   31624:	10 92 3a 13 	sts	0x133A, r1	; 0x80133a <mbl+0x31>
   31628:	10 92 3b 13 	sts	0x133B, r1	; 0x80133b <mbl+0x32>
   3162c:	10 92 3c 13 	sts	0x133C, r1	; 0x80133c <mbl+0x33>
   31630:	10 92 3d 13 	sts	0x133D, r1	; 0x80133d <mbl+0x34>
        cntr[1] = 0.f;
   31634:	10 92 3e 13 	sts	0x133E, r1	; 0x80133e <mbl+0x35>
   31638:	10 92 3f 13 	sts	0x133F, r1	; 0x80133f <mbl+0x36>
   3163c:	10 92 40 13 	sts	0x1340, r1	; 0x801340 <mbl+0x37>
   31640:	10 92 41 13 	sts	0x1341, r1	; 0x801341 <mbl+0x38>
        float wx = 0.f;
   31644:	41 2c       	mov	r4, r1
   31646:	51 2c       	mov	r5, r1
   31648:	32 01       	movw	r6, r4
        float wy = 0.f;
        for (int8_t i = 0; i < npts; ++ i) {
            float x = vec_x[0] * measured_pts[i * 2] + vec_y[0] * measured_pts[i * 2 + 1];
   3164a:	cf 56       	subi	r28, 0x6F	; 111
   3164c:	df 4f       	sbci	r29, 0xFF	; 255
   3164e:	a8 81       	ld	r26, Y
   31650:	b9 81       	ldd	r27, Y+1	; 0x01
   31652:	c1 59       	subi	r28, 0x91	; 145
   31654:	d0 40       	sbci	r29, 0x00	; 0
   31656:	11 96       	adiw	r26, 0x01	; 1
   31658:	8d 90       	ld	r8, X+
   3165a:	9d 90       	ld	r9, X+
   3165c:	ad 90       	ld	r10, X+
   3165e:	bc 90       	ld	r11, X
   31660:	14 97       	sbiw	r26, 0x04	; 4
   31662:	15 96       	adiw	r26, 0x05	; 5
   31664:	2d 91       	ld	r18, X+
   31666:	3d 91       	ld	r19, X+
   31668:	4d 91       	ld	r20, X+
   3166a:	5c 91       	ld	r21, X
   3166c:	18 97       	sbiw	r26, 0x08	; 8
   3166e:	6e 96       	adiw	r28, 0x1e	; 30
   31670:	2c af       	std	Y+60, r18	; 0x3c
   31672:	3d af       	std	Y+61, r19	; 0x3d
   31674:	4e af       	std	Y+62, r20	; 0x3e
   31676:	5f af       	std	Y+63, r21	; 0x3f
   31678:	6e 97       	sbiw	r28, 0x1e	; 30
            float y = vec_x[1] * measured_pts[i * 2] + vec_y[1] * measured_pts[i * 2 + 1];
            float w = point_weight_x(i, y);
			cntr[0] += w * (pgm_read_float(true_pts + i * 2) - x);
   3167a:	cd 56       	subi	r28, 0x6D	; 109
   3167c:	df 4f       	sbci	r29, 0xFF	; 255
   3167e:	e8 81       	ld	r30, Y
   31680:	f9 81       	ldd	r31, Y+1	; 0x01
   31682:	c3 59       	subi	r28, 0x93	; 147
   31684:	d0 40       	sbci	r29, 0x00	; 0
   31686:	c5 90       	lpm	r12, Z+
   31688:	d5 90       	lpm	r13, Z+
   3168a:	e5 90       	lpm	r14, Z+
   3168c:	f4 90       	lpm	r15, Z
        cntr[0] = 0.f;
        cntr[1] = 0.f;
        float wx = 0.f;
        float wy = 0.f;
        for (int8_t i = 0; i < npts; ++ i) {
            float x = vec_x[0] * measured_pts[i * 2] + vec_y[0] * measured_pts[i * 2 + 1];
   3168e:	a5 01       	movw	r20, r10
   31690:	94 01       	movw	r18, r8
   31692:	a2 96       	adiw	r28, 0x22	; 34
   31694:	6c ad       	ldd	r22, Y+60	; 0x3c
   31696:	7d ad       	ldd	r23, Y+61	; 0x3d
   31698:	8e ad       	ldd	r24, Y+62	; 0x3e
   3169a:	9f ad       	ldd	r25, Y+63	; 0x3f
   3169c:	a2 97       	sbiw	r28, 0x22	; 34
   3169e:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   316a2:	ae 96       	adiw	r28, 0x2e	; 46
   316a4:	6c af       	std	Y+60, r22	; 0x3c
   316a6:	7d af       	std	Y+61, r23	; 0x3d
   316a8:	8e af       	std	Y+62, r24	; 0x3e
   316aa:	9f af       	std	Y+63, r25	; 0x3f
   316ac:	ae 97       	sbiw	r28, 0x2e	; 46
   316ae:	6e 96       	adiw	r28, 0x1e	; 30
   316b0:	2c ad       	ldd	r18, Y+60	; 0x3c
   316b2:	3d ad       	ldd	r19, Y+61	; 0x3d
   316b4:	4e ad       	ldd	r20, Y+62	; 0x3e
   316b6:	5f ad       	ldd	r21, Y+63	; 0x3f
   316b8:	6e 97       	sbiw	r28, 0x1e	; 30
   316ba:	aa 96       	adiw	r28, 0x2a	; 42
   316bc:	6c ad       	ldd	r22, Y+60	; 0x3c
   316be:	7d ad       	ldd	r23, Y+61	; 0x3d
   316c0:	8e ad       	ldd	r24, Y+62	; 0x3e
   316c2:	9f ad       	ldd	r25, Y+63	; 0x3f
   316c4:	aa 97       	sbiw	r28, 0x2a	; 42
   316c6:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   316ca:	9b 01       	movw	r18, r22
   316cc:	ac 01       	movw	r20, r24
   316ce:	ae 96       	adiw	r28, 0x2e	; 46
   316d0:	6c ad       	ldd	r22, Y+60	; 0x3c
   316d2:	7d ad       	ldd	r23, Y+61	; 0x3d
   316d4:	8e ad       	ldd	r24, Y+62	; 0x3e
   316d6:	9f ad       	ldd	r25, Y+63	; 0x3f
   316d8:	ae 97       	sbiw	r28, 0x2e	; 46
   316da:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   316de:	9b 01       	movw	r18, r22
   316e0:	ac 01       	movw	r20, r24
            float y = vec_x[1] * measured_pts[i * 2] + vec_y[1] * measured_pts[i * 2 + 1];
            float w = point_weight_x(i, y);
			cntr[0] += w * (pgm_read_float(true_pts + i * 2) - x);
   316e2:	c7 01       	movw	r24, r14
   316e4:	b6 01       	movw	r22, r12
   316e6:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   316ea:	20 91 3a 13 	lds	r18, 0x133A	; 0x80133a <mbl+0x31>
   316ee:	30 91 3b 13 	lds	r19, 0x133B	; 0x80133b <mbl+0x32>
   316f2:	40 91 3c 13 	lds	r20, 0x133C	; 0x80133c <mbl+0x33>
   316f6:	50 91 3d 13 	lds	r21, 0x133D	; 0x80133d <mbl+0x34>
   316fa:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   316fe:	6b 01       	movw	r12, r22
   31700:	7c 01       	movw	r14, r24
   31702:	c0 92 3a 13 	sts	0x133A, r12	; 0x80133a <mbl+0x31>
   31706:	d0 92 3b 13 	sts	0x133B, r13	; 0x80133b <mbl+0x32>
   3170a:	e0 92 3c 13 	sts	0x133C, r14	; 0x80133c <mbl+0x33>
   3170e:	f0 92 3d 13 	sts	0x133D, r15	; 0x80133d <mbl+0x34>
			wx += w;
   31712:	20 e0       	ldi	r18, 0x00	; 0
   31714:	30 e0       	ldi	r19, 0x00	; 0
   31716:	40 e8       	ldi	r20, 0x80	; 128
   31718:	5f e3       	ldi	r21, 0x3F	; 63
   3171a:	c3 01       	movw	r24, r6
   3171c:	b2 01       	movw	r22, r4
   3171e:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   31722:	2b 01       	movw	r4, r22
   31724:	3c 01       	movw	r6, r24
				SERIAL_ECHOLNPGM("wx:");
				MYSERIAL.print(wx);
			}
			#endif // SUPPORT_VERBOSITY
            w = point_weight_y(i, y);
			cntr[1] += w * (pgm_read_float(true_pts + i * 2 + 1) - y);
   31726:	cd 56       	subi	r28, 0x6D	; 109
   31728:	df 4f       	sbci	r29, 0xFF	; 255
   3172a:	e8 81       	ld	r30, Y
   3172c:	f9 81       	ldd	r31, Y+1	; 0x01
   3172e:	c3 59       	subi	r28, 0x93	; 147
   31730:	d0 40       	sbci	r29, 0x00	; 0
   31732:	34 96       	adiw	r30, 0x04	; 4
   31734:	25 91       	lpm	r18, Z+
   31736:	35 91       	lpm	r19, Z+
   31738:	45 91       	lpm	r20, Z+
   3173a:	54 91       	lpm	r21, Z
   3173c:	ae 96       	adiw	r28, 0x2e	; 46
   3173e:	2c af       	std	Y+60, r18	; 0x3c
   31740:	3d af       	std	Y+61, r19	; 0x3d
   31742:	4e af       	std	Y+62, r20	; 0x3e
   31744:	5f af       	std	Y+63, r21	; 0x3f
   31746:	ae 97       	sbiw	r28, 0x2e	; 46
        cntr[1] = 0.f;
        float wx = 0.f;
        float wy = 0.f;
        for (int8_t i = 0; i < npts; ++ i) {
            float x = vec_x[0] * measured_pts[i * 2] + vec_y[0] * measured_pts[i * 2 + 1];
            float y = vec_x[1] * measured_pts[i * 2] + vec_y[1] * measured_pts[i * 2 + 1];
   31748:	a5 01       	movw	r20, r10
   3174a:	94 01       	movw	r18, r8
   3174c:	a6 96       	adiw	r28, 0x26	; 38
   3174e:	6c ad       	ldd	r22, Y+60	; 0x3c
   31750:	7d ad       	ldd	r23, Y+61	; 0x3d
   31752:	8e ad       	ldd	r24, Y+62	; 0x3e
   31754:	9f ad       	ldd	r25, Y+63	; 0x3f
   31756:	a6 97       	sbiw	r28, 0x26	; 38
   31758:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   3175c:	4b 01       	movw	r8, r22
   3175e:	5c 01       	movw	r10, r24
   31760:	6e 96       	adiw	r28, 0x1e	; 30
   31762:	2c ad       	ldd	r18, Y+60	; 0x3c
   31764:	3d ad       	ldd	r19, Y+61	; 0x3d
   31766:	4e ad       	ldd	r20, Y+62	; 0x3e
   31768:	5f ad       	ldd	r21, Y+63	; 0x3f
   3176a:	6e 97       	sbiw	r28, 0x1e	; 30
   3176c:	a2 96       	adiw	r28, 0x22	; 34
   3176e:	6c ad       	ldd	r22, Y+60	; 0x3c
   31770:	7d ad       	ldd	r23, Y+61	; 0x3d
   31772:	8e ad       	ldd	r24, Y+62	; 0x3e
   31774:	9f ad       	ldd	r25, Y+63	; 0x3f
   31776:	a2 97       	sbiw	r28, 0x22	; 34
   31778:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   3177c:	9b 01       	movw	r18, r22
   3177e:	ac 01       	movw	r20, r24
   31780:	c5 01       	movw	r24, r10
   31782:	b4 01       	movw	r22, r8
   31784:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   31788:	9b 01       	movw	r18, r22
   3178a:	ac 01       	movw	r20, r24
				SERIAL_ECHOLNPGM("wx:");
				MYSERIAL.print(wx);
			}
			#endif // SUPPORT_VERBOSITY
            w = point_weight_y(i, y);
			cntr[1] += w * (pgm_read_float(true_pts + i * 2 + 1) - y);
   3178c:	ae 96       	adiw	r28, 0x2e	; 46
   3178e:	6c ad       	ldd	r22, Y+60	; 0x3c
   31790:	7d ad       	ldd	r23, Y+61	; 0x3d
   31792:	8e ad       	ldd	r24, Y+62	; 0x3e
   31794:	9f ad       	ldd	r25, Y+63	; 0x3f
   31796:	ae 97       	sbiw	r28, 0x2e	; 46
   31798:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   3179c:	20 91 3e 13 	lds	r18, 0x133E	; 0x80133e <mbl+0x35>
   317a0:	30 91 3f 13 	lds	r19, 0x133F	; 0x80133f <mbl+0x36>
   317a4:	40 91 40 13 	lds	r20, 0x1340	; 0x801340 <mbl+0x37>
   317a8:	50 91 41 13 	lds	r21, 0x1341	; 0x801341 <mbl+0x38>
   317ac:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   317b0:	4b 01       	movw	r8, r22
   317b2:	5c 01       	movw	r10, r24
   317b4:	80 92 3e 13 	sts	0x133E, r8	; 0x80133e <mbl+0x35>
   317b8:	90 92 3f 13 	sts	0x133F, r9	; 0x80133f <mbl+0x36>
   317bc:	a0 92 40 13 	sts	0x1340, r10	; 0x801340 <mbl+0x37>
   317c0:	b0 92 41 13 	sts	0x1341, r11	; 0x801341 <mbl+0x38>
   317c4:	cf 56       	subi	r28, 0x6F	; 111
   317c6:	df 4f       	sbci	r29, 0xFF	; 255
   317c8:	48 81       	ld	r20, Y
   317ca:	59 81       	ldd	r21, Y+1	; 0x01
   317cc:	c1 59       	subi	r28, 0x91	; 145
   317ce:	d0 40       	sbci	r29, 0x00	; 0
   317d0:	48 5f       	subi	r20, 0xF8	; 248
   317d2:	5f 4f       	sbci	r21, 0xFF	; 255
   317d4:	cf 56       	subi	r28, 0x6F	; 111
   317d6:	df 4f       	sbci	r29, 0xFF	; 255
   317d8:	59 83       	std	Y+1, r21	; 0x01
   317da:	48 83       	st	Y, r20
   317dc:	c1 59       	subi	r28, 0x91	; 145
   317de:	d0 40       	sbci	r29, 0x00	; 0
   317e0:	cd 56       	subi	r28, 0x6D	; 109
   317e2:	df 4f       	sbci	r29, 0xFF	; 255
   317e4:	88 81       	ld	r24, Y
   317e6:	99 81       	ldd	r25, Y+1	; 0x01
   317e8:	c3 59       	subi	r28, 0x93	; 147
   317ea:	d0 40       	sbci	r29, 0x00	; 0
   317ec:	08 96       	adiw	r24, 0x08	; 8
   317ee:	cd 56       	subi	r28, 0x6D	; 109
   317f0:	df 4f       	sbci	r29, 0xFF	; 255
   317f2:	99 83       	std	Y+1, r25	; 0x01
   317f4:	88 83       	st	Y, r24
   317f6:	c3 59       	subi	r28, 0x93	; 147
   317f8:	d0 40       	sbci	r29, 0x00	; 0
        // Refresh the offset.
        cntr[0] = 0.f;
        cntr[1] = 0.f;
        float wx = 0.f;
        float wy = 0.f;
        for (int8_t i = 0; i < npts; ++ i) {
   317fa:	24 16       	cp	r2, r20
   317fc:	35 06       	cpc	r3, r21
   317fe:	09 f0       	breq	.+2      	; 0x31802 <gcode_M45(bool, signed char) [clone .constprop.63]+0x1dc6>
   31800:	24 cf       	rjmp	.-440    	; 0x3164a <gcode_M45(bool, signed char) [clone .constprop.63]+0x1c0e>
				SERIAL_ECHOLNPGM("");
			}
			#endif // SUPPORT_VERBOSITY

		}
        cntr[0] /= wx;
   31802:	a3 01       	movw	r20, r6
   31804:	92 01       	movw	r18, r4
   31806:	c7 01       	movw	r24, r14
   31808:	b6 01       	movw	r22, r12
   3180a:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   3180e:	60 93 3a 13 	sts	0x133A, r22	; 0x80133a <mbl+0x31>
   31812:	70 93 3b 13 	sts	0x133B, r23	; 0x80133b <mbl+0x32>
   31816:	80 93 3c 13 	sts	0x133C, r24	; 0x80133c <mbl+0x33>
   3181a:	90 93 3d 13 	sts	0x133D, r25	; 0x80133d <mbl+0x34>
        cntr[1] /= wy;
   3181e:	a3 01       	movw	r20, r6
   31820:	92 01       	movw	r18, r4
   31822:	c5 01       	movw	r24, r10
   31824:	b4 01       	movw	r22, r8
   31826:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   3182a:	60 93 3e 13 	sts	0x133E, r22	; 0x80133e <mbl+0x35>
   3182e:	70 93 3f 13 	sts	0x133F, r23	; 0x80133f <mbl+0x36>
   31832:	80 93 40 13 	sts	0x1340, r24	; 0x801340 <mbl+0x37>
   31836:	90 93 41 13 	sts	0x1341, r25	; 0x801341 <mbl+0x38>
		#endif // SUPPORT_VERBOSITY
    }

    // Invert the transformation matrix made of vec_x, vec_y and cntr.
    {
        float d = vec_x[0] * vec_y[1] - vec_x[1] * vec_y[0];
   3183a:	40 90 2a 13 	lds	r4, 0x132A	; 0x80132a <mbl+0x21>
   3183e:	50 90 2b 13 	lds	r5, 0x132B	; 0x80132b <mbl+0x22>
   31842:	60 90 2c 13 	lds	r6, 0x132C	; 0x80132c <mbl+0x23>
   31846:	70 90 2d 13 	lds	r7, 0x132D	; 0x80132d <mbl+0x24>
   3184a:	c0 90 36 13 	lds	r12, 0x1336	; 0x801336 <mbl+0x2d>
   3184e:	d0 90 37 13 	lds	r13, 0x1337	; 0x801337 <mbl+0x2e>
   31852:	e0 90 38 13 	lds	r14, 0x1338	; 0x801338 <mbl+0x2f>
   31856:	f0 90 39 13 	lds	r15, 0x1339	; 0x801339 <mbl+0x30>
   3185a:	20 91 2e 13 	lds	r18, 0x132E	; 0x80132e <mbl+0x25>
   3185e:	30 91 2f 13 	lds	r19, 0x132F	; 0x80132f <mbl+0x26>
   31862:	40 91 30 13 	lds	r20, 0x1330	; 0x801330 <mbl+0x27>
   31866:	50 91 31 13 	lds	r21, 0x1331	; 0x801331 <mbl+0x28>
   3186a:	a2 96       	adiw	r28, 0x22	; 34
   3186c:	2c af       	std	Y+60, r18	; 0x3c
   3186e:	3d af       	std	Y+61, r19	; 0x3d
   31870:	4e af       	std	Y+62, r20	; 0x3e
   31872:	5f af       	std	Y+63, r21	; 0x3f
   31874:	a2 97       	sbiw	r28, 0x22	; 34
   31876:	80 91 32 13 	lds	r24, 0x1332	; 0x801332 <mbl+0x29>
   3187a:	90 91 33 13 	lds	r25, 0x1333	; 0x801333 <mbl+0x2a>
   3187e:	a0 91 34 13 	lds	r26, 0x1334	; 0x801334 <mbl+0x2b>
   31882:	b0 91 35 13 	lds	r27, 0x1335	; 0x801335 <mbl+0x2c>
   31886:	a6 96       	adiw	r28, 0x26	; 38
   31888:	8c af       	std	Y+60, r24	; 0x3c
   3188a:	9d af       	std	Y+61, r25	; 0x3d
   3188c:	ae af       	std	Y+62, r26	; 0x3e
   3188e:	bf af       	std	Y+63, r27	; 0x3f
   31890:	a6 97       	sbiw	r28, 0x26	; 38
   31892:	a7 01       	movw	r20, r14
   31894:	96 01       	movw	r18, r12
   31896:	c3 01       	movw	r24, r6
   31898:	b2 01       	movw	r22, r4
   3189a:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   3189e:	4b 01       	movw	r8, r22
   318a0:	5c 01       	movw	r10, r24
   318a2:	a6 96       	adiw	r28, 0x26	; 38
   318a4:	2c ad       	ldd	r18, Y+60	; 0x3c
   318a6:	3d ad       	ldd	r19, Y+61	; 0x3d
   318a8:	4e ad       	ldd	r20, Y+62	; 0x3e
   318aa:	5f ad       	ldd	r21, Y+63	; 0x3f
   318ac:	a6 97       	sbiw	r28, 0x26	; 38
   318ae:	a2 96       	adiw	r28, 0x22	; 34
   318b0:	6c ad       	ldd	r22, Y+60	; 0x3c
   318b2:	7d ad       	ldd	r23, Y+61	; 0x3d
   318b4:	8e ad       	ldd	r24, Y+62	; 0x3e
   318b6:	9f ad       	ldd	r25, Y+63	; 0x3f
   318b8:	a2 97       	sbiw	r28, 0x22	; 34
   318ba:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   318be:	9b 01       	movw	r18, r22
   318c0:	ac 01       	movw	r20, r24
   318c2:	c5 01       	movw	r24, r10
   318c4:	b4 01       	movw	r22, r8
   318c6:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   318ca:	4b 01       	movw	r8, r22
   318cc:	5c 01       	movw	r10, r24
        float Ainv[2][2] = {
            { vec_y[1] / d, -vec_y[0] / d },
   318ce:	ac 01       	movw	r20, r24
   318d0:	9b 01       	movw	r18, r22
   318d2:	c7 01       	movw	r24, r14
   318d4:	b6 01       	movw	r22, r12
   318d6:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   318da:	6b 01       	movw	r12, r22
   318dc:	7c 01       	movw	r14, r24
   318de:	a6 96       	adiw	r28, 0x26	; 38
   318e0:	6c ad       	ldd	r22, Y+60	; 0x3c
   318e2:	7d ad       	ldd	r23, Y+61	; 0x3d
   318e4:	8e ad       	ldd	r24, Y+62	; 0x3e
   318e6:	9f ad       	ldd	r25, Y+63	; 0x3f
   318e8:	a6 97       	sbiw	r28, 0x26	; 38
   318ea:	90 58       	subi	r25, 0x80	; 128
   318ec:	a5 01       	movw	r20, r10
   318ee:	94 01       	movw	r18, r8
   318f0:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   318f4:	a6 96       	adiw	r28, 0x26	; 38
   318f6:	6c af       	std	Y+60, r22	; 0x3c
   318f8:	7d af       	std	Y+61, r23	; 0x3d
   318fa:	8e af       	std	Y+62, r24	; 0x3e
   318fc:	9f af       	std	Y+63, r25	; 0x3f
   318fe:	a6 97       	sbiw	r28, 0x26	; 38
            { -vec_x[1] / d, vec_x[0] / d }
   31900:	a2 96       	adiw	r28, 0x22	; 34
   31902:	6c ad       	ldd	r22, Y+60	; 0x3c
   31904:	7d ad       	ldd	r23, Y+61	; 0x3d
   31906:	8e ad       	ldd	r24, Y+62	; 0x3e
   31908:	9f ad       	ldd	r25, Y+63	; 0x3f
   3190a:	a2 97       	sbiw	r28, 0x22	; 34
   3190c:	90 58       	subi	r25, 0x80	; 128
   3190e:	a5 01       	movw	r20, r10
   31910:	94 01       	movw	r18, r8
   31912:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   31916:	aa 96       	adiw	r28, 0x2a	; 42
   31918:	6c af       	std	Y+60, r22	; 0x3c
   3191a:	7d af       	std	Y+61, r23	; 0x3d
   3191c:	8e af       	std	Y+62, r24	; 0x3e
   3191e:	9f af       	std	Y+63, r25	; 0x3f
   31920:	aa 97       	sbiw	r28, 0x2a	; 42
   31922:	a5 01       	movw	r20, r10
   31924:	94 01       	movw	r18, r8
   31926:	c3 01       	movw	r24, r6
   31928:	b2 01       	movw	r22, r4
   3192a:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   3192e:	4b 01       	movw	r8, r22
   31930:	5c 01       	movw	r10, r24
        };
        float cntrInv[2] = {
            -Ainv[0][0] * cntr[0] - Ainv[0][1] * cntr[1],
   31932:	40 90 3a 13 	lds	r4, 0x133A	; 0x80133a <mbl+0x31>
   31936:	50 90 3b 13 	lds	r5, 0x133B	; 0x80133b <mbl+0x32>
   3193a:	60 90 3c 13 	lds	r6, 0x133C	; 0x80133c <mbl+0x33>
   3193e:	70 90 3d 13 	lds	r7, 0x133D	; 0x80133d <mbl+0x34>
   31942:	20 91 3e 13 	lds	r18, 0x133E	; 0x80133e <mbl+0x35>
   31946:	30 91 3f 13 	lds	r19, 0x133F	; 0x80133f <mbl+0x36>
   3194a:	40 91 40 13 	lds	r20, 0x1340	; 0x801340 <mbl+0x37>
   3194e:	50 91 41 13 	lds	r21, 0x1341	; 0x801341 <mbl+0x38>
   31952:	a2 96       	adiw	r28, 0x22	; 34
   31954:	2c af       	std	Y+60, r18	; 0x3c
   31956:	3d af       	std	Y+61, r19	; 0x3d
   31958:	4e af       	std	Y+62, r20	; 0x3e
   3195a:	5f af       	std	Y+63, r21	; 0x3f
   3195c:	a2 97       	sbiw	r28, 0x22	; 34
            -Ainv[1][0] * cntr[0] - Ainv[1][1] * cntr[1]
        };
        vec_x[0] = Ainv[0][0];
   3195e:	c0 92 2a 13 	sts	0x132A, r12	; 0x80132a <mbl+0x21>
   31962:	d0 92 2b 13 	sts	0x132B, r13	; 0x80132b <mbl+0x22>
   31966:	e0 92 2c 13 	sts	0x132C, r14	; 0x80132c <mbl+0x23>
   3196a:	f0 92 2d 13 	sts	0x132D, r15	; 0x80132d <mbl+0x24>
        vec_x[1] = Ainv[1][0];
   3196e:	aa 96       	adiw	r28, 0x2a	; 42
   31970:	8c ad       	ldd	r24, Y+60	; 0x3c
   31972:	9d ad       	ldd	r25, Y+61	; 0x3d
   31974:	ae ad       	ldd	r26, Y+62	; 0x3e
   31976:	bf ad       	ldd	r27, Y+63	; 0x3f
   31978:	aa 97       	sbiw	r28, 0x2a	; 42
   3197a:	80 93 2e 13 	sts	0x132E, r24	; 0x80132e <mbl+0x25>
   3197e:	90 93 2f 13 	sts	0x132F, r25	; 0x80132f <mbl+0x26>
   31982:	a0 93 30 13 	sts	0x1330, r26	; 0x801330 <mbl+0x27>
   31986:	b0 93 31 13 	sts	0x1331, r27	; 0x801331 <mbl+0x28>
        vec_y[0] = Ainv[0][1];
   3198a:	a6 96       	adiw	r28, 0x26	; 38
   3198c:	2c ad       	ldd	r18, Y+60	; 0x3c
   3198e:	3d ad       	ldd	r19, Y+61	; 0x3d
   31990:	4e ad       	ldd	r20, Y+62	; 0x3e
   31992:	5f ad       	ldd	r21, Y+63	; 0x3f
   31994:	a6 97       	sbiw	r28, 0x26	; 38
   31996:	20 93 32 13 	sts	0x1332, r18	; 0x801332 <mbl+0x29>
   3199a:	30 93 33 13 	sts	0x1333, r19	; 0x801333 <mbl+0x2a>
   3199e:	40 93 34 13 	sts	0x1334, r20	; 0x801334 <mbl+0x2b>
   319a2:	50 93 35 13 	sts	0x1335, r21	; 0x801335 <mbl+0x2c>
        vec_y[1] = Ainv[1][1];
   319a6:	80 92 36 13 	sts	0x1336, r8	; 0x801336 <mbl+0x2d>
   319aa:	90 92 37 13 	sts	0x1337, r9	; 0x801337 <mbl+0x2e>
   319ae:	a0 92 38 13 	sts	0x1338, r10	; 0x801338 <mbl+0x2f>
   319b2:	b0 92 39 13 	sts	0x1339, r11	; 0x801339 <mbl+0x30>
        float Ainv[2][2] = {
            { vec_y[1] / d, -vec_y[0] / d },
            { -vec_x[1] / d, vec_x[0] / d }
        };
        float cntrInv[2] = {
            -Ainv[0][0] * cntr[0] - Ainv[0][1] * cntr[1],
   319b6:	c7 01       	movw	r24, r14
   319b8:	b6 01       	movw	r22, r12
   319ba:	90 58       	subi	r25, 0x80	; 128
   319bc:	a3 01       	movw	r20, r6
   319be:	92 01       	movw	r18, r4
   319c0:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   319c4:	6b 01       	movw	r12, r22
   319c6:	7c 01       	movw	r14, r24
   319c8:	a2 96       	adiw	r28, 0x22	; 34
   319ca:	2c ad       	ldd	r18, Y+60	; 0x3c
   319cc:	3d ad       	ldd	r19, Y+61	; 0x3d
   319ce:	4e ad       	ldd	r20, Y+62	; 0x3e
   319d0:	5f ad       	ldd	r21, Y+63	; 0x3f
   319d2:	a2 97       	sbiw	r28, 0x22	; 34
   319d4:	a6 96       	adiw	r28, 0x26	; 38
   319d6:	6c ad       	ldd	r22, Y+60	; 0x3c
   319d8:	7d ad       	ldd	r23, Y+61	; 0x3d
   319da:	8e ad       	ldd	r24, Y+62	; 0x3e
   319dc:	9f ad       	ldd	r25, Y+63	; 0x3f
   319de:	a6 97       	sbiw	r28, 0x26	; 38
   319e0:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   319e4:	9b 01       	movw	r18, r22
   319e6:	ac 01       	movw	r20, r24
   319e8:	c7 01       	movw	r24, r14
   319ea:	b6 01       	movw	r22, r12
   319ec:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
        };
        vec_x[0] = Ainv[0][0];
        vec_x[1] = Ainv[1][0];
        vec_y[0] = Ainv[0][1];
        vec_y[1] = Ainv[1][1];
        cntr[0] = cntrInv[0];
   319f0:	60 93 3a 13 	sts	0x133A, r22	; 0x80133a <mbl+0x31>
   319f4:	70 93 3b 13 	sts	0x133B, r23	; 0x80133b <mbl+0x32>
   319f8:	80 93 3c 13 	sts	0x133C, r24	; 0x80133c <mbl+0x33>
   319fc:	90 93 3d 13 	sts	0x133D, r25	; 0x80133d <mbl+0x34>
            { vec_y[1] / d, -vec_y[0] / d },
            { -vec_x[1] / d, vec_x[0] / d }
        };
        float cntrInv[2] = {
            -Ainv[0][0] * cntr[0] - Ainv[0][1] * cntr[1],
            -Ainv[1][0] * cntr[0] - Ainv[1][1] * cntr[1]
   31a00:	aa 96       	adiw	r28, 0x2a	; 42
   31a02:	6c ad       	ldd	r22, Y+60	; 0x3c
   31a04:	7d ad       	ldd	r23, Y+61	; 0x3d
   31a06:	8e ad       	ldd	r24, Y+62	; 0x3e
   31a08:	9f ad       	ldd	r25, Y+63	; 0x3f
   31a0a:	aa 97       	sbiw	r28, 0x2a	; 42
   31a0c:	90 58       	subi	r25, 0x80	; 128
   31a0e:	a3 01       	movw	r20, r6
   31a10:	92 01       	movw	r18, r4
   31a12:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   31a16:	6b 01       	movw	r12, r22
   31a18:	7c 01       	movw	r14, r24
   31a1a:	a2 96       	adiw	r28, 0x22	; 34
   31a1c:	2c ad       	ldd	r18, Y+60	; 0x3c
   31a1e:	3d ad       	ldd	r19, Y+61	; 0x3d
   31a20:	4e ad       	ldd	r20, Y+62	; 0x3e
   31a22:	5f ad       	ldd	r21, Y+63	; 0x3f
   31a24:	a2 97       	sbiw	r28, 0x22	; 34
   31a26:	c5 01       	movw	r24, r10
   31a28:	b4 01       	movw	r22, r8
   31a2a:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   31a2e:	9b 01       	movw	r18, r22
   31a30:	ac 01       	movw	r20, r24
   31a32:	c7 01       	movw	r24, r14
   31a34:	b6 01       	movw	r22, r12
   31a36:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
        vec_x[0] = Ainv[0][0];
        vec_x[1] = Ainv[1][0];
        vec_y[0] = Ainv[0][1];
        vec_y[1] = Ainv[1][1];
        cntr[0] = cntrInv[0];
        cntr[1] = cntrInv[1];
   31a3a:	60 93 3e 13 	sts	0x133E, r22	; 0x80133e <mbl+0x35>
   31a3e:	70 93 3f 13 	sts	0x133F, r23	; 0x80133f <mbl+0x36>
   31a42:	80 93 40 13 	sts	0x1340, r24	; 0x801340 <mbl+0x37>
   31a46:	90 93 41 13 	sts	0x1341, r25	; 0x801341 <mbl+0x38>
				MYSERIAL.print(pts[1]);
				SERIAL_ECHOPGM(" < ");
				MYSERIAL.println(Y_MIN_POS_CALIBRATION_POINT_OUT_OF_REACH);
		}
		result = calculate_machine_skew_and_offset_LS(pts, 4, bed_ref_points_4, vec_x, vec_y, cntr, verbosity_level);
		delay_keep_alive(0); //manage_heater, reset watchdog, manage inactivity
   31a4a:	90 e0       	ldi	r25, 0x00	; 0
   31a4c:	80 e0       	ldi	r24, 0x00	; 0
   31a4e:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>

		if (result >= 0) {
   31a52:	17 fd       	sbrc	r17, 7
   31a54:	d5 c0       	rjmp	.+426    	; 0x31c00 <gcode_M45(bool, signed char) [clone .constprop.63]+0x21c4>
            DBG(_n("Calibration success.\n"));
   31a56:	83 ea       	ldi	r24, 0xA3	; 163
   31a58:	9b e6       	ldi	r25, 0x6B	; 107
   31a5a:	9f 93       	push	r25
   31a5c:	8f 93       	push	r24
   31a5e:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
			world2machine_update(vec_x, vec_y, cntr);
   31a62:	4a e3       	ldi	r20, 0x3A	; 58
   31a64:	53 e1       	ldi	r21, 0x13	; 19
   31a66:	62 e3       	ldi	r22, 0x32	; 50
   31a68:	73 e1       	ldi	r23, 0x13	; 19
   31a6a:	8a e2       	ldi	r24, 0x2A	; 42
   31a6c:	93 e1       	ldi	r25, 0x13	; 19
   31a6e:	0e 94 7d 5f 	call	0xbefa	; 0xbefa <world2machine_update(float const*, float const*, float const*) [clone .lto_priv.383]>
#endif //DEBUG_EEPROM_CHANGES
}

#ifndef DEBUG_EEPROM_CHANGES
void eeprom_update_block_notify(const void *__src, void *__dst, size_t __n){
    eeprom_update_block(__src, __dst, __n);
   31a72:	48 e0       	ldi	r20, 0x08	; 8
   31a74:	50 e0       	ldi	r21, 0x00	; 0
   31a76:	65 ee       	ldi	r22, 0xE5	; 229
   31a78:	7f e0       	ldi	r23, 0x0F	; 15
   31a7a:	8a e3       	ldi	r24, 0x3A	; 58
   31a7c:	93 e1       	ldi	r25, 0x13	; 19
   31a7e:	0f 94 f4 a3 	call	0x347e8	; 0x347e8 <eeprom_update_block>
   31a82:	48 e0       	ldi	r20, 0x08	; 8
   31a84:	50 e0       	ldi	r21, 0x00	; 0
   31a86:	6d ed       	ldi	r22, 0xDD	; 221
   31a88:	7f e0       	ldi	r23, 0x0F	; 15
   31a8a:	8a e2       	ldi	r24, 0x2A	; 42
   31a8c:	93 e1       	ldi	r25, 0x13	; 19
   31a8e:	0f 94 f4 a3 	call	0x347e8	; 0x347e8 <eeprom_update_block>
   31a92:	48 e0       	ldi	r20, 0x08	; 8
   31a94:	50 e0       	ldi	r21, 0x00	; 0
   31a96:	65 ed       	ldi	r22, 0xD5	; 213
   31a98:	7f e0       	ldi	r23, 0x0F	; 15
   31a9a:	82 e3       	ldi	r24, 0x32	; 50
   31a9c:	93 e1       	ldi	r25, 0x13	; 19
   31a9e:	0f 94 f4 a3 	call	0x347e8	; 0x347e8 <eeprom_update_block>
				MYSERIAL.println(fabs(l));
				SERIAL_ECHOLNPGM("Saving bed calibration vectors to EEPROM");
			}
			#endif // SUPPORT_VERBOSITY
			// Correct the current_position to match the transformed coordinate system after world2machine_rotation_and_skew and world2machine_shift were set.
			world2machine_update_current();
   31aa2:	0e 94 02 5f 	call	0xbe04	; 0xbe04 <world2machine_update_current()>
			}
			#endif // SUPPORT_VERBOSITY
			return result;
		}
        if (result == BED_SKEW_OFFSET_DETECTION_FITTING_FAILED && too_far_mask == 2){
            DBG(_n("Fitting failed => calibration failed.\n"));
   31aa6:	0f 90       	pop	r0
   31aa8:	0f 90       	pop	r0
				BedSkewOffsetDetectionResultType result = find_bed_offset_and_skew(verbosity_level, point_too_far_mask);
				clean_up_after_endstop_move(l_feedmultiply);
   31aaa:	c7 55       	subi	r28, 0x57	; 87
   31aac:	df 4f       	sbci	r29, 0xFF	; 255
   31aae:	88 81       	ld	r24, Y
   31ab0:	99 81       	ldd	r25, Y+1	; 0x01
   31ab2:	c9 5a       	subi	r28, 0xA9	; 169
   31ab4:	d0 40       	sbci	r29, 0x00	; 0
   31ab6:	0e 94 4c 65 	call	0xca98	; 0xca98 <clean_up_after_endstop_move(int) [clone .lto_priv.382]>
				// Print head up.
				current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
   31aba:	80 e0       	ldi	r24, 0x00	; 0
   31abc:	90 e0       	ldi	r25, 0x00	; 0
   31abe:	a0 ea       	ldi	r26, 0xA0	; 160
   31ac0:	b0 e4       	ldi	r27, 0x40	; 64
   31ac2:	80 93 69 12 	sts	0x1269, r24	; 0x801269 <current_position+0x8>
   31ac6:	90 93 6a 12 	sts	0x126A, r25	; 0x80126a <current_position+0x9>
   31aca:	a0 93 6b 12 	sts	0x126B, r26	; 0x80126b <current_position+0xa>
   31ace:	b0 93 6c 12 	sts	0x126C, r27	; 0x80126c <current_position+0xb>
				plan_buffer_line_curposXYZE(homing_feedrate[Z_AXIS] / 40);
   31ad2:	60 e0       	ldi	r22, 0x00	; 0
   31ad4:	70 e0       	ldi	r23, 0x00	; 0
   31ad6:	80 ea       	ldi	r24, 0xA0	; 160
   31ad8:	91 e4       	ldi	r25, 0x41	; 65
   31ada:	0f 94 81 4c 	call	0x29902	; 0x29902 <plan_buffer_line_curposXYZE(float)>
				st_synchronize();
   31ade:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
//#ifndef NEW_XYZCAL
				if (result >= 0)
   31ae2:	17 fd       	sbrc	r17, 7
   31ae4:	22 c0       	rjmp	.+68     	; 0x31b2a <gcode_M45(bool, signed char) [clone .constprop.63]+0x20ee>
bool sample_z() {
    bool sampled = true;
    // make some space for the sheet
    // Avoid calling raise_z(), because a false triggering stallguard may prevent the Z from moving.
    // The extruder then may ram the sheet hard if not going down from some ~150mm height
    current_position[Z_AXIS] = 0.F;
   31ae6:	10 92 69 12 	sts	0x1269, r1	; 0x801269 <current_position+0x8>
   31aea:	10 92 6a 12 	sts	0x126A, r1	; 0x80126a <current_position+0x9>
   31aee:	10 92 6b 12 	sts	0x126B, r1	; 0x80126b <current_position+0xa>
   31af2:	10 92 6c 12 	sts	0x126C, r1	; 0x80126c <current_position+0xb>
    destination[Z_AXIS] = 150.F;
   31af6:	80 e0       	ldi	r24, 0x00	; 0
   31af8:	90 e0       	ldi	r25, 0x00	; 0
   31afa:	a6 e1       	ldi	r26, 0x16	; 22
   31afc:	b3 e4       	ldi	r27, 0x43	; 67
   31afe:	80 93 31 06 	sts	0x0631, r24	; 0x800631 <destination+0x8>
   31b02:	90 93 32 06 	sts	0x0632, r25	; 0x800632 <destination+0x9>
   31b06:	a0 93 33 06 	sts	0x0633, r26	; 0x800633 <destination+0xa>
   31b0a:	b0 93 34 06 	sts	0x0634, r27	; 0x800634 <destination+0xb>
    plan_buffer_line_destinationXYZE(homing_feedrate[Z_AXIS] / 60);
   31b0e:	65 e5       	ldi	r22, 0x55	; 85
   31b10:	75 e5       	ldi	r23, 0x55	; 85
   31b12:	85 e5       	ldi	r24, 0x55	; 85
   31b14:	91 e4       	ldi	r25, 0x41	; 65
   31b16:	0f 94 4e 4c 	call	0x2989c	; 0x2989c <plan_buffer_line_destinationXYZE(float)>

    lcd_show_fullscreen_message_and_wait_P(_T(MSG_PLACE_STEEL_SHEET));
   31b1a:	83 ed       	ldi	r24, 0xD3	; 211
   31b1c:	9f e5       	ldi	r25, 0x5F	; 95
   31b1e:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   31b22:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>

    // Sample Z heights for the mesh bed leveling.
    // In addition, store the results into an eeprom, to be used later for verification of the bed leveling process.
    if (!sample_mesh_and_store_reference())
   31b26:	0e 94 4a 83 	call	0x10694	; 0x10694 <sample_mesh_and_store_reference()>
					st_synchronize();
					// if (result >= 0) babystep_apply();
					#endif //HEATBED_V2
				}
//#endif //NEW_XYZCAL
				lcd_update_enable(true);
   31b2a:	81 e0       	ldi	r24, 0x01	; 1
   31b2c:	0e 94 38 70 	call	0xe070	; 0xe070 <lcd_update_enable(unsigned char)>
				lcd_update(2);
   31b30:	82 e0       	ldi	r24, 0x02	; 2
   31b32:	0e 94 f9 6e 	call	0xddf2	; 0xddf2 <lcd_update(unsigned char)>

void lcd_bed_calibration_show_result(BedSkewOffsetDetectionResultType result, uint8_t point_too_far_mask)
{
    const char *msg = NULL;
    if (result == BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND) {
        lcd_show_fullscreen_message_and_wait_P(_T(MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND));
   31b36:	84 e9       	ldi	r24, 0x94	; 148
   31b38:	9f e5       	ldi	r25, 0x5F	; 95
}

void lcd_bed_calibration_show_result(BedSkewOffsetDetectionResultType result, uint8_t point_too_far_mask)
{
    const char *msg = NULL;
    if (result == BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND) {
   31b3a:	1f 3f       	cpi	r17, 0xFF	; 255
   31b3c:	99 f0       	breq	.+38     	; 0x31b64 <gcode_M45(bool, signed char) [clone .constprop.63]+0x2128>
        lcd_show_fullscreen_message_and_wait_P(_T(MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND));
    } else if (result == BED_SKEW_OFFSET_DETECTION_FITTING_FAILED) {
   31b3e:	1e 3f       	cpi	r17, 0xFE	; 254
   31b40:	09 f0       	breq	.+2      	; 0x31b44 <gcode_M45(bool, signed char) [clone .constprop.63]+0x2108>
   31b42:	73 c0       	rjmp	.+230    	; 0x31c2a <gcode_M45(bool, signed char) [clone .constprop.63]+0x21ee>
        if (point_too_far_mask == 0)
   31b44:	af 96       	adiw	r28, 0x2f	; 47
   31b46:	4f ad       	ldd	r20, Y+63	; 0x3f
   31b48:	af 97       	sbiw	r28, 0x2f	; 47
            msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED);
   31b4a:	8f e5       	ldi	r24, 0x5F	; 95
   31b4c:	9f e5       	ldi	r25, 0x5F	; 95
{
    const char *msg = NULL;
    if (result == BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND) {
        lcd_show_fullscreen_message_and_wait_P(_T(MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND));
    } else if (result == BED_SKEW_OFFSET_DETECTION_FITTING_FAILED) {
        if (point_too_far_mask == 0)
   31b4e:	44 23       	and	r20, r20
   31b50:	49 f0       	breq	.+18     	; 0x31b64 <gcode_M45(bool, signed char) [clone .constprop.63]+0x2128>
            msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED);
        else if (point_too_far_mask == 2 || point_too_far_mask == 7)
   31b52:	af 96       	adiw	r28, 0x2f	; 47
   31b54:	5f ad       	ldd	r21, Y+63	; 0x3f
   31b56:	af 97       	sbiw	r28, 0x2f	; 47
            // Only the center point or all the three front points.
            msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR);
   31b58:	8d e1       	ldi	r24, 0x1D	; 29
   31b5a:	9f e5       	ldi	r25, 0x5F	; 95
    if (result == BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND) {
        lcd_show_fullscreen_message_and_wait_P(_T(MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND));
    } else if (result == BED_SKEW_OFFSET_DETECTION_FITTING_FAILED) {
        if (point_too_far_mask == 0)
            msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED);
        else if (point_too_far_mask == 2 || point_too_far_mask == 7)
   31b5c:	52 30       	cpi	r21, 0x02	; 2
   31b5e:	11 f0       	breq	.+4      	; 0x31b64 <gcode_M45(bool, signed char) [clone .constprop.63]+0x2128>
            // Only the center point or all the three front points.
            msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR);
        else if ((point_too_far_mask & 1) == 0)
            // The right and maybe the center point out of reach.
            msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR);
   31b60:	86 ed       	ldi	r24, 0xD6	; 214
   31b62:	9e e5       	ldi	r25, 0x5E	; 94
   31b64:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   31b68:	0d 94 0a 82 	jmp	0x30414	; 0x30414 <gcode_M45(bool, signed char) [clone .constprop.63]+0x9d8>
                             (r == 0) ? 1.f :
                            ((r == 2) ? (-s1 * measured_pts[2 * i]) :
                                        (-c2 * measured_pts[2 * i + 1]));
                        float b =
                             (c == 0) ? 1.f :
                            ((c == 2) ? (-s1 * measured_pts[2 * i]) :
   31b6c:	f2 01       	movw	r30, r4
   31b6e:	25 81       	ldd	r18, Z+5	; 0x05
   31b70:	36 81       	ldd	r19, Z+6	; 0x06
   31b72:	47 81       	ldd	r20, Z+7	; 0x07
   31b74:	50 85       	ldd	r21, Z+8	; 0x08
   31b76:	c3 58       	subi	r28, 0x83	; 131
   31b78:	df 4f       	sbci	r29, 0xFF	; 255
   31b7a:	68 81       	ld	r22, Y
   31b7c:	79 81       	ldd	r23, Y+1	; 0x01
   31b7e:	8a 81       	ldd	r24, Y+2	; 0x02
   31b80:	9b 81       	ldd	r25, Y+3	; 0x03
   31b82:	cd 57       	subi	r28, 0x7D	; 125
   31b84:	d0 40       	sbci	r29, 0x00	; 0
   31b86:	0d 94 f0 84 	jmp	0x309e0	; 0x309e0 <gcode_M45(bool, signed char) [clone .constprop.63]+0xfa4>
                    // The first row of the points have a low weight, because their position may not be known
                    // with a sufficient accuracy.
                    if (r != 0 && c != 0) {
                        float a =
                             (r == 1) ? 1.f :
                            ((r == 2) ? ( c1 * measured_pts[2 * i]) :
   31b8a:	f2 01       	movw	r30, r4
   31b8c:	25 81       	ldd	r18, Z+5	; 0x05
   31b8e:	36 81       	ldd	r19, Z+6	; 0x06
   31b90:	47 81       	ldd	r20, Z+7	; 0x07
   31b92:	50 85       	ldd	r21, Z+8	; 0x08
   31b94:	ed 96       	adiw	r28, 0x3d	; 61
   31b96:	6c ad       	ldd	r22, Y+60	; 0x3c
   31b98:	7d ad       	ldd	r23, Y+61	; 0x3d
   31b9a:	8e ad       	ldd	r24, Y+62	; 0x3e
   31b9c:	9f ad       	ldd	r25, Y+63	; 0x3f
   31b9e:	ed 97       	sbiw	r28, 0x3d	; 61
   31ba0:	b8 c0       	rjmp	.+368    	; 0x31d12 <gcode_M45(bool, signed char) [clone .constprop.63]+0x22d6>
                                        (-s2 * measured_pts[2 * i + 1]));
                        float b =
                             (c == 1) ? 1.f :
                            ((c == 2) ? ( c1 * measured_pts[2 * i]) :
   31ba2:	f2 01       	movw	r30, r4
   31ba4:	25 81       	ldd	r18, Z+5	; 0x05
   31ba6:	36 81       	ldd	r19, Z+6	; 0x06
   31ba8:	47 81       	ldd	r20, Z+7	; 0x07
   31baa:	50 85       	ldd	r21, Z+8	; 0x08
   31bac:	ed 96       	adiw	r28, 0x3d	; 61
   31bae:	6c ad       	ldd	r22, Y+60	; 0x3c
   31bb0:	7d ad       	ldd	r23, Y+61	; 0x3d
   31bb2:	8e ad       	ldd	r24, Y+62	; 0x3e
   31bb4:	9f ad       	ldd	r25, Y+63	; 0x3f
   31bb6:	ed 97       	sbiw	r28, 0x3d	; 61
   31bb8:	c6 c0       	rjmp	.+396    	; 0x31d46 <gcode_M45(bool, signed char) [clone .constprop.63]+0x230a>
            for (uint8_t i = 0; i < npts; ++i) {
                {
                    float j =
                         (r == 0) ? 1.f :
                        ((r == 1) ? 0.f :
                        ((r == 2) ? (-s1 * measured_pts[2 * i]) :
   31bba:	a3 01       	movw	r20, r6
   31bbc:	92 01       	movw	r18, r4
   31bbe:	c3 58       	subi	r28, 0x83	; 131
   31bc0:	df 4f       	sbci	r29, 0xFF	; 255
   31bc2:	68 81       	ld	r22, Y
   31bc4:	79 81       	ldd	r23, Y+1	; 0x01
   31bc6:	8a 81       	ldd	r24, Y+2	; 0x02
   31bc8:	9b 81       	ldd	r25, Y+3	; 0x03
   31bca:	cd 57       	subi	r28, 0x7D	; 125
   31bcc:	d0 40       	sbci	r29, 0x00	; 0
   31bce:	0d 94 58 85 	jmp	0x30ab0	; 0x30ab0 <gcode_M45(bool, signed char) [clone .constprop.63]+0x1074>
            // J^T times f(x)
            acc = 0.f;
            for (uint8_t i = 0; i < npts; ++i) {
                {
                    float j =
                         (r == 0) ? 1.f :
   31bd2:	81 2c       	mov	r8, r1
   31bd4:	91 2c       	mov	r9, r1
   31bd6:	20 e8       	ldi	r18, 0x80	; 128
   31bd8:	a2 2e       	mov	r10, r18
   31bda:	2f e3       	ldi	r18, 0x3F	; 63
   31bdc:	b2 2e       	mov	r11, r18
   31bde:	0d 94 5c 85 	jmp	0x30ab8	; 0x30ab8 <gcode_M45(bool, signed char) [clone .constprop.63]+0x107c>
                    float w = point_weight_x(i, measured_pts[2 * i + 1]);
                    acc += j * fx * w;
                }
                {
                    float j =
                         (r == 0) ? 0.f :
   31be2:	c1 2c       	mov	r12, r1
   31be4:	d1 2c       	mov	r13, r1
   31be6:	76 01       	movw	r14, r12
   31be8:	0d 94 d3 85 	jmp	0x30ba6	; 0x30ba6 <gcode_M45(bool, signed char) [clone .constprop.63]+0x116a>
                        ((r == 1) ? 1.f :
   31bec:	c1 2c       	mov	r12, r1
   31bee:	d1 2c       	mov	r13, r1
   31bf0:	90 e8       	ldi	r25, 0x80	; 128
   31bf2:	e9 2e       	mov	r14, r25
   31bf4:	9f e3       	ldi	r25, 0x3F	; 63
   31bf6:	f9 2e       	mov	r15, r25
   31bf8:	0d 94 d3 85 	jmp	0x30ba6	; 0x30ba6 <gcode_M45(bool, signed char) [clone .constprop.63]+0x116a>
            result = (angleDiff > bed_skew_angle_extreme) ?
                BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME :
                BED_SKEW_OFFSET_DETECTION_SKEW_MILD;
        if (fabs(a1) > bed_skew_angle_extreme ||
            fabs(a2) > bed_skew_angle_extreme)
            result = BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME;
   31bfc:	12 e0       	ldi	r17, 0x02	; 2
   31bfe:	a7 cb       	rjmp	.-2226   	; 0x3134e <gcode_M45(bool, signed char) [clone .constprop.63]+0x1912>
				}
			}
			#endif // SUPPORT_VERBOSITY
			return result;
		}
        if (result == BED_SKEW_OFFSET_DETECTION_FITTING_FAILED && too_far_mask == 2){
   31c00:	1e 3f       	cpi	r17, 0xFE	; 254
   31c02:	89 f4       	brne	.+34     	; 0x31c26 <gcode_M45(bool, signed char) [clone .constprop.63]+0x21ea>
   31c04:	af 96       	adiw	r28, 0x2f	; 47
   31c06:	3f ad       	ldd	r19, Y+63	; 0x3f
   31c08:	af 97       	sbiw	r28, 0x2f	; 47
   31c0a:	32 30       	cpi	r19, 0x02	; 2
   31c0c:	09 f0       	breq	.+2      	; 0x31c10 <gcode_M45(bool, signed char) [clone .constprop.63]+0x21d4>
   31c0e:	4d cf       	rjmp	.-358    	; 0x31aaa <gcode_M45(bool, signed char) [clone .constprop.63]+0x206e>
            DBG(_n("Fitting failed => calibration failed.\n"));
   31c10:	8c e7       	ldi	r24, 0x7C	; 124
   31c12:	9b e6       	ldi	r25, 0x6B	; 107
   31c14:	9f 93       	push	r25
   31c16:	8f 93       	push	r24
   31c18:	0f 94 a2 a2 	call	0x34544	; 0x34544 <printf_P>
   31c1c:	44 cf       	rjmp	.-376    	; 0x31aa6 <gcode_M45(bool, signed char) [clone .constprop.63]+0x206a>
				// Reset the baby step value and the baby step applied flag.
				calibration_status_clear(CALIBRATION_STATUS_LIVE_ADJUST);
				eeprom_update_word_notify(reinterpret_cast<uint16_t *>(&(EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)),0);

				// Complete XYZ calibration.
				uint8_t point_too_far_mask = 0;
   31c1e:	af 96       	adiw	r28, 0x2f	; 47
   31c20:	1f ae       	std	Y+63, r1	; 0x3f
   31c22:	af 97       	sbiw	r28, 0x2f	; 47
   31c24:	42 cf       	rjmp	.-380    	; 0x31aaa <gcode_M45(bool, signed char) [clone .constprop.63]+0x206e>
				}
			}
			#endif // SUPPORT_VERBOSITY
			return result;
		}
        if (result == BED_SKEW_OFFSET_DETECTION_FITTING_FAILED && too_far_mask == 2){
   31c26:	1f ef       	ldi	r17, 0xFF	; 255
   31c28:	40 cf       	rjmp	.-384    	; 0x31aaa <gcode_M45(bool, signed char) [clone .constprop.63]+0x206e>
        else
            // The left and maybe the center point out of reach. //@todo Why isn't it found in the firmware.map
            msg = _n("XYZ calibration failed. Left front calibration point not reachable.");////MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
        lcd_show_fullscreen_message_and_wait_P(msg);
    } else {
        if (point_too_far_mask != 0) {
   31c2a:	af 96       	adiw	r28, 0x2f	; 47
   31c2c:	6f ad       	ldd	r22, Y+63	; 0x3f
   31c2e:	af 97       	sbiw	r28, 0x2f	; 47
   31c30:	61 11       	cpse	r22, r1
   31c32:	13 c0       	rjmp	.+38     	; 0x31c5a <gcode_M45(bool, signed char) [clone .constprop.63]+0x221e>
                    break;
                case BED_SKEW_OFFSET_DETECTION_PERFECT:
                    msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_PERFECT);
                    break;
                case BED_SKEW_OFFSET_DETECTION_SKEW_MILD:
                    msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD);
   31c34:	8b eb       	ldi	r24, 0xBB	; 187
   31c36:	9d e5       	ldi	r25, 0x5D	; 93
                // The left and maybe the center point out of reach. //@todo Why isn't it found in the firmware.map
                msg = _n("XYZ calibration compromised. Left front calibration point not reachable.");////MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
            lcd_show_fullscreen_message_and_wait_P(msg);
        }
        if (point_too_far_mask == 0 || result > 0) {
            switch (result) {
   31c38:	11 30       	cpi	r17, 0x01	; 1
   31c3a:	51 f0       	breq	.+20     	; 0x31c50 <gcode_M45(bool, signed char) [clone .constprop.63]+0x2214>
                    break;
                case BED_SKEW_OFFSET_DETECTION_SKEW_MILD:
                    msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD);
                    break;
                case BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME:
                    msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME);
   31c3c:	88 e7       	ldi	r24, 0x78	; 120
   31c3e:	9d e5       	ldi	r25, 0x5D	; 93
                // The left and maybe the center point out of reach. //@todo Why isn't it found in the firmware.map
                msg = _n("XYZ calibration compromised. Left front calibration point not reachable.");////MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
            lcd_show_fullscreen_message_and_wait_P(msg);
        }
        if (point_too_far_mask == 0 || result > 0) {
            switch (result) {
   31c40:	12 30       	cpi	r17, 0x02	; 2
   31c42:	31 f0       	breq	.+12     	; 0x31c50 <gcode_M45(bool, signed char) [clone .constprop.63]+0x2214>
                default:
                    // should not happen
                    msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED);
   31c44:	8f e5       	ldi	r24, 0x5F	; 95
   31c46:	9f e5       	ldi	r25, 0x5F	; 95
                // The left and maybe the center point out of reach. //@todo Why isn't it found in the firmware.map
                msg = _n("XYZ calibration compromised. Left front calibration point not reachable.");////MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
            lcd_show_fullscreen_message_and_wait_P(msg);
        }
        if (point_too_far_mask == 0 || result > 0) {
            switch (result) {
   31c48:	11 11       	cpse	r17, r1
   31c4a:	02 c0       	rjmp	.+4      	; 0x31c50 <gcode_M45(bool, signed char) [clone .constprop.63]+0x2214>
                default:
                    // should not happen
                    msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED);
                    break;
                case BED_SKEW_OFFSET_DETECTION_PERFECT:
                    msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_PERFECT);
   31c4c:	80 e0       	ldi	r24, 0x00	; 0
   31c4e:	9e e5       	ldi	r25, 0x5E	; 94
                    break;
                case BED_SKEW_OFFSET_DETECTION_SKEW_MILD:
                    msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD);
                    break;
                case BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME:
                    msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME);
   31c50:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
                    break;
            }
            lcd_show_fullscreen_message_and_wait_P(msg);
   31c54:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
   31c58:	0d c0       	rjmp	.+26     	; 0x31c74 <gcode_M45(bool, signed char) [clone .constprop.63]+0x2238>
            // The left and maybe the center point out of reach. //@todo Why isn't it found in the firmware.map
            msg = _n("XYZ calibration failed. Left front calibration point not reachable.");////MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
        lcd_show_fullscreen_message_and_wait_P(msg);
    } else {
        if (point_too_far_mask != 0) {
            if (point_too_far_mask == 2 || point_too_far_mask == 7)
   31c5a:	af 96       	adiw	r28, 0x2f	; 47
   31c5c:	8f ad       	ldd	r24, Y+63	; 0x3f
   31c5e:	af 97       	sbiw	r28, 0x2f	; 47
   31c60:	82 30       	cpi	r24, 0x02	; 2
   31c62:	f1 f4       	brne	.+60     	; 0x31ca0 <gcode_M45(bool, signed char) [clone .constprop.63]+0x2264>
                // Only the center point or all the three front points.
                msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR);
   31c64:	8f e8       	ldi	r24, 0x8F	; 143
   31c66:	9e e5       	ldi	r25, 0x5E	; 94
            else if ((point_too_far_mask & 1) == 0)
                // The right and maybe the center point out of reach.
                msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR);
   31c68:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
            else
                // The left and maybe the center point out of reach. //@todo Why isn't it found in the firmware.map
                msg = _n("XYZ calibration compromised. Left front calibration point not reachable.");////MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
            lcd_show_fullscreen_message_and_wait_P(msg);
   31c6c:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
        }
        if (point_too_far_mask == 0 || result > 0) {
   31c70:	11 16       	cp	r1, r17
   31c72:	04 f3       	brlt	.-64     	; 0x31c34 <gcode_M45(bool, signed char) [clone .constprop.63]+0x21f8>
//#endif //NEW_XYZCAL
				lcd_update_enable(true);
				lcd_update(2);

				lcd_bed_calibration_show_result(result, point_too_far_mask);
				if (result >= 0)
   31c74:	1f 3f       	cpi	r17, 0xFF	; 255
   31c76:	11 f4       	brne	.+4      	; 0x31c7c <gcode_M45(bool, signed char) [clone .constprop.63]+0x2240>
   31c78:	0d 94 b1 7d 	jmp	0x2fb62	; 0x2fb62 <gcode_M45(bool, signed char) [clone .constprop.63]+0x126>
				{
					// Calibration valid, the machine should be able to print. Advise the user to run the V2Calibration.gcode.
					calibration_status_set(CALIBRATION_STATUS_XYZ | CALIBRATION_STATUS_Z);
   31c7c:	86 e0       	ldi	r24, 0x06	; 6
   31c7e:	0e 94 4e d7 	call	0x1ae9c	; 0x1ae9c <calibration_status_set(unsigned char)>
					if (!eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE))
   31c82:	8f e5       	ldi	r24, 0x5F	; 95
   31c84:	9f e0       	ldi	r25, 0x0F	; 15
   31c86:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   31c8a:	81 11       	cpse	r24, r1
   31c8c:	0d 94 24 82 	jmp	0x30448	; 0x30448 <gcode_M45(bool, signed char) [clone .constprop.63]+0xa0c>
						lcd_show_fullscreen_message_and_wait_P(_T(MSG_BABYSTEP_Z_NOT_SET));
   31c90:	8a ef       	ldi	r24, 0xFA	; 250
   31c92:	9f e5       	ldi	r25, 0x5F	; 95
   31c94:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   31c98:	0e 94 94 ea 	call	0x1d528	; 0x1d528 <lcd_show_fullscreen_message_and_wait_P(char const*)>
   31c9c:	0d 94 24 82 	jmp	0x30448	; 0x30448 <gcode_M45(bool, signed char) [clone .constprop.63]+0xa0c>
            if (point_too_far_mask == 2 || point_too_far_mask == 7)
                // Only the center point or all the three front points.
                msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR);
            else if ((point_too_far_mask & 1) == 0)
                // The right and maybe the center point out of reach.
                msg = _T(MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR);
   31ca0:	83 e4       	ldi	r24, 0x43	; 67
   31ca2:	9e e5       	ldi	r25, 0x5E	; 94
   31ca4:	e1 cf       	rjmp	.-62     	; 0x31c68 <gcode_M45(bool, signed char) [clone .constprop.63]+0x222c>
		if ((ret = xyzcal_spiral2(cx, cy, z0 - 0*dz, dz, radius, 0, delay_us, check_pinda, &ad)) != 0)
			ad += 0;
	if (!ret && (ad < 1440))
		if ((ret = xyzcal_spiral2(cx, cy, z0 - 1*dz, dz, -radius, 0, delay_us, check_pinda, &ad)) != 0)
			ad += 720;
	if (!ret && (ad < 2160))
   31ca6:	89 81       	ldd	r24, Y+1	; 0x01
   31ca8:	9a 81       	ldd	r25, Y+2	; 0x02
   31caa:	80 37       	cpi	r24, 0x70	; 112
   31cac:	98 40       	sbci	r25, 0x08	; 8
   31cae:	10 f0       	brcs	.+4      	; 0x31cb4 <gcode_M45(bool, signed char) [clone .constprop.63]+0x2278>
   31cb0:	0d 94 5d 82 	jmp	0x304ba	; 0x304ba <gcode_M45(bool, signed char) [clone .constprop.63]+0xa7e>
		if ((ret = xyzcal_spiral2(cx, cy, z0 - 2*dz, dz, radius, 180, delay_us, check_pinda, &ad)) != 0)
   31cb4:	ae 01       	movw	r20, r28
   31cb6:	4f 5f       	subi	r20, 0xFF	; 255
   31cb8:	5f 4f       	sbci	r21, 0xFF	; 255
   31cba:	7a 01       	movw	r14, r20
   31cbc:	04 eb       	ldi	r16, 0xB4	; 180
   31cbe:	10 e0       	ldi	r17, 0x00	; 0
   31cc0:	24 e8       	ldi	r18, 0x84	; 132
   31cc2:	33 e0       	ldi	r19, 0x03	; 3
   31cc4:	a6 01       	movw	r20, r12
   31cc6:	48 5c       	subi	r20, 0xC8	; 200
   31cc8:	51 09       	sbc	r21, r1
   31cca:	69 2d       	mov	r22, r9
   31ccc:	78 2d       	mov	r23, r8
   31cce:	8b 2d       	mov	r24, r11
   31cd0:	9a 2d       	mov	r25, r10
   31cd2:	0f 94 75 5f 	call	0x2beea	; 0x2beea <xyzcal_spiral2(int, int, int, int, int, int, unsigned int, signed char, unsigned int*) [clone .constprop.66]>
   31cd6:	88 23       	and	r24, r24
   31cd8:	11 f4       	brne	.+4      	; 0x31cde <gcode_M45(bool, signed char) [clone .constprop.63]+0x22a2>
   31cda:	0d 94 5d 82 	jmp	0x304ba	; 0x304ba <gcode_M45(bool, signed char) [clone .constprop.63]+0xa7e>
			ad += 1440;
   31cde:	89 81       	ldd	r24, Y+1	; 0x01
   31ce0:	9a 81       	ldd	r25, Y+2	; 0x02
   31ce2:	80 56       	subi	r24, 0x60	; 96
   31ce4:	9a 4f       	sbci	r25, 0xFA	; 250
   31ce6:	0d 94 86 7f 	jmp	0x2ff0c	; 0x2ff0c <gcode_M45(bool, signed char) [clone .constprop.63]+0x4d0>
                        acc += a * b * w;
                    }
                    // Second for the residuum in the y axis.
                    // The first row of the points have a low weight, because their position may not be known
                    // with a sufficient accuracy.
                    if (r != 0 && c != 0) {
   31cea:	00 23       	and	r16, r16
   31cec:	11 f4       	brne	.+4      	; 0x31cf2 <gcode_M45(bool, signed char) [clone .constprop.63]+0x22b6>
   31cee:	0d 94 03 85 	jmp	0x30a06	; 0x30a06 <gcode_M45(bool, signed char) [clone .constprop.63]+0xfca>
                        float a =
                             (r == 1) ? 1.f :
                            ((r == 2) ? ( c1 * measured_pts[2 * i]) :
   31cf2:	02 30       	cpi	r16, 0x02	; 2
   31cf4:	09 f0       	breq	.+2      	; 0x31cf8 <gcode_M45(bool, signed char) [clone .constprop.63]+0x22bc>
   31cf6:	49 cf       	rjmp	.-366    	; 0x31b8a <gcode_M45(bool, signed char) [clone .constprop.63]+0x214e>
   31cf8:	d2 01       	movw	r26, r4
   31cfa:	11 96       	adiw	r26, 0x01	; 1
   31cfc:	2d 91       	ld	r18, X+
   31cfe:	3d 91       	ld	r19, X+
   31d00:	4d 91       	ld	r20, X+
   31d02:	5c 91       	ld	r21, X
   31d04:	14 97       	sbiw	r26, 0x04	; 4
   31d06:	6e 96       	adiw	r28, 0x1e	; 30
   31d08:	6c ad       	ldd	r22, Y+60	; 0x3c
   31d0a:	7d ad       	ldd	r23, Y+61	; 0x3d
   31d0c:	8e ad       	ldd	r24, Y+62	; 0x3e
   31d0e:	9f ad       	ldd	r25, Y+63	; 0x3f
   31d10:	6e 97       	sbiw	r28, 0x1e	; 30
   31d12:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   31d16:	4b 01       	movw	r8, r22
   31d18:	5c 01       	movw	r10, r24
                                        (-s2 * measured_pts[2 * i + 1]));
                        float b =
                             (c == 1) ? 1.f :
   31d1a:	60 e0       	ldi	r22, 0x00	; 0
   31d1c:	70 e0       	ldi	r23, 0x00	; 0
   31d1e:	80 e8       	ldi	r24, 0x80	; 128
   31d20:	9f e3       	ldi	r25, 0x3F	; 63
   31d22:	11 30       	cpi	r17, 0x01	; 1
   31d24:	91 f0       	breq	.+36     	; 0x31d4a <gcode_M45(bool, signed char) [clone .constprop.63]+0x230e>
                            ((c == 2) ? ( c1 * measured_pts[2 * i]) :
   31d26:	12 30       	cpi	r17, 0x02	; 2
   31d28:	09 f0       	breq	.+2      	; 0x31d2c <gcode_M45(bool, signed char) [clone .constprop.63]+0x22f0>
   31d2a:	3b cf       	rjmp	.-394    	; 0x31ba2 <gcode_M45(bool, signed char) [clone .constprop.63]+0x2166>
   31d2c:	d2 01       	movw	r26, r4
   31d2e:	11 96       	adiw	r26, 0x01	; 1
   31d30:	2d 91       	ld	r18, X+
   31d32:	3d 91       	ld	r19, X+
   31d34:	4d 91       	ld	r20, X+
   31d36:	5c 91       	ld	r21, X
   31d38:	14 97       	sbiw	r26, 0x04	; 4
   31d3a:	6e 96       	adiw	r28, 0x1e	; 30
   31d3c:	6c ad       	ldd	r22, Y+60	; 0x3c
   31d3e:	7d ad       	ldd	r23, Y+61	; 0x3d
   31d40:	8e ad       	ldd	r24, Y+62	; 0x3e
   31d42:	9f ad       	ldd	r25, Y+63	; 0x3f
   31d44:	6e 97       	sbiw	r28, 0x1e	; 30
   31d46:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
                                        (-s2 * measured_pts[2 * i + 1]));
                        float w = point_weight_y(i, measured_pts[2 * i + 1]);
                        acc += a * b * w;
   31d4a:	9b 01       	movw	r18, r22
   31d4c:	ac 01       	movw	r20, r24
   31d4e:	c5 01       	movw	r24, r10
   31d50:	b4 01       	movw	r22, r8
   31d52:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   31d56:	9b 01       	movw	r18, r22
   31d58:	ac 01       	movw	r20, r24
   31d5a:	c7 01       	movw	r24, r14
   31d5c:	b6 01       	movw	r22, r12
   31d5e:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   31d62:	6b 01       	movw	r12, r22
   31d64:	7c 01       	movw	r14, r24
   31d66:	0d 94 03 85 	jmp	0x30a06	; 0x30a06 <gcode_M45(bool, signed char) [clone .constprop.63]+0xfca>
                // J^T times J
                for (uint8_t i = 0; i < npts; ++i) {
                    // First for the residuum in the x axis:
                    if (r != 1 && c != 1) {
                        float a =
                             (r == 0) ? 1.f :
   31d6a:	81 2c       	mov	r8, r1
   31d6c:	91 2c       	mov	r9, r1
   31d6e:	50 e8       	ldi	r21, 0x80	; 128
   31d70:	a5 2e       	mov	r10, r21
   31d72:	5f e3       	ldi	r21, 0x3F	; 63
   31d74:	b5 2e       	mov	r11, r21
                            ((r == 2) ? (-s1 * measured_pts[2 * i]) :
                                        (-c2 * measured_pts[2 * i + 1]));
                        float b =
                             (c == 0) ? 1.f :
   31d76:	11 11       	cpse	r17, r1
   31d78:	0d 94 dd 84 	jmp	0x309ba	; 0x309ba <gcode_M45(bool, signed char) [clone .constprop.63]+0xf7e>
                            ((c == 2) ? (-s1 * measured_pts[2 * i]) :
                                        (-c2 * measured_pts[2 * i + 1]));
                        float w = point_weight_x(i, measured_pts[2 * i + 1]);
                        acc += a * b * w;
   31d7c:	20 e0       	ldi	r18, 0x00	; 0
   31d7e:	30 e0       	ldi	r19, 0x00	; 0
   31d80:	40 e8       	ldi	r20, 0x80	; 128
   31d82:	5f e3       	ldi	r21, 0x3F	; 63
   31d84:	ea cf       	rjmp	.-44     	; 0x31d5a <gcode_M45(bool, signed char) [clone .constprop.63]+0x231e>
                    // Second for the residuum in the y axis.
                    // The first row of the points have a low weight, because their position may not be known
                    // with a sufficient accuracy.
                    if (r != 0 && c != 0) {
                        float a =
                             (r == 1) ? 1.f :
   31d86:	81 2c       	mov	r8, r1
   31d88:	91 2c       	mov	r9, r1
   31d8a:	40 e8       	ldi	r20, 0x80	; 128
   31d8c:	a4 2e       	mov	r10, r20
   31d8e:	4f e3       	ldi	r20, 0x3F	; 63
   31d90:	b4 2e       	mov	r11, r20
                        acc += a * b * w;
                    }
                    // Second for the residuum in the y axis.
                    // The first row of the points have a low weight, because their position may not be known
                    // with a sufficient accuracy.
                    if (r != 0 && c != 0) {
   31d92:	11 11       	cpse	r17, r1
   31d94:	c2 cf       	rjmp	.-124    	; 0x31d1a <gcode_M45(bool, signed char) [clone .constprop.63]+0x22de>
   31d96:	0d 94 03 85 	jmp	0x30a06	; 0x30a06 <gcode_M45(bool, signed char) [clone .constprop.63]+0xfca>
   31d9a:	11 11       	cpse	r17, r1
   31d9c:	aa cf       	rjmp	.-172    	; 0x31cf2 <gcode_M45(bool, signed char) [clone .constprop.63]+0x22b6>
   31d9e:	0d 94 03 85 	jmp	0x30a06	; 0x30a06 <gcode_M45(bool, signed char) [clone .constprop.63]+0xfca>

00031da2 <lcd_selftest_manual_fan_check(unsigned char, bool, bool) [clone .constprop.62]>:
    return true;
}
#endif //(FILAMENT_SENSOR_TYPE == FSENSOR_IR) || (FILAMENT_SENSOR_TYPE == FSENSOR_IR_ANALOG)
#endif //FILAMENT_SENSOR

static bool lcd_selftest_manual_fan_check(const uint8_t _fan, const bool check_opposite,
   31da2:	1f 93       	push	r17
   31da4:	cf 93       	push	r28
   31da6:	df 93       	push	r29
   31da8:	c8 2f       	mov	r28, r24
   31daa:	d6 2f       	mov	r29, r22
	const bool _default)
{

	bool _result = check_opposite;
	lcd_clear();
   31dac:	0e 94 26 70 	call	0xe04c	; 0xe04c <lcd_clear()>

	lcd_puts_at_P(0, 0, _T(MSG_SELFTEST_FAN));
   31db0:	8d e6       	ldi	r24, 0x6D	; 109
   31db2:	9d e5       	ldi	r25, 0x5D	; 93
   31db4:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   31db8:	ac 01       	movw	r20, r24
   31dba:	60 e0       	ldi	r22, 0x00	; 0
   31dbc:	80 e0       	ldi	r24, 0x00	; 0
   31dbe:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
		lcd_puts_at_P(0, 1, check_opposite ? _T(MSG_SELFTEST_PART_FAN) : _T(MSG_SELFTEST_HOTEND_FAN));
		setExtruderAutoFanState(3);
		break;
	case 1:
		// object cooling fan
		lcd_puts_at_P(0, 1, check_opposite ? _T(MSG_SELFTEST_HOTEND_FAN) : _T(MSG_SELFTEST_PART_FAN));
   31dc2:	87 e4       	ldi	r24, 0x47	; 71
   31dc4:	9d e5       	ldi	r25, 0x5D	; 93
   31dc6:	c1 11       	cpse	r28, r1
   31dc8:	02 c0       	rjmp	.+4      	; 0x31dce <lcd_selftest_manual_fan_check(unsigned char, bool, bool) [clone .constprop.62]+0x2c>
   31dca:	8a e5       	ldi	r24, 0x5A	; 90
   31dcc:	9d e5       	ldi	r25, 0x5D	; 93
   31dce:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   31dd2:	ac 01       	movw	r20, r24
   31dd4:	61 e0       	ldi	r22, 0x01	; 1
   31dd6:	80 e0       	ldi	r24, 0x00	; 0
   31dd8:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
}

/// @brief Set print fan speed
/// @param speed ranges from 0 to 255
static void lcd_selftest_setfan(const uint8_t speed) {
    fanSpeed = speed;
   31ddc:	8f ef       	ldi	r24, 0xFF	; 255
   31dde:	80 93 55 12 	sts	0x1255, r24	; 0x801255 <fanSpeed>
#ifdef FAN_SOFT_PWM
    fanSpeedSoftPwm = speed;
   31de2:	80 93 1d 06 	sts	0x061D, r24	; 0x80061d <fanSpeedSoftPwm>
#endif
    manage_heater();
   31de6:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
		// object cooling fan
		lcd_puts_at_P(0, 1, check_opposite ? _T(MSG_SELFTEST_HOTEND_FAN) : _T(MSG_SELFTEST_PART_FAN));
		lcd_selftest_setfan(255);
		break;
	}
	_delay(500);
   31dea:	64 ef       	ldi	r22, 0xF4	; 244
   31dec:	71 e0       	ldi	r23, 0x01	; 1
   31dee:	80 e0       	ldi	r24, 0x00	; 0
   31df0:	90 e0       	ldi	r25, 0x00	; 0
   31df2:	0f 94 bd 0d 	call	0x21b7a	; 0x21b7a <delay2>

	lcd_puts_at_P(1, 2, _T(MSG_SELFTEST_FAN_YES));
   31df6:	8c e3       	ldi	r24, 0x3C	; 60
   31df8:	9d e5       	ldi	r25, 0x5D	; 93
   31dfa:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   31dfe:	ac 01       	movw	r20, r24
   31e00:	62 e0       	ldi	r22, 0x02	; 2
   31e02:	81 e0       	ldi	r24, 0x01	; 1
   31e04:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
	lcd_putc_at(0, 3, '>');
   31e08:	4e e3       	ldi	r20, 0x3E	; 62
   31e0a:	63 e0       	ldi	r22, 0x03	; 3
   31e0c:	80 e0       	ldi	r24, 0x00	; 0
   31e0e:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
	lcd_puts_P(_T(MSG_SELFTEST_FAN_NO));
   31e12:	8d e2       	ldi	r24, 0x2D	; 45
   31e14:	9d e5       	ldi	r25, 0x5D	; 93
   31e16:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   31e1a:	0e 94 1d 6f 	call	0xde3a	; 0xde3a <lcd_puts_P(char const*)>

	lcd_encoder = _default;
   31e1e:	6d 2f       	mov	r22, r29
   31e20:	70 e0       	ldi	r23, 0x00	; 0
   31e22:	70 93 1f 06 	sts	0x061F, r23	; 0x80061f <lcd_encoder+0x1>
   31e26:	60 93 1e 06 	sts	0x061E, r22	; 0x80061e <lcd_encoder>

	KEEPALIVE_STATE(PAUSED_FOR_USER);
   31e2a:	84 e0       	ldi	r24, 0x04	; 4
   31e2c:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
	lcd_consume_click();
   31e30:	0e 94 70 73 	call	0xe6e0	; 0xe6e0 <lcd_consume_click()>
   31e34:	dc 2f       	mov	r29, r28

	do
	{
		if (lcd_encoder) {
			if (lcd_encoder < 0) {
				_result = !check_opposite;
   31e36:	11 e0       	ldi	r17, 0x01	; 1
   31e38:	1c 27       	eor	r17, r28
	KEEPALIVE_STATE(PAUSED_FOR_USER);
	lcd_consume_click();

	do
	{
		if (lcd_encoder) {
   31e3a:	80 91 1e 06 	lds	r24, 0x061E	; 0x80061e <lcd_encoder>
   31e3e:	90 91 1f 06 	lds	r25, 0x061F	; 0x80061f <lcd_encoder+0x1>
   31e42:	00 97       	sbiw	r24, 0x00	; 0
   31e44:	19 f1       	breq	.+70     	; 0x31e8c <lcd_selftest_manual_fan_check(unsigned char, bool, bool) [clone .constprop.62]+0xea>
			if (lcd_encoder < 0) {
   31e46:	97 ff       	sbrs	r25, 7
   31e48:	0b c0       	rjmp	.+22     	; 0x31e60 <lcd_selftest_manual_fan_check(unsigned char, bool, bool) [clone .constprop.62]+0xbe>
				_result = !check_opposite;
   31e4a:	d1 2f       	mov	r29, r17
				lcd_putc_at(0, 2, '>');
   31e4c:	4e e3       	ldi	r20, 0x3E	; 62
   31e4e:	62 e0       	ldi	r22, 0x02	; 2
   31e50:	80 e0       	ldi	r24, 0x00	; 0
   31e52:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
				lcd_putc_at(0, 3, ' ');
   31e56:	40 e2       	ldi	r20, 0x20	; 32
   31e58:	63 e0       	ldi	r22, 0x03	; 3
   31e5a:	80 e0       	ldi	r24, 0x00	; 0
   31e5c:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
			}

			if (lcd_encoder > 0) {
   31e60:	80 91 1e 06 	lds	r24, 0x061E	; 0x80061e <lcd_encoder>
   31e64:	90 91 1f 06 	lds	r25, 0x061F	; 0x80061f <lcd_encoder+0x1>
   31e68:	18 16       	cp	r1, r24
   31e6a:	19 06       	cpc	r1, r25
   31e6c:	5c f4       	brge	.+22     	; 0x31e84 <lcd_selftest_manual_fan_check(unsigned char, bool, bool) [clone .constprop.62]+0xe2>
				_result = check_opposite;
				lcd_putc_at(0, 2, ' ');
   31e6e:	40 e2       	ldi	r20, 0x20	; 32
   31e70:	62 e0       	ldi	r22, 0x02	; 2
   31e72:	80 e0       	ldi	r24, 0x00	; 0
   31e74:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
				lcd_putc_at(0, 3, '>');
   31e78:	4e e3       	ldi	r20, 0x3E	; 62
   31e7a:	63 e0       	ldi	r22, 0x03	; 3
   31e7c:	80 e0       	ldi	r24, 0x00	; 0
   31e7e:	0e 94 13 70 	call	0xe026	; 0xe026 <lcd_putc_at(unsigned char, unsigned char, char)>
   31e82:	dc 2f       	mov	r29, r28
			}
			lcd_encoder = 0;
   31e84:	10 92 1f 06 	sts	0x061F, r1	; 0x80061f <lcd_encoder+0x1>
   31e88:	10 92 1e 06 	sts	0x061E, r1	; 0x80061e <lcd_encoder>
		}

		manage_heater();
   31e8c:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
		manage_inactivity(true);
   31e90:	81 e0       	ldi	r24, 0x01	; 1
   31e92:	0e 94 34 8c 	call	0x11868	; 0x11868 <manage_inactivity(bool)>
		_delay(100);
   31e96:	64 e6       	ldi	r22, 0x64	; 100
   31e98:	70 e0       	ldi	r23, 0x00	; 0
   31e9a:	80 e0       	ldi	r24, 0x00	; 0
   31e9c:	90 e0       	ldi	r25, 0x00	; 0
   31e9e:	0f 94 bd 0d 	call	0x21b7a	; 0x21b7a <delay2>

	} while (!lcd_clicked());
   31ea2:	0e 94 75 73 	call	0xe6ea	; 0xe6ea <lcd_clicked()>
   31ea6:	88 23       	and	r24, r24
   31ea8:	41 f2       	breq	.-112    	; 0x31e3a <lcd_selftest_manual_fan_check(unsigned char, bool, bool) [clone .constprop.62]+0x98>
	KEEPALIVE_STATE(IN_HANDLER);
   31eaa:	82 e0       	ldi	r24, 0x02	; 2
   31eac:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>
	setExtruderAutoFanState(0); // Turn off hotend fan
   31eb0:	80 e0       	ldi	r24, 0x00	; 0
   31eb2:	0e 94 af 77 	call	0xef5e	; 0xef5e <setExtruderAutoFanState(unsigned char)>
}

/// @brief Set print fan speed
/// @param speed ranges from 0 to 255
static void lcd_selftest_setfan(const uint8_t speed) {
    fanSpeed = speed;
   31eb6:	10 92 55 12 	sts	0x1255, r1	; 0x801255 <fanSpeed>
#ifdef FAN_SOFT_PWM
    fanSpeedSoftPwm = speed;
   31eba:	10 92 1d 06 	sts	0x061D, r1	; 0x80061d <fanSpeedSoftPwm>
#endif
    manage_heater();
   31ebe:	0f 94 1c 3a 	call	0x27438	; 0x27438 <manage_heater()>
	KEEPALIVE_STATE(IN_HANDLER);
	setExtruderAutoFanState(0); // Turn off hotend fan
	lcd_selftest_setfan(0); // Turn off print fan

	return _result;
}
   31ec2:	8d 2f       	mov	r24, r29
   31ec4:	df 91       	pop	r29
   31ec6:	cf 91       	pop	r28
   31ec8:	1f 91       	pop	r17
   31eca:	08 95       	ret

00031ecc <analog2temp(int, unsigned char) [clone .constprop.59]>:

#define PGM_RD_W(x)   (short)pgm_read_word(&x)
// Derived from RepRap FiveD extruder::getTemperature()
// For hot end temperature measurement.
static float analog2temp(int raw, uint8_t e) {
   31ecc:	4f 92       	push	r4
   31ece:	5f 92       	push	r5
   31ed0:	6f 92       	push	r6
   31ed2:	7f 92       	push	r7
   31ed4:	af 92       	push	r10
   31ed6:	bf 92       	push	r11
   31ed8:	cf 92       	push	r12
   31eda:	df 92       	push	r13
   31edc:	ef 92       	push	r14
   31ede:	ff 92       	push	r15
   31ee0:	0f 93       	push	r16
   31ee2:	1f 93       	push	r17
   31ee4:	cf 93       	push	r28
   31ee6:	df 93       	push	r29
   31ee8:	24 e0       	ldi	r18, 0x04	; 4
   31eea:	30 e0       	ldi	r19, 0x00	; 0
   31eec:	41 e0       	ldi	r20, 0x01	; 1
   31eee:	50 e0       	ldi	r21, 0x00	; 0
   31ef0:	d9 01       	movw	r26, r18
   31ef2:	ac 50       	subi	r26, 0x0C	; 12
   31ef4:	b6 46       	sbci	r27, 0x66	; 102
    uint8_t i;
    short (*tt)[][2] = (short (*)[][2])(heater_ttbl_map[e]);

    for (i=1; i<heater_ttbllen_map[e]; i++)
    {
      if (PGM_RD_W((*tt)[i][0]) > raw)
   31ef6:	fd 01       	movw	r30, r26
   31ef8:	65 91       	lpm	r22, Z+
   31efa:	74 91       	lpm	r23, Z
   31efc:	86 17       	cp	r24, r22
   31efe:	97 07       	cpc	r25, r23
   31f00:	0c f0       	brlt	.+2      	; 0x31f04 <analog2temp(int, unsigned char) [clone .constprop.59]+0x38>
   31f02:	66 c0       	rjmp	.+204    	; 0x31fd0 <analog2temp(int, unsigned char) [clone .constprop.59]+0x104>
      {
        celsius = PGM_RD_W((*tt)[i-1][1]) +
   31f04:	41 50       	subi	r20, 0x01	; 1
   31f06:	51 09       	sbc	r21, r1
   31f08:	44 0f       	add	r20, r20
   31f0a:	55 1f       	adc	r21, r21
   31f0c:	44 0f       	add	r20, r20
   31f0e:	55 1f       	adc	r21, r21
   31f10:	ea 01       	movw	r28, r20
   31f12:	ca 50       	subi	r28, 0x0A	; 10
   31f14:	d6 46       	sbci	r29, 0x66	; 102
   31f16:	fe 01       	movw	r30, r28
   31f18:	05 91       	lpm	r16, Z+
   31f1a:	14 91       	lpm	r17, Z
          (raw - PGM_RD_W((*tt)[i-1][0])) *
   31f1c:	4c 50       	subi	r20, 0x0C	; 12
   31f1e:	56 46       	sbci	r21, 0x66	; 102
   31f20:	fa 01       	movw	r30, r20
   31f22:	65 91       	lpm	r22, Z+
   31f24:	74 91       	lpm	r23, Z
          (float)(PGM_RD_W((*tt)[i][1]) - PGM_RD_W((*tt)[i-1][1])) /
   31f26:	f9 01       	movw	r30, r18
   31f28:	ea 50       	subi	r30, 0x0A	; 10
   31f2a:	f6 46       	sbci	r31, 0x66	; 102
   31f2c:	e5 90       	lpm	r14, Z+
   31f2e:	f4 90       	lpm	r15, Z
   31f30:	fe 01       	movw	r30, r28
   31f32:	c5 90       	lpm	r12, Z+
   31f34:	d4 90       	lpm	r13, Z
          (float)(PGM_RD_W((*tt)[i][0]) - PGM_RD_W((*tt)[i-1][0]));
   31f36:	fd 01       	movw	r30, r26
   31f38:	c5 91       	lpm	r28, Z+
   31f3a:	d4 91       	lpm	r29, Z
   31f3c:	fa 01       	movw	r30, r20
   31f3e:	a5 90       	lpm	r10, Z+
   31f40:	b4 90       	lpm	r11, Z
    for (i=1; i<heater_ttbllen_map[e]; i++)
    {
      if (PGM_RD_W((*tt)[i][0]) > raw)
      {
        celsius = PGM_RD_W((*tt)[i-1][1]) +
          (raw - PGM_RD_W((*tt)[i-1][0])) *
   31f42:	86 1b       	sub	r24, r22
   31f44:	97 0b       	sbc	r25, r23
   31f46:	bc 01       	movw	r22, r24
   31f48:	99 0f       	add	r25, r25
   31f4a:	88 0b       	sbc	r24, r24
   31f4c:	99 0b       	sbc	r25, r25
   31f4e:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   31f52:	2b 01       	movw	r4, r22
   31f54:	3c 01       	movw	r6, r24
          (float)(PGM_RD_W((*tt)[i][1]) - PGM_RD_W((*tt)[i-1][1])) /
   31f56:	b7 01       	movw	r22, r14
   31f58:	6c 19       	sub	r22, r12
   31f5a:	7d 09       	sbc	r23, r13
   31f5c:	07 2e       	mov	r0, r23
   31f5e:	00 0c       	add	r0, r0
   31f60:	88 0b       	sbc	r24, r24
   31f62:	99 0b       	sbc	r25, r25
   31f64:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   31f68:	9b 01       	movw	r18, r22
   31f6a:	ac 01       	movw	r20, r24
    for (i=1; i<heater_ttbllen_map[e]; i++)
    {
      if (PGM_RD_W((*tt)[i][0]) > raw)
      {
        celsius = PGM_RD_W((*tt)[i-1][1]) +
          (raw - PGM_RD_W((*tt)[i-1][0])) *
   31f6c:	c3 01       	movw	r24, r6
   31f6e:	b2 01       	movw	r22, r4
   31f70:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   31f74:	6b 01       	movw	r12, r22
   31f76:	7c 01       	movw	r14, r24
          (float)(PGM_RD_W((*tt)[i][1]) - PGM_RD_W((*tt)[i-1][1])) /
          (float)(PGM_RD_W((*tt)[i][0]) - PGM_RD_W((*tt)[i-1][0]));
   31f78:	be 01       	movw	r22, r28
   31f7a:	6a 19       	sub	r22, r10
   31f7c:	7b 09       	sbc	r23, r11
   31f7e:	07 2e       	mov	r0, r23
   31f80:	00 0c       	add	r0, r0
   31f82:	88 0b       	sbc	r24, r24
   31f84:	99 0b       	sbc	r25, r25
   31f86:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   31f8a:	9b 01       	movw	r18, r22
   31f8c:	ac 01       	movw	r20, r24
    {
      if (PGM_RD_W((*tt)[i][0]) > raw)
      {
        celsius = PGM_RD_W((*tt)[i-1][1]) +
          (raw - PGM_RD_W((*tt)[i-1][0])) *
          (float)(PGM_RD_W((*tt)[i][1]) - PGM_RD_W((*tt)[i-1][1])) /
   31f8e:	c7 01       	movw	r24, r14
   31f90:	b6 01       	movw	r22, r12
   31f92:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   31f96:	6b 01       	movw	r12, r22
   31f98:	7c 01       	movw	r14, r24

    for (i=1; i<heater_ttbllen_map[e]; i++)
    {
      if (PGM_RD_W((*tt)[i][0]) > raw)
      {
        celsius = PGM_RD_W((*tt)[i-1][1]) +
   31f9a:	b8 01       	movw	r22, r16
   31f9c:	11 0f       	add	r17, r17
   31f9e:	88 0b       	sbc	r24, r24
   31fa0:	99 0b       	sbc	r25, r25
   31fa2:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   31fa6:	9b 01       	movw	r18, r22
   31fa8:	ac 01       	movw	r20, r24
   31faa:	c7 01       	movw	r24, r14
   31fac:	b6 01       	movw	r22, r12
   31fae:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    if (i == heater_ttbllen_map[e]) celsius = PGM_RD_W((*tt)[i-1][1]);

    return celsius;
  }
  return ((raw * ((5.0 * 100.0) / 1024.0) / OVERSAMPLENR) * TEMP_SENSOR_AD595_GAIN) + TEMP_SENSOR_AD595_OFFSET;
}
   31fb2:	df 91       	pop	r29
   31fb4:	cf 91       	pop	r28
   31fb6:	1f 91       	pop	r17
   31fb8:	0f 91       	pop	r16
   31fba:	ff 90       	pop	r15
   31fbc:	ef 90       	pop	r14
   31fbe:	df 90       	pop	r13
   31fc0:	cf 90       	pop	r12
   31fc2:	bf 90       	pop	r11
   31fc4:	af 90       	pop	r10
   31fc6:	7f 90       	pop	r7
   31fc8:	6f 90       	pop	r6
   31fca:	5f 90       	pop	r5
   31fcc:	4f 90       	pop	r4
   31fce:	08 95       	ret
   31fd0:	4f 5f       	subi	r20, 0xFF	; 255
   31fd2:	5f 4f       	sbci	r21, 0xFF	; 255
   31fd4:	2c 5f       	subi	r18, 0xFC	; 252
   31fd6:	3f 4f       	sbci	r19, 0xFF	; 255
  {
    float celsius = 0;
    uint8_t i;
    short (*tt)[][2] = (short (*)[][2])(heater_ttbl_map[e]);

    for (i=1; i<heater_ttbllen_map[e]; i++)
   31fd8:	20 38       	cpi	r18, 0x80	; 128
   31fda:	31 05       	cpc	r19, r1
   31fdc:	09 f0       	breq	.+2      	; 0x31fe0 <analog2temp(int, unsigned char) [clone .constprop.59]+0x114>
   31fde:	88 cf       	rjmp	.-240    	; 0x31ef0 <analog2temp(int, unsigned char) [clone .constprop.59]+0x24>
        break;
      }
    }

    // Overflow: Set to last value in the table
    if (i == heater_ttbllen_map[e]) celsius = PGM_RD_W((*tt)[i-1][1]);
   31fe0:	e2 e7       	ldi	r30, 0x72	; 114
   31fe2:	fa e9       	ldi	r31, 0x9A	; 154
   31fe4:	65 91       	lpm	r22, Z+
   31fe6:	74 91       	lpm	r23, Z
   31fe8:	07 2e       	mov	r0, r23
   31fea:	00 0c       	add	r0, r0
   31fec:	88 0b       	sbc	r24, r24
   31fee:	99 0b       	sbc	r25, r25
   31ff0:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   31ff4:	de cf       	rjmp	.-68     	; 0x31fb2 <analog2temp(int, unsigned char) [clone .constprop.59]+0xe6>

00031ff6 <MarlinSerial::begin(long) [clone .constprop.57]>:
    useU2X = false;
  }
#endif
// set up the first (original serial port)
  if (useU2X) {
    M_UCSRxA = 1 << M_U2Xx;
   31ff6:	22 e0       	ldi	r18, 0x02	; 2
   31ff8:	20 93 c0 00 	sts	0x00C0, r18	; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7c20c0>
    M_UCSRxA = 0;
    baud_setting = (F_CPU / 8 / baud - 1) / 2;
  }

  // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register)
  M_UBRRxH = baud_setting >> 8;
   31ffc:	10 92 c5 00 	sts	0x00C5, r1	; 0x8000c5 <__TEXT_REGION_LENGTH__+0x7c20c5>
  M_UBRRxL = baud_setting;
   32000:	90 e1       	ldi	r25, 0x10	; 16
   32002:	90 93 c4 00 	sts	0x00C4, r25	; 0x8000c4 <__TEXT_REGION_LENGTH__+0x7c20c4>

  sbi(M_UCSRxB, M_RXENx);
   32006:	80 91 c1 00 	lds	r24, 0x00C1	; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7c20c1>
   3200a:	80 61       	ori	r24, 0x10	; 16
   3200c:	80 93 c1 00 	sts	0x00C1, r24	; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7c20c1>
  sbi(M_UCSRxB, M_TXENx);
   32010:	80 91 c1 00 	lds	r24, 0x00C1	; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7c20c1>
   32014:	88 60       	ori	r24, 0x08	; 8
   32016:	80 93 c1 00 	sts	0x00C1, r24	; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7c20c1>
  sbi(M_UCSRxB, M_RXCIEx);
   3201a:	80 91 c1 00 	lds	r24, 0x00C1	; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7c20c1>
   3201e:	80 68       	ori	r24, 0x80	; 128
   32020:	80 93 c1 00 	sts	0x00C1, r24	; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7c20c1>

  if (selectedSerialPort == 1) { //set up also the second serial port
   32024:	80 91 1c 06 	lds	r24, 0x061C	; 0x80061c <selectedSerialPort>
   32028:	81 30       	cpi	r24, 0x01	; 1
   3202a:	a9 f4       	brne	.+42     	; 0x32056 <MarlinSerial::begin(long) [clone .constprop.57]+0x60>
	  if (useU2X) {
		  UCSR1A = 1 << U2X1;
   3202c:	20 93 c8 00 	sts	0x00C8, r18	; 0x8000c8 <__TEXT_REGION_LENGTH__+0x7c20c8>
		  UCSR1A = 0;
		  baud_setting = (F_CPU / 8 / baud - 1) / 2;
	  }

	  // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register)
	  UBRR1H = baud_setting >> 8;
   32030:	10 92 cd 00 	sts	0x00CD, r1	; 0x8000cd <__TEXT_REGION_LENGTH__+0x7c20cd>
	  UBRR1L = baud_setting;
   32034:	90 93 cc 00 	sts	0x00CC, r25	; 0x8000cc <__TEXT_REGION_LENGTH__+0x7c20cc>

	  sbi(UCSR1B, RXEN1);
   32038:	80 91 c9 00 	lds	r24, 0x00C9	; 0x8000c9 <__TEXT_REGION_LENGTH__+0x7c20c9>
   3203c:	80 61       	ori	r24, 0x10	; 16
   3203e:	80 93 c9 00 	sts	0x00C9, r24	; 0x8000c9 <__TEXT_REGION_LENGTH__+0x7c20c9>
	  sbi(UCSR1B, TXEN1);
   32042:	80 91 c9 00 	lds	r24, 0x00C9	; 0x8000c9 <__TEXT_REGION_LENGTH__+0x7c20c9>
   32046:	88 60       	ori	r24, 0x08	; 8
   32048:	80 93 c9 00 	sts	0x00C9, r24	; 0x8000c9 <__TEXT_REGION_LENGTH__+0x7c20c9>
	  sbi(UCSR1B, RXCIE1);
   3204c:	80 91 c9 00 	lds	r24, 0x00C9	; 0x8000c9 <__TEXT_REGION_LENGTH__+0x7c20c9>
   32050:	80 68       	ori	r24, 0x80	; 128
   32052:	80 93 c9 00 	sts	0x00C9, r24	; 0x8000c9 <__TEXT_REGION_LENGTH__+0x7c20c9>
  }
}
   32056:	08 95       	ret

00032058 <retract(bool, bool) [clone .constprop.54]>:
{
  previous_millis_cmd.start();
}

#ifdef FWRETRACT
void retract(bool retracting, bool swapretract = false) {
   32058:	8f 92       	push	r8
   3205a:	9f 92       	push	r9
   3205c:	af 92       	push	r10
   3205e:	bf 92       	push	r11
   32060:	cf 92       	push	r12
   32062:	df 92       	push	r13
   32064:	ef 92       	push	r14
   32066:	ff 92       	push	r15
   32068:	90 91 1b 06 	lds	r25, 0x061B	; 0x80061b <retracted>
    // Perform FW retraction, just if needed, but behave as if the move has never took place in
    // order to keep E/Z coordinates unchanged. This is done by manipulating the internal planner
    // position, which requires a sync
    if(retracting && !retracted[active_extruder]) {
   3206c:	88 23       	and	r24, r24
   3206e:	09 f4       	brne	.+2      	; 0x32072 <retract(bool, bool) [clone .constprop.54]+0x1a>
   32070:	9d c0       	rjmp	.+314    	; 0x321ac <retract(bool, bool) [clone .constprop.54]+0x154>
   32072:	91 11       	cpse	r25, r1
   32074:	92 c0       	rjmp	.+292    	; 0x3219a <retract(bool, bool) [clone .constprop.54]+0x142>
        st_synchronize();
   32076:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
        set_destination_to_current();
   3207a:	0e 94 ae 66 	call	0xcd5c	; 0xcd5c <set_destination_to_current()>
        current_position[E_AXIS]+=(swapretract?retract_length_swap:cs.retract_length)*float(extrudemultiply)*0.01f;
   3207e:	60 91 75 02 	lds	r22, 0x0275	; 0x800275 <extrudemultiply>
   32082:	70 91 76 02 	lds	r23, 0x0276	; 0x800276 <extrudemultiply+0x1>
   32086:	07 2e       	mov	r0, r23
   32088:	00 0c       	add	r0, r0
   3208a:	88 0b       	sbc	r24, r24
   3208c:	99 0b       	sbc	r25, r25
   3208e:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   32092:	20 91 ea 0d 	lds	r18, 0x0DEA	; 0x800dea <cs+0x83>
   32096:	30 91 eb 0d 	lds	r19, 0x0DEB	; 0x800deb <cs+0x84>
   3209a:	40 91 ec 0d 	lds	r20, 0x0DEC	; 0x800dec <cs+0x85>
   3209e:	50 91 ed 0d 	lds	r21, 0x0DED	; 0x800ded <cs+0x86>
   320a2:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   320a6:	2a e0       	ldi	r18, 0x0A	; 10
   320a8:	37 ed       	ldi	r19, 0xD7	; 215
   320aa:	43 e2       	ldi	r20, 0x23	; 35
   320ac:	5c e3       	ldi	r21, 0x3C	; 60
   320ae:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   320b2:	20 91 6d 12 	lds	r18, 0x126D	; 0x80126d <current_position+0xc>
   320b6:	30 91 6e 12 	lds	r19, 0x126E	; 0x80126e <current_position+0xd>
   320ba:	40 91 6f 12 	lds	r20, 0x126F	; 0x80126f <current_position+0xe>
   320be:	50 91 70 12 	lds	r21, 0x1270	; 0x801270 <current_position+0xf>
   320c2:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   320c6:	60 93 6d 12 	sts	0x126D, r22	; 0x80126d <current_position+0xc>
   320ca:	70 93 6e 12 	sts	0x126E, r23	; 0x80126e <current_position+0xd>
   320ce:	80 93 6f 12 	sts	0x126F, r24	; 0x80126f <current_position+0xe>
   320d2:	90 93 70 12 	sts	0x1270, r25	; 0x801270 <current_position+0xf>
        plan_set_e_position(current_position[E_AXIS]);
   320d6:	8d e6       	ldi	r24, 0x6D	; 109
   320d8:	92 e1       	ldi	r25, 0x12	; 18
   320da:	0f 94 d9 3c 	call	0x279b2	; 0x279b2 <plan_set_e_position(float const&)>
        float oldFeedrate = feedrate;
   320de:	c0 90 7a 02 	lds	r12, 0x027A	; 0x80027a <feedrate>
   320e2:	d0 90 7b 02 	lds	r13, 0x027B	; 0x80027b <feedrate+0x1>
   320e6:	e0 90 7c 02 	lds	r14, 0x027C	; 0x80027c <feedrate+0x2>
   320ea:	f0 90 7d 02 	lds	r15, 0x027D	; 0x80027d <feedrate+0x3>
        feedrate=cs.retract_feedrate*60;
   320ee:	20 e0       	ldi	r18, 0x00	; 0
   320f0:	30 e0       	ldi	r19, 0x00	; 0
   320f2:	40 e7       	ldi	r20, 0x70	; 112
   320f4:	52 e4       	ldi	r21, 0x42	; 66
   320f6:	60 91 ee 0d 	lds	r22, 0x0DEE	; 0x800dee <cs+0x87>
   320fa:	70 91 ef 0d 	lds	r23, 0x0DEF	; 0x800def <cs+0x88>
   320fe:	80 91 f0 0d 	lds	r24, 0x0DF0	; 0x800df0 <cs+0x89>
   32102:	90 91 f1 0d 	lds	r25, 0x0DF1	; 0x800df1 <cs+0x8a>
   32106:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   3210a:	60 93 7a 02 	sts	0x027A, r22	; 0x80027a <feedrate>
   3210e:	70 93 7b 02 	sts	0x027B, r23	; 0x80027b <feedrate+0x1>
   32112:	80 93 7c 02 	sts	0x027C, r24	; 0x80027c <feedrate+0x2>
   32116:	90 93 7d 02 	sts	0x027D, r25	; 0x80027d <feedrate+0x3>
        retracted[active_extruder]=true;
   3211a:	81 e0       	ldi	r24, 0x01	; 1
   3211c:	80 93 1b 06 	sts	0x061B, r24	; 0x80061b <retracted>
        prepare_move();
   32120:	90 e0       	ldi	r25, 0x00	; 0
   32122:	80 e0       	ldi	r24, 0x00	; 0
   32124:	0e 94 bb 6a 	call	0xd576	; 0xd576 <prepare_move(unsigned int)>
        if(cs.retract_zlift) {
   32128:	20 e0       	ldi	r18, 0x00	; 0
   3212a:	30 e0       	ldi	r19, 0x00	; 0
   3212c:	a9 01       	movw	r20, r18
   3212e:	60 91 f2 0d 	lds	r22, 0x0DF2	; 0x800df2 <cs+0x8b>
   32132:	70 91 f3 0d 	lds	r23, 0x0DF3	; 0x800df3 <cs+0x8c>
   32136:	80 91 f4 0d 	lds	r24, 0x0DF4	; 0x800df4 <cs+0x8d>
   3213a:	90 91 f5 0d 	lds	r25, 0x0DF5	; 0x800df5 <cs+0x8e>
   3213e:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   32142:	88 23       	and	r24, r24
   32144:	11 f1       	breq	.+68     	; 0x3218a <retract(bool, bool) [clone .constprop.54]+0x132>
            st_synchronize();
   32146:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
            current_position[Z_AXIS]-=cs.retract_zlift;
   3214a:	20 91 f2 0d 	lds	r18, 0x0DF2	; 0x800df2 <cs+0x8b>
   3214e:	30 91 f3 0d 	lds	r19, 0x0DF3	; 0x800df3 <cs+0x8c>
   32152:	40 91 f4 0d 	lds	r20, 0x0DF4	; 0x800df4 <cs+0x8d>
   32156:	50 91 f5 0d 	lds	r21, 0x0DF5	; 0x800df5 <cs+0x8e>
   3215a:	60 91 69 12 	lds	r22, 0x1269	; 0x801269 <current_position+0x8>
   3215e:	70 91 6a 12 	lds	r23, 0x126A	; 0x80126a <current_position+0x9>
   32162:	80 91 6b 12 	lds	r24, 0x126B	; 0x80126b <current_position+0xa>
   32166:	90 91 6c 12 	lds	r25, 0x126C	; 0x80126c <current_position+0xb>
   3216a:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   3216e:	60 93 69 12 	sts	0x1269, r22	; 0x801269 <current_position+0x8>
   32172:	70 93 6a 12 	sts	0x126A, r23	; 0x80126a <current_position+0x9>
   32176:	80 93 6b 12 	sts	0x126B, r24	; 0x80126b <current_position+0xa>
   3217a:	90 93 6c 12 	sts	0x126C, r25	; 0x80126c <current_position+0xb>
            plan_set_position_curposXYZE();
   3217e:	0f 94 41 4b 	call	0x29682	; 0x29682 <plan_set_position_curposXYZE()>
            prepare_move();
   32182:	90 e0       	ldi	r25, 0x00	; 0
   32184:	80 e0       	ldi	r24, 0x00	; 0
   32186:	0e 94 bb 6a 	call	0xd576	; 0xd576 <prepare_move(unsigned int)>
        }
        feedrate = oldFeedrate;
   3218a:	c0 92 7a 02 	sts	0x027A, r12	; 0x80027a <feedrate>
   3218e:	d0 92 7b 02 	sts	0x027B, r13	; 0x80027b <feedrate+0x1>
   32192:	e0 92 7c 02 	sts	0x027C, r14	; 0x80027c <feedrate+0x2>
   32196:	f0 92 7d 02 	sts	0x027D, r15	; 0x80027d <feedrate+0x3>
        plan_set_e_position(current_position[E_AXIS]);
        retracted[active_extruder]=false;
        prepare_move();
        feedrate = oldFeedrate;
    }
} //retract
   3219a:	ff 90       	pop	r15
   3219c:	ef 90       	pop	r14
   3219e:	df 90       	pop	r13
   321a0:	cf 90       	pop	r12
   321a2:	bf 90       	pop	r11
   321a4:	af 90       	pop	r10
   321a6:	9f 90       	pop	r9
   321a8:	8f 90       	pop	r8
   321aa:	08 95       	ret
            current_position[Z_AXIS]-=cs.retract_zlift;
            plan_set_position_curposXYZE();
            prepare_move();
        }
        feedrate = oldFeedrate;
    } else if(!retracting && retracted[active_extruder]) {
   321ac:	99 23       	and	r25, r25
   321ae:	a9 f3       	breq	.-22     	; 0x3219a <retract(bool, bool) [clone .constprop.54]+0x142>
        st_synchronize();
   321b0:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
        set_destination_to_current();
   321b4:	0e 94 ae 66 	call	0xcd5c	; 0xcd5c <set_destination_to_current()>
        float oldFeedrate = feedrate;
   321b8:	80 90 7a 02 	lds	r8, 0x027A	; 0x80027a <feedrate>
   321bc:	90 90 7b 02 	lds	r9, 0x027B	; 0x80027b <feedrate+0x1>
   321c0:	a0 90 7c 02 	lds	r10, 0x027C	; 0x80027c <feedrate+0x2>
   321c4:	b0 90 7d 02 	lds	r11, 0x027D	; 0x80027d <feedrate+0x3>
        feedrate=cs.retract_recover_feedrate*60;
   321c8:	20 e0       	ldi	r18, 0x00	; 0
   321ca:	30 e0       	ldi	r19, 0x00	; 0
   321cc:	40 e7       	ldi	r20, 0x70	; 112
   321ce:	52 e4       	ldi	r21, 0x42	; 66
   321d0:	60 91 fa 0d 	lds	r22, 0x0DFA	; 0x800dfa <cs+0x93>
   321d4:	70 91 fb 0d 	lds	r23, 0x0DFB	; 0x800dfb <cs+0x94>
   321d8:	80 91 fc 0d 	lds	r24, 0x0DFC	; 0x800dfc <cs+0x95>
   321dc:	90 91 fd 0d 	lds	r25, 0x0DFD	; 0x800dfd <cs+0x96>
   321e0:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   321e4:	60 93 7a 02 	sts	0x027A, r22	; 0x80027a <feedrate>
   321e8:	70 93 7b 02 	sts	0x027B, r23	; 0x80027b <feedrate+0x1>
   321ec:	80 93 7c 02 	sts	0x027C, r24	; 0x80027c <feedrate+0x2>
   321f0:	90 93 7d 02 	sts	0x027D, r25	; 0x80027d <feedrate+0x3>
        if(cs.retract_zlift) {
   321f4:	c0 90 f2 0d 	lds	r12, 0x0DF2	; 0x800df2 <cs+0x8b>
   321f8:	d0 90 f3 0d 	lds	r13, 0x0DF3	; 0x800df3 <cs+0x8c>
   321fc:	e0 90 f4 0d 	lds	r14, 0x0DF4	; 0x800df4 <cs+0x8d>
   32200:	f0 90 f5 0d 	lds	r15, 0x0DF5	; 0x800df5 <cs+0x8e>
   32204:	20 e0       	ldi	r18, 0x00	; 0
   32206:	30 e0       	ldi	r19, 0x00	; 0
   32208:	a9 01       	movw	r20, r18
   3220a:	c7 01       	movw	r24, r14
   3220c:	b6 01       	movw	r22, r12
   3220e:	0f 94 fd a5 	call	0x34bfa	; 0x34bfa <__cmpsf2>
   32212:	88 23       	and	r24, r24
   32214:	e1 f0       	breq	.+56     	; 0x3224e <retract(bool, bool) [clone .constprop.54]+0x1f6>
            current_position[Z_AXIS]+=cs.retract_zlift;
   32216:	a7 01       	movw	r20, r14
   32218:	96 01       	movw	r18, r12
   3221a:	60 91 69 12 	lds	r22, 0x1269	; 0x801269 <current_position+0x8>
   3221e:	70 91 6a 12 	lds	r23, 0x126A	; 0x80126a <current_position+0x9>
   32222:	80 91 6b 12 	lds	r24, 0x126B	; 0x80126b <current_position+0xa>
   32226:	90 91 6c 12 	lds	r25, 0x126C	; 0x80126c <current_position+0xb>
   3222a:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   3222e:	60 93 69 12 	sts	0x1269, r22	; 0x801269 <current_position+0x8>
   32232:	70 93 6a 12 	sts	0x126A, r23	; 0x80126a <current_position+0x9>
   32236:	80 93 6b 12 	sts	0x126B, r24	; 0x80126b <current_position+0xa>
   3223a:	90 93 6c 12 	sts	0x126C, r25	; 0x80126c <current_position+0xb>
            plan_set_position_curposXYZE();
   3223e:	0f 94 41 4b 	call	0x29682	; 0x29682 <plan_set_position_curposXYZE()>
            prepare_move();
   32242:	90 e0       	ldi	r25, 0x00	; 0
   32244:	80 e0       	ldi	r24, 0x00	; 0
   32246:	0e 94 bb 6a 	call	0xd576	; 0xd576 <prepare_move(unsigned int)>
            st_synchronize();
   3224a:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
        }
        current_position[E_AXIS]-=(swapretract?(retract_length_swap+retract_recover_length_swap):(cs.retract_length+cs.retract_recover_length))*float(extrudemultiply)*0.01f;
   3224e:	20 91 f6 0d 	lds	r18, 0x0DF6	; 0x800df6 <cs+0x8f>
   32252:	30 91 f7 0d 	lds	r19, 0x0DF7	; 0x800df7 <cs+0x90>
   32256:	40 91 f8 0d 	lds	r20, 0x0DF8	; 0x800df8 <cs+0x91>
   3225a:	50 91 f9 0d 	lds	r21, 0x0DF9	; 0x800df9 <cs+0x92>
   3225e:	60 91 ea 0d 	lds	r22, 0x0DEA	; 0x800dea <cs+0x83>
   32262:	70 91 eb 0d 	lds	r23, 0x0DEB	; 0x800deb <cs+0x84>
   32266:	80 91 ec 0d 	lds	r24, 0x0DEC	; 0x800dec <cs+0x85>
   3226a:	90 91 ed 0d 	lds	r25, 0x0DED	; 0x800ded <cs+0x86>
   3226e:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   32272:	6b 01       	movw	r12, r22
   32274:	7c 01       	movw	r14, r24
   32276:	60 91 75 02 	lds	r22, 0x0275	; 0x800275 <extrudemultiply>
   3227a:	70 91 76 02 	lds	r23, 0x0276	; 0x800276 <extrudemultiply+0x1>
   3227e:	07 2e       	mov	r0, r23
   32280:	00 0c       	add	r0, r0
   32282:	88 0b       	sbc	r24, r24
   32284:	99 0b       	sbc	r25, r25
   32286:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   3228a:	9b 01       	movw	r18, r22
   3228c:	ac 01       	movw	r20, r24
   3228e:	c7 01       	movw	r24, r14
   32290:	b6 01       	movw	r22, r12
   32292:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   32296:	2a e0       	ldi	r18, 0x0A	; 10
   32298:	37 ed       	ldi	r19, 0xD7	; 215
   3229a:	43 e2       	ldi	r20, 0x23	; 35
   3229c:	5c e3       	ldi	r21, 0x3C	; 60
   3229e:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   322a2:	9b 01       	movw	r18, r22
   322a4:	ac 01       	movw	r20, r24
   322a6:	60 91 6d 12 	lds	r22, 0x126D	; 0x80126d <current_position+0xc>
   322aa:	70 91 6e 12 	lds	r23, 0x126E	; 0x80126e <current_position+0xd>
   322ae:	80 91 6f 12 	lds	r24, 0x126F	; 0x80126f <current_position+0xe>
   322b2:	90 91 70 12 	lds	r25, 0x1270	; 0x801270 <current_position+0xf>
   322b6:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   322ba:	60 93 6d 12 	sts	0x126D, r22	; 0x80126d <current_position+0xc>
   322be:	70 93 6e 12 	sts	0x126E, r23	; 0x80126e <current_position+0xd>
   322c2:	80 93 6f 12 	sts	0x126F, r24	; 0x80126f <current_position+0xe>
   322c6:	90 93 70 12 	sts	0x1270, r25	; 0x801270 <current_position+0xf>
        plan_set_e_position(current_position[E_AXIS]);
   322ca:	8d e6       	ldi	r24, 0x6D	; 109
   322cc:	92 e1       	ldi	r25, 0x12	; 18
   322ce:	0f 94 d9 3c 	call	0x279b2	; 0x279b2 <plan_set_e_position(float const&)>
        retracted[active_extruder]=false;
   322d2:	10 92 1b 06 	sts	0x061B, r1	; 0x80061b <retracted>
        prepare_move();
   322d6:	90 e0       	ldi	r25, 0x00	; 0
   322d8:	80 e0       	ldi	r24, 0x00	; 0
   322da:	0e 94 bb 6a 	call	0xd576	; 0xd576 <prepare_move(unsigned int)>
        feedrate = oldFeedrate;
   322de:	80 92 7a 02 	sts	0x027A, r8	; 0x80027a <feedrate>
   322e2:	90 92 7b 02 	sts	0x027B, r9	; 0x80027b <feedrate+0x1>
   322e6:	a0 92 7c 02 	sts	0x027C, r10	; 0x80027c <feedrate+0x2>
   322ea:	b0 92 7d 02 	sts	0x027D, r11	; 0x80027d <feedrate+0x3>
   322ee:	55 cf       	rjmp	.-342    	; 0x3219a <retract(bool, bool) [clone .constprop.54]+0x142>

000322f0 <mesh_bed_leveling::get_z(float, float) [clone .constprop.344]>:

float mesh_bed_leveling::get_z(float x, float y) {
   322f0:	2f 92       	push	r2
   322f2:	3f 92       	push	r3
   322f4:	4f 92       	push	r4
   322f6:	5f 92       	push	r5
   322f8:	6f 92       	push	r6
   322fa:	7f 92       	push	r7
   322fc:	8f 92       	push	r8
   322fe:	9f 92       	push	r9
   32300:	af 92       	push	r10
   32302:	bf 92       	push	r11
   32304:	cf 92       	push	r12
   32306:	df 92       	push	r13
   32308:	ef 92       	push	r14
   3230a:	ff 92       	push	r15
   3230c:	0f 93       	push	r16
   3230e:	1f 93       	push	r17
   32310:	cf 93       	push	r28
   32312:	df 93       	push	r29
   32314:	00 d0       	rcall	.+0      	; 0x32316 <mesh_bed_leveling::get_z(float, float) [clone .constprop.344]+0x26>
   32316:	00 d0       	rcall	.+0      	; 0x32318 <mesh_bed_leveling::get_z(float, float) [clone .constprop.344]+0x28>
   32318:	00 d0       	rcall	.+0      	; 0x3231a <mesh_bed_leveling::get_z(float, float) [clone .constprop.344]+0x2a>
   3231a:	1f 92       	push	r1
   3231c:	cd b7       	in	r28, 0x3d	; 61
   3231e:	de b7       	in	r29, 0x3e	; 62
   32320:	2b 01       	movw	r4, r22
   32322:	3c 01       	movw	r6, r24
   32324:	49 01       	movw	r8, r18
   32326:	5a 01       	movw	r10, r20
    int   i, j;
    float s, t;

    i = int(floor((x - (BED_X0 + X_PROBE_OFFSET_FROM_EXTRUDER)) / x_mesh_density));
   32328:	20 e0       	ldi	r18, 0x00	; 0
   3232a:	30 e0       	ldi	r19, 0x00	; 0
   3232c:	40 ec       	ldi	r20, 0xC0	; 192
   3232e:	51 e4       	ldi	r21, 0x41	; 65
   32330:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   32334:	20 e0       	ldi	r18, 0x00	; 0
   32336:	30 e0       	ldi	r19, 0x00	; 0
   32338:	48 e0       	ldi	r20, 0x08	; 8
   3233a:	52 e4       	ldi	r21, 0x42	; 66
   3233c:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   32340:	6b 01       	movw	r12, r22
   32342:	7c 01       	movw	r14, r24
   32344:	0f 94 af a6 	call	0x34d5e	; 0x34d5e <floor>
   32348:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
    if (i < 0) {
        i = 0;
   3234c:	31 2c       	mov	r3, r1
   3234e:	21 2c       	mov	r2, r1
float mesh_bed_leveling::get_z(float x, float y) {
    int   i, j;
    float s, t;

    i = int(floor((x - (BED_X0 + X_PROBE_OFFSET_FROM_EXTRUDER)) / x_mesh_density));
    if (i < 0) {
   32350:	77 fd       	sbrc	r23, 7
   32352:	1e c0       	rjmp	.+60     	; 0x32390 <mesh_bed_leveling::get_z(float, float) [clone .constprop.344]+0xa0>
   32354:	1b 01       	movw	r2, r22
   32356:	66 30       	cpi	r22, 0x06	; 6
   32358:	71 05       	cpc	r23, r1
   3235a:	1c f0       	brlt	.+6      	; 0x32362 <mesh_bed_leveling::get_z(float, float) [clone .constprop.344]+0x72>
   3235c:	45 e0       	ldi	r20, 0x05	; 5
   3235e:	24 2e       	mov	r2, r20
   32360:	31 2c       	mov	r3, r1

    mesh_bed_leveling() { reset(); }

    void reset();

    static float get_x(int i) { return BED_X(i) + X_PROBE_OFFSET_FROM_EXTRUDER; }
   32362:	82 2d       	mov	r24, r2
   32364:	0e 94 e0 5e 	call	0xbdc0	; 0xbdc0 <BED_X(unsigned char)>
   32368:	20 e0       	ldi	r18, 0x00	; 0
   3236a:	30 e0       	ldi	r19, 0x00	; 0
   3236c:	48 eb       	ldi	r20, 0xB8	; 184
   3236e:	51 e4       	ldi	r21, 0x41	; 65
   32370:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   32374:	9b 01       	movw	r18, r22
   32376:	ac 01       	movw	r20, r24
        s = (x - (BED_X0 + X_PROBE_OFFSET_FROM_EXTRUDER)) / x_mesh_density;
    } else {
        if (i > MESH_NUM_X_POINTS - 2) {
            i = MESH_NUM_X_POINTS - 2;
        }
        s = (x - get_x(i)) / x_mesh_density;
   32378:	c3 01       	movw	r24, r6
   3237a:	b2 01       	movw	r22, r4
   3237c:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   32380:	20 e0       	ldi	r18, 0x00	; 0
   32382:	30 e0       	ldi	r19, 0x00	; 0
   32384:	48 e0       	ldi	r20, 0x08	; 8
   32386:	52 e4       	ldi	r21, 0x42	; 66
   32388:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   3238c:	6b 01       	movw	r12, r22
   3238e:	7c 01       	movw	r14, r24
    }

    j = int(floor((y - (BED_Y0 + Y_PROBE_OFFSET_FROM_EXTRUDER)) / y_mesh_density));
   32390:	20 e0       	ldi	r18, 0x00	; 0
   32392:	30 e0       	ldi	r19, 0x00	; 0
   32394:	40 ec       	ldi	r20, 0xC0	; 192
   32396:	50 e4       	ldi	r21, 0x40	; 64
   32398:	c5 01       	movw	r24, r10
   3239a:	b4 01       	movw	r22, r8
   3239c:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   323a0:	20 e0       	ldi	r18, 0x00	; 0
   323a2:	30 e0       	ldi	r19, 0x00	; 0
   323a4:	48 e0       	ldi	r20, 0x08	; 8
   323a6:	52 e4       	ldi	r21, 0x42	; 66
   323a8:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   323ac:	69 83       	std	Y+1, r22	; 0x01
   323ae:	7a 83       	std	Y+2, r23	; 0x02
   323b0:	8b 83       	std	Y+3, r24	; 0x03
   323b2:	9c 83       	std	Y+4, r25	; 0x04
   323b4:	0f 94 af a6 	call	0x34d5e	; 0x34d5e <floor>
   323b8:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>
    if (j < 0) {
   323bc:	77 fd       	sbrc	r23, 7
   323be:	da c0       	rjmp	.+436    	; 0x32574 <mesh_bed_leveling::get_z(float, float) [clone .constprop.344]+0x284>
   323c0:	7a 87       	std	Y+10, r23	; 0x0a
   323c2:	69 87       	std	Y+9, r22	; 0x09
   323c4:	66 30       	cpi	r22, 0x06	; 6
   323c6:	71 05       	cpc	r23, r1
   323c8:	24 f0       	brlt	.+8      	; 0x323d2 <mesh_bed_leveling::get_z(float, float) [clone .constprop.344]+0xe2>
   323ca:	e5 e0       	ldi	r30, 0x05	; 5
   323cc:	f0 e0       	ldi	r31, 0x00	; 0
   323ce:	fa 87       	std	Y+10, r31	; 0x0a
   323d0:	e9 87       	std	Y+9, r30	; 0x09
    static float get_y(int i) { return BED_Y(i) + Y_PROBE_OFFSET_FROM_EXTRUDER; }
   323d2:	89 85       	ldd	r24, Y+9	; 0x09
   323d4:	0e 94 e0 5e 	call	0xbdc0	; 0xbdc0 <BED_X(unsigned char)>
   323d8:	20 e0       	ldi	r18, 0x00	; 0
   323da:	30 e0       	ldi	r19, 0x00	; 0
   323dc:	40 ea       	ldi	r20, 0xA0	; 160
   323de:	50 e4       	ldi	r21, 0x40	; 64
   323e0:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   323e4:	9b 01       	movw	r18, r22
   323e6:	ac 01       	movw	r20, r24
        t = (y - (BED_Y0 + Y_PROBE_OFFSET_FROM_EXTRUDER)) / y_mesh_density;
    } else {
        if (j > MESH_NUM_Y_POINTS - 2) {
            j = MESH_NUM_Y_POINTS - 2;
        }
        t = (y - get_y(j)) / y_mesh_density;
   323e8:	c5 01       	movw	r24, r10
   323ea:	b4 01       	movw	r22, r8
   323ec:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   323f0:	20 e0       	ldi	r18, 0x00	; 0
   323f2:	30 e0       	ldi	r19, 0x00	; 0
   323f4:	48 e0       	ldi	r20, 0x08	; 8
   323f6:	52 e4       	ldi	r21, 0x42	; 66
   323f8:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   323fc:	69 83       	std	Y+1, r22	; 0x01
   323fe:	7a 83       	std	Y+2, r23	; 0x02
   32400:	8b 83       	std	Y+3, r24	; 0x03
   32402:	9c 83       	std	Y+4, r25	; 0x04
    }

    float si = 1.f-s;
   32404:	a7 01       	movw	r20, r14
   32406:	96 01       	movw	r18, r12
   32408:	60 e0       	ldi	r22, 0x00	; 0
   3240a:	70 e0       	ldi	r23, 0x00	; 0
   3240c:	80 e8       	ldi	r24, 0x80	; 128
   3240e:	9f e3       	ldi	r25, 0x3F	; 63
   32410:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   32414:	2b 01       	movw	r4, r22
   32416:	3c 01       	movw	r6, r24
    float z0 = si * z_values[j  ][i] + s * z_values[j  ][i+1];
   32418:	91 01       	movw	r18, r2
   3241a:	2f 5f       	subi	r18, 0xFF	; 255
   3241c:	3f 4f       	sbci	r19, 0xFF	; 255
   3241e:	3e 83       	std	Y+6, r19	; 0x06
   32420:	2d 83       	std	Y+5, r18	; 0x05
    float z1 = si * z_values[j+1][i] + s * z_values[j+1][i+1];
   32422:	89 85       	ldd	r24, Y+9	; 0x09
   32424:	9a 85       	ldd	r25, Y+10	; 0x0a
   32426:	01 96       	adiw	r24, 0x01	; 1
   32428:	98 87       	std	Y+8, r25	; 0x08
   3242a:	8f 83       	std	Y+7, r24	; 0x07
        }
        t = (y - get_y(j)) / y_mesh_density;
    }

    float si = 1.f-s;
    float z0 = si * z_values[j  ][i] + s * z_values[j  ][i+1];
   3242c:	27 e0       	ldi	r18, 0x07	; 7
   3242e:	e9 85       	ldd	r30, Y+9	; 0x09
   32430:	fa 85       	ldd	r31, Y+10	; 0x0a
   32432:	2e 9f       	mul	r18, r30
   32434:	80 01       	movw	r16, r0
   32436:	2f 9f       	mul	r18, r31
   32438:	10 0d       	add	r17, r0
   3243a:	11 24       	eor	r1, r1
   3243c:	f8 01       	movw	r30, r16
   3243e:	e2 0d       	add	r30, r2
   32440:	f3 1d       	adc	r31, r3
   32442:	ee 0f       	add	r30, r30
   32444:	ff 1f       	adc	r31, r31
   32446:	ee 0f       	add	r30, r30
   32448:	ff 1f       	adc	r31, r31
   3244a:	e7 5f       	subi	r30, 0xF7	; 247
   3244c:	fc 4e       	sbci	r31, 0xEC	; 236
   3244e:	21 81       	ldd	r18, Z+1	; 0x01
   32450:	32 81       	ldd	r19, Z+2	; 0x02
   32452:	43 81       	ldd	r20, Z+3	; 0x03
   32454:	54 81       	ldd	r21, Z+4	; 0x04
   32456:	c3 01       	movw	r24, r6
   32458:	b2 01       	movw	r22, r4
   3245a:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   3245e:	4b 01       	movw	r8, r22
   32460:	5c 01       	movw	r10, r24
   32462:	ed 81       	ldd	r30, Y+5	; 0x05
   32464:	fe 81       	ldd	r31, Y+6	; 0x06
   32466:	e0 0f       	add	r30, r16
   32468:	f1 1f       	adc	r31, r17
   3246a:	ee 0f       	add	r30, r30
   3246c:	ff 1f       	adc	r31, r31
   3246e:	ee 0f       	add	r30, r30
   32470:	ff 1f       	adc	r31, r31
   32472:	e7 5f       	subi	r30, 0xF7	; 247
   32474:	fc 4e       	sbci	r31, 0xEC	; 236
   32476:	21 81       	ldd	r18, Z+1	; 0x01
   32478:	32 81       	ldd	r19, Z+2	; 0x02
   3247a:	43 81       	ldd	r20, Z+3	; 0x03
   3247c:	54 81       	ldd	r21, Z+4	; 0x04
   3247e:	c7 01       	movw	r24, r14
   32480:	b6 01       	movw	r22, r12
   32482:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   32486:	9b 01       	movw	r18, r22
   32488:	ac 01       	movw	r20, r24
   3248a:	c5 01       	movw	r24, r10
   3248c:	b4 01       	movw	r22, r8
   3248e:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   32492:	4b 01       	movw	r8, r22
   32494:	5c 01       	movw	r10, r24
    float z1 = si * z_values[j+1][i] + s * z_values[j+1][i+1];
    return (1.f-t) * z0 + t * z1;
   32496:	29 81       	ldd	r18, Y+1	; 0x01
   32498:	3a 81       	ldd	r19, Y+2	; 0x02
   3249a:	4b 81       	ldd	r20, Y+3	; 0x03
   3249c:	5c 81       	ldd	r21, Y+4	; 0x04
   3249e:	60 e0       	ldi	r22, 0x00	; 0
   324a0:	70 e0       	ldi	r23, 0x00	; 0
   324a2:	80 e8       	ldi	r24, 0x80	; 128
   324a4:	9f e3       	ldi	r25, 0x3F	; 63
   324a6:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   324aa:	9b 01       	movw	r18, r22
   324ac:	ac 01       	movw	r20, r24
   324ae:	c5 01       	movw	r24, r10
   324b0:	b4 01       	movw	r22, r8
   324b2:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   324b6:	4b 01       	movw	r8, r22
   324b8:	5c 01       	movw	r10, r24
        t = (y - get_y(j)) / y_mesh_density;
    }

    float si = 1.f-s;
    float z0 = si * z_values[j  ][i] + s * z_values[j  ][i+1];
    float z1 = si * z_values[j+1][i] + s * z_values[j+1][i+1];
   324ba:	27 e0       	ldi	r18, 0x07	; 7
   324bc:	ef 81       	ldd	r30, Y+7	; 0x07
   324be:	f8 85       	ldd	r31, Y+8	; 0x08
   324c0:	2e 9f       	mul	r18, r30
   324c2:	c0 01       	movw	r24, r0
   324c4:	2f 9f       	mul	r18, r31
   324c6:	90 0d       	add	r25, r0
   324c8:	11 24       	eor	r1, r1
   324ca:	9a 87       	std	Y+10, r25	; 0x0a
   324cc:	89 87       	std	Y+9, r24	; 0x09
   324ce:	fc 01       	movw	r30, r24
   324d0:	e2 0d       	add	r30, r2
   324d2:	f3 1d       	adc	r31, r3
   324d4:	ee 0f       	add	r30, r30
   324d6:	ff 1f       	adc	r31, r31
   324d8:	ee 0f       	add	r30, r30
   324da:	ff 1f       	adc	r31, r31
   324dc:	e7 5f       	subi	r30, 0xF7	; 247
   324de:	fc 4e       	sbci	r31, 0xEC	; 236
   324e0:	21 81       	ldd	r18, Z+1	; 0x01
   324e2:	32 81       	ldd	r19, Z+2	; 0x02
   324e4:	43 81       	ldd	r20, Z+3	; 0x03
   324e6:	54 81       	ldd	r21, Z+4	; 0x04
   324e8:	c3 01       	movw	r24, r6
   324ea:	b2 01       	movw	r22, r4
   324ec:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   324f0:	2b 01       	movw	r4, r22
   324f2:	3c 01       	movw	r6, r24
   324f4:	89 85       	ldd	r24, Y+9	; 0x09
   324f6:	9a 85       	ldd	r25, Y+10	; 0x0a
   324f8:	ed 81       	ldd	r30, Y+5	; 0x05
   324fa:	fe 81       	ldd	r31, Y+6	; 0x06
   324fc:	8e 0f       	add	r24, r30
   324fe:	9f 1f       	adc	r25, r31
   32500:	88 0f       	add	r24, r24
   32502:	99 1f       	adc	r25, r25
   32504:	88 0f       	add	r24, r24
   32506:	99 1f       	adc	r25, r25
   32508:	87 5f       	subi	r24, 0xF7	; 247
   3250a:	9c 4e       	sbci	r25, 0xEC	; 236
   3250c:	fc 01       	movw	r30, r24
   3250e:	21 81       	ldd	r18, Z+1	; 0x01
   32510:	32 81       	ldd	r19, Z+2	; 0x02
   32512:	43 81       	ldd	r20, Z+3	; 0x03
   32514:	54 81       	ldd	r21, Z+4	; 0x04
   32516:	c7 01       	movw	r24, r14
   32518:	b6 01       	movw	r22, r12
   3251a:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   3251e:	9b 01       	movw	r18, r22
   32520:	ac 01       	movw	r20, r24
   32522:	c3 01       	movw	r24, r6
   32524:	b2 01       	movw	r22, r4
   32526:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
    return (1.f-t) * z0 + t * z1;
   3252a:	29 81       	ldd	r18, Y+1	; 0x01
   3252c:	3a 81       	ldd	r19, Y+2	; 0x02
   3252e:	4b 81       	ldd	r20, Y+3	; 0x03
   32530:	5c 81       	ldd	r21, Y+4	; 0x04
   32532:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   32536:	9b 01       	movw	r18, r22
   32538:	ac 01       	movw	r20, r24
   3253a:	c5 01       	movw	r24, r10
   3253c:	b4 01       	movw	r22, r8
   3253e:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
}
   32542:	2a 96       	adiw	r28, 0x0a	; 10
   32544:	0f b6       	in	r0, 0x3f	; 63
   32546:	f8 94       	cli
   32548:	de bf       	out	0x3e, r29	; 62
   3254a:	0f be       	out	0x3f, r0	; 63
   3254c:	cd bf       	out	0x3d, r28	; 61
   3254e:	df 91       	pop	r29
   32550:	cf 91       	pop	r28
   32552:	1f 91       	pop	r17
   32554:	0f 91       	pop	r16
   32556:	ff 90       	pop	r15
   32558:	ef 90       	pop	r14
   3255a:	df 90       	pop	r13
   3255c:	cf 90       	pop	r12
   3255e:	bf 90       	pop	r11
   32560:	af 90       	pop	r10
   32562:	9f 90       	pop	r9
   32564:	8f 90       	pop	r8
   32566:	7f 90       	pop	r7
   32568:	6f 90       	pop	r6
   3256a:	5f 90       	pop	r5
   3256c:	4f 90       	pop	r4
   3256e:	3f 90       	pop	r3
   32570:	2f 90       	pop	r2
   32572:	08 95       	ret
        s = (x - get_x(i)) / x_mesh_density;
    }

    j = int(floor((y - (BED_Y0 + Y_PROBE_OFFSET_FROM_EXTRUDER)) / y_mesh_density));
    if (j < 0) {
        j = 0;
   32574:	1a 86       	std	Y+10, r1	; 0x0a
   32576:	19 86       	std	Y+9, r1	; 0x09
   32578:	45 cf       	rjmp	.-374    	; 0x32404 <mesh_bed_leveling::get_z(float, float) [clone .constprop.344]+0x114>

0003257a <mesh_bed_leveling::upsample_3x3() [clone .constprop.52]>:
    float z1 = si * z_values[j+1][i] + s * z_values[j+1][i+1];
    return (1.f-t) * z0 + t * z1;
}
// Works for an odd number of MESH_NUM_X_POINTS and MESH_NUM_Y_POINTS

void mesh_bed_leveling::upsample_3x3()
   3257a:	2f 92       	push	r2
   3257c:	3f 92       	push	r3
   3257e:	4f 92       	push	r4
   32580:	5f 92       	push	r5
   32582:	6f 92       	push	r6
   32584:	7f 92       	push	r7
   32586:	8f 92       	push	r8
   32588:	9f 92       	push	r9
   3258a:	af 92       	push	r10
   3258c:	bf 92       	push	r11
   3258e:	cf 92       	push	r12
   32590:	df 92       	push	r13
   32592:	ef 92       	push	r14
   32594:	ff 92       	push	r15
   32596:	0f 93       	push	r16
   32598:	1f 93       	push	r17
   3259a:	cf 93       	push	r28
   3259c:	df 93       	push	r29
   3259e:	00 d0       	rcall	.+0      	; 0x325a0 <mesh_bed_leveling::upsample_3x3() [clone .constprop.52]+0x26>
   325a0:	00 d0       	rcall	.+0      	; 0x325a2 <mesh_bed_leveling::upsample_3x3() [clone .constprop.52]+0x28>
   325a2:	00 d0       	rcall	.+0      	; 0x325a4 <mesh_bed_leveling::upsample_3x3() [clone .constprop.52]+0x2a>
   325a4:	cd b7       	in	r28, 0x3d	; 61
   325a6:	de b7       	in	r29, 0x3e	; 62
   325a8:	09 e0       	ldi	r16, 0x09	; 9
   325aa:	13 e1       	ldi	r17, 0x13	; 19
   325ac:	1f 83       	std	Y+7, r17	; 0x07
   325ae:	0e 83       	std	Y+6, r16	; 0x06
   325b0:	2e 80       	ldd	r2, Y+6	; 0x06
   325b2:	3f 80       	ldd	r3, Y+7	; 0x07
   325b4:	19 82       	std	Y+1, r1	; 0x01
        static const float x1 = 0.5f * float(BED_X0 + BED_Xn) + X_PROBE_OFFSET_FROM_EXTRUDER;
        static const float x2 = BED_Xn + X_PROBE_OFFSET_FROM_EXTRUDER;
        for (int j = 0; j < MESH_NUM_Y_POINTS; ++ j) {
            // Interpolate the remaining values by Largrangian polynomials.
            for (int i = 0; i < MESH_NUM_X_POINTS; ++ i) {
                if (!isnan(z_values[j][i]))
   325b6:	f1 01       	movw	r30, r2
   325b8:	61 81       	ldd	r22, Z+1	; 0x01
   325ba:	72 81       	ldd	r23, Z+2	; 0x02
   325bc:	83 81       	ldd	r24, Z+3	; 0x03
   325be:	94 81       	ldd	r25, Z+4	; 0x04
   325c0:	9b 01       	movw	r18, r22
   325c2:	ac 01       	movw	r20, r24
   325c4:	0f 94 16 a9 	call	0x3522c	; 0x3522c <__unordsf2>
   325c8:	88 23       	and	r24, r24
   325ca:	09 f4       	brne	.+2      	; 0x325ce <mesh_bed_leveling::upsample_3x3() [clone .constprop.52]+0x54>
   325cc:	7c c0       	rjmp	.+248    	; 0x326c6 <mesh_bed_leveling::upsample_3x3() [clone .constprop.52]+0x14c>

    mesh_bed_leveling() { reset(); }

    void reset();

    static float get_x(int i) { return BED_X(i) + X_PROBE_OFFSET_FROM_EXTRUDER; }
   325ce:	89 81       	ldd	r24, Y+1	; 0x01
   325d0:	0e 94 e0 5e 	call	0xbdc0	; 0xbdc0 <BED_X(unsigned char)>
   325d4:	20 e0       	ldi	r18, 0x00	; 0
   325d6:	30 e0       	ldi	r19, 0x00	; 0
   325d8:	48 eb       	ldi	r20, 0xB8	; 184
   325da:	51 e4       	ldi	r21, 0x41	; 65
   325dc:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   325e0:	6b 01       	movw	r12, r22
   325e2:	7c 01       	movw	r14, r24
                    continue;
                float x = get_x(i);
                z_values[j][i] =
                    z_values[j][idx0] * (x - x1) * (x - x2) / ((x0 - x1) * (x0 - x2)) +
   325e4:	20 e0       	ldi	r18, 0x00	; 0
   325e6:	30 e0       	ldi	r19, 0x00	; 0
   325e8:	4c ef       	ldi	r20, 0xFC	; 252
   325ea:	52 e4       	ldi	r21, 0x42	; 66
   325ec:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   325f0:	2b 01       	movw	r4, r22
   325f2:	3c 01       	movw	r6, r24
   325f4:	20 e0       	ldi	r18, 0x00	; 0
   325f6:	30 e0       	ldi	r19, 0x00	; 0
   325f8:	44 e6       	ldi	r20, 0x64	; 100
   325fa:	53 e4       	ldi	r21, 0x43	; 67
   325fc:	c7 01       	movw	r24, r14
   325fe:	b6 01       	movw	r22, r12
   32600:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   32604:	4b 01       	movw	r8, r22
   32606:	5c 01       	movw	r10, r24
                    z_values[j][idx1] * (x - x0) * (x - x2) / ((x1 - x0) * (x1 - x2)) +
   32608:	20 e0       	ldi	r18, 0x00	; 0
   3260a:	30 e0       	ldi	r19, 0x00	; 0
   3260c:	40 ec       	ldi	r20, 0xC0	; 192
   3260e:	51 e4       	ldi	r21, 0x41	; 65
   32610:	c7 01       	movw	r24, r14
   32612:	b6 01       	movw	r22, r12
   32614:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   32618:	6b 01       	movw	r12, r22
   3261a:	7c 01       	movw	r14, r24
            for (int i = 0; i < MESH_NUM_X_POINTS; ++ i) {
                if (!isnan(z_values[j][i]))
                    continue;
                float x = get_x(i);
                z_values[j][i] =
                    z_values[j][idx0] * (x - x1) * (x - x2) / ((x0 - x1) * (x0 - x2)) +
   3261c:	ee 81       	ldd	r30, Y+6	; 0x06
   3261e:	ff 81       	ldd	r31, Y+7	; 0x07
   32620:	21 81       	ldd	r18, Z+1	; 0x01
   32622:	32 81       	ldd	r19, Z+2	; 0x02
   32624:	43 81       	ldd	r20, Z+3	; 0x03
   32626:	54 81       	ldd	r21, Z+4	; 0x04
   32628:	c3 01       	movw	r24, r6
   3262a:	b2 01       	movw	r22, r4
   3262c:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   32630:	a5 01       	movw	r20, r10
   32632:	94 01       	movw	r18, r8
   32634:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   32638:	20 e0       	ldi	r18, 0x00	; 0
   3263a:	30 e9       	ldi	r19, 0x90	; 144
   3263c:	42 ea       	ldi	r20, 0xA2	; 162
   3263e:	56 e4       	ldi	r21, 0x46	; 70
   32640:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   32644:	6a 83       	std	Y+2, r22	; 0x02
   32646:	7b 83       	std	Y+3, r23	; 0x03
   32648:	8c 83       	std	Y+4, r24	; 0x04
   3264a:	9d 83       	std	Y+5, r25	; 0x05
                    z_values[j][idx1] * (x - x0) * (x - x2) / ((x1 - x0) * (x1 - x2)) +
   3264c:	ee 81       	ldd	r30, Y+6	; 0x06
   3264e:	ff 81       	ldd	r31, Y+7	; 0x07
   32650:	25 85       	ldd	r18, Z+13	; 0x0d
   32652:	36 85       	ldd	r19, Z+14	; 0x0e
   32654:	47 85       	ldd	r20, Z+15	; 0x0f
   32656:	50 89       	ldd	r21, Z+16	; 0x10
   32658:	c7 01       	movw	r24, r14
   3265a:	b6 01       	movw	r22, r12
   3265c:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   32660:	a5 01       	movw	r20, r10
   32662:	94 01       	movw	r18, r8
   32664:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   32668:	20 e0       	ldi	r18, 0x00	; 0
   3266a:	30 e9       	ldi	r19, 0x90	; 144
   3266c:	42 e2       	ldi	r20, 0x22	; 34
   3266e:	56 ec       	ldi	r21, 0xC6	; 198
   32670:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   32674:	9b 01       	movw	r18, r22
   32676:	ac 01       	movw	r20, r24
            for (int i = 0; i < MESH_NUM_X_POINTS; ++ i) {
                if (!isnan(z_values[j][i]))
                    continue;
                float x = get_x(i);
                z_values[j][i] =
                    z_values[j][idx0] * (x - x1) * (x - x2) / ((x0 - x1) * (x0 - x2)) +
   32678:	6a 81       	ldd	r22, Y+2	; 0x02
   3267a:	7b 81       	ldd	r23, Y+3	; 0x03
   3267c:	8c 81       	ldd	r24, Y+4	; 0x04
   3267e:	9d 81       	ldd	r25, Y+5	; 0x05
   32680:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   32684:	4b 01       	movw	r8, r22
   32686:	5c 01       	movw	r10, r24
                    z_values[j][idx1] * (x - x0) * (x - x2) / ((x1 - x0) * (x1 - x2)) +
                    z_values[j][idx2] * (x - x0) * (x - x1) / ((x2 - x0) * (x2 - x1));
   32688:	ee 81       	ldd	r30, Y+6	; 0x06
   3268a:	ff 81       	ldd	r31, Y+7	; 0x07
   3268c:	21 8d       	ldd	r18, Z+25	; 0x19
   3268e:	32 8d       	ldd	r19, Z+26	; 0x1a
   32690:	43 8d       	ldd	r20, Z+27	; 0x1b
   32692:	54 8d       	ldd	r21, Z+28	; 0x1c
   32694:	c7 01       	movw	r24, r14
   32696:	b6 01       	movw	r22, r12
   32698:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   3269c:	a3 01       	movw	r20, r6
   3269e:	92 01       	movw	r18, r4
   326a0:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   326a4:	20 e0       	ldi	r18, 0x00	; 0
   326a6:	30 e9       	ldi	r19, 0x90	; 144
   326a8:	42 ea       	ldi	r20, 0xA2	; 162
   326aa:	56 e4       	ldi	r21, 0x46	; 70
   326ac:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   326b0:	9b 01       	movw	r18, r22
   326b2:	ac 01       	movw	r20, r24
                if (!isnan(z_values[j][i]))
                    continue;
                float x = get_x(i);
                z_values[j][i] =
                    z_values[j][idx0] * (x - x1) * (x - x2) / ((x0 - x1) * (x0 - x2)) +
                    z_values[j][idx1] * (x - x0) * (x - x2) / ((x1 - x0) * (x1 - x2)) +
   326b4:	c5 01       	movw	r24, r10
   326b6:	b4 01       	movw	r22, r8
   326b8:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
            // Interpolate the remaining values by Largrangian polynomials.
            for (int i = 0; i < MESH_NUM_X_POINTS; ++ i) {
                if (!isnan(z_values[j][i]))
                    continue;
                float x = get_x(i);
                z_values[j][i] =
   326bc:	f1 01       	movw	r30, r2
   326be:	61 83       	std	Z+1, r22	; 0x01
   326c0:	72 83       	std	Z+2, r23	; 0x02
   326c2:	83 83       	std	Z+3, r24	; 0x03
   326c4:	94 83       	std	Z+4, r25	; 0x04
   326c6:	f4 e0       	ldi	r31, 0x04	; 4
   326c8:	2f 0e       	add	r2, r31
   326ca:	31 1c       	adc	r3, r1
   326cc:	29 81       	ldd	r18, Y+1	; 0x01
   326ce:	2f 5f       	subi	r18, 0xFF	; 255
   326d0:	29 83       	std	Y+1, r18	; 0x01
        static const float x0 = (BED_X0 + X_PROBE_OFFSET_FROM_EXTRUDER);
        static const float x1 = 0.5f * float(BED_X0 + BED_Xn) + X_PROBE_OFFSET_FROM_EXTRUDER;
        static const float x2 = BED_Xn + X_PROBE_OFFSET_FROM_EXTRUDER;
        for (int j = 0; j < MESH_NUM_Y_POINTS; ++ j) {
            // Interpolate the remaining values by Largrangian polynomials.
            for (int i = 0; i < MESH_NUM_X_POINTS; ++ i) {
   326d2:	27 30       	cpi	r18, 0x07	; 7
   326d4:	09 f0       	breq	.+2      	; 0x326d8 <mesh_bed_leveling::upsample_3x3() [clone .constprop.52]+0x15e>
   326d6:	6f cf       	rjmp	.-290    	; 0x325b6 <mesh_bed_leveling::upsample_3x3() [clone .constprop.52]+0x3c>
   326d8:	8e 81       	ldd	r24, Y+6	; 0x06
   326da:	9f 81       	ldd	r25, Y+7	; 0x07
   326dc:	4c 96       	adiw	r24, 0x1c	; 28
   326de:	9f 83       	std	Y+7, r25	; 0x07
   326e0:	8e 83       	std	Y+6, r24	; 0x06
    {
        // First interpolate the points in X axis.
        static const float x0 = (BED_X0 + X_PROBE_OFFSET_FROM_EXTRUDER);
        static const float x1 = 0.5f * float(BED_X0 + BED_Xn) + X_PROBE_OFFSET_FROM_EXTRUDER;
        static const float x2 = BED_Xn + X_PROBE_OFFSET_FROM_EXTRUDER;
        for (int j = 0; j < MESH_NUM_Y_POINTS; ++ j) {
   326e2:	8d 5c       	subi	r24, 0xCD	; 205
   326e4:	93 41       	sbci	r25, 0x13	; 19
   326e6:	09 f0       	breq	.+2      	; 0x326ea <mesh_bed_leveling::upsample_3x3() [clone .constprop.52]+0x170>
   326e8:	63 cf       	rjmp	.-314    	; 0x325b0 <mesh_bed_leveling::upsample_3x3() [clone .constprop.52]+0x36>
    float z1 = si * z_values[j+1][i] + s * z_values[j+1][i+1];
    return (1.f-t) * z0 + t * z1;
}
// Works for an odd number of MESH_NUM_X_POINTS and MESH_NUM_Y_POINTS

void mesh_bed_leveling::upsample_3x3()
   326ea:	19 87       	std	Y+9, r17	; 0x09
   326ec:	08 87       	std	Y+8, r16	; 0x08
   326ee:	f1 e0       	ldi	r31, 0x01	; 1
   326f0:	f9 83       	std	Y+1, r31	; 0x01
                if (!isnan(z_values[j][i]))
                    continue;
                float y = get_y(j);
                z_values[j][i] =
                    z_values[idx0][i] * (y - y1) * (y - y2) / ((y0 - y1) * (y0 - y2)) +
                    z_values[idx1][i] * (y - y0) * (y - y2) / ((y1 - y0) * (y1 - y2)) +
   326f2:	c8 01       	movw	r24, r16
   326f4:	8b 5a       	subi	r24, 0xAB	; 171
   326f6:	9f 4f       	sbci	r25, 0xFF	; 255
   326f8:	9f 83       	std	Y+7, r25	; 0x07
   326fa:	8e 83       	std	Y+6, r24	; 0x06
                    z_values[idx2][i] * (y - y0) * (y - y1) / ((y2 - y0) * (y2 - y1));
   326fc:	18 01       	movw	r2, r16
   326fe:	99 ea       	ldi	r25, 0xA9	; 169
   32700:	29 0e       	add	r2, r25
   32702:	31 1c       	adc	r3, r1
        static const float y1 = 0.5f * float(BED_Y0 + BED_Yn) + Y_PROBE_OFFSET_FROM_EXTRUDER;
        static const float y2 = BED_Yn + Y_PROBE_OFFSET_FROM_EXTRUDER;
        for (int i = 0; i < MESH_NUM_X_POINTS; ++ i) {
            // Interpolate the remaining values by Largrangian polynomials.
            for (int j = 1; j + 1 < MESH_NUM_Y_POINTS; ++ j) {
                if (!isnan(z_values[j][i]))
   32704:	e8 85       	ldd	r30, Y+8	; 0x08
   32706:	f9 85       	ldd	r31, Y+9	; 0x09
   32708:	65 8d       	ldd	r22, Z+29	; 0x1d
   3270a:	76 8d       	ldd	r23, Z+30	; 0x1e
   3270c:	87 8d       	ldd	r24, Z+31	; 0x1f
   3270e:	90 a1       	ldd	r25, Z+32	; 0x20
   32710:	9b 01       	movw	r18, r22
   32712:	ac 01       	movw	r20, r24
   32714:	0f 94 16 a9 	call	0x3522c	; 0x3522c <__unordsf2>
   32718:	88 23       	and	r24, r24
   3271a:	09 f4       	brne	.+2      	; 0x3271e <mesh_bed_leveling::upsample_3x3() [clone .constprop.52]+0x1a4>
   3271c:	79 c0       	rjmp	.+242    	; 0x32810 <mesh_bed_leveling::upsample_3x3() [clone .constprop.52]+0x296>
    static float get_y(int i) { return BED_Y(i) + Y_PROBE_OFFSET_FROM_EXTRUDER; }
   3271e:	89 81       	ldd	r24, Y+1	; 0x01
   32720:	0e 94 e0 5e 	call	0xbdc0	; 0xbdc0 <BED_X(unsigned char)>
   32724:	20 e0       	ldi	r18, 0x00	; 0
   32726:	30 e0       	ldi	r19, 0x00	; 0
   32728:	40 ea       	ldi	r20, 0xA0	; 160
   3272a:	50 e4       	ldi	r21, 0x40	; 64
   3272c:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   32730:	6b 01       	movw	r12, r22
   32732:	7c 01       	movw	r14, r24
                    continue;
                float y = get_y(j);
                z_values[j][i] =
                    z_values[idx0][i] * (y - y1) * (y - y2) / ((y0 - y1) * (y0 - y2)) +
   32734:	20 e0       	ldi	r18, 0x00	; 0
   32736:	30 e0       	ldi	r19, 0x00	; 0
   32738:	48 ed       	ldi	r20, 0xD8	; 216
   3273a:	52 e4       	ldi	r21, 0x42	; 66
   3273c:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   32740:	2b 01       	movw	r4, r22
   32742:	3c 01       	movw	r6, r24
   32744:	20 e0       	ldi	r18, 0x00	; 0
   32746:	30 e0       	ldi	r19, 0x00	; 0
   32748:	42 e5       	ldi	r20, 0x52	; 82
   3274a:	53 e4       	ldi	r21, 0x43	; 67
   3274c:	c7 01       	movw	r24, r14
   3274e:	b6 01       	movw	r22, r12
   32750:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   32754:	4b 01       	movw	r8, r22
   32756:	5c 01       	movw	r10, r24
                    z_values[idx1][i] * (y - y0) * (y - y2) / ((y1 - y0) * (y1 - y2)) +
   32758:	20 e0       	ldi	r18, 0x00	; 0
   3275a:	30 e0       	ldi	r19, 0x00	; 0
   3275c:	40 ec       	ldi	r20, 0xC0	; 192
   3275e:	50 e4       	ldi	r21, 0x40	; 64
   32760:	c7 01       	movw	r24, r14
   32762:	b6 01       	movw	r22, r12
   32764:	0f 94 07 a5 	call	0x34a0e	; 0x34a0e <__subsf3>
   32768:	6b 01       	movw	r12, r22
   3276a:	7c 01       	movw	r14, r24
   3276c:	ee 81       	ldd	r30, Y+6	; 0x06
   3276e:	ff 81       	ldd	r31, Y+7	; 0x07
   32770:	20 81       	ld	r18, Z
   32772:	31 81       	ldd	r19, Z+1	; 0x01
   32774:	42 81       	ldd	r20, Z+2	; 0x02
   32776:	53 81       	ldd	r21, Z+3	; 0x03
   32778:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   3277c:	a5 01       	movw	r20, r10
   3277e:	94 01       	movw	r18, r8
   32780:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   32784:	20 e0       	ldi	r18, 0x00	; 0
   32786:	30 e9       	ldi	r19, 0x90	; 144
   32788:	42 e2       	ldi	r20, 0x22	; 34
   3278a:	56 ec       	ldi	r21, 0xC6	; 198
   3278c:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   32790:	6a 83       	std	Y+2, r22	; 0x02
   32792:	7b 83       	std	Y+3, r23	; 0x03
   32794:	8c 83       	std	Y+4, r24	; 0x04
   32796:	9d 83       	std	Y+5, r25	; 0x05
            for (int j = 1; j + 1 < MESH_NUM_Y_POINTS; ++ j) {
                if (!isnan(z_values[j][i]))
                    continue;
                float y = get_y(j);
                z_values[j][i] =
                    z_values[idx0][i] * (y - y1) * (y - y2) / ((y0 - y1) * (y0 - y2)) +
   32798:	f8 01       	movw	r30, r16
   3279a:	21 81       	ldd	r18, Z+1	; 0x01
   3279c:	32 81       	ldd	r19, Z+2	; 0x02
   3279e:	43 81       	ldd	r20, Z+3	; 0x03
   327a0:	54 81       	ldd	r21, Z+4	; 0x04
   327a2:	c3 01       	movw	r24, r6
   327a4:	b2 01       	movw	r22, r4
   327a6:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   327aa:	a5 01       	movw	r20, r10
   327ac:	94 01       	movw	r18, r8
   327ae:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   327b2:	20 e0       	ldi	r18, 0x00	; 0
   327b4:	30 e9       	ldi	r19, 0x90	; 144
   327b6:	42 ea       	ldi	r20, 0xA2	; 162
   327b8:	56 e4       	ldi	r21, 0x46	; 70
   327ba:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   327be:	9b 01       	movw	r18, r22
   327c0:	ac 01       	movw	r20, r24
   327c2:	6a 81       	ldd	r22, Y+2	; 0x02
   327c4:	7b 81       	ldd	r23, Y+3	; 0x03
   327c6:	8c 81       	ldd	r24, Y+4	; 0x04
   327c8:	9d 81       	ldd	r25, Y+5	; 0x05
   327ca:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   327ce:	4b 01       	movw	r8, r22
   327d0:	5c 01       	movw	r10, r24
                    z_values[idx1][i] * (y - y0) * (y - y2) / ((y1 - y0) * (y1 - y2)) +
                    z_values[idx2][i] * (y - y0) * (y - y1) / ((y2 - y0) * (y2 - y1));
   327d2:	f1 01       	movw	r30, r2
   327d4:	20 81       	ld	r18, Z
   327d6:	31 81       	ldd	r19, Z+1	; 0x01
   327d8:	42 81       	ldd	r20, Z+2	; 0x02
   327da:	53 81       	ldd	r21, Z+3	; 0x03
   327dc:	c7 01       	movw	r24, r14
   327de:	b6 01       	movw	r22, r12
   327e0:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   327e4:	a3 01       	movw	r20, r6
   327e6:	92 01       	movw	r18, r4
   327e8:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   327ec:	20 e0       	ldi	r18, 0x00	; 0
   327ee:	30 e9       	ldi	r19, 0x90	; 144
   327f0:	42 ea       	ldi	r20, 0xA2	; 162
   327f2:	56 e4       	ldi	r21, 0x46	; 70
   327f4:	0f 94 07 a6 	call	0x34c0e	; 0x34c0e <__divsf3>
   327f8:	9b 01       	movw	r18, r22
   327fa:	ac 01       	movw	r20, r24
                if (!isnan(z_values[j][i]))
                    continue;
                float y = get_y(j);
                z_values[j][i] =
                    z_values[idx0][i] * (y - y1) * (y - y2) / ((y0 - y1) * (y0 - y2)) +
                    z_values[idx1][i] * (y - y0) * (y - y2) / ((y1 - y0) * (y1 - y2)) +
   327fc:	c5 01       	movw	r24, r10
   327fe:	b4 01       	movw	r22, r8
   32800:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
            // Interpolate the remaining values by Largrangian polynomials.
            for (int j = 1; j + 1 < MESH_NUM_Y_POINTS; ++ j) {
                if (!isnan(z_values[j][i]))
                    continue;
                float y = get_y(j);
                z_values[j][i] =
   32804:	e8 85       	ldd	r30, Y+8	; 0x08
   32806:	f9 85       	ldd	r31, Y+9	; 0x09
   32808:	65 8f       	std	Z+29, r22	; 0x1d
   3280a:	76 8f       	std	Z+30, r23	; 0x1e
   3280c:	87 8f       	std	Z+31, r24	; 0x1f
   3280e:	90 a3       	std	Z+32, r25	; 0x20
   32810:	88 85       	ldd	r24, Y+8	; 0x08
   32812:	99 85       	ldd	r25, Y+9	; 0x09
   32814:	4c 96       	adiw	r24, 0x1c	; 28
   32816:	99 87       	std	Y+9, r25	; 0x09
   32818:	88 87       	std	Y+8, r24	; 0x08
   3281a:	99 81       	ldd	r25, Y+1	; 0x01
   3281c:	9f 5f       	subi	r25, 0xFF	; 255
   3281e:	99 83       	std	Y+1, r25	; 0x01
        static const float y0 = (BED_Y0 + Y_PROBE_OFFSET_FROM_EXTRUDER);
        static const float y1 = 0.5f * float(BED_Y0 + BED_Yn) + Y_PROBE_OFFSET_FROM_EXTRUDER;
        static const float y2 = BED_Yn + Y_PROBE_OFFSET_FROM_EXTRUDER;
        for (int i = 0; i < MESH_NUM_X_POINTS; ++ i) {
            // Interpolate the remaining values by Largrangian polynomials.
            for (int j = 1; j + 1 < MESH_NUM_Y_POINTS; ++ j) {
   32820:	96 30       	cpi	r25, 0x06	; 6
   32822:	09 f0       	breq	.+2      	; 0x32826 <mesh_bed_leveling::upsample_3x3() [clone .constprop.52]+0x2ac>
   32824:	6f cf       	rjmp	.-290    	; 0x32704 <mesh_bed_leveling::upsample_3x3() [clone .constprop.52]+0x18a>
   32826:	0c 5f       	subi	r16, 0xFC	; 252
   32828:	1f 4f       	sbci	r17, 0xFF	; 255
    {
        // Second interpolate the points in Y axis.
        static const float y0 = (BED_Y0 + Y_PROBE_OFFSET_FROM_EXTRUDER);
        static const float y1 = 0.5f * float(BED_Y0 + BED_Yn) + Y_PROBE_OFFSET_FROM_EXTRUDER;
        static const float y2 = BED_Yn + Y_PROBE_OFFSET_FROM_EXTRUDER;
        for (int i = 0; i < MESH_NUM_X_POINTS; ++ i) {
   3282a:	e3 e1       	ldi	r30, 0x13	; 19
   3282c:	05 32       	cpi	r16, 0x25	; 37
   3282e:	1e 07       	cpc	r17, r30
   32830:	09 f0       	breq	.+2      	; 0x32834 <mesh_bed_leveling::upsample_3x3() [clone .constprop.52]+0x2ba>
   32832:	5b cf       	rjmp	.-330    	; 0x326ea <mesh_bed_leveling::upsample_3x3() [clone .constprop.52]+0x170>
                    z_values[idx1][i] * (y - y0) * (y - y2) / ((y1 - y0) * (y1 - y2)) +
                    z_values[idx2][i] * (y - y0) * (y - y1) / ((y2 - y0) * (y2 - y1));
            }
        }
    }
}
   32834:	29 96       	adiw	r28, 0x09	; 9
   32836:	0f b6       	in	r0, 0x3f	; 63
   32838:	f8 94       	cli
   3283a:	de bf       	out	0x3e, r29	; 62
   3283c:	0f be       	out	0x3f, r0	; 63
   3283e:	cd bf       	out	0x3d, r28	; 61
   32840:	df 91       	pop	r29
   32842:	cf 91       	pop	r28
   32844:	1f 91       	pop	r17
   32846:	0f 91       	pop	r16
   32848:	ff 90       	pop	r15
   3284a:	ef 90       	pop	r14
   3284c:	df 90       	pop	r13
   3284e:	cf 90       	pop	r12
   32850:	bf 90       	pop	r11
   32852:	af 90       	pop	r10
   32854:	9f 90       	pop	r9
   32856:	8f 90       	pop	r8
   32858:	7f 90       	pop	r7
   3285a:	6f 90       	pop	r6
   3285c:	5f 90       	pop	r5
   3285e:	4f 90       	pop	r4
   32860:	3f 90       	pop	r3
   32862:	2f 90       	pop	r2
   32864:	08 95       	ret

00032866 <MMU2::ProtocolLogic::SendReadRegister(unsigned char, MMU2::ProtocolLogic::ScopeState) [clone .constprop.330]>:
void ProtocolLogic::SendVersion(uint8_t stage) {
    SendMsg(RequestMsg(RequestMsgCodes::Version, stage));
    scopeState = (ScopeState)((uint_fast8_t)ScopeState::S0Sent + stage);
}

void ProtocolLogic::SendReadRegister(uint8_t index, ScopeState nextState) {
   32866:	1f 93       	push	r17
   32868:	cf 93       	push	r28
   3286a:	df 93       	push	r29
   3286c:	00 d0       	rcall	.+0      	; 0x3286e <MMU2::ProtocolLogic::SendReadRegister(unsigned char, MMU2::ProtocolLogic::ScopeState) [clone .constprop.330]+0x8>
   3286e:	1f 92       	push	r1
   32870:	1f 92       	push	r1
   32872:	cd b7       	in	r28, 0x3d	; 61
   32874:	de b7       	in	r29, 0x3e	; 62
   32876:	16 2f       	mov	r17, r22
    SendMsg(RequestMsg(RequestMsgCodes::Read, index));
   32878:	48 2f       	mov	r20, r24
   3287a:	62 e5       	ldi	r22, 0x52	; 82
   3287c:	ce 01       	movw	r24, r28
   3287e:	01 96       	adiw	r24, 0x01	; 1
   32880:	0f 94 c7 50 	call	0x2a18e	; 0x2a18e <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   32884:	49 81       	ldd	r20, Y+1	; 0x01
   32886:	5a 81       	ldd	r21, Y+2	; 0x02
   32888:	6b 81       	ldd	r22, Y+3	; 0x03
   3288a:	7c 81       	ldd	r23, Y+4	; 0x04
   3288c:	8d 81       	ldd	r24, Y+5	; 0x05
   3288e:	0f 94 58 57 	call	0x2aeb0	; 0x2aeb0 <MMU2::ProtocolLogic::SendMsg(modules::protocol::RequestMsg) [clone .constprop.335]>
    scopeState = nextState;
   32892:	10 93 95 12 	sts	0x1295, r17	; 0x801295 <MMU2::mmu2+0x3>
}
   32896:	0f 90       	pop	r0
   32898:	0f 90       	pop	r0
   3289a:	0f 90       	pop	r0
   3289c:	0f 90       	pop	r0
   3289e:	0f 90       	pop	r0
   328a0:	df 91       	pop	r29
   328a2:	cf 91       	pop	r28
   328a4:	1f 91       	pop	r17
   328a6:	08 95       	ret

000328a8 <MMU2::ProtocolLogic::StartReading8bitRegisters() [clone .constprop.271]>:
    SendMsg(RequestMsg(RequestMsgCodes::Query, 0));
    scopeState = ScopeState::QuerySent;
}

void ProtocolLogic::StartReading8bitRegisters() {
    regIndex = 0;
   328a8:	10 92 e0 12 	sts	0x12E0, r1	; 0x8012e0 <MMU2::mmu2+0x4e>
    SendReadRegister(pgm_read_byte(regs8Addrs + regIndex), ScopeState::Reading8bitRegisters);
   328ac:	ec e5       	ldi	r30, 0x5C	; 92
   328ae:	f1 ea       	ldi	r31, 0xA1	; 161
   328b0:	84 91       	lpm	r24, Z
   328b2:	67 e0       	ldi	r22, 0x07	; 7
   328b4:	0d 94 33 94 	jmp	0x32866	; 0x32866 <MMU2::ProtocolLogic::SendReadRegister(unsigned char, MMU2::ProtocolLogic::ScopeState) [clone .constprop.330]>

000328b8 <MMU2::ProtocolLogic::ProcessRead16bitRegister(MMU2::ProtocolLogic::ScopeState) [clone .constprop.268]>:
    regIndex = 0;
    SendReadRegister(pgm_read_byte(regs16Addrs + regIndex), ScopeState::Reading16bitRegisters);
}

ProtocolLogic::ScopeState __attribute__((noinline)) ProtocolLogic::ProcessRead16bitRegister(ProtocolLogic::ScopeState stateAtEnd) {
    regs16[regIndex] = rsp.paramValue;
   328b8:	e0 91 e0 12 	lds	r30, 0x12E0	; 0x8012e0 <MMU2::mmu2+0x4e>
   328bc:	ae 2f       	mov	r26, r30
   328be:	b0 e0       	ldi	r27, 0x00	; 0
   328c0:	aa 0f       	add	r26, r26
   328c2:	bb 1f       	adc	r27, r27
   328c4:	a6 52       	subi	r26, 0x26	; 38
   328c6:	bd 4e       	sbci	r27, 0xED	; 237
   328c8:	20 91 ad 12 	lds	r18, 0x12AD	; 0x8012ad <MMU2::mmu2+0x1b>
   328cc:	30 91 ae 12 	lds	r19, 0x12AE	; 0x8012ae <MMU2::mmu2+0x1c>
   328d0:	2d 93       	st	X+, r18
   328d2:	3c 93       	st	X, r19
    ++regIndex;
   328d4:	ef 5f       	subi	r30, 0xFF	; 255
   328d6:	e0 93 e0 12 	sts	0x12E0, r30	; 0x8012e0 <MMU2::mmu2+0x4e>
    if (regIndex >= regs16Count) {
   328da:	e2 30       	cpi	r30, 0x02	; 2
   328dc:	40 f4       	brcc	.+16     	; 0x328ee <MMU2::ProtocolLogic::ProcessRead16bitRegister(MMU2::ProtocolLogic::ScopeState) [clone .constprop.268]+0x36>
        return stateAtEnd;
    } else {
        SendReadRegister(pgm_read_byte(regs16Addrs + regIndex), ScopeState::Reading16bitRegisters);
   328de:	f0 e0       	ldi	r31, 0x00	; 0
   328e0:	ed 5b       	subi	r30, 0xBD	; 189
   328e2:	fe 45       	sbci	r31, 0x5E	; 94
   328e4:	84 91       	lpm	r24, Z
   328e6:	68 e0       	ldi	r22, 0x08	; 8
   328e8:	0f 94 33 94 	call	0x32866	; 0x32866 <MMU2::ProtocolLogic::SendReadRegister(unsigned char, MMU2::ProtocolLogic::ScopeState) [clone .constprop.330]>
    }
    return ScopeState::Reading16bitRegisters;
   328ec:	88 e0       	ldi	r24, 0x08	; 8
}
   328ee:	08 95       	ret

000328f0 <MMU2::ProtocolLogic::ProcessRead8bitRegister() [clone .constprop.266]>:
    regIndex = 0;
    SendReadRegister(pgm_read_byte(regs8Addrs + regIndex), ScopeState::Reading8bitRegisters);
}

void ProtocolLogic::ProcessRead8bitRegister() {
    regs8[regIndex] = rsp.paramValue;
   328f0:	e0 91 e0 12 	lds	r30, 0x12E0	; 0x8012e0 <MMU2::mmu2+0x4e>
   328f4:	ae 2f       	mov	r26, r30
   328f6:	b0 e0       	ldi	r27, 0x00	; 0
   328f8:	a9 52       	subi	r26, 0x29	; 41
   328fa:	bd 4e       	sbci	r27, 0xED	; 237
   328fc:	80 91 ad 12 	lds	r24, 0x12AD	; 0x8012ad <MMU2::mmu2+0x1b>
   32900:	8c 93       	st	X, r24
    ++regIndex;
   32902:	ef 5f       	subi	r30, 0xFF	; 255
   32904:	e0 93 e0 12 	sts	0x12E0, r30	; 0x8012e0 <MMU2::mmu2+0x4e>
    if (regIndex >= regs8Count) {
   32908:	e3 30       	cpi	r30, 0x03	; 3
   3290a:	40 f0       	brcs	.+16     	; 0x3291c <MMU2::ProtocolLogic::ProcessRead8bitRegister() [clone .constprop.266]+0x2c>
        SendReadRegister(pgm_read_byte(regs8Addrs + regIndex), ScopeState::Reading8bitRegisters);
    }
}

void ProtocolLogic::StartReading16bitRegisters() {
    regIndex = 0;
   3290c:	10 92 e0 12 	sts	0x12E0, r1	; 0x8012e0 <MMU2::mmu2+0x4e>
    SendReadRegister(pgm_read_byte(regs16Addrs + regIndex), ScopeState::Reading16bitRegisters);
   32910:	e3 e4       	ldi	r30, 0x43	; 67
   32912:	f1 ea       	ldi	r31, 0xA1	; 161
   32914:	84 91       	lpm	r24, Z
   32916:	68 e0       	ldi	r22, 0x08	; 8
    ++regIndex;
    if (regIndex >= regs8Count) {
        // proceed with reading 16bit registers
        StartReading16bitRegisters();
    } else {
        SendReadRegister(pgm_read_byte(regs8Addrs + regIndex), ScopeState::Reading8bitRegisters);
   32918:	0d 94 33 94 	jmp	0x32866	; 0x32866 <MMU2::ProtocolLogic::SendReadRegister(unsigned char, MMU2::ProtocolLogic::ScopeState) [clone .constprop.330]>
   3291c:	f0 e0       	ldi	r31, 0x00	; 0
   3291e:	e4 5a       	subi	r30, 0xA4	; 164
   32920:	fe 45       	sbci	r31, 0x5E	; 94
   32922:	84 91       	lpm	r24, Z
   32924:	67 e0       	ldi	r22, 0x07	; 7
   32926:	f8 cf       	rjmp	.-16     	; 0x32918 <MMU2::ProtocolLogic::ProcessRead8bitRegister() [clone .constprop.266]+0x28>

00032928 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.328]>:
    if (!ExpectsResponse()) {
        ActivatePlannedRequest();
    } // otherwise wait for an empty window to activate the request
}

bool ProtocolLogic::ActivatePlannedRequest() {
   32928:	cf 93       	push	r28
   3292a:	df 93       	push	r29
   3292c:	00 d0       	rcall	.+0      	; 0x3292e <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.328]+0x6>
   3292e:	00 d0       	rcall	.+0      	; 0x32930 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.328]+0x8>
   32930:	00 d0       	rcall	.+0      	; 0x32932 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.328]+0xa>
   32932:	1f 92       	push	r1
   32934:	cd b7       	in	r28, 0x3d	; 61
   32936:	de b7       	in	r29, 0x3e	; 62
    switch (plannedRq.code) {
   32938:	80 91 9c 12 	lds	r24, 0x129C	; 0x80129c <MMU2::mmu2+0xa>
   3293c:	82 34       	cpi	r24, 0x42	; 66
   3293e:	09 f4       	brne	.+2      	; 0x32942 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.328]+0x1a>
   32940:	46 c0       	rjmp	.+140    	; 0x329ce <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.328]+0xa6>
   32942:	b8 f5       	brcc	.+110    	; 0x329b2 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.328]+0x8a>
   32944:	88 23       	and	r24, r24
   32946:	09 f4       	brne	.+2      	; 0x3294a <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.328]+0x22>
   32948:	72 c0       	rjmp	.+228    	; 0x32a2e <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.328]+0x106>
        plannedRq = RequestMsg(RequestMsgCodes::unknown, 0);
        return true;
    case RequestMsgCodes::unknown:
        return false;
    default: // commands
        currentScope = Scope::Command;
   3294a:	84 e0       	ldi	r24, 0x04	; 4
   3294c:	80 93 94 12 	sts	0x1294, r24	; 0x801294 <MMU2::mmu2+0x2>
   32950:	85 e0       	ldi	r24, 0x05	; 5
   32952:	ec e9       	ldi	r30, 0x9C	; 156
   32954:	f2 e1       	ldi	r31, 0x12	; 18
   32956:	de 01       	movw	r26, r28
   32958:	16 96       	adiw	r26, 0x06	; 6
   3295a:	01 90       	ld	r0, Z+
   3295c:	0d 92       	st	X+, r0
   3295e:	8a 95       	dec	r24
   32960:	e1 f7       	brne	.-8      	; 0x3295a <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.328]+0x32>
    StepStatus StoppedStep() { return Processing; }

    StepStatus ProcessCommandQueryResponse();

    inline void SetRequestMsg(RequestMsg msg) {
        rq = msg;
   32962:	85 e0       	ldi	r24, 0x05	; 5
   32964:	fe 01       	movw	r30, r28
   32966:	36 96       	adiw	r30, 0x06	; 6
   32968:	a7 e9       	ldi	r26, 0x97	; 151
   3296a:	b2 e1       	ldi	r27, 0x12	; 18
   3296c:	01 90       	ld	r0, Z+
   3296e:	0d 92       	st	X+, r0
   32970:	8a 95       	dec	r24
   32972:	e1 f7       	brne	.-8      	; 0x3296c <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.328]+0x44>
        SetRequestMsg(plannedRq);
        plannedRq = RequestMsg(RequestMsgCodes::unknown, 0);
   32974:	40 e0       	ldi	r20, 0x00	; 0
   32976:	60 e0       	ldi	r22, 0x00	; 0
   32978:	ce 01       	movw	r24, r28
   3297a:	01 96       	adiw	r24, 0x01	; 1
   3297c:	0f 94 c7 50 	call	0x2a18e	; 0x2a18e <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   32980:	85 e0       	ldi	r24, 0x05	; 5
   32982:	fe 01       	movw	r30, r28
   32984:	31 96       	adiw	r30, 0x01	; 1
   32986:	ac e9       	ldi	r26, 0x9C	; 156
   32988:	b2 e1       	ldi	r27, 0x12	; 18
   3298a:	01 90       	ld	r0, Z+
   3298c:	0d 92       	st	X+, r0
   3298e:	8a 95       	dec	r24
   32990:	e1 f7       	brne	.-8      	; 0x3298a <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.328]+0x62>
void ProtocolLogic::DelayedRestartRestart() {
    scopeState = ScopeState::RecoveringProtocolError;
}

void ProtocolLogic::CommandRestart() {
    scopeState = ScopeState::CommandSent;
   32992:	85 e0       	ldi	r24, 0x05	; 5
   32994:	80 93 95 12 	sts	0x1295, r24	; 0x801295 <MMU2::mmu2+0x3>
    SendMsg(rq);
   32998:	40 91 97 12 	lds	r20, 0x1297	; 0x801297 <MMU2::mmu2+0x5>
   3299c:	50 91 98 12 	lds	r21, 0x1298	; 0x801298 <MMU2::mmu2+0x6>
   329a0:	60 91 99 12 	lds	r22, 0x1299	; 0x801299 <MMU2::mmu2+0x7>
   329a4:	70 91 9a 12 	lds	r23, 0x129A	; 0x80129a <MMU2::mmu2+0x8>
   329a8:	80 91 9b 12 	lds	r24, 0x129B	; 0x80129b <MMU2::mmu2+0x9>
   329ac:	0f 94 58 57 	call	0x2aeb0	; 0x2aeb0 <MMU2::ProtocolLogic::SendMsg(modules::protocol::RequestMsg) [clone .constprop.335]>
   329b0:	2e c0       	rjmp	.+92     	; 0x32a0e <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.328]+0xe6>
        ActivatePlannedRequest();
    } // otherwise wait for an empty window to activate the request
}

bool ProtocolLogic::ActivatePlannedRequest() {
    switch (plannedRq.code) {
   329b2:	82 35       	cpi	r24, 0x52	; 82
   329b4:	b1 f1       	breq	.+108    	; 0x32a22 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.328]+0xfa>
   329b6:	87 35       	cpi	r24, 0x57	; 87
   329b8:	41 f6       	brne	.-112    	; 0x3294a <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.328]+0x22>
    case RequestMsgCodes::Read:
        SendReadRegister(plannedRq.value, ScopeState::ReadRegisterSent);
        plannedRq = RequestMsg(RequestMsgCodes::unknown, 0);
        return true;
    case RequestMsgCodes::Write:
        SendWriteRegister(plannedRq.value, plannedRq.value2, ScopeState::WriteRegisterSent);
   329ba:	60 91 9e 12 	lds	r22, 0x129E	; 0x80129e <MMU2::mmu2+0xc>
   329be:	70 91 9f 12 	lds	r23, 0x129F	; 0x80129f <MMU2::mmu2+0xd>
   329c2:	4c e0       	ldi	r20, 0x0C	; 12
   329c4:	80 91 9d 12 	lds	r24, 0x129D	; 0x80129d <MMU2::mmu2+0xb>
   329c8:	0f 94 c3 57 	call	0x2af86	; 0x2af86 <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.331]>
   329cc:	11 c0       	rjmp	.+34     	; 0x329f0 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.328]+0xc8>
    SendMsg(RequestMsg(RequestMsgCodes::FilamentSensor, lastFSensor = (uint8_t)WhereIsFilament()));
    scopeState = ScopeState::FilamentSensorStateSent;
}

void ProtocolLogic::SendButton(uint8_t btn) {
    SendMsg(RequestMsg(RequestMsgCodes::Button, btn));
   329ce:	40 91 9d 12 	lds	r20, 0x129D	; 0x80129d <MMU2::mmu2+0xb>
   329d2:	62 e4       	ldi	r22, 0x42	; 66
   329d4:	ce 01       	movw	r24, r28
   329d6:	01 96       	adiw	r24, 0x01	; 1
   329d8:	0f 94 c7 50 	call	0x2a18e	; 0x2a18e <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   329dc:	49 81       	ldd	r20, Y+1	; 0x01
   329de:	5a 81       	ldd	r21, Y+2	; 0x02
   329e0:	6b 81       	ldd	r22, Y+3	; 0x03
   329e2:	7c 81       	ldd	r23, Y+4	; 0x04
   329e4:	8d 81       	ldd	r24, Y+5	; 0x05
   329e6:	0f 94 58 57 	call	0x2aeb0	; 0x2aeb0 <MMU2::ProtocolLogic::SendMsg(modules::protocol::RequestMsg) [clone .constprop.335]>
    scopeState = ScopeState::ButtonSent;
   329ea:	8a e0       	ldi	r24, 0x0A	; 10
   329ec:	80 93 95 12 	sts	0x1295, r24	; 0x801295 <MMU2::mmu2+0x3>
        SendReadRegister(plannedRq.value, ScopeState::ReadRegisterSent);
        plannedRq = RequestMsg(RequestMsgCodes::unknown, 0);
        return true;
    case RequestMsgCodes::Write:
        SendWriteRegister(plannedRq.value, plannedRq.value2, ScopeState::WriteRegisterSent);
        plannedRq = RequestMsg(RequestMsgCodes::unknown, 0);
   329f0:	40 e0       	ldi	r20, 0x00	; 0
   329f2:	60 e0       	ldi	r22, 0x00	; 0
   329f4:	ce 01       	movw	r24, r28
   329f6:	01 96       	adiw	r24, 0x01	; 1
   329f8:	0f 94 c7 50 	call	0x2a18e	; 0x2a18e <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   329fc:	85 e0       	ldi	r24, 0x05	; 5
   329fe:	fe 01       	movw	r30, r28
   32a00:	31 96       	adiw	r30, 0x01	; 1
   32a02:	ac e9       	ldi	r26, 0x9C	; 156
   32a04:	b2 e1       	ldi	r27, 0x12	; 18
   32a06:	01 90       	ld	r0, Z+
   32a08:	0d 92       	st	X+, r0
   32a0a:	8a 95       	dec	r24
   32a0c:	e1 f7       	brne	.-8      	; 0x32a06 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.328]+0xde>
    default: // commands
        currentScope = Scope::Command;
        SetRequestMsg(plannedRq);
        plannedRq = RequestMsg(RequestMsgCodes::unknown, 0);
        CommandRestart();
        return true;
   32a0e:	81 e0       	ldi	r24, 0x01	; 1
    }
}
   32a10:	2a 96       	adiw	r28, 0x0a	; 10
   32a12:	0f b6       	in	r0, 0x3f	; 63
   32a14:	f8 94       	cli
   32a16:	de bf       	out	0x3e, r29	; 62
   32a18:	0f be       	out	0x3f, r0	; 63
   32a1a:	cd bf       	out	0x3d, r28	; 61
   32a1c:	df 91       	pop	r29
   32a1e:	cf 91       	pop	r28
   32a20:	08 95       	ret
        // only issue the button to the MMU and do not restart the state machines
        SendButton(plannedRq.value);
        plannedRq = RequestMsg(RequestMsgCodes::unknown, 0);
        return true;
    case RequestMsgCodes::Read:
        SendReadRegister(plannedRq.value, ScopeState::ReadRegisterSent);
   32a22:	6b e0       	ldi	r22, 0x0B	; 11
   32a24:	80 91 9d 12 	lds	r24, 0x129D	; 0x80129d <MMU2::mmu2+0xb>
   32a28:	0f 94 33 94 	call	0x32866	; 0x32866 <MMU2::ProtocolLogic::SendReadRegister(unsigned char, MMU2::ProtocolLogic::ScopeState) [clone .constprop.330]>
   32a2c:	e1 cf       	rjmp	.-62     	; 0x329f0 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.328]+0xc8>
    case RequestMsgCodes::Write:
        SendWriteRegister(plannedRq.value, plannedRq.value2, ScopeState::WriteRegisterSent);
        plannedRq = RequestMsg(RequestMsgCodes::unknown, 0);
        return true;
    case RequestMsgCodes::unknown:
        return false;
   32a2e:	80 e0       	ldi	r24, 0x00	; 0
   32a30:	ef cf       	rjmp	.-34     	; 0x32a10 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.328]+0xe8>

00032a32 <MMU2::ProtocolLogic::PlanGenericRequest(modules::protocol::RequestMsg) [clone .constprop.327]>:

void ProtocolLogic::WriteRegister(uint8_t address, uint16_t data) {
    PlanGenericRequest(RequestMsg(RequestMsgCodes::Write, address, data));
}

void ProtocolLogic::PlanGenericRequest(RequestMsg rq) {
   32a32:	cf 93       	push	r28
   32a34:	df 93       	push	r29
   32a36:	00 d0       	rcall	.+0      	; 0x32a38 <MMU2::ProtocolLogic::PlanGenericRequest(modules::protocol::RequestMsg) [clone .constprop.327]+0x6>
   32a38:	1f 92       	push	r1
   32a3a:	1f 92       	push	r1
   32a3c:	cd b7       	in	r28, 0x3d	; 61
   32a3e:	de b7       	in	r29, 0x3e	; 62
   32a40:	49 83       	std	Y+1, r20	; 0x01
   32a42:	5a 83       	std	Y+2, r21	; 0x02
   32a44:	6b 83       	std	Y+3, r22	; 0x03
   32a46:	7c 83       	std	Y+4, r23	; 0x04
   32a48:	8d 83       	std	Y+5, r24	; 0x05
    plannedRq = rq;
   32a4a:	85 e0       	ldi	r24, 0x05	; 5
   32a4c:	fe 01       	movw	r30, r28
   32a4e:	31 96       	adiw	r30, 0x01	; 1
   32a50:	ac e9       	ldi	r26, 0x9C	; 156
   32a52:	b2 e1       	ldi	r27, 0x12	; 18
   32a54:	01 90       	ld	r0, Z+
   32a56:	0d 92       	st	X+, r0
   32a58:	8a 95       	dec	r24
   32a5a:	e1 f7       	brne	.-8      	; 0x32a54 <MMU2::ProtocolLogic::PlanGenericRequest(modules::protocol::RequestMsg) [clone .constprop.327]+0x22>
    if (!ExpectsResponse()) {
   32a5c:	80 91 95 12 	lds	r24, 0x1295	; 0x801295 <MMU2::mmu2+0x3>
   32a60:	87 ff       	sbrs	r24, 7
   32a62:	09 c0       	rjmp	.+18     	; 0x32a76 <MMU2::ProtocolLogic::PlanGenericRequest(modules::protocol::RequestMsg) [clone .constprop.327]+0x44>
        ActivatePlannedRequest();
    } // otherwise wait for an empty window to activate the request
}
   32a64:	0f 90       	pop	r0
   32a66:	0f 90       	pop	r0
   32a68:	0f 90       	pop	r0
   32a6a:	0f 90       	pop	r0
   32a6c:	0f 90       	pop	r0
   32a6e:	df 91       	pop	r29
   32a70:	cf 91       	pop	r28
}

void ProtocolLogic::PlanGenericRequest(RequestMsg rq) {
    plannedRq = rq;
    if (!ExpectsResponse()) {
        ActivatePlannedRequest();
   32a72:	0d 94 94 94 	jmp	0x32928	; 0x32928 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.328]>
    } // otherwise wait for an empty window to activate the request
}
   32a76:	0f 90       	pop	r0
   32a78:	0f 90       	pop	r0
   32a7a:	0f 90       	pop	r0
   32a7c:	0f 90       	pop	r0
   32a7e:	0f 90       	pop	r0
   32a80:	df 91       	pop	r29
   32a82:	cf 91       	pop	r28
   32a84:	08 95       	ret

00032a86 <MMU2::ProtocolLogic::ResetMMU(unsigned char) [clone .constprop.326]>:

void ProtocolLogic::CutFilament(uint8_t slot) {
    PlanGenericRequest(RequestMsg(RequestMsgCodes::Cut, slot));
}

void ProtocolLogic::ResetMMU(uint8_t mode /* = 0 */) {
   32a86:	cf 93       	push	r28
   32a88:	df 93       	push	r29
   32a8a:	00 d0       	rcall	.+0      	; 0x32a8c <MMU2::ProtocolLogic::ResetMMU(unsigned char) [clone .constprop.326]+0x6>
   32a8c:	1f 92       	push	r1
   32a8e:	1f 92       	push	r1
   32a90:	cd b7       	in	r28, 0x3d	; 61
   32a92:	de b7       	in	r29, 0x3e	; 62
    PlanGenericRequest(RequestMsg(RequestMsgCodes::Reset, mode));
   32a94:	48 2f       	mov	r20, r24
   32a96:	68 e5       	ldi	r22, 0x58	; 88
   32a98:	ce 01       	movw	r24, r28
   32a9a:	01 96       	adiw	r24, 0x01	; 1
   32a9c:	0f 94 c7 50 	call	0x2a18e	; 0x2a18e <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   32aa0:	49 81       	ldd	r20, Y+1	; 0x01
   32aa2:	5a 81       	ldd	r21, Y+2	; 0x02
   32aa4:	6b 81       	ldd	r22, Y+3	; 0x03
   32aa6:	7c 81       	ldd	r23, Y+4	; 0x04
   32aa8:	8d 81       	ldd	r24, Y+5	; 0x05
   32aaa:	0f 94 19 95 	call	0x32a32	; 0x32a32 <MMU2::ProtocolLogic::PlanGenericRequest(modules::protocol::RequestMsg) [clone .constprop.327]>
}
   32aae:	0f 90       	pop	r0
   32ab0:	0f 90       	pop	r0
   32ab2:	0f 90       	pop	r0
   32ab4:	0f 90       	pop	r0
   32ab6:	0f 90       	pop	r0
   32ab8:	df 91       	pop	r29
   32aba:	cf 91       	pop	r28
   32abc:	08 95       	ret

00032abe <MMU2::ProtocolLogic::SendVersion(unsigned char) [clone .constprop.324]>:
void ProtocolLogic::SendButton(uint8_t btn) {
    SendMsg(RequestMsg(RequestMsgCodes::Button, btn));
    scopeState = ScopeState::ButtonSent;
}

void ProtocolLogic::SendVersion(uint8_t stage) {
   32abe:	1f 93       	push	r17
   32ac0:	cf 93       	push	r28
   32ac2:	df 93       	push	r29
   32ac4:	00 d0       	rcall	.+0      	; 0x32ac6 <MMU2::ProtocolLogic::SendVersion(unsigned char) [clone .constprop.324]+0x8>
   32ac6:	1f 92       	push	r1
   32ac8:	1f 92       	push	r1
   32aca:	cd b7       	in	r28, 0x3d	; 61
   32acc:	de b7       	in	r29, 0x3e	; 62
   32ace:	18 2f       	mov	r17, r24
    SendMsg(RequestMsg(RequestMsgCodes::Version, stage));
   32ad0:	48 2f       	mov	r20, r24
   32ad2:	63 e5       	ldi	r22, 0x53	; 83
   32ad4:	ce 01       	movw	r24, r28
   32ad6:	01 96       	adiw	r24, 0x01	; 1
   32ad8:	0f 94 c7 50 	call	0x2a18e	; 0x2a18e <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   32adc:	49 81       	ldd	r20, Y+1	; 0x01
   32ade:	5a 81       	ldd	r21, Y+2	; 0x02
   32ae0:	6b 81       	ldd	r22, Y+3	; 0x03
   32ae2:	7c 81       	ldd	r23, Y+4	; 0x04
   32ae4:	8d 81       	ldd	r24, Y+5	; 0x05
   32ae6:	0f 94 58 57 	call	0x2aeb0	; 0x2aeb0 <MMU2::ProtocolLogic::SendMsg(modules::protocol::RequestMsg) [clone .constprop.335]>
    scopeState = (ScopeState)((uint_fast8_t)ScopeState::S0Sent + stage);
   32aea:	10 93 95 12 	sts	0x1295, r17	; 0x801295 <MMU2::mmu2+0x3>
}
   32aee:	0f 90       	pop	r0
   32af0:	0f 90       	pop	r0
   32af2:	0f 90       	pop	r0
   32af4:	0f 90       	pop	r0
   32af6:	0f 90       	pop	r0
   32af8:	df 91       	pop	r29
   32afa:	cf 91       	pop	r28
   32afc:	1f 91       	pop	r17
   32afe:	08 95       	ret

00032b00 <MMU2::MMU2::Start() [clone .constprop.178]>:
    } else {
        SERIAL_ECHOLNRPGM(_O(MSG_OFF));
    }
}

void MMU2::Start() {
   32b00:	1f 93       	push	r17
   32b02:	cf 93       	push	r28
   32b04:	df 93       	push	r29
}

//uart init (io + FILE stream)
void uart2_init(uint32_t baudRate)
{
	DDRH &=	~0x01;
   32b06:	e1 e0       	ldi	r30, 0x01	; 1
   32b08:	f1 e0       	ldi	r31, 0x01	; 1
   32b0a:	80 81       	ld	r24, Z
   32b0c:	8e 7f       	andi	r24, 0xFE	; 254
   32b0e:	80 83       	st	Z, r24
	PORTH |= 0x01;
   32b10:	e2 e0       	ldi	r30, 0x02	; 2
   32b12:	f1 e0       	ldi	r31, 0x01	; 1
   32b14:	80 81       	ld	r24, Z
   32b16:	81 60       	ori	r24, 0x01	; 1
   32b18:	80 83       	st	Z, r24
//#include <avr/interrupt.h>


void rbuf_ini(uint8_t* ptr, uint8_t l)
{
	ptr[0] = l;
   32b1a:	e5 e4       	ldi	r30, 0x45	; 69
   32b1c:	fd e0       	ldi	r31, 0x0D	; 13
   32b1e:	90 e1       	ldi	r25, 0x10	; 16
   32b20:	90 83       	st	Z, r25
	ptr[1] = 0;
   32b22:	11 82       	std	Z+1, r1	; 0x01
	ptr[2] = 0;
   32b24:	12 82       	std	Z+2, r1	; 0x02
	rbuf_ini(uart2_ibuf, sizeof(uart2_ibuf) - 4);
	UCSR2A |= (1 << U2X2); // baudrate multiplier
   32b26:	e0 ed       	ldi	r30, 0xD0	; 208
   32b28:	f0 e0       	ldi	r31, 0x00	; 0
   32b2a:	80 81       	ld	r24, Z
   32b2c:	82 60       	ori	r24, 0x02	; 2
   32b2e:	80 83       	st	Z, r24
	UBRR2L = UART_BAUD_SELECT(baudRate, F_CPU); // select baudrate
   32b30:	90 93 d4 00 	sts	0x00D4, r25	; 0x8000d4 <__TEXT_REGION_LENGTH__+0x7c20d4>
	UCSR2B = (1 << RXEN2) | (1 << TXEN2); // enable receiver and transmitter
   32b34:	e1 ed       	ldi	r30, 0xD1	; 209
   32b36:	f0 e0       	ldi	r31, 0x00	; 0
   32b38:	88 e1       	ldi	r24, 0x18	; 24
   32b3a:	80 83       	st	Z, r24
	UCSR2B |= (1 << RXCIE2); // enable rx interrupt
   32b3c:	80 81       	ld	r24, Z
   32b3e:	80 68       	ori	r24, 0x80	; 128
   32b40:	80 83       	st	Z, r24
	fdev_setup_stream(uart2io, uart2_putchar, uart2_getchar, _FDEV_SETUP_WRITE | _FDEV_SETUP_READ); //setup uart2 i/o stream
   32b42:	e4 e7       	ldi	r30, 0x74	; 116
   32b44:	f2 e1       	ldi	r31, 0x12	; 18
   32b46:	83 e5       	ldi	r24, 0x53	; 83
   32b48:	9f ef       	ldi	r25, 0xFF	; 255
   32b4a:	91 87       	std	Z+9, r25	; 0x09
   32b4c:	80 87       	std	Z+8, r24	; 0x08
   32b4e:	8b e3       	ldi	r24, 0x3B	; 59
   32b50:	9f ef       	ldi	r25, 0xFF	; 255
   32b52:	93 87       	std	Z+11, r25	; 0x0b
   32b54:	82 87       	std	Z+10, r24	; 0x0a
   32b56:	13 e0       	ldi	r17, 0x03	; 3
   32b58:	13 83       	std	Z+3, r17	; 0x03
   32b5a:	15 86       	std	Z+13, r1	; 0x0d
   32b5c:	14 86       	std	Z+12, r1	; 0x0c
        break;
    }
}

void MMU2::ResetX0() {
    logic.ResetMMU(); // Send soft reset
   32b5e:	80 e0       	ldi	r24, 0x00	; 0
   32b60:	0f 94 43 95 	call	0x32a86	; 0x32a86 <MMU2::ProtocolLogic::ResetMMU(unsigned char) [clone .constprop.326]>
    mmu2Serial.begin(MMU_BAUD);

    PowerOn();
    mmu2Serial.flush(); // make sure the UART buffer is clear before starting communication

    SetCurrentTool(MMU2_NO_TOOL);
   32b64:	83 e6       	ldi	r24, 0x63	; 99
   32b66:	0f 94 c7 65 	call	0x2cb8e	; 0x2cb8e <MMU2::MMU2::SetCurrentTool(unsigned char) [clone .constprop.318]>
        retryAttempts--;
    }
}

void ProtocolLogic::ResetRetryAttempts() {
    SERIAL_ECHOLNPGM("ResetRetryAttempts");
   32b6a:	88 e9       	ldi	r24, 0x98	; 152
   32b6c:	9f e9       	ldi	r25, 0x9F	; 159
   32b6e:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
    retryAttempts = MAX_RETRIES;
   32b72:	c2 e9       	ldi	r28, 0x92	; 146
   32b74:	d2 e1       	ldi	r29, 0x12	; 18
   32b76:	10 93 e6 12 	sts	0x12E6, r17	; 0x8012e6 <MMU2::mmu2+0x54>
}

void ProtocolLogic::ResetCommunicationTimeoutAttempts() {
    SERIAL_ECHOLNPGM("RSTCommTimeout");
   32b7a:	81 e6       	ldi	r24, 0x61	; 97
   32b7c:	91 ea       	ldi	r25, 0xA1	; 161
   32b7e:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>

    /// @returns the initial cause which started this drop out event
    inline StepStatus InitialCause() const { return cause; }

    /// Rearms the object for further processing - basically call this once the MMU responds with something meaningful (e.g. S0 A2)
    inline void Reset() { occurrences = maxOccurrences; }
   32b82:	8a e0       	ldi	r24, 0x0A	; 10
   32b84:	8c 8b       	std	Y+20, r24	; 0x14

    // start the communication
    logic.ResetRetryAttempts();
    logic.ResetCommunicationTimeoutAttempts();

    state = xState::Connecting;
   32b86:	82 e0       	ldi	r24, 0x02	; 2
   32b88:	80 93 01 13 	sts	0x1301, r24	; 0x801301 <MMU2::mmu2+0x6f>
    initRegs8[0] = extraLoadDistance;
    initRegs8[1] = pulleySlowFeedrate;
}

void ProtocolLogic::Start() {
    state = State::InitSequence;
   32b8c:	81 e0       	ldi	r24, 0x01	; 1
   32b8e:	8d 8f       	std	Y+29, r24	; 0x1d
    currentScope = Scope::StartSeq;
   32b90:	8a 83       	std	Y+2, r24	; 0x02
        rqState = RequestStates::Code;
    }

    /// resets the internal response decoding state (typically after an error)
    void ResetResponseDecoder() {
        rspState = ResponseStates::RequestCode;
   32b92:	1c a2       	std	Y+36, r1	; 0x24
    LogRequestMsg(txbuff, len);
    RecordUARTActivity();
}

void ProtocolLogic::StartSeqRestart() {
    retries = maxRetries;
   32b94:	86 e0       	ldi	r24, 0x06	; 6
   32b96:	8c 83       	std	Y+4, r24	; 0x04
    SendVersion(0);
   32b98:	80 e0       	ldi	r24, 0x00	; 0
    logic.Start();
}
   32b9a:	df 91       	pop	r29
   32b9c:	cf 91       	pop	r28
   32b9e:	1f 91       	pop	r17
   32ba0:	0d 94 5f 95 	jmp	0x32abe	; 0x32abe <MMU2::ProtocolLogic::SendVersion(unsigned char) [clone .constprop.324]>

00032ba4 <MMU2::ProtocolLogic::SendQuery() [clone .constprop.280]>:
    if (fs != lastFSensor) {
        SendAndUpdateFilamentSensor();
    }
}

void ProtocolLogic::SendQuery() {
   32ba4:	cf 93       	push	r28
   32ba6:	df 93       	push	r29
   32ba8:	00 d0       	rcall	.+0      	; 0x32baa <MMU2::ProtocolLogic::SendQuery() [clone .constprop.280]+0x6>
   32baa:	1f 92       	push	r1
   32bac:	1f 92       	push	r1
   32bae:	cd b7       	in	r28, 0x3d	; 61
   32bb0:	de b7       	in	r29, 0x3e	; 62
    SendMsg(RequestMsg(RequestMsgCodes::Query, 0));
   32bb2:	40 e0       	ldi	r20, 0x00	; 0
   32bb4:	61 e5       	ldi	r22, 0x51	; 81
   32bb6:	ce 01       	movw	r24, r28
   32bb8:	01 96       	adiw	r24, 0x01	; 1
   32bba:	0f 94 c7 50 	call	0x2a18e	; 0x2a18e <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   32bbe:	49 81       	ldd	r20, Y+1	; 0x01
   32bc0:	5a 81       	ldd	r21, Y+2	; 0x02
   32bc2:	6b 81       	ldd	r22, Y+3	; 0x03
   32bc4:	7c 81       	ldd	r23, Y+4	; 0x04
   32bc6:	8d 81       	ldd	r24, Y+5	; 0x05
   32bc8:	0f 94 58 57 	call	0x2aeb0	; 0x2aeb0 <MMU2::ProtocolLogic::SendMsg(modules::protocol::RequestMsg) [clone .constprop.335]>
    scopeState = ScopeState::QuerySent;
   32bcc:	84 e0       	ldi	r24, 0x04	; 4
   32bce:	80 93 95 12 	sts	0x1295, r24	; 0x801295 <MMU2::mmu2+0x3>
}
   32bd2:	0f 90       	pop	r0
   32bd4:	0f 90       	pop	r0
   32bd6:	0f 90       	pop	r0
   32bd8:	0f 90       	pop	r0
   32bda:	0f 90       	pop	r0
   32bdc:	df 91       	pop	r29
   32bde:	cf 91       	pop	r28
   32be0:	08 95       	ret

00032be2 <MMU2::ProtocolLogic::SendAndUpdateFilamentSensor() [clone .constprop.278]>:
        SendWriteRegister(pgm_read_byte(initRegs8Addrs + regIndex), initRegs8[regIndex], ScopeState::WritingInitRegisters);
    }
    return false;
}

void ProtocolLogic::SendAndUpdateFilamentSensor() {
   32be2:	cf 93       	push	r28
   32be4:	df 93       	push	r29
   32be6:	00 d0       	rcall	.+0      	; 0x32be8 <MMU2::ProtocolLogic::SendAndUpdateFilamentSensor() [clone .constprop.278]+0x6>
   32be8:	1f 92       	push	r1
   32bea:	1f 92       	push	r1
   32bec:	cd b7       	in	r28, 0x3d	; 61
   32bee:	de b7       	in	r29, 0x3e	; 62
    SendMsg(RequestMsg(RequestMsgCodes::FilamentSensor, lastFSensor = (uint8_t)WhereIsFilament()));
   32bf0:	0f 94 0a 51 	call	0x2a214	; 0x2a214 <MMU2::WhereIsFilament()>
   32bf4:	80 93 d6 12 	sts	0x12D6, r24	; 0x8012d6 <MMU2::mmu2+0x44>
   32bf8:	48 2f       	mov	r20, r24
   32bfa:	66 e6       	ldi	r22, 0x66	; 102
   32bfc:	ce 01       	movw	r24, r28
   32bfe:	01 96       	adiw	r24, 0x01	; 1
   32c00:	0f 94 c7 50 	call	0x2a18e	; 0x2a18e <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   32c04:	49 81       	ldd	r20, Y+1	; 0x01
   32c06:	5a 81       	ldd	r21, Y+2	; 0x02
   32c08:	6b 81       	ldd	r22, Y+3	; 0x03
   32c0a:	7c 81       	ldd	r23, Y+4	; 0x04
   32c0c:	8d 81       	ldd	r24, Y+5	; 0x05
   32c0e:	0f 94 58 57 	call	0x2aeb0	; 0x2aeb0 <MMU2::ProtocolLogic::SendMsg(modules::protocol::RequestMsg) [clone .constprop.335]>
    scopeState = ScopeState::FilamentSensorStateSent;
   32c12:	86 e0       	ldi	r24, 0x06	; 6
   32c14:	80 93 95 12 	sts	0x1295, r24	; 0x801295 <MMU2::mmu2+0x3>
}
   32c18:	0f 90       	pop	r0
   32c1a:	0f 90       	pop	r0
   32c1c:	0f 90       	pop	r0
   32c1e:	0f 90       	pop	r0
   32c20:	0f 90       	pop	r0
   32c22:	df 91       	pop	r29
   32c24:	cf 91       	pop	r28
   32c26:	08 95       	ret

00032c28 <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.264]>:
        CheckAndReportAsyncEvents();
    }
    return Processing;
}

StepStatus ProtocolLogic::ProcessCommandQueryResponse() {
   32c28:	cf 93       	push	r28
   32c2a:	df 93       	push	r29
   32c2c:	00 d0       	rcall	.+0      	; 0x32c2e <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.264]+0x6>
   32c2e:	1f 92       	push	r1
   32c30:	1f 92       	push	r1
   32c32:	cd b7       	in	r28, 0x3d	; 61
   32c34:	de b7       	in	r29, 0x3e	; 62
    switch (rsp.paramCode) {
   32c36:	80 91 ac 12 	lds	r24, 0x12AC	; 0x8012ac <MMU2::mmu2+0x1a>
   32c3a:	85 34       	cpi	r24, 0x45	; 69
   32c3c:	f1 f0       	breq	.+60     	; 0x32c7a <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.264]+0x52>
   32c3e:	20 f4       	brcc	.+8      	; 0x32c48 <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.264]+0x20>
   32c40:	82 34       	cpi	r24, 0x42	; 66
   32c42:	51 f1       	breq	.+84     	; 0x32c98 <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.264]+0x70>
        } else {
            // got response to some other command - the originally issued command was interrupted!
            return Interrupted;
        }
    default:
        return ProtocolError;
   32c44:	85 e0       	ldi	r24, 0x05	; 5
   32c46:	11 c0       	rjmp	.+34     	; 0x32c6a <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.264]+0x42>
    }
    return Processing;
}

StepStatus ProtocolLogic::ProcessCommandQueryResponse() {
    switch (rsp.paramCode) {
   32c48:	86 34       	cpi	r24, 0x46	; 70
   32c4a:	71 f1       	breq	.+92     	; 0x32ca8 <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.264]+0x80>
   32c4c:	80 35       	cpi	r24, 0x50	; 80
   32c4e:	d1 f7       	brne	.-12     	; 0x32c44 <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.264]+0x1c>
    case ResponseMsgParamCodes::Processing:
        progressCode = static_cast<ProgressCode>(rsp.paramValue);
   32c50:	80 91 ad 12 	lds	r24, 0x12AD	; 0x8012ad <MMU2::mmu2+0x1b>
   32c54:	80 93 d4 12 	sts	0x12D4, r24	; 0x8012d4 <MMU2::mmu2+0x42>
        errorCode = ErrorCode::OK;
   32c58:	81 e0       	ldi	r24, 0x01	; 1
   32c5a:	90 e0       	ldi	r25, 0x00	; 0
   32c5c:	90 93 d3 12 	sts	0x12D3, r25	; 0x8012d3 <MMU2::mmu2+0x41>
   32c60:	80 93 d2 12 	sts	0x12D2, r24	; 0x8012d2 <MMU2::mmu2+0x40>
        SendAndUpdateFilamentSensor(); // keep on reporting the state of fsensor regularly
   32c64:	0f 94 f1 95 	call	0x32be2	; 0x32be2 <MMU2::ProtocolLogic::SendAndUpdateFilamentSensor() [clone .constprop.278]>
        return Processing;
   32c68:	80 e0       	ldi	r24, 0x00	; 0
            return Interrupted;
        }
    default:
        return ProtocolError;
    }
}
   32c6a:	0f 90       	pop	r0
   32c6c:	0f 90       	pop	r0
   32c6e:	0f 90       	pop	r0
   32c70:	0f 90       	pop	r0
   32c72:	0f 90       	pop	r0
   32c74:	df 91       	pop	r29
   32c76:	cf 91       	pop	r28
   32c78:	08 95       	ret
        errorCode = ErrorCode::OK;
        SendAndUpdateFilamentSensor(); // keep on reporting the state of fsensor regularly
        return Processing;
    case ResponseMsgParamCodes::Error:
        // in case of an error the progress code remains as it has been before
        progressCode = ProgressCode::ERRWaitingForUser;
   32c7a:	8c e0       	ldi	r24, 0x0C	; 12
   32c7c:	80 93 d4 12 	sts	0x12D4, r24	; 0x8012d4 <MMU2::mmu2+0x42>
        errorCode = static_cast<ErrorCode>(rsp.paramValue);
   32c80:	80 91 ad 12 	lds	r24, 0x12AD	; 0x8012ad <MMU2::mmu2+0x1b>
   32c84:	90 91 ae 12 	lds	r25, 0x12AE	; 0x8012ae <MMU2::mmu2+0x1c>
   32c88:	90 93 d3 12 	sts	0x12D3, r25	; 0x8012d3 <MMU2::mmu2+0x41>
   32c8c:	80 93 d2 12 	sts	0x12D2, r24	; 0x8012d2 <MMU2::mmu2+0x40>
        // keep on reporting the state of fsensor regularly even in command error state
        // - the MMU checks FINDA and fsensor even while recovering from errors
        SendAndUpdateFilamentSensor();
   32c90:	0f 94 f1 95 	call	0x32be2	; 0x32be2 <MMU2::ProtocolLogic::SendAndUpdateFilamentSensor() [clone .constprop.278]>
        return CommandError;
   32c94:	87 e0       	ldi	r24, 0x07	; 7
   32c96:	e9 cf       	rjmp	.-46     	; 0x32c6a <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.264]+0x42>
    case ResponseMsgParamCodes::Button:
        // The user pushed a button on the MMU. Save it, do what we need to do
        // to prepare, then pass it back to the MMU so it can work its magic.
        buttonCode = static_cast<Buttons>(rsp.paramValue);
   32c98:	80 91 ad 12 	lds	r24, 0x12AD	; 0x8012ad <MMU2::mmu2+0x1b>
   32c9c:	80 93 d5 12 	sts	0x12D5, r24	; 0x8012d5 <MMU2::mmu2+0x43>
        SendAndUpdateFilamentSensor();
   32ca0:	0f 94 f1 95 	call	0x32be2	; 0x32be2 <MMU2::ProtocolLogic::SendAndUpdateFilamentSensor() [clone .constprop.278]>
        return ButtonPushed;
   32ca4:	8b e0       	ldi	r24, 0x0B	; 11
   32ca6:	e1 cf       	rjmp	.-62     	; 0x32c6a <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.264]+0x42>
    case ResponseMsgParamCodes::Finished:
        // We must check whether the "finished" is actually related to the command issued into the MMU
        // It can also be an X0 F which means MMU just successfully restarted.
        if (ReqMsg().code == rsp.request.code && ReqMsg().value == rsp.request.value) {
   32ca8:	90 91 97 12 	lds	r25, 0x1297	; 0x801297 <MMU2::mmu2+0x5>
   32cac:	80 91 a7 12 	lds	r24, 0x12A7	; 0x8012a7 <MMU2::mmu2+0x15>
   32cb0:	98 13       	cpse	r25, r24
   32cb2:	22 c0       	rjmp	.+68     	; 0x32cf8 <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.264]+0xd0>
   32cb4:	90 91 98 12 	lds	r25, 0x1298	; 0x801298 <MMU2::mmu2+0x6>
   32cb8:	80 91 a8 12 	lds	r24, 0x12A8	; 0x8012a8 <MMU2::mmu2+0x16>
   32cbc:	98 13       	cpse	r25, r24
   32cbe:	1c c0       	rjmp	.+56     	; 0x32cf8 <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.264]+0xd0>
            progressCode = ProgressCode::OK;
   32cc0:	10 92 d4 12 	sts	0x12D4, r1	; 0x8012d4 <MMU2::mmu2+0x42>
            errorCode = ErrorCode::OK;
   32cc4:	81 e0       	ldi	r24, 0x01	; 1
   32cc6:	90 e0       	ldi	r25, 0x00	; 0
   32cc8:	90 93 d3 12 	sts	0x12D3, r25	; 0x8012d3 <MMU2::mmu2+0x41>
   32ccc:	80 93 d2 12 	sts	0x12D2, r24	; 0x8012d2 <MMU2::mmu2+0x40>
            scopeState = ScopeState::Ready;
   32cd0:	82 e8       	ldi	r24, 0x82	; 130
   32cd2:	80 93 95 12 	sts	0x1295, r24	; 0x801295 <MMU2::mmu2+0x3>
            rq = RequestMsg(RequestMsgCodes::unknown, 0); // clear the successfully finished request
   32cd6:	40 e0       	ldi	r20, 0x00	; 0
   32cd8:	60 e0       	ldi	r22, 0x00	; 0
   32cda:	ce 01       	movw	r24, r28
   32cdc:	01 96       	adiw	r24, 0x01	; 1
   32cde:	0f 94 c7 50 	call	0x2a18e	; 0x2a18e <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   32ce2:	85 e0       	ldi	r24, 0x05	; 5
   32ce4:	fe 01       	movw	r30, r28
   32ce6:	31 96       	adiw	r30, 0x01	; 1
   32ce8:	a7 e9       	ldi	r26, 0x97	; 151
   32cea:	b2 e1       	ldi	r27, 0x12	; 18
   32cec:	01 90       	ld	r0, Z+
   32cee:	0d 92       	st	X+, r0
   32cf0:	8a 95       	dec	r24
   32cf2:	e1 f7       	brne	.-8      	; 0x32cec <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.264]+0xc4>
   32cf4:	82 e0       	ldi	r24, 0x02	; 2
   32cf6:	b9 cf       	rjmp	.-142    	; 0x32c6a <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.264]+0x42>
            return Finished;
        } else {
            // got response to some other command - the originally issued command was interrupted!
            return Interrupted;
   32cf8:	83 e0       	ldi	r24, 0x03	; 3
   32cfa:	b7 cf       	rjmp	.-146    	; 0x32c6a <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.264]+0x42>

00032cfc <MMU2::MMU2::CheckUserInput() [clone .constprop.175]>:

        mmu_print_saved &= ~(SavedState::ParkExtruder);
    }
}

void MMU2::CheckUserInput() {
   32cfc:	1f 93       	push	r17
   32cfe:	cf 93       	push	r28
   32d00:	df 93       	push	r29
   32d02:	00 d0       	rcall	.+0      	; 0x32d04 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x8>
   32d04:	1f 92       	push	r1
   32d06:	1f 92       	push	r1
   32d08:	cd b7       	in	r28, 0x3d	; 61
   32d0a:	de b7       	in	r29, 0x3e	; 62
const char *PrusaErrorButtonMore() {
    return MSG_BTN_MORE;
}

Buttons ButtonPressed(ErrorCode ec) {
    if (buttonSelectedOperation == ButtonOperations::NoOperation) {
   32d0c:	80 91 44 0d 	lds	r24, 0x0D44	; 0x800d44 <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.450>
   32d10:	81 11       	cpse	r24, r1
   32d12:	2a c0       	rjmp	.+84     	; 0x32d68 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x6c>
    auto btn = ButtonPressed(lastErrorCode);

    // Was a button pressed on the MMU itself instead of the LCD?
    if (btn == Buttons::NoButton && lastButton != Buttons::NoButton) {
   32d14:	10 91 fc 12 	lds	r17, 0x12FC	; 0x8012fc <MMU2::mmu2+0x6a>
   32d18:	1f 3f       	cpi	r17, 0xFF	; 255
   32d1a:	91 f5       	brne	.+100    	; 0x32d80 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x84>
        btn = lastButton;
        lastButton = Buttons::NoButton; // Clear it.
    }

    if (mmu2.MMULastErrorSource() == ErrorSourcePrinter && btn != Buttons::NoButton) {
   32d1c:	80 91 fb 12 	lds	r24, 0x12FB	; 0x8012fb <MMU2::mmu2+0x69>
   32d20:	81 11       	cpse	r24, r1
   32d22:	60 c0       	rjmp	.+192    	; 0x32de4 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0xe8>
   32d24:	1f 3f       	cpi	r17, 0xFF	; 255
   32d26:	b9 f0       	breq	.+46     	; 0x32d56 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x5a>

    inline void SetPrinterError(ErrorCode ec) {
        explicitPrinterError = ec;
    }
    inline void ClearPrinterError() {
        explicitPrinterError = ErrorCode::OK;
   32d28:	81 e0       	ldi	r24, 0x01	; 1
   32d2a:	90 e0       	ldi	r25, 0x00	; 0
   32d2c:	90 93 93 12 	sts	0x1293, r25	; 0x801293 <MMU2::mmu2+0x1>
   32d30:	80 93 92 12 	sts	0x1292, r24	; 0x801292 <MMU2::mmu2>
        }
    }

    void ClearPrinterError() {
        logic.ClearPrinterError();
        lastErrorCode = ErrorCode::OK;
   32d34:	90 93 fa 12 	sts	0x12FA, r25	; 0x8012fa <MMU2::mmu2+0x68>
   32d38:	80 93 f9 12 	sts	0x12F9, r24	; 0x8012f9 <MMU2::mmu2+0x67>
        lastErrorSource = ErrorSource::ErrorSourceNone;
   32d3c:	8f ef       	ldi	r24, 0xFF	; 255
   32d3e:	80 93 fb 12 	sts	0x12FB, r24	; 0x8012fb <MMU2::mmu2+0x69>
        // Moreover - if the MMU is currently doing something (like the LoadFilament - see comment above)
        // we'll actually wait for it automagically in manage_response and after it finishes correctly,
        // we'll issue another command (like toolchange)
    }

    switch (btn) {
   32d42:	13 30       	cpi	r17, 0x03	; 3
   32d44:	09 f4       	brne	.+2      	; 0x32d48 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x4c>
   32d46:	82 c0       	rjmp	.+260    	; 0x32e4c <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x150>
   32d48:	f8 f0       	brcs	.+62     	; 0x32d88 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x8c>
   32d4a:	16 30       	cpi	r17, 0x06	; 6
   32d4c:	08 f4       	brcc	.+2      	; 0x32d50 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x54>
   32d4e:	7b c0       	rjmp	.+246    	; 0x32e46 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x14a>
   32d50:	17 30       	cpi	r17, 0x07	; 7
   32d52:	09 f4       	brne	.+2      	; 0x32d56 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x5a>
   32d54:	7f c0       	rjmp	.+254    	; 0x32e54 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x158>
        // @@TODO not sure if we shall handle this high level operation at this spot
        break;
    default:
        break;
    }
}
   32d56:	0f 90       	pop	r0
   32d58:	0f 90       	pop	r0
   32d5a:	0f 90       	pop	r0
   32d5c:	0f 90       	pop	r0
   32d5e:	0f 90       	pop	r0
   32d60:	df 91       	pop	r29
   32d62:	cf 91       	pop	r28
   32d64:	1f 91       	pop	r17
   32d66:	08 95       	ret
        return Buttons::NoButton; // no button
    }

    const auto result = ButtonAvailable(ec);
   32d68:	80 91 f9 12 	lds	r24, 0x12F9	; 0x8012f9 <MMU2::mmu2+0x67>
   32d6c:	90 91 fa 12 	lds	r25, 0x12FA	; 0x8012fa <MMU2::mmu2+0x68>
   32d70:	0f 94 9c 53 	call	0x2a738	; 0x2a738 <MMU2::ButtonAvailable(ErrorCode)>
   32d74:	18 2f       	mov	r17, r24
    buttonSelectedOperation = ButtonOperations::NoOperation; // Reset operation
   32d76:	10 92 44 0d 	sts	0x0D44, r1	; 0x800d44 <_ZN4MMU2L23buttonSelectedOperationE.lto_priv.450>

void MMU2::CheckUserInput() {
    auto btn = ButtonPressed(lastErrorCode);

    // Was a button pressed on the MMU itself instead of the LCD?
    if (btn == Buttons::NoButton && lastButton != Buttons::NoButton) {
   32d7a:	8f 3f       	cpi	r24, 0xFF	; 255
   32d7c:	79 f6       	brne	.-98     	; 0x32d1c <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x20>
   32d7e:	ca cf       	rjmp	.-108    	; 0x32d14 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x18>
        btn = lastButton;
        lastButton = Buttons::NoButton; // Clear it.
   32d80:	8f ef       	ldi	r24, 0xFF	; 255
   32d82:	80 93 fc 12 	sts	0x12FC, r24	; 0x8012fc <MMU2::mmu2+0x6a>
   32d86:	ca cf       	rjmp	.-108    	; 0x32d1c <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x20>

    switch (btn) {
    case Buttons::Left:
    case Buttons::Middle:
    case Buttons::Right:
        SERIAL_ECHOPGM("CheckUserInput-btnLMR ");
   32d88:	81 e8       	ldi	r24, 0x81	; 129
   32d8a:	9f e9       	ldi	r25, 0x9F	; 159
   32d8c:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
        SERIAL_ECHOLN((int)buttons_to_uint8t(btn));
   32d90:	81 2f       	mov	r24, r17
   32d92:	90 e0       	ldi	r25, 0x00	; 0
   32d94:	0f 94 bf 65 	call	0x2cb7e	; 0x2cb7e <MarlinSerial::println(int, int) [clone .constprop.319]>
        ResumeHotendTemp(); // Recover the hotend temp before we attempt to do anything else...
   32d98:	0f 94 48 9c 	call	0x33890	; 0x33890 <MMU2::MMU2::ResumeHotendTemp() [clone .constprop.180]>

        if (mmu2.MMULastErrorSource() == ErrorSourceMMU) {
   32d9c:	80 91 fb 12 	lds	r24, 0x12FB	; 0x8012fb <MMU2::mmu2+0x69>
   32da0:	81 30       	cpi	r24, 0x01	; 1
   32da2:	89 f4       	brne	.+34     	; 0x32dc6 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0xca>
    ScreenUpdateEnable();
    return true;
}

void MMU2::Button(uint8_t index) {
    LogEchoEvent_P(PSTR("Button"));
   32da4:	8a e7       	ldi	r24, 0x7A	; 122
   32da6:	9f e9       	ldi	r25, 0x9F	; 159
   32da8:	0f 94 fa 50 	call	0x2a1f4	; 0x2a1f4 <MMU2::LogEchoEvent_P(char const*)>
void ProtocolLogic::ResetMMU(uint8_t mode /* = 0 */) {
    PlanGenericRequest(RequestMsg(RequestMsgCodes::Reset, mode));
}

void ProtocolLogic::Button(uint8_t index) {
    PlanGenericRequest(RequestMsg(RequestMsgCodes::Button, index));
   32dac:	41 2f       	mov	r20, r17
   32dae:	62 e4       	ldi	r22, 0x42	; 66
   32db0:	ce 01       	movw	r24, r28
   32db2:	01 96       	adiw	r24, 0x01	; 1
   32db4:	0f 94 c7 50 	call	0x2a18e	; 0x2a18e <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   32db8:	49 81       	ldd	r20, Y+1	; 0x01
   32dba:	5a 81       	ldd	r21, Y+2	; 0x02
   32dbc:	6b 81       	ldd	r22, Y+3	; 0x03
   32dbe:	7c 81       	ldd	r23, Y+4	; 0x04
   32dc0:	8d 81       	ldd	r24, Y+5	; 0x05
   32dc2:	0f 94 19 95 	call	0x32a32	; 0x32a32 <MMU2::ProtocolLogic::PlanGenericRequest(modules::protocol::RequestMsg) [clone .constprop.327]>
        }

        // A quick hack: for specific error codes move the E-motor every time.
        // Not sure if we can rely on the fsensor.
        // Just plan the move, let the MMU take over when it is ready
        switch (lastErrorCode) {
   32dc6:	80 91 f9 12 	lds	r24, 0x12F9	; 0x8012f9 <MMU2::mmu2+0x67>
   32dca:	90 91 fa 12 	lds	r25, 0x12FA	; 0x8012fa <MMU2::mmu2+0x68>
   32dce:	84 30       	cpi	r24, 0x04	; 4
   32dd0:	20 e8       	ldi	r18, 0x80	; 128
   32dd2:	92 07       	cpc	r25, r18
   32dd4:	21 f0       	breq	.+8      	; 0x32dde <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0xe2>
   32dd6:	89 30       	cpi	r24, 0x09	; 9
   32dd8:	90 48       	sbci	r25, 0x80	; 128
   32dda:	09 f0       	breq	.+2      	; 0x32dde <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0xe2>
   32ddc:	bc cf       	rjmp	.-136    	; 0x32d56 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x5a>
        case ErrorCode::FSENSOR_DIDNT_SWITCH_OFF:
        case ErrorCode::FSENSOR_TOO_EARLY:
            HelpUnloadToFinda();
   32dde:	0f 94 08 5b 	call	0x2b610	; 0x2b610 <MMU2::MMU2::HelpUnloadToFinda() [clone .constprop.179]>
   32de2:	b9 cf       	rjmp	.-142    	; 0x32d56 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x5a>
        // Moreover - if the MMU is currently doing something (like the LoadFilament - see comment above)
        // we'll actually wait for it automagically in manage_response and after it finishes correctly,
        // we'll issue another command (like toolchange)
    }

    switch (btn) {
   32de4:	19 30       	cpi	r17, 0x09	; 9
   32de6:	08 f0       	brcs	.+2      	; 0x32dea <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0xee>
   32de8:	b6 cf       	rjmp	.-148    	; 0x32d56 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x5a>
   32dea:	e1 2f       	mov	r30, r17
   32dec:	f0 e0       	ldi	r31, 0x00	; 0
   32dee:	88 27       	eor	r24, r24
   32df0:	e3 50       	subi	r30, 0x03	; 3
   32df2:	f9 46       	sbci	r31, 0x69	; 105
   32df4:	8e 4f       	sbci	r24, 0xFE	; 254
   32df6:	0d 94 f0 a4 	jmp	0x349e0	; 0x349e0 <__tablejump2__>
   32dfa:	fc 37       	cpi	r31, 0x7C	; 124
   32dfc:	fc 37       	cpi	r31, 0x7C	; 124
   32dfe:	fc 37       	cpi	r31, 0x7C	; 124
   32e00:	86 37       	cpi	r24, 0x76	; 118
   32e02:	b6 37       	cpi	r27, 0x76	; 118
   32e04:	b6 37       	cpi	r27, 0x76	; 118
   32e06:	06 37       	cpi	r16, 0x76	; 118
   32e08:	92 37       	cpi	r25, 0x72	; 114
   32e0a:	20 38       	cpi	r18, 0x80	; 128
    logic.Stop();
    mmu2Serial.close();
}

void MMU2::Tune() {
    switch (lastErrorCode) {
   32e0c:	80 91 f9 12 	lds	r24, 0x12F9	; 0x8012f9 <MMU2::mmu2+0x67>
   32e10:	90 91 fa 12 	lds	r25, 0x12FA	; 0x8012fa <MMU2::mmu2+0x68>
   32e14:	87 38       	cpi	r24, 0x87	; 135
   32e16:	20 e8       	ldi	r18, 0x80	; 128
   32e18:	92 07       	cpc	r25, r18
   32e1a:	21 f0       	breq	.+8      	; 0x32e24 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x128>
   32e1c:	87 30       	cpi	r24, 0x07	; 7
   32e1e:	91 48       	sbci	r25, 0x81	; 129
   32e20:	09 f0       	breq	.+2      	; 0x32e24 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x128>
   32e22:	99 cf       	rjmp	.-206    	; 0x32d56 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x5a>
    // special handling of explicit printer errors
    return IsPrinterError() ? StepStatus::PrinterError : currentStatus;
}

uint8_t ProtocolLogic::CommandInProgress() const {
    if (currentScope != Scope::Command) {
   32e24:	80 91 94 12 	lds	r24, 0x1294	; 0x801294 <MMU2::mmu2+0x2>
   32e28:	84 30       	cpi	r24, 0x04	; 4
   32e2a:	21 f4       	brne	.+8      	; 0x32e34 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x138>
    );
    MENU_END();
}

void tuneIdlerStallguardThreshold() {
    if ((CommandInProgress)mmu2.GetCommandInProgress() != NoCommand)
   32e2c:	80 91 97 12 	lds	r24, 0x1297	; 0x801297 <MMU2::mmu2+0x5>
   32e30:	81 11       	cpse	r24, r1
   32e32:	91 cf       	rjmp	.-222    	; 0x32d56 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x5a>
        // homing fails during toolchange.
        // To save the print, make the Tune button unresponsive for now.
        return;
    }

    putErrorScreenToSleep = true;
   32e34:	81 e0       	ldi	r24, 0x01	; 1
   32e36:	80 93 43 0d 	sts	0x0D43, r24	; 0x800d43 <_ZN4MMU2L21putErrorScreenToSleepE.lto_priv.451>
    menu_submenu(tuneIdlerStallguardThresholdMenu);
   32e3a:	60 e0       	ldi	r22, 0x00	; 0
   32e3c:	8c e2       	ldi	r24, 0x2C	; 44
   32e3e:	98 e3       	ldi	r25, 0x38	; 56
   32e40:	0e 94 dd 62 	call	0xc5ba	; 0xc5ba <menu_submenu(void (*)(), bool)>
   32e44:	88 cf       	rjmp	.-240    	; 0x32d56 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x5a>
    }

    /// @brief Queue a button operation which the printer can act upon
    /// @param btn Button operation
    inline void SetPrinterButtonOperation(Buttons btn) {
        printerButtonOperation = btn;
   32e46:	10 93 ff 12 	sts	0x12FF, r17	; 0x8012ff <MMU2::mmu2+0x6d>
   32e4a:	85 cf       	rjmp	.-246    	; 0x32d56 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x5a>
        break;
    }
}

void MMU2::ResetX0() {
    logic.ResetMMU(); // Send soft reset
   32e4c:	80 e0       	ldi	r24, 0x00	; 0
   32e4e:	0f 94 43 95 	call	0x32a86	; 0x32a86 <MMU2::ProtocolLogic::ResetMMU(unsigned char) [clone .constprop.326]>
   32e52:	81 cf       	rjmp	.-254    	; 0x32d56 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x5a>
    StopKeepPowered();
    PowerOff();
}

void MMU2::StopKeepPowered() {
    state = xState::Stopped;
   32e54:	10 92 01 13 	sts	0x1301, r1	; 0x801301 <MMU2::mmu2+0x6f>
    protocol.ResetResponseDecoder(); // important - finished delayed restart relies on this
    StartSeqRestart();
}

void ProtocolLogic::Stop() {
    state = State::Stopped;
   32e58:	10 92 af 12 	sts	0x12AF, r1	; 0x8012af <MMU2::mmu2+0x1d>
    currentScope = Scope::Stopped;
   32e5c:	10 92 94 12 	sts	0x1294, r1	; 0x801294 <MMU2::mmu2+0x2>
        if (previous_value != value) {
            eeprom_byte_notify(dst, previous_value, value, false);
        }
    }
#endif //DEBUG_EEPROM_CHANGES
    eeprom_update_byte(dst, value);
   32e60:	60 e0       	ldi	r22, 0x00	; 0
   32e62:	8c ea       	ldi	r24, 0xAC	; 172
   32e64:	9c e0       	ldi	r25, 0x0C	; 12
   32e66:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
}

/// Disables MMU in EEPROM
void DisableMMUInSettings() {
    eeprom_update_byte_notify((uint8_t *)EEPROM_MMU_ENABLED, false);
    mmu2.Status();
   32e6a:	0f 94 ad 65 	call	0x2cb5a	; 0x2cb5a <MMU2::MMU2::Status() [clone .constprop.340]>
   32e6e:	73 cf       	rjmp	.-282    	; 0x32d56 <MMU2::MMU2::CheckUserInput() [clone .constprop.175]+0x5a>

00032e70 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]>:
    avoidRecursion = true;
    mmu_loop_inner(true);
    avoidRecursion = false;
}

void __attribute__((noinline)) MMU2::mmu_loop_inner(bool reportErrors) {
   32e70:	4f 92       	push	r4
   32e72:	5f 92       	push	r5
   32e74:	6f 92       	push	r6
   32e76:	7f 92       	push	r7
   32e78:	8f 92       	push	r8
   32e7a:	9f 92       	push	r9
   32e7c:	af 92       	push	r10
   32e7e:	bf 92       	push	r11
   32e80:	cf 92       	push	r12
   32e82:	df 92       	push	r13
   32e84:	ef 92       	push	r14
   32e86:	ff 92       	push	r15
   32e88:	0f 93       	push	r16
   32e8a:	1f 93       	push	r17
   32e8c:	cf 93       	push	r28
   32e8e:	df 93       	push	r29
   32e90:	cd b7       	in	r28, 0x3d	; 61
   32e92:	de b7       	in	r29, 0x3e	; 62
   32e94:	a0 97       	sbiw	r28, 0x20	; 32
   32e96:	0f b6       	in	r0, 0x3f	; 63
   32e98:	f8 94       	cli
   32e9a:	de bf       	out	0x3e, r29	; 62
   32e9c:	0f be       	out	0x3f, r0	; 63
   32e9e:	cd bf       	out	0x3d, r28	; 61
   32ea0:	08 2f       	mov	r16, r24
    }
}

StepStatus MMU2::LogicStep(bool reportErrors) {
    // Process any buttons before proceeding with another MMU Query
    CheckUserInput();
   32ea2:	0f 94 7e 96 	call	0x32cfc	; 0x32cfc <MMU2::MMU2::CheckUserInput() [clone .constprop.175]>
    DelayedRestartRestart();
    return SuppressShortDropOuts(PSTR("Protocol Error"), ProtocolError);
}

StepStatus ProtocolLogic::Step() {
    if (!ExpectsResponse()) { // if not waiting for a response, activate a planned request immediately
   32ea6:	80 91 95 12 	lds	r24, 0x1295	; 0x801295 <MMU2::mmu2+0x3>
   32eaa:	87 fd       	sbrc	r24, 7
        ActivatePlannedRequest();
   32eac:	0f 94 94 94 	call	0x32928	; 0x32928 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.328]>
   32eb0:	90 91 95 12 	lds	r25, 0x1295	; 0x801295 <MMU2::mmu2+0x3>
    }
    return Processing;
}

StepStatus ProtocolLogic::ScopeStep() {
    if (!ExpectsResponse()) {
   32eb4:	97 ff       	sbrs	r25, 7
   32eb6:	7d c0       	rjmp	.+250    	; 0x32fb2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x142>
        // we are waiting for something
        switch (currentScope) {
   32eb8:	80 91 94 12 	lds	r24, 0x1294	; 0x801294 <MMU2::mmu2+0x2>
   32ebc:	82 30       	cpi	r24, 0x02	; 2
   32ebe:	b1 f0       	breq	.+44     	; 0x32eec <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x7c>
   32ec0:	08 f4       	brcc	.+2      	; 0x32ec4 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x54>
   32ec2:	75 c0       	rjmp	.+234    	; 0x32fae <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x13e>
   32ec4:	83 30       	cpi	r24, 0x03	; 3
   32ec6:	e1 f1       	breq	.+120    	; 0x32f40 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0xd0>
   32ec8:	84 30       	cpi	r24, 0x04	; 4
   32eca:	09 f4       	brne	.+2      	; 0x32ece <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x5e>
   32ecc:	54 c0       	rjmp	.+168    	; 0x32f76 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x106>
        break;
    case Finished: {
        // We are ok, switching to Idle if there is no potential next request planned.
        // But the trouble is we must report a finished command if the previous command has just been finished
        // i.e. only try to find some planned command if we just finished the Idle cycle
        if (!ActivatePlannedRequest()) { // if nothing is planned, switch to Idle
   32ece:	0f 94 94 94 	call	0x32928	; 0x32928 <MMU2::ProtocolLogic::ActivatePlannedRequest() [clone .constprop.328]>
   32ed2:	81 11       	cpse	r24, r1
   32ed4:	6b c3       	rjmp	.+1750   	; 0x335ac <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x73c>
    // and we have just received a response to a Q0 message about a command progress
    return ProcessCommandQueryResponse();
}

void ProtocolLogic::SwitchToIdle() {
    state = State::Running;
   32ed6:	82 e0       	ldi	r24, 0x02	; 2
   32ed8:	80 93 af 12 	sts	0x12AF, r24	; 0x8012af <MMU2::mmu2+0x1d>
    currentScope = Scope::Idle;
   32edc:	83 e0       	ldi	r24, 0x03	; 3
   32ede:	80 93 94 12 	sts	0x1294, r24	; 0x801294 <MMU2::mmu2+0x2>
    scopeState = ScopeState::CommandSent;
    SendMsg(rq);
}

void ProtocolLogic::IdleRestart() {
    scopeState = ScopeState::Ready;
   32ee2:	82 e8       	ldi	r24, 0x82	; 130
   32ee4:	80 93 95 12 	sts	0x1295, r24	; 0x801295 <MMU2::mmu2+0x3>
        // We are ok, switching to Idle if there is no potential next request planned.
        // But the trouble is we must report a finished command if the previous command has just been finished
        // i.e. only try to find some planned command if we just finished the Idle cycle
        if (!ActivatePlannedRequest()) { // if nothing is planned, switch to Idle
            SwitchToIdle();
        } else if (ExpectsResponse()) {
   32ee8:	12 e0       	ldi	r17, 0x02	; 2
   32eea:	db c2       	rjmp	.+1462   	; 0x334a2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x632>
    IdleRestart();
    SendQuery(); // force sending Q0 immediately
}

bool ProtocolLogic::Elapsed(uint32_t timeout) const {
    return _millis() >= (lastUARTActivityMs + timeout);
   32eec:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   32ef0:	ab 01       	movw	r20, r22
   32ef2:	bc 01       	movw	r22, r24
   32ef4:	80 91 a1 12 	lds	r24, 0x12A1	; 0x8012a1 <MMU2::mmu2+0xf>
   32ef8:	90 91 a2 12 	lds	r25, 0x12A2	; 0x8012a2 <MMU2::mmu2+0x10>
   32efc:	a0 91 a3 12 	lds	r26, 0x12A3	; 0x8012a3 <MMU2::mmu2+0x11>
   32f00:	b0 91 a4 12 	lds	r27, 0x12A4	; 0x8012a4 <MMU2::mmu2+0x12>
   32f04:	88 51       	subi	r24, 0x18	; 24
   32f06:	9c 4f       	sbci	r25, 0xFC	; 252
   32f08:	af 4f       	sbci	r26, 0xFF	; 255
   32f0a:	bf 4f       	sbci	r27, 0xFF	; 255
        return VersionMismatch;
    }
}

StepStatus ProtocolLogic::DelayedRestartWait() {
    if (Elapsed(heartBeatPeriod)) { // this basically means, that we are waiting until there is some traffic on
   32f0c:	48 17       	cp	r20, r24
   32f0e:	59 07       	cpc	r21, r25
   32f10:	6a 07       	cpc	r22, r26
   32f12:	7b 07       	cpc	r23, r27
   32f14:	08 f4       	brcc	.+2      	; 0x32f18 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0xa8>
   32f16:	4b c0       	rjmp	.+150    	; 0x32fae <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x13e>
void MMU2Serial::close() {
    // @@TODO - probably turn off the UART
}

int MMU2Serial::read() {
    return fgetc(uart2io);
   32f18:	84 e7       	ldi	r24, 0x74	; 116
   32f1a:	92 e1       	ldi	r25, 0x12	; 18
   32f1c:	0f 94 0c a2 	call	0x34418	; 0x34418 <fgetc>
        while (uart->read() != -1)
   32f20:	01 96       	adiw	r24, 0x01	; 1
   32f22:	d1 f7       	brne	.-12     	; 0x32f18 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0xa8>
    initRegs8[0] = extraLoadDistance;
    initRegs8[1] = pulleySlowFeedrate;
}

void ProtocolLogic::Start() {
    state = State::InitSequence;
   32f24:	81 e0       	ldi	r24, 0x01	; 1
   32f26:	80 93 af 12 	sts	0x12AF, r24	; 0x8012af <MMU2::mmu2+0x1d>
    currentScope = Scope::StartSeq;
   32f2a:	80 93 94 12 	sts	0x1294, r24	; 0x801294 <MMU2::mmu2+0x2>
   32f2e:	10 92 b6 12 	sts	0x12B6, r1	; 0x8012b6 <MMU2::mmu2+0x24>
    LogRequestMsg(txbuff, len);
    RecordUARTActivity();
}

void ProtocolLogic::StartSeqRestart() {
    retries = maxRetries;
   32f32:	86 e0       	ldi	r24, 0x06	; 6
   32f34:	80 93 96 12 	sts	0x1296, r24	; 0x801296 <MMU2::mmu2+0x4>
    SendVersion(0);
   32f38:	80 e0       	ldi	r24, 0x00	; 0
    case ScopeState::S2Sent: // received response to S2 - minor
        return ProcessVersionResponse((uint8_t)scopeState - (uint8_t)ScopeState::S0Sent);
    case ScopeState::S3Sent: // received response to S3 - revision
        if (rsp.request.code != RequestMsgCodes::Version || rsp.request.value != 3) {
            // got a response to something else - protocol corruption probably, repeat the query OR restart the comm by issuing S0?
            SendVersion(3);
   32f3a:	0f 94 5f 95 	call	0x32abe	; 0x32abe <MMU2::ProtocolLogic::SendVersion(unsigned char) [clone .constprop.324]>
   32f3e:	37 c0       	rjmp	.+110    	; 0x32fae <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x13e>
    }
    return Processing;
}

StepStatus ProtocolLogic::IdleWait() {
    if (scopeState == ScopeState::Ready) { // check timeout
   32f40:	92 38       	cpi	r25, 0x82	; 130
   32f42:	29 f6       	brne	.-118    	; 0x32ece <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x5e>
    IdleRestart();
    SendQuery(); // force sending Q0 immediately
}

bool ProtocolLogic::Elapsed(uint32_t timeout) const {
    return _millis() >= (lastUARTActivityMs + timeout);
   32f44:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   32f48:	ab 01       	movw	r20, r22
   32f4a:	bc 01       	movw	r22, r24
   32f4c:	80 91 a1 12 	lds	r24, 0x12A1	; 0x8012a1 <MMU2::mmu2+0xf>
   32f50:	90 91 a2 12 	lds	r25, 0x12A2	; 0x8012a2 <MMU2::mmu2+0x10>
   32f54:	a0 91 a3 12 	lds	r26, 0x12A3	; 0x8012a3 <MMU2::mmu2+0x11>
   32f58:	b0 91 a4 12 	lds	r27, 0x12A4	; 0x8012a4 <MMU2::mmu2+0x12>
   32f5c:	88 51       	subi	r24, 0x18	; 24
   32f5e:	9c 4f       	sbci	r25, 0xFC	; 252
   32f60:	af 4f       	sbci	r26, 0xFF	; 255
   32f62:	bf 4f       	sbci	r27, 0xFF	; 255
    return Processing;
}

StepStatus ProtocolLogic::IdleWait() {
    if (scopeState == ScopeState::Ready) { // check timeout
        if (Elapsed(heartBeatPeriod)) {
   32f64:	48 17       	cp	r20, r24
   32f66:	59 07       	cpc	r21, r25
   32f68:	6a 07       	cpc	r22, r26
   32f6a:	7b 07       	cpc	r23, r27
   32f6c:	08 f4       	brcc	.+2      	; 0x32f70 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x100>
   32f6e:	af cf       	rjmp	.-162    	; 0x32ece <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x5e>

void ProtocolLogic::SwitchFromStartToIdle() {
    state = State::Running;
    currentScope = Scope::Idle;
    IdleRestart();
    SendQuery(); // force sending Q0 immediately
   32f70:	0f 94 d2 95 	call	0x32ba4	; 0x32ba4 <MMU2::ProtocolLogic::SendQuery() [clone .constprop.280]>
   32f74:	1c c0       	rjmp	.+56     	; 0x32fae <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x13e>
}

bool ProtocolLogic::Elapsed(uint32_t timeout) const {
    return _millis() >= (lastUARTActivityMs + timeout);
   32f76:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   32f7a:	ab 01       	movw	r20, r22
   32f7c:	bc 01       	movw	r22, r24
   32f7e:	80 91 a1 12 	lds	r24, 0x12A1	; 0x8012a1 <MMU2::mmu2+0xf>
   32f82:	90 91 a2 12 	lds	r25, 0x12A2	; 0x8012a2 <MMU2::mmu2+0x10>
   32f86:	a0 91 a3 12 	lds	r26, 0x12A3	; 0x8012a3 <MMU2::mmu2+0x11>
   32f8a:	b0 91 a4 12 	lds	r27, 0x12A4	; 0x8012a4 <MMU2::mmu2+0x12>
   32f8e:	88 51       	subi	r24, 0x18	; 24
   32f90:	9c 4f       	sbci	r25, 0xFC	; 252
   32f92:	af 4f       	sbci	r26, 0xFF	; 255
   32f94:	bf 4f       	sbci	r27, 0xFF	; 255
    }
    return Processing;
}

StepStatus ProtocolLogic::CommandWait() {
    if (Elapsed(heartBeatPeriod)) {
   32f96:	48 17       	cp	r20, r24
   32f98:	59 07       	cpc	r21, r25
   32f9a:	6a 07       	cpc	r22, r26
   32f9c:	7b 07       	cpc	r23, r27
   32f9e:	40 f7       	brcc	.-48     	; 0x32f70 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x100>
};

void ProtocolLogic::CheckAndReportAsyncEvents() {
    // even when waiting for a query period, we need to report a change in filament sensor's state
    // - it is vital for a precise synchronization of moves of the printer and the MMU
    uint8_t fs = (uint8_t)WhereIsFilament();
   32fa0:	0f 94 0a 51 	call	0x2a214	; 0x2a214 <MMU2::WhereIsFilament()>
    if (fs != lastFSensor) {
   32fa4:	90 91 d6 12 	lds	r25, 0x12D6	; 0x8012d6 <MMU2::mmu2+0x44>
   32fa8:	89 13       	cpse	r24, r25
        SendAndUpdateFilamentSensor();
   32faa:	0f 94 f1 95 	call	0x32be2	; 0x32be2 <MMU2::ProtocolLogic::SendAndUpdateFilamentSensor() [clone .constprop.278]>
        // i.e. only try to find some planned command if we just finished the Idle cycle
        if (!ActivatePlannedRequest()) { // if nothing is planned, switch to Idle
            SwitchToIdle();
        } else if (ExpectsResponse()) {
            // if the previous cycle was Idle and now we have planned a new command -> avoid returning Finished
            currentStatus = Processing;
   32fae:	10 e0       	ldi	r17, 0x00	; 0
   32fb0:	78 c2       	rjmp	.+1264   	; 0x334a2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x632>

StepStatus ProtocolLogic::ExpectingMessage() {
    int bytesConsumed = 0;
    int c = -1;

    OldMMUFWDetector oldMMUh4x0r; // old MMU FW hacker ;)
   32fb2:	a1 2c       	mov	r10, r1
        return State::SomethingElse;
    }
};

StepStatus ProtocolLogic::ExpectingMessage() {
    int bytesConsumed = 0;
   32fb4:	d1 2c       	mov	r13, r1
   32fb6:	c1 2c       	mov	r12, r1

    /// @returns true when "ok\n" gets detected
    State Detect(uint8_t c) {
        // consume old MMU FW's data if any -> avoid confusion of protocol decoder
        if (ok == 0 && c == 'o') {
            ++ok;
   32fb8:	99 24       	eor	r9, r9
   32fba:	93 94       	inc	r9
            responseMsg.paramCode = (ResponseMsgParamCodes)c;
            responseMsg.paramValue = 0;
            return DecodeStatus::NeedMoreData;
        default:
            responseMsg.paramCode = ResponseMsgParamCodes::unknown;
            rspState = ResponseStates::Error;
   32fbc:	55 e0       	ldi	r21, 0x05	; 5
   32fbe:	b5 2e       	mov	r11, r21
        case 'E':
        case 'F':
        case 'A':
        case 'R':
        case 'B':
            rspState = ResponseStates::ParamValue;
   32fc0:	63 e0       	ldi	r22, 0x03	; 3
   32fc2:	86 2e       	mov	r8, r22
        if (IsHexDigit(c)) {
            responseMsg.paramValue <<= 4U;
            responseMsg.paramValue += Char2Nibble(c);
            return DecodeStatus::NeedMoreData;
        } else if (IsCRCSeparator(c)) {
            rspState = ResponseStates::CRC;
   32fc4:	74 e0       	ldi	r23, 0x04	; 4
   32fc6:	77 2e       	mov	r7, r23
        if (IsHexDigit(c)) {
            responseMsg.request.value <<= 4U;
            responseMsg.request.value += Char2Nibble(c);
            return DecodeStatus::NeedMoreData;
        } else if (c == ' ') {
            rspState = ResponseStates::ParamCode;
   32fc8:	e2 e0       	ldi	r30, 0x02	; 2
   32fca:	6e 2e       	mov	r6, r30
   32fcc:	66 c0       	rjmp	.+204    	; 0x3309a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x22a>
    ++i;
    return i;
}

DecodeStatus Protocol::DecodeResponse(uint8_t c) {
    switch (rspState) {
   32fce:	23 30       	cpi	r18, 0x03	; 3
   32fd0:	09 f4       	brne	.+2      	; 0x32fd4 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x164>
   32fd2:	e0 c0       	rjmp	.+448    	; 0x33194 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x324>
   32fd4:	24 30       	cpi	r18, 0x04	; 4
   32fd6:	09 f0       	breq	.+2      	; 0x32fda <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x16a>
   32fd8:	83 c0       	rjmp	.+262    	; 0x330e0 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x270>
    }
    static constexpr bool IsCRCSeparator(uint8_t c) {
        return c == '*';
    }
    static constexpr bool IsHexDigit(uint8_t c) {
        return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f');
   32fda:	20 ed       	ldi	r18, 0xD0	; 208
   32fdc:	28 0f       	add	r18, r24
   32fde:	2a 30       	cpi	r18, 0x0A	; 10
   32fe0:	08 f4       	brcc	.+2      	; 0x32fe4 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x174>
   32fe2:	f8 c0       	rjmp	.+496    	; 0x331d4 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x364>
   32fe4:	2f e9       	ldi	r18, 0x9F	; 159
   32fe6:	28 0f       	add	r18, r24
   32fe8:	26 30       	cpi	r18, 0x06	; 6
   32fea:	08 f4       	brcc	.+2      	; 0x32fee <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x17e>
   32fec:	f3 c0       	rjmp	.+486    	; 0x331d4 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x364>

    ResponseStates rspState;
    ResponseMsg responseMsg;

    static constexpr bool IsNewLine(uint8_t c) {
        return c == '\n' || c == '\r';
   32fee:	8a 30       	cpi	r24, 0x0A	; 10
   32ff0:	09 f0       	breq	.+2      	; 0x32ff4 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x184>
   32ff2:	fa c0       	rjmp	.+500    	; 0x331e8 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x378>
            responseMsg.request.crc8 <<= 4U;
            responseMsg.request.crc8 += Char2Nibble(c);
            return DecodeStatus::NeedMoreData;
        } else if (IsNewLine(c)) {
            // check CRC at this spot
            if (responseMsg.request.crc8 != responseMsg.ComputeCRC8()) {
   32ff4:	40 90 bb 12 	lds	r4, 0x12BB	; 0x8012bb <MMU2::mmu2+0x29>
   32ff8:	87 eb       	ldi	r24, 0xB7	; 183
   32ffa:	92 e1       	ldi	r25, 0x12	; 18
   32ffc:	0f 94 b6 50 	call	0x2a16c	; 0x2a16c <modules::protocol::ResponseMsg::ComputeCRC8() const>
   33000:	48 12       	cpse	r4, r24
   33002:	b8 c0       	rjmp	.+368    	; 0x33174 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x304>
                // CRC mismatch
                responseMsg.paramCode = ResponseMsgParamCodes::unknown;
                rspState = ResponseStates::Error;
                return DecodeStatus::Error;
            } else {
                rspState = ResponseStates::RequestCode;
   33004:	10 92 b6 12 	sts	0x12B6, r1	; 0x8012b6 <MMU2::mmu2+0x24>

    /// @returns the most recently lexed request message
    inline const RequestMsg GetRequestMsg() const { return requestMsg; }

    /// @returns the most recently lexed response message
    inline const ResponseMsg GetResponseMsg() const { return responseMsg; }
   33008:	88 e0       	ldi	r24, 0x08	; 8
   3300a:	e7 eb       	ldi	r30, 0xB7	; 183
   3300c:	f2 e1       	ldi	r31, 0x12	; 18
   3300e:	de 01       	movw	r26, r28
   33010:	51 96       	adiw	r26, 0x11	; 17
   33012:	01 90       	ld	r0, Z+
   33014:	0d 92       	st	X+, r0
   33016:	8a 95       	dec	r24
   33018:	e1 f7       	brne	.-8      	; 0x33012 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x1a2>
   3301a:	88 e0       	ldi	r24, 0x08	; 8
   3301c:	fe 01       	movw	r30, r28
   3301e:	71 96       	adiw	r30, 0x11	; 17
   33020:	de 01       	movw	r26, r28
   33022:	59 96       	adiw	r26, 0x19	; 25
   33024:	01 90       	ld	r0, Z+
   33026:	0d 92       	st	X+, r0
   33028:	8a 95       	dec	r24
   3302a:	e1 f7       	brne	.-8      	; 0x33024 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x1b4>
    while ((c = uart->read()) >= 0) {
        ++bytesConsumed;
        RecordReceivedByte(c);
        switch (protocol.DecodeResponse(c)) {
        case DecodeStatus::MessageCompleted:
            rsp = protocol.GetResponseMsg();
   3302c:	88 e0       	ldi	r24, 0x08	; 8
   3302e:	fe 01       	movw	r30, r28
   33030:	79 96       	adiw	r30, 0x19	; 25
   33032:	a7 ea       	ldi	r26, 0xA7	; 167
   33034:	b2 e1       	ldi	r27, 0x12	; 18
   33036:	01 90       	ld	r0, Z+
   33038:	0d 92       	st	X+, r0
   3303a:	8a 95       	dec	r24
   3303c:	e1 f7       	brne	.-8      	; 0x33036 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x1c6>
    }
    dst[(lastReceivedBytes.size() - 1) * 3 + 2] = 0; // terminate properly
}

void ProtocolLogic::FormatLastResponseMsgAndClearLRB(char *dst) {
    *dst++ = '<';
   3303e:	8c e3       	ldi	r24, 0x3C	; 60
   33040:	89 83       	std	Y+1, r24	; 0x01
   33042:	fe 01       	movw	r30, r28
   33044:	32 96       	adiw	r30, 0x02	; 2
   33046:	af eb       	ldi	r26, 0xBF	; 191
   33048:	b2 e1       	ldi	r27, 0x12	; 18
    for (uint8_t i = 0; i < lrb; ++i) {
   3304a:	20 e0       	ldi	r18, 0x00	; 0
   3304c:	cf 01       	movw	r24, r30
   3304e:	52 16       	cp	r5, r18
   33050:	09 f4       	brne	.+2      	; 0x33054 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x1e4>
   33052:	cd c0       	rjmp	.+410    	; 0x331ee <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x37e>
        uint8_t b = lastReceivedBytes[i];
   33054:	3d 91       	ld	r19, X+
        // Check for printable character, including space
        if (b < 32 || b > 127) {
   33056:	40 ee       	ldi	r20, 0xE0	; 224
   33058:	43 0f       	add	r20, r19
   3305a:	40 36       	cpi	r20, 0x60	; 96
   3305c:	08 f0       	brcs	.+2      	; 0x33060 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x1f0>
            b = '.';
   3305e:	3e e2       	ldi	r19, 0x2E	; 46
        }
        *dst++ = b;
   33060:	31 93       	st	Z+, r19
    dst[(lastReceivedBytes.size() - 1) * 3 + 2] = 0; // terminate properly
}

void ProtocolLogic::FormatLastResponseMsgAndClearLRB(char *dst) {
    *dst++ = '<';
    for (uint8_t i = 0; i < lrb; ++i) {
   33062:	2f 5f       	subi	r18, 0xFF	; 255
   33064:	f4 cf       	rjmp	.-24     	; 0x3304e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x1de>
}

DecodeStatus Protocol::DecodeResponse(uint8_t c) {
    switch (rspState) {
    case ResponseStates::RequestCode:
        switch (c) {
   33066:	8e 34       	cpi	r24, 0x4E	; 78
   33068:	08 f0       	brcs	.+2      	; 0x3306c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x1fc>
   3306a:	56 c0       	rjmp	.+172    	; 0x33118 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x2a8>
   3306c:	8b 34       	cpi	r24, 0x4B	; 75
   3306e:	08 f0       	brcs	.+2      	; 0x33072 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x202>
   33070:	46 c0       	rjmp	.+140    	; 0x330fe <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x28e>
   33072:	82 34       	cpi	r24, 0x42	; 66
   33074:	09 f4       	brne	.+2      	; 0x33078 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x208>
   33076:	43 c0       	rjmp	.+134    	; 0x330fe <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x28e>
   33078:	e0 f5       	brcc	.+120    	; 0x330f2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x282>
   3307a:	8a 30       	cpi	r24, 0x0A	; 10
   3307c:	59 f0       	breq	.+22     	; 0x33094 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x224>
   3307e:	8d 30       	cpi	r24, 0x0D	; 13
   33080:	49 f0       	breq	.+18     	; 0x33094 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x224>
        } else if (IsCRCSeparator(c)) {
            rspState = ResponseStates::CRC;
            return DecodeStatus::NeedMoreData;
        } else {
            responseMsg.paramCode = ResponseMsgParamCodes::unknown;
            rspState = ResponseStates::Error;
   33082:	b0 92 b6 12 	sts	0x12B6, r11	; 0x8012b6 <MMU2::mmu2+0x24>
        Matched };

    /// @returns true when "ok\n" gets detected
    State Detect(uint8_t c) {
        // consume old MMU FW's data if any -> avoid confusion of protocol decoder
        if (ok == 0 && c == 'o') {
   33086:	a1 10       	cpse	r10, r1
   33088:	05 c1       	rjmp	.+522    	; 0x33294 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x424>
   3308a:	1f 36       	cpi	r17, 0x6F	; 111
   3308c:	09 f0       	breq	.+2      	; 0x33090 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x220>
   3308e:	fa c3       	rjmp	.+2036   	; 0x33884 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0xa14>
            ++ok;
   33090:	aa 24       	eor	r10, r10
   33092:	a3 94       	inc	r10

    OldMMUFWDetector oldMMUh4x0r; // old MMU FW hacker ;)

    // try to consume as many rx bytes as possible (until a message has been completed)
    while ((c = uart->read()) >= 0) {
        ++bytesConsumed;
   33094:	4f ef       	ldi	r20, 0xFF	; 255
   33096:	c4 1a       	sub	r12, r20
   33098:	d4 0a       	sbc	r13, r20
   3309a:	84 e7       	ldi	r24, 0x74	; 116
   3309c:	92 e1       	ldi	r25, 0x12	; 18
   3309e:	0f 94 0c a2 	call	0x34418	; 0x34418 <fgetc>
    int c = -1;

    OldMMUFWDetector oldMMUh4x0r; // old MMU FW hacker ;)

    // try to consume as many rx bytes as possible (until a message has been completed)
    while ((c = uart->read()) >= 0) {
   330a2:	97 fd       	sbrc	r25, 7
   330a4:	00 c1       	rjmp	.+512    	; 0x332a6 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x436>
        ++bytesConsumed;
        RecordReceivedByte(c);
   330a6:	18 2f       	mov	r17, r24
    array() = default;
    inline constexpr T *begin() const { return data; }
    inline constexpr T *end() const { return data + N; }
    static constexpr uint8_t size() { return N; }
    inline T &operator[](uint8_t i) {
        return data[i];
   330a8:	20 91 cf 12 	lds	r18, 0x12CF	; 0x8012cf <MMU2::mmu2+0x3d>
   330ac:	30 e0       	ldi	r19, 0x00	; 0
void ProtocolLogic::RecordUARTActivity() {
    lastUARTActivityMs = _millis();
}

void ProtocolLogic::RecordReceivedByte(uint8_t c) {
    lastReceivedBytes[lrb] = c;
   330ae:	f9 01       	movw	r30, r18
   330b0:	ee 56       	subi	r30, 0x6E	; 110
   330b2:	fd 4e       	sbci	r31, 0xED	; 237
   330b4:	85 a7       	std	Z+45, r24	; 0x2d
    lrb = (lrb + 1) % lastReceivedBytes.size();
   330b6:	79 01       	movw	r14, r18
   330b8:	ef ef       	ldi	r30, 0xFF	; 255
   330ba:	ee 1a       	sub	r14, r30
   330bc:	fe 0a       	sbc	r15, r30
   330be:	ff e0       	ldi	r31, 0x0F	; 15
   330c0:	ef 22       	and	r14, r31
   330c2:	ff 24       	eor	r15, r15
   330c4:	5e 2c       	mov	r5, r14
   330c6:	e0 92 cf 12 	sts	0x12CF, r14	; 0x8012cf <MMU2::mmu2+0x3d>
    ++i;
    return i;
}

DecodeStatus Protocol::DecodeResponse(uint8_t c) {
    switch (rspState) {
   330ca:	20 91 b6 12 	lds	r18, 0x12B6	; 0x8012b6 <MMU2::mmu2+0x24>
   330ce:	22 30       	cpi	r18, 0x02	; 2
   330d0:	09 f4       	brne	.+2      	; 0x330d4 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x264>
   330d2:	48 c0       	rjmp	.+144    	; 0x33164 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x2f4>
   330d4:	08 f0       	brcs	.+2      	; 0x330d8 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x268>
   330d6:	7b cf       	rjmp	.-266    	; 0x32fce <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x15e>
   330d8:	22 23       	and	r18, r18
   330da:	29 f2       	breq	.-118    	; 0x33066 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x1f6>
   330dc:	21 30       	cpi	r18, 0x01	; 1
   330de:	51 f1       	breq	.+84     	; 0x33134 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x2c4>

    ResponseStates rspState;
    ResponseMsg responseMsg;

    static constexpr bool IsNewLine(uint8_t c) {
        return c == '\n' || c == '\r';
   330e0:	1a 30       	cpi	r17, 0x0A	; 10
   330e2:	09 f4       	brne	.+2      	; 0x330e6 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x276>
   330e4:	8f cf       	rjmp	.-226    	; 0x33004 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x194>
   330e6:	1d 30       	cpi	r17, 0x0D	; 13
   330e8:	09 f4       	brne	.+2      	; 0x330ec <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x27c>
   330ea:	8c cf       	rjmp	.-232    	; 0x33004 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x194>
    default: //case error:
        if (IsNewLine(c)) {
            rspState = ResponseStates::RequestCode;
            return DecodeStatus::MessageCompleted;
        } else {
            responseMsg.paramCode = ResponseMsgParamCodes::unknown;
   330ec:	10 92 bc 12 	sts	0x12BC, r1	; 0x8012bc <MMU2::mmu2+0x2a>
   330f0:	ca cf       	rjmp	.-108    	; 0x33086 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x216>
}

DecodeStatus Protocol::DecodeResponse(uint8_t c) {
    switch (rspState) {
    case ResponseStates::RequestCode:
        switch (c) {
   330f2:	85 34       	cpi	r24, 0x45	; 69
   330f4:	30 f2       	brcs	.-116    	; 0x33082 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x212>
   330f6:	87 34       	cpi	r24, 0x47	; 71
   330f8:	10 f0       	brcs	.+4      	; 0x330fe <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x28e>
   330fa:	88 34       	cpi	r24, 0x48	; 72
   330fc:	11 f6       	brne	.-124    	; 0x33082 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x212>
        case 'K':
        case 'F':
        case 'f':
        case 'H':
        case 'R':
            responseMsg.request.code = (RequestMsgCodes)c;
   330fe:	80 93 b7 12 	sts	0x12B7, r24	; 0x8012b7 <MMU2::mmu2+0x25>
            responseMsg.request.value = 0;
   33102:	10 92 b8 12 	sts	0x12B8, r1	; 0x8012b8 <MMU2::mmu2+0x26>
            responseMsg.request.value2 = 0;
   33106:	10 92 ba 12 	sts	0x12BA, r1	; 0x8012ba <MMU2::mmu2+0x28>
   3310a:	10 92 b9 12 	sts	0x12B9, r1	; 0x8012b9 <MMU2::mmu2+0x27>
            responseMsg.request.crc8 = 0;
   3310e:	10 92 bb 12 	sts	0x12BB, r1	; 0x8012bb <MMU2::mmu2+0x29>
            rspState = ResponseStates::RequestValue;
   33112:	90 92 b6 12 	sts	0x12B6, r9	; 0x8012b6 <MMU2::mmu2+0x24>
   33116:	be cf       	rjmp	.-132    	; 0x33094 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x224>
}

DecodeStatus Protocol::DecodeResponse(uint8_t c) {
    switch (rspState) {
    case ResponseStates::RequestCode:
        switch (c) {
   33118:	89 35       	cpi	r24, 0x59	; 89
   3311a:	40 f4       	brcc	.+16     	; 0x3312c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x2bc>
   3311c:	87 35       	cpi	r24, 0x57	; 87
   3311e:	78 f7       	brcc	.-34     	; 0x330fe <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x28e>
   33120:	20 eb       	ldi	r18, 0xB0	; 176
   33122:	28 0f       	add	r18, r24
   33124:	26 30       	cpi	r18, 0x06	; 6
   33126:	08 f0       	brcs	.+2      	; 0x3312a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x2ba>
   33128:	ac cf       	rjmp	.-168    	; 0x33082 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x212>
   3312a:	e9 cf       	rjmp	.-46     	; 0x330fe <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x28e>
   3312c:	86 36       	cpi	r24, 0x66	; 102
   3312e:	09 f0       	breq	.+2      	; 0x33132 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x2c2>
   33130:	a8 cf       	rjmp	.-176    	; 0x33082 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x212>
   33132:	e5 cf       	rjmp	.-54     	; 0x330fe <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x28e>
    }
    static constexpr bool IsCRCSeparator(uint8_t c) {
        return c == '*';
    }
    static constexpr bool IsHexDigit(uint8_t c) {
        return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f');
   33134:	20 ed       	ldi	r18, 0xD0	; 208
   33136:	28 0f       	add	r18, r24
   33138:	2a 30       	cpi	r18, 0x0A	; 10
   3313a:	50 f0       	brcs	.+20     	; 0x33150 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x2e0>
   3313c:	2f e9       	ldi	r18, 0x9F	; 159
   3313e:	28 0f       	add	r18, r24
   33140:	26 30       	cpi	r18, 0x06	; 6
   33142:	30 f0       	brcs	.+12     	; 0x33150 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x2e0>
    case ResponseStates::RequestValue:
        if (IsHexDigit(c)) {
            responseMsg.request.value <<= 4U;
            responseMsg.request.value += Char2Nibble(c);
            return DecodeStatus::NeedMoreData;
        } else if (c == ' ') {
   33144:	80 32       	cpi	r24, 0x20	; 32
   33146:	09 f0       	breq	.+2      	; 0x3314a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x2da>
   33148:	9c cf       	rjmp	.-200    	; 0x33082 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x212>
            rspState = ResponseStates::ParamCode;
   3314a:	60 92 b6 12 	sts	0x12B6, r6	; 0x8012b6 <MMU2::mmu2+0x24>
   3314e:	a2 cf       	rjmp	.-188    	; 0x33094 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x224>
            return DecodeStatus::Error;
        }
    case ResponseStates::RequestValue:
        if (IsHexDigit(c)) {
            responseMsg.request.value <<= 4U;
            responseMsg.request.value += Char2Nibble(c);
   33150:	0f 94 95 50 	call	0x2a12a	; 0x2a12a <modules::protocol::Protocol::Char2Nibble(unsigned char)>
            rspState = ResponseStates::Error;
            return DecodeStatus::Error;
        }
    case ResponseStates::RequestValue:
        if (IsHexDigit(c)) {
            responseMsg.request.value <<= 4U;
   33154:	90 91 b8 12 	lds	r25, 0x12B8	; 0x8012b8 <MMU2::mmu2+0x26>
   33158:	92 95       	swap	r25
   3315a:	90 7f       	andi	r25, 0xF0	; 240
            responseMsg.request.value += Char2Nibble(c);
   3315c:	89 0f       	add	r24, r25
   3315e:	80 93 b8 12 	sts	0x12B8, r24	; 0x8012b8 <MMU2::mmu2+0x26>
   33162:	98 cf       	rjmp	.-208    	; 0x33094 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x224>
        } else {
            rspState = ResponseStates::Error;
            return DecodeStatus::Error;
        }
    case ResponseStates::ParamCode:
        switch (c) {
   33164:	87 34       	cpi	r24, 0x47	; 71
   33166:	48 f4       	brcc	.+18     	; 0x3317a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x30a>
   33168:	85 34       	cpi	r24, 0x45	; 69
   3316a:	58 f4       	brcc	.+22     	; 0x33182 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x312>
   3316c:	2f eb       	ldi	r18, 0xBF	; 191
   3316e:	28 0f       	add	r18, r24
   33170:	22 30       	cpi	r18, 0x02	; 2
   33172:	38 f0       	brcs	.+14     	; 0x33182 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x312>
            return DecodeStatus::NeedMoreData;
        } else if (IsCRCSeparator(c)) {
            rspState = ResponseStates::CRC;
            return DecodeStatus::NeedMoreData;
        } else {
            responseMsg.paramCode = ResponseMsgParamCodes::unknown;
   33174:	10 92 bc 12 	sts	0x12BC, r1	; 0x8012bc <MMU2::mmu2+0x2a>
   33178:	84 cf       	rjmp	.-248    	; 0x33082 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x212>
        } else {
            rspState = ResponseStates::Error;
            return DecodeStatus::Error;
        }
    case ResponseStates::ParamCode:
        switch (c) {
   3317a:	80 35       	cpi	r24, 0x50	; 80
   3317c:	11 f0       	breq	.+4      	; 0x33182 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x312>
   3317e:	82 35       	cpi	r24, 0x52	; 82
   33180:	c9 f7       	brne	.-14     	; 0x33174 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x304>
        case 'E':
        case 'F':
        case 'A':
        case 'R':
        case 'B':
            rspState = ResponseStates::ParamValue;
   33182:	80 92 b6 12 	sts	0x12B6, r8	; 0x8012b6 <MMU2::mmu2+0x24>
            responseMsg.paramCode = (ResponseMsgParamCodes)c;
   33186:	80 93 bc 12 	sts	0x12BC, r24	; 0x8012bc <MMU2::mmu2+0x2a>
            responseMsg.paramValue = 0;
   3318a:	10 92 be 12 	sts	0x12BE, r1	; 0x8012be <MMU2::mmu2+0x2c>
   3318e:	10 92 bd 12 	sts	0x12BD, r1	; 0x8012bd <MMU2::mmu2+0x2b>
   33192:	80 cf       	rjmp	.-256    	; 0x33094 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x224>
   33194:	20 ed       	ldi	r18, 0xD0	; 208
   33196:	28 0f       	add	r18, r24
   33198:	2a 30       	cpi	r18, 0x0A	; 10
   3319a:	48 f0       	brcs	.+18     	; 0x331ae <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x33e>
   3319c:	2f e9       	ldi	r18, 0x9F	; 159
   3319e:	28 0f       	add	r18, r24
   331a0:	26 30       	cpi	r18, 0x06	; 6
   331a2:	28 f0       	brcs	.+10     	; 0x331ae <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x33e>
    case ResponseStates::ParamValue:
        if (IsHexDigit(c)) {
            responseMsg.paramValue <<= 4U;
            responseMsg.paramValue += Char2Nibble(c);
            return DecodeStatus::NeedMoreData;
        } else if (IsCRCSeparator(c)) {
   331a4:	8a 32       	cpi	r24, 0x2A	; 42
   331a6:	31 f7       	brne	.-52     	; 0x33174 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x304>
            rspState = ResponseStates::CRC;
   331a8:	70 92 b6 12 	sts	0x12B6, r7	; 0x8012b6 <MMU2::mmu2+0x24>
   331ac:	73 cf       	rjmp	.-282    	; 0x33094 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x224>
            return DecodeStatus::Error;
        }
    case ResponseStates::ParamValue:
        if (IsHexDigit(c)) {
            responseMsg.paramValue <<= 4U;
            responseMsg.paramValue += Char2Nibble(c);
   331ae:	0f 94 95 50 	call	0x2a12a	; 0x2a12a <modules::protocol::Protocol::Char2Nibble(unsigned char)>
            rspState = ResponseStates::Error;
            return DecodeStatus::Error;
        }
    case ResponseStates::ParamValue:
        if (IsHexDigit(c)) {
            responseMsg.paramValue <<= 4U;
   331b2:	20 91 bd 12 	lds	r18, 0x12BD	; 0x8012bd <MMU2::mmu2+0x2b>
   331b6:	30 91 be 12 	lds	r19, 0x12BE	; 0x8012be <MMU2::mmu2+0x2c>
   331ba:	44 e0       	ldi	r20, 0x04	; 4
   331bc:	22 0f       	add	r18, r18
   331be:	33 1f       	adc	r19, r19
   331c0:	4a 95       	dec	r20
   331c2:	e1 f7       	brne	.-8      	; 0x331bc <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x34c>
            responseMsg.paramValue += Char2Nibble(c);
   331c4:	82 0f       	add	r24, r18
   331c6:	93 2f       	mov	r25, r19
   331c8:	91 1d       	adc	r25, r1
   331ca:	90 93 be 12 	sts	0x12BE, r25	; 0x8012be <MMU2::mmu2+0x2c>
   331ce:	80 93 bd 12 	sts	0x12BD, r24	; 0x8012bd <MMU2::mmu2+0x2b>
   331d2:	60 cf       	rjmp	.-320    	; 0x33094 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x224>
            return DecodeStatus::Error;
        }
    case ResponseStates::CRC:
        if (IsHexDigit(c)) {
            responseMsg.request.crc8 <<= 4U;
            responseMsg.request.crc8 += Char2Nibble(c);
   331d4:	0f 94 95 50 	call	0x2a12a	; 0x2a12a <modules::protocol::Protocol::Char2Nibble(unsigned char)>
            rspState = ResponseStates::Error;
            return DecodeStatus::Error;
        }
    case ResponseStates::CRC:
        if (IsHexDigit(c)) {
            responseMsg.request.crc8 <<= 4U;
   331d8:	90 91 bb 12 	lds	r25, 0x12BB	; 0x8012bb <MMU2::mmu2+0x29>
   331dc:	92 95       	swap	r25
   331de:	90 7f       	andi	r25, 0xF0	; 240
            responseMsg.request.crc8 += Char2Nibble(c);
   331e0:	89 0f       	add	r24, r25
   331e2:	80 93 bb 12 	sts	0x12BB, r24	; 0x8012bb <MMU2::mmu2+0x29>
   331e6:	56 cf       	rjmp	.-340    	; 0x33094 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x224>

    ResponseStates rspState;
    ResponseMsg responseMsg;

    static constexpr bool IsNewLine(uint8_t c) {
        return c == '\n' || c == '\r';
   331e8:	8d 30       	cpi	r24, 0x0D	; 13
   331ea:	21 f6       	brne	.-120    	; 0x33174 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x304>
   331ec:	03 cf       	rjmp	.-506    	; 0x32ff4 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x184>
        if (b < 32 || b > 127) {
            b = '.';
        }
        *dst++ = b;
    }
    *dst = 0; // terminate properly
   331ee:	e8 0e       	add	r14, r24
   331f0:	f9 1e       	adc	r15, r25
   331f2:	f7 01       	movw	r30, r14
   331f4:	10 82       	st	Z, r1
    lrb = 0; // reset the input buffer index in case of a clean message
   331f6:	10 92 cf 12 	sts	0x12CF, r1	; 0x8012cf <MMU2::mmu2+0x3d>
}

void ProtocolLogic::LogResponse() {
    char lrb[lastReceivedBytes.size()];
    FormatLastResponseMsgAndClearLRB(lrb);
    MMU2_ECHO_MSGLN(lrb);
   331fa:	8e ec       	ldi	r24, 0xCE	; 206
   331fc:	91 ea       	ldi	r25, 0xA1	; 161
   331fe:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   33202:	88 ec       	ldi	r24, 0xC8	; 200
   33204:	91 ea       	ldi	r25, 0xA1	; 161
   33206:	0e 94 c4 7a 	call	0xf588	; 0xf588 <serialprintPGM(char const*)>
   3320a:	ce 01       	movw	r24, r28
   3320c:	01 96       	adiw	r24, 0x01	; 1
   3320e:	0e 94 a1 87 	call	0x10f42	; 0x10f42 <MarlinSerial::println(char const*)>
        switch (protocol.DecodeResponse(c)) {
        case DecodeStatus::MessageCompleted:
            rsp = protocol.GetResponseMsg();
            LogResponse();
            // @@TODO reset direction of communication
            RecordUARTActivity(); // something has happened on the UART, update the timeout record
   33212:	0f 94 52 56 	call	0x2aca4	; 0x2aca4 <MMU2::ProtocolLogic::RecordUARTActivity() [clone .constprop.338]>
        if (auto expmsg = ExpectingMessage(); expmsg != MessageReady) { // this whole statement takes 12B
            return expmsg;
        }

        // process message
        switch (currentScope) {
   33216:	80 91 94 12 	lds	r24, 0x1294	; 0x801294 <MMU2::mmu2+0x2>
   3321a:	81 30       	cpi	r24, 0x01	; 1
   3321c:	09 f4       	brne	.+2      	; 0x33220 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x3b0>
   3321e:	74 c0       	rjmp	.+232    	; 0x33308 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x498>
   33220:	08 f4       	brcc	.+2      	; 0x33224 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x3b4>
   33222:	c5 ce       	rjmp	.-630    	; 0x32fae <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x13e>
   33224:	83 30       	cpi	r24, 0x03	; 3
   33226:	09 f4       	brne	.+2      	; 0x3322a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x3ba>
   33228:	d1 c0       	rjmp	.+418    	; 0x333cc <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x55c>
   3322a:	84 30       	cpi	r24, 0x04	; 4
   3322c:	09 f0       	breq	.+2      	; 0x33230 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x3c0>
   3322e:	4f ce       	rjmp	.-866    	; 0x32ece <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x5e>
        return ProtocolError;
    }
}

StepStatus ProtocolLogic::CommandStep() {
    switch (scopeState) {
   33230:	80 91 95 12 	lds	r24, 0x1295	; 0x801295 <MMU2::mmu2+0x3>
   33234:	86 30       	cpi	r24, 0x06	; 6
   33236:	09 f4       	brne	.+2      	; 0x3323a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x3ca>
   33238:	6c c1       	rjmp	.+728    	; 0x33512 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x6a2>
   3323a:	08 f0       	brcs	.+2      	; 0x3323e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x3ce>
   3323c:	93 c1       	rjmp	.+806    	; 0x33564 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x6f4>
   3323e:	84 30       	cpi	r24, 0x04	; 4
   33240:	09 f4       	brne	.+2      	; 0x33244 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x3d4>
   33242:	09 c1       	rjmp	.+530    	; 0x33456 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x5e6>
   33244:	85 30       	cpi	r24, 0x05	; 5
   33246:	09 f0       	breq	.+2      	; 0x3324a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x3da>
   33248:	cc c0       	rjmp	.+408    	; 0x333e2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x572>
    case ScopeState::CommandSent: {
        switch (rsp.paramCode) { // the response should be either accepted or rejected
   3324a:	80 91 ac 12 	lds	r24, 0x12AC	; 0x8012ac <MMU2::mmu2+0x1a>
   3324e:	81 34       	cpi	r24, 0x41	; 65
   33250:	09 f4       	brne	.+2      	; 0x33254 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x3e4>
   33252:	96 c1       	rjmp	.+812    	; 0x33580 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x710>
   33254:	82 35       	cpi	r24, 0x52	; 82
   33256:	09 f0       	breq	.+2      	; 0x3325a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x3ea>
   33258:	c4 c0       	rjmp	.+392    	; 0x333e2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x572>
            errorCode = ErrorCode::RUNNING;
            scopeState = ScopeState::Wait;
            break;
        case ResponseMsgParamCodes::Rejected:
            // rejected - should normally not happen, but report the error up
            progressCode = ProgressCode::OK;
   3325a:	10 92 d4 12 	sts	0x12D4, r1	; 0x8012d4 <MMU2::mmu2+0x42>
            errorCode = ErrorCode::PROTOCOL_ERROR;
   3325e:	8d e2       	ldi	r24, 0x2D	; 45
   33260:	90 e8       	ldi	r25, 0x80	; 128
   33262:	90 93 d3 12 	sts	0x12D3, r25	; 0x8012d3 <MMU2::mmu2+0x41>
   33266:	80 93 d2 12 	sts	0x12D2, r24	; 0x8012d2 <MMU2::mmu2+0x40>
    } break;
    case CommandRejected:
        // we have to repeat it - that's the only thing we can do
        // no change in state
        // @@TODO wait until Q0 returns command in progress finished, then we can send this one
        LogError(PSTR("Command rejected"));
   3326a:	8a ee       	ldi	r24, 0xEA	; 234
   3326c:	9e e9       	ldi	r25, 0x9E	; 158
   3326e:	0f 94 6f 56 	call	0x2acde	; 0x2acde <MMU2::ProtocolLogic::LogError(char const*) [clone .constprop.286]>
void ProtocolLogic::DelayedRestartRestart() {
    scopeState = ScopeState::RecoveringProtocolError;
}

void ProtocolLogic::CommandRestart() {
    scopeState = ScopeState::CommandSent;
   33272:	85 e0       	ldi	r24, 0x05	; 5
   33274:	80 93 95 12 	sts	0x1295, r24	; 0x801295 <MMU2::mmu2+0x3>
    SendMsg(rq);
   33278:	40 91 97 12 	lds	r20, 0x1297	; 0x801297 <MMU2::mmu2+0x5>
   3327c:	50 91 98 12 	lds	r21, 0x1298	; 0x801298 <MMU2::mmu2+0x6>
   33280:	60 91 99 12 	lds	r22, 0x1299	; 0x801299 <MMU2::mmu2+0x7>
   33284:	70 91 9a 12 	lds	r23, 0x129A	; 0x80129a <MMU2::mmu2+0x8>
   33288:	80 91 9b 12 	lds	r24, 0x129B	; 0x80129b <MMU2::mmu2+0x9>
   3328c:	0f 94 58 57 	call	0x2aeb0	; 0x2aeb0 <MMU2::ProtocolLogic::SendMsg(modules::protocol::RequestMsg) [clone .constprop.335]>
   33290:	16 e0       	ldi	r17, 0x06	; 6
   33292:	07 c1       	rjmp	.+526    	; 0x334a2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x632>
    State Detect(uint8_t c) {
        // consume old MMU FW's data if any -> avoid confusion of protocol decoder
        if (ok == 0 && c == 'o') {
            ++ok;
            return State::MatchingPart;
        } else if (ok == 1 && c == 'k') {
   33294:	1b 36       	cpi	r17, 0x6B	; 107
   33296:	09 f0       	breq	.+2      	; 0x3329a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x42a>
   33298:	f5 c2       	rjmp	.+1514   	; 0x33884 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0xa14>
        LogError(PSTR("Command Error"));
        // we shall probably transfer into the Idle state and await further instructions from the upper layer
        // Idle state may solve the problem of keeping up the heart beat running
        break;
    case VersionMismatch:
        LogError(PSTR("Version mismatch"));
   3329a:	8b ec       	ldi	r24, 0xCB	; 203
   3329c:	9e e9       	ldi	r25, 0x9E	; 158
   3329e:	0f 94 6f 56 	call	0x2acde	; 0x2acde <MMU2::ProtocolLogic::LogError(char const*) [clone .constprop.286]>
   332a2:	18 e0       	ldi	r17, 0x08	; 8
   332a4:	fe c0       	rjmp	.+508    	; 0x334a2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x632>
        default:
            RecordUARTActivity(); // something has happened on the UART, update the timeout record
            return ProtocolError;
        }
    }
    if (bytesConsumed != 0) {
   332a6:	cd 28       	or	r12, r13
   332a8:	19 f0       	breq	.+6      	; 0x332b0 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x440>
        RecordUARTActivity(); // something has happened on the UART, update the timeout record
   332aa:	0f 94 52 56 	call	0x2aca4	; 0x2aca4 <MMU2::ProtocolLogic::RecordUARTActivity() [clone .constprop.338]>
   332ae:	7f ce       	rjmp	.-770    	; 0x32fae <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x13e>
    IdleRestart();
    SendQuery(); // force sending Q0 immediately
}

bool ProtocolLogic::Elapsed(uint32_t timeout) const {
    return _millis() >= (lastUARTActivityMs + timeout);
   332b0:	0f 94 f0 0d 	call	0x21be0	; 0x21be0 <millis2>
   332b4:	ab 01       	movw	r20, r22
   332b6:	bc 01       	movw	r22, r24
   332b8:	80 91 a1 12 	lds	r24, 0x12A1	; 0x8012a1 <MMU2::mmu2+0xf>
   332bc:	90 91 a2 12 	lds	r25, 0x12A2	; 0x8012a2 <MMU2::mmu2+0x10>
   332c0:	a0 91 a3 12 	lds	r26, 0x12A3	; 0x8012a3 <MMU2::mmu2+0x11>
   332c4:	b0 91 a4 12 	lds	r27, 0x12A4	; 0x8012a4 <MMU2::mmu2+0x12>
   332c8:	80 53       	subi	r24, 0x30	; 48
   332ca:	98 4f       	sbci	r25, 0xF8	; 248
   332cc:	af 4f       	sbci	r26, 0xFF	; 255
   332ce:	bf 4f       	sbci	r27, 0xFF	; 255
        }
    }
    if (bytesConsumed != 0) {
        RecordUARTActivity(); // something has happened on the UART, update the timeout record
        return Processing; // consumed some bytes, but message still not ready
    } else if (Elapsed(linkLayerTimeout) && currentScope != Scope::Stopped) {
   332d0:	48 17       	cp	r20, r24
   332d2:	59 07       	cpc	r21, r25
   332d4:	6a 07       	cpc	r22, r26
   332d6:	7b 07       	cpc	r23, r27
   332d8:	08 f4       	brcc	.+2      	; 0x332dc <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x46c>
   332da:	69 ce       	rjmp	.-814    	; 0x32fae <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x13e>
   332dc:	80 91 94 12 	lds	r24, 0x1294	; 0x801294 <MMU2::mmu2+0x2>
   332e0:	88 23       	and	r24, r24
   332e2:	09 f4       	brne	.+2      	; 0x332e6 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x476>
   332e4:	64 ce       	rjmp	.-824    	; 0x32fae <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x13e>
        rqState = RequestStates::Code;
    }

    /// resets the internal response decoding state (typically after an error)
    void ResetResponseDecoder() {
        rspState = ResponseStates::RequestCode;
   332e6:	10 92 b6 12 	sts	0x12B6, r1	; 0x8012b6 <MMU2::mmu2+0x24>
    initRegs8[0] = extraLoadDistance;
    initRegs8[1] = pulleySlowFeedrate;
}

void ProtocolLogic::Start() {
    state = State::InitSequence;
   332ea:	81 e0       	ldi	r24, 0x01	; 1
   332ec:	80 93 af 12 	sts	0x12AF, r24	; 0x8012af <MMU2::mmu2+0x1d>
    currentScope = Scope::StartSeq;
   332f0:	80 93 94 12 	sts	0x1294, r24	; 0x801294 <MMU2::mmu2+0x2>
    LogRequestMsg(txbuff, len);
    RecordUARTActivity();
}

void ProtocolLogic::StartSeqRestart() {
    retries = maxRetries;
   332f4:	86 e0       	ldi	r24, 0x06	; 6
   332f6:	80 93 96 12 	sts	0x1296, r24	; 0x801296 <MMU2::mmu2+0x4>
    SendVersion(0);
   332fa:	80 e0       	ldi	r24, 0x00	; 0
   332fc:	0f 94 5f 95 	call	0x32abe	; 0x32abe <MMU2::ProtocolLogic::SendVersion(unsigned char) [clone .constprop.324]>

StepStatus ProtocolLogic::HandleCommunicationTimeout() {
    uart->flush(); // clear the output buffer
    protocol.ResetResponseDecoder();
    Start();
    return SuppressShortDropOuts(PSTR("Communication timeout"), CommunicationTimeout);
   33300:	64 e0       	ldi	r22, 0x04	; 4
   33302:	83 ea       	ldi	r24, 0xA3	; 163
   33304:	9e e9       	ldi	r25, 0x9E	; 158
   33306:	79 c0       	rjmp	.+242    	; 0x333fa <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x58a>
    return Finished;
}

StepStatus ProtocolLogic::StartSeqStep() {
    // solve initial handshake
    switch (scopeState) {
   33308:	10 91 95 12 	lds	r17, 0x1295	; 0x801295 <MMU2::mmu2+0x3>
   3330c:	13 30       	cpi	r17, 0x03	; 3
   3330e:	b1 f1       	breq	.+108    	; 0x3337c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x50c>
   33310:	60 f0       	brcs	.+24     	; 0x3332a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x4ba>
   33312:	16 30       	cpi	r17, 0x06	; 6
   33314:	09 f4       	brne	.+2      	; 0x33318 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x4a8>
   33316:	50 c0       	rjmp	.+160    	; 0x333b8 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x548>
   33318:	19 30       	cpi	r17, 0x09	; 9
   3331a:	09 f0       	breq	.+2      	; 0x3331e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x4ae>
   3331c:	be cf       	rjmp	.-132    	; 0x3329a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x42a>
            // Start General Interrogation after line up - initial parametrization is started
            StartWritingInitRegisters();
        }
        return Processing;
    case ScopeState::WritingInitRegisters:
        if (ProcessWritingInitRegister()) {
   3331e:	0f 94 82 58 	call	0x2b104	; 0x2b104 <MMU2::ProtocolLogic::ProcessWritingInitRegister() [clone .constprop.277]>
   33322:	88 23       	and	r24, r24
   33324:	09 f4       	brne	.+2      	; 0x33328 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x4b8>
   33326:	43 ce       	rjmp	.-890    	; 0x32fae <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x13e>
   33328:	40 ce       	rjmp	.-896    	; 0x32faa <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x13a>
void ProtocolLogic::IdleRestart() {
    scopeState = ScopeState::Ready;
}

StepStatus ProtocolLogic::ProcessVersionResponse(uint8_t stage) {
    if (rsp.request.code != RequestMsgCodes::Version || rsp.request.value != stage) {
   3332a:	80 91 a7 12 	lds	r24, 0x12A7	; 0x8012a7 <MMU2::mmu2+0x15>
   3332e:	83 35       	cpi	r24, 0x53	; 83
   33330:	21 f4       	brne	.+8      	; 0x3333a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x4ca>
   33332:	80 91 a8 12 	lds	r24, 0x12A8	; 0x8012a8 <MMU2::mmu2+0x16>
   33336:	18 17       	cp	r17, r24
   33338:	11 f0       	breq	.+4      	; 0x3333e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x4ce>
        mmuFwVersion[stage] = rsp.paramValue;
        if (mmuFwVersion[stage] != pgm_read_byte(supportedMmuFWVersion + stage)) {
            if (--retries == 0) {
                return VersionMismatch;
            } else {
                SendVersion(stage);
   3333a:	81 2f       	mov	r24, r17
   3333c:	fe cd       	rjmp	.-1028   	; 0x32f3a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0xca>
StepStatus ProtocolLogic::ProcessVersionResponse(uint8_t stage) {
    if (rsp.request.code != RequestMsgCodes::Version || rsp.request.value != stage) {
        // got a response to something else - protocol corruption probably, repeat the query OR restart the comm by issuing S0?
        SendVersion(stage);
    } else {
        mmuFwVersion[stage] = rsp.paramValue;
   3333e:	80 91 ad 12 	lds	r24, 0x12AD	; 0x8012ad <MMU2::mmu2+0x1b>
   33342:	e1 2f       	mov	r30, r17
   33344:	f0 e0       	ldi	r31, 0x00	; 0
   33346:	df 01       	movw	r26, r30
   33348:	af 51       	subi	r26, 0x1F	; 31
   3334a:	bd 4e       	sbci	r27, 0xED	; 237
   3334c:	8c 93       	st	X, r24
        if (mmuFwVersion[stage] != pgm_read_byte(supportedMmuFWVersion + stage)) {
   3334e:	e8 53       	subi	r30, 0x38	; 56
   33350:	f1 46       	sbci	r31, 0x61	; 97
   33352:	e4 91       	lpm	r30, Z
   33354:	8e 17       	cp	r24, r30
   33356:	41 f0       	breq	.+16     	; 0x33368 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x4f8>
            if (--retries == 0) {
   33358:	80 91 96 12 	lds	r24, 0x1296	; 0x801296 <MMU2::mmu2+0x4>
   3335c:	81 50       	subi	r24, 0x01	; 1
   3335e:	80 93 96 12 	sts	0x1296, r24	; 0x801296 <MMU2::mmu2+0x4>
   33362:	81 11       	cpse	r24, r1
   33364:	ea cf       	rjmp	.-44     	; 0x3333a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x4ca>
   33366:	99 cf       	rjmp	.-206    	; 0x3329a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x42a>
    SERIAL_ECHOLNPGM("ResetRetryAttempts");
    retryAttempts = MAX_RETRIES;
}

void ProtocolLogic::ResetCommunicationTimeoutAttempts() {
    SERIAL_ECHOLNPGM("RSTCommTimeout");
   33368:	81 e6       	ldi	r24, 0x61	; 97
   3336a:	91 ea       	ldi	r25, 0xA1	; 161
   3336c:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>

    /// @returns the initial cause which started this drop out event
    inline StepStatus InitialCause() const { return cause; }

    /// Rearms the object for further processing - basically call this once the MMU responds with something meaningful (e.g. S0 A2)
    inline void Reset() { occurrences = maxOccurrences; }
   33370:	8a e0       	ldi	r24, 0x0A	; 10
   33372:	80 93 a6 12 	sts	0x12A6, r24	; 0x8012a6 <MMU2::mmu2+0x14>
            } else {
                SendVersion(stage);
            }
        } else {
            ResetCommunicationTimeoutAttempts(); // got a meaningful response from the MMU, stop data layer timeout tracking
            SendVersion(stage + 1);
   33376:	81 e0       	ldi	r24, 0x01	; 1
   33378:	81 0f       	add	r24, r17
   3337a:	df cd       	rjmp	.-1090   	; 0x32f3a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0xca>
    case ScopeState::S0Sent: // received response to S0 - major
    case ScopeState::S1Sent: // received response to S1 - minor
    case ScopeState::S2Sent: // received response to S2 - minor
        return ProcessVersionResponse((uint8_t)scopeState - (uint8_t)ScopeState::S0Sent);
    case ScopeState::S3Sent: // received response to S3 - revision
        if (rsp.request.code != RequestMsgCodes::Version || rsp.request.value != 3) {
   3337c:	80 91 a7 12 	lds	r24, 0x12A7	; 0x8012a7 <MMU2::mmu2+0x15>
   33380:	83 35       	cpi	r24, 0x53	; 83
   33382:	21 f4       	brne	.+8      	; 0x3338c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x51c>
   33384:	80 91 a8 12 	lds	r24, 0x12A8	; 0x8012a8 <MMU2::mmu2+0x16>
   33388:	83 30       	cpi	r24, 0x03	; 3
   3338a:	11 f0       	breq	.+4      	; 0x33390 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x520>
            // got a response to something else - protocol corruption probably, repeat the query OR restart the comm by issuing S0?
            SendVersion(3);
   3338c:	83 e0       	ldi	r24, 0x03	; 3
   3338e:	d5 cd       	rjmp	.-1110   	; 0x32f3a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0xca>
        } else {
            mmuFwVersionBuild = rsp.paramValue; // just register the build number
   33390:	80 91 ad 12 	lds	r24, 0x12AD	; 0x8012ad <MMU2::mmu2+0x1b>
   33394:	90 91 ae 12 	lds	r25, 0x12AE	; 0x8012ae <MMU2::mmu2+0x1c>
   33398:	90 93 e5 12 	sts	0x12E5, r25	; 0x8012e5 <MMU2::mmu2+0x53>
   3339c:	80 93 e4 12 	sts	0x12E4, r24	; 0x8012e4 <MMU2::mmu2+0x52>
    }
    return ScopeState::Reading16bitRegisters;
}

void ProtocolLogic::StartWritingInitRegisters() {
    regIndex = 0;
   333a0:	10 92 e0 12 	sts	0x12E0, r1	; 0x8012e0 <MMU2::mmu2+0x4e>
    SendWriteRegister(pgm_read_byte(initRegs8Addrs + regIndex), initRegs8[regIndex], ScopeState::WritingInitRegisters);
   333a4:	ef e5       	ldi	r30, 0x5F	; 95
   333a6:	f1 ea       	ldi	r31, 0xA1	; 161
   333a8:	84 91       	lpm	r24, Z
   333aa:	60 91 de 12 	lds	r22, 0x12DE	; 0x8012de <MMU2::mmu2+0x4c>
   333ae:	70 e0       	ldi	r23, 0x00	; 0
   333b0:	49 e0       	ldi	r20, 0x09	; 9
   333b2:	0f 94 c3 57 	call	0x2af86	; 0x2af86 <MMU2::ProtocolLogic::SendWriteRegister(unsigned char, unsigned int, MMU2::ProtocolLogic::ScopeState) [clone .constprop.331]>
   333b6:	fb cd       	rjmp	.-1034   	; 0x32fae <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x13e>
    currentScope = Scope::Idle;
    IdleRestart();
}

void ProtocolLogic::SwitchFromStartToIdle() {
    state = State::Running;
   333b8:	82 e0       	ldi	r24, 0x02	; 2
   333ba:	80 93 af 12 	sts	0x12AF, r24	; 0x8012af <MMU2::mmu2+0x1d>
    currentScope = Scope::Idle;
   333be:	83 e0       	ldi	r24, 0x03	; 3
   333c0:	80 93 94 12 	sts	0x1294, r24	; 0x801294 <MMU2::mmu2+0x2>
    scopeState = ScopeState::CommandSent;
    SendMsg(rq);
}

void ProtocolLogic::IdleRestart() {
    scopeState = ScopeState::Ready;
   333c4:	82 e8       	ldi	r24, 0x82	; 130
   333c6:	80 93 95 12 	sts	0x1295, r24	; 0x801295 <MMU2::mmu2+0x3>
   333ca:	d2 cd       	rjmp	.-1116   	; 0x32f70 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x100>
    }
    return Finished;
}

StepStatus ProtocolLogic::IdleStep() {
    switch (scopeState) {
   333cc:	80 91 95 12 	lds	r24, 0x1295	; 0x801295 <MMU2::mmu2+0x3>
   333d0:	88 30       	cpi	r24, 0x08	; 8
   333d2:	09 f4       	brne	.+2      	; 0x333d6 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x566>
   333d4:	b7 c0       	rjmp	.+366    	; 0x33544 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x6d4>
   333d6:	a8 f4       	brcc	.+42     	; 0x33402 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x592>
   333d8:	84 30       	cpi	r24, 0x04	; 4
   333da:	d9 f0       	breq	.+54     	; 0x33412 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x5a2>
   333dc:	87 30       	cpi	r24, 0x07	; 7
   333de:	09 f4       	brne	.+2      	; 0x333e2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x572>
   333e0:	ae c0       	rjmp	.+348    	; 0x3353e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x6ce>
    return SuppressShortDropOuts(PSTR("Communication timeout"), CommunicationTimeout);
}

StepStatus ProtocolLogic::HandleProtocolError() {
    uart->flush(); // clear the output buffer
    state = State::InitSequence;
   333e2:	81 e0       	ldi	r24, 0x01	; 1
   333e4:	80 93 af 12 	sts	0x12AF, r24	; 0x8012af <MMU2::mmu2+0x1d>
    currentScope = Scope::DelayedRestart;
   333e8:	82 e0       	ldi	r24, 0x02	; 2
   333ea:	80 93 94 12 	sts	0x1294, r24	; 0x801294 <MMU2::mmu2+0x2>
    retries = maxRetries;
    SendVersion(0);
}

void ProtocolLogic::DelayedRestartRestart() {
    scopeState = ScopeState::RecoveringProtocolError;
   333ee:	83 e8       	ldi	r24, 0x83	; 131
   333f0:	80 93 95 12 	sts	0x1295, r24	; 0x801295 <MMU2::mmu2+0x3>
StepStatus ProtocolLogic::HandleProtocolError() {
    uart->flush(); // clear the output buffer
    state = State::InitSequence;
    currentScope = Scope::DelayedRestart;
    DelayedRestartRestart();
    return SuppressShortDropOuts(PSTR("Protocol Error"), ProtocolError);
   333f4:	65 e0       	ldi	r22, 0x05	; 5
   333f6:	89 eb       	ldi	r24, 0xB9	; 185
   333f8:	9e e9       	ldi	r25, 0x9E	; 158

StepStatus ProtocolLogic::HandleCommunicationTimeout() {
    uart->flush(); // clear the output buffer
    protocol.ResetResponseDecoder();
    Start();
    return SuppressShortDropOuts(PSTR("Communication timeout"), CommunicationTimeout);
   333fa:	0f 94 e0 56 	call	0x2adc0	; 0x2adc0 <MMU2::ProtocolLogic::SuppressShortDropOuts(char const*, MMU2::StepStatus) [clone .constprop.283]>
   333fe:	18 2f       	mov	r17, r24
   33400:	50 c0       	rjmp	.+160    	; 0x334a2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x632>
    }
    return Finished;
}

StepStatus ProtocolLogic::IdleStep() {
    switch (scopeState) {
   33402:	8a 30       	cpi	r24, 0x0A	; 10
   33404:	09 f4       	brne	.+2      	; 0x33408 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x598>
   33406:	a7 c0       	rjmp	.+334    	; 0x33556 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x6e6>
   33408:	60 f3       	brcs	.-40     	; 0x333e2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x572>
   3340a:	8d 30       	cpi	r24, 0x0D	; 13
   3340c:	08 f4       	brcc	.+2      	; 0x33410 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x5a0>
   3340e:	5f cd       	rjmp	.-1346   	; 0x32ece <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x5e>
   33410:	e8 cf       	rjmp	.-48     	; 0x333e2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x572>
    case ScopeState::QuerySent: // check UART
        // If we are accidentally in Idle and we receive something like "T0 P1" - that means the communication dropped out while a command was in progress.
        // That causes no issues here, we just need to switch to Command processing and continue there from now on.
        // The usual response in this case should be some command and "F" - finished - that confirms we are in an Idle state even on the MMU side.
        switch (rsp.request.code) {
   33412:	80 91 a7 12 	lds	r24, 0x12A7	; 0x8012a7 <MMU2::mmu2+0x15>
   33416:	8e 34       	cpi	r24, 0x4E	; 78
   33418:	60 f5       	brcc	.+88     	; 0x33472 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x602>
   3341a:	8b 34       	cpi	r24, 0x4B	; 75
   3341c:	10 f4       	brcc	.+4      	; 0x33422 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x5b2>
   3341e:	85 34       	cpi	r24, 0x45	; 69
   33420:	01 f7       	brne	.-64     	; 0x333e2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x572>
        case RequestMsgCodes::Eject:
        case RequestMsgCodes::Load:
        case RequestMsgCodes::Mode:
        case RequestMsgCodes::Tool:
        case RequestMsgCodes::Unload:
            if (rsp.paramCode != ResponseMsgParamCodes::Finished) {
   33422:	80 91 ac 12 	lds	r24, 0x12AC	; 0x8012ac <MMU2::mmu2+0x1a>
   33426:	86 34       	cpi	r24, 0x46	; 70
   33428:	09 f4       	brne	.+2      	; 0x3342c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x5bc>
   3342a:	73 c0       	rjmp	.+230    	; 0x33512 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x6a2>
        return true;
    }
}

StepStatus ProtocolLogic::SwitchFromIdleToCommand() {
    currentScope = Scope::Command;
   3342c:	84 e0       	ldi	r24, 0x04	; 4
   3342e:	80 93 94 12 	sts	0x1294, r24	; 0x801294 <MMU2::mmu2+0x2>
   33432:	85 e0       	ldi	r24, 0x05	; 5
   33434:	e7 ea       	ldi	r30, 0xA7	; 167
   33436:	f2 e1       	ldi	r31, 0x12	; 18
   33438:	de 01       	movw	r26, r28
   3343a:	11 96       	adiw	r26, 0x01	; 1
   3343c:	01 90       	ld	r0, Z+
   3343e:	0d 92       	st	X+, r0
   33440:	8a 95       	dec	r24
   33442:	e1 f7       	brne	.-8      	; 0x3343c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x5cc>
    StepStatus StoppedStep() { return Processing; }

    StepStatus ProcessCommandQueryResponse();

    inline void SetRequestMsg(RequestMsg msg) {
        rq = msg;
   33444:	85 e0       	ldi	r24, 0x05	; 5
   33446:	fe 01       	movw	r30, r28
   33448:	31 96       	adiw	r30, 0x01	; 1
   3344a:	a7 e9       	ldi	r26, 0x97	; 151
   3344c:	b2 e1       	ldi	r27, 0x12	; 18
   3344e:	01 90       	ld	r0, Z+
   33450:	0d 92       	st	X+, r0
   33452:	8a 95       	dec	r24
   33454:	e1 f7       	brne	.-8      	; 0x3344e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x5de>
        default:
            return ProtocolError;
        }
    } break;
    case ScopeState::QuerySent:
        return ProcessCommandQueryResponse();
   33456:	0f 94 14 96 	call	0x32c28	; 0x32c28 <MMU2::ProtocolLogic::ProcessCommandQueryResponse() [clone .constprop.264]>
   3345a:	18 2f       	mov	r17, r24
StepStatus ProtocolLogic::Step() {
    if (!ExpectsResponse()) { // if not waiting for a response, activate a planned request immediately
        ActivatePlannedRequest();
    }
    auto currentStatus = ScopeStep();
    switch (currentStatus) {
   3345c:	85 30       	cpi	r24, 0x05	; 5
   3345e:	09 f2       	breq	.-126    	; 0x333e2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x572>
   33460:	08 f0       	brcs	.+2      	; 0x33464 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x5f4>
   33462:	9c c0       	rjmp	.+312    	; 0x3359c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x72c>
   33464:	82 30       	cpi	r24, 0x02	; 2
   33466:	09 f4       	brne	.+2      	; 0x3346a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x5fa>
   33468:	32 cd       	rjmp	.-1436   	; 0x32ece <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x5e>
   3346a:	84 30       	cpi	r24, 0x04	; 4
   3346c:	09 f4       	brne	.+2      	; 0x33470 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x600>
   3346e:	3b cf       	rjmp	.-394    	; 0x332e6 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x476>
   33470:	18 c0       	rjmp	.+48     	; 0x334a2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x632>
    switch (scopeState) {
    case ScopeState::QuerySent: // check UART
        // If we are accidentally in Idle and we receive something like "T0 P1" - that means the communication dropped out while a command was in progress.
        // That causes no issues here, we just need to switch to Command processing and continue there from now on.
        // The usual response in this case should be some command and "F" - finished - that confirms we are in an Idle state even on the MMU side.
        switch (rsp.request.code) {
   33472:	84 35       	cpi	r24, 0x54	; 84
   33474:	08 f4       	brcc	.+2      	; 0x33478 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x608>
   33476:	b5 cf       	rjmp	.-150    	; 0x333e2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x572>
   33478:	86 35       	cpi	r24, 0x56	; 86
   3347a:	98 f2       	brcs	.-90     	; 0x33422 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x5b2>
   3347c:	88 35       	cpi	r24, 0x58	; 88
   3347e:	09 f0       	breq	.+2      	; 0x33482 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x612>
   33480:	b0 cf       	rjmp	.-160    	; 0x333e2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x572>
            break;
        case RequestMsgCodes::Reset:
            // this one is kind of special
            // we do not transfer to any "running" command (i.e. we stay in Idle),
            // but in case there is an error reported we must make sure it gets propagated
            switch (rsp.paramCode) {
   33482:	80 91 ac 12 	lds	r24, 0x12AC	; 0x8012ac <MMU2::mmu2+0x1a>
   33486:	86 34       	cpi	r24, 0x46	; 70
   33488:	89 f1       	breq	.+98     	; 0x334ec <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x67c>
   3348a:	80 35       	cpi	r24, 0x50	; 80
   3348c:	c1 f1       	breq	.+112    	; 0x334fe <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x68e>
   3348e:	82 34       	cpi	r24, 0x42	; 66
   33490:	09 f0       	breq	.+2      	; 0x33494 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x624>
   33492:	42 c0       	rjmp	.+132    	; 0x33518 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x6a8>
            case ResponseMsgParamCodes::Button:
                // The user pushed a button on the MMU. Save it, do what we need to do
                // to prepare, then pass it back to the MMU so it can work its magic.
                buttonCode = static_cast<Buttons>(rsp.paramValue);
   33494:	80 91 ad 12 	lds	r24, 0x12AD	; 0x8012ad <MMU2::mmu2+0x1b>
   33498:	80 93 d5 12 	sts	0x12D5, r24	; 0x8012d5 <MMU2::mmu2+0x43>
                StartReading8bitRegisters();
   3349c:	0f 94 54 94 	call	0x328a8	; 0x328a8 <MMU2::ProtocolLogic::StartReading8bitRegisters() [clone .constprop.271]>
                return ButtonPushed;
   334a0:	1b e0       	ldi	r17, 0x0B	; 11
   334a2:	80 91 92 12 	lds	r24, 0x1292	; 0x801292 <MMU2::mmu2>
   334a6:	90 91 93 12 	lds	r25, 0x1293	; 0x801293 <MMU2::mmu2+0x1>
        break;
    default:
        break;
    }
    // special handling of explicit printer errors
    return IsPrinterError() ? StepStatus::PrinterError : currentStatus;
   334aa:	81 30       	cpi	r24, 0x01	; 1
   334ac:	91 05       	cpc	r25, r1
   334ae:	09 f0       	breq	.+2      	; 0x334b2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x642>
   334b0:	ec c1       	rjmp	.+984    	; 0x3388a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0xa1a>

    const StepStatus ss = logic.Step();
    switch (ss) {
   334b2:	12 30       	cpi	r17, 0x02	; 2
   334b4:	09 f4       	brne	.+2      	; 0x334b8 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x648>
   334b6:	90 c0       	rjmp	.+288    	; 0x335d8 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x768>
   334b8:	08 f0       	brcs	.+2      	; 0x334bc <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x64c>
   334ba:	7d c0       	rjmp	.+250    	; 0x335b6 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x746>
   334bc:	11 23       	and	r17, r17
   334be:	09 f4       	brne	.+2      	; 0x334c2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x652>
   334c0:	16 c1       	rjmp	.+556    	; 0x336ee <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x87e>
    case Interrupted:
        // can be silently handed over to a higher layer, no processing necessary at this spot
        break;

    default:
        if (reportErrors) {
   334c2:	00 23       	and	r16, r16
   334c4:	09 f4       	brne	.+2      	; 0x334c8 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x658>
   334c6:	e2 c0       	rjmp	.+452    	; 0x3368c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x81c>
            switch (ss) {
   334c8:	17 30       	cpi	r17, 0x07	; 7
   334ca:	09 f4       	brne	.+2      	; 0x334ce <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x65e>
   334cc:	c2 c1       	rjmp	.+900    	; 0x33852 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x9e2>
   334ce:	08 f0       	brcs	.+2      	; 0x334d2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x662>
   334d0:	b6 c1       	rjmp	.+876    	; 0x3383e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x9ce>
   334d2:	14 30       	cpi	r17, 0x04	; 4
   334d4:	09 f4       	brne	.+2      	; 0x334d8 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x668>
   334d6:	c5 c1       	rjmp	.+906    	; 0x33862 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x9f2>
   334d8:	15 30       	cpi	r17, 0x05	; 5
   334da:	09 f0       	breq	.+2      	; 0x334de <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x66e>
   334dc:	d7 c0       	rjmp	.+430    	; 0x3368c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x81c>
                state = xState::Connecting;
                ReportError(ErrorCode::MMU_NOT_RESPONDING, ErrorSourcePrinter);
                break;

            case ProtocolError:
                state = xState::Connecting;
   334de:	82 e0       	ldi	r24, 0x02	; 2
   334e0:	80 93 01 13 	sts	0x1301, r24	; 0x801301 <MMU2::mmu2+0x6f>
                ReportError(ErrorCode::PROTOCOL_ERROR, ErrorSourcePrinter);
   334e4:	60 e0       	ldi	r22, 0x00	; 0
   334e6:	8d e2       	ldi	r24, 0x2D	; 45
   334e8:	90 e8       	ldi	r25, 0x80	; 128
   334ea:	b8 c1       	rjmp	.+880    	; 0x3385c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x9ec>
                // to prepare, then pass it back to the MMU so it can work its magic.
                buttonCode = static_cast<Buttons>(rsp.paramValue);
                StartReading8bitRegisters();
                return ButtonPushed;
            case ResponseMsgParamCodes::Finished:
                if (ReqMsg().code != RequestMsgCodes::unknown) {
   334ec:	80 91 97 12 	lds	r24, 0x1297	; 0x801297 <MMU2::mmu2+0x5>
   334f0:	88 23       	and	r24, r24
   334f2:	29 f0       	breq	.+10     	; 0x334fe <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x68e>
    scopeState = ScopeState::CommandSent;
    SendMsg(rq);
}

void ProtocolLogic::IdleRestart() {
    scopeState = ScopeState::Ready;
   334f4:	82 e8       	ldi	r24, 0x82	; 130
   334f6:	80 93 95 12 	sts	0x1295, r24	; 0x801295 <MMU2::mmu2+0x3>
            case ResponseMsgParamCodes::Finished:
                if (ReqMsg().code != RequestMsgCodes::unknown) {
                    // got reset while doing some other command - the originally issued command was interrupted!
                    // this must be solved by the upper layer, protocol logic doesn't have all the context (like unload before trying again)
                    IdleRestart();
                    return Interrupted;
   334fa:	13 e0       	ldi	r17, 0x03	; 3
   334fc:	d2 cf       	rjmp	.-92     	; 0x334a2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x632>
                }
                [[fallthrough]];
            case ResponseMsgParamCodes::Processing:
                // @@TODO we may actually use this branch to report progress of manual operation on the MMU
                // The MMU sends e.g. X0 P27 after its restart when the user presses an MMU button to move the Selector
                progressCode = static_cast<ProgressCode>(rsp.paramValue);
   334fe:	80 91 ad 12 	lds	r24, 0x12AD	; 0x8012ad <MMU2::mmu2+0x1b>
   33502:	80 93 d4 12 	sts	0x12D4, r24	; 0x8012d4 <MMU2::mmu2+0x42>
                errorCode = ErrorCode::OK;
   33506:	81 e0       	ldi	r24, 0x01	; 1
   33508:	90 e0       	ldi	r25, 0x00	; 0
   3350a:	90 93 d3 12 	sts	0x12D3, r25	; 0x8012d3 <MMU2::mmu2+0x41>
   3350e:	80 93 d2 12 	sts	0x12D2, r24	; 0x8012d2 <MMU2::mmu2+0x40>
        }
    } break;
    case ScopeState::QuerySent:
        return ProcessCommandQueryResponse();
    case ScopeState::FilamentSensorStateSent:
        StartReading8bitRegisters();
   33512:	0f 94 54 94 	call	0x328a8	; 0x328a8 <MMU2::ProtocolLogic::StartReading8bitRegisters() [clone .constprop.271]>
   33516:	4b cd       	rjmp	.-1386   	; 0x32fae <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x13e>
                // The MMU sends e.g. X0 P27 after its restart when the user presses an MMU button to move the Selector
                progressCode = static_cast<ProgressCode>(rsp.paramValue);
                errorCode = ErrorCode::OK;
                break;
            default:
                progressCode = ProgressCode::ERRWaitingForUser;
   33518:	8c e0       	ldi	r24, 0x0C	; 12
   3351a:	80 93 d4 12 	sts	0x12D4, r24	; 0x8012d4 <MMU2::mmu2+0x42>
                errorCode = static_cast<ErrorCode>(rsp.paramValue);
   3351e:	80 91 ad 12 	lds	r24, 0x12AD	; 0x8012ad <MMU2::mmu2+0x1b>
   33522:	90 91 ae 12 	lds	r25, 0x12AE	; 0x8012ae <MMU2::mmu2+0x1c>
   33526:	90 93 d3 12 	sts	0x12D3, r25	; 0x8012d3 <MMU2::mmu2+0x41>
   3352a:	80 93 d2 12 	sts	0x12D2, r24	; 0x8012d2 <MMU2::mmu2+0x40>
                StartReading8bitRegisters(); // continue Idle state without restarting the communication
   3352e:	0f 94 54 94 	call	0x328a8	; 0x328a8 <MMU2::ProtocolLogic::StartReading8bitRegisters() [clone .constprop.271]>
        // @@TODO wait until Q0 returns command in progress finished, then we can send this one
        LogError(PSTR("Command rejected"));
        CommandRestart();
        break;
    case CommandError:
        LogError(PSTR("Command Error"));
   33532:	8c ed       	ldi	r24, 0xDC	; 220
   33534:	9e e9       	ldi	r25, 0x9E	; 158
   33536:	0f 94 6f 56 	call	0x2acde	; 0x2acde <MMU2::ProtocolLogic::LogError(char const*) [clone .constprop.286]>
   3353a:	17 e0       	ldi	r17, 0x07	; 7
   3353c:	b2 cf       	rjmp	.-156    	; 0x334a2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x632>
            return ProtocolError;
        }
        StartReading8bitRegisters();
        return Processing;
    case ScopeState::Reading8bitRegisters:
        ProcessRead8bitRegister();
   3353e:	0f 94 78 94 	call	0x328f0	; 0x328f0 <MMU2::ProtocolLogic::ProcessRead8bitRegister() [clone .constprop.266]>
   33542:	35 cd       	rjmp	.-1430   	; 0x32fae <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x13e>
        return Processing;
    case ScopeState::Reading16bitRegisters:
        scopeState = ProcessRead16bitRegister(ScopeState::Ready);
   33544:	82 e8       	ldi	r24, 0x82	; 130
   33546:	0f 94 5c 94 	call	0x328b8	; 0x328b8 <MMU2::ProtocolLogic::ProcessRead16bitRegister(MMU2::ProtocolLogic::ScopeState) [clone .constprop.268]>
   3354a:	80 93 95 12 	sts	0x1295, r24	; 0x801295 <MMU2::mmu2+0x3>
        return scopeState == ScopeState::Ready ? Finished : Processing;
   3354e:	82 38       	cpi	r24, 0x82	; 130
   33550:	09 f0       	breq	.+2      	; 0x33554 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x6e4>
   33552:	2d cd       	rjmp	.-1446   	; 0x32fae <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x13e>
   33554:	bc cc       	rjmp	.-1672   	; 0x32ece <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x5e>
    case ScopeState::ButtonSent:
        if (rsp.paramCode == ResponseMsgParamCodes::Accepted) {
   33556:	80 91 ac 12 	lds	r24, 0x12AC	; 0x8012ac <MMU2::mmu2+0x1a>
   3355a:	81 34       	cpi	r24, 0x41	; 65
   3355c:	d1 f6       	brne	.-76     	; 0x33512 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x6a2>
            // Button was accepted, decrement the retry.
            DecrementRetryAttempts();
   3355e:	0f 94 5d 56 	call	0x2acba	; 0x2acba <MMU2::ProtocolLogic::DecrementRetryAttempts() [clone .constprop.269]>
   33562:	d7 cf       	rjmp	.-82     	; 0x33512 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x6a2>
        return ProtocolError;
    }
}

StepStatus ProtocolLogic::CommandStep() {
    switch (scopeState) {
   33564:	88 30       	cpi	r24, 0x08	; 8
   33566:	b1 f0       	breq	.+44     	; 0x33594 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x724>
   33568:	50 f3       	brcs	.-44     	; 0x3353e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x6ce>
   3356a:	8a 30       	cpi	r24, 0x0A	; 10
   3356c:	09 f0       	breq	.+2      	; 0x33570 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x700>
   3356e:	39 cf       	rjmp	.-398    	; 0x333e2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x572>
        return Processing;
    case ScopeState::Reading16bitRegisters:
        scopeState = ProcessRead16bitRegister(ScopeState::Wait);
        return Processing;
    case ScopeState::ButtonSent:
        if (rsp.paramCode == ResponseMsgParamCodes::Accepted) {
   33570:	80 91 ac 12 	lds	r24, 0x12AC	; 0x8012ac <MMU2::mmu2+0x1a>
   33574:	81 34       	cpi	r24, 0x41	; 65
   33576:	09 f0       	breq	.+2      	; 0x3357a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x70a>
   33578:	18 cd       	rjmp	.-1488   	; 0x32faa <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x13a>
            // Button was accepted, decrement the retry.
            DecrementRetryAttempts();
   3357a:	0f 94 5d 56 	call	0x2acba	; 0x2acba <MMU2::ProtocolLogic::DecrementRetryAttempts() [clone .constprop.269]>
   3357e:	15 cd       	rjmp	.-1494   	; 0x32faa <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x13a>
StepStatus ProtocolLogic::CommandStep() {
    switch (scopeState) {
    case ScopeState::CommandSent: {
        switch (rsp.paramCode) { // the response should be either accepted or rejected
        case ResponseMsgParamCodes::Accepted:
            progressCode = ProgressCode::OK;
   33580:	10 92 d4 12 	sts	0x12D4, r1	; 0x8012d4 <MMU2::mmu2+0x42>
            errorCode = ErrorCode::RUNNING;
   33584:	10 92 d3 12 	sts	0x12D3, r1	; 0x8012d3 <MMU2::mmu2+0x41>
   33588:	10 92 d2 12 	sts	0x12D2, r1	; 0x8012d2 <MMU2::mmu2+0x40>
            scopeState = ScopeState::Wait;
   3358c:	81 e8       	ldi	r24, 0x81	; 129
        return Processing;
    case ScopeState::Reading8bitRegisters:
        ProcessRead8bitRegister();
        return Processing;
    case ScopeState::Reading16bitRegisters:
        scopeState = ProcessRead16bitRegister(ScopeState::Wait);
   3358e:	80 93 95 12 	sts	0x1295, r24	; 0x801295 <MMU2::mmu2+0x3>
   33592:	0d cd       	rjmp	.-1510   	; 0x32fae <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x13e>
   33594:	81 e8       	ldi	r24, 0x81	; 129
   33596:	0f 94 5c 94 	call	0x328b8	; 0x328b8 <MMU2::ProtocolLogic::ProcessRead16bitRegister(MMU2::ProtocolLogic::ScopeState) [clone .constprop.268]>
   3359a:	f9 cf       	rjmp	.-14     	; 0x3358e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x71e>
StepStatus ProtocolLogic::Step() {
    if (!ExpectsResponse()) { // if not waiting for a response, activate a planned request immediately
        ActivatePlannedRequest();
    }
    auto currentStatus = ScopeStep();
    switch (currentStatus) {
   3359c:	87 30       	cpi	r24, 0x07	; 7
   3359e:	49 f2       	breq	.-110    	; 0x33532 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x6c2>
   335a0:	08 f4       	brcc	.+2      	; 0x335a4 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x734>
   335a2:	63 ce       	rjmp	.-826    	; 0x3326a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x3fa>
   335a4:	88 30       	cpi	r24, 0x08	; 8
   335a6:	09 f4       	brne	.+2      	; 0x335aa <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x73a>
   335a8:	78 ce       	rjmp	.-784    	; 0x3329a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x42a>
   335aa:	7b cf       	rjmp	.-266    	; 0x334a2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x632>
        // We are ok, switching to Idle if there is no potential next request planned.
        // But the trouble is we must report a finished command if the previous command has just been finished
        // i.e. only try to find some planned command if we just finished the Idle cycle
        if (!ActivatePlannedRequest()) { // if nothing is planned, switch to Idle
            SwitchToIdle();
        } else if (ExpectsResponse()) {
   335ac:	80 91 95 12 	lds	r24, 0x1295	; 0x801295 <MMU2::mmu2+0x3>
   335b0:	87 fd       	sbrc	r24, 7
   335b2:	9a cc       	rjmp	.-1740   	; 0x32ee8 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x78>
   335b4:	fc cc       	rjmp	.-1544   	; 0x32fae <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x13e>
StepStatus MMU2::LogicStep(bool reportErrors) {
    // Process any buttons before proceeding with another MMU Query
    CheckUserInput();

    const StepStatus ss = logic.Step();
    switch (ss) {
   335b6:	13 30       	cpi	r17, 0x03	; 3
   335b8:	09 f4       	brne	.+2      	; 0x335bc <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x74c>
   335ba:	68 c0       	rjmp	.+208    	; 0x3368c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x81c>
   335bc:	1b 30       	cpi	r17, 0x0B	; 11
   335be:	09 f0       	breq	.+2      	; 0x335c2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x752>
   335c0:	80 cf       	rjmp	.-256    	; 0x334c2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x652>
    case Processing:
        OnMMUProgressMsg(logic.Progress());
        break;

    case ButtonPushed:
        lastButton = logic.Button();
   335c2:	80 91 d5 12 	lds	r24, 0x12D5	; 0x8012d5 <MMU2::mmu2+0x43>
   335c6:	80 93 fc 12 	sts	0x12FC, r24	; 0x8012fc <MMU2::mmu2+0x6a>
        LogEchoEvent_P(PSTR("MMU Button pushed"));
   335ca:	8b ef       	ldi	r24, 0xFB	; 251
   335cc:	9e e9       	ldi	r25, 0x9E	; 158
   335ce:	0f 94 fa 50 	call	0x2a1f4	; 0x2a1f4 <MMU2::LogEchoEvent_P(char const*)>
        CheckUserInput(); // Process the button immediately
   335d2:	0f 94 7e 96 	call	0x32cfc	; 0x32cfc <MMU2::MMU2::CheckUserInput() [clone .constprop.175]>
   335d6:	5a c0       	rjmp	.+180    	; 0x3368c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x81c>
    CheckErrorScreenUserInput();
}

void MMU2::CheckFINDARunout() {
    // Check for FINDA filament runout
    if (!FindaDetectsFilament() && check_fsensor()) { // Check if we have filament runout detected from sensors
   335d8:	80 91 d7 12 	lds	r24, 0x12D7	; 0x8012d7 <MMU2::mmu2+0x45>
   335dc:	81 11       	cpse	r24, r1
   335de:	56 c0       	rjmp	.+172    	; 0x3368c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x81c>
    return (eeprom_read_byte((uint8_t*)EEPROM_UVLO) != PowerPanic::NO_PENDING_RECOVERY);
}

// Currently only used in one place, allowed to be inlined
bool check_fsensor() {
    return printJobOngoing()
   335e0:	0e 94 40 66 	call	0xcc80	; 0xcc80 <printJobOngoing()>
        && mcode_in_progress != 600
        && !saved_printing
        && !mesh_bed_leveling_flag
        && !homing_flag
        && e_active();
   335e4:	88 23       	and	r24, r24
   335e6:	09 f4       	brne	.+2      	; 0x335ea <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x77a>
   335e8:	51 c0       	rjmp	.+162    	; 0x3368c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x81c>
}

// Currently only used in one place, allowed to be inlined
bool check_fsensor() {
    return printJobOngoing()
        && mcode_in_progress != 600
   335ea:	80 91 40 0d 	lds	r24, 0x0D40	; 0x800d40 <_ZL17mcode_in_progress.lto_priv.489>
   335ee:	90 91 41 0d 	lds	r25, 0x0D41	; 0x800d41 <_ZL17mcode_in_progress.lto_priv.489+0x1>
   335f2:	88 35       	cpi	r24, 0x58	; 88
   335f4:	92 40       	sbci	r25, 0x02	; 2
   335f6:	09 f4       	brne	.+2      	; 0x335fa <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x78a>
   335f8:	49 c0       	rjmp	.+146    	; 0x3368c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x81c>
        && !saved_printing
   335fa:	80 91 73 12 	lds	r24, 0x1273	; 0x801273 <saved_printing>
   335fe:	81 11       	cpse	r24, r1
   33600:	45 c0       	rjmp	.+138    	; 0x3368c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x81c>
        && !mesh_bed_leveling_flag
   33602:	80 91 72 12 	lds	r24, 0x1272	; 0x801272 <mesh_bed_leveling_flag>
   33606:	81 11       	cpse	r24, r1
   33608:	41 c0       	rjmp	.+130    	; 0x3368c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x81c>
        && !homing_flag
   3360a:	80 91 71 12 	lds	r24, 0x1271	; 0x801271 <homing_flag>
   3360e:	81 11       	cpse	r24, r1
   33610:	3d c0       	rjmp	.+122    	; 0x3368c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x81c>

bool e_active()
{
	unsigned char e_active = 0;
	block_t *block;
  if(block_buffer_tail != block_buffer_head)
   33612:	90 91 3f 0d 	lds	r25, 0x0D3F	; 0x800d3f <block_buffer_tail>
   33616:	80 91 3e 0d 	lds	r24, 0x0D3E	; 0x800d3e <block_buffer_head>
   3361a:	98 17       	cp	r25, r24
   3361c:	b9 f1       	breq	.+110    	; 0x3368c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x81c>
  {
    uint8_t block_index = block_buffer_tail;
   3361e:	80 91 3f 0d 	lds	r24, 0x0D3F	; 0x800d3f <block_buffer_tail>
}
#endif

bool e_active()
{
	unsigned char e_active = 0;
   33622:	90 e0       	ldi	r25, 0x00	; 0
  {
    uint8_t block_index = block_buffer_tail;
    while(block_index != block_buffer_head)
    {
      block = &block_buffer[block_index];
      if(block->steps[E_AXIS].wide != 0) e_active++;
   33624:	2e e6       	ldi	r18, 0x6E	; 110
	unsigned char e_active = 0;
	block_t *block;
  if(block_buffer_tail != block_buffer_head)
  {
    uint8_t block_index = block_buffer_tail;
    while(block_index != block_buffer_head)
   33626:	30 91 3e 0d 	lds	r19, 0x0D3E	; 0x800d3e <block_buffer_head>
   3362a:	38 17       	cp	r19, r24
   3362c:	89 f0       	breq	.+34     	; 0x33650 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x7e0>
    {
      block = &block_buffer[block_index];
      if(block->steps[E_AXIS].wide != 0) e_active++;
   3362e:	28 9f       	mul	r18, r24
   33630:	f0 01       	movw	r30, r0
   33632:	11 24       	eor	r1, r1
   33634:	e2 5a       	subi	r30, 0xA2	; 162
   33636:	f9 4f       	sbci	r31, 0xF9	; 249
   33638:	44 85       	ldd	r20, Z+12	; 0x0c
   3363a:	55 85       	ldd	r21, Z+13	; 0x0d
   3363c:	66 85       	ldd	r22, Z+14	; 0x0e
   3363e:	77 85       	ldd	r23, Z+15	; 0x0f
   33640:	45 2b       	or	r20, r21
   33642:	46 2b       	or	r20, r22
   33644:	47 2b       	or	r20, r23
   33646:	09 f0       	breq	.+2      	; 0x3364a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x7da>
   33648:	9f 5f       	subi	r25, 0xFF	; 255
      block_index = (block_index+1) & (BLOCK_BUFFER_SIZE - 1);
   3364a:	8f 5f       	subi	r24, 0xFF	; 255
   3364c:	8f 70       	andi	r24, 0x0F	; 15
   3364e:	eb cf       	rjmp	.-42     	; 0x33626 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x7b6>
        && e_active();
   33650:	99 23       	and	r25, r25
   33652:	e1 f0       	breq	.+56     	; 0x3368c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x81c>
        SERIAL_ECHOLNPGM("FINDA filament runout!");
   33654:	8c e8       	ldi	r24, 0x8C	; 140
   33656:	9e e9       	ldi	r25, 0x9E	; 158
   33658:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
void marlin_clear_print_state_in_ram() {
    clear_print_state_in_ram();
}

void marlin_stop_and_save_print_to_ram() {
    stop_and_save_print_to_ram(0,0);
   3365c:	60 e0       	ldi	r22, 0x00	; 0
   3365e:	70 e0       	ldi	r23, 0x00	; 0
   33660:	cb 01       	movw	r24, r22
   33662:	0f 94 06 66 	call	0x2cc0c	; 0x2cc0c <stop_and_save_print_to_ram(float, float) [clone .constprop.303]>
        marlin_stop_and_save_print_to_ram();
        restore_print_from_ram_and_continue(0);
   33666:	60 e0       	ldi	r22, 0x00	; 0
   33668:	70 e0       	ldi	r23, 0x00	; 0
   3366a:	cb 01       	movw	r24, r22
   3366c:	0e 94 b8 66 	call	0xcd70	; 0xcd70 <restore_print_from_ram_and_continue(float)>
    }
}

bool SpoolJoin::isSpoolJoinEnabled()
{
    if(eeprom_read_byte((uint8_t*)EEPROM_SPOOL_JOIN) == (uint8_t)EEPROM::Enabled) {
   33670:	86 ed       	ldi	r24, 0xD6	; 214
   33672:	9e e0       	ldi	r25, 0x0E	; 14
   33674:	0f 94 e0 a3 	call	0x347c0	; 0x347c0 <eeprom_read_byte>
   33678:	81 30       	cpi	r24, 0x01	; 1
   3367a:	21 f4       	brne	.+8      	; 0x33684 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x814>
        if (SpoolJoin::spooljoin.isSpoolJoinEnabled() && get_current_tool() != (uint8_t)FILAMENT_UNKNOWN){ // Can't auto if F=?
   3367c:	0f 94 a7 65 	call	0x2cb4e	; 0x2cb4e <MMU2::MMU2::get_current_tool() const [clone .constprop.351]>
   33680:	8f 3f       	cpi	r24, 0xFF	; 255
   33682:	91 f5       	brne	.+100    	; 0x336e8 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x878>
            enquecommand_front_P(PSTR("M600 AUTO")); // save print and run M600 command
        } else {
            enquecommand_front_P(MSG_M600); // save print and run M600 command
   33684:	8e e5       	ldi	r24, 0x5E	; 94
   33686:	9c e6       	ldi	r25, 0x6C	; 108
    if (!FindaDetectsFilament() && check_fsensor()) { // Check if we have filament runout detected from sensors
        SERIAL_ECHOLNPGM("FINDA filament runout!");
        marlin_stop_and_save_print_to_ram();
        restore_print_from_ram_and_continue(0);
        if (SpoolJoin::spooljoin.isSpoolJoinEnabled() && get_current_tool() != (uint8_t)FILAMENT_UNKNOWN){ // Can't auto if F=?
            enquecommand_front_P(PSTR("M600 AUTO")); // save print and run M600 command
   33688:	0f 94 78 67 	call	0x2cef0	; 0x2cef0 <enquecommand_front(char const*, bool) [clone .constprop.294]>
                break;
            }
        }
    }

    if (logic.Running()) {
   3368c:	80 91 af 12 	lds	r24, 0x12AF	; 0x8012af <MMU2::mmu2+0x1d>
   33690:	82 30       	cpi	r24, 0x02	; 2
   33692:	19 f4       	brne	.+6      	; 0x3369a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x82a>
        state = xState::Active;
   33694:	81 e0       	ldi	r24, 0x01	; 1
   33696:	80 93 01 13 	sts	0x1301, r24	; 0x801301 <MMU2::mmu2+0x6f>
    mmu_loop_inner(true);
    avoidRecursion = false;
}

void __attribute__((noinline)) MMU2::mmu_loop_inner(bool reportErrors) {
    logicStepLastStatus = LogicStep(reportErrors); // it looks like the mmu_loop doesn't need to be a blocking call
   3369a:	10 93 00 13 	sts	0x1300, r17	; 0x801300 <MMU2::mmu2+0x6e>
// UI to resolve the error screen, for example tuning Idler Stallguard Threshold
// Set to false to allow the error screen to render again.
static bool putErrorScreenToSleep;

void CheckErrorScreenUserInput() {
    if (is_mmu_error_monitor_active) {
   3369e:	80 91 5c 06 	lds	r24, 0x065C	; 0x80065c <_ZN4MMU2L27is_mmu_error_monitor_activeE.lto_priv.447>
   336a2:	88 23       	and	r24, r24
   336a4:	51 f0       	breq	.+20     	; 0x336ba <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x84a>
bool TuneMenuEntered() {
    return putErrorScreenToSleep;
}

void ReportErrorHook(CommandInProgress /*cip*/, ErrorCode ec, uint8_t /*es*/) {
    if (putErrorScreenToSleep) return;
   336a6:	80 91 43 0d 	lds	r24, 0x0D43	; 0x800d43 <_ZN4MMU2L21putErrorScreenToSleepE.lto_priv.451>
   336aa:	81 11       	cpse	r24, r1
   336ac:	06 c0       	rjmp	.+12     	; 0x336ba <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x84a>
   336ae:	80 91 f9 12 	lds	r24, 0x12F9	; 0x8012f9 <MMU2::mmu2+0x67>
   336b2:	90 91 fa 12 	lds	r25, 0x12FA	; 0x8012fa <MMU2::mmu2+0x68>
   336b6:	0f 94 62 52 	call	0x2a4c4	; 0x2a4c4 <MMU2::ReportErrorHook(MMU2::CommandInProgress, ErrorCode, unsigned char) [clone .part.6]>
    CheckErrorScreenUserInput();
}
   336ba:	a0 96       	adiw	r28, 0x20	; 32
   336bc:	0f b6       	in	r0, 0x3f	; 63
   336be:	f8 94       	cli
   336c0:	de bf       	out	0x3e, r29	; 62
   336c2:	0f be       	out	0x3f, r0	; 63
   336c4:	cd bf       	out	0x3d, r28	; 61
   336c6:	df 91       	pop	r29
   336c8:	cf 91       	pop	r28
   336ca:	1f 91       	pop	r17
   336cc:	0f 91       	pop	r16
   336ce:	ff 90       	pop	r15
   336d0:	ef 90       	pop	r14
   336d2:	df 90       	pop	r13
   336d4:	cf 90       	pop	r12
   336d6:	bf 90       	pop	r11
   336d8:	af 90       	pop	r10
   336da:	9f 90       	pop	r9
   336dc:	8f 90       	pop	r8
   336de:	7f 90       	pop	r7
   336e0:	6f 90       	pop	r6
   336e2:	5f 90       	pop	r5
   336e4:	4f 90       	pop	r4
   336e6:	08 95       	ret
    if (!FindaDetectsFilament() && check_fsensor()) { // Check if we have filament runout detected from sensors
        SERIAL_ECHOLNPGM("FINDA filament runout!");
        marlin_stop_and_save_print_to_ram();
        restore_print_from_ram_and_continue(0);
        if (SpoolJoin::spooljoin.isSpoolJoinEnabled() && get_current_tool() != (uint8_t)FILAMENT_UNKNOWN){ // Can't auto if F=?
            enquecommand_front_P(PSTR("M600 AUTO")); // save print and run M600 command
   336e8:	82 e8       	ldi	r24, 0x82	; 130
   336ea:	9e e9       	ldi	r25, 0x9E	; 158
   336ec:	cd cf       	rjmp	.-102    	; 0x33688 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x818>
   336ee:	00 91 d4 12 	lds	r16, 0x12D4	; 0x8012d4 <MMU2::mmu2+0x42>
    ReportProgressHook((CommandInProgress)logic.CommandInProgress(), pc);
    LogEchoEvent_P(_O(ProgressCodeToText(pc)));
}

void MMU2::OnMMUProgressMsg(ProgressCode pc) {
    if (pc != lastProgressCode) {
   336f2:	80 91 f8 12 	lds	r24, 0x12F8	; 0x8012f8 <MMU2::mmu2+0x66>
   336f6:	08 17       	cp	r16, r24
   336f8:	09 f4       	brne	.+2      	; 0x336fc <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x88c>
   336fa:	49 c0       	rjmp	.+146    	; 0x3378e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x91e>
    // special handling of explicit printer errors
    return IsPrinterError() ? StepStatus::PrinterError : currentStatus;
}

uint8_t ProtocolLogic::CommandInProgress() const {
    if (currentScope != Scope::Command) {
   336fc:	80 91 94 12 	lds	r24, 0x1294	; 0x801294 <MMU2::mmu2+0x2>
   33700:	84 30       	cpi	r24, 0x04	; 4
   33702:	b9 f4       	brne	.+46     	; 0x33732 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x8c2>
        break;
    }
}

void ReportProgressHook(CommandInProgress cip, ProgressCode ec) {
    if (cip != CommandInProgress::NoCommand) {
   33704:	80 91 97 12 	lds	r24, 0x1297	; 0x801297 <MMU2::mmu2+0x5>
   33708:	88 23       	and	r24, r24
   3370a:	99 f0       	breq	.+38     	; 0x33732 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x8c2>
        custom_message_type = CustomMsg::MMUProgress;
   3370c:	89 e0       	ldi	r24, 0x09	; 9
   3370e:	80 93 5d 06 	sts	0x065D, r24	; 0x80065d <custom_message_type>
        : static_cast<const char *>(pgm_read_ptr(&progressTexts[0]));
   33712:	e8 e4       	ldi	r30, 0x48	; 72
   33714:	fe e9       	ldi	r31, 0x9E	; 158
};

const char *ProgressCodeToText(ProgressCode pc) {
    // @@TODO ?? a better fallback option?
    return ((uint16_t)pc <= (sizeof(progressTexts) / sizeof(progressTexts[0])))
        ? static_cast<const char *>(pgm_read_ptr(&progressTexts[(uint16_t)pc]))
   33716:	0e 31       	cpi	r16, 0x1E	; 30
   33718:	30 f4       	brcc	.+12     	; 0x33726 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x8b6>
   3371a:	e0 2f       	mov	r30, r16
   3371c:	f0 e0       	ldi	r31, 0x00	; 0
   3371e:	ee 0f       	add	r30, r30
   33720:	ff 1f       	adc	r31, r31
   33722:	e8 5b       	subi	r30, 0xB8	; 184
   33724:	f1 46       	sbci	r31, 0x61	; 97
        : static_cast<const char *>(pgm_read_ptr(&progressTexts[0]));
   33726:	85 91       	lpm	r24, Z+
   33728:	94 91       	lpm	r25, Z
        lcd_setstatuspgm( _T(ProgressCodeToText(ec)) );
   3372a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   3372e:	0e 94 94 de 	call	0x1bd28	; 0x1bd28 <lcd_setstatuspgm(char const*)>
   33732:	e8 e4       	ldi	r30, 0x48	; 72
   33734:	fe e9       	ldi	r31, 0x9E	; 158
};

const char *ProgressCodeToText(ProgressCode pc) {
    // @@TODO ?? a better fallback option?
    return ((uint16_t)pc <= (sizeof(progressTexts) / sizeof(progressTexts[0])))
        ? static_cast<const char *>(pgm_read_ptr(&progressTexts[(uint16_t)pc]))
   33736:	0e 31       	cpi	r16, 0x1E	; 30
   33738:	30 f4       	brcc	.+12     	; 0x33746 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x8d6>
   3373a:	e0 2f       	mov	r30, r16
   3373c:	f0 e0       	ldi	r31, 0x00	; 0
   3373e:	ee 0f       	add	r30, r30
   33740:	ff 1f       	adc	r31, r31
   33742:	e8 5b       	subi	r30, 0xB8	; 184
   33744:	f1 46       	sbci	r31, 0x61	; 97
        : static_cast<const char *>(pgm_read_ptr(&progressTexts[0]));
   33746:	85 91       	lpm	r24, Z+
   33748:	94 91       	lpm	r25, Z
        "MMU2 logging prefix mismatch, must be updated at various spots");
}

void MMU2::ReportProgress(ProgressCode pc) {
    ReportProgressHook((CommandInProgress)logic.CommandInProgress(), pc);
    LogEchoEvent_P(_O(ProgressCodeToText(pc)));
   3374a:	02 96       	adiw	r24, 0x02	; 2
   3374c:	0f 94 fa 50 	call	0x2a1f4	; 0x2a1f4 <MMU2::LogEchoEvent_P(char const*)>
    }
}

void MMU2::OnMMUProgressMsgChanged(ProgressCode pc) {
    ReportProgress(pc);
    lastProgressCode = pc;
   33750:	00 93 f8 12 	sts	0x12F8, r16	; 0x8012f8 <MMU2::mmu2+0x66>
    switch (pc) {
   33754:	03 30       	cpi	r16, 0x03	; 3
   33756:	49 f0       	breq	.+18     	; 0x3376a <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x8fa>
   33758:	0c 31       	cpi	r16, 0x1C	; 28
   3375a:	09 f0       	breq	.+2      	; 0x3375e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x8ee>
   3375c:	97 cf       	rjmp	.-210    	; 0x3368c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x81c>
bool planner_draining() {
    return planner_aborted;
}

void planner_synchronize() {
    st_synchronize();
   3375e:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
        }
        break;
    case ProgressCode::FeedingToFSensor:
        // prepare for the movement of the E-motor
        planner_synchronize();
        loadFilamentStarted = true;
   33762:	81 e0       	ldi	r24, 0x01	; 1
   33764:	80 93 03 13 	sts	0x1303, r24	; 0x801303 <MMU2::mmu2+0x71>
   33768:	91 cf       	rjmp	.-222    	; 0x3368c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x81c>
   3376a:	80 91 94 12 	lds	r24, 0x1294	; 0x801294 <MMU2::mmu2+0x2>
   3376e:	84 30       	cpi	r24, 0x04	; 4
   33770:	31 f4       	brne	.+12     	; 0x3377e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x90e>
    ReportProgress(pc);
    lastProgressCode = pc;
    switch (pc) {
    case ProgressCode::UnloadingToFinda:
        if ((CommandInProgress)logic.CommandInProgress() == CommandInProgress::UnloadFilament
            || ((CommandInProgress)logic.CommandInProgress() == CommandInProgress::ToolChange)) {
   33772:	80 91 97 12 	lds	r24, 0x1297	; 0x801297 <MMU2::mmu2+0x5>
   33776:	84 55       	subi	r24, 0x54	; 84
   33778:	82 30       	cpi	r24, 0x02	; 2
   3377a:	08 f4       	brcc	.+2      	; 0x3377e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x90e>
   3377c:	87 cf       	rjmp	.-242    	; 0x3368c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x81c>
   3377e:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
            // If printing is not in progress, ToolChange will issue a U0 command.
            break;
        } else {
            // We're likely recovering from an MMU error
            planner_synchronize();
            unloadFilamentStarted = true;
   33782:	81 e0       	ldi	r24, 0x01	; 1
   33784:	80 93 04 13 	sts	0x1304, r24	; 0x801304 <MMU2::mmu2+0x72>
        if (unloadFilamentStarted && !planner_any_moves()) { // Only plan a move if there is no move ongoing
            switch (WhereIsFilament()) {
            case FilamentState::AT_FSENSOR:
            case FilamentState::IN_NOZZLE:
            case FilamentState::UNAVAILABLE: // actually Unavailable makes sense as well to start the E-move to release the filament from the gears
                HelpUnloadToFinda();
   33788:	0f 94 08 5b 	call	0x2b610	; 0x2b610 <MMU2::MMU2::HelpUnloadToFinda() [clone .constprop.179]>
   3378c:	7f cf       	rjmp	.-258    	; 0x3368c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x81c>
void __attribute__((noinline)) MMU2::HelpUnloadToFinda() {
    extruder_move(-MMU2_RETRY_UNLOAD_TO_FINDA_LENGTH, MMU2_RETRY_UNLOAD_TO_FINDA_FEED_RATE);
}

void MMU2::OnMMUProgressMsgSame(ProgressCode pc) {
    switch (pc) {
   3378e:	03 30       	cpi	r16, 0x03	; 3
   33790:	71 f1       	breq	.+92     	; 0x337ee <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x97e>
   33792:	0c 31       	cpi	r16, 0x1C	; 28
   33794:	09 f0       	breq	.+2      	; 0x33798 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x928>
   33796:	7a cf       	rjmp	.-268    	; 0x3368c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x81c>
                unloadFilamentStarted = false;
            }
        }
        break;
    case ProgressCode::FeedingToFSensor:
        if (loadFilamentStarted) {
   33798:	80 91 03 13 	lds	r24, 0x1303	; 0x801303 <MMU2::mmu2+0x71>
   3379c:	88 23       	and	r24, r24
   3379e:	09 f4       	brne	.+2      	; 0x337a2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x932>
   337a0:	75 cf       	rjmp	.-278    	; 0x3368c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x81c>
            switch (WhereIsFilament()) {
   337a2:	0f 94 0a 51 	call	0x2a214	; 0x2a214 <MMU2::WhereIsFilament()>
   337a6:	88 23       	and	r24, r24
   337a8:	b1 f1       	breq	.+108    	; 0x33816 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x9a6>
   337aa:	81 30       	cpi	r24, 0x01	; 1
   337ac:	09 f0       	breq	.+2      	; 0x337b0 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x940>
   337ae:	6e cf       	rjmp	.-292    	; 0x3368c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x81c>
            case FilamentState::AT_FSENSOR:
                // fsensor triggered, finish FeedingToExtruder state
                loadFilamentStarted = false;
   337b0:	10 92 03 13 	sts	0x1303, r1	; 0x801303 <MMU2::mmu2+0x71>
float move_raise_z(float delta) {
    return raise_z(delta);
}

void planner_abort_queued_moves() {
    planner_abort_hard();
   337b4:	0f 94 fb 4e 	call	0x29df6	; 0x29df6 <planner_abort_hard()>
    // Unblock the planner. This should be safe in the
    // toolchange context. Currently we are mainly aborting
    // excess E-moves after detecting filament during toolchange.
    // If a MMU error is reported, the planner must be unblocked
    // as well so the extruder can be parked safely.
    planner_aborted = false;
   337b8:	10 92 42 0d 	sts	0x0D42, r1	; 0x800d42 <planner_aborted>
                planner_abort_queued_moves();
                {
                    extruder_move(logic.ExtraLoadDistance() + 2, logic.PulleySlowFeedRate());
   337bc:	60 91 df 12 	lds	r22, 0x12DF	; 0x8012df <MMU2::mmu2+0x4d>
   337c0:	70 e0       	ldi	r23, 0x00	; 0
   337c2:	90 e0       	ldi	r25, 0x00	; 0
   337c4:	80 e0       	ldi	r24, 0x00	; 0
   337c6:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   337ca:	6b 01       	movw	r12, r22
   337cc:	7c 01       	movw	r14, r24
   337ce:	60 91 de 12 	lds	r22, 0x12DE	; 0x8012de <MMU2::mmu2+0x4c>
   337d2:	70 e0       	ldi	r23, 0x00	; 0
   337d4:	6e 5f       	subi	r22, 0xFE	; 254
   337d6:	7f 4f       	sbci	r23, 0xFF	; 255
   337d8:	07 2e       	mov	r0, r23
   337da:	00 0c       	add	r0, r0
   337dc:	88 0b       	sbc	r24, r24
   337de:	99 0b       	sbc	r25, r25
   337e0:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   337e4:	a7 01       	movw	r20, r14
   337e6:	96 01       	movw	r18, r12
                    // Plan a very long move, where 'very long' is hundreds
                    // of millimeters. Keep in mind though the move can't be much longer
                    // than 450mm because the firmware will ignore too long extrusions
                    // for safety reasons. See PREVENT_LENGTHY_EXTRUDE.
                    // Use 350mm to be safely away from the prevention threshold
                    extruder_move(350.0f, logic.PulleySlowFeedRate());
   337e8:	0f 94 d6 50 	call	0x2a1ac	; 0x2a1ac <MMU2::extruder_move(float, float)>
   337ec:	4f cf       	rjmp	.-354    	; 0x3368c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x81c>
}

void MMU2::OnMMUProgressMsgSame(ProgressCode pc) {
    switch (pc) {
    case ProgressCode::UnloadingToFinda:
        if (unloadFilamentStarted && !planner_any_moves()) { // Only plan a move if there is no move ongoing
   337ee:	80 91 04 13 	lds	r24, 0x1304	; 0x801304 <MMU2::mmu2+0x72>
   337f2:	88 23       	and	r24, r24
   337f4:	09 f4       	brne	.+2      	; 0x337f8 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x988>
   337f6:	4a cf       	rjmp	.-364    	; 0x3368c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x81c>
  return(block);
}

// Returns true if the buffer has a queued block, false otherwise
FORCE_INLINE bool blocks_queued() {
	return (block_buffer_head != block_buffer_tail);
   337f8:	90 91 3e 0d 	lds	r25, 0x0D3E	; 0x800d3e <block_buffer_head>
   337fc:	80 91 3f 0d 	lds	r24, 0x0D3F	; 0x800d3f <block_buffer_tail>
   33800:	98 13       	cpse	r25, r24
   33802:	44 cf       	rjmp	.-376    	; 0x3368c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x81c>
            switch (WhereIsFilament()) {
   33804:	0f 94 0a 51 	call	0x2a214	; 0x2a214 <MMU2::WhereIsFilament()>
   33808:	81 50       	subi	r24, 0x01	; 1
   3380a:	83 30       	cpi	r24, 0x03	; 3
   3380c:	08 f4       	brcc	.+2      	; 0x33810 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x9a0>
   3380e:	bc cf       	rjmp	.-136    	; 0x33788 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x918>
            case FilamentState::IN_NOZZLE:
            case FilamentState::UNAVAILABLE: // actually Unavailable makes sense as well to start the E-move to release the filament from the gears
                HelpUnloadToFinda();
                break;
            default:
                unloadFilamentStarted = false;
   33810:	10 92 04 13 	sts	0x1304, r1	; 0x801304 <MMU2::mmu2+0x72>
   33814:	3b cf       	rjmp	.-394    	; 0x3368c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x81c>
   33816:	90 91 3e 0d 	lds	r25, 0x0D3E	; 0x800d3e <block_buffer_head>
   3381a:	80 91 3f 0d 	lds	r24, 0x0D3F	; 0x800d3f <block_buffer_tail>
                    extruder_move(logic.ExtraLoadDistance() + 2, logic.PulleySlowFeedRate());
                }
                break;
            case FilamentState::NOT_PRESENT:
                // fsensor not triggered, continue moving extruder
                if (!planner_any_moves()) { // Only plan a move if there is no move ongoing
   3381e:	98 13       	cpse	r25, r24
   33820:	35 cf       	rjmp	.-406    	; 0x3368c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x81c>
                    // Plan a very long move, where 'very long' is hundreds
                    // of millimeters. Keep in mind though the move can't be much longer
                    // than 450mm because the firmware will ignore too long extrusions
                    // for safety reasons. See PREVENT_LENGTHY_EXTRUDE.
                    // Use 350mm to be safely away from the prevention threshold
                    extruder_move(350.0f, logic.PulleySlowFeedRate());
   33822:	60 91 df 12 	lds	r22, 0x12DF	; 0x8012df <MMU2::mmu2+0x4d>
   33826:	70 e0       	ldi	r23, 0x00	; 0
   33828:	90 e0       	ldi	r25, 0x00	; 0
   3382a:	80 e0       	ldi	r24, 0x00	; 0
   3382c:	0f 94 6c 9e 	call	0x33cd8	; 0x33cd8 <__floatunsisf>
   33830:	9b 01       	movw	r18, r22
   33832:	ac 01       	movw	r20, r24
   33834:	60 e0       	ldi	r22, 0x00	; 0
   33836:	70 e0       	ldi	r23, 0x00	; 0
   33838:	8f ea       	ldi	r24, 0xAF	; 175
   3383a:	93 e4       	ldi	r25, 0x43	; 67
   3383c:	d5 cf       	rjmp	.-86     	; 0x337e8 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x978>
        // can be silently handed over to a higher layer, no processing necessary at this spot
        break;

    default:
        if (reportErrors) {
            switch (ss) {
   3383e:	18 30       	cpi	r17, 0x08	; 8
   33840:	b9 f0       	breq	.+46     	; 0x33870 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0xa00>
   33842:	19 30       	cpi	r17, 0x09	; 9
   33844:	09 f0       	breq	.+2      	; 0x33848 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x9d8>
   33846:	22 cf       	rjmp	.-444    	; 0x3368c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x81c>
                StopKeepPowered();
                ReportError(ErrorCode::VERSION_MISMATCH, ErrorSourcePrinter);
                break;

            case PrinterError:
                ReportError(logic.PrinterError(), ErrorSourcePrinter);
   33848:	60 e0       	ldi	r22, 0x00	; 0
   3384a:	0f 94 97 75 	call	0x2eb2e	; 0x2eb2e <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.174]>
   3384e:	19 e0       	ldi	r17, 0x09	; 9
   33850:	1d cf       	rjmp	.-454    	; 0x3368c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x81c>
    default:
        if (reportErrors) {
            switch (ss) {

            case CommandError:
                ReportError(logic.Error(), ErrorSourceMMU);
   33852:	61 e0       	ldi	r22, 0x01	; 1
   33854:	80 91 d2 12 	lds	r24, 0x12D2	; 0x8012d2 <MMU2::mmu2+0x40>
   33858:	90 91 d3 12 	lds	r25, 0x12D3	; 0x8012d3 <MMU2::mmu2+0x41>
                ReportError(ErrorCode::PROTOCOL_ERROR, ErrorSourcePrinter);
                break;

            case VersionMismatch:
                StopKeepPowered();
                ReportError(ErrorCode::VERSION_MISMATCH, ErrorSourcePrinter);
   3385c:	0f 94 97 75 	call	0x2eb2e	; 0x2eb2e <MMU2::MMU2::ReportError(ErrorCode, MMU2::MMU2::ErrorSource) [clone .constprop.174]>
   33860:	15 cf       	rjmp	.-470    	; 0x3368c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x81c>
            case CommandError:
                ReportError(logic.Error(), ErrorSourceMMU);
                break;

            case CommunicationTimeout:
                state = xState::Connecting;
   33862:	82 e0       	ldi	r24, 0x02	; 2
   33864:	80 93 01 13 	sts	0x1301, r24	; 0x801301 <MMU2::mmu2+0x6f>
                ReportError(ErrorCode::MMU_NOT_RESPONDING, ErrorSourcePrinter);
   33868:	60 e0       	ldi	r22, 0x00	; 0
   3386a:	8e e2       	ldi	r24, 0x2E	; 46
   3386c:	90 e8       	ldi	r25, 0x80	; 128
   3386e:	f6 cf       	rjmp	.-20     	; 0x3385c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x9ec>
    StopKeepPowered();
    PowerOff();
}

void MMU2::StopKeepPowered() {
    state = xState::Stopped;
   33870:	10 92 01 13 	sts	0x1301, r1	; 0x801301 <MMU2::mmu2+0x6f>
    protocol.ResetResponseDecoder(); // important - finished delayed restart relies on this
    StartSeqRestart();
}

void ProtocolLogic::Stop() {
    state = State::Stopped;
   33874:	10 92 af 12 	sts	0x12AF, r1	; 0x8012af <MMU2::mmu2+0x1d>
    currentScope = Scope::Stopped;
   33878:	10 92 94 12 	sts	0x1294, r1	; 0x801294 <MMU2::mmu2+0x2>
                ReportError(ErrorCode::PROTOCOL_ERROR, ErrorSourcePrinter);
                break;

            case VersionMismatch:
                StopKeepPowered();
                ReportError(ErrorCode::VERSION_MISMATCH, ErrorSourcePrinter);
   3387c:	60 e0       	ldi	r22, 0x00	; 0
   3387e:	8c e2       	ldi	r24, 0x2C	; 44
   33880:	90 e8       	ldi	r25, 0x80	; 128
   33882:	ec cf       	rjmp	.-40     	; 0x3385c <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x9ec>
                break;
            }
        }
            [[fallthrough]]; // otherwise
        default:
            RecordUARTActivity(); // something has happened on the UART, update the timeout record
   33884:	0f 94 52 56 	call	0x2aca4	; 0x2aca4 <MMU2::ProtocolLogic::RecordUARTActivity() [clone .constprop.338]>
   33888:	ac cd       	rjmp	.-1192   	; 0x333e2 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x572>
    case Interrupted:
        // can be silently handed over to a higher layer, no processing necessary at this spot
        break;

    default:
        if (reportErrors) {
   3388a:	00 23       	and	r16, r16
   3388c:	01 f3       	breq	.-64     	; 0x3384e <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x9de>
   3388e:	dc cf       	rjmp	.-72     	; 0x33848 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]+0x9d8>

00033890 <MMU2::MMU2::ResumeHotendTemp() [clone .constprop.180]>:
        }
    }
}

void MMU2::ResumeHotendTemp() {
    if ((mmu_print_saved & SavedState::CooldownPending)) {
   33890:	80 91 02 13 	lds	r24, 0x1302	; 0x801302 <MMU2::mmu2+0x70>
   33894:	82 ff       	sbrs	r24, 2
   33896:	07 c0       	rjmp	.+14     	; 0x338a6 <MMU2::MMU2::ResumeHotendTemp() [clone .constprop.180]+0x16>
        // Clear the "pending" flag if we haven't cooled yet.
        mmu_print_saved &= ~(SavedState::CooldownPending);
   33898:	8b 7f       	andi	r24, 0xFB	; 251
   3389a:	80 93 02 13 	sts	0x1302, r24	; 0x801302 <MMU2::mmu2+0x70>
        LogEchoEvent_P(PSTR("Cooldown flag cleared"));
   3389e:	89 ee       	ldi	r24, 0xE9	; 233
   338a0:	9f e9       	ldi	r25, 0x9F	; 159
   338a2:	0f 94 fa 50 	call	0x2a1f4	; 0x2a1f4 <MMU2::LogEchoEvent_P(char const*)>
    }
    if ((mmu_print_saved & SavedState::Cooldown) && resume_hotend_temp) {
   338a6:	80 91 02 13 	lds	r24, 0x1302	; 0x801302 <MMU2::mmu2+0x70>
   338aa:	81 ff       	sbrs	r24, 1
   338ac:	52 c0       	rjmp	.+164    	; 0x33952 <MMU2::MMU2::ResumeHotendTemp() [clone .constprop.180]+0xc2>
   338ae:	80 91 f6 12 	lds	r24, 0x12F6	; 0x8012f6 <MMU2::mmu2+0x64>
   338b2:	90 91 f7 12 	lds	r25, 0x12F7	; 0x8012f7 <MMU2::mmu2+0x65>
   338b6:	89 2b       	or	r24, r25
   338b8:	09 f4       	brne	.+2      	; 0x338bc <MMU2::MMU2::ResumeHotendTemp() [clone .constprop.180]+0x2c>
   338ba:	4b c0       	rjmp	.+150    	; 0x33952 <MMU2::MMU2::ResumeHotendTemp() [clone .constprop.180]+0xc2>
        LogEchoEvent_P(PSTR("Resuming Temp"));
   338bc:	8b ed       	ldi	r24, 0xDB	; 219
   338be:	9f e9       	ldi	r25, 0x9F	; 159
   338c0:	0f 94 fa 50 	call	0x2a1f4	; 0x2a1f4 <MMU2::LogEchoEvent_P(char const*)>
        // @@TODO MMU2_ECHO_MSGRPGM(PSTR("Restoring hotend temperature "));
        SERIAL_ECHOLN(resume_hotend_temp);
   338c4:	80 91 f6 12 	lds	r24, 0x12F6	; 0x8012f6 <MMU2::mmu2+0x64>
   338c8:	90 91 f7 12 	lds	r25, 0x12F7	; 0x8012f7 <MMU2::mmu2+0x65>
   338cc:	0f 94 bf 65 	call	0x2cb7e	; 0x2cb7e <MarlinSerial::println(int, int) [clone .constprop.319]>
        mmu_print_saved &= ~(SavedState::Cooldown);
   338d0:	80 91 02 13 	lds	r24, 0x1302	; 0x801302 <MMU2::mmu2+0x70>
   338d4:	8d 7f       	andi	r24, 0xFD	; 253
   338d6:	80 93 02 13 	sts	0x1302, r24	; 0x801302 <MMU2::mmu2+0x70>
  return target_temperature_bed;
};

// Doesn't save FLASH when FORCE_INLINE removed.
FORCE_INLINE void setTargetHotend(const float &celsius) {
  target_temperature[0] = celsius;
   338da:	80 91 f6 12 	lds	r24, 0x12F6	; 0x8012f6 <MMU2::mmu2+0x64>
   338de:	90 91 f7 12 	lds	r25, 0x12F7	; 0x8012f7 <MMU2::mmu2+0x65>
   338e2:	90 93 5e 12 	sts	0x125E, r25	; 0x80125e <target_temperature+0x1>
   338e6:	80 93 5d 12 	sts	0x125D, r24	; 0x80125d <target_temperature>
void FullScreenMsgLoad(uint8_t slot){
    FullScreenMsg(_T(MSG_LOADING_FILAMENT), slot);
}

void FullScreenMsgRestoringTemperature(){
    lcd_display_message_fullscreen_P(_T(MSG_MMU_RESTORE_TEMP));
   338ea:	80 e0       	ldi	r24, 0x00	; 0
   338ec:	92 e6       	ldi	r25, 0x62	; 98
   338ee:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   338f2:	0e 94 a9 e0 	call	0x1c152	; 0x1c152 <lcd_display_message_fullscreen_P(char const*)>
    lcd_show_choices_prompt_P(two_choices ? LCD_LEFT_BUTTON_CHOICE : LCD_MIDDLE_BUTTON_CHOICE, _T(PrusaErrorButtonTitle(button_op_middle)), two_choices ? PrusaErrorButtonMore() : _T(PrusaErrorButtonTitle(button_op_right)), two_choices ? 18 : 9, two_choices ? nullptr : PrusaErrorButtonMore());
}

void ReportErrorHookSensorLineRender(){
    // Render static characters in third line
    lcd_puts_at_P(0, 2, PSTR("FI:  FS:    >  " LCD_STR_THERMOMETER "   " LCD_STR_DEGREE));
   338f6:	4b ea       	ldi	r20, 0xAB	; 171
   338f8:	5f e9       	ldi	r21, 0x9F	; 159
   338fa:	62 e0       	ldi	r22, 0x02	; 2
   338fc:	80 e0       	ldi	r24, 0x00	; 0
   338fe:	0e 94 07 70 	call	0xe00e	; 0xe00e <lcd_puts_at_P(unsigned char, unsigned char, char const*)>
int16_t thermal_degTargetHotend() {
    return degTargetHotend(0);
}

int16_t thermal_degHotend() {
    return degHotend(0);
   33902:	60 91 5a 0d 	lds	r22, 0x0D5A	; 0x800d5a <current_temperature>
   33906:	70 91 5b 0d 	lds	r23, 0x0D5B	; 0x800d5b <current_temperature+0x1>
   3390a:	80 91 5c 0d 	lds	r24, 0x0D5C	; 0x800d5c <current_temperature+0x2>
   3390e:	90 91 5d 0d 	lds	r25, 0x0D5D	; 0x800d5d <current_temperature+0x3>
   33912:	0f 94 79 a6 	call	0x34cf2	; 0x34cf2 <__fixsfsi>

namespace MMU2 {

template <typename F>
void waitForHotendTargetTemp(uint16_t delay, F f) {
    while (((thermal_degTargetHotend() - thermal_degHotend()) > 5)) {
   33916:	20 91 5d 12 	lds	r18, 0x125D	; 0x80125d <target_temperature>
   3391a:	30 91 5e 12 	lds	r19, 0x125E	; 0x80125e <target_temperature+0x1>
   3391e:	c9 01       	movw	r24, r18
   33920:	86 1b       	sub	r24, r22
   33922:	97 0b       	sbc	r25, r23
   33924:	06 97       	sbiw	r24, 0x06	; 6
   33926:	6c f0       	brlt	.+26     	; 0x33942 <MMU2::MMU2::ResumeHotendTemp() [clone .constprop.180]+0xb2>
void marlin_manage_heater() {
    manage_heater();
}

void marlin_manage_inactivity(bool ignore_stepper_queue) {
    manage_inactivity(ignore_stepper_queue);
   33928:	81 e0       	ldi	r24, 0x01	; 1
   3392a:	0e 94 34 8c 	call	0x11868	; 0x11868 <manage_inactivity(bool)>
        FullScreenMsgRestoringTemperature();
        //@todo better report the event and let the GUI do its work somewhere else
        ReportErrorHookSensorLineRender();
        waitForHotendTargetTemp(100, [] {
            marlin_manage_inactivity(true);
            mmu2.mmu_loop_inner(false);
   3392e:	80 e0       	ldi	r24, 0x00	; 0
   33930:	0f 94 38 97 	call	0x32e70	; 0x32e70 <MMU2::MMU2::mmu_loop_inner(bool) [clone .constprop.171]>
            ReportErrorHookDynamicRender();
   33934:	0f 94 30 50 	call	0x2a060	; 0x2a060 <MMU2::ReportErrorHookDynamicRender()>
void thermal_setTargetHotend(int16_t t) {
    setTargetHotend(t);
}

void safe_delay_keep_alive(uint16_t t) {
    delay_keep_alive(t);
   33938:	84 e6       	ldi	r24, 0x64	; 100
   3393a:	90 e0       	ldi	r25, 0x00	; 0
   3393c:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
   33940:	e0 cf       	rjmp	.-64     	; 0x33902 <MMU2::MMU2::ResumeHotendTemp() [clone .constprop.180]+0x72>
        });
        ScreenUpdateEnable(); // temporary hack to stop this locking the printer...
   33942:	0f 94 06 50 	call	0x2a00c	; 0x2a00c <MMU2::ScreenUpdateEnable()>
        LogEchoEvent_P(PSTR("Hotend temperature reached"));
   33946:	80 ec       	ldi	r24, 0xC0	; 192
   33948:	9f e9       	ldi	r25, 0x9F	; 159
   3394a:	0f 94 fa 50 	call	0x2a1f4	; 0x2a1f4 <MMU2::LogEchoEvent_P(char const*)>
void ScreenUpdateEnable(){
    lcd_update_enable(true);
}

void ScreenClear(){
    lcd_clear();
   3394e:	0c 94 26 70 	jmp	0xe04c	; 0xe04c <lcd_clear()>
        ScreenClear();
    }
}
   33952:	08 95       	ret

00033954 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]>:
/// just to verify the result of an issued command (which was basically the original idea)
///
/// It is closely related to mmu_loop() (which corresponds to our ProtocolLogic::Step()), which does NOT perform any blocking wait for a command to finish.
/// But - in case of an error, the command is not yet finished, but we must react accordingly - move the printhead elsewhere, stop heating, eat a cat or so.
/// That's what's being done here...
bool MMU2::manage_response(const bool move_axes, const bool turn_off_nozzle) {
   33954:	0f 93       	push	r16
   33956:	1f 93       	push	r17
   33958:	cf 93       	push	r28
   3395a:	df 93       	push	r29
   3395c:	00 d0       	rcall	.+0      	; 0x3395e <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]+0xa>
   3395e:	1f 92       	push	r1
   33960:	1f 92       	push	r1
   33962:	cd b7       	in	r28, 0x3d	; 61
   33964:	de b7       	in	r29, 0x3e	; 62
   33966:	18 2f       	mov	r17, r24
   33968:	06 2f       	mov	r16, r22
    mmu_print_saved = SavedState::None;
   3396a:	10 92 02 13 	sts	0x1302, r1	; 0x801302 <MMU2::mmu2+0x70>

    MARLIN_KEEPALIVE_STATE_IN_PROCESS;
   3396e:	83 e0       	ldi	r24, 0x03	; 3
   33970:	80 93 78 02 	sts	0x0278, r24	; 0x800278 <busy_state>

    LongTimer nozzleTimeout;
   33974:	19 82       	std	Y+1, r1	; 0x01
   33976:	1a 82       	std	Y+2, r1	; 0x02
   33978:	1b 82       	std	Y+3, r1	; 0x03
   3397a:	1c 82       	std	Y+4, r1	; 0x04
   3397c:	1d 82       	std	Y+5, r1	; 0x05
   3397e:	90 e0       	ldi	r25, 0x00	; 0
   33980:	80 e0       	ldi	r24, 0x00	; 0
   33982:	0e 94 8e 8e 	call	0x11d1c	; 0x11d1c <delay_keep_alive(unsigned int)>
        // - failed -> then do the safety moves on the printer like before
        // - finished ok -> proceed with reading other commands
        safe_delay_keep_alive(0); // calls LogicStep() and remembers its return status
                                 // also disables stepper motor unlocking

        if (mmu_print_saved & SavedState::CooldownPending) {
   33986:	90 91 02 13 	lds	r25, 0x1302	; 0x801302 <MMU2::mmu2+0x70>
   3398a:	89 81       	ldd	r24, Y+1	; 0x01
   3398c:	92 ff       	sbrs	r25, 2
   3398e:	37 c0       	rjmp	.+110    	; 0x339fe <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]+0xaa>
            if (!nozzleTimeout.running()) {
   33990:	81 11       	cpse	r24, r1
   33992:	1e c0       	rjmp	.+60     	; 0x339d0 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]+0x7c>
                nozzleTimeout.start();
   33994:	ce 01       	movw	r24, r28
   33996:	01 96       	adiw	r24, 0x01	; 1
   33998:	0f 94 47 10 	call	0x2208e	; 0x2208e <Timer<unsigned long>::start()>
                LogEchoEvent_P(PSTR("Cooling Timeout started"));
   3399c:	82 ed       	ldi	r24, 0xD2	; 210
   3399e:	9d e9       	ldi	r25, 0x9D	; 157
                thermal_setTargetHotend(0);
                LogEchoEvent_P(PSTR("Heater cooldown"));
            }
        } else if (nozzleTimeout.running()) {
            nozzleTimeout.stop();
            LogEchoEvent_P(PSTR("Cooling timer stopped"));
   339a0:	0f 94 fa 50 	call	0x2a1f4	; 0x2a1f4 <MMU2::LogEchoEvent_P(char const*)>
        }

        switch (logicStepLastStatus) {
   339a4:	e0 91 00 13 	lds	r30, 0x1300	; 0x801300 <MMU2::mmu2+0x6e>
   339a8:	e2 50       	subi	r30, 0x02	; 2
   339aa:	ea 30       	cpi	r30, 0x0A	; 10
   339ac:	40 f7       	brcc	.-48     	; 0x3397e <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]+0x2a>
   339ae:	f0 e0       	ldi	r31, 0x00	; 0
   339b0:	88 27       	eor	r24, r24
   339b2:	e2 52       	subi	r30, 0x22	; 34
   339b4:	f3 46       	sbci	r31, 0x63	; 99
   339b6:	8e 4f       	sbci	r24, 0xFE	; 254
   339b8:	0d 94 f0 a4 	jmp	0x349e0	; 0x349e0 <__tablejump2__>
   339bc:	22 37       	cpi	r18, 0x72	; 114
   339be:	1e 38       	cpi	r17, 0x8E	; 142
   339c0:	a2 38       	cpi	r26, 0x82	; 130
   339c2:	a2 38       	cpi	r26, 0x82	; 130
   339c4:	72 38       	cpi	r23, 0x82	; 130
   339c6:	a2 38       	cpi	r26, 0x82	; 130
   339c8:	48 37       	cpi	r20, 0x78	; 120
   339ca:	c4 37       	cpi	r28, 0x74	; 116
   339cc:	1a 38       	cpi	r17, 0x8A	; 138
   339ce:	a2 38       	cpi	r26, 0x82	; 130

        if (mmu_print_saved & SavedState::CooldownPending) {
            if (!nozzleTimeout.running()) {
                nozzleTimeout.start();
                LogEchoEvent_P(PSTR("Cooling Timeout started"));
            } else if (nozzleTimeout.expired(DEFAULT_SAFETYTIMER_TIME_MINS * 60 * 1000ul)) { // mins->msec.
   339d0:	40 e4       	ldi	r20, 0x40	; 64
   339d2:	57 e7       	ldi	r21, 0x77	; 119
   339d4:	6b e1       	ldi	r22, 0x1B	; 27
   339d6:	70 e0       	ldi	r23, 0x00	; 0
   339d8:	ce 01       	movw	r24, r28
   339da:	01 96       	adiw	r24, 0x01	; 1
   339dc:	0f 94 88 0e 	call	0x21d10	; 0x21d10 <Timer<unsigned long>::expired(unsigned long)>
   339e0:	88 23       	and	r24, r24
   339e2:	01 f3       	breq	.-64     	; 0x339a4 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]+0x50>
                mmu_print_saved &= ~(SavedState::CooldownPending);
   339e4:	80 91 02 13 	lds	r24, 0x1302	; 0x801302 <MMU2::mmu2+0x70>
   339e8:	8b 7f       	andi	r24, 0xFB	; 251
                mmu_print_saved |= SavedState::Cooldown;
   339ea:	82 60       	ori	r24, 0x02	; 2
   339ec:	80 93 02 13 	sts	0x1302, r24	; 0x801302 <MMU2::mmu2+0x70>
   339f0:	10 92 5e 12 	sts	0x125E, r1	; 0x80125e <target_temperature+0x1>
   339f4:	10 92 5d 12 	sts	0x125D, r1	; 0x80125d <target_temperature>
                thermal_setTargetHotend(0);
                LogEchoEvent_P(PSTR("Heater cooldown"));
   339f8:	82 ec       	ldi	r24, 0xC2	; 194
   339fa:	9d e9       	ldi	r25, 0x9D	; 157
   339fc:	d1 cf       	rjmp	.-94     	; 0x339a0 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]+0x4c>
            }
        } else if (nozzleTimeout.running()) {
   339fe:	88 23       	and	r24, r24
   33a00:	89 f2       	breq	.-94     	; 0x339a4 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]+0x50>
   33a02:	19 82       	std	Y+1, r1	; 0x01
            nozzleTimeout.stop();
            LogEchoEvent_P(PSTR("Cooling timer stopped"));
   33a04:	8c ea       	ldi	r24, 0xAC	; 172
   33a06:	9d e9       	ldi	r25, 0x9D	; 157
   33a08:	cb cf       	rjmp	.-106    	; 0x339a0 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]+0x4c>

        switch (logicStepLastStatus) {
        case Finished:
            // command/operation completed, let Marlin continue its work
            // the E may have some more moves to finish - wait for them
            ResumeHotendTemp();
   33a0a:	0f 94 48 9c 	call	0x33890	; 0x33890 <MMU2::MMU2::ResumeHotendTemp() [clone .constprop.180]>
            ResumeUnpark(); // We can now travel back to the tower or wherever we were when we saved.
   33a0e:	0f 94 2e 5b 	call	0x2b65c	; 0x2b65c <MMU2::MMU2::ResumeUnpark() [clone .constprop.119]>
            if (!TuneMenuEntered()) {
   33a12:	80 91 43 0d 	lds	r24, 0x0D43	; 0x800d43 <_ZN4MMU2L21putErrorScreenToSleepE.lto_priv.451>
   33a16:	81 11       	cpse	r24, r1
   33a18:	07 c0       	rjmp	.+14     	; 0x33a28 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]+0xd4>
        retryAttempts--;
    }
}

void ProtocolLogic::ResetRetryAttempts() {
    SERIAL_ECHOLNPGM("ResetRetryAttempts");
   33a1a:	88 e9       	ldi	r24, 0x98	; 152
   33a1c:	9f e9       	ldi	r25, 0x9F	; 159
   33a1e:	0e 94 bd 7c 	call	0xf97a	; 0xf97a <serialprintlnPGM(char const*)>
    retryAttempts = MAX_RETRIES;
   33a22:	83 e0       	ldi	r24, 0x03	; 3
   33a24:	80 93 e6 12 	sts	0x12E6, r24	; 0x8012e6 <MMU2::mmu2+0x54>
bool planner_draining() {
    return planner_aborted;
}

void planner_synchronize() {
    st_synchronize();
   33a28:	0f 94 fb 1a 	call	0x235f6	; 0x235f6 <st_synchronize()>
        case Interrupted:
            // now what :D ... big bad ... ramming, unload, retry the whole command originally issued
            return false;
        case VersionMismatch: // this basically means the MMU will be disabled until reconnected
            CheckUserInput();
            return true;
   33a2c:	81 e0       	ldi	r24, 0x01	; 1
        case Processing: // wait for the MMU to respond
        default:
            break;
        }
    }
}
   33a2e:	0f 90       	pop	r0
   33a30:	0f 90       	pop	r0
   33a32:	0f 90       	pop	r0
   33a34:	0f 90       	pop	r0
   33a36:	0f 90       	pop	r0
   33a38:	df 91       	pop	r29
   33a3a:	cf 91       	pop	r28
   33a3c:	1f 91       	pop	r17
   33a3e:	0f 91       	pop	r16
   33a40:	08 95       	ret
            return true;
        case Interrupted:
            // now what :D ... big bad ... ramming, unload, retry the whole command originally issued
            return false;
        case VersionMismatch: // this basically means the MMU will be disabled until reconnected
            CheckUserInput();
   33a42:	0f 94 7e 96 	call	0x32cfc	; 0x32cfc <MMU2::MMU2::CheckUserInput() [clone .constprop.175]>
   33a46:	f2 cf       	rjmp	.-28     	; 0x33a2c <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]+0xd8>
            break;
        case CommandError:
        case CommunicationTimeout:
        case ProtocolError:
        case ButtonPushed:
            if (!logic.InAutoRetry()) {
   33a48:	80 91 e7 12 	lds	r24, 0x12E7	; 0x8012e7 <MMU2::mmu2+0x55>
   33a4c:	81 11       	cpse	r24, r1
   33a4e:	97 cf       	rjmp	.-210    	; 0x3397e <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]+0x2a>
                // Don't proceed to the park/save if we are doing an autoretry.
                SaveAndPark(move_axes);
   33a50:	81 2f       	mov	r24, r17
   33a52:	0f 94 78 5b 	call	0x2b6f0	; 0x2b6f0 <MMU2::MMU2::SaveAndPark(bool) [clone .constprop.114]>
                SaveHotendTemp(turn_off_nozzle);
   33a56:	80 2f       	mov	r24, r16
   33a58:	0f 94 12 5b 	call	0x2b624	; 0x2b624 <MMU2::MMU2::SaveHotendTemp(bool) [clone .constprop.117]>
                CheckUserInput();
   33a5c:	0f 94 7e 96 	call	0x32cfc	; 0x32cfc <MMU2::MMU2::CheckUserInput() [clone .constprop.175]>
   33a60:	8e cf       	rjmp	.-228    	; 0x3397e <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]+0x2a>
            }
            break;
        case CommunicationRecovered: // @@TODO communication recovered and may be an error recovered as well
            // may be the logic layer can detect the change of state a respond with one "Recovered" to be handled here
            ResumeHotendTemp();
   33a62:	0f 94 48 9c 	call	0x33890	; 0x33890 <MMU2::MMU2::ResumeHotendTemp() [clone .constprop.180]>
            ResumeUnpark();
   33a66:	0f 94 2e 5b 	call	0x2b65c	; 0x2b65c <MMU2::MMU2::ResumeUnpark() [clone .constprop.119]>
   33a6a:	89 cf       	rjmp	.-238    	; 0x3397e <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]+0x2a>
            }
            planner_synchronize();
            return true;
        case Interrupted:
            // now what :D ... big bad ... ramming, unload, retry the whole command originally issued
            return false;
   33a6c:	80 e0       	ldi	r24, 0x00	; 0
   33a6e:	df cf       	rjmp	.-66     	; 0x33a2e <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]+0xda>

00033a70 <MMU2::MMU2::UnloadInner() [clone .constprop.109]>:
    } // true, true); -- Comment: how is it possible for a filament type set to fail?

    return true;
}

void MMU2::UnloadInner() {
   33a70:	cf 93       	push	r28
   33a72:	df 93       	push	r29
   33a74:	00 d0       	rcall	.+0      	; 0x33a76 <MMU2::MMU2::UnloadInner() [clone .constprop.109]+0x6>
   33a76:	1f 92       	push	r1
   33a78:	1f 92       	push	r1
   33a7a:	cd b7       	in	r28, 0x3d	; 61
   33a7c:	de b7       	in	r29, 0x3e	; 62
    FSensorBlockRunout blockRunout;
   33a7e:	0f 94 2b 79 	call	0x2f256	; 0x2f256 <FSensorBlockRunout::FSensorBlockRunout() [clone .constprop.136]>

    return ss;
}

void MMU2::filament_ramming() {
    execute_extruder_sequence(ramming_sequence, sizeof(ramming_sequence) / sizeof(E_Step));
   33a82:	62 e1       	ldi	r22, 0x12	; 18
   33a84:	8c e1       	ldi	r24, 0x1C	; 28
   33a86:	9d e9       	ldi	r25, 0x9D	; 157
   33a88:	0f 94 7d 79 	call	0x2f2fa	; 0x2f2fa <MMU2::MMU2::execute_extruder_sequence(E_Step const*, unsigned char) [clone .constprop.111]>
    filament_ramming();

    // we assume the printer managed to relieve filament tip from the gears,
    // so repeating that part in case of an MMU restart is not necessary
    for (;;) {
        Disable_E0();
   33a8c:	0f 94 d4 50 	call	0x2a1a8	; 0x2a1a8 <MMU2::Disable_E0()>
void ProtocolLogic::Statistics() {
    PlanGenericRequest(RequestMsg(RequestMsgCodes::Version, 3));
}

void ProtocolLogic::UnloadFilament() {
    PlanGenericRequest(RequestMsg(RequestMsgCodes::Unload, 0));
   33a90:	40 e0       	ldi	r20, 0x00	; 0
   33a92:	65 e5       	ldi	r22, 0x55	; 85
   33a94:	ce 01       	movw	r24, r28
   33a96:	01 96       	adiw	r24, 0x01	; 1
   33a98:	0f 94 c7 50 	call	0x2a18e	; 0x2a18e <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   33a9c:	49 81       	ldd	r20, Y+1	; 0x01
   33a9e:	5a 81       	ldd	r21, Y+2	; 0x02
   33aa0:	6b 81       	ldd	r22, Y+3	; 0x03
   33aa2:	7c 81       	ldd	r23, Y+4	; 0x04
   33aa4:	8d 81       	ldd	r24, Y+5	; 0x05
   33aa6:	0f 94 19 95 	call	0x32a32	; 0x32a32 <MMU2::ProtocolLogic::PlanGenericRequest(modules::protocol::RequestMsg) [clone .constprop.327]>
        logic.UnloadFilament();
        if (manage_response(false, true)) {
   33aaa:	61 e0       	ldi	r22, 0x01	; 1
   33aac:	80 e0       	ldi	r24, 0x00	; 0
   33aae:	0f 94 aa 9c 	call	0x33954	; 0x33954 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]>
   33ab2:	81 11       	cpse	r24, r1
   33ab4:	03 c0       	rjmp	.+6      	; 0x33abc <MMU2::MMU2::UnloadInner() [clone .constprop.109]+0x4c>
            break;
        }
        IncrementMMUFails();
   33ab6:	0f 94 28 50 	call	0x2a050	; 0x2a050 <MMU2::IncrementMMUFails()>
   33aba:	e8 cf       	rjmp	.-48     	; 0x33a8c <MMU2::MMU2::UnloadInner() [clone .constprop.109]+0x1c>
bool cutter_enabled(){
    return eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED) == EEPROM_MMU_CUTTER_ENABLED_enabled;
}

void MakeSound(SoundType s){
    Sound_MakeSound( (eSOUND_TYPE)s);
   33abc:	83 e0       	ldi	r24, 0x03	; 3
   33abe:	0f 94 ad 25 	call	0x24b5a	; 0x24b5a <Sound_MakeSound(eSOUND_TYPE)>
    }
    MakeSound(Confirm);

    // no active tool
    SetCurrentTool(MMU2_NO_TOOL);
   33ac2:	83 e6       	ldi	r24, 0x63	; 99
   33ac4:	0f 94 c7 65 	call	0x2cb8e	; 0x2cb8e <MMU2::MMU2::SetCurrentTool(unsigned char) [clone .constprop.318]>
    tool_change_extruder = MMU2_NO_TOOL;
   33ac8:	83 e6       	ldi	r24, 0x63	; 99
   33aca:	80 93 e9 12 	sts	0x12E9, r24	; 0x8012e9 <MMU2::mmu2+0x57>

FSensorBlockRunout::~FSensorBlockRunout() {
    fsensor.settings_init(); // restore filament runout state.
   33ace:	0f 94 95 6d 	call	0x2db2a	; 0x2db2a <PAT9125_sensor::settings_init() [clone .constprop.207]>
}
   33ad2:	0f 90       	pop	r0
   33ad4:	0f 90       	pop	r0
   33ad6:	0f 90       	pop	r0
   33ad8:	0f 90       	pop	r0
   33ada:	0f 90       	pop	r0
   33adc:	df 91       	pop	r29
   33ade:	cf 91       	pop	r28
   33ae0:	08 95       	ret

00033ae2 <MMU2::MMU2::unload() [clone .constprop.105]>:

bool MMU2::unload() {
   33ae2:	cf 93       	push	r28
    if (!WaitForMMUReady()) {
   33ae4:	0f 94 a6 79 	call	0x2f34c	; 0x2f34c <MMU2::MMU2::WaitForMMUReady() [clone .constprop.106]>
   33ae8:	c8 2f       	mov	r28, r24
   33aea:	88 23       	and	r24, r24
   33aec:	79 f0       	breq	.+30     	; 0x33b0c <MMU2::MMU2::unload() [clone .constprop.105]+0x2a>
        safe_delay_keep_alive(delay);
    }
}

void WaitForHotendTargetTempBeep() {
    waitForHotendTargetTemp(200, [] {});
   33aee:	88 ec       	ldi	r24, 0xC8	; 200
   33af0:	90 e0       	ldi	r25, 0x00	; 0
   33af2:	0f 94 58 54 	call	0x2a8b0	; 0x2a8b0 <void MMU2::waitForHotendTargetTemp<MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}>(unsigned int, MMU2::WaitForHotendTargetTempBeep()::{lambda()#1}) [clone .isra.0] [clone .lto_priv.374]>
   33af6:	82 e0       	ldi	r24, 0x02	; 2
   33af8:	0f 94 ad 25 	call	0x24b5a	; 0x24b5a <Sound_MakeSound(eSOUND_TYPE)>

struct ReportingRAII {
    CommandInProgress cip;
    explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip)
        : cip(cip) {
        BeginReport(cip, ProgressCode::EngagingIdler);
   33afc:	0f 94 72 79 	call	0x2f2e4	; 0x2f2e4 <MMU2::BeginReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.123]>

    WaitForHotendTargetTempBeep();

    {
        ReportingRAII rep(CommandInProgress::UnloadFilament);
        UnloadInner();
   33b00:	0f 94 38 9d 	call	0x33a70	; 0x33a70 <MMU2::MMU2::UnloadInner() [clone .constprop.109]>
    explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip)
        : cip(cip) {
        BeginReport(cip, ProgressCode::EngagingIdler);
    }
    inline __attribute__((always_inline)) ~ReportingRAII() {
        EndReport(cip, ProgressCode::OK);
   33b04:	0f 94 9b 79 	call	0x2f336	; 0x2f336 <MMU2::EndReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.108]>
    {
        ReportingRAII rep(CommandInProgress::UnloadFilament);
        UnloadInner();
    }

    ScreenUpdateEnable();
   33b08:	0f 94 06 50 	call	0x2a00c	; 0x2a00c <MMU2::ScreenUpdateEnable()>
    return true;
}
   33b0c:	8c 2f       	mov	r24, r28
   33b0e:	cf 91       	pop	r28
   33b10:	08 95       	ret

00033b12 <MMU2::MMU2::load_filament(unsigned char) [clone .constprop.102]>:
    unload();
    ScreenUpdateEnable();
    return true;
}

bool MMU2::load_filament(uint8_t slot) {
   33b12:	0f 93       	push	r16
   33b14:	1f 93       	push	r17
   33b16:	cf 93       	push	r28
   33b18:	df 93       	push	r29
   33b1a:	00 d0       	rcall	.+0      	; 0x33b1c <MMU2::MMU2::load_filament(unsigned char) [clone .constprop.102]+0xa>
   33b1c:	1f 92       	push	r1
   33b1e:	1f 92       	push	r1
   33b20:	cd b7       	in	r28, 0x3d	; 61
   33b22:	de b7       	in	r29, 0x3e	; 62
   33b24:	08 2f       	mov	r16, r24
    if (!WaitForMMUReady()) {
   33b26:	0f 94 a6 79 	call	0x2f34c	; 0x2f34c <MMU2::MMU2::WaitForMMUReady() [clone .constprop.106]>
   33b2a:	18 2f       	mov	r17, r24
   33b2c:	88 23       	and	r24, r24
   33b2e:	49 f1       	breq	.+82     	; 0x33b82 <MMU2::MMU2::load_filament(unsigned char) [clone .constprop.102]+0x70>
void FullScreenMsgTest(uint8_t slot){
    FullScreenMsg(_T(MSG_TESTING_FILAMENT), slot);
}

void FullScreenMsgLoad(uint8_t slot){
    FullScreenMsg(_T(MSG_LOADING_FILAMENT), slot);
   33b30:	8d ee       	ldi	r24, 0xED	; 237
   33b32:	91 e6       	ldi	r25, 0x61	; 97
   33b34:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   33b38:	60 2f       	mov	r22, r16
   33b3a:	0f 94 09 50 	call	0x2a012	; 0x2a012 <MMU2::FullScreenMsg(char const*, unsigned char) [clone .lto_priv.375]>

struct ReportingRAII {
    CommandInProgress cip;
    explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip)
        : cip(cip) {
        BeginReport(cip, ProgressCode::EngagingIdler);
   33b3e:	0f 94 72 79 	call	0x2f2e4	; 0x2f2e4 <MMU2::BeginReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.123]>

    FullScreenMsgLoad(slot);
    {
        ReportingRAII rep(CommandInProgress::LoadFilament);
        for (;;) {
            Disable_E0();
   33b42:	0f 94 d4 50 	call	0x2a1a8	; 0x2a1a8 <MMU2::Disable_E0()>
}

void ProtocolLogic::LoadFilament(uint8_t slot) {
    PlanGenericRequest(RequestMsg(RequestMsgCodes::Load, slot));
   33b46:	40 2f       	mov	r20, r16
   33b48:	6c e4       	ldi	r22, 0x4C	; 76
   33b4a:	ce 01       	movw	r24, r28
   33b4c:	01 96       	adiw	r24, 0x01	; 1
   33b4e:	0f 94 c7 50 	call	0x2a18e	; 0x2a18e <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   33b52:	49 81       	ldd	r20, Y+1	; 0x01
   33b54:	5a 81       	ldd	r21, Y+2	; 0x02
   33b56:	6b 81       	ldd	r22, Y+3	; 0x03
   33b58:	7c 81       	ldd	r23, Y+4	; 0x04
   33b5a:	8d 81       	ldd	r24, Y+5	; 0x05
   33b5c:	0f 94 19 95 	call	0x32a32	; 0x32a32 <MMU2::ProtocolLogic::PlanGenericRequest(modules::protocol::RequestMsg) [clone .constprop.327]>
            logic.LoadFilament(slot);
            if (manage_response(false, false)) {
   33b60:	60 e0       	ldi	r22, 0x00	; 0
   33b62:	80 e0       	ldi	r24, 0x00	; 0
   33b64:	0f 94 aa 9c 	call	0x33954	; 0x33954 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]>
   33b68:	18 2f       	mov	r17, r24
   33b6a:	81 11       	cpse	r24, r1
   33b6c:	03 c0       	rjmp	.+6      	; 0x33b74 <MMU2::MMU2::load_filament(unsigned char) [clone .constprop.102]+0x62>
                break;
            }
            IncrementMMUFails();
   33b6e:	0f 94 28 50 	call	0x2a050	; 0x2a050 <MMU2::IncrementMMUFails()>
   33b72:	e7 cf       	rjmp	.-50     	; 0x33b42 <MMU2::MMU2::load_filament(unsigned char) [clone .constprop.102]+0x30>
bool cutter_enabled(){
    return eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED) == EEPROM_MMU_CUTTER_ENABLED_enabled;
}

void MakeSound(SoundType s){
    Sound_MakeSound( (eSOUND_TYPE)s);
   33b74:	83 e0       	ldi	r24, 0x03	; 3
   33b76:	0f 94 ad 25 	call	0x24b5a	; 0x24b5a <Sound_MakeSound(eSOUND_TYPE)>
    explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip)
        : cip(cip) {
        BeginReport(cip, ProgressCode::EngagingIdler);
    }
    inline __attribute__((always_inline)) ~ReportingRAII() {
        EndReport(cip, ProgressCode::OK);
   33b7a:	0f 94 9b 79 	call	0x2f336	; 0x2f336 <MMU2::EndReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.108]>
            }
            IncrementMMUFails();
        }
        MakeSound(SoundType::Confirm);
    }
    ScreenUpdateEnable();
   33b7e:	0f 94 06 50 	call	0x2a00c	; 0x2a00c <MMU2::ScreenUpdateEnable()>
    return true;
}
   33b82:	81 2f       	mov	r24, r17
   33b84:	0f 90       	pop	r0
   33b86:	0f 90       	pop	r0
   33b88:	0f 90       	pop	r0
   33b8a:	0f 90       	pop	r0
   33b8c:	0f 90       	pop	r0
   33b8e:	df 91       	pop	r29
   33b90:	cf 91       	pop	r28
   33b92:	1f 91       	pop	r17
   33b94:	0f 91       	pop	r16
   33b96:	08 95       	ret

00033b98 <MMU2::MMU2::eject_filament(unsigned char, bool) [clone .constprop.99]>:
    }
    ScreenUpdateEnable();
    return true;
}

bool MMU2::eject_filament(uint8_t slot, bool enableFullScreenMsg /* = true */) {
   33b98:	ff 92       	push	r15
   33b9a:	0f 93       	push	r16
   33b9c:	1f 93       	push	r17
   33b9e:	cf 93       	push	r28
   33ba0:	df 93       	push	r29
   33ba2:	00 d0       	rcall	.+0      	; 0x33ba4 <MMU2::MMU2::eject_filament(unsigned char, bool) [clone .constprop.99]+0xc>
   33ba4:	1f 92       	push	r1
   33ba6:	1f 92       	push	r1
   33ba8:	cd b7       	in	r28, 0x3d	; 61
   33baa:	de b7       	in	r29, 0x3e	; 62
   33bac:	08 2f       	mov	r16, r24
   33bae:	f6 2e       	mov	r15, r22
    if (!WaitForMMUReady()) {
   33bb0:	0f 94 a6 79 	call	0x2f34c	; 0x2f34c <MMU2::MMU2::WaitForMMUReady() [clone .constprop.106]>
   33bb4:	18 2f       	mov	r17, r24
   33bb6:	88 23       	and	r24, r24
   33bb8:	b1 f1       	breq	.+108    	; 0x33c26 <MMU2::MMU2::eject_filament(unsigned char, bool) [clone .constprop.99]+0x8e>
        return false;
    }

    if (enableFullScreenMsg) {
   33bba:	ff 20       	and	r15, r15
   33bbc:	39 f0       	breq	.+14     	; 0x33bcc <MMU2::MMU2::eject_filament(unsigned char, bool) [clone .constprop.99]+0x34>
void FullScreenMsgCut(uint8_t slot){
    FullScreenMsg(_T(MSG_CUT_FILAMENT), slot);
}

void FullScreenMsgEject(uint8_t slot){
    FullScreenMsg(_T(MSG_EJECT_FROM_MMU), slot);
   33bbe:	8c ed       	ldi	r24, 0xDC	; 220
   33bc0:	91 e6       	ldi	r25, 0x61	; 97
   33bc2:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   33bc6:	60 2f       	mov	r22, r16
   33bc8:	0f 94 09 50 	call	0x2a012	; 0x2a012 <MMU2::FullScreenMsg(char const*, unsigned char) [clone .lto_priv.375]>
        FullScreenMsgEject(slot);
    }
    {
        if (FindaDetectsFilament()) {
   33bcc:	80 91 d7 12 	lds	r24, 0x12D7	; 0x8012d7 <MMU2::mmu2+0x45>
   33bd0:	81 11       	cpse	r24, r1
            unload();
   33bd2:	0f 94 71 9d 	call	0x33ae2	; 0x33ae2 <MMU2::MMU2::unload() [clone .constprop.105]>

struct ReportingRAII {
    CommandInProgress cip;
    explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip)
        : cip(cip) {
        BeginReport(cip, ProgressCode::EngagingIdler);
   33bd6:	0f 94 72 79 	call	0x2f2e4	; 0x2f2e4 <MMU2::BeginReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.123]>
            unload();
        }

        ReportingRAII rep(CommandInProgress::EjectFilament);
        for (;;) {
            Disable_E0();
   33bda:	0f 94 d4 50 	call	0x2a1a8	; 0x2a1a8 <MMU2::Disable_E0()>
}

void ProtocolLogic::EjectFilament(uint8_t slot) {
    PlanGenericRequest(RequestMsg(RequestMsgCodes::Eject, slot));
   33bde:	40 2f       	mov	r20, r16
   33be0:	65 e4       	ldi	r22, 0x45	; 69
   33be2:	ce 01       	movw	r24, r28
   33be4:	01 96       	adiw	r24, 0x01	; 1
   33be6:	0f 94 c7 50 	call	0x2a18e	; 0x2a18e <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   33bea:	49 81       	ldd	r20, Y+1	; 0x01
   33bec:	5a 81       	ldd	r21, Y+2	; 0x02
   33bee:	6b 81       	ldd	r22, Y+3	; 0x03
   33bf0:	7c 81       	ldd	r23, Y+4	; 0x04
   33bf2:	8d 81       	ldd	r24, Y+5	; 0x05
   33bf4:	0f 94 19 95 	call	0x32a32	; 0x32a32 <MMU2::ProtocolLogic::PlanGenericRequest(modules::protocol::RequestMsg) [clone .constprop.327]>
            logic.EjectFilament(slot);
            if (manage_response(false, true)) {
   33bf8:	61 e0       	ldi	r22, 0x01	; 1
   33bfa:	80 e0       	ldi	r24, 0x00	; 0
   33bfc:	0f 94 aa 9c 	call	0x33954	; 0x33954 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]>
   33c00:	18 2f       	mov	r17, r24
   33c02:	81 11       	cpse	r24, r1
   33c04:	03 c0       	rjmp	.+6      	; 0x33c0c <MMU2::MMU2::eject_filament(unsigned char, bool) [clone .constprop.99]+0x74>
                break;
            }
            IncrementMMUFails();
   33c06:	0f 94 28 50 	call	0x2a050	; 0x2a050 <MMU2::IncrementMMUFails()>
   33c0a:	e7 cf       	rjmp	.-50     	; 0x33bda <MMU2::MMU2::eject_filament(unsigned char, bool) [clone .constprop.99]+0x42>
        }
        SetCurrentTool(MMU2_NO_TOOL);
   33c0c:	83 e6       	ldi	r24, 0x63	; 99
   33c0e:	0f 94 c7 65 	call	0x2cb8e	; 0x2cb8e <MMU2::MMU2::SetCurrentTool(unsigned char) [clone .constprop.318]>
        tool_change_extruder = MMU2_NO_TOOL;
   33c12:	83 e6       	ldi	r24, 0x63	; 99
   33c14:	80 93 e9 12 	sts	0x12E9, r24	; 0x8012e9 <MMU2::mmu2+0x57>
bool cutter_enabled(){
    return eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED) == EEPROM_MMU_CUTTER_ENABLED_enabled;
}

void MakeSound(SoundType s){
    Sound_MakeSound( (eSOUND_TYPE)s);
   33c18:	83 e0       	ldi	r24, 0x03	; 3
   33c1a:	0f 94 ad 25 	call	0x24b5a	; 0x24b5a <Sound_MakeSound(eSOUND_TYPE)>
    explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip)
        : cip(cip) {
        BeginReport(cip, ProgressCode::EngagingIdler);
    }
    inline __attribute__((always_inline)) ~ReportingRAII() {
        EndReport(cip, ProgressCode::OK);
   33c1e:	0f 94 9b 79 	call	0x2f336	; 0x2f336 <MMU2::EndReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.108]>
        }
        SetCurrentTool(MMU2_NO_TOOL);
        tool_change_extruder = MMU2_NO_TOOL;
        MakeSound(Confirm);
    }
    ScreenUpdateEnable();
   33c22:	0f 94 06 50 	call	0x2a00c	; 0x2a00c <MMU2::ScreenUpdateEnable()>
    return true;
}
   33c26:	81 2f       	mov	r24, r17
   33c28:	0f 90       	pop	r0
   33c2a:	0f 90       	pop	r0
   33c2c:	0f 90       	pop	r0
   33c2e:	0f 90       	pop	r0
   33c30:	0f 90       	pop	r0
   33c32:	df 91       	pop	r29
   33c34:	cf 91       	pop	r28
   33c36:	1f 91       	pop	r17
   33c38:	0f 91       	pop	r16
   33c3a:	ff 90       	pop	r15
   33c3c:	08 95       	ret

00033c3e <MMU2::MMU2::CutFilamentInner(unsigned char) [clone .constprop.97]>:

    ScreenUpdateEnable();
    return true;
}

void MMU2::CutFilamentInner(uint8_t slot) {
   33c3e:	1f 93       	push	r17
   33c40:	cf 93       	push	r28
   33c42:	df 93       	push	r29
   33c44:	00 d0       	rcall	.+0      	; 0x33c46 <MMU2::MMU2::CutFilamentInner(unsigned char) [clone .constprop.97]+0x8>
   33c46:	1f 92       	push	r1
   33c48:	1f 92       	push	r1
   33c4a:	cd b7       	in	r28, 0x3d	; 61
   33c4c:	de b7       	in	r29, 0x3e	; 62
   33c4e:	18 2f       	mov	r17, r24
    for (;;) {
        Disable_E0();
   33c50:	0f 94 d4 50 	call	0x2a1a8	; 0x2a1a8 <MMU2::Disable_E0()>
}

void ProtocolLogic::CutFilament(uint8_t slot) {
    PlanGenericRequest(RequestMsg(RequestMsgCodes::Cut, slot));
   33c54:	41 2f       	mov	r20, r17
   33c56:	6b e4       	ldi	r22, 0x4B	; 75
   33c58:	ce 01       	movw	r24, r28
   33c5a:	01 96       	adiw	r24, 0x01	; 1
   33c5c:	0f 94 c7 50 	call	0x2a18e	; 0x2a18e <modules::protocol::RequestMsg::RequestMsg(modules::protocol::RequestMsgCodes, unsigned char)>
   33c60:	49 81       	ldd	r20, Y+1	; 0x01
   33c62:	5a 81       	ldd	r21, Y+2	; 0x02
   33c64:	6b 81       	ldd	r22, Y+3	; 0x03
   33c66:	7c 81       	ldd	r23, Y+4	; 0x04
   33c68:	8d 81       	ldd	r24, Y+5	; 0x05
   33c6a:	0f 94 19 95 	call	0x32a32	; 0x32a32 <MMU2::ProtocolLogic::PlanGenericRequest(modules::protocol::RequestMsg) [clone .constprop.327]>
        logic.CutFilament(slot);
        if (manage_response(false, true)) {
   33c6e:	61 e0       	ldi	r22, 0x01	; 1
   33c70:	80 e0       	ldi	r24, 0x00	; 0
   33c72:	0f 94 aa 9c 	call	0x33954	; 0x33954 <MMU2::MMU2::manage_response(bool, bool) [clone .constprop.113]>
   33c76:	81 11       	cpse	r24, r1
   33c78:	03 c0       	rjmp	.+6      	; 0x33c80 <MMU2::MMU2::CutFilamentInner(unsigned char) [clone .constprop.97]+0x42>
            break;
        }
        IncrementMMUFails();
   33c7a:	0f 94 28 50 	call	0x2a050	; 0x2a050 <MMU2::IncrementMMUFails()>
   33c7e:	e8 cf       	rjmp	.-48     	; 0x33c50 <MMU2::MMU2::CutFilamentInner(unsigned char) [clone .constprop.97]+0x12>
    }
}
   33c80:	0f 90       	pop	r0
   33c82:	0f 90       	pop	r0
   33c84:	0f 90       	pop	r0
   33c86:	0f 90       	pop	r0
   33c88:	0f 90       	pop	r0
   33c8a:	df 91       	pop	r29
   33c8c:	cf 91       	pop	r28
   33c8e:	1f 91       	pop	r17
   33c90:	08 95       	ret

00033c92 <MMU2::MMU2::cut_filament(unsigned char, bool) [clone .part.39] [clone .constprop.96]>:

bool MMU2::cut_filament(uint8_t slot, bool enableFullScreenMsg /*= true*/) {
   33c92:	cf 93       	push	r28
   33c94:	c8 2f       	mov	r28, r24
    lcd_print(' ');
    lcd_print(slot + 1);
}

void FullScreenMsgCut(uint8_t slot){
    FullScreenMsg(_T(MSG_CUT_FILAMENT), slot);
   33c96:	8d ec       	ldi	r24, 0xCD	; 205
   33c98:	91 e6       	ldi	r25, 0x61	; 97
   33c9a:	0e 94 3a 75 	call	0xea74	; 0xea74 <lang_get_translation>
   33c9e:	6c 2f       	mov	r22, r28
   33ca0:	0f 94 09 50 	call	0x2a012	; 0x2a012 <MMU2::FullScreenMsg(char const*, unsigned char) [clone .lto_priv.375]>

    if (enableFullScreenMsg) {
        FullScreenMsgCut(slot);
    }
    {
        if (FindaDetectsFilament()) {
   33ca4:	80 91 d7 12 	lds	r24, 0x12D7	; 0x8012d7 <MMU2::mmu2+0x45>
   33ca8:	81 11       	cpse	r24, r1
            unload();
   33caa:	0f 94 71 9d 	call	0x33ae2	; 0x33ae2 <MMU2::MMU2::unload() [clone .constprop.105]>

struct ReportingRAII {
    CommandInProgress cip;
    explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip)
        : cip(cip) {
        BeginReport(cip, ProgressCode::EngagingIdler);
   33cae:	0f 94 72 79 	call	0x2f2e4	; 0x2f2e4 <MMU2::BeginReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.123]>
        if (FindaDetectsFilament()) {
            unload();
        }

        ReportingRAII rep(CommandInProgress::CutFilament);
        CutFilamentInner(slot);
   33cb2:	8c 2f       	mov	r24, r28
   33cb4:	0f 94 1f 9e 	call	0x33c3e	; 0x33c3e <MMU2::MMU2::CutFilamentInner(unsigned char) [clone .constprop.97]>
        SetCurrentTool(MMU2_NO_TOOL);
   33cb8:	83 e6       	ldi	r24, 0x63	; 99
   33cba:	0f 94 c7 65 	call	0x2cb8e	; 0x2cb8e <MMU2::MMU2::SetCurrentTool(unsigned char) [clone .constprop.318]>
        tool_change_extruder = MMU2_NO_TOOL;
   33cbe:	83 e6       	ldi	r24, 0x63	; 99
   33cc0:	80 93 e9 12 	sts	0x12E9, r24	; 0x8012e9 <MMU2::mmu2+0x57>
bool cutter_enabled(){
    return eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED) == EEPROM_MMU_CUTTER_ENABLED_enabled;
}

void MakeSound(SoundType s){
    Sound_MakeSound( (eSOUND_TYPE)s);
   33cc4:	83 e0       	ldi	r24, 0x03	; 3
   33cc6:	0f 94 ad 25 	call	0x24b5a	; 0x24b5a <Sound_MakeSound(eSOUND_TYPE)>
    explicit inline __attribute__((always_inline)) ReportingRAII(CommandInProgress cip)
        : cip(cip) {
        BeginReport(cip, ProgressCode::EngagingIdler);
    }
    inline __attribute__((always_inline)) ~ReportingRAII() {
        EndReport(cip, ProgressCode::OK);
   33cca:	0f 94 9b 79 	call	0x2f336	; 0x2f336 <MMU2::EndReport(MMU2::CommandInProgress, ProgressCode) [clone .constprop.108]>
        CutFilamentInner(slot);
        SetCurrentTool(MMU2_NO_TOOL);
        tool_change_extruder = MMU2_NO_TOOL;
        MakeSound(SoundType::Confirm);
    }
    ScreenUpdateEnable();
   33cce:	0f 94 06 50 	call	0x2a00c	; 0x2a00c <MMU2::ScreenUpdateEnable()>
    return true;
}
   33cd2:	81 e0       	ldi	r24, 0x01	; 1
   33cd4:	cf 91       	pop	r28
   33cd6:	08 95       	ret

00033cd8 <__floatunsisf>:
   33cd8:	e8 94       	clt
   33cda:	09 c0       	rjmp	.+18     	; 0x33cee <__floatsisf+0x12>

00033cdc <__floatsisf>:
   33cdc:	97 fb       	bst	r25, 7
   33cde:	3e f4       	brtc	.+14     	; 0x33cee <__floatsisf+0x12>
   33ce0:	90 95       	com	r25
   33ce2:	80 95       	com	r24
   33ce4:	70 95       	com	r23
   33ce6:	61 95       	neg	r22
   33ce8:	7f 4f       	sbci	r23, 0xFF	; 255
   33cea:	8f 4f       	sbci	r24, 0xFF	; 255
   33cec:	9f 4f       	sbci	r25, 0xFF	; 255
   33cee:	99 23       	and	r25, r25
   33cf0:	a9 f0       	breq	.+42     	; 0x33d1c <__floatsisf+0x40>
   33cf2:	f9 2f       	mov	r31, r25
   33cf4:	96 e9       	ldi	r25, 0x96	; 150
   33cf6:	bb 27       	eor	r27, r27
   33cf8:	93 95       	inc	r25
   33cfa:	f6 95       	lsr	r31
   33cfc:	87 95       	ror	r24
   33cfe:	77 95       	ror	r23
   33d00:	67 95       	ror	r22
   33d02:	b7 95       	ror	r27
   33d04:	f1 11       	cpse	r31, r1
   33d06:	f8 cf       	rjmp	.-16     	; 0x33cf8 <__floatsisf+0x1c>
   33d08:	fa f4       	brpl	.+62     	; 0x33d48 <__floatsisf+0x6c>
   33d0a:	bb 0f       	add	r27, r27
   33d0c:	11 f4       	brne	.+4      	; 0x33d12 <__floatsisf+0x36>
   33d0e:	60 ff       	sbrs	r22, 0
   33d10:	1b c0       	rjmp	.+54     	; 0x33d48 <__floatsisf+0x6c>
   33d12:	6f 5f       	subi	r22, 0xFF	; 255
   33d14:	7f 4f       	sbci	r23, 0xFF	; 255
   33d16:	8f 4f       	sbci	r24, 0xFF	; 255
   33d18:	9f 4f       	sbci	r25, 0xFF	; 255
   33d1a:	16 c0       	rjmp	.+44     	; 0x33d48 <__floatsisf+0x6c>
   33d1c:	88 23       	and	r24, r24
   33d1e:	11 f0       	breq	.+4      	; 0x33d24 <__floatsisf+0x48>
   33d20:	96 e9       	ldi	r25, 0x96	; 150
   33d22:	11 c0       	rjmp	.+34     	; 0x33d46 <__floatsisf+0x6a>
   33d24:	77 23       	and	r23, r23
   33d26:	21 f0       	breq	.+8      	; 0x33d30 <__floatsisf+0x54>
   33d28:	9e e8       	ldi	r25, 0x8E	; 142
   33d2a:	87 2f       	mov	r24, r23
   33d2c:	76 2f       	mov	r23, r22
   33d2e:	05 c0       	rjmp	.+10     	; 0x33d3a <__floatsisf+0x5e>
   33d30:	66 23       	and	r22, r22
   33d32:	71 f0       	breq	.+28     	; 0x33d50 <__floatsisf+0x74>
   33d34:	96 e8       	ldi	r25, 0x86	; 134
   33d36:	86 2f       	mov	r24, r22
   33d38:	70 e0       	ldi	r23, 0x00	; 0
   33d3a:	60 e0       	ldi	r22, 0x00	; 0
   33d3c:	2a f0       	brmi	.+10     	; 0x33d48 <__floatsisf+0x6c>
   33d3e:	9a 95       	dec	r25
   33d40:	66 0f       	add	r22, r22
   33d42:	77 1f       	adc	r23, r23
   33d44:	88 1f       	adc	r24, r24
   33d46:	da f7       	brpl	.-10     	; 0x33d3e <__floatsisf+0x62>
   33d48:	88 0f       	add	r24, r24
   33d4a:	96 95       	lsr	r25
   33d4c:	87 95       	ror	r24
   33d4e:	97 f9       	bld	r25, 7
   33d50:	08 95       	ret

00033d52 <square>:
   33d52:	9b 01       	movw	r18, r22
   33d54:	ac 01       	movw	r20, r24
   33d56:	0d 94 ad 9e 	jmp	0x33d5a	; 0x33d5a <__mulsf3>

00033d5a <__mulsf3>:
   33d5a:	0f 94 c0 9e 	call	0x33d80	; 0x33d80 <__mulsf3x>
   33d5e:	0d 94 31 9f 	jmp	0x33e62	; 0x33e62 <__fp_round>
   33d62:	0f 94 23 9f 	call	0x33e46	; 0x33e46 <__fp_pscA>
   33d66:	38 f0       	brcs	.+14     	; 0x33d76 <__mulsf3+0x1c>
   33d68:	0f 94 2a 9f 	call	0x33e54	; 0x33e54 <__fp_pscB>
   33d6c:	20 f0       	brcs	.+8      	; 0x33d76 <__mulsf3+0x1c>
   33d6e:	95 23       	and	r25, r21
   33d70:	11 f0       	breq	.+4      	; 0x33d76 <__mulsf3+0x1c>
   33d72:	0d 94 1a 9f 	jmp	0x33e34	; 0x33e34 <__fp_inf>
   33d76:	0d 94 20 9f 	jmp	0x33e40	; 0x33e40 <__fp_nan>
   33d7a:	11 24       	eor	r1, r1
   33d7c:	0d 94 65 9f 	jmp	0x33eca	; 0x33eca <__fp_szero>

00033d80 <__mulsf3x>:
   33d80:	0f 94 42 9f 	call	0x33e84	; 0x33e84 <__fp_split3>
   33d84:	70 f3       	brcs	.-36     	; 0x33d62 <__mulsf3+0x8>

00033d86 <__mulsf3_pse>:
   33d86:	95 9f       	mul	r25, r21
   33d88:	c1 f3       	breq	.-16     	; 0x33d7a <__mulsf3+0x20>
   33d8a:	95 0f       	add	r25, r21
   33d8c:	50 e0       	ldi	r21, 0x00	; 0
   33d8e:	55 1f       	adc	r21, r21
   33d90:	62 9f       	mul	r22, r18
   33d92:	f0 01       	movw	r30, r0
   33d94:	72 9f       	mul	r23, r18
   33d96:	bb 27       	eor	r27, r27
   33d98:	f0 0d       	add	r31, r0
   33d9a:	b1 1d       	adc	r27, r1
   33d9c:	63 9f       	mul	r22, r19
   33d9e:	aa 27       	eor	r26, r26
   33da0:	f0 0d       	add	r31, r0
   33da2:	b1 1d       	adc	r27, r1
   33da4:	aa 1f       	adc	r26, r26
   33da6:	64 9f       	mul	r22, r20
   33da8:	66 27       	eor	r22, r22
   33daa:	b0 0d       	add	r27, r0
   33dac:	a1 1d       	adc	r26, r1
   33dae:	66 1f       	adc	r22, r22
   33db0:	82 9f       	mul	r24, r18
   33db2:	22 27       	eor	r18, r18
   33db4:	b0 0d       	add	r27, r0
   33db6:	a1 1d       	adc	r26, r1
   33db8:	62 1f       	adc	r22, r18
   33dba:	73 9f       	mul	r23, r19
   33dbc:	b0 0d       	add	r27, r0
   33dbe:	a1 1d       	adc	r26, r1
   33dc0:	62 1f       	adc	r22, r18
   33dc2:	83 9f       	mul	r24, r19
   33dc4:	a0 0d       	add	r26, r0
   33dc6:	61 1d       	adc	r22, r1
   33dc8:	22 1f       	adc	r18, r18
   33dca:	74 9f       	mul	r23, r20
   33dcc:	33 27       	eor	r19, r19
   33dce:	a0 0d       	add	r26, r0
   33dd0:	61 1d       	adc	r22, r1
   33dd2:	23 1f       	adc	r18, r19
   33dd4:	84 9f       	mul	r24, r20
   33dd6:	60 0d       	add	r22, r0
   33dd8:	21 1d       	adc	r18, r1
   33dda:	82 2f       	mov	r24, r18
   33ddc:	76 2f       	mov	r23, r22
   33dde:	6a 2f       	mov	r22, r26
   33de0:	11 24       	eor	r1, r1
   33de2:	9f 57       	subi	r25, 0x7F	; 127
   33de4:	50 40       	sbci	r21, 0x00	; 0
   33de6:	9a f0       	brmi	.+38     	; 0x33e0e <__mulsf3_pse+0x88>
   33de8:	f1 f0       	breq	.+60     	; 0x33e26 <__mulsf3_pse+0xa0>
   33dea:	88 23       	and	r24, r24
   33dec:	4a f0       	brmi	.+18     	; 0x33e00 <__mulsf3_pse+0x7a>
   33dee:	ee 0f       	add	r30, r30
   33df0:	ff 1f       	adc	r31, r31
   33df2:	bb 1f       	adc	r27, r27
   33df4:	66 1f       	adc	r22, r22
   33df6:	77 1f       	adc	r23, r23
   33df8:	88 1f       	adc	r24, r24
   33dfa:	91 50       	subi	r25, 0x01	; 1
   33dfc:	50 40       	sbci	r21, 0x00	; 0
   33dfe:	a9 f7       	brne	.-22     	; 0x33dea <__mulsf3_pse+0x64>
   33e00:	9e 3f       	cpi	r25, 0xFE	; 254
   33e02:	51 05       	cpc	r21, r1
   33e04:	80 f0       	brcs	.+32     	; 0x33e26 <__mulsf3_pse+0xa0>
   33e06:	0d 94 1a 9f 	jmp	0x33e34	; 0x33e34 <__fp_inf>
   33e0a:	0d 94 65 9f 	jmp	0x33eca	; 0x33eca <__fp_szero>
   33e0e:	5f 3f       	cpi	r21, 0xFF	; 255
   33e10:	e4 f3       	brlt	.-8      	; 0x33e0a <__mulsf3_pse+0x84>
   33e12:	98 3e       	cpi	r25, 0xE8	; 232
   33e14:	d4 f3       	brlt	.-12     	; 0x33e0a <__mulsf3_pse+0x84>
   33e16:	86 95       	lsr	r24
   33e18:	77 95       	ror	r23
   33e1a:	67 95       	ror	r22
   33e1c:	b7 95       	ror	r27
   33e1e:	f7 95       	ror	r31
   33e20:	e7 95       	ror	r30
   33e22:	9f 5f       	subi	r25, 0xFF	; 255
   33e24:	c1 f7       	brne	.-16     	; 0x33e16 <__mulsf3_pse+0x90>
   33e26:	fe 2b       	or	r31, r30
   33e28:	88 0f       	add	r24, r24
   33e2a:	91 1d       	adc	r25, r1
   33e2c:	96 95       	lsr	r25
   33e2e:	87 95       	ror	r24
   33e30:	97 f9       	bld	r25, 7
   33e32:	08 95       	ret

00033e34 <__fp_inf>:
   33e34:	97 f9       	bld	r25, 7
   33e36:	9f 67       	ori	r25, 0x7F	; 127
   33e38:	80 e8       	ldi	r24, 0x80	; 128
   33e3a:	70 e0       	ldi	r23, 0x00	; 0
   33e3c:	60 e0       	ldi	r22, 0x00	; 0
   33e3e:	08 95       	ret

00033e40 <__fp_nan>:
   33e40:	9f ef       	ldi	r25, 0xFF	; 255
   33e42:	80 ec       	ldi	r24, 0xC0	; 192
   33e44:	08 95       	ret

00033e46 <__fp_pscA>:
   33e46:	00 24       	eor	r0, r0
   33e48:	0a 94       	dec	r0
   33e4a:	16 16       	cp	r1, r22
   33e4c:	17 06       	cpc	r1, r23
   33e4e:	18 06       	cpc	r1, r24
   33e50:	09 06       	cpc	r0, r25
   33e52:	08 95       	ret

00033e54 <__fp_pscB>:
   33e54:	00 24       	eor	r0, r0
   33e56:	0a 94       	dec	r0
   33e58:	12 16       	cp	r1, r18
   33e5a:	13 06       	cpc	r1, r19
   33e5c:	14 06       	cpc	r1, r20
   33e5e:	05 06       	cpc	r0, r21
   33e60:	08 95       	ret

00033e62 <__fp_round>:
   33e62:	09 2e       	mov	r0, r25
   33e64:	03 94       	inc	r0
   33e66:	00 0c       	add	r0, r0
   33e68:	11 f4       	brne	.+4      	; 0x33e6e <__fp_round+0xc>
   33e6a:	88 23       	and	r24, r24
   33e6c:	52 f0       	brmi	.+20     	; 0x33e82 <__fp_round+0x20>
   33e6e:	bb 0f       	add	r27, r27
   33e70:	40 f4       	brcc	.+16     	; 0x33e82 <__fp_round+0x20>
   33e72:	bf 2b       	or	r27, r31
   33e74:	11 f4       	brne	.+4      	; 0x33e7a <__fp_round+0x18>
   33e76:	60 ff       	sbrs	r22, 0
   33e78:	04 c0       	rjmp	.+8      	; 0x33e82 <__fp_round+0x20>
   33e7a:	6f 5f       	subi	r22, 0xFF	; 255
   33e7c:	7f 4f       	sbci	r23, 0xFF	; 255
   33e7e:	8f 4f       	sbci	r24, 0xFF	; 255
   33e80:	9f 4f       	sbci	r25, 0xFF	; 255
   33e82:	08 95       	ret

00033e84 <__fp_split3>:
   33e84:	57 fd       	sbrc	r21, 7
   33e86:	90 58       	subi	r25, 0x80	; 128
   33e88:	44 0f       	add	r20, r20
   33e8a:	55 1f       	adc	r21, r21
   33e8c:	59 f0       	breq	.+22     	; 0x33ea4 <__fp_splitA+0x10>
   33e8e:	5f 3f       	cpi	r21, 0xFF	; 255
   33e90:	71 f0       	breq	.+28     	; 0x33eae <__fp_splitA+0x1a>
   33e92:	47 95       	ror	r20

00033e94 <__fp_splitA>:
   33e94:	88 0f       	add	r24, r24
   33e96:	97 fb       	bst	r25, 7
   33e98:	99 1f       	adc	r25, r25
   33e9a:	61 f0       	breq	.+24     	; 0x33eb4 <__fp_splitA+0x20>
   33e9c:	9f 3f       	cpi	r25, 0xFF	; 255
   33e9e:	79 f0       	breq	.+30     	; 0x33ebe <__fp_splitA+0x2a>
   33ea0:	87 95       	ror	r24
   33ea2:	08 95       	ret
   33ea4:	12 16       	cp	r1, r18
   33ea6:	13 06       	cpc	r1, r19
   33ea8:	14 06       	cpc	r1, r20
   33eaa:	55 1f       	adc	r21, r21
   33eac:	f2 cf       	rjmp	.-28     	; 0x33e92 <__fp_split3+0xe>
   33eae:	46 95       	lsr	r20
   33eb0:	f1 df       	rcall	.-30     	; 0x33e94 <__fp_splitA>
   33eb2:	08 c0       	rjmp	.+16     	; 0x33ec4 <__fp_splitA+0x30>
   33eb4:	16 16       	cp	r1, r22
   33eb6:	17 06       	cpc	r1, r23
   33eb8:	18 06       	cpc	r1, r24
   33eba:	99 1f       	adc	r25, r25
   33ebc:	f1 cf       	rjmp	.-30     	; 0x33ea0 <__fp_splitA+0xc>
   33ebe:	86 95       	lsr	r24
   33ec0:	71 05       	cpc	r23, r1
   33ec2:	61 05       	cpc	r22, r1
   33ec4:	08 94       	sec
   33ec6:	08 95       	ret

00033ec8 <__fp_zero>:
   33ec8:	e8 94       	clt

00033eca <__fp_szero>:
   33eca:	bb 27       	eor	r27, r27
   33ecc:	66 27       	eor	r22, r22
   33ece:	77 27       	eor	r23, r23
   33ed0:	cb 01       	movw	r24, r22
   33ed2:	97 f9       	bld	r25, 7
   33ed4:	08 95       	ret

00033ed6 <strtol>:
   33ed6:	3f 92       	push	r3
   33ed8:	4f 92       	push	r4
   33eda:	5f 92       	push	r5
   33edc:	6f 92       	push	r6
   33ede:	7f 92       	push	r7
   33ee0:	8f 92       	push	r8
   33ee2:	9f 92       	push	r9
   33ee4:	af 92       	push	r10
   33ee6:	bf 92       	push	r11
   33ee8:	cf 92       	push	r12
   33eea:	df 92       	push	r13
   33eec:	ef 92       	push	r14
   33eee:	ff 92       	push	r15
   33ef0:	0f 93       	push	r16
   33ef2:	1f 93       	push	r17
   33ef4:	cf 93       	push	r28
   33ef6:	df 93       	push	r29
   33ef8:	5c 01       	movw	r10, r24
   33efa:	6b 01       	movw	r12, r22
   33efc:	7a 01       	movw	r14, r20
   33efe:	61 15       	cp	r22, r1
   33f00:	71 05       	cpc	r23, r1
   33f02:	19 f0       	breq	.+6      	; 0x33f0a <strtol+0x34>
   33f04:	fb 01       	movw	r30, r22
   33f06:	91 83       	std	Z+1, r25	; 0x01
   33f08:	80 83       	st	Z, r24
   33f0a:	e1 14       	cp	r14, r1
   33f0c:	f1 04       	cpc	r15, r1
   33f0e:	51 f0       	breq	.+20     	; 0x33f24 <strtol+0x4e>
   33f10:	c7 01       	movw	r24, r14
   33f12:	02 97       	sbiw	r24, 0x02	; 2
   33f14:	83 97       	sbiw	r24, 0x23	; 35
   33f16:	30 f0       	brcs	.+12     	; 0x33f24 <strtol+0x4e>
   33f18:	40 e0       	ldi	r20, 0x00	; 0
   33f1a:	30 e0       	ldi	r19, 0x00	; 0
   33f1c:	20 e0       	ldi	r18, 0x00	; 0
   33f1e:	90 e0       	ldi	r25, 0x00	; 0
   33f20:	6b c0       	rjmp	.+214    	; 0x33ff8 <strtol+0x122>
   33f22:	5e 01       	movw	r10, r28
   33f24:	e5 01       	movw	r28, r10
   33f26:	21 96       	adiw	r28, 0x01	; 1
   33f28:	f5 01       	movw	r30, r10
   33f2a:	10 81       	ld	r17, Z
   33f2c:	81 2f       	mov	r24, r17
   33f2e:	90 e0       	ldi	r25, 0x00	; 0
   33f30:	0f 94 71 a1 	call	0x342e2	; 0x342e2 <isspace>
   33f34:	89 2b       	or	r24, r25
   33f36:	a9 f7       	brne	.-22     	; 0x33f22 <strtol+0x4c>
   33f38:	1d 32       	cpi	r17, 0x2D	; 45
   33f3a:	01 f5       	brne	.+64     	; 0x33f7c <strtol+0xa6>
   33f3c:	21 96       	adiw	r28, 0x01	; 1
   33f3e:	f5 01       	movw	r30, r10
   33f40:	11 81       	ldd	r17, Z+1	; 0x01
   33f42:	01 e0       	ldi	r16, 0x01	; 1
   33f44:	e1 14       	cp	r14, r1
   33f46:	f1 04       	cpc	r15, r1
   33f48:	09 f4       	brne	.+2      	; 0x33f4c <strtol+0x76>
   33f4a:	e6 c0       	rjmp	.+460    	; 0x34118 <strtol+0x242>
   33f4c:	f0 e1       	ldi	r31, 0x10	; 16
   33f4e:	ef 16       	cp	r14, r31
   33f50:	f1 04       	cpc	r15, r1
   33f52:	09 f0       	breq	.+2      	; 0x33f56 <strtol+0x80>
   33f54:	88 c0       	rjmp	.+272    	; 0x34066 <strtol+0x190>
   33f56:	10 33       	cpi	r17, 0x30	; 48
   33f58:	59 f4       	brne	.+22     	; 0x33f70 <strtol+0x9a>
   33f5a:	88 81       	ld	r24, Y
   33f5c:	8f 7d       	andi	r24, 0xDF	; 223
   33f5e:	88 35       	cpi	r24, 0x58	; 88
   33f60:	09 f0       	breq	.+2      	; 0x33f64 <strtol+0x8e>
   33f62:	7c c0       	rjmp	.+248    	; 0x3405c <strtol+0x186>
   33f64:	19 81       	ldd	r17, Y+1	; 0x01
   33f66:	22 96       	adiw	r28, 0x02	; 2
   33f68:	02 60       	ori	r16, 0x02	; 2
   33f6a:	f0 e1       	ldi	r31, 0x10	; 16
   33f6c:	ef 2e       	mov	r14, r31
   33f6e:	f1 2c       	mov	r15, r1
   33f70:	81 2c       	mov	r8, r1
   33f72:	91 2c       	mov	r9, r1
   33f74:	a1 2c       	mov	r10, r1
   33f76:	88 e0       	ldi	r24, 0x08	; 8
   33f78:	b8 2e       	mov	r11, r24
   33f7a:	92 c0       	rjmp	.+292    	; 0x340a0 <strtol+0x1ca>
   33f7c:	1b 32       	cpi	r17, 0x2B	; 43
   33f7e:	21 f4       	brne	.+8      	; 0x33f88 <strtol+0xb2>
   33f80:	e5 01       	movw	r28, r10
   33f82:	22 96       	adiw	r28, 0x02	; 2
   33f84:	f5 01       	movw	r30, r10
   33f86:	11 81       	ldd	r17, Z+1	; 0x01
   33f88:	00 e0       	ldi	r16, 0x00	; 0
   33f8a:	dc cf       	rjmp	.-72     	; 0x33f44 <strtol+0x6e>
   33f8c:	ea e0       	ldi	r30, 0x0A	; 10
   33f8e:	ee 16       	cp	r14, r30
   33f90:	f1 04       	cpc	r15, r1
   33f92:	09 f4       	brne	.+2      	; 0x33f96 <strtol+0xc0>
   33f94:	c7 c0       	rjmp	.+398    	; 0x34124 <strtol+0x24e>
   33f96:	f0 e1       	ldi	r31, 0x10	; 16
   33f98:	ef 16       	cp	r14, r31
   33f9a:	f1 04       	cpc	r15, r1
   33f9c:	09 f0       	breq	.+2      	; 0x33fa0 <strtol+0xca>
   33f9e:	73 c0       	rjmp	.+230    	; 0x34086 <strtol+0x1b0>
   33fa0:	e7 cf       	rjmp	.-50     	; 0x33f70 <strtol+0x9a>
   33fa2:	78 e0       	ldi	r23, 0x08	; 8
   33fa4:	e7 2e       	mov	r14, r23
   33fa6:	f1 2c       	mov	r15, r1
   33fa8:	81 2c       	mov	r8, r1
   33faa:	91 2c       	mov	r9, r1
   33fac:	a1 2c       	mov	r10, r1
   33fae:	60 e1       	ldi	r22, 0x10	; 16
   33fb0:	b6 2e       	mov	r11, r22
   33fb2:	76 c0       	rjmp	.+236    	; 0x340a0 <strtol+0x1ca>
   33fb4:	21 e0       	ldi	r18, 0x01	; 1
   33fb6:	ad c0       	rjmp	.+346    	; 0x34112 <strtol+0x23c>
   33fb8:	30 2f       	mov	r19, r16
   33fba:	31 70       	andi	r19, 0x01	; 1
   33fbc:	c1 14       	cp	r12, r1
   33fbe:	d1 04       	cpc	r13, r1
   33fc0:	31 f0       	breq	.+12     	; 0x33fce <strtol+0xf8>
   33fc2:	22 23       	and	r18, r18
   33fc4:	71 f1       	breq	.+92     	; 0x34022 <strtol+0x14c>
   33fc6:	21 97       	sbiw	r28, 0x01	; 1
   33fc8:	f6 01       	movw	r30, r12
   33fca:	d1 83       	std	Z+1, r29	; 0x01
   33fcc:	c0 83       	st	Z, r28
   33fce:	27 ff       	sbrs	r18, 7
   33fd0:	2e c0       	rjmp	.+92     	; 0x3402e <strtol+0x158>
   33fd2:	60 e0       	ldi	r22, 0x00	; 0
   33fd4:	70 e0       	ldi	r23, 0x00	; 0
   33fd6:	80 e0       	ldi	r24, 0x00	; 0
   33fd8:	90 e8       	ldi	r25, 0x80	; 128
   33fda:	31 11       	cpse	r19, r1
   33fdc:	04 c0       	rjmp	.+8      	; 0x33fe6 <strtol+0x110>
   33fde:	6f ef       	ldi	r22, 0xFF	; 255
   33fe0:	7f ef       	ldi	r23, 0xFF	; 255
   33fe2:	8f ef       	ldi	r24, 0xFF	; 255
   33fe4:	9f e7       	ldi	r25, 0x7F	; 127
   33fe6:	22 e2       	ldi	r18, 0x22	; 34
   33fe8:	30 e0       	ldi	r19, 0x00	; 0
   33fea:	30 93 0c 17 	sts	0x170C, r19	; 0x80170c <errno+0x1>
   33fee:	20 93 0b 17 	sts	0x170B, r18	; 0x80170b <errno>
   33ff2:	46 2f       	mov	r20, r22
   33ff4:	37 2f       	mov	r19, r23
   33ff6:	28 2f       	mov	r18, r24
   33ff8:	64 2f       	mov	r22, r20
   33ffa:	73 2f       	mov	r23, r19
   33ffc:	82 2f       	mov	r24, r18
   33ffe:	df 91       	pop	r29
   34000:	cf 91       	pop	r28
   34002:	1f 91       	pop	r17
   34004:	0f 91       	pop	r16
   34006:	ff 90       	pop	r15
   34008:	ef 90       	pop	r14
   3400a:	df 90       	pop	r13
   3400c:	cf 90       	pop	r12
   3400e:	bf 90       	pop	r11
   34010:	af 90       	pop	r10
   34012:	9f 90       	pop	r9
   34014:	8f 90       	pop	r8
   34016:	7f 90       	pop	r7
   34018:	6f 90       	pop	r6
   3401a:	5f 90       	pop	r5
   3401c:	4f 90       	pop	r4
   3401e:	3f 90       	pop	r3
   34020:	08 95       	ret
   34022:	01 ff       	sbrs	r16, 1
   34024:	04 c0       	rjmp	.+8      	; 0x3402e <strtol+0x158>
   34026:	22 97       	sbiw	r28, 0x02	; 2
   34028:	f6 01       	movw	r30, r12
   3402a:	d1 83       	std	Z+1, r29	; 0x01
   3402c:	c0 83       	st	Z, r28
   3402e:	33 23       	and	r19, r19
   34030:	41 f0       	breq	.+16     	; 0x34042 <strtol+0x16c>
   34032:	90 95       	com	r25
   34034:	80 95       	com	r24
   34036:	70 95       	com	r23
   34038:	61 95       	neg	r22
   3403a:	7f 4f       	sbci	r23, 0xFF	; 255
   3403c:	8f 4f       	sbci	r24, 0xFF	; 255
   3403e:	9f 4f       	sbci	r25, 0xFF	; 255
   34040:	d8 cf       	rjmp	.-80     	; 0x33ff2 <strtol+0x11c>
   34042:	97 ff       	sbrs	r25, 7
   34044:	d6 cf       	rjmp	.-84     	; 0x33ff2 <strtol+0x11c>
   34046:	82 e2       	ldi	r24, 0x22	; 34
   34048:	90 e0       	ldi	r25, 0x00	; 0
   3404a:	90 93 0c 17 	sts	0x170C, r25	; 0x80170c <errno+0x1>
   3404e:	80 93 0b 17 	sts	0x170B, r24	; 0x80170b <errno>
   34052:	6f ef       	ldi	r22, 0xFF	; 255
   34054:	7f ef       	ldi	r23, 0xFF	; 255
   34056:	8f ef       	ldi	r24, 0xFF	; 255
   34058:	9f e7       	ldi	r25, 0x7F	; 127
   3405a:	cb cf       	rjmp	.-106    	; 0x33ff2 <strtol+0x11c>
   3405c:	10 e3       	ldi	r17, 0x30	; 48
   3405e:	e1 14       	cp	r14, r1
   34060:	f1 04       	cpc	r15, r1
   34062:	09 f4       	brne	.+2      	; 0x34066 <strtol+0x190>
   34064:	9e cf       	rjmp	.-196    	; 0x33fa2 <strtol+0xcc>
   34066:	28 e0       	ldi	r18, 0x08	; 8
   34068:	e2 16       	cp	r14, r18
   3406a:	f1 04       	cpc	r15, r1
   3406c:	09 f4       	brne	.+2      	; 0x34070 <strtol+0x19a>
   3406e:	9c cf       	rjmp	.-200    	; 0x33fa8 <strtol+0xd2>
   34070:	0c f0       	brlt	.+2      	; 0x34074 <strtol+0x19e>
   34072:	8c cf       	rjmp	.-232    	; 0x33f8c <strtol+0xb6>
   34074:	81 2c       	mov	r8, r1
   34076:	91 2c       	mov	r9, r1
   34078:	a1 2c       	mov	r10, r1
   3407a:	e0 e4       	ldi	r30, 0x40	; 64
   3407c:	be 2e       	mov	r11, r30
   3407e:	82 e0       	ldi	r24, 0x02	; 2
   34080:	e8 16       	cp	r14, r24
   34082:	f1 04       	cpc	r15, r1
   34084:	69 f0       	breq	.+26     	; 0x340a0 <strtol+0x1ca>
   34086:	60 e0       	ldi	r22, 0x00	; 0
   34088:	70 e0       	ldi	r23, 0x00	; 0
   3408a:	80 e0       	ldi	r24, 0x00	; 0
   3408c:	90 e8       	ldi	r25, 0x80	; 128
   3408e:	97 01       	movw	r18, r14
   34090:	0f 2c       	mov	r0, r15
   34092:	00 0c       	add	r0, r0
   34094:	44 0b       	sbc	r20, r20
   34096:	55 0b       	sbc	r21, r21
   34098:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
   3409c:	49 01       	movw	r8, r18
   3409e:	5a 01       	movw	r10, r20
   340a0:	20 e0       	ldi	r18, 0x00	; 0
   340a2:	60 e0       	ldi	r22, 0x00	; 0
   340a4:	70 e0       	ldi	r23, 0x00	; 0
   340a6:	cb 01       	movw	r24, r22
   340a8:	27 01       	movw	r4, r14
   340aa:	0f 2c       	mov	r0, r15
   340ac:	00 0c       	add	r0, r0
   340ae:	66 08       	sbc	r6, r6
   340b0:	77 08       	sbc	r7, r7
   340b2:	fe 01       	movw	r30, r28
   340b4:	50 ed       	ldi	r21, 0xD0	; 208
   340b6:	35 2e       	mov	r3, r21
   340b8:	31 0e       	add	r3, r17
   340ba:	39 e0       	ldi	r19, 0x09	; 9
   340bc:	33 15       	cp	r19, r3
   340be:	70 f4       	brcc	.+28     	; 0x340dc <strtol+0x206>
   340c0:	3f eb       	ldi	r19, 0xBF	; 191
   340c2:	31 0f       	add	r19, r17
   340c4:	49 ec       	ldi	r20, 0xC9	; 201
   340c6:	34 2e       	mov	r3, r20
   340c8:	3a 31       	cpi	r19, 0x1A	; 26
   340ca:	38 f0       	brcs	.+14     	; 0x340da <strtol+0x204>
   340cc:	3f e9       	ldi	r19, 0x9F	; 159
   340ce:	31 0f       	add	r19, r17
   340d0:	3a 31       	cpi	r19, 0x1A	; 26
   340d2:	08 f0       	brcs	.+2      	; 0x340d6 <strtol+0x200>
   340d4:	71 cf       	rjmp	.-286    	; 0x33fb8 <strtol+0xe2>
   340d6:	39 ea       	ldi	r19, 0xA9	; 169
   340d8:	33 2e       	mov	r3, r19
   340da:	31 0e       	add	r3, r17
   340dc:	3e 14       	cp	r3, r14
   340de:	1f 04       	cpc	r1, r15
   340e0:	0c f0       	brlt	.+2      	; 0x340e4 <strtol+0x20e>
   340e2:	6a cf       	rjmp	.-300    	; 0x33fb8 <strtol+0xe2>
   340e4:	27 fd       	sbrc	r18, 7
   340e6:	15 c0       	rjmp	.+42     	; 0x34112 <strtol+0x23c>
   340e8:	86 16       	cp	r8, r22
   340ea:	97 06       	cpc	r9, r23
   340ec:	a8 06       	cpc	r10, r24
   340ee:	b9 06       	cpc	r11, r25
   340f0:	78 f0       	brcs	.+30     	; 0x34110 <strtol+0x23a>
   340f2:	a3 01       	movw	r20, r6
   340f4:	92 01       	movw	r18, r4
   340f6:	0f 94 43 a4 	call	0x34886	; 0x34886 <__mulsi3>
   340fa:	63 0d       	add	r22, r3
   340fc:	71 1d       	adc	r23, r1
   340fe:	81 1d       	adc	r24, r1
   34100:	91 1d       	adc	r25, r1
   34102:	61 30       	cpi	r22, 0x01	; 1
   34104:	71 05       	cpc	r23, r1
   34106:	81 05       	cpc	r24, r1
   34108:	20 e8       	ldi	r18, 0x80	; 128
   3410a:	92 07       	cpc	r25, r18
   3410c:	08 f4       	brcc	.+2      	; 0x34110 <strtol+0x23a>
   3410e:	52 cf       	rjmp	.-348    	; 0x33fb4 <strtol+0xde>
   34110:	2f ef       	ldi	r18, 0xFF	; 255
   34112:	21 96       	adiw	r28, 0x01	; 1
   34114:	10 81       	ld	r17, Z
   34116:	cd cf       	rjmp	.-102    	; 0x340b2 <strtol+0x1dc>
   34118:	10 33       	cpi	r17, 0x30	; 48
   3411a:	09 f4       	brne	.+2      	; 0x3411e <strtol+0x248>
   3411c:	1e cf       	rjmp	.-452    	; 0x33f5a <strtol+0x84>
   3411e:	2a e0       	ldi	r18, 0x0A	; 10
   34120:	e2 2e       	mov	r14, r18
   34122:	f1 2c       	mov	r15, r1
   34124:	9c ec       	ldi	r25, 0xCC	; 204
   34126:	89 2e       	mov	r8, r25
   34128:	98 2c       	mov	r9, r8
   3412a:	a8 2c       	mov	r10, r8
   3412c:	9c e0       	ldi	r25, 0x0C	; 12
   3412e:	b9 2e       	mov	r11, r25
   34130:	b7 cf       	rjmp	.-146    	; 0x340a0 <strtol+0x1ca>

00034132 <__ftoa_engine>:
   34132:	28 30       	cpi	r18, 0x08	; 8
   34134:	08 f0       	brcs	.+2      	; 0x34138 <__ftoa_engine+0x6>
   34136:	27 e0       	ldi	r18, 0x07	; 7
   34138:	33 27       	eor	r19, r19
   3413a:	da 01       	movw	r26, r20
   3413c:	99 0f       	add	r25, r25
   3413e:	31 1d       	adc	r19, r1
   34140:	87 fd       	sbrc	r24, 7
   34142:	91 60       	ori	r25, 0x01	; 1
   34144:	00 96       	adiw	r24, 0x00	; 0
   34146:	61 05       	cpc	r22, r1
   34148:	71 05       	cpc	r23, r1
   3414a:	39 f4       	brne	.+14     	; 0x3415a <__ftoa_engine+0x28>
   3414c:	32 60       	ori	r19, 0x02	; 2
   3414e:	2e 5f       	subi	r18, 0xFE	; 254
   34150:	3d 93       	st	X+, r19
   34152:	30 e3       	ldi	r19, 0x30	; 48
   34154:	2a 95       	dec	r18
   34156:	e1 f7       	brne	.-8      	; 0x34150 <__ftoa_engine+0x1e>
   34158:	08 95       	ret
   3415a:	9f 3f       	cpi	r25, 0xFF	; 255
   3415c:	30 f0       	brcs	.+12     	; 0x3416a <__ftoa_engine+0x38>
   3415e:	80 38       	cpi	r24, 0x80	; 128
   34160:	71 05       	cpc	r23, r1
   34162:	61 05       	cpc	r22, r1
   34164:	09 f0       	breq	.+2      	; 0x34168 <__ftoa_engine+0x36>
   34166:	3c 5f       	subi	r19, 0xFC	; 252
   34168:	3c 5f       	subi	r19, 0xFC	; 252
   3416a:	3d 93       	st	X+, r19
   3416c:	91 30       	cpi	r25, 0x01	; 1
   3416e:	08 f0       	brcs	.+2      	; 0x34172 <__ftoa_engine+0x40>
   34170:	80 68       	ori	r24, 0x80	; 128
   34172:	91 1d       	adc	r25, r1
   34174:	df 93       	push	r29
   34176:	cf 93       	push	r28
   34178:	1f 93       	push	r17
   3417a:	0f 93       	push	r16
   3417c:	ff 92       	push	r15
   3417e:	ef 92       	push	r14
   34180:	19 2f       	mov	r17, r25
   34182:	98 7f       	andi	r25, 0xF8	; 248
   34184:	96 95       	lsr	r25
   34186:	e9 2f       	mov	r30, r25
   34188:	96 95       	lsr	r25
   3418a:	96 95       	lsr	r25
   3418c:	e9 0f       	add	r30, r25
   3418e:	ff 27       	eor	r31, r31
   34190:	e6 52       	subi	r30, 0x26	; 38
   34192:	fe 48       	sbci	r31, 0x8E	; 142
   34194:	99 27       	eor	r25, r25
   34196:	33 27       	eor	r19, r19
   34198:	ee 24       	eor	r14, r14
   3419a:	ff 24       	eor	r15, r15
   3419c:	a7 01       	movw	r20, r14
   3419e:	e7 01       	movw	r28, r14
   341a0:	05 90       	lpm	r0, Z+
   341a2:	08 94       	sec
   341a4:	07 94       	ror	r0
   341a6:	28 f4       	brcc	.+10     	; 0x341b2 <__ftoa_engine+0x80>
   341a8:	36 0f       	add	r19, r22
   341aa:	e7 1e       	adc	r14, r23
   341ac:	f8 1e       	adc	r15, r24
   341ae:	49 1f       	adc	r20, r25
   341b0:	51 1d       	adc	r21, r1
   341b2:	66 0f       	add	r22, r22
   341b4:	77 1f       	adc	r23, r23
   341b6:	88 1f       	adc	r24, r24
   341b8:	99 1f       	adc	r25, r25
   341ba:	06 94       	lsr	r0
   341bc:	a1 f7       	brne	.-24     	; 0x341a6 <__ftoa_engine+0x74>
   341be:	05 90       	lpm	r0, Z+
   341c0:	07 94       	ror	r0
   341c2:	28 f4       	brcc	.+10     	; 0x341ce <__ftoa_engine+0x9c>
   341c4:	e7 0e       	add	r14, r23
   341c6:	f8 1e       	adc	r15, r24
   341c8:	49 1f       	adc	r20, r25
   341ca:	56 1f       	adc	r21, r22
   341cc:	c1 1d       	adc	r28, r1
   341ce:	77 0f       	add	r23, r23
   341d0:	88 1f       	adc	r24, r24
   341d2:	99 1f       	adc	r25, r25
   341d4:	66 1f       	adc	r22, r22
   341d6:	06 94       	lsr	r0
   341d8:	a1 f7       	brne	.-24     	; 0x341c2 <__ftoa_engine+0x90>
   341da:	05 90       	lpm	r0, Z+
   341dc:	07 94       	ror	r0
   341de:	28 f4       	brcc	.+10     	; 0x341ea <__ftoa_engine+0xb8>
   341e0:	f8 0e       	add	r15, r24
   341e2:	49 1f       	adc	r20, r25
   341e4:	56 1f       	adc	r21, r22
   341e6:	c7 1f       	adc	r28, r23
   341e8:	d1 1d       	adc	r29, r1
   341ea:	88 0f       	add	r24, r24
   341ec:	99 1f       	adc	r25, r25
   341ee:	66 1f       	adc	r22, r22
   341f0:	77 1f       	adc	r23, r23
   341f2:	06 94       	lsr	r0
   341f4:	a1 f7       	brne	.-24     	; 0x341de <__ftoa_engine+0xac>
   341f6:	05 90       	lpm	r0, Z+
   341f8:	07 94       	ror	r0
   341fa:	20 f4       	brcc	.+8      	; 0x34204 <__ftoa_engine+0xd2>
   341fc:	49 0f       	add	r20, r25
   341fe:	56 1f       	adc	r21, r22
   34200:	c7 1f       	adc	r28, r23
   34202:	d8 1f       	adc	r29, r24
   34204:	99 0f       	add	r25, r25
   34206:	66 1f       	adc	r22, r22
   34208:	77 1f       	adc	r23, r23
   3420a:	88 1f       	adc	r24, r24
   3420c:	06 94       	lsr	r0
   3420e:	a9 f7       	brne	.-22     	; 0x341fa <__ftoa_engine+0xc8>
   34210:	84 91       	lpm	r24, Z
   34212:	10 95       	com	r17
   34214:	17 70       	andi	r17, 0x07	; 7
   34216:	41 f0       	breq	.+16     	; 0x34228 <__ftoa_engine+0xf6>
   34218:	d6 95       	lsr	r29
   3421a:	c7 95       	ror	r28
   3421c:	57 95       	ror	r21
   3421e:	47 95       	ror	r20
   34220:	f7 94       	ror	r15
   34222:	e7 94       	ror	r14
   34224:	1a 95       	dec	r17
   34226:	c1 f7       	brne	.-16     	; 0x34218 <__ftoa_engine+0xe6>
   34228:	e0 e8       	ldi	r30, 0x80	; 128
   3422a:	f1 e7       	ldi	r31, 0x71	; 113
   3422c:	68 94       	set
   3422e:	15 90       	lpm	r1, Z+
   34230:	15 91       	lpm	r17, Z+
   34232:	35 91       	lpm	r19, Z+
   34234:	65 91       	lpm	r22, Z+
   34236:	95 91       	lpm	r25, Z+
   34238:	05 90       	lpm	r0, Z+
   3423a:	7f e2       	ldi	r23, 0x2F	; 47
   3423c:	73 95       	inc	r23
   3423e:	e1 18       	sub	r14, r1
   34240:	f1 0a       	sbc	r15, r17
   34242:	43 0b       	sbc	r20, r19
   34244:	56 0b       	sbc	r21, r22
   34246:	c9 0b       	sbc	r28, r25
   34248:	d0 09       	sbc	r29, r0
   3424a:	c0 f7       	brcc	.-16     	; 0x3423c <__ftoa_engine+0x10a>
   3424c:	e1 0c       	add	r14, r1
   3424e:	f1 1e       	adc	r15, r17
   34250:	43 1f       	adc	r20, r19
   34252:	56 1f       	adc	r21, r22
   34254:	c9 1f       	adc	r28, r25
   34256:	d0 1d       	adc	r29, r0
   34258:	7e f4       	brtc	.+30     	; 0x34278 <__ftoa_engine+0x146>
   3425a:	70 33       	cpi	r23, 0x30	; 48
   3425c:	11 f4       	brne	.+4      	; 0x34262 <__ftoa_engine+0x130>
   3425e:	8a 95       	dec	r24
   34260:	e6 cf       	rjmp	.-52     	; 0x3422e <__ftoa_engine+0xfc>
   34262:	e8 94       	clt
   34264:	01 50       	subi	r16, 0x01	; 1
   34266:	30 f0       	brcs	.+12     	; 0x34274 <__ftoa_engine+0x142>
   34268:	08 0f       	add	r16, r24
   3426a:	0a f4       	brpl	.+2      	; 0x3426e <__ftoa_engine+0x13c>
   3426c:	00 27       	eor	r16, r16
   3426e:	02 17       	cp	r16, r18
   34270:	08 f4       	brcc	.+2      	; 0x34274 <__ftoa_engine+0x142>
   34272:	20 2f       	mov	r18, r16
   34274:	23 95       	inc	r18
   34276:	02 2f       	mov	r16, r18
   34278:	7a 33       	cpi	r23, 0x3A	; 58
   3427a:	28 f0       	brcs	.+10     	; 0x34286 <__ftoa_engine+0x154>
   3427c:	79 e3       	ldi	r23, 0x39	; 57
   3427e:	7d 93       	st	X+, r23
   34280:	2a 95       	dec	r18
   34282:	e9 f7       	brne	.-6      	; 0x3427e <__ftoa_engine+0x14c>
   34284:	10 c0       	rjmp	.+32     	; 0x342a6 <__ftoa_engine+0x174>
   34286:	7d 93       	st	X+, r23
   34288:	2a 95       	dec	r18
   3428a:	89 f6       	brne	.-94     	; 0x3422e <__ftoa_engine+0xfc>
   3428c:	06 94       	lsr	r0
   3428e:	97 95       	ror	r25
   34290:	67 95       	ror	r22
   34292:	37 95       	ror	r19
   34294:	17 95       	ror	r17
   34296:	17 94       	ror	r1
   34298:	e1 18       	sub	r14, r1
   3429a:	f1 0a       	sbc	r15, r17
   3429c:	43 0b       	sbc	r20, r19
   3429e:	56 0b       	sbc	r21, r22
   342a0:	c9 0b       	sbc	r28, r25
   342a2:	d0 09       	sbc	r29, r0
   342a4:	98 f0       	brcs	.+38     	; 0x342cc <__ftoa_engine+0x19a>
   342a6:	23 95       	inc	r18
   342a8:	7e 91       	ld	r23, -X
   342aa:	73 95       	inc	r23
   342ac:	7a 33       	cpi	r23, 0x3A	; 58
   342ae:	08 f0       	brcs	.+2      	; 0x342b2 <__ftoa_engine+0x180>
   342b0:	70 e3       	ldi	r23, 0x30	; 48
   342b2:	7c 93       	st	X, r23
   342b4:	20 13       	cpse	r18, r16
   342b6:	b8 f7       	brcc	.-18     	; 0x342a6 <__ftoa_engine+0x174>
   342b8:	7e 91       	ld	r23, -X
   342ba:	70 61       	ori	r23, 0x10	; 16
   342bc:	7d 93       	st	X+, r23
   342be:	30 f0       	brcs	.+12     	; 0x342cc <__ftoa_engine+0x19a>
   342c0:	83 95       	inc	r24
   342c2:	71 e3       	ldi	r23, 0x31	; 49
   342c4:	7d 93       	st	X+, r23
   342c6:	70 e3       	ldi	r23, 0x30	; 48
   342c8:	2a 95       	dec	r18
   342ca:	e1 f7       	brne	.-8      	; 0x342c4 <__ftoa_engine+0x192>
   342cc:	11 24       	eor	r1, r1
   342ce:	ef 90       	pop	r14
   342d0:	ff 90       	pop	r15
   342d2:	0f 91       	pop	r16
   342d4:	1f 91       	pop	r17
   342d6:	cf 91       	pop	r28
   342d8:	df 91       	pop	r29
   342da:	99 27       	eor	r25, r25
   342dc:	87 fd       	sbrc	r24, 7
   342de:	90 95       	com	r25
   342e0:	08 95       	ret

000342e2 <isspace>:
   342e2:	91 11       	cpse	r25, r1
   342e4:	0d 94 cd a3 	jmp	0x3479a	; 0x3479a <__ctype_isfalse>
   342e8:	80 32       	cpi	r24, 0x20	; 32
   342ea:	19 f0       	breq	.+6      	; 0x342f2 <isspace+0x10>
   342ec:	89 50       	subi	r24, 0x09	; 9
   342ee:	85 50       	subi	r24, 0x05	; 5
   342f0:	c8 f7       	brcc	.-14     	; 0x342e4 <isspace+0x2>
   342f2:	08 95       	ret

000342f4 <memcpy_P>:
   342f4:	fb 01       	movw	r30, r22
   342f6:	dc 01       	movw	r26, r24
   342f8:	02 c0       	rjmp	.+4      	; 0x342fe <memcpy_P+0xa>
   342fa:	05 90       	lpm	r0, Z+
   342fc:	0d 92       	st	X+, r0
   342fe:	41 50       	subi	r20, 0x01	; 1
   34300:	50 40       	sbci	r21, 0x00	; 0
   34302:	d8 f7       	brcc	.-10     	; 0x342fa <memcpy_P+0x6>
   34304:	08 95       	ret

00034306 <strcat_P>:
   34306:	fb 01       	movw	r30, r22
   34308:	dc 01       	movw	r26, r24
   3430a:	0d 90       	ld	r0, X+
   3430c:	00 20       	and	r0, r0
   3430e:	e9 f7       	brne	.-6      	; 0x3430a <strcat_P+0x4>
   34310:	11 97       	sbiw	r26, 0x01	; 1
   34312:	05 90       	lpm	r0, Z+
   34314:	0d 92       	st	X+, r0
   34316:	00 20       	and	r0, r0
   34318:	e1 f7       	brne	.-8      	; 0x34312 <strcat_P+0xc>
   3431a:	08 95       	ret

0003431c <strcmp_P>:
   3431c:	fb 01       	movw	r30, r22
   3431e:	dc 01       	movw	r26, r24
   34320:	8d 91       	ld	r24, X+
   34322:	05 90       	lpm	r0, Z+
   34324:	80 19       	sub	r24, r0
   34326:	01 10       	cpse	r0, r1
   34328:	d9 f3       	breq	.-10     	; 0x34320 <strcmp_P+0x4>
   3432a:	99 0b       	sbc	r25, r25
   3432c:	08 95       	ret

0003432e <strcpy_P>:
   3432e:	fb 01       	movw	r30, r22
   34330:	dc 01       	movw	r26, r24
   34332:	05 90       	lpm	r0, Z+
   34334:	0d 92       	st	X+, r0
   34336:	00 20       	and	r0, r0
   34338:	e1 f7       	brne	.-8      	; 0x34332 <strcpy_P+0x4>
   3433a:	08 95       	ret

0003433c <__strlen_P>:
   3433c:	fc 01       	movw	r30, r24
   3433e:	05 90       	lpm	r0, Z+
   34340:	00 20       	and	r0, r0
   34342:	e9 f7       	brne	.-6      	; 0x3433e <__strlen_P+0x2>
   34344:	80 95       	com	r24
   34346:	90 95       	com	r25
   34348:	8e 0f       	add	r24, r30
   3434a:	9f 1f       	adc	r25, r31
   3434c:	08 95       	ret

0003434e <strncasecmp_P>:
   3434e:	fb 01       	movw	r30, r22
   34350:	dc 01       	movw	r26, r24
   34352:	41 50       	subi	r20, 0x01	; 1
   34354:	50 40       	sbci	r21, 0x00	; 0
   34356:	88 f0       	brcs	.+34     	; 0x3437a <strncasecmp_P+0x2c>
   34358:	8d 91       	ld	r24, X+
   3435a:	81 34       	cpi	r24, 0x41	; 65
   3435c:	1c f0       	brlt	.+6      	; 0x34364 <strncasecmp_P+0x16>
   3435e:	8b 35       	cpi	r24, 0x5B	; 91
   34360:	0c f4       	brge	.+2      	; 0x34364 <strncasecmp_P+0x16>
   34362:	80 5e       	subi	r24, 0xE0	; 224
   34364:	65 91       	lpm	r22, Z+
   34366:	61 34       	cpi	r22, 0x41	; 65
   34368:	1c f0       	brlt	.+6      	; 0x34370 <strncasecmp_P+0x22>
   3436a:	6b 35       	cpi	r22, 0x5B	; 91
   3436c:	0c f4       	brge	.+2      	; 0x34370 <strncasecmp_P+0x22>
   3436e:	60 5e       	subi	r22, 0xE0	; 224
   34370:	86 1b       	sub	r24, r22
   34372:	61 11       	cpse	r22, r1
   34374:	71 f3       	breq	.-36     	; 0x34352 <strncasecmp_P+0x4>
   34376:	99 0b       	sbc	r25, r25
   34378:	08 95       	ret
   3437a:	88 1b       	sub	r24, r24
   3437c:	fc cf       	rjmp	.-8      	; 0x34376 <strncasecmp_P+0x28>

0003437e <strncmp_P>:
   3437e:	fb 01       	movw	r30, r22
   34380:	dc 01       	movw	r26, r24
   34382:	41 50       	subi	r20, 0x01	; 1
   34384:	50 40       	sbci	r21, 0x00	; 0
   34386:	30 f0       	brcs	.+12     	; 0x34394 <strncmp_P+0x16>
   34388:	8d 91       	ld	r24, X+
   3438a:	05 90       	lpm	r0, Z+
   3438c:	80 19       	sub	r24, r0
   3438e:	19 f4       	brne	.+6      	; 0x34396 <strncmp_P+0x18>
   34390:	00 20       	and	r0, r0
   34392:	b9 f7       	brne	.-18     	; 0x34382 <strncmp_P+0x4>
   34394:	88 1b       	sub	r24, r24
   34396:	99 0b       	sbc	r25, r25
   34398:	08 95       	ret

0003439a <strncpy_P>:
   3439a:	fb 01       	movw	r30, r22
   3439c:	dc 01       	movw	r26, r24
   3439e:	41 50       	subi	r20, 0x01	; 1
   343a0:	50 40       	sbci	r21, 0x00	; 0
   343a2:	48 f0       	brcs	.+18     	; 0x343b6 <strncpy_P+0x1c>
   343a4:	05 90       	lpm	r0, Z+
   343a6:	0d 92       	st	X+, r0
   343a8:	00 20       	and	r0, r0
   343aa:	c9 f7       	brne	.-14     	; 0x3439e <strncpy_P+0x4>
   343ac:	01 c0       	rjmp	.+2      	; 0x343b0 <strncpy_P+0x16>
   343ae:	1d 92       	st	X+, r1
   343b0:	41 50       	subi	r20, 0x01	; 1
   343b2:	50 40       	sbci	r21, 0x00	; 0
   343b4:	e0 f7       	brcc	.-8      	; 0x343ae <strncpy_P+0x14>
   343b6:	08 95       	ret

000343b8 <strnlen_P>:
   343b8:	fc 01       	movw	r30, r24
   343ba:	05 90       	lpm	r0, Z+
   343bc:	61 50       	subi	r22, 0x01	; 1
   343be:	70 40       	sbci	r23, 0x00	; 0
   343c0:	01 10       	cpse	r0, r1
   343c2:	d8 f7       	brcc	.-10     	; 0x343ba <strnlen_P+0x2>
   343c4:	80 95       	com	r24
   343c6:	90 95       	com	r25
   343c8:	8e 0f       	add	r24, r30
   343ca:	9f 1f       	adc	r25, r31
   343cc:	08 95       	ret

000343ce <strstr_P>:
   343ce:	fb 01       	movw	r30, r22
   343d0:	55 91       	lpm	r21, Z+
   343d2:	55 23       	and	r21, r21
   343d4:	a9 f0       	breq	.+42     	; 0x34400 <strstr_P+0x32>
   343d6:	bf 01       	movw	r22, r30
   343d8:	dc 01       	movw	r26, r24
   343da:	4d 91       	ld	r20, X+
   343dc:	45 17       	cp	r20, r21
   343de:	41 11       	cpse	r20, r1
   343e0:	e1 f7       	brne	.-8      	; 0x343da <strstr_P+0xc>
   343e2:	59 f4       	brne	.+22     	; 0x343fa <strstr_P+0x2c>
   343e4:	cd 01       	movw	r24, r26
   343e6:	05 90       	lpm	r0, Z+
   343e8:	00 20       	and	r0, r0
   343ea:	49 f0       	breq	.+18     	; 0x343fe <strstr_P+0x30>
   343ec:	4d 91       	ld	r20, X+
   343ee:	40 15       	cp	r20, r0
   343f0:	41 11       	cpse	r20, r1
   343f2:	c9 f3       	breq	.-14     	; 0x343e6 <strstr_P+0x18>
   343f4:	fb 01       	movw	r30, r22
   343f6:	41 11       	cpse	r20, r1
   343f8:	ef cf       	rjmp	.-34     	; 0x343d8 <strstr_P+0xa>
   343fa:	81 e0       	ldi	r24, 0x01	; 1
   343fc:	90 e0       	ldi	r25, 0x00	; 0
   343fe:	01 97       	sbiw	r24, 0x01	; 1
   34400:	08 95       	ret

00034402 <strnlen>:
   34402:	fc 01       	movw	r30, r24
   34404:	61 50       	subi	r22, 0x01	; 1
   34406:	70 40       	sbci	r23, 0x00	; 0
   34408:	01 90       	ld	r0, Z+
   3440a:	01 10       	cpse	r0, r1
   3440c:	d8 f7       	brcc	.-10     	; 0x34404 <strnlen+0x2>
   3440e:	80 95       	com	r24
   34410:	90 95       	com	r25
   34412:	8e 0f       	add	r24, r30
   34414:	9f 1f       	adc	r25, r31
   34416:	08 95       	ret

00034418 <fgetc>:
   34418:	cf 93       	push	r28
   3441a:	df 93       	push	r29
   3441c:	ec 01       	movw	r28, r24
   3441e:	2b 81       	ldd	r18, Y+3	; 0x03
   34420:	20 ff       	sbrs	r18, 0
   34422:	1a c0       	rjmp	.+52     	; 0x34458 <fgetc+0x40>
   34424:	26 ff       	sbrs	r18, 6
   34426:	0c c0       	rjmp	.+24     	; 0x34440 <fgetc+0x28>
   34428:	2f 7b       	andi	r18, 0xBF	; 191
   3442a:	2b 83       	std	Y+3, r18	; 0x03
   3442c:	8e 81       	ldd	r24, Y+6	; 0x06
   3442e:	9f 81       	ldd	r25, Y+7	; 0x07
   34430:	01 96       	adiw	r24, 0x01	; 1
   34432:	9f 83       	std	Y+7, r25	; 0x07
   34434:	8e 83       	std	Y+6, r24	; 0x06
   34436:	8a 81       	ldd	r24, Y+2	; 0x02
   34438:	90 e0       	ldi	r25, 0x00	; 0
   3443a:	df 91       	pop	r29
   3443c:	cf 91       	pop	r28
   3443e:	08 95       	ret
   34440:	22 ff       	sbrs	r18, 2
   34442:	18 c0       	rjmp	.+48     	; 0x34474 <fgetc+0x5c>
   34444:	e8 81       	ld	r30, Y
   34446:	f9 81       	ldd	r31, Y+1	; 0x01
   34448:	80 81       	ld	r24, Z
   3444a:	08 2e       	mov	r0, r24
   3444c:	00 0c       	add	r0, r0
   3444e:	99 0b       	sbc	r25, r25
   34450:	00 97       	sbiw	r24, 0x00	; 0
   34452:	29 f4       	brne	.+10     	; 0x3445e <fgetc+0x46>
   34454:	20 62       	ori	r18, 0x20	; 32
   34456:	2b 83       	std	Y+3, r18	; 0x03
   34458:	8f ef       	ldi	r24, 0xFF	; 255
   3445a:	9f ef       	ldi	r25, 0xFF	; 255
   3445c:	ee cf       	rjmp	.-36     	; 0x3443a <fgetc+0x22>
   3445e:	31 96       	adiw	r30, 0x01	; 1
   34460:	f9 83       	std	Y+1, r31	; 0x01
   34462:	e8 83       	st	Y, r30
   34464:	2e 81       	ldd	r18, Y+6	; 0x06
   34466:	3f 81       	ldd	r19, Y+7	; 0x07
   34468:	2f 5f       	subi	r18, 0xFF	; 255
   3446a:	3f 4f       	sbci	r19, 0xFF	; 255
   3446c:	3f 83       	std	Y+7, r19	; 0x07
   3446e:	2e 83       	std	Y+6, r18	; 0x06
   34470:	99 27       	eor	r25, r25
   34472:	e3 cf       	rjmp	.-58     	; 0x3443a <fgetc+0x22>
   34474:	ea 85       	ldd	r30, Y+10	; 0x0a
   34476:	fb 85       	ldd	r31, Y+11	; 0x0b
   34478:	19 95       	eicall
   3447a:	97 ff       	sbrs	r25, 7
   3447c:	f3 cf       	rjmp	.-26     	; 0x34464 <fgetc+0x4c>
   3447e:	2b 81       	ldd	r18, Y+3	; 0x03
   34480:	01 96       	adiw	r24, 0x01	; 1
   34482:	21 f0       	breq	.+8      	; 0x3448c <fgetc+0x74>
   34484:	80 e2       	ldi	r24, 0x20	; 32
   34486:	82 2b       	or	r24, r18
   34488:	8b 83       	std	Y+3, r24	; 0x03
   3448a:	e6 cf       	rjmp	.-52     	; 0x34458 <fgetc+0x40>
   3448c:	80 e1       	ldi	r24, 0x10	; 16
   3448e:	fb cf       	rjmp	.-10     	; 0x34486 <fgetc+0x6e>

00034490 <fputc>:
   34490:	0f 93       	push	r16
   34492:	1f 93       	push	r17
   34494:	cf 93       	push	r28
   34496:	df 93       	push	r29
   34498:	18 2f       	mov	r17, r24
   3449a:	09 2f       	mov	r16, r25
   3449c:	eb 01       	movw	r28, r22
   3449e:	8b 81       	ldd	r24, Y+3	; 0x03
   344a0:	81 fd       	sbrc	r24, 1
   344a2:	09 c0       	rjmp	.+18     	; 0x344b6 <fputc+0x26>
   344a4:	1f ef       	ldi	r17, 0xFF	; 255
   344a6:	0f ef       	ldi	r16, 0xFF	; 255
   344a8:	81 2f       	mov	r24, r17
   344aa:	90 2f       	mov	r25, r16
   344ac:	df 91       	pop	r29
   344ae:	cf 91       	pop	r28
   344b0:	1f 91       	pop	r17
   344b2:	0f 91       	pop	r16
   344b4:	08 95       	ret
   344b6:	82 ff       	sbrs	r24, 2
   344b8:	14 c0       	rjmp	.+40     	; 0x344e2 <fputc+0x52>
   344ba:	2e 81       	ldd	r18, Y+6	; 0x06
   344bc:	3f 81       	ldd	r19, Y+7	; 0x07
   344be:	8c 81       	ldd	r24, Y+4	; 0x04
   344c0:	9d 81       	ldd	r25, Y+5	; 0x05
   344c2:	28 17       	cp	r18, r24
   344c4:	39 07       	cpc	r19, r25
   344c6:	3c f4       	brge	.+14     	; 0x344d6 <fputc+0x46>
   344c8:	e8 81       	ld	r30, Y
   344ca:	f9 81       	ldd	r31, Y+1	; 0x01
   344cc:	cf 01       	movw	r24, r30
   344ce:	01 96       	adiw	r24, 0x01	; 1
   344d0:	99 83       	std	Y+1, r25	; 0x01
   344d2:	88 83       	st	Y, r24
   344d4:	10 83       	st	Z, r17
   344d6:	8e 81       	ldd	r24, Y+6	; 0x06
   344d8:	9f 81       	ldd	r25, Y+7	; 0x07
   344da:	01 96       	adiw	r24, 0x01	; 1
   344dc:	9f 83       	std	Y+7, r25	; 0x07
   344de:	8e 83       	std	Y+6, r24	; 0x06
   344e0:	e3 cf       	rjmp	.-58     	; 0x344a8 <fputc+0x18>
   344e2:	e8 85       	ldd	r30, Y+8	; 0x08
   344e4:	f9 85       	ldd	r31, Y+9	; 0x09
   344e6:	81 2f       	mov	r24, r17
   344e8:	19 95       	eicall
   344ea:	89 2b       	or	r24, r25
   344ec:	a1 f3       	breq	.-24     	; 0x344d6 <fputc+0x46>
   344ee:	da cf       	rjmp	.-76     	; 0x344a4 <fputc+0x14>

000344f0 <fputs_P>:
   344f0:	ef 92       	push	r14
   344f2:	ff 92       	push	r15
   344f4:	0f 93       	push	r16
   344f6:	1f 93       	push	r17
   344f8:	cf 93       	push	r28
   344fa:	df 93       	push	r29
   344fc:	8c 01       	movw	r16, r24
   344fe:	7b 01       	movw	r14, r22
   34500:	db 01       	movw	r26, r22
   34502:	13 96       	adiw	r26, 0x03	; 3
   34504:	8c 91       	ld	r24, X
   34506:	d0 e0       	ldi	r29, 0x00	; 0
   34508:	c0 e0       	ldi	r28, 0x00	; 0
   3450a:	81 fd       	sbrc	r24, 1
   3450c:	0f c0       	rjmp	.+30     	; 0x3452c <fputs_P+0x3c>
   3450e:	cf ef       	ldi	r28, 0xFF	; 255
   34510:	df ef       	ldi	r29, 0xFF	; 255
   34512:	10 c0       	rjmp	.+32     	; 0x34534 <fputs_P+0x44>
   34514:	d7 01       	movw	r26, r14
   34516:	18 96       	adiw	r26, 0x08	; 8
   34518:	ed 91       	ld	r30, X+
   3451a:	fc 91       	ld	r31, X
   3451c:	b7 01       	movw	r22, r14
   3451e:	19 95       	eicall
   34520:	89 2b       	or	r24, r25
   34522:	11 f0       	breq	.+4      	; 0x34528 <fputs_P+0x38>
   34524:	cf ef       	ldi	r28, 0xFF	; 255
   34526:	df ef       	ldi	r29, 0xFF	; 255
   34528:	0f 5f       	subi	r16, 0xFF	; 255
   3452a:	1f 4f       	sbci	r17, 0xFF	; 255
   3452c:	f8 01       	movw	r30, r16
   3452e:	84 91       	lpm	r24, Z
   34530:	81 11       	cpse	r24, r1
   34532:	f0 cf       	rjmp	.-32     	; 0x34514 <fputs_P+0x24>
   34534:	ce 01       	movw	r24, r28
   34536:	df 91       	pop	r29
   34538:	cf 91       	pop	r28
   3453a:	1f 91       	pop	r17
   3453c:	0f 91       	pop	r16
   3453e:	ff 90       	pop	r15
   34540:	ef 90       	pop	r14
   34542:	08 95       	ret

00034544 <printf_P>:
   34544:	0f 93       	push	r16
   34546:	1f 93       	push	r17
   34548:	cf 93       	push	r28
   3454a:	df 93       	push	r29
   3454c:	cd b7       	in	r28, 0x3d	; 61
   3454e:	de b7       	in	r29, 0x3e	; 62
   34550:	ae 01       	movw	r20, r28
   34552:	48 5f       	subi	r20, 0xF8	; 248
   34554:	5f 4f       	sbci	r21, 0xFF	; 255
   34556:	da 01       	movw	r26, r20
   34558:	6d 91       	ld	r22, X+
   3455a:	7d 91       	ld	r23, X+
   3455c:	ad 01       	movw	r20, r26
   3455e:	01 e1       	ldi	r16, 0x11	; 17
   34560:	17 e1       	ldi	r17, 0x17	; 23
   34562:	f8 01       	movw	r30, r16
   34564:	82 81       	ldd	r24, Z+2	; 0x02
   34566:	93 81       	ldd	r25, Z+3	; 0x03
   34568:	dc 01       	movw	r26, r24
   3456a:	13 96       	adiw	r26, 0x03	; 3
   3456c:	2c 91       	ld	r18, X
   3456e:	13 97       	sbiw	r26, 0x03	; 3
   34570:	28 60       	ori	r18, 0x08	; 8
   34572:	13 96       	adiw	r26, 0x03	; 3
   34574:	2c 93       	st	X, r18
   34576:	0e 94 27 51 	call	0xa24e	; 0xa24e <vfprintf>
   3457a:	d8 01       	movw	r26, r16
   3457c:	12 96       	adiw	r26, 0x02	; 2
   3457e:	ed 91       	ld	r30, X+
   34580:	fc 91       	ld	r31, X
   34582:	23 81       	ldd	r18, Z+3	; 0x03
   34584:	27 7f       	andi	r18, 0xF7	; 247
   34586:	23 83       	std	Z+3, r18	; 0x03
   34588:	df 91       	pop	r29
   3458a:	cf 91       	pop	r28
   3458c:	1f 91       	pop	r17
   3458e:	0f 91       	pop	r16
   34590:	08 95       	ret

00034592 <puts_P>:
   34592:	0f 93       	push	r16
   34594:	1f 93       	push	r17
   34596:	cf 93       	push	r28
   34598:	df 93       	push	r29
   3459a:	8c 01       	movw	r16, r24
   3459c:	e0 91 13 17 	lds	r30, 0x1713	; 0x801713 <__iob+0x2>
   345a0:	f0 91 14 17 	lds	r31, 0x1714	; 0x801714 <__iob+0x3>
   345a4:	83 81       	ldd	r24, Z+3	; 0x03
   345a6:	d0 e0       	ldi	r29, 0x00	; 0
   345a8:	c0 e0       	ldi	r28, 0x00	; 0
   345aa:	81 fd       	sbrc	r24, 1
   345ac:	0a c0       	rjmp	.+20     	; 0x345c2 <puts_P+0x30>
   345ae:	cf ef       	ldi	r28, 0xFF	; 255
   345b0:	df ef       	ldi	r29, 0xFF	; 255
   345b2:	17 c0       	rjmp	.+46     	; 0x345e2 <puts_P+0x50>
   345b4:	19 95       	eicall
   345b6:	89 2b       	or	r24, r25
   345b8:	11 f0       	breq	.+4      	; 0x345be <puts_P+0x2c>
   345ba:	cf ef       	ldi	r28, 0xFF	; 255
   345bc:	df ef       	ldi	r29, 0xFF	; 255
   345be:	0f 5f       	subi	r16, 0xFF	; 255
   345c0:	1f 4f       	sbci	r17, 0xFF	; 255
   345c2:	f8 01       	movw	r30, r16
   345c4:	84 91       	lpm	r24, Z
   345c6:	60 91 13 17 	lds	r22, 0x1713	; 0x801713 <__iob+0x2>
   345ca:	70 91 14 17 	lds	r23, 0x1714	; 0x801714 <__iob+0x3>
   345ce:	db 01       	movw	r26, r22
   345d0:	18 96       	adiw	r26, 0x08	; 8
   345d2:	ed 91       	ld	r30, X+
   345d4:	fc 91       	ld	r31, X
   345d6:	81 11       	cpse	r24, r1
   345d8:	ed cf       	rjmp	.-38     	; 0x345b4 <puts_P+0x22>
   345da:	8a e0       	ldi	r24, 0x0A	; 10
   345dc:	19 95       	eicall
   345de:	89 2b       	or	r24, r25
   345e0:	31 f7       	brne	.-52     	; 0x345ae <puts_P+0x1c>
   345e2:	ce 01       	movw	r24, r28
   345e4:	df 91       	pop	r29
   345e6:	cf 91       	pop	r28
   345e8:	1f 91       	pop	r17
   345ea:	0f 91       	pop	r16
   345ec:	08 95       	ret

000345ee <sprintf_P>:
   345ee:	0f 93       	push	r16
   345f0:	1f 93       	push	r17
   345f2:	cf 93       	push	r28
   345f4:	df 93       	push	r29
   345f6:	cd b7       	in	r28, 0x3d	; 61
   345f8:	de b7       	in	r29, 0x3e	; 62
   345fa:	2e 97       	sbiw	r28, 0x0e	; 14
   345fc:	0f b6       	in	r0, 0x3f	; 63
   345fe:	f8 94       	cli
   34600:	de bf       	out	0x3e, r29	; 62
   34602:	0f be       	out	0x3f, r0	; 63
   34604:	cd bf       	out	0x3d, r28	; 61
   34606:	0e 89       	ldd	r16, Y+22	; 0x16
   34608:	1f 89       	ldd	r17, Y+23	; 0x17
   3460a:	8e e0       	ldi	r24, 0x0E	; 14
   3460c:	8c 83       	std	Y+4, r24	; 0x04
   3460e:	1a 83       	std	Y+2, r17	; 0x02
   34610:	09 83       	std	Y+1, r16	; 0x01
   34612:	8f ef       	ldi	r24, 0xFF	; 255
   34614:	9f e7       	ldi	r25, 0x7F	; 127
   34616:	9e 83       	std	Y+6, r25	; 0x06
   34618:	8d 83       	std	Y+5, r24	; 0x05
   3461a:	ae 01       	movw	r20, r28
   3461c:	46 5e       	subi	r20, 0xE6	; 230
   3461e:	5f 4f       	sbci	r21, 0xFF	; 255
   34620:	68 8d       	ldd	r22, Y+24	; 0x18
   34622:	79 8d       	ldd	r23, Y+25	; 0x19
   34624:	ce 01       	movw	r24, r28
   34626:	01 96       	adiw	r24, 0x01	; 1
   34628:	0e 94 27 51 	call	0xa24e	; 0xa24e <vfprintf>
   3462c:	2f 81       	ldd	r18, Y+7	; 0x07
   3462e:	38 85       	ldd	r19, Y+8	; 0x08
   34630:	02 0f       	add	r16, r18
   34632:	13 1f       	adc	r17, r19
   34634:	f8 01       	movw	r30, r16
   34636:	10 82       	st	Z, r1
   34638:	2e 96       	adiw	r28, 0x0e	; 14
   3463a:	0f b6       	in	r0, 0x3f	; 63
   3463c:	f8 94       	cli
   3463e:	de bf       	out	0x3e, r29	; 62
   34640:	0f be       	out	0x3f, r0	; 63
   34642:	cd bf       	out	0x3d, r28	; 61
   34644:	df 91       	pop	r29
   34646:	cf 91       	pop	r28
   34648:	1f 91       	pop	r17
   3464a:	0f 91       	pop	r16
   3464c:	08 95       	ret

0003464e <vfprintf_P>:
   3464e:	cf 93       	push	r28
   34650:	df 93       	push	r29
   34652:	ec 01       	movw	r28, r24
   34654:	8b 81       	ldd	r24, Y+3	; 0x03
   34656:	88 60       	ori	r24, 0x08	; 8
   34658:	8b 83       	std	Y+3, r24	; 0x03
   3465a:	ce 01       	movw	r24, r28
   3465c:	0e 94 27 51 	call	0xa24e	; 0xa24e <vfprintf>
   34660:	2b 81       	ldd	r18, Y+3	; 0x03
   34662:	27 7f       	andi	r18, 0xF7	; 247
   34664:	2b 83       	std	Y+3, r18	; 0x03
   34666:	df 91       	pop	r29
   34668:	cf 91       	pop	r28
   3466a:	08 95       	ret

0003466c <vsnprintf_P>:
   3466c:	0f 93       	push	r16
   3466e:	1f 93       	push	r17
   34670:	cf 93       	push	r28
   34672:	df 93       	push	r29
   34674:	cd b7       	in	r28, 0x3d	; 61
   34676:	de b7       	in	r29, 0x3e	; 62
   34678:	2e 97       	sbiw	r28, 0x0e	; 14
   3467a:	0f b6       	in	r0, 0x3f	; 63
   3467c:	f8 94       	cli
   3467e:	de bf       	out	0x3e, r29	; 62
   34680:	0f be       	out	0x3f, r0	; 63
   34682:	cd bf       	out	0x3d, r28	; 61
   34684:	8c 01       	movw	r16, r24
   34686:	fa 01       	movw	r30, r20
   34688:	8e e0       	ldi	r24, 0x0E	; 14
   3468a:	8c 83       	std	Y+4, r24	; 0x04
   3468c:	1a 83       	std	Y+2, r17	; 0x02
   3468e:	09 83       	std	Y+1, r16	; 0x01
   34690:	77 ff       	sbrs	r23, 7
   34692:	02 c0       	rjmp	.+4      	; 0x34698 <vsnprintf_P+0x2c>
   34694:	60 e0       	ldi	r22, 0x00	; 0
   34696:	70 e8       	ldi	r23, 0x80	; 128
   34698:	61 50       	subi	r22, 0x01	; 1
   3469a:	71 09       	sbc	r23, r1
   3469c:	7e 83       	std	Y+6, r23	; 0x06
   3469e:	6d 83       	std	Y+5, r22	; 0x05
   346a0:	a9 01       	movw	r20, r18
   346a2:	bf 01       	movw	r22, r30
   346a4:	ce 01       	movw	r24, r28
   346a6:	01 96       	adiw	r24, 0x01	; 1
   346a8:	0e 94 27 51 	call	0xa24e	; 0xa24e <vfprintf>
   346ac:	4d 81       	ldd	r20, Y+5	; 0x05
   346ae:	5e 81       	ldd	r21, Y+6	; 0x06
   346b0:	57 fd       	sbrc	r21, 7
   346b2:	0a c0       	rjmp	.+20     	; 0x346c8 <vsnprintf_P+0x5c>
   346b4:	2f 81       	ldd	r18, Y+7	; 0x07
   346b6:	38 85       	ldd	r19, Y+8	; 0x08
   346b8:	42 17       	cp	r20, r18
   346ba:	53 07       	cpc	r21, r19
   346bc:	0c f4       	brge	.+2      	; 0x346c0 <vsnprintf_P+0x54>
   346be:	9a 01       	movw	r18, r20
   346c0:	02 0f       	add	r16, r18
   346c2:	13 1f       	adc	r17, r19
   346c4:	f8 01       	movw	r30, r16
   346c6:	10 82       	st	Z, r1
   346c8:	2e 96       	adiw	r28, 0x0e	; 14
   346ca:	0f b6       	in	r0, 0x3f	; 63
   346cc:	f8 94       	cli
   346ce:	de bf       	out	0x3e, r29	; 62
   346d0:	0f be       	out	0x3f, r0	; 63
   346d2:	cd bf       	out	0x3d, r28	; 61
   346d4:	df 91       	pop	r29
   346d6:	cf 91       	pop	r28
   346d8:	1f 91       	pop	r17
   346da:	0f 91       	pop	r16
   346dc:	08 95       	ret

000346de <__ultoa_invert>:
   346de:	fa 01       	movw	r30, r20
   346e0:	aa 27       	eor	r26, r26
   346e2:	28 30       	cpi	r18, 0x08	; 8
   346e4:	51 f1       	breq	.+84     	; 0x3473a <__ultoa_invert+0x5c>
   346e6:	20 31       	cpi	r18, 0x10	; 16
   346e8:	81 f1       	breq	.+96     	; 0x3474a <__ultoa_invert+0x6c>
   346ea:	e8 94       	clt
   346ec:	6f 93       	push	r22
   346ee:	6e 7f       	andi	r22, 0xFE	; 254
   346f0:	6e 5f       	subi	r22, 0xFE	; 254
   346f2:	7f 4f       	sbci	r23, 0xFF	; 255
   346f4:	8f 4f       	sbci	r24, 0xFF	; 255
   346f6:	9f 4f       	sbci	r25, 0xFF	; 255
   346f8:	af 4f       	sbci	r26, 0xFF	; 255
   346fa:	b1 e0       	ldi	r27, 0x01	; 1
   346fc:	3e d0       	rcall	.+124    	; 0x3477a <__ultoa_invert+0x9c>
   346fe:	b4 e0       	ldi	r27, 0x04	; 4
   34700:	3c d0       	rcall	.+120    	; 0x3477a <__ultoa_invert+0x9c>
   34702:	67 0f       	add	r22, r23
   34704:	78 1f       	adc	r23, r24
   34706:	89 1f       	adc	r24, r25
   34708:	9a 1f       	adc	r25, r26
   3470a:	a1 1d       	adc	r26, r1
   3470c:	68 0f       	add	r22, r24
   3470e:	79 1f       	adc	r23, r25
   34710:	8a 1f       	adc	r24, r26
   34712:	91 1d       	adc	r25, r1
   34714:	a1 1d       	adc	r26, r1
   34716:	6a 0f       	add	r22, r26
   34718:	71 1d       	adc	r23, r1
   3471a:	81 1d       	adc	r24, r1
   3471c:	91 1d       	adc	r25, r1
   3471e:	a1 1d       	adc	r26, r1
   34720:	20 d0       	rcall	.+64     	; 0x34762 <__ultoa_invert+0x84>
   34722:	09 f4       	brne	.+2      	; 0x34726 <__ultoa_invert+0x48>
   34724:	68 94       	set
   34726:	3f 91       	pop	r19
   34728:	2a e0       	ldi	r18, 0x0A	; 10
   3472a:	26 9f       	mul	r18, r22
   3472c:	11 24       	eor	r1, r1
   3472e:	30 19       	sub	r19, r0
   34730:	30 5d       	subi	r19, 0xD0	; 208
   34732:	31 93       	st	Z+, r19
   34734:	de f6       	brtc	.-74     	; 0x346ec <__ultoa_invert+0xe>
   34736:	cf 01       	movw	r24, r30
   34738:	08 95       	ret
   3473a:	46 2f       	mov	r20, r22
   3473c:	47 70       	andi	r20, 0x07	; 7
   3473e:	40 5d       	subi	r20, 0xD0	; 208
   34740:	41 93       	st	Z+, r20
   34742:	b3 e0       	ldi	r27, 0x03	; 3
   34744:	0f d0       	rcall	.+30     	; 0x34764 <__ultoa_invert+0x86>
   34746:	c9 f7       	brne	.-14     	; 0x3473a <__ultoa_invert+0x5c>
   34748:	f6 cf       	rjmp	.-20     	; 0x34736 <__ultoa_invert+0x58>
   3474a:	46 2f       	mov	r20, r22
   3474c:	4f 70       	andi	r20, 0x0F	; 15
   3474e:	40 5d       	subi	r20, 0xD0	; 208
   34750:	4a 33       	cpi	r20, 0x3A	; 58
   34752:	18 f0       	brcs	.+6      	; 0x3475a <__ultoa_invert+0x7c>
   34754:	49 5d       	subi	r20, 0xD9	; 217
   34756:	31 fd       	sbrc	r19, 1
   34758:	40 52       	subi	r20, 0x20	; 32
   3475a:	41 93       	st	Z+, r20
   3475c:	02 d0       	rcall	.+4      	; 0x34762 <__ultoa_invert+0x84>
   3475e:	a9 f7       	brne	.-22     	; 0x3474a <__ultoa_invert+0x6c>
   34760:	ea cf       	rjmp	.-44     	; 0x34736 <__ultoa_invert+0x58>
   34762:	b4 e0       	ldi	r27, 0x04	; 4
   34764:	a6 95       	lsr	r26
   34766:	97 95       	ror	r25
   34768:	87 95       	ror	r24
   3476a:	77 95       	ror	r23
   3476c:	67 95       	ror	r22
   3476e:	ba 95       	dec	r27
   34770:	c9 f7       	brne	.-14     	; 0x34764 <__ultoa_invert+0x86>
   34772:	00 97       	sbiw	r24, 0x00	; 0
   34774:	61 05       	cpc	r22, r1
   34776:	71 05       	cpc	r23, r1
   34778:	08 95       	ret
   3477a:	9b 01       	movw	r18, r22
   3477c:	ac 01       	movw	r20, r24
   3477e:	0a 2e       	mov	r0, r26
   34780:	06 94       	lsr	r0
   34782:	57 95       	ror	r21
   34784:	47 95       	ror	r20
   34786:	37 95       	ror	r19
   34788:	27 95       	ror	r18
   3478a:	ba 95       	dec	r27
   3478c:	c9 f7       	brne	.-14     	; 0x34780 <__ultoa_invert+0xa2>
   3478e:	62 0f       	add	r22, r18
   34790:	73 1f       	adc	r23, r19
   34792:	84 1f       	adc	r24, r20
   34794:	95 1f       	adc	r25, r21
   34796:	a0 1d       	adc	r26, r0
   34798:	08 95       	ret

0003479a <__ctype_isfalse>:
   3479a:	99 27       	eor	r25, r25
   3479c:	88 27       	eor	r24, r24

0003479e <__ctype_istrue>:
   3479e:	08 95       	ret

000347a0 <eeprom_read_block>:
   347a0:	dc 01       	movw	r26, r24
   347a2:	cb 01       	movw	r24, r22

000347a4 <eeprom_read_blraw>:
   347a4:	fc 01       	movw	r30, r24
   347a6:	f9 99       	sbic	0x1f, 1	; 31
   347a8:	fe cf       	rjmp	.-4      	; 0x347a6 <eeprom_read_blraw+0x2>
   347aa:	06 c0       	rjmp	.+12     	; 0x347b8 <eeprom_read_blraw+0x14>
   347ac:	f2 bd       	out	0x22, r31	; 34
   347ae:	e1 bd       	out	0x21, r30	; 33
   347b0:	f8 9a       	sbi	0x1f, 0	; 31
   347b2:	31 96       	adiw	r30, 0x01	; 1
   347b4:	00 b4       	in	r0, 0x20	; 32
   347b6:	0d 92       	st	X+, r0
   347b8:	41 50       	subi	r20, 0x01	; 1
   347ba:	50 40       	sbci	r21, 0x00	; 0
   347bc:	b8 f7       	brcc	.-18     	; 0x347ac <eeprom_read_blraw+0x8>
   347be:	08 95       	ret

000347c0 <eeprom_read_byte>:
   347c0:	f9 99       	sbic	0x1f, 1	; 31
   347c2:	fe cf       	rjmp	.-4      	; 0x347c0 <eeprom_read_byte>
   347c4:	92 bd       	out	0x22, r25	; 34
   347c6:	81 bd       	out	0x21, r24	; 33
   347c8:	f8 9a       	sbi	0x1f, 0	; 31
   347ca:	99 27       	eor	r25, r25
   347cc:	80 b5       	in	r24, 0x20	; 32
   347ce:	08 95       	ret

000347d0 <eeprom_read_dword>:
   347d0:	a6 e1       	ldi	r26, 0x16	; 22
   347d2:	b0 e0       	ldi	r27, 0x00	; 0
   347d4:	44 e0       	ldi	r20, 0x04	; 4
   347d6:	50 e0       	ldi	r21, 0x00	; 0
   347d8:	0d 94 d2 a3 	jmp	0x347a4	; 0x347a4 <eeprom_read_blraw>

000347dc <eeprom_read_word>:
   347dc:	a8 e1       	ldi	r26, 0x18	; 24
   347de:	b0 e0       	ldi	r27, 0x00	; 0
   347e0:	42 e0       	ldi	r20, 0x02	; 2
   347e2:	50 e0       	ldi	r21, 0x00	; 0
   347e4:	0d 94 d2 a3 	jmp	0x347a4	; 0x347a4 <eeprom_read_blraw>

000347e8 <eeprom_update_block>:
   347e8:	dc 01       	movw	r26, r24
   347ea:	a4 0f       	add	r26, r20
   347ec:	b5 1f       	adc	r27, r21
   347ee:	41 50       	subi	r20, 0x01	; 1
   347f0:	50 40       	sbci	r21, 0x00	; 0
   347f2:	48 f0       	brcs	.+18     	; 0x34806 <eeprom_update_block+0x1e>
   347f4:	cb 01       	movw	r24, r22
   347f6:	84 0f       	add	r24, r20
   347f8:	95 1f       	adc	r25, r21
   347fa:	2e 91       	ld	r18, -X
   347fc:	0f 94 05 a4 	call	0x3480a	; 0x3480a <eeprom_update_r18>
   34800:	41 50       	subi	r20, 0x01	; 1
   34802:	50 40       	sbci	r21, 0x00	; 0
   34804:	d0 f7       	brcc	.-12     	; 0x347fa <eeprom_update_block+0x12>
   34806:	08 95       	ret

00034808 <eeprom_update_byte>:
   34808:	26 2f       	mov	r18, r22

0003480a <eeprom_update_r18>:
   3480a:	f9 99       	sbic	0x1f, 1	; 31
   3480c:	fe cf       	rjmp	.-4      	; 0x3480a <eeprom_update_r18>
   3480e:	92 bd       	out	0x22, r25	; 34
   34810:	81 bd       	out	0x21, r24	; 33
   34812:	f8 9a       	sbi	0x1f, 0	; 31
   34814:	01 97       	sbiw	r24, 0x01	; 1
   34816:	00 b4       	in	r0, 0x20	; 32
   34818:	02 16       	cp	r0, r18
   3481a:	39 f0       	breq	.+14     	; 0x3482a <eeprom_update_r18+0x20>
   3481c:	1f ba       	out	0x1f, r1	; 31
   3481e:	20 bd       	out	0x20, r18	; 32
   34820:	0f b6       	in	r0, 0x3f	; 63
   34822:	f8 94       	cli
   34824:	fa 9a       	sbi	0x1f, 2	; 31
   34826:	f9 9a       	sbi	0x1f, 1	; 31
   34828:	0f be       	out	0x3f, r0	; 63
   3482a:	08 95       	ret

0003482c <eeprom_update_dword>:
   3482c:	03 96       	adiw	r24, 0x03	; 3
   3482e:	27 2f       	mov	r18, r23
   34830:	0f 94 05 a4 	call	0x3480a	; 0x3480a <eeprom_update_r18>
   34834:	0f 94 04 a4 	call	0x34808	; 0x34808 <eeprom_update_byte>
   34838:	25 2f       	mov	r18, r21
   3483a:	0f 94 05 a4 	call	0x3480a	; 0x3480a <eeprom_update_r18>
   3483e:	24 2f       	mov	r18, r20
   34840:	0d 94 05 a4 	jmp	0x3480a	; 0x3480a <eeprom_update_r18>

00034844 <eeprom_update_word>:
   34844:	01 96       	adiw	r24, 0x01	; 1
   34846:	27 2f       	mov	r18, r23
   34848:	0f 94 05 a4 	call	0x3480a	; 0x3480a <eeprom_update_r18>
   3484c:	0d 94 04 a4 	jmp	0x34808	; 0x34808 <eeprom_update_byte>

00034850 <eeprom_write_byte>:
   34850:	26 2f       	mov	r18, r22

00034852 <eeprom_write_r18>:
   34852:	f9 99       	sbic	0x1f, 1	; 31
   34854:	fe cf       	rjmp	.-4      	; 0x34852 <eeprom_write_r18>
   34856:	1f ba       	out	0x1f, r1	; 31
   34858:	92 bd       	out	0x22, r25	; 34
   3485a:	81 bd       	out	0x21, r24	; 33
   3485c:	20 bd       	out	0x20, r18	; 32
   3485e:	0f b6       	in	r0, 0x3f	; 63
   34860:	f8 94       	cli
   34862:	fa 9a       	sbi	0x1f, 2	; 31
   34864:	f9 9a       	sbi	0x1f, 1	; 31
   34866:	0f be       	out	0x3f, r0	; 63
   34868:	01 96       	adiw	r24, 0x01	; 1
   3486a:	08 95       	ret

0003486c <eeprom_write_dword>:
   3486c:	24 2f       	mov	r18, r20
   3486e:	0f 94 29 a4 	call	0x34852	; 0x34852 <eeprom_write_r18>
   34872:	25 2f       	mov	r18, r21
   34874:	0f 94 29 a4 	call	0x34852	; 0x34852 <eeprom_write_r18>
   34878:	0d 94 3e a4 	jmp	0x3487c	; 0x3487c <eeprom_write_word>

0003487c <eeprom_write_word>:
   3487c:	0f 94 28 a4 	call	0x34850	; 0x34850 <eeprom_write_byte>
   34880:	27 2f       	mov	r18, r23
   34882:	0d 94 29 a4 	jmp	0x34852	; 0x34852 <eeprom_write_r18>

00034886 <__mulsi3>:
   34886:	db 01       	movw	r26, r22
   34888:	8f 93       	push	r24
   3488a:	9f 93       	push	r25
   3488c:	0f 94 75 a4 	call	0x348ea	; 0x348ea <__muluhisi3>
   34890:	bf 91       	pop	r27
   34892:	af 91       	pop	r26
   34894:	a2 9f       	mul	r26, r18
   34896:	80 0d       	add	r24, r0
   34898:	91 1d       	adc	r25, r1
   3489a:	a3 9f       	mul	r26, r19
   3489c:	90 0d       	add	r25, r0
   3489e:	b2 9f       	mul	r27, r18
   348a0:	90 0d       	add	r25, r0
   348a2:	11 24       	eor	r1, r1
   348a4:	08 95       	ret

000348a6 <__udivmodsi4>:
   348a6:	a1 e2       	ldi	r26, 0x21	; 33
   348a8:	1a 2e       	mov	r1, r26
   348aa:	aa 1b       	sub	r26, r26
   348ac:	bb 1b       	sub	r27, r27
   348ae:	fd 01       	movw	r30, r26
   348b0:	0d c0       	rjmp	.+26     	; 0x348cc <__udivmodsi4_ep>

000348b2 <__udivmodsi4_loop>:
   348b2:	aa 1f       	adc	r26, r26
   348b4:	bb 1f       	adc	r27, r27
   348b6:	ee 1f       	adc	r30, r30
   348b8:	ff 1f       	adc	r31, r31
   348ba:	a2 17       	cp	r26, r18
   348bc:	b3 07       	cpc	r27, r19
   348be:	e4 07       	cpc	r30, r20
   348c0:	f5 07       	cpc	r31, r21
   348c2:	20 f0       	brcs	.+8      	; 0x348cc <__udivmodsi4_ep>
   348c4:	a2 1b       	sub	r26, r18
   348c6:	b3 0b       	sbc	r27, r19
   348c8:	e4 0b       	sbc	r30, r20
   348ca:	f5 0b       	sbc	r31, r21

000348cc <__udivmodsi4_ep>:
   348cc:	66 1f       	adc	r22, r22
   348ce:	77 1f       	adc	r23, r23
   348d0:	88 1f       	adc	r24, r24
   348d2:	99 1f       	adc	r25, r25
   348d4:	1a 94       	dec	r1
   348d6:	69 f7       	brne	.-38     	; 0x348b2 <__udivmodsi4_loop>
   348d8:	60 95       	com	r22
   348da:	70 95       	com	r23
   348dc:	80 95       	com	r24
   348de:	90 95       	com	r25
   348e0:	9b 01       	movw	r18, r22
   348e2:	ac 01       	movw	r20, r24
   348e4:	bd 01       	movw	r22, r26
   348e6:	cf 01       	movw	r24, r30
   348e8:	08 95       	ret

000348ea <__muluhisi3>:
   348ea:	0f 94 80 a4 	call	0x34900	; 0x34900 <__umulhisi3>
   348ee:	a5 9f       	mul	r26, r21
   348f0:	90 0d       	add	r25, r0
   348f2:	b4 9f       	mul	r27, r20
   348f4:	90 0d       	add	r25, r0
   348f6:	a4 9f       	mul	r26, r20
   348f8:	80 0d       	add	r24, r0
   348fa:	91 1d       	adc	r25, r1
   348fc:	11 24       	eor	r1, r1
   348fe:	08 95       	ret

00034900 <__umulhisi3>:
   34900:	a2 9f       	mul	r26, r18
   34902:	b0 01       	movw	r22, r0
   34904:	b3 9f       	mul	r27, r19
   34906:	c0 01       	movw	r24, r0
   34908:	a3 9f       	mul	r26, r19
   3490a:	70 0d       	add	r23, r0
   3490c:	81 1d       	adc	r24, r1
   3490e:	11 24       	eor	r1, r1
   34910:	91 1d       	adc	r25, r1
   34912:	b2 9f       	mul	r27, r18
   34914:	70 0d       	add	r23, r0
   34916:	81 1d       	adc	r24, r1
   34918:	11 24       	eor	r1, r1
   3491a:	91 1d       	adc	r25, r1
   3491c:	08 95       	ret

0003491e <__udivmodqi4>:
   3491e:	99 1b       	sub	r25, r25
   34920:	79 e0       	ldi	r23, 0x09	; 9
   34922:	04 c0       	rjmp	.+8      	; 0x3492c <__udivmodqi4_ep>

00034924 <__udivmodqi4_loop>:
   34924:	99 1f       	adc	r25, r25
   34926:	96 17       	cp	r25, r22
   34928:	08 f0       	brcs	.+2      	; 0x3492c <__udivmodqi4_ep>
   3492a:	96 1b       	sub	r25, r22

0003492c <__udivmodqi4_ep>:
   3492c:	88 1f       	adc	r24, r24
   3492e:	7a 95       	dec	r23
   34930:	c9 f7       	brne	.-14     	; 0x34924 <__udivmodqi4_loop>
   34932:	80 95       	com	r24
   34934:	08 95       	ret

00034936 <__divmodqi4>:
   34936:	87 fb       	bst	r24, 7
   34938:	08 2e       	mov	r0, r24
   3493a:	06 26       	eor	r0, r22
   3493c:	87 fd       	sbrc	r24, 7
   3493e:	81 95       	neg	r24
   34940:	67 fd       	sbrc	r22, 7
   34942:	61 95       	neg	r22
   34944:	0f 94 8f a4 	call	0x3491e	; 0x3491e <__udivmodqi4>
   34948:	0e f4       	brtc	.+2      	; 0x3494c <__divmodqi4_1>
   3494a:	91 95       	neg	r25

0003494c <__divmodqi4_1>:
   3494c:	07 fc       	sbrc	r0, 7
   3494e:	81 95       	neg	r24

00034950 <__divmodqi4_exit>:
   34950:	08 95       	ret

00034952 <__udivmodhi4>:
   34952:	aa 1b       	sub	r26, r26
   34954:	bb 1b       	sub	r27, r27
   34956:	51 e1       	ldi	r21, 0x11	; 17
   34958:	07 c0       	rjmp	.+14     	; 0x34968 <__udivmodhi4_ep>

0003495a <__udivmodhi4_loop>:
   3495a:	aa 1f       	adc	r26, r26
   3495c:	bb 1f       	adc	r27, r27
   3495e:	a6 17       	cp	r26, r22
   34960:	b7 07       	cpc	r27, r23
   34962:	10 f0       	brcs	.+4      	; 0x34968 <__udivmodhi4_ep>
   34964:	a6 1b       	sub	r26, r22
   34966:	b7 0b       	sbc	r27, r23

00034968 <__udivmodhi4_ep>:
   34968:	88 1f       	adc	r24, r24
   3496a:	99 1f       	adc	r25, r25
   3496c:	5a 95       	dec	r21
   3496e:	a9 f7       	brne	.-22     	; 0x3495a <__udivmodhi4_loop>
   34970:	80 95       	com	r24
   34972:	90 95       	com	r25
   34974:	bc 01       	movw	r22, r24
   34976:	cd 01       	movw	r24, r26
   34978:	08 95       	ret

0003497a <__divmodhi4>:
   3497a:	97 fb       	bst	r25, 7
   3497c:	07 2e       	mov	r0, r23
   3497e:	16 f4       	brtc	.+4      	; 0x34984 <__divmodhi4+0xa>
   34980:	00 94       	com	r0
   34982:	07 d0       	rcall	.+14     	; 0x34992 <__divmodhi4_neg1>
   34984:	77 fd       	sbrc	r23, 7
   34986:	09 d0       	rcall	.+18     	; 0x3499a <__divmodhi4_neg2>
   34988:	0f 94 a9 a4 	call	0x34952	; 0x34952 <__udivmodhi4>
   3498c:	07 fc       	sbrc	r0, 7
   3498e:	05 d0       	rcall	.+10     	; 0x3499a <__divmodhi4_neg2>
   34990:	3e f4       	brtc	.+14     	; 0x349a0 <__divmodhi4_exit>

00034992 <__divmodhi4_neg1>:
   34992:	90 95       	com	r25
   34994:	81 95       	neg	r24
   34996:	9f 4f       	sbci	r25, 0xFF	; 255
   34998:	08 95       	ret

0003499a <__divmodhi4_neg2>:
   3499a:	70 95       	com	r23
   3499c:	61 95       	neg	r22
   3499e:	7f 4f       	sbci	r23, 0xFF	; 255

000349a0 <__divmodhi4_exit>:
   349a0:	08 95       	ret

000349a2 <__divmodsi4>:
   349a2:	05 2e       	mov	r0, r21
   349a4:	97 fb       	bst	r25, 7
   349a6:	1e f4       	brtc	.+6      	; 0x349ae <__divmodsi4+0xc>
   349a8:	00 94       	com	r0
   349aa:	0f 94 e8 a4 	call	0x349d0	; 0x349d0 <__negsi2>
   349ae:	57 fd       	sbrc	r21, 7
   349b0:	07 d0       	rcall	.+14     	; 0x349c0 <__divmodsi4_neg2>
   349b2:	0f 94 53 a4 	call	0x348a6	; 0x348a6 <__udivmodsi4>
   349b6:	07 fc       	sbrc	r0, 7
   349b8:	03 d0       	rcall	.+6      	; 0x349c0 <__divmodsi4_neg2>
   349ba:	4e f4       	brtc	.+18     	; 0x349ce <__divmodsi4_exit>
   349bc:	0d 94 e8 a4 	jmp	0x349d0	; 0x349d0 <__negsi2>

000349c0 <__divmodsi4_neg2>:
   349c0:	50 95       	com	r21
   349c2:	40 95       	com	r20
   349c4:	30 95       	com	r19
   349c6:	21 95       	neg	r18
   349c8:	3f 4f       	sbci	r19, 0xFF	; 255
   349ca:	4f 4f       	sbci	r20, 0xFF	; 255
   349cc:	5f 4f       	sbci	r21, 0xFF	; 255

000349ce <__divmodsi4_exit>:
   349ce:	08 95       	ret

000349d0 <__negsi2>:
   349d0:	90 95       	com	r25
   349d2:	80 95       	com	r24
   349d4:	70 95       	com	r23
   349d6:	61 95       	neg	r22
   349d8:	7f 4f       	sbci	r23, 0xFF	; 255
   349da:	8f 4f       	sbci	r24, 0xFF	; 255
   349dc:	9f 4f       	sbci	r25, 0xFF	; 255
   349de:	08 95       	ret

000349e0 <__tablejump2__>:
   349e0:	ee 0f       	add	r30, r30
   349e2:	ff 1f       	adc	r31, r31
   349e4:	88 1f       	adc	r24, r24
   349e6:	8b bf       	out	0x3b, r24	; 59
   349e8:	07 90       	elpm	r0, Z+
   349ea:	f6 91       	elpm	r31, Z
   349ec:	e0 2d       	mov	r30, r0
   349ee:	19 94       	eijmp

000349f0 <__mulhisi3>:
   349f0:	0f 94 80 a4 	call	0x34900	; 0x34900 <__umulhisi3>
   349f4:	33 23       	and	r19, r19
   349f6:	12 f4       	brpl	.+4      	; 0x349fc <__mulhisi3+0xc>
   349f8:	8a 1b       	sub	r24, r26
   349fa:	9b 0b       	sbc	r25, r27
   349fc:	0d 94 02 a5 	jmp	0x34a04	; 0x34a04 <__usmulhisi3_tail>

00034a00 <__usmulhisi3>:
   34a00:	0f 94 80 a4 	call	0x34900	; 0x34900 <__umulhisi3>

00034a04 <__usmulhisi3_tail>:
   34a04:	b7 ff       	sbrs	r27, 7
   34a06:	08 95       	ret
   34a08:	82 1b       	sub	r24, r18
   34a0a:	93 0b       	sbc	r25, r19
   34a0c:	08 95       	ret

00034a0e <__subsf3>:
   34a0e:	50 58       	subi	r21, 0x80	; 128

00034a10 <__addsf3>:
   34a10:	bb 27       	eor	r27, r27
   34a12:	aa 27       	eor	r26, r26
   34a14:	0f 94 1f a5 	call	0x34a3e	; 0x34a3e <__addsf3x>
   34a18:	0d 94 31 9f 	jmp	0x33e62	; 0x33e62 <__fp_round>
   34a1c:	0f 94 23 9f 	call	0x33e46	; 0x33e46 <__fp_pscA>
   34a20:	38 f0       	brcs	.+14     	; 0x34a30 <__addsf3+0x20>
   34a22:	0f 94 2a 9f 	call	0x33e54	; 0x33e54 <__fp_pscB>
   34a26:	20 f0       	brcs	.+8      	; 0x34a30 <__addsf3+0x20>
   34a28:	39 f4       	brne	.+14     	; 0x34a38 <__addsf3+0x28>
   34a2a:	9f 3f       	cpi	r25, 0xFF	; 255
   34a2c:	19 f4       	brne	.+6      	; 0x34a34 <__addsf3+0x24>
   34a2e:	26 f4       	brtc	.+8      	; 0x34a38 <__addsf3+0x28>
   34a30:	0d 94 20 9f 	jmp	0x33e40	; 0x33e40 <__fp_nan>
   34a34:	0e f4       	brtc	.+2      	; 0x34a38 <__addsf3+0x28>
   34a36:	e0 95       	com	r30
   34a38:	e7 fb       	bst	r30, 7
   34a3a:	0d 94 1a 9f 	jmp	0x33e34	; 0x33e34 <__fp_inf>

00034a3e <__addsf3x>:
   34a3e:	e9 2f       	mov	r30, r25
   34a40:	0f 94 42 9f 	call	0x33e84	; 0x33e84 <__fp_split3>
   34a44:	58 f3       	brcs	.-42     	; 0x34a1c <__addsf3+0xc>
   34a46:	ba 17       	cp	r27, r26
   34a48:	62 07       	cpc	r22, r18
   34a4a:	73 07       	cpc	r23, r19
   34a4c:	84 07       	cpc	r24, r20
   34a4e:	95 07       	cpc	r25, r21
   34a50:	20 f0       	brcs	.+8      	; 0x34a5a <__addsf3x+0x1c>
   34a52:	79 f4       	brne	.+30     	; 0x34a72 <__addsf3x+0x34>
   34a54:	a6 f5       	brtc	.+104    	; 0x34abe <__addsf3x+0x80>
   34a56:	0d 94 64 9f 	jmp	0x33ec8	; 0x33ec8 <__fp_zero>
   34a5a:	0e f4       	brtc	.+2      	; 0x34a5e <__addsf3x+0x20>
   34a5c:	e0 95       	com	r30
   34a5e:	0b 2e       	mov	r0, r27
   34a60:	ba 2f       	mov	r27, r26
   34a62:	a0 2d       	mov	r26, r0
   34a64:	0b 01       	movw	r0, r22
   34a66:	b9 01       	movw	r22, r18
   34a68:	90 01       	movw	r18, r0
   34a6a:	0c 01       	movw	r0, r24
   34a6c:	ca 01       	movw	r24, r20
   34a6e:	a0 01       	movw	r20, r0
   34a70:	11 24       	eor	r1, r1
   34a72:	ff 27       	eor	r31, r31
   34a74:	59 1b       	sub	r21, r25
   34a76:	99 f0       	breq	.+38     	; 0x34a9e <__addsf3x+0x60>
   34a78:	59 3f       	cpi	r21, 0xF9	; 249
   34a7a:	50 f4       	brcc	.+20     	; 0x34a90 <__addsf3x+0x52>
   34a7c:	50 3e       	cpi	r21, 0xE0	; 224
   34a7e:	68 f1       	brcs	.+90     	; 0x34ada <__addsf3x+0x9c>
   34a80:	1a 16       	cp	r1, r26
   34a82:	f0 40       	sbci	r31, 0x00	; 0
   34a84:	a2 2f       	mov	r26, r18
   34a86:	23 2f       	mov	r18, r19
   34a88:	34 2f       	mov	r19, r20
   34a8a:	44 27       	eor	r20, r20
   34a8c:	58 5f       	subi	r21, 0xF8	; 248
   34a8e:	f3 cf       	rjmp	.-26     	; 0x34a76 <__addsf3x+0x38>
   34a90:	46 95       	lsr	r20
   34a92:	37 95       	ror	r19
   34a94:	27 95       	ror	r18
   34a96:	a7 95       	ror	r26
   34a98:	f0 40       	sbci	r31, 0x00	; 0
   34a9a:	53 95       	inc	r21
   34a9c:	c9 f7       	brne	.-14     	; 0x34a90 <__addsf3x+0x52>
   34a9e:	7e f4       	brtc	.+30     	; 0x34abe <__addsf3x+0x80>
   34aa0:	1f 16       	cp	r1, r31
   34aa2:	ba 0b       	sbc	r27, r26
   34aa4:	62 0b       	sbc	r22, r18
   34aa6:	73 0b       	sbc	r23, r19
   34aa8:	84 0b       	sbc	r24, r20
   34aaa:	ba f0       	brmi	.+46     	; 0x34ada <__addsf3x+0x9c>
   34aac:	91 50       	subi	r25, 0x01	; 1
   34aae:	a1 f0       	breq	.+40     	; 0x34ad8 <__addsf3x+0x9a>
   34ab0:	ff 0f       	add	r31, r31
   34ab2:	bb 1f       	adc	r27, r27
   34ab4:	66 1f       	adc	r22, r22
   34ab6:	77 1f       	adc	r23, r23
   34ab8:	88 1f       	adc	r24, r24
   34aba:	c2 f7       	brpl	.-16     	; 0x34aac <__addsf3x+0x6e>
   34abc:	0e c0       	rjmp	.+28     	; 0x34ada <__addsf3x+0x9c>
   34abe:	ba 0f       	add	r27, r26
   34ac0:	62 1f       	adc	r22, r18
   34ac2:	73 1f       	adc	r23, r19
   34ac4:	84 1f       	adc	r24, r20
   34ac6:	48 f4       	brcc	.+18     	; 0x34ada <__addsf3x+0x9c>
   34ac8:	87 95       	ror	r24
   34aca:	77 95       	ror	r23
   34acc:	67 95       	ror	r22
   34ace:	b7 95       	ror	r27
   34ad0:	f7 95       	ror	r31
   34ad2:	9e 3f       	cpi	r25, 0xFE	; 254
   34ad4:	08 f0       	brcs	.+2      	; 0x34ad8 <__addsf3x+0x9a>
   34ad6:	b0 cf       	rjmp	.-160    	; 0x34a38 <__addsf3+0x28>
   34ad8:	93 95       	inc	r25
   34ada:	88 0f       	add	r24, r24
   34adc:	08 f0       	brcs	.+2      	; 0x34ae0 <__addsf3x+0xa2>
   34ade:	99 27       	eor	r25, r25
   34ae0:	ee 0f       	add	r30, r30
   34ae2:	97 95       	ror	r25
   34ae4:	87 95       	ror	r24
   34ae6:	08 95       	ret
   34ae8:	0f 94 23 9f 	call	0x33e46	; 0x33e46 <__fp_pscA>
   34aec:	60 f0       	brcs	.+24     	; 0x34b06 <__addsf3x+0xc8>
   34aee:	80 e8       	ldi	r24, 0x80	; 128
   34af0:	91 e0       	ldi	r25, 0x01	; 1
   34af2:	09 f4       	brne	.+2      	; 0x34af6 <__addsf3x+0xb8>
   34af4:	9e ef       	ldi	r25, 0xFE	; 254
   34af6:	0f 94 2a 9f 	call	0x33e54	; 0x33e54 <__fp_pscB>
   34afa:	28 f0       	brcs	.+10     	; 0x34b06 <__addsf3x+0xc8>
   34afc:	40 e8       	ldi	r20, 0x80	; 128
   34afe:	51 e0       	ldi	r21, 0x01	; 1
   34b00:	71 f4       	brne	.+28     	; 0x34b1e <atan2+0x10>
   34b02:	5e ef       	ldi	r21, 0xFE	; 254
   34b04:	0c c0       	rjmp	.+24     	; 0x34b1e <atan2+0x10>
   34b06:	0d 94 20 9f 	jmp	0x33e40	; 0x33e40 <__fp_nan>
   34b0a:	0d 94 64 9f 	jmp	0x33ec8	; 0x33ec8 <__fp_zero>

00034b0e <atan2>:
   34b0e:	e9 2f       	mov	r30, r25
   34b10:	e0 78       	andi	r30, 0x80	; 128
   34b12:	0f 94 42 9f 	call	0x33e84	; 0x33e84 <__fp_split3>
   34b16:	40 f3       	brcs	.-48     	; 0x34ae8 <__addsf3x+0xaa>
   34b18:	09 2e       	mov	r0, r25
   34b1a:	05 2a       	or	r0, r21
   34b1c:	b1 f3       	breq	.-20     	; 0x34b0a <__addsf3x+0xcc>
   34b1e:	26 17       	cp	r18, r22
   34b20:	37 07       	cpc	r19, r23
   34b22:	48 07       	cpc	r20, r24
   34b24:	59 07       	cpc	r21, r25
   34b26:	38 f0       	brcs	.+14     	; 0x34b36 <atan2+0x28>
   34b28:	0e 2e       	mov	r0, r30
   34b2a:	07 f8       	bld	r0, 7
   34b2c:	e0 25       	eor	r30, r0
   34b2e:	69 f0       	breq	.+26     	; 0x34b4a <atan2+0x3c>
   34b30:	e0 25       	eor	r30, r0
   34b32:	e0 64       	ori	r30, 0x40	; 64
   34b34:	0a c0       	rjmp	.+20     	; 0x34b4a <atan2+0x3c>
   34b36:	ef 63       	ori	r30, 0x3F	; 63
   34b38:	07 f8       	bld	r0, 7
   34b3a:	00 94       	com	r0
   34b3c:	07 fa       	bst	r0, 7
   34b3e:	db 01       	movw	r26, r22
   34b40:	b9 01       	movw	r22, r18
   34b42:	9d 01       	movw	r18, r26
   34b44:	dc 01       	movw	r26, r24
   34b46:	ca 01       	movw	r24, r20
   34b48:	ad 01       	movw	r20, r26
   34b4a:	ef 93       	push	r30
   34b4c:	0f 94 1e a6 	call	0x34c3c	; 0x34c3c <__divsf3_pse>
   34b50:	0f 94 31 9f 	call	0x33e62	; 0x33e62 <__fp_round>
   34b54:	0f 94 b7 a5 	call	0x34b6e	; 0x34b6e <atan>
   34b58:	5f 91       	pop	r21
   34b5a:	55 23       	and	r21, r21
   34b5c:	39 f0       	breq	.+14     	; 0x34b6c <atan2+0x5e>
   34b5e:	2b ed       	ldi	r18, 0xDB	; 219
   34b60:	3f e0       	ldi	r19, 0x0F	; 15
   34b62:	49 e4       	ldi	r20, 0x49	; 73
   34b64:	50 fd       	sbrc	r21, 0
   34b66:	49 ec       	ldi	r20, 0xC9	; 201
   34b68:	0d 94 08 a5 	jmp	0x34a10	; 0x34a10 <__addsf3>
   34b6c:	08 95       	ret

00034b6e <atan>:
   34b6e:	df 93       	push	r29
   34b70:	dd 27       	eor	r29, r29
   34b72:	b9 2f       	mov	r27, r25
   34b74:	bf 77       	andi	r27, 0x7F	; 127
   34b76:	40 e8       	ldi	r20, 0x80	; 128
   34b78:	5f e3       	ldi	r21, 0x3F	; 63
   34b7a:	16 16       	cp	r1, r22
   34b7c:	17 06       	cpc	r1, r23
   34b7e:	48 07       	cpc	r20, r24
   34b80:	5b 07       	cpc	r21, r27
   34b82:	18 f4       	brcc	.+6      	; 0x34b8a <atan+0x1c>
   34b84:	d9 2f       	mov	r29, r25
   34b86:	0f 94 03 a8 	call	0x35006	; 0x35006 <inverse>
   34b8a:	9f 93       	push	r25
   34b8c:	8f 93       	push	r24
   34b8e:	7f 93       	push	r23
   34b90:	6f 93       	push	r22
   34b92:	0f 94 a9 9e 	call	0x33d52	; 0x33d52 <square>
   34b96:	e7 eb       	ldi	r30, 0xB7	; 183
   34b98:	fc e6       	ldi	r31, 0x6C	; 108
   34b9a:	0f 94 13 a7 	call	0x34e26	; 0x34e26 <__fp_powser>
   34b9e:	0f 94 31 9f 	call	0x33e62	; 0x33e62 <__fp_round>
   34ba2:	2f 91       	pop	r18
   34ba4:	3f 91       	pop	r19
   34ba6:	4f 91       	pop	r20
   34ba8:	5f 91       	pop	r21
   34baa:	0f 94 c0 9e 	call	0x33d80	; 0x33d80 <__mulsf3x>
   34bae:	dd 23       	and	r29, r29
   34bb0:	51 f0       	breq	.+20     	; 0x34bc6 <atan+0x58>
   34bb2:	90 58       	subi	r25, 0x80	; 128
   34bb4:	a2 ea       	ldi	r26, 0xA2	; 162
   34bb6:	2a ed       	ldi	r18, 0xDA	; 218
   34bb8:	3f e0       	ldi	r19, 0x0F	; 15
   34bba:	49 ec       	ldi	r20, 0xC9	; 201
   34bbc:	5f e3       	ldi	r21, 0x3F	; 63
   34bbe:	d0 78       	andi	r29, 0x80	; 128
   34bc0:	5d 27       	eor	r21, r29
   34bc2:	0f 94 1f a5 	call	0x34a3e	; 0x34a3e <__addsf3x>
   34bc6:	df 91       	pop	r29
   34bc8:	0d 94 31 9f 	jmp	0x33e62	; 0x33e62 <__fp_round>

00034bcc <ceil>:
   34bcc:	0f 94 79 a7 	call	0x34ef2	; 0x34ef2 <__fp_trunc>
   34bd0:	90 f0       	brcs	.+36     	; 0x34bf6 <ceil+0x2a>
   34bd2:	9f 37       	cpi	r25, 0x7F	; 127
   34bd4:	48 f4       	brcc	.+18     	; 0x34be8 <ceil+0x1c>
   34bd6:	91 11       	cpse	r25, r1
   34bd8:	16 f4       	brtc	.+4      	; 0x34bde <ceil+0x12>
   34bda:	0d 94 65 9f 	jmp	0x33eca	; 0x33eca <__fp_szero>
   34bde:	60 e0       	ldi	r22, 0x00	; 0
   34be0:	70 e0       	ldi	r23, 0x00	; 0
   34be2:	80 e8       	ldi	r24, 0x80	; 128
   34be4:	9f e3       	ldi	r25, 0x3F	; 63
   34be6:	08 95       	ret
   34be8:	26 f0       	brts	.+8      	; 0x34bf2 <ceil+0x26>
   34bea:	1b 16       	cp	r1, r27
   34bec:	61 1d       	adc	r22, r1
   34bee:	71 1d       	adc	r23, r1
   34bf0:	81 1d       	adc	r24, r1
   34bf2:	0d 94 ea a6 	jmp	0x34dd4	; 0x34dd4 <__fp_mintl>
   34bf6:	0d 94 05 a7 	jmp	0x34e0a	; 0x34e0a <__fp_mpack>

00034bfa <__cmpsf2>:
   34bfa:	0f 94 c6 a6 	call	0x34d8c	; 0x34d8c <__fp_cmp>
   34bfe:	08 f4       	brcc	.+2      	; 0x34c02 <__cmpsf2+0x8>
   34c00:	81 e0       	ldi	r24, 0x01	; 1
   34c02:	08 95       	ret

00034c04 <cos>:
   34c04:	0f 94 3c a7 	call	0x34e78	; 0x34e78 <__fp_rempio2>
   34c08:	e3 95       	inc	r30
   34c0a:	0d 94 65 a7 	jmp	0x34eca	; 0x34eca <__fp_sinus>

00034c0e <__divsf3>:
   34c0e:	0f 94 1b a6 	call	0x34c36	; 0x34c36 <__divsf3x>
   34c12:	0d 94 31 9f 	jmp	0x33e62	; 0x33e62 <__fp_round>
   34c16:	0f 94 2a 9f 	call	0x33e54	; 0x33e54 <__fp_pscB>
   34c1a:	58 f0       	brcs	.+22     	; 0x34c32 <__divsf3+0x24>
   34c1c:	0f 94 23 9f 	call	0x33e46	; 0x33e46 <__fp_pscA>
   34c20:	40 f0       	brcs	.+16     	; 0x34c32 <__divsf3+0x24>
   34c22:	29 f4       	brne	.+10     	; 0x34c2e <__divsf3+0x20>
   34c24:	5f 3f       	cpi	r21, 0xFF	; 255
   34c26:	29 f0       	breq	.+10     	; 0x34c32 <__divsf3+0x24>
   34c28:	0d 94 1a 9f 	jmp	0x33e34	; 0x33e34 <__fp_inf>
   34c2c:	51 11       	cpse	r21, r1
   34c2e:	0d 94 65 9f 	jmp	0x33eca	; 0x33eca <__fp_szero>
   34c32:	0d 94 20 9f 	jmp	0x33e40	; 0x33e40 <__fp_nan>

00034c36 <__divsf3x>:
   34c36:	0f 94 42 9f 	call	0x33e84	; 0x33e84 <__fp_split3>
   34c3a:	68 f3       	brcs	.-38     	; 0x34c16 <__divsf3+0x8>

00034c3c <__divsf3_pse>:
   34c3c:	99 23       	and	r25, r25
   34c3e:	b1 f3       	breq	.-20     	; 0x34c2c <__divsf3+0x1e>
   34c40:	55 23       	and	r21, r21
   34c42:	91 f3       	breq	.-28     	; 0x34c28 <__divsf3+0x1a>
   34c44:	95 1b       	sub	r25, r21
   34c46:	55 0b       	sbc	r21, r21
   34c48:	bb 27       	eor	r27, r27
   34c4a:	aa 27       	eor	r26, r26
   34c4c:	62 17       	cp	r22, r18
   34c4e:	73 07       	cpc	r23, r19
   34c50:	84 07       	cpc	r24, r20
   34c52:	38 f0       	brcs	.+14     	; 0x34c62 <__divsf3_pse+0x26>
   34c54:	9f 5f       	subi	r25, 0xFF	; 255
   34c56:	5f 4f       	sbci	r21, 0xFF	; 255
   34c58:	22 0f       	add	r18, r18
   34c5a:	33 1f       	adc	r19, r19
   34c5c:	44 1f       	adc	r20, r20
   34c5e:	aa 1f       	adc	r26, r26
   34c60:	a9 f3       	breq	.-22     	; 0x34c4c <__divsf3_pse+0x10>
   34c62:	35 d0       	rcall	.+106    	; 0x34cce <__divsf3_pse+0x92>
   34c64:	0e 2e       	mov	r0, r30
   34c66:	3a f0       	brmi	.+14     	; 0x34c76 <__divsf3_pse+0x3a>
   34c68:	e0 e8       	ldi	r30, 0x80	; 128
   34c6a:	32 d0       	rcall	.+100    	; 0x34cd0 <__divsf3_pse+0x94>
   34c6c:	91 50       	subi	r25, 0x01	; 1
   34c6e:	50 40       	sbci	r21, 0x00	; 0
   34c70:	e6 95       	lsr	r30
   34c72:	00 1c       	adc	r0, r0
   34c74:	ca f7       	brpl	.-14     	; 0x34c68 <__divsf3_pse+0x2c>
   34c76:	2b d0       	rcall	.+86     	; 0x34cce <__divsf3_pse+0x92>
   34c78:	fe 2f       	mov	r31, r30
   34c7a:	29 d0       	rcall	.+82     	; 0x34cce <__divsf3_pse+0x92>
   34c7c:	66 0f       	add	r22, r22
   34c7e:	77 1f       	adc	r23, r23
   34c80:	88 1f       	adc	r24, r24
   34c82:	bb 1f       	adc	r27, r27
   34c84:	26 17       	cp	r18, r22
   34c86:	37 07       	cpc	r19, r23
   34c88:	48 07       	cpc	r20, r24
   34c8a:	ab 07       	cpc	r26, r27
   34c8c:	b0 e8       	ldi	r27, 0x80	; 128
   34c8e:	09 f0       	breq	.+2      	; 0x34c92 <__divsf3_pse+0x56>
   34c90:	bb 0b       	sbc	r27, r27
   34c92:	80 2d       	mov	r24, r0
   34c94:	bf 01       	movw	r22, r30
   34c96:	ff 27       	eor	r31, r31
   34c98:	93 58       	subi	r25, 0x83	; 131
   34c9a:	5f 4f       	sbci	r21, 0xFF	; 255
   34c9c:	3a f0       	brmi	.+14     	; 0x34cac <__divsf3_pse+0x70>
   34c9e:	9e 3f       	cpi	r25, 0xFE	; 254
   34ca0:	51 05       	cpc	r21, r1
   34ca2:	78 f0       	brcs	.+30     	; 0x34cc2 <__divsf3_pse+0x86>
   34ca4:	0d 94 1a 9f 	jmp	0x33e34	; 0x33e34 <__fp_inf>
   34ca8:	0d 94 65 9f 	jmp	0x33eca	; 0x33eca <__fp_szero>
   34cac:	5f 3f       	cpi	r21, 0xFF	; 255
   34cae:	e4 f3       	brlt	.-8      	; 0x34ca8 <__divsf3_pse+0x6c>
   34cb0:	98 3e       	cpi	r25, 0xE8	; 232
   34cb2:	d4 f3       	brlt	.-12     	; 0x34ca8 <__divsf3_pse+0x6c>
   34cb4:	86 95       	lsr	r24
   34cb6:	77 95       	ror	r23
   34cb8:	67 95       	ror	r22
   34cba:	b7 95       	ror	r27
   34cbc:	f7 95       	ror	r31
   34cbe:	9f 5f       	subi	r25, 0xFF	; 255
   34cc0:	c9 f7       	brne	.-14     	; 0x34cb4 <__divsf3_pse+0x78>
   34cc2:	88 0f       	add	r24, r24
   34cc4:	91 1d       	adc	r25, r1
   34cc6:	96 95       	lsr	r25
   34cc8:	87 95       	ror	r24
   34cca:	97 f9       	bld	r25, 7
   34ccc:	08 95       	ret
   34cce:	e1 e0       	ldi	r30, 0x01	; 1
   34cd0:	66 0f       	add	r22, r22
   34cd2:	77 1f       	adc	r23, r23
   34cd4:	88 1f       	adc	r24, r24
   34cd6:	bb 1f       	adc	r27, r27
   34cd8:	62 17       	cp	r22, r18
   34cda:	73 07       	cpc	r23, r19
   34cdc:	84 07       	cpc	r24, r20
   34cde:	ba 07       	cpc	r27, r26
   34ce0:	20 f0       	brcs	.+8      	; 0x34cea <__divsf3_pse+0xae>
   34ce2:	62 1b       	sub	r22, r18
   34ce4:	73 0b       	sbc	r23, r19
   34ce6:	84 0b       	sbc	r24, r20
   34ce8:	ba 0b       	sbc	r27, r26
   34cea:	ee 1f       	adc	r30, r30
   34cec:	88 f7       	brcc	.-30     	; 0x34cd0 <__divsf3_pse+0x94>
   34cee:	e0 95       	com	r30
   34cf0:	08 95       	ret

00034cf2 <__fixsfsi>:
   34cf2:	0f 94 80 a6 	call	0x34d00	; 0x34d00 <__fixunssfsi>
   34cf6:	68 94       	set
   34cf8:	b1 11       	cpse	r27, r1
   34cfa:	0d 94 65 9f 	jmp	0x33eca	; 0x33eca <__fp_szero>
   34cfe:	08 95       	ret

00034d00 <__fixunssfsi>:
   34d00:	0f 94 4a 9f 	call	0x33e94	; 0x33e94 <__fp_splitA>
   34d04:	88 f0       	brcs	.+34     	; 0x34d28 <__fixunssfsi+0x28>
   34d06:	9f 57       	subi	r25, 0x7F	; 127
   34d08:	98 f0       	brcs	.+38     	; 0x34d30 <__fixunssfsi+0x30>
   34d0a:	b9 2f       	mov	r27, r25
   34d0c:	99 27       	eor	r25, r25
   34d0e:	b7 51       	subi	r27, 0x17	; 23
   34d10:	b0 f0       	brcs	.+44     	; 0x34d3e <__fixunssfsi+0x3e>
   34d12:	e1 f0       	breq	.+56     	; 0x34d4c <__fixunssfsi+0x4c>
   34d14:	66 0f       	add	r22, r22
   34d16:	77 1f       	adc	r23, r23
   34d18:	88 1f       	adc	r24, r24
   34d1a:	99 1f       	adc	r25, r25
   34d1c:	1a f0       	brmi	.+6      	; 0x34d24 <__fixunssfsi+0x24>
   34d1e:	ba 95       	dec	r27
   34d20:	c9 f7       	brne	.-14     	; 0x34d14 <__fixunssfsi+0x14>
   34d22:	14 c0       	rjmp	.+40     	; 0x34d4c <__fixunssfsi+0x4c>
   34d24:	b1 30       	cpi	r27, 0x01	; 1
   34d26:	91 f0       	breq	.+36     	; 0x34d4c <__fixunssfsi+0x4c>
   34d28:	0f 94 64 9f 	call	0x33ec8	; 0x33ec8 <__fp_zero>
   34d2c:	b1 e0       	ldi	r27, 0x01	; 1
   34d2e:	08 95       	ret
   34d30:	0d 94 64 9f 	jmp	0x33ec8	; 0x33ec8 <__fp_zero>
   34d34:	67 2f       	mov	r22, r23
   34d36:	78 2f       	mov	r23, r24
   34d38:	88 27       	eor	r24, r24
   34d3a:	b8 5f       	subi	r27, 0xF8	; 248
   34d3c:	39 f0       	breq	.+14     	; 0x34d4c <__fixunssfsi+0x4c>
   34d3e:	b9 3f       	cpi	r27, 0xF9	; 249
   34d40:	cc f3       	brlt	.-14     	; 0x34d34 <__fixunssfsi+0x34>
   34d42:	86 95       	lsr	r24
   34d44:	77 95       	ror	r23
   34d46:	67 95       	ror	r22
   34d48:	b3 95       	inc	r27
   34d4a:	d9 f7       	brne	.-10     	; 0x34d42 <__fixunssfsi+0x42>
   34d4c:	3e f4       	brtc	.+14     	; 0x34d5c <__fixunssfsi+0x5c>
   34d4e:	90 95       	com	r25
   34d50:	80 95       	com	r24
   34d52:	70 95       	com	r23
   34d54:	61 95       	neg	r22
   34d56:	7f 4f       	sbci	r23, 0xFF	; 255
   34d58:	8f 4f       	sbci	r24, 0xFF	; 255
   34d5a:	9f 4f       	sbci	r25, 0xFF	; 255
   34d5c:	08 95       	ret

00034d5e <floor>:
   34d5e:	0f 94 79 a7 	call	0x34ef2	; 0x34ef2 <__fp_trunc>
   34d62:	90 f0       	brcs	.+36     	; 0x34d88 <floor+0x2a>
   34d64:	9f 37       	cpi	r25, 0x7F	; 127
   34d66:	48 f4       	brcc	.+18     	; 0x34d7a <floor+0x1c>
   34d68:	91 11       	cpse	r25, r1
   34d6a:	16 f0       	brts	.+4      	; 0x34d70 <floor+0x12>
   34d6c:	0d 94 65 9f 	jmp	0x33eca	; 0x33eca <__fp_szero>
   34d70:	60 e0       	ldi	r22, 0x00	; 0
   34d72:	70 e0       	ldi	r23, 0x00	; 0
   34d74:	80 e8       	ldi	r24, 0x80	; 128
   34d76:	9f eb       	ldi	r25, 0xBF	; 191
   34d78:	08 95       	ret
   34d7a:	26 f4       	brtc	.+8      	; 0x34d84 <floor+0x26>
   34d7c:	1b 16       	cp	r1, r27
   34d7e:	61 1d       	adc	r22, r1
   34d80:	71 1d       	adc	r23, r1
   34d82:	81 1d       	adc	r24, r1
   34d84:	0d 94 ea a6 	jmp	0x34dd4	; 0x34dd4 <__fp_mintl>
   34d88:	0d 94 05 a7 	jmp	0x34e0a	; 0x34e0a <__fp_mpack>

00034d8c <__fp_cmp>:
   34d8c:	99 0f       	add	r25, r25
   34d8e:	00 08       	sbc	r0, r0
   34d90:	55 0f       	add	r21, r21
   34d92:	aa 0b       	sbc	r26, r26
   34d94:	e0 e8       	ldi	r30, 0x80	; 128
   34d96:	fe ef       	ldi	r31, 0xFE	; 254
   34d98:	16 16       	cp	r1, r22
   34d9a:	17 06       	cpc	r1, r23
   34d9c:	e8 07       	cpc	r30, r24
   34d9e:	f9 07       	cpc	r31, r25
   34da0:	c0 f0       	brcs	.+48     	; 0x34dd2 <__fp_cmp+0x46>
   34da2:	12 16       	cp	r1, r18
   34da4:	13 06       	cpc	r1, r19
   34da6:	e4 07       	cpc	r30, r20
   34da8:	f5 07       	cpc	r31, r21
   34daa:	98 f0       	brcs	.+38     	; 0x34dd2 <__fp_cmp+0x46>
   34dac:	62 1b       	sub	r22, r18
   34dae:	73 0b       	sbc	r23, r19
   34db0:	84 0b       	sbc	r24, r20
   34db2:	95 0b       	sbc	r25, r21
   34db4:	39 f4       	brne	.+14     	; 0x34dc4 <__fp_cmp+0x38>
   34db6:	0a 26       	eor	r0, r26
   34db8:	61 f0       	breq	.+24     	; 0x34dd2 <__fp_cmp+0x46>
   34dba:	23 2b       	or	r18, r19
   34dbc:	24 2b       	or	r18, r20
   34dbe:	25 2b       	or	r18, r21
   34dc0:	21 f4       	brne	.+8      	; 0x34dca <__fp_cmp+0x3e>
   34dc2:	08 95       	ret
   34dc4:	0a 26       	eor	r0, r26
   34dc6:	09 f4       	brne	.+2      	; 0x34dca <__fp_cmp+0x3e>
   34dc8:	a1 40       	sbci	r26, 0x01	; 1
   34dca:	a6 95       	lsr	r26
   34dcc:	8f ef       	ldi	r24, 0xFF	; 255
   34dce:	81 1d       	adc	r24, r1
   34dd0:	81 1d       	adc	r24, r1
   34dd2:	08 95       	ret

00034dd4 <__fp_mintl>:
   34dd4:	88 23       	and	r24, r24
   34dd6:	71 f4       	brne	.+28     	; 0x34df4 <__fp_mintl+0x20>
   34dd8:	77 23       	and	r23, r23
   34dda:	21 f0       	breq	.+8      	; 0x34de4 <__fp_mintl+0x10>
   34ddc:	98 50       	subi	r25, 0x08	; 8
   34dde:	87 2b       	or	r24, r23
   34de0:	76 2f       	mov	r23, r22
   34de2:	07 c0       	rjmp	.+14     	; 0x34df2 <__fp_mintl+0x1e>
   34de4:	66 23       	and	r22, r22
   34de6:	11 f4       	brne	.+4      	; 0x34dec <__fp_mintl+0x18>
   34de8:	99 27       	eor	r25, r25
   34dea:	0d c0       	rjmp	.+26     	; 0x34e06 <__fp_mintl+0x32>
   34dec:	90 51       	subi	r25, 0x10	; 16
   34dee:	86 2b       	or	r24, r22
   34df0:	70 e0       	ldi	r23, 0x00	; 0
   34df2:	60 e0       	ldi	r22, 0x00	; 0
   34df4:	2a f0       	brmi	.+10     	; 0x34e00 <__fp_mintl+0x2c>
   34df6:	9a 95       	dec	r25
   34df8:	66 0f       	add	r22, r22
   34dfa:	77 1f       	adc	r23, r23
   34dfc:	88 1f       	adc	r24, r24
   34dfe:	da f7       	brpl	.-10     	; 0x34df6 <__fp_mintl+0x22>
   34e00:	88 0f       	add	r24, r24
   34e02:	96 95       	lsr	r25
   34e04:	87 95       	ror	r24
   34e06:	97 f9       	bld	r25, 7
   34e08:	08 95       	ret

00034e0a <__fp_mpack>:
   34e0a:	9f 3f       	cpi	r25, 0xFF	; 255
   34e0c:	31 f0       	breq	.+12     	; 0x34e1a <__fp_mpack_finite+0xc>

00034e0e <__fp_mpack_finite>:
   34e0e:	91 50       	subi	r25, 0x01	; 1
   34e10:	20 f4       	brcc	.+8      	; 0x34e1a <__fp_mpack_finite+0xc>
   34e12:	87 95       	ror	r24
   34e14:	77 95       	ror	r23
   34e16:	67 95       	ror	r22
   34e18:	b7 95       	ror	r27
   34e1a:	88 0f       	add	r24, r24
   34e1c:	91 1d       	adc	r25, r1
   34e1e:	96 95       	lsr	r25
   34e20:	87 95       	ror	r24
   34e22:	97 f9       	bld	r25, 7
   34e24:	08 95       	ret

00034e26 <__fp_powser>:
   34e26:	df 93       	push	r29
   34e28:	cf 93       	push	r28
   34e2a:	1f 93       	push	r17
   34e2c:	0f 93       	push	r16
   34e2e:	ff 92       	push	r15
   34e30:	ef 92       	push	r14
   34e32:	df 92       	push	r13
   34e34:	7b 01       	movw	r14, r22
   34e36:	8c 01       	movw	r16, r24
   34e38:	68 94       	set
   34e3a:	06 c0       	rjmp	.+12     	; 0x34e48 <__fp_powser+0x22>
   34e3c:	da 2e       	mov	r13, r26
   34e3e:	ef 01       	movw	r28, r30
   34e40:	0f 94 c0 9e 	call	0x33d80	; 0x33d80 <__mulsf3x>
   34e44:	fe 01       	movw	r30, r28
   34e46:	e8 94       	clt
   34e48:	a5 91       	lpm	r26, Z+
   34e4a:	25 91       	lpm	r18, Z+
   34e4c:	35 91       	lpm	r19, Z+
   34e4e:	45 91       	lpm	r20, Z+
   34e50:	55 91       	lpm	r21, Z+
   34e52:	a6 f3       	brts	.-24     	; 0x34e3c <__fp_powser+0x16>
   34e54:	ef 01       	movw	r28, r30
   34e56:	0f 94 1f a5 	call	0x34a3e	; 0x34a3e <__addsf3x>
   34e5a:	fe 01       	movw	r30, r28
   34e5c:	97 01       	movw	r18, r14
   34e5e:	a8 01       	movw	r20, r16
   34e60:	da 94       	dec	r13
   34e62:	69 f7       	brne	.-38     	; 0x34e3e <__fp_powser+0x18>
   34e64:	df 90       	pop	r13
   34e66:	ef 90       	pop	r14
   34e68:	ff 90       	pop	r15
   34e6a:	0f 91       	pop	r16
   34e6c:	1f 91       	pop	r17
   34e6e:	cf 91       	pop	r28
   34e70:	df 91       	pop	r29
   34e72:	08 95       	ret
   34e74:	0d 94 20 9f 	jmp	0x33e40	; 0x33e40 <__fp_nan>

00034e78 <__fp_rempio2>:
   34e78:	0f 94 4a 9f 	call	0x33e94	; 0x33e94 <__fp_splitA>
   34e7c:	d8 f3       	brcs	.-10     	; 0x34e74 <__fp_powser+0x4e>
   34e7e:	e8 94       	clt
   34e80:	e0 e0       	ldi	r30, 0x00	; 0
   34e82:	bb 27       	eor	r27, r27
   34e84:	9f 57       	subi	r25, 0x7F	; 127
   34e86:	f0 f0       	brcs	.+60     	; 0x34ec4 <__fp_rempio2+0x4c>
   34e88:	2a ed       	ldi	r18, 0xDA	; 218
   34e8a:	3f e0       	ldi	r19, 0x0F	; 15
   34e8c:	49 ec       	ldi	r20, 0xC9	; 201
   34e8e:	06 c0       	rjmp	.+12     	; 0x34e9c <__fp_rempio2+0x24>
   34e90:	ee 0f       	add	r30, r30
   34e92:	bb 0f       	add	r27, r27
   34e94:	66 1f       	adc	r22, r22
   34e96:	77 1f       	adc	r23, r23
   34e98:	88 1f       	adc	r24, r24
   34e9a:	28 f0       	brcs	.+10     	; 0x34ea6 <__fp_rempio2+0x2e>
   34e9c:	b2 3a       	cpi	r27, 0xA2	; 162
   34e9e:	62 07       	cpc	r22, r18
   34ea0:	73 07       	cpc	r23, r19
   34ea2:	84 07       	cpc	r24, r20
   34ea4:	28 f0       	brcs	.+10     	; 0x34eb0 <__fp_rempio2+0x38>
   34ea6:	b2 5a       	subi	r27, 0xA2	; 162
   34ea8:	62 0b       	sbc	r22, r18
   34eaa:	73 0b       	sbc	r23, r19
   34eac:	84 0b       	sbc	r24, r20
   34eae:	e3 95       	inc	r30
   34eb0:	9a 95       	dec	r25
   34eb2:	72 f7       	brpl	.-36     	; 0x34e90 <__fp_rempio2+0x18>
   34eb4:	80 38       	cpi	r24, 0x80	; 128
   34eb6:	30 f4       	brcc	.+12     	; 0x34ec4 <__fp_rempio2+0x4c>
   34eb8:	9a 95       	dec	r25
   34eba:	bb 0f       	add	r27, r27
   34ebc:	66 1f       	adc	r22, r22
   34ebe:	77 1f       	adc	r23, r23
   34ec0:	88 1f       	adc	r24, r24
   34ec2:	d2 f7       	brpl	.-12     	; 0x34eb8 <__fp_rempio2+0x40>
   34ec4:	90 48       	sbci	r25, 0x80	; 128
   34ec6:	0d 94 07 a7 	jmp	0x34e0e	; 0x34e0e <__fp_mpack_finite>

00034eca <__fp_sinus>:
   34eca:	ef 93       	push	r30
   34ecc:	e0 ff       	sbrs	r30, 0
   34ece:	07 c0       	rjmp	.+14     	; 0x34ede <__fp_sinus+0x14>
   34ed0:	a2 ea       	ldi	r26, 0xA2	; 162
   34ed2:	2a ed       	ldi	r18, 0xDA	; 218
   34ed4:	3f e0       	ldi	r19, 0x0F	; 15
   34ed6:	49 ec       	ldi	r20, 0xC9	; 201
   34ed8:	5f eb       	ldi	r21, 0xBF	; 191
   34eda:	0f 94 1f a5 	call	0x34a3e	; 0x34a3e <__addsf3x>
   34ede:	0f 94 31 9f 	call	0x33e62	; 0x33e62 <__fp_round>
   34ee2:	0f 90       	pop	r0
   34ee4:	03 94       	inc	r0
   34ee6:	01 fc       	sbrc	r0, 1
   34ee8:	90 58       	subi	r25, 0x80	; 128
   34eea:	e4 ee       	ldi	r30, 0xE4	; 228
   34eec:	fc e6       	ldi	r31, 0x6C	; 108
   34eee:	0d 94 5c a9 	jmp	0x352b8	; 0x352b8 <__fp_powsodd>

00034ef2 <__fp_trunc>:
   34ef2:	0f 94 4a 9f 	call	0x33e94	; 0x33e94 <__fp_splitA>
   34ef6:	a0 f0       	brcs	.+40     	; 0x34f20 <__fp_trunc+0x2e>
   34ef8:	be e7       	ldi	r27, 0x7E	; 126
   34efa:	b9 17       	cp	r27, r25
   34efc:	88 f4       	brcc	.+34     	; 0x34f20 <__fp_trunc+0x2e>
   34efe:	bb 27       	eor	r27, r27
   34f00:	9f 38       	cpi	r25, 0x8F	; 143
   34f02:	60 f4       	brcc	.+24     	; 0x34f1c <__fp_trunc+0x2a>
   34f04:	16 16       	cp	r1, r22
   34f06:	b1 1d       	adc	r27, r1
   34f08:	67 2f       	mov	r22, r23
   34f0a:	78 2f       	mov	r23, r24
   34f0c:	88 27       	eor	r24, r24
   34f0e:	98 5f       	subi	r25, 0xF8	; 248
   34f10:	f7 cf       	rjmp	.-18     	; 0x34f00 <__fp_trunc+0xe>
   34f12:	86 95       	lsr	r24
   34f14:	77 95       	ror	r23
   34f16:	67 95       	ror	r22
   34f18:	b1 1d       	adc	r27, r1
   34f1a:	93 95       	inc	r25
   34f1c:	96 39       	cpi	r25, 0x96	; 150
   34f1e:	c8 f3       	brcs	.-14     	; 0x34f12 <__fp_trunc+0x20>
   34f20:	08 95       	ret

00034f22 <__gesf2>:
   34f22:	0f 94 c6 a6 	call	0x34d8c	; 0x34d8c <__fp_cmp>
   34f26:	08 f4       	brcc	.+2      	; 0x34f2a <__gesf2+0x8>
   34f28:	8f ef       	ldi	r24, 0xFF	; 255
   34f2a:	08 95       	ret
   34f2c:	0f 94 23 9f 	call	0x33e46	; 0x33e46 <__fp_pscA>
   34f30:	29 f0       	breq	.+10     	; 0x34f3c <__gesf2+0x1a>
   34f32:	0f 94 2a 9f 	call	0x33e54	; 0x33e54 <__fp_pscB>
   34f36:	11 f0       	breq	.+4      	; 0x34f3c <__gesf2+0x1a>
   34f38:	0d 94 20 9f 	jmp	0x33e40	; 0x33e40 <__fp_nan>
   34f3c:	0d 94 1a 9f 	jmp	0x33e34	; 0x33e34 <__fp_inf>
   34f40:	b9 01       	movw	r22, r18
   34f42:	ca 01       	movw	r24, r20
   34f44:	0d 94 05 a7 	jmp	0x34e0a	; 0x34e0a <__fp_mpack>

00034f48 <hypot>:
   34f48:	9f 77       	andi	r25, 0x7F	; 127
   34f4a:	5f 77       	andi	r21, 0x7F	; 127
   34f4c:	0f 94 42 9f 	call	0x33e84	; 0x33e84 <__fp_split3>
   34f50:	68 f3       	brcs	.-38     	; 0x34f2c <__gesf2+0xa>
   34f52:	99 23       	and	r25, r25
   34f54:	a9 f3       	breq	.-22     	; 0x34f40 <__gesf2+0x1e>
   34f56:	55 23       	and	r21, r21
   34f58:	a9 f3       	breq	.-22     	; 0x34f44 <__gesf2+0x22>
   34f5a:	ff 27       	eor	r31, r31
   34f5c:	95 17       	cp	r25, r21
   34f5e:	58 f4       	brcc	.+22     	; 0x34f76 <hypot+0x2e>
   34f60:	e5 2f       	mov	r30, r21
   34f62:	e9 1b       	sub	r30, r25
   34f64:	ed 30       	cpi	r30, 0x0D	; 13
   34f66:	60 f7       	brcc	.-40     	; 0x34f40 <__gesf2+0x1e>
   34f68:	5e 3b       	cpi	r21, 0xBE	; 190
   34f6a:	10 f0       	brcs	.+4      	; 0x34f70 <hypot+0x28>
   34f6c:	f1 e4       	ldi	r31, 0x41	; 65
   34f6e:	1c c0       	rjmp	.+56     	; 0x34fa8 <hypot+0x60>
   34f70:	90 34       	cpi	r25, 0x40	; 64
   34f72:	e0 f4       	brcc	.+56     	; 0x34fac <hypot+0x64>
   34f74:	0a c0       	rjmp	.+20     	; 0x34f8a <hypot+0x42>
   34f76:	e9 2f       	mov	r30, r25
   34f78:	e5 1b       	sub	r30, r21
   34f7a:	ed 30       	cpi	r30, 0x0D	; 13
   34f7c:	18 f7       	brcc	.-58     	; 0x34f44 <__gesf2+0x22>
   34f7e:	9e 3b       	cpi	r25, 0xBE	; 190
   34f80:	10 f0       	brcs	.+4      	; 0x34f86 <hypot+0x3e>
   34f82:	f1 e4       	ldi	r31, 0x41	; 65
   34f84:	11 c0       	rjmp	.+34     	; 0x34fa8 <hypot+0x60>
   34f86:	50 34       	cpi	r21, 0x40	; 64
   34f88:	88 f4       	brcc	.+34     	; 0x34fac <hypot+0x64>
   34f8a:	f9 ea       	ldi	r31, 0xA9	; 169
   34f8c:	88 23       	and	r24, r24
   34f8e:	2a f0       	brmi	.+10     	; 0x34f9a <hypot+0x52>
   34f90:	9a 95       	dec	r25
   34f92:	66 0f       	add	r22, r22
   34f94:	77 1f       	adc	r23, r23
   34f96:	88 1f       	adc	r24, r24
   34f98:	da f7       	brpl	.-10     	; 0x34f90 <hypot+0x48>
   34f9a:	44 23       	and	r20, r20
   34f9c:	2a f0       	brmi	.+10     	; 0x34fa8 <hypot+0x60>
   34f9e:	5a 95       	dec	r21
   34fa0:	22 0f       	add	r18, r18
   34fa2:	33 1f       	adc	r19, r19
   34fa4:	44 1f       	adc	r20, r20
   34fa6:	da f7       	brpl	.-10     	; 0x34f9e <hypot+0x56>
   34fa8:	9f 1b       	sub	r25, r31
   34faa:	5f 1b       	sub	r21, r31
   34fac:	ff 93       	push	r31
   34fae:	1f 93       	push	r17
   34fb0:	0f 93       	push	r16
   34fb2:	ff 92       	push	r15
   34fb4:	ef 92       	push	r14
   34fb6:	79 01       	movw	r14, r18
   34fb8:	8a 01       	movw	r16, r20
   34fba:	bb 27       	eor	r27, r27
   34fbc:	ab 2f       	mov	r26, r27
   34fbe:	9b 01       	movw	r18, r22
   34fc0:	ac 01       	movw	r20, r24
   34fc2:	0f 94 c3 9e 	call	0x33d86	; 0x33d86 <__mulsf3_pse>
   34fc6:	97 01       	movw	r18, r14
   34fc8:	a8 01       	movw	r20, r16
   34fca:	bf 93       	push	r27
   34fcc:	7b 01       	movw	r14, r22
   34fce:	8c 01       	movw	r16, r24
   34fd0:	aa 27       	eor	r26, r26
   34fd2:	ba 2f       	mov	r27, r26
   34fd4:	b9 01       	movw	r22, r18
   34fd6:	ca 01       	movw	r24, r20
   34fd8:	0f 94 c3 9e 	call	0x33d86	; 0x33d86 <__mulsf3_pse>
   34fdc:	af 91       	pop	r26
   34fde:	97 01       	movw	r18, r14
   34fe0:	a8 01       	movw	r20, r16
   34fe2:	ef 90       	pop	r14
   34fe4:	ff 90       	pop	r15
   34fe6:	0f 91       	pop	r16
   34fe8:	1f 91       	pop	r17
   34fea:	0f 94 1f a5 	call	0x34a3e	; 0x34a3e <__addsf3x>
   34fee:	0f 94 31 9f 	call	0x33e62	; 0x33e62 <__fp_round>
   34ff2:	0f 94 d6 a8 	call	0x351ac	; 0x351ac <sqrt>
   34ff6:	4f 91       	pop	r20
   34ff8:	40 ff       	sbrs	r20, 0
   34ffa:	08 95       	ret
   34ffc:	55 27       	eor	r21, r21
   34ffe:	47 fd       	sbrc	r20, 7
   35000:	50 95       	com	r21
   35002:	0d 94 0f a8 	jmp	0x3501e	; 0x3501e <ldexp>

00035006 <inverse>:
   35006:	9b 01       	movw	r18, r22
   35008:	ac 01       	movw	r20, r24
   3500a:	60 e0       	ldi	r22, 0x00	; 0
   3500c:	70 e0       	ldi	r23, 0x00	; 0
   3500e:	80 e8       	ldi	r24, 0x80	; 128
   35010:	9f e3       	ldi	r25, 0x3F	; 63
   35012:	0d 94 07 a6 	jmp	0x34c0e	; 0x34c0e <__divsf3>
   35016:	0d 94 1a 9f 	jmp	0x33e34	; 0x33e34 <__fp_inf>
   3501a:	0d 94 05 a7 	jmp	0x34e0a	; 0x34e0a <__fp_mpack>

0003501e <ldexp>:
   3501e:	0f 94 4a 9f 	call	0x33e94	; 0x33e94 <__fp_splitA>
   35022:	d8 f3       	brcs	.-10     	; 0x3501a <inverse+0x14>
   35024:	99 23       	and	r25, r25
   35026:	c9 f3       	breq	.-14     	; 0x3501a <inverse+0x14>
   35028:	94 0f       	add	r25, r20
   3502a:	51 1d       	adc	r21, r1
   3502c:	a3 f3       	brvs	.-24     	; 0x35016 <inverse+0x10>
   3502e:	91 50       	subi	r25, 0x01	; 1
   35030:	50 40       	sbci	r21, 0x00	; 0
   35032:	94 f0       	brlt	.+36     	; 0x35058 <ldexp+0x3a>
   35034:	59 f0       	breq	.+22     	; 0x3504c <ldexp+0x2e>
   35036:	88 23       	and	r24, r24
   35038:	32 f0       	brmi	.+12     	; 0x35046 <ldexp+0x28>
   3503a:	66 0f       	add	r22, r22
   3503c:	77 1f       	adc	r23, r23
   3503e:	88 1f       	adc	r24, r24
   35040:	91 50       	subi	r25, 0x01	; 1
   35042:	50 40       	sbci	r21, 0x00	; 0
   35044:	c1 f7       	brne	.-16     	; 0x35036 <ldexp+0x18>
   35046:	9e 3f       	cpi	r25, 0xFE	; 254
   35048:	51 05       	cpc	r21, r1
   3504a:	2c f7       	brge	.-54     	; 0x35016 <inverse+0x10>
   3504c:	88 0f       	add	r24, r24
   3504e:	91 1d       	adc	r25, r1
   35050:	96 95       	lsr	r25
   35052:	87 95       	ror	r24
   35054:	97 f9       	bld	r25, 7
   35056:	08 95       	ret
   35058:	5f 3f       	cpi	r21, 0xFF	; 255
   3505a:	ac f0       	brlt	.+42     	; 0x35086 <ldexp+0x68>
   3505c:	98 3e       	cpi	r25, 0xE8	; 232
   3505e:	9c f0       	brlt	.+38     	; 0x35086 <ldexp+0x68>
   35060:	bb 27       	eor	r27, r27
   35062:	86 95       	lsr	r24
   35064:	77 95       	ror	r23
   35066:	67 95       	ror	r22
   35068:	b7 95       	ror	r27
   3506a:	08 f4       	brcc	.+2      	; 0x3506e <ldexp+0x50>
   3506c:	b1 60       	ori	r27, 0x01	; 1
   3506e:	93 95       	inc	r25
   35070:	c1 f7       	brne	.-16     	; 0x35062 <ldexp+0x44>
   35072:	bb 0f       	add	r27, r27
   35074:	58 f7       	brcc	.-42     	; 0x3504c <ldexp+0x2e>
   35076:	11 f4       	brne	.+4      	; 0x3507c <ldexp+0x5e>
   35078:	60 ff       	sbrs	r22, 0
   3507a:	e8 cf       	rjmp	.-48     	; 0x3504c <ldexp+0x2e>
   3507c:	6f 5f       	subi	r22, 0xFF	; 255
   3507e:	7f 4f       	sbci	r23, 0xFF	; 255
   35080:	8f 4f       	sbci	r24, 0xFF	; 255
   35082:	9f 4f       	sbci	r25, 0xFF	; 255
   35084:	e3 cf       	rjmp	.-58     	; 0x3504c <ldexp+0x2e>
   35086:	0d 94 65 9f 	jmp	0x33eca	; 0x33eca <__fp_szero>

0003508a <lround>:
   3508a:	0f 94 4a 9f 	call	0x33e94	; 0x33e94 <__fp_splitA>
   3508e:	58 f1       	brcs	.+86     	; 0x350e6 <lround+0x5c>
   35090:	9e 57       	subi	r25, 0x7E	; 126
   35092:	60 f1       	brcs	.+88     	; 0x350ec <lround+0x62>
   35094:	98 51       	subi	r25, 0x18	; 24
   35096:	a0 f0       	brcs	.+40     	; 0x350c0 <lround+0x36>
   35098:	e9 f0       	breq	.+58     	; 0x350d4 <lround+0x4a>
   3509a:	98 30       	cpi	r25, 0x08	; 8
   3509c:	20 f5       	brcc	.+72     	; 0x350e6 <lround+0x5c>
   3509e:	09 2e       	mov	r0, r25
   350a0:	99 27       	eor	r25, r25
   350a2:	66 0f       	add	r22, r22
   350a4:	77 1f       	adc	r23, r23
   350a6:	88 1f       	adc	r24, r24
   350a8:	99 1f       	adc	r25, r25
   350aa:	0a 94       	dec	r0
   350ac:	d1 f7       	brne	.-12     	; 0x350a2 <lround+0x18>
   350ae:	12 c0       	rjmp	.+36     	; 0x350d4 <lround+0x4a>
   350b0:	06 2e       	mov	r0, r22
   350b2:	67 2f       	mov	r22, r23
   350b4:	78 2f       	mov	r23, r24
   350b6:	88 27       	eor	r24, r24
   350b8:	98 5f       	subi	r25, 0xF8	; 248
   350ba:	11 f4       	brne	.+4      	; 0x350c0 <lround+0x36>
   350bc:	00 0c       	add	r0, r0
   350be:	07 c0       	rjmp	.+14     	; 0x350ce <lround+0x44>
   350c0:	99 3f       	cpi	r25, 0xF9	; 249
   350c2:	b4 f3       	brlt	.-20     	; 0x350b0 <lround+0x26>
   350c4:	86 95       	lsr	r24
   350c6:	77 95       	ror	r23
   350c8:	67 95       	ror	r22
   350ca:	93 95       	inc	r25
   350cc:	d9 f7       	brne	.-10     	; 0x350c4 <lround+0x3a>
   350ce:	61 1d       	adc	r22, r1
   350d0:	71 1d       	adc	r23, r1
   350d2:	81 1d       	adc	r24, r1
   350d4:	3e f4       	brtc	.+14     	; 0x350e4 <lround+0x5a>
   350d6:	90 95       	com	r25
   350d8:	80 95       	com	r24
   350da:	70 95       	com	r23
   350dc:	61 95       	neg	r22
   350de:	7f 4f       	sbci	r23, 0xFF	; 255
   350e0:	8f 4f       	sbci	r24, 0xFF	; 255
   350e2:	9f 4f       	sbci	r25, 0xFF	; 255
   350e4:	08 95       	ret
   350e6:	68 94       	set
   350e8:	0d 94 65 9f 	jmp	0x33eca	; 0x33eca <__fp_szero>
   350ec:	0d 94 64 9f 	jmp	0x33ec8	; 0x33ec8 <__fp_zero>

000350f0 <pow>:
   350f0:	fa 01       	movw	r30, r20
   350f2:	ee 0f       	add	r30, r30
   350f4:	ff 1f       	adc	r31, r31
   350f6:	30 96       	adiw	r30, 0x00	; 0
   350f8:	21 05       	cpc	r18, r1
   350fa:	31 05       	cpc	r19, r1
   350fc:	a1 f1       	breq	.+104    	; 0x35166 <pow+0x76>
   350fe:	61 15       	cp	r22, r1
   35100:	71 05       	cpc	r23, r1
   35102:	61 f4       	brne	.+24     	; 0x3511c <pow+0x2c>
   35104:	80 38       	cpi	r24, 0x80	; 128
   35106:	bf e3       	ldi	r27, 0x3F	; 63
   35108:	9b 07       	cpc	r25, r27
   3510a:	49 f1       	breq	.+82     	; 0x3515e <pow+0x6e>
   3510c:	68 94       	set
   3510e:	90 38       	cpi	r25, 0x80	; 128
   35110:	81 05       	cpc	r24, r1
   35112:	61 f0       	breq	.+24     	; 0x3512c <pow+0x3c>
   35114:	80 38       	cpi	r24, 0x80	; 128
   35116:	bf ef       	ldi	r27, 0xFF	; 255
   35118:	9b 07       	cpc	r25, r27
   3511a:	41 f0       	breq	.+16     	; 0x3512c <pow+0x3c>
   3511c:	99 23       	and	r25, r25
   3511e:	4a f5       	brpl	.+82     	; 0x35172 <pow+0x82>
   35120:	ff 3f       	cpi	r31, 0xFF	; 255
   35122:	e1 05       	cpc	r30, r1
   35124:	31 05       	cpc	r19, r1
   35126:	21 05       	cpc	r18, r1
   35128:	19 f1       	breq	.+70     	; 0x35170 <pow+0x80>
   3512a:	e8 94       	clt
   3512c:	08 94       	sec
   3512e:	e7 95       	ror	r30
   35130:	d9 01       	movw	r26, r18
   35132:	aa 23       	and	r26, r26
   35134:	29 f4       	brne	.+10     	; 0x35140 <pow+0x50>
   35136:	ab 2f       	mov	r26, r27
   35138:	be 2f       	mov	r27, r30
   3513a:	f8 5f       	subi	r31, 0xF8	; 248
   3513c:	d0 f3       	brcs	.-12     	; 0x35132 <pow+0x42>
   3513e:	10 c0       	rjmp	.+32     	; 0x35160 <pow+0x70>
   35140:	ff 5f       	subi	r31, 0xFF	; 255
   35142:	70 f4       	brcc	.+28     	; 0x35160 <pow+0x70>
   35144:	a6 95       	lsr	r26
   35146:	e0 f7       	brcc	.-8      	; 0x35140 <pow+0x50>
   35148:	f7 39       	cpi	r31, 0x97	; 151
   3514a:	50 f0       	brcs	.+20     	; 0x35160 <pow+0x70>
   3514c:	19 f0       	breq	.+6      	; 0x35154 <pow+0x64>
   3514e:	ff 3a       	cpi	r31, 0xAF	; 175
   35150:	38 f4       	brcc	.+14     	; 0x35160 <pow+0x70>
   35152:	9f 77       	andi	r25, 0x7F	; 127
   35154:	9f 93       	push	r25
   35156:	0d d0       	rcall	.+26     	; 0x35172 <pow+0x82>
   35158:	0f 90       	pop	r0
   3515a:	07 fc       	sbrc	r0, 7
   3515c:	90 58       	subi	r25, 0x80	; 128
   3515e:	08 95       	ret
   35160:	46 f0       	brts	.+16     	; 0x35172 <pow+0x82>
   35162:	0d 94 20 9f 	jmp	0x33e40	; 0x33e40 <__fp_nan>
   35166:	60 e0       	ldi	r22, 0x00	; 0
   35168:	70 e0       	ldi	r23, 0x00	; 0
   3516a:	80 e8       	ldi	r24, 0x80	; 128
   3516c:	9f e3       	ldi	r25, 0x3F	; 63
   3516e:	08 95       	ret
   35170:	4f e7       	ldi	r20, 0x7F	; 127
   35172:	9f 77       	andi	r25, 0x7F	; 127
   35174:	5f 93       	push	r21
   35176:	4f 93       	push	r20
   35178:	3f 93       	push	r19
   3517a:	2f 93       	push	r18
   3517c:	0f 94 78 a9 	call	0x352f0	; 0x352f0 <log>
   35180:	2f 91       	pop	r18
   35182:	3f 91       	pop	r19
   35184:	4f 91       	pop	r20
   35186:	5f 91       	pop	r21
   35188:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   3518c:	0d 94 23 a9 	jmp	0x35246	; 0x35246 <exp>

00035190 <sin>:
   35190:	9f 93       	push	r25
   35192:	0f 94 3c a7 	call	0x34e78	; 0x34e78 <__fp_rempio2>
   35196:	0f 90       	pop	r0
   35198:	07 fc       	sbrc	r0, 7
   3519a:	ee 5f       	subi	r30, 0xFE	; 254
   3519c:	0d 94 65 a7 	jmp	0x34eca	; 0x34eca <__fp_sinus>
   351a0:	19 f4       	brne	.+6      	; 0x351a8 <sin+0x18>
   351a2:	16 f4       	brtc	.+4      	; 0x351a8 <sin+0x18>
   351a4:	0d 94 20 9f 	jmp	0x33e40	; 0x33e40 <__fp_nan>
   351a8:	0d 94 05 a7 	jmp	0x34e0a	; 0x34e0a <__fp_mpack>

000351ac <sqrt>:
   351ac:	0f 94 4a 9f 	call	0x33e94	; 0x33e94 <__fp_splitA>
   351b0:	b8 f3       	brcs	.-18     	; 0x351a0 <sin+0x10>
   351b2:	99 23       	and	r25, r25
   351b4:	c9 f3       	breq	.-14     	; 0x351a8 <sin+0x18>
   351b6:	b6 f3       	brts	.-20     	; 0x351a4 <sin+0x14>
   351b8:	9f 57       	subi	r25, 0x7F	; 127
   351ba:	55 0b       	sbc	r21, r21
   351bc:	87 ff       	sbrs	r24, 7
   351be:	0f 94 55 a9 	call	0x352aa	; 0x352aa <__fp_norm2>
   351c2:	00 24       	eor	r0, r0
   351c4:	a0 e6       	ldi	r26, 0x60	; 96
   351c6:	40 ea       	ldi	r20, 0xA0	; 160
   351c8:	90 01       	movw	r18, r0
   351ca:	80 58       	subi	r24, 0x80	; 128
   351cc:	56 95       	lsr	r21
   351ce:	97 95       	ror	r25
   351d0:	28 f4       	brcc	.+10     	; 0x351dc <sqrt+0x30>
   351d2:	80 5c       	subi	r24, 0xC0	; 192
   351d4:	66 0f       	add	r22, r22
   351d6:	77 1f       	adc	r23, r23
   351d8:	88 1f       	adc	r24, r24
   351da:	20 f0       	brcs	.+8      	; 0x351e4 <sqrt+0x38>
   351dc:	26 17       	cp	r18, r22
   351de:	37 07       	cpc	r19, r23
   351e0:	48 07       	cpc	r20, r24
   351e2:	30 f4       	brcc	.+12     	; 0x351f0 <sqrt+0x44>
   351e4:	62 1b       	sub	r22, r18
   351e6:	73 0b       	sbc	r23, r19
   351e8:	84 0b       	sbc	r24, r20
   351ea:	20 29       	or	r18, r0
   351ec:	31 29       	or	r19, r1
   351ee:	4a 2b       	or	r20, r26
   351f0:	a6 95       	lsr	r26
   351f2:	17 94       	ror	r1
   351f4:	07 94       	ror	r0
   351f6:	20 25       	eor	r18, r0
   351f8:	31 25       	eor	r19, r1
   351fa:	4a 27       	eor	r20, r26
   351fc:	58 f7       	brcc	.-42     	; 0x351d4 <sqrt+0x28>
   351fe:	66 0f       	add	r22, r22
   35200:	77 1f       	adc	r23, r23
   35202:	88 1f       	adc	r24, r24
   35204:	20 f0       	brcs	.+8      	; 0x3520e <sqrt+0x62>
   35206:	26 17       	cp	r18, r22
   35208:	37 07       	cpc	r19, r23
   3520a:	48 07       	cpc	r20, r24
   3520c:	30 f4       	brcc	.+12     	; 0x3521a <sqrt+0x6e>
   3520e:	62 0b       	sbc	r22, r18
   35210:	73 0b       	sbc	r23, r19
   35212:	84 0b       	sbc	r24, r20
   35214:	20 0d       	add	r18, r0
   35216:	31 1d       	adc	r19, r1
   35218:	41 1d       	adc	r20, r1
   3521a:	a0 95       	com	r26
   3521c:	81 f7       	brne	.-32     	; 0x351fe <sqrt+0x52>
   3521e:	b9 01       	movw	r22, r18
   35220:	84 2f       	mov	r24, r20
   35222:	91 58       	subi	r25, 0x81	; 129
   35224:	88 0f       	add	r24, r24
   35226:	96 95       	lsr	r25
   35228:	87 95       	ror	r24
   3522a:	08 95       	ret

0003522c <__unordsf2>:
   3522c:	0f 94 c6 a6 	call	0x34d8c	; 0x34d8c <__fp_cmp>
   35230:	88 0b       	sbc	r24, r24
   35232:	99 0b       	sbc	r25, r25
   35234:	08 95       	ret
   35236:	29 f4       	brne	.+10     	; 0x35242 <__unordsf2+0x16>
   35238:	16 f0       	brts	.+4      	; 0x3523e <__unordsf2+0x12>
   3523a:	0d 94 1a 9f 	jmp	0x33e34	; 0x33e34 <__fp_inf>
   3523e:	0d 94 64 9f 	jmp	0x33ec8	; 0x33ec8 <__fp_zero>
   35242:	0d 94 20 9f 	jmp	0x33e40	; 0x33e40 <__fp_nan>

00035246 <exp>:
   35246:	0f 94 4a 9f 	call	0x33e94	; 0x33e94 <__fp_splitA>
   3524a:	a8 f3       	brcs	.-22     	; 0x35236 <__unordsf2+0xa>
   3524c:	96 38       	cpi	r25, 0x86	; 134
   3524e:	a0 f7       	brcc	.-24     	; 0x35238 <__unordsf2+0xc>
   35250:	07 f8       	bld	r0, 7
   35252:	0f 92       	push	r0
   35254:	e8 94       	clt
   35256:	2b e3       	ldi	r18, 0x3B	; 59
   35258:	3a ea       	ldi	r19, 0xAA	; 170
   3525a:	48 eb       	ldi	r20, 0xB8	; 184
   3525c:	5f e7       	ldi	r21, 0x7F	; 127
   3525e:	0f 94 c3 9e 	call	0x33d86	; 0x33d86 <__mulsf3_pse>
   35262:	0f 92       	push	r0
   35264:	0f 92       	push	r0
   35266:	0f 92       	push	r0
   35268:	4d b7       	in	r20, 0x3d	; 61
   3526a:	5e b7       	in	r21, 0x3e	; 62
   3526c:	0f 92       	push	r0
   3526e:	0f 94 c0 a9 	call	0x35380	; 0x35380 <modf>
   35272:	e2 e0       	ldi	r30, 0x02	; 2
   35274:	fd e6       	ldi	r31, 0x6D	; 109
   35276:	0f 94 13 a7 	call	0x34e26	; 0x34e26 <__fp_powser>
   3527a:	4f 91       	pop	r20
   3527c:	5f 91       	pop	r21
   3527e:	ef 91       	pop	r30
   35280:	ff 91       	pop	r31
   35282:	e5 95       	asr	r30
   35284:	ee 1f       	adc	r30, r30
   35286:	ff 1f       	adc	r31, r31
   35288:	49 f0       	breq	.+18     	; 0x3529c <exp+0x56>
   3528a:	fe 57       	subi	r31, 0x7E	; 126
   3528c:	e0 68       	ori	r30, 0x80	; 128
   3528e:	44 27       	eor	r20, r20
   35290:	ee 0f       	add	r30, r30
   35292:	44 1f       	adc	r20, r20
   35294:	fa 95       	dec	r31
   35296:	e1 f7       	brne	.-8      	; 0x35290 <exp+0x4a>
   35298:	41 95       	neg	r20
   3529a:	55 0b       	sbc	r21, r21
   3529c:	0f 94 0f a8 	call	0x3501e	; 0x3501e <ldexp>
   352a0:	0f 90       	pop	r0
   352a2:	07 fe       	sbrs	r0, 7
   352a4:	0d 94 03 a8 	jmp	0x35006	; 0x35006 <inverse>
   352a8:	08 95       	ret

000352aa <__fp_norm2>:
   352aa:	91 50       	subi	r25, 0x01	; 1
   352ac:	50 40       	sbci	r21, 0x00	; 0
   352ae:	66 0f       	add	r22, r22
   352b0:	77 1f       	adc	r23, r23
   352b2:	88 1f       	adc	r24, r24
   352b4:	d2 f7       	brpl	.-12     	; 0x352aa <__fp_norm2>
   352b6:	08 95       	ret

000352b8 <__fp_powsodd>:
   352b8:	9f 93       	push	r25
   352ba:	8f 93       	push	r24
   352bc:	7f 93       	push	r23
   352be:	6f 93       	push	r22
   352c0:	ff 93       	push	r31
   352c2:	ef 93       	push	r30
   352c4:	9b 01       	movw	r18, r22
   352c6:	ac 01       	movw	r20, r24
   352c8:	0f 94 ad 9e 	call	0x33d5a	; 0x33d5a <__mulsf3>
   352cc:	ef 91       	pop	r30
   352ce:	ff 91       	pop	r31
   352d0:	0f 94 13 a7 	call	0x34e26	; 0x34e26 <__fp_powser>
   352d4:	2f 91       	pop	r18
   352d6:	3f 91       	pop	r19
   352d8:	4f 91       	pop	r20
   352da:	5f 91       	pop	r21
   352dc:	0d 94 ad 9e 	jmp	0x33d5a	; 0x33d5a <__mulsf3>
   352e0:	16 f0       	brts	.+4      	; 0x352e6 <__fp_powsodd+0x2e>
   352e2:	0d 94 05 a7 	jmp	0x34e0a	; 0x34e0a <__fp_mpack>
   352e6:	0d 94 20 9f 	jmp	0x33e40	; 0x33e40 <__fp_nan>
   352ea:	68 94       	set
   352ec:	0d 94 1a 9f 	jmp	0x33e34	; 0x33e34 <__fp_inf>

000352f0 <log>:
   352f0:	0f 94 4a 9f 	call	0x33e94	; 0x33e94 <__fp_splitA>
   352f4:	a8 f3       	brcs	.-22     	; 0x352e0 <__fp_powsodd+0x28>
   352f6:	99 23       	and	r25, r25
   352f8:	c1 f3       	breq	.-16     	; 0x352ea <__fp_powsodd+0x32>
   352fa:	ae f3       	brts	.-22     	; 0x352e6 <__fp_powsodd+0x2e>
   352fc:	df 93       	push	r29
   352fe:	cf 93       	push	r28
   35300:	1f 93       	push	r17
   35302:	0f 93       	push	r16
   35304:	ff 92       	push	r15
   35306:	c9 2f       	mov	r28, r25
   35308:	dd 27       	eor	r29, r29
   3530a:	88 23       	and	r24, r24
   3530c:	2a f0       	brmi	.+10     	; 0x35318 <log+0x28>
   3530e:	21 97       	sbiw	r28, 0x01	; 1
   35310:	66 0f       	add	r22, r22
   35312:	77 1f       	adc	r23, r23
   35314:	88 1f       	adc	r24, r24
   35316:	da f7       	brpl	.-10     	; 0x3530e <log+0x1e>
   35318:	20 e0       	ldi	r18, 0x00	; 0
   3531a:	30 e0       	ldi	r19, 0x00	; 0
   3531c:	40 e8       	ldi	r20, 0x80	; 128
   3531e:	5f eb       	ldi	r21, 0xBF	; 191
   35320:	9f e3       	ldi	r25, 0x3F	; 63
   35322:	88 39       	cpi	r24, 0x98	; 152
   35324:	20 f0       	brcs	.+8      	; 0x3532e <log+0x3e>
   35326:	80 3e       	cpi	r24, 0xE0	; 224
   35328:	38 f0       	brcs	.+14     	; 0x35338 <log+0x48>
   3532a:	21 96       	adiw	r28, 0x01	; 1
   3532c:	8f 77       	andi	r24, 0x7F	; 127
   3532e:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   35332:	ea e2       	ldi	r30, 0x2A	; 42
   35334:	fd e6       	ldi	r31, 0x6D	; 109
   35336:	04 c0       	rjmp	.+8      	; 0x35340 <log+0x50>
   35338:	0f 94 08 a5 	call	0x34a10	; 0x34a10 <__addsf3>
   3533c:	e7 e5       	ldi	r30, 0x57	; 87
   3533e:	fd e6       	ldi	r31, 0x6D	; 109
   35340:	0f 94 13 a7 	call	0x34e26	; 0x34e26 <__fp_powser>
   35344:	8b 01       	movw	r16, r22
   35346:	be 01       	movw	r22, r28
   35348:	ec 01       	movw	r28, r24
   3534a:	fb 2e       	mov	r15, r27
   3534c:	6f 57       	subi	r22, 0x7F	; 127
   3534e:	71 09       	sbc	r23, r1
   35350:	75 95       	asr	r23
   35352:	77 1f       	adc	r23, r23
   35354:	88 0b       	sbc	r24, r24
   35356:	99 0b       	sbc	r25, r25
   35358:	0f 94 6e 9e 	call	0x33cdc	; 0x33cdc <__floatsisf>
   3535c:	28 e1       	ldi	r18, 0x18	; 24
   3535e:	32 e7       	ldi	r19, 0x72	; 114
   35360:	41 e3       	ldi	r20, 0x31	; 49
   35362:	5f e3       	ldi	r21, 0x3F	; 63
   35364:	0f 94 c0 9e 	call	0x33d80	; 0x33d80 <__mulsf3x>
   35368:	af 2d       	mov	r26, r15
   3536a:	98 01       	movw	r18, r16
   3536c:	ae 01       	movw	r20, r28
   3536e:	ff 90       	pop	r15
   35370:	0f 91       	pop	r16
   35372:	1f 91       	pop	r17
   35374:	cf 91       	pop	r28
   35376:	df 91       	pop	r29
   35378:	0f 94 1f a5 	call	0x34a3e	; 0x34a3e <__addsf3x>
   3537c:	0d 94 31 9f 	jmp	0x33e62	; 0x33e62 <__fp_round>

00035380 <modf>:
   35380:	fa 01       	movw	r30, r20
   35382:	dc 01       	movw	r26, r24
   35384:	aa 0f       	add	r26, r26
   35386:	bb 1f       	adc	r27, r27
   35388:	9b 01       	movw	r18, r22
   3538a:	ac 01       	movw	r20, r24
   3538c:	bf 57       	subi	r27, 0x7F	; 127
   3538e:	28 f4       	brcc	.+10     	; 0x3539a <modf+0x1a>
   35390:	22 27       	eor	r18, r18
   35392:	33 27       	eor	r19, r19
   35394:	44 27       	eor	r20, r20
   35396:	50 78       	andi	r21, 0x80	; 128
   35398:	20 c0       	rjmp	.+64     	; 0x353da <modf+0x5a>
   3539a:	b7 51       	subi	r27, 0x17	; 23
   3539c:	90 f4       	brcc	.+36     	; 0x353c2 <modf+0x42>
   3539e:	ab 2f       	mov	r26, r27
   353a0:	00 24       	eor	r0, r0
   353a2:	46 95       	lsr	r20
   353a4:	37 95       	ror	r19
   353a6:	27 95       	ror	r18
   353a8:	01 1c       	adc	r0, r1
   353aa:	a3 95       	inc	r26
   353ac:	d2 f3       	brmi	.-12     	; 0x353a2 <modf+0x22>
   353ae:	00 20       	and	r0, r0
   353b0:	71 f0       	breq	.+28     	; 0x353ce <modf+0x4e>
   353b2:	22 0f       	add	r18, r18
   353b4:	33 1f       	adc	r19, r19
   353b6:	44 1f       	adc	r20, r20
   353b8:	b3 95       	inc	r27
   353ba:	da f3       	brmi	.-10     	; 0x353b2 <modf+0x32>
   353bc:	0e d0       	rcall	.+28     	; 0x353da <modf+0x5a>
   353be:	0d 94 07 a5 	jmp	0x34a0e	; 0x34a0e <__subsf3>
   353c2:	61 30       	cpi	r22, 0x01	; 1
   353c4:	71 05       	cpc	r23, r1
   353c6:	a0 e8       	ldi	r26, 0x80	; 128
   353c8:	8a 07       	cpc	r24, r26
   353ca:	b9 46       	sbci	r27, 0x69	; 105
   353cc:	30 f4       	brcc	.+12     	; 0x353da <modf+0x5a>
   353ce:	9b 01       	movw	r18, r22
   353d0:	ac 01       	movw	r20, r24
   353d2:	66 27       	eor	r22, r22
   353d4:	77 27       	eor	r23, r23
   353d6:	88 27       	eor	r24, r24
   353d8:	90 78       	andi	r25, 0x80	; 128
   353da:	30 96       	adiw	r30, 0x00	; 0
   353dc:	21 f0       	breq	.+8      	; 0x353e6 <modf+0x66>
   353de:	20 83       	st	Z, r18
   353e0:	31 83       	std	Z+1, r19	; 0x01
   353e2:	42 83       	std	Z+2, r20	; 0x02
   353e4:	53 83       	std	Z+3, r21	; 0x03
   353e6:	08 95       	ret

000353e8 <tolower>:
   353e8:	91 11       	cpse	r25, r1
   353ea:	08 95       	ret
   353ec:	81 54       	subi	r24, 0x41	; 65
   353ee:	8a 51       	subi	r24, 0x1A	; 26
   353f0:	08 f4       	brcc	.+2      	; 0x353f4 <tolower+0xc>
   353f2:	80 5e       	subi	r24, 0xE0	; 224
   353f4:	85 5a       	subi	r24, 0xA5	; 165
   353f6:	08 95       	ret

000353f8 <memcmp>:
   353f8:	fb 01       	movw	r30, r22
   353fa:	dc 01       	movw	r26, r24
   353fc:	04 c0       	rjmp	.+8      	; 0x35406 <memcmp+0xe>
   353fe:	8d 91       	ld	r24, X+
   35400:	01 90       	ld	r0, Z+
   35402:	80 19       	sub	r24, r0
   35404:	21 f4       	brne	.+8      	; 0x3540e <memcmp+0x16>
   35406:	41 50       	subi	r20, 0x01	; 1
   35408:	50 40       	sbci	r21, 0x00	; 0
   3540a:	c8 f7       	brcc	.-14     	; 0x353fe <memcmp+0x6>
   3540c:	88 1b       	sub	r24, r24
   3540e:	99 0b       	sbc	r25, r25
   35410:	08 95       	ret

00035412 <memcpy>:
   35412:	fb 01       	movw	r30, r22
   35414:	dc 01       	movw	r26, r24
   35416:	02 c0       	rjmp	.+4      	; 0x3541c <memcpy+0xa>
   35418:	01 90       	ld	r0, Z+
   3541a:	0d 92       	st	X+, r0
   3541c:	41 50       	subi	r20, 0x01	; 1
   3541e:	50 40       	sbci	r21, 0x00	; 0
   35420:	d8 f7       	brcc	.-10     	; 0x35418 <memcpy+0x6>
   35422:	08 95       	ret

00035424 <memset>:
   35424:	dc 01       	movw	r26, r24
   35426:	01 c0       	rjmp	.+2      	; 0x3542a <memset+0x6>
   35428:	6d 93       	st	X+, r22
   3542a:	41 50       	subi	r20, 0x01	; 1
   3542c:	50 40       	sbci	r21, 0x00	; 0
   3542e:	e0 f7       	brcc	.-8      	; 0x35428 <memset+0x4>
   35430:	08 95       	ret

00035432 <strcasecmp>:
   35432:	fb 01       	movw	r30, r22
   35434:	dc 01       	movw	r26, r24
   35436:	8d 91       	ld	r24, X+
   35438:	81 34       	cpi	r24, 0x41	; 65
   3543a:	1c f0       	brlt	.+6      	; 0x35442 <strcasecmp+0x10>
   3543c:	8b 35       	cpi	r24, 0x5B	; 91
   3543e:	0c f4       	brge	.+2      	; 0x35442 <strcasecmp+0x10>
   35440:	80 5e       	subi	r24, 0xE0	; 224
   35442:	61 91       	ld	r22, Z+
   35444:	61 34       	cpi	r22, 0x41	; 65
   35446:	1c f0       	brlt	.+6      	; 0x3544e <strcasecmp+0x1c>
   35448:	6b 35       	cpi	r22, 0x5B	; 91
   3544a:	0c f4       	brge	.+2      	; 0x3544e <strcasecmp+0x1c>
   3544c:	60 5e       	subi	r22, 0xE0	; 224
   3544e:	86 1b       	sub	r24, r22
   35450:	61 11       	cpse	r22, r1
   35452:	89 f3       	breq	.-30     	; 0x35436 <strcasecmp+0x4>
   35454:	99 0b       	sbc	r25, r25
   35456:	08 95       	ret

00035458 <strcat>:
   35458:	fb 01       	movw	r30, r22
   3545a:	dc 01       	movw	r26, r24
   3545c:	0d 90       	ld	r0, X+
   3545e:	00 20       	and	r0, r0
   35460:	e9 f7       	brne	.-6      	; 0x3545c <strcat+0x4>
   35462:	11 97       	sbiw	r26, 0x01	; 1
   35464:	01 90       	ld	r0, Z+
   35466:	0d 92       	st	X+, r0
   35468:	00 20       	and	r0, r0
   3546a:	e1 f7       	brne	.-8      	; 0x35464 <strcat+0xc>
   3546c:	08 95       	ret

0003546e <strchr>:
   3546e:	fc 01       	movw	r30, r24
   35470:	81 91       	ld	r24, Z+
   35472:	86 17       	cp	r24, r22
   35474:	21 f0       	breq	.+8      	; 0x3547e <strchr+0x10>
   35476:	88 23       	and	r24, r24
   35478:	d9 f7       	brne	.-10     	; 0x35470 <strchr+0x2>
   3547a:	99 27       	eor	r25, r25
   3547c:	08 95       	ret
   3547e:	31 97       	sbiw	r30, 0x01	; 1
   35480:	cf 01       	movw	r24, r30
   35482:	08 95       	ret

00035484 <strcmp>:
   35484:	fb 01       	movw	r30, r22
   35486:	dc 01       	movw	r26, r24
   35488:	8d 91       	ld	r24, X+
   3548a:	01 90       	ld	r0, Z+
   3548c:	80 19       	sub	r24, r0
   3548e:	01 10       	cpse	r0, r1
   35490:	d9 f3       	breq	.-10     	; 0x35488 <strcmp+0x4>
   35492:	99 0b       	sbc	r25, r25
   35494:	08 95       	ret

00035496 <strcpy>:
   35496:	fb 01       	movw	r30, r22
   35498:	dc 01       	movw	r26, r24
   3549a:	01 90       	ld	r0, Z+
   3549c:	0d 92       	st	X+, r0
   3549e:	00 20       	and	r0, r0
   354a0:	e1 f7       	brne	.-8      	; 0x3549a <strcpy+0x4>
   354a2:	08 95       	ret

000354a4 <strncmp>:
   354a4:	fb 01       	movw	r30, r22
   354a6:	dc 01       	movw	r26, r24
   354a8:	41 50       	subi	r20, 0x01	; 1
   354aa:	50 40       	sbci	r21, 0x00	; 0
   354ac:	30 f0       	brcs	.+12     	; 0x354ba <strncmp+0x16>
   354ae:	8d 91       	ld	r24, X+
   354b0:	01 90       	ld	r0, Z+
   354b2:	80 19       	sub	r24, r0
   354b4:	19 f4       	brne	.+6      	; 0x354bc <strncmp+0x18>
   354b6:	00 20       	and	r0, r0
   354b8:	b9 f7       	brne	.-18     	; 0x354a8 <strncmp+0x4>
   354ba:	88 1b       	sub	r24, r24
   354bc:	99 0b       	sbc	r25, r25
   354be:	08 95       	ret

000354c0 <strncpy>:
   354c0:	fb 01       	movw	r30, r22
   354c2:	dc 01       	movw	r26, r24
   354c4:	41 50       	subi	r20, 0x01	; 1
   354c6:	50 40       	sbci	r21, 0x00	; 0
   354c8:	48 f0       	brcs	.+18     	; 0x354dc <strncpy+0x1c>
   354ca:	01 90       	ld	r0, Z+
   354cc:	0d 92       	st	X+, r0
   354ce:	00 20       	and	r0, r0
   354d0:	c9 f7       	brne	.-14     	; 0x354c4 <strncpy+0x4>
   354d2:	01 c0       	rjmp	.+2      	; 0x354d6 <strncpy+0x16>
   354d4:	1d 92       	st	X+, r1
   354d6:	41 50       	subi	r20, 0x01	; 1
   354d8:	50 40       	sbci	r21, 0x00	; 0
   354da:	e0 f7       	brcc	.-8      	; 0x354d4 <strncpy+0x14>
   354dc:	08 95       	ret

000354de <puts>:
   354de:	0f 93       	push	r16
   354e0:	1f 93       	push	r17
   354e2:	cf 93       	push	r28
   354e4:	df 93       	push	r29
   354e6:	e0 91 13 17 	lds	r30, 0x1713	; 0x801713 <__iob+0x2>
   354ea:	f0 91 14 17 	lds	r31, 0x1714	; 0x801714 <__iob+0x3>
   354ee:	23 81       	ldd	r18, Z+3	; 0x03
   354f0:	ec 01       	movw	r28, r24
   354f2:	10 e0       	ldi	r17, 0x00	; 0
   354f4:	00 e0       	ldi	r16, 0x00	; 0
   354f6:	21 fd       	sbrc	r18, 1
   354f8:	08 c0       	rjmp	.+16     	; 0x3550a <puts+0x2c>
   354fa:	0f ef       	ldi	r16, 0xFF	; 255
   354fc:	1f ef       	ldi	r17, 0xFF	; 255
   354fe:	14 c0       	rjmp	.+40     	; 0x35528 <puts+0x4a>
   35500:	19 95       	eicall
   35502:	89 2b       	or	r24, r25
   35504:	11 f0       	breq	.+4      	; 0x3550a <puts+0x2c>
   35506:	0f ef       	ldi	r16, 0xFF	; 255
   35508:	1f ef       	ldi	r17, 0xFF	; 255
   3550a:	89 91       	ld	r24, Y+
   3550c:	60 91 13 17 	lds	r22, 0x1713	; 0x801713 <__iob+0x2>
   35510:	70 91 14 17 	lds	r23, 0x1714	; 0x801714 <__iob+0x3>
   35514:	db 01       	movw	r26, r22
   35516:	18 96       	adiw	r26, 0x08	; 8
   35518:	ed 91       	ld	r30, X+
   3551a:	fc 91       	ld	r31, X
   3551c:	81 11       	cpse	r24, r1
   3551e:	f0 cf       	rjmp	.-32     	; 0x35500 <puts+0x22>
   35520:	8a e0       	ldi	r24, 0x0A	; 10
   35522:	19 95       	eicall
   35524:	89 2b       	or	r24, r25
   35526:	49 f7       	brne	.-46     	; 0x354fa <puts+0x1c>
   35528:	c8 01       	movw	r24, r16
   3552a:	df 91       	pop	r29
   3552c:	cf 91       	pop	r28
   3552e:	1f 91       	pop	r17
   35530:	0f 91       	pop	r16
   35532:	08 95       	ret

00035534 <__do_global_dtors>:
   35534:	10 e5       	ldi	r17, 0x50	; 80
   35536:	c3 ef       	ldi	r28, 0xF3	; 243
   35538:	d0 e5       	ldi	r29, 0x50	; 80
   3553a:	00 e0       	ldi	r16, 0x00	; 0
   3553c:	06 c0       	rjmp	.+12     	; 0x3554a <__do_global_dtors+0x16>
   3553e:	80 2f       	mov	r24, r16
   35540:	fe 01       	movw	r30, r28
   35542:	0f 94 f0 a4 	call	0x349e0	; 0x349e0 <__tablejump2__>
   35546:	21 96       	adiw	r28, 0x01	; 1
   35548:	01 1d       	adc	r16, r1
   3554a:	c4 3f       	cpi	r28, 0xF4	; 244
   3554c:	d1 07       	cpc	r29, r17
   3554e:	80 e0       	ldi	r24, 0x00	; 0
   35550:	08 07       	cpc	r16, r24
   35552:	a9 f7       	brne	.-22     	; 0x3553e <__do_global_dtors+0xa>
   35554:	f8 94       	cli

00035556 <__stop_program>:
   35556:	ff cf       	rjmp	.-2      	; 0x35556 <__stop_program>
